Home | History | Annotate | Download | only in functional
      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;
     50 	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);
     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);
     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));
     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);
    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);
    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);
    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);
    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);
    204 	virtual				~FboIncompleteException		(void) throw() {}
    205 
    206 	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