• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _ES3FFBOTESTUTIL_HPP
2 #define _ES3FFBOTESTUTIL_HPP
3 /*-------------------------------------------------------------------------
4  * drawElements Quality Program OpenGL ES 3.0 Module
5  * -------------------------------------------------
6  *
7  * Copyright 2014 The Android Open Source Project
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  *//*!
22  * \file
23  * \brief FBO test utilities.
24  *//*--------------------------------------------------------------------*/
25 
26 #include "tcuDefs.hpp"
27 #include "sglrContext.hpp"
28 #include "gluShaderUtil.hpp"
29 #include "tcuTexture.hpp"
30 #include "tcuMatrix.hpp"
31 #include "tcuRenderTarget.hpp"
32 
33 #include <vector>
34 
35 namespace deqp
36 {
37 namespace gles3
38 {
39 namespace Functional
40 {
41 namespace FboTestUtil
42 {
43 
44 // \todo [2012-04-29 pyry] Clean up and name as SglrUtil
45 
46 // Helper class for constructing DataType vectors.
47 struct DataTypes
48 {
49 	std::vector<glu::DataType> vec;
operator <<deqp::gles3::Functional::FboTestUtil::DataTypes50 	DataTypes& operator<< (glu::DataType type) { vec.push_back(type); return *this; }
51 };
52 
53 // Shaders.
54 
55 class FlatColorShader : public sglr::ShaderProgram
56 {
57 public:
58 						FlatColorShader		(glu::DataType outputType);
~FlatColorShader(void)59 						~FlatColorShader	(void) {}
60 
61 	void				setColor			(sglr::Context& context, deUint32 program, const tcu::Vec4& color);
62 
63 	void				shadeVertices		(const rr::VertexAttrib* inputs, rr::VertexPacket* const* packets, const int numPackets) const;
64 	void				shadeFragments		(rr::FragmentPacket* packets, const int numPackets, const rr::FragmentShadingContext& context) const;
65 
66 private:
67 	const glu::DataType	m_outputType;
68 };
69 
70 class GradientShader : public sglr::ShaderProgram
71 {
72 public:
73 						GradientShader		(glu::DataType outputType);
~GradientShader(void)74 						~GradientShader		(void) {}
75 
76 	void				setGradient			(sglr::Context& context, deUint32 program, const tcu::Vec4& gradientMin, const tcu::Vec4& gradientMax);
77 
78 	void				shadeVertices		(const rr::VertexAttrib* inputs, rr::VertexPacket* const* packets, const int numPackets) const;
79 	void				shadeFragments		(rr::FragmentPacket* packets, const int numPackets, const rr::FragmentShadingContext& context) const;
80 
81 private:
82 	const glu::DataType	m_outputType;
83 };
84 
85 class Texture2DShader : public sglr::ShaderProgram
86 {
87 public:
88 					Texture2DShader			(const DataTypes& samplerTypes, glu::DataType outputType, const tcu::Vec4& outScale = tcu::Vec4(1.0f), const tcu::Vec4& outBias = tcu::Vec4(0.0f));
~Texture2DShader(void)89 					~Texture2DShader		(void) {}
90 
91 	void			setUnit					(int samplerNdx, int unitNdx);
92 	void			setTexScaleBias			(int samplerNdx, const tcu::Vec4& scale, const tcu::Vec4& bias);
93 	void			setOutScaleBias			(const tcu::Vec4& scale, const tcu::Vec4& bias);
94 
95 	void			setUniforms				(sglr::Context& context, deUint32 program) const;
96 
97 	void			shadeVertices			(const rr::VertexAttrib* inputs, rr::VertexPacket* const* packets, const int numPackets) const;
98 	void			shadeFragments			(rr::FragmentPacket* packets, const int numPackets, const rr::FragmentShadingContext& context) const;
99 
100 private:
101 	struct Input
102 	{
103 		int			unitNdx;
104 		tcu::Vec4	scale;
105 		tcu::Vec4	bias;
106 	};
107 
108 	std::vector<Input>	m_inputs;
109 	tcu::Vec4			m_outScale;
110 	tcu::Vec4			m_outBias;
111 
112 	const glu::DataType	m_outputType;
113 };
114 
115 class TextureCubeShader : public sglr::ShaderProgram
116 {
117 public:
118 						TextureCubeShader		(glu::DataType samplerType, glu::DataType outputType);
~TextureCubeShader(void)119 						~TextureCubeShader		(void) {}
120 
121 	void				setFace					(tcu::CubeFace face);
122 	void				setTexScaleBias			(const tcu::Vec4& scale, const tcu::Vec4& bias);
123 
124 	void				setUniforms				(sglr::Context& context, deUint32 program) const;
125 
126 	void				shadeVertices			(const rr::VertexAttrib* inputs, rr::VertexPacket* const* packets, const int numPackets) const;
127 	void				shadeFragments			(rr::FragmentPacket* packets, const int numPackets, const rr::FragmentShadingContext& context) const;
128 
129 private:
130 	tcu::Mat3			m_coordMat;
131 	tcu::Vec4			m_texScale;
132 	tcu::Vec4			m_texBias;
133 
134 	const glu::DataType	m_outputType;
135 };
136 
137 class Texture2DArrayShader : public sglr::ShaderProgram
138 {
139 public:
140 						Texture2DArrayShader	(glu::DataType samplerType, glu::DataType outputType);
~Texture2DArrayShader(void)141 						~Texture2DArrayShader	(void) {}
142 
143 	void				setLayer				(int layer);
144 	void				setTexScaleBias			(const tcu::Vec4& scale, const tcu::Vec4& bias);
145 
146 	void				setUniforms				(sglr::Context& context, deUint32 program) const;
147 
148 	void				shadeVertices			(const rr::VertexAttrib* inputs, rr::VertexPacket* const* packets, const int numPackets) const;
149 	void				shadeFragments			(rr::FragmentPacket* packets, const int numPackets, const rr::FragmentShadingContext& context) const;
150 
151 private:
152 	tcu::Vec4			m_texScale;
153 	tcu::Vec4			m_texBias;
154 	int					m_layer;
155 
156 	const glu::DataType	m_outputType;
157 };
158 
159 class Texture3DShader : public sglr::ShaderProgram
160 {
161 public:
162 						Texture3DShader			(glu::DataType samplerType, glu::DataType outputType);
~Texture3DShader(void)163 						~Texture3DShader		(void) {}
164 
165 	void				setDepth				(float r);
166 	void				setTexScaleBias			(const tcu::Vec4& scale, const tcu::Vec4& bias);
167 
168 	void				setUniforms				(sglr::Context& context, deUint32 program) const;
169 
170 	void				shadeVertices			(const rr::VertexAttrib* inputs, rr::VertexPacket* const* packets, const int numPackets) const;
171 	void				shadeFragments			(rr::FragmentPacket* packets, const int numPackets, const rr::FragmentShadingContext& context) const;
172 
173 private:
174 	tcu::Vec4			m_texScale;
175 	tcu::Vec4			m_texBias;
176 	float				m_depth;
177 
178 	const glu::DataType	m_outputType;
179 };
180 
181 class DepthGradientShader : public sglr::ShaderProgram
182 {
183 public:
184 								DepthGradientShader		(glu::DataType outputType);
~DepthGradientShader(void)185 								~DepthGradientShader	(void) {}
186 
187 	void						setUniforms				(sglr::Context& context, deUint32 program, const float gradientMin, const float gradientMax, const tcu::Vec4& color);
188 
189 	void						shadeVertices			(const rr::VertexAttrib* inputs, rr::VertexPacket* const* packets, const int numPackets) const;
190 	void						shadeFragments			(rr::FragmentPacket* packets, const int numPackets, const rr::FragmentShadingContext& context) const;
191 
192 private:
193 	const glu::DataType			m_outputType;
194 	const sglr::UniformSlot&	u_minGradient;
195 	const sglr::UniformSlot&	u_maxGradient;
196 	const sglr::UniformSlot&	u_color;
197 };
198 
199 // Framebuffer incomplete exception.
200 class FboIncompleteException : public tcu::TestError
201 {
202 public:
203 						FboIncompleteException		(deUint32 reason, const char* file, int line);
~FboIncompleteException(void)204 	virtual				~FboIncompleteException		(void) throw() {}
205 
getReason(void) const206 	deUint32			getReason					(void) const { return m_reason; }
207 
208 private:
209 	deUint32			m_reason;
210 };
211 
212 // Utility functions.
213 
214 glu::DataType			getFragmentOutputType				(const tcu::TextureFormat& format);
215 tcu::TextureFormat		getFramebufferReadFormat			(const tcu::TextureFormat& format);
216 
217 const char*				getFormatName						(deUint32 format);
218 
219 void					clearColorBuffer					(sglr::Context& ctx, const tcu::TextureFormat& format, const tcu::Vec4& value);
220 void					readPixels							(sglr::Context& ctx, tcu::Surface& dst, int x, int y, int width, int height, const tcu::TextureFormat& format, const tcu::Vec4& scale, const tcu::Vec4& bias);
221 
222 tcu::RGBA				getFormatThreshold					(const tcu::TextureFormat& format);
223 tcu::RGBA				getFormatThreshold					(const deUint32 glFormat);
224 
225 tcu::RGBA				getToSRGBConversionThreshold		(const tcu::TextureFormat& src, const tcu::TextureFormat& dst);
226 
227 } // FboTestUtil
228 } // Functional
229 } // gles3
230 } // deqp
231 
232 #endif // _ES3FFBOTESTUTIL_HPP
233