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
35namespace deqp
36{
37namespace gles3
38{
39namespace Functional
40{
41namespace FboTestUtil
42{
43
44// \todo [2012-04-29 pyry] Clean up and name as SglrUtil
45
46// Helper class for constructing DataType vectors.
47struct DataTypes
48{
49	std::vector<glu::DataType> vec;
50	DataTypes& operator<< (glu::DataType type) { vec.push_back(type); return *this; }
51};
52
53// Shaders.
54
55class FlatColorShader : public sglr::ShaderProgram
56{
57public:
58						FlatColorShader		(glu::DataType outputType);
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
66private:
67	const glu::DataType	m_outputType;
68};
69
70class GradientShader : public sglr::ShaderProgram
71{
72public:
73						GradientShader		(glu::DataType outputType);
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
81private:
82	const glu::DataType	m_outputType;
83};
84
85class Texture2DShader : public sglr::ShaderProgram
86{
87public:
88					Texture2DShader			(const DataTypes& samplerTypes, glu::DataType outputType, const tcu::Vec4& outScale = tcu::Vec4(1.0f), const tcu::Vec4& outBias = tcu::Vec4(0.0f));
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
100private:
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
115class TextureCubeShader : public sglr::ShaderProgram
116{
117public:
118						TextureCubeShader		(glu::DataType samplerType, glu::DataType outputType);
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
129private:
130	tcu::Mat3			m_coordMat;
131	tcu::Vec4			m_texScale;
132	tcu::Vec4			m_texBias;
133
134	const glu::DataType	m_outputType;
135};
136
137class Texture2DArrayShader : public sglr::ShaderProgram
138{
139public:
140						Texture2DArrayShader	(glu::DataType samplerType, glu::DataType outputType);
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
151private:
152	tcu::Vec4			m_texScale;
153	tcu::Vec4			m_texBias;
154	int					m_layer;
155
156	const glu::DataType	m_outputType;
157};
158
159class Texture3DShader : public sglr::ShaderProgram
160{
161public:
162						Texture3DShader			(glu::DataType samplerType, glu::DataType outputType);
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
173private:
174	tcu::Vec4			m_texScale;
175	tcu::Vec4			m_texBias;
176	float				m_depth;
177
178	const glu::DataType	m_outputType;
179};
180
181class DepthGradientShader : public sglr::ShaderProgram
182{
183public:
184								DepthGradientShader		(glu::DataType outputType);
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
192private:
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.
200class FboIncompleteException : public tcu::TestError
201{
202public:
203						FboIncompleteException		(deUint32 reason, const char* file, int line);
204	virtual				~FboIncompleteException		(void) throw() {}
205
206	deUint32			getReason					(void) const { return m_reason; }
207
208private:
209	deUint32			m_reason;
210};
211
212// Utility functions.
213
214glu::DataType			getFragmentOutputType				(const tcu::TextureFormat& format);
215tcu::TextureFormat		getFramebufferReadFormat			(const tcu::TextureFormat& format);
216
217const char*				getFormatName						(deUint32 format);
218
219void					clearColorBuffer					(sglr::Context& ctx, const tcu::TextureFormat& format, const tcu::Vec4& value);
220void					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
222tcu::RGBA				getFormatThreshold					(const tcu::TextureFormat& format);
223tcu::RGBA				getFormatThreshold					(const deUint32 glFormat);
224
225tcu::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