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