1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL ES 2.0 Module
3*35238bceSAndroid Build Coastguard Worker * -------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker *
5*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker *
7*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker *
11*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker *
13*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker *
19*35238bceSAndroid Build Coastguard Worker *//*!
20*35238bceSAndroid Build Coastguard Worker * \file
21*35238bceSAndroid Build Coastguard Worker * \brief Shader struct tests.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es2fShaderFunctionTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "glsShaderRenderCase.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "gluTexture.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuStringTemplate.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "tcuTextureUtil.hpp"
29*35238bceSAndroid Build Coastguard Worker
30*35238bceSAndroid Build Coastguard Worker using namespace deqp::gls;
31*35238bceSAndroid Build Coastguard Worker
32*35238bceSAndroid Build Coastguard Worker namespace deqp
33*35238bceSAndroid Build Coastguard Worker {
34*35238bceSAndroid Build Coastguard Worker namespace gles2
35*35238bceSAndroid Build Coastguard Worker {
36*35238bceSAndroid Build Coastguard Worker namespace Functional
37*35238bceSAndroid Build Coastguard Worker {
38*35238bceSAndroid Build Coastguard Worker
39*35238bceSAndroid Build Coastguard Worker typedef void (*SetupUniformsFunc)(const glw::Functions &gl, uint32_t programID, const tcu::Vec4 &constCoords);
40*35238bceSAndroid Build Coastguard Worker
41*35238bceSAndroid Build Coastguard Worker class ShaderFunctionCase : public ShaderRenderCase
42*35238bceSAndroid Build Coastguard Worker {
43*35238bceSAndroid Build Coastguard Worker public:
44*35238bceSAndroid Build Coastguard Worker ShaderFunctionCase(Context &context, const char *name, const char *description, bool isVertexCase,
45*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc evalFunc, SetupUniformsFunc setupUniformsFunc, const char *vertShaderSource,
46*35238bceSAndroid Build Coastguard Worker const char *fragShaderSource);
47*35238bceSAndroid Build Coastguard Worker ~ShaderFunctionCase(void);
48*35238bceSAndroid Build Coastguard Worker
49*35238bceSAndroid Build Coastguard Worker void init(void);
50*35238bceSAndroid Build Coastguard Worker void deinit(void);
51*35238bceSAndroid Build Coastguard Worker
52*35238bceSAndroid Build Coastguard Worker virtual void setupUniforms(int programID, const tcu::Vec4 &constCoords);
53*35238bceSAndroid Build Coastguard Worker
54*35238bceSAndroid Build Coastguard Worker private:
55*35238bceSAndroid Build Coastguard Worker ShaderFunctionCase(const ShaderFunctionCase &);
56*35238bceSAndroid Build Coastguard Worker ShaderFunctionCase &operator=(const ShaderFunctionCase &);
57*35238bceSAndroid Build Coastguard Worker
58*35238bceSAndroid Build Coastguard Worker const SetupUniformsFunc m_setupUniforms;
59*35238bceSAndroid Build Coastguard Worker
60*35238bceSAndroid Build Coastguard Worker glu::Texture2D *m_brickTexture;
61*35238bceSAndroid Build Coastguard Worker };
62*35238bceSAndroid Build Coastguard Worker
ShaderFunctionCase(Context & context,const char * name,const char * description,bool isVertexCase,ShaderEvalFunc evalFunc,SetupUniformsFunc setupUniformsFunc,const char * vertShaderSource,const char * fragShaderSource)63*35238bceSAndroid Build Coastguard Worker ShaderFunctionCase::ShaderFunctionCase(Context &context, const char *name, const char *description, bool isVertexCase,
64*35238bceSAndroid Build Coastguard Worker ShaderEvalFunc evalFunc, SetupUniformsFunc setupUniformsFunc,
65*35238bceSAndroid Build Coastguard Worker const char *vertShaderSource, const char *fragShaderSource)
66*35238bceSAndroid Build Coastguard Worker : ShaderRenderCase(context.getTestContext(), context.getRenderContext(), context.getContextInfo(), name,
67*35238bceSAndroid Build Coastguard Worker description, isVertexCase, evalFunc)
68*35238bceSAndroid Build Coastguard Worker , m_setupUniforms(setupUniformsFunc)
69*35238bceSAndroid Build Coastguard Worker , m_brickTexture(DE_NULL)
70*35238bceSAndroid Build Coastguard Worker {
71*35238bceSAndroid Build Coastguard Worker m_vertShaderSource = vertShaderSource;
72*35238bceSAndroid Build Coastguard Worker m_fragShaderSource = fragShaderSource;
73*35238bceSAndroid Build Coastguard Worker }
74*35238bceSAndroid Build Coastguard Worker
~ShaderFunctionCase(void)75*35238bceSAndroid Build Coastguard Worker ShaderFunctionCase::~ShaderFunctionCase(void)
76*35238bceSAndroid Build Coastguard Worker {
77*35238bceSAndroid Build Coastguard Worker delete m_brickTexture;
78*35238bceSAndroid Build Coastguard Worker }
79*35238bceSAndroid Build Coastguard Worker
init(void)80*35238bceSAndroid Build Coastguard Worker void ShaderFunctionCase::init(void)
81*35238bceSAndroid Build Coastguard Worker {
82*35238bceSAndroid Build Coastguard Worker gls::ShaderRenderCase::init();
83*35238bceSAndroid Build Coastguard Worker }
84*35238bceSAndroid Build Coastguard Worker
deinit(void)85*35238bceSAndroid Build Coastguard Worker void ShaderFunctionCase::deinit(void)
86*35238bceSAndroid Build Coastguard Worker {
87*35238bceSAndroid Build Coastguard Worker gls::ShaderRenderCase::deinit();
88*35238bceSAndroid Build Coastguard Worker delete m_brickTexture;
89*35238bceSAndroid Build Coastguard Worker m_brickTexture = DE_NULL;
90*35238bceSAndroid Build Coastguard Worker }
91*35238bceSAndroid Build Coastguard Worker
setupUniforms(int programID,const tcu::Vec4 & constCoords)92*35238bceSAndroid Build Coastguard Worker void ShaderFunctionCase::setupUniforms(int programID, const tcu::Vec4 &constCoords)
93*35238bceSAndroid Build Coastguard Worker {
94*35238bceSAndroid Build Coastguard Worker ShaderRenderCase::setupUniforms(programID, constCoords);
95*35238bceSAndroid Build Coastguard Worker if (m_setupUniforms)
96*35238bceSAndroid Build Coastguard Worker m_setupUniforms(m_renderCtx.getFunctions(), programID, constCoords);
97*35238bceSAndroid Build Coastguard Worker }
98*35238bceSAndroid Build Coastguard Worker
createStructCase(Context & context,const char * name,const char * description,bool isVertexCase,ShaderEvalFunc evalFunc,SetupUniformsFunc setupUniforms,const LineStream & shaderSrc,const std::map<std::string,std::string> * additionalParams)99*35238bceSAndroid Build Coastguard Worker static ShaderFunctionCase *createStructCase(Context &context, const char *name, const char *description,
100*35238bceSAndroid Build Coastguard Worker bool isVertexCase, ShaderEvalFunc evalFunc, SetupUniformsFunc setupUniforms,
101*35238bceSAndroid Build Coastguard Worker const LineStream &shaderSrc,
102*35238bceSAndroid Build Coastguard Worker const std::map<std::string, std::string> *additionalParams)
103*35238bceSAndroid Build Coastguard Worker {
104*35238bceSAndroid Build Coastguard Worker static const char *defaultVertSrc = "attribute highp vec4 a_position;\n"
105*35238bceSAndroid Build Coastguard Worker "attribute highp vec4 a_coords;\n"
106*35238bceSAndroid Build Coastguard Worker "varying mediump vec4 v_coords;\n\n"
107*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
108*35238bceSAndroid Build Coastguard Worker "{\n"
109*35238bceSAndroid Build Coastguard Worker " v_coords = a_coords;\n"
110*35238bceSAndroid Build Coastguard Worker " gl_Position = a_position;\n"
111*35238bceSAndroid Build Coastguard Worker "}\n";
112*35238bceSAndroid Build Coastguard Worker static const char *defaultFragSrc = "varying mediump vec4 v_color;\n\n"
113*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
114*35238bceSAndroid Build Coastguard Worker "{\n"
115*35238bceSAndroid Build Coastguard Worker " gl_FragColor = v_color;\n"
116*35238bceSAndroid Build Coastguard Worker "}\n";
117*35238bceSAndroid Build Coastguard Worker
118*35238bceSAndroid Build Coastguard Worker // Fill in specialization parameters.
119*35238bceSAndroid Build Coastguard Worker std::map<std::string, std::string> spParams;
120*35238bceSAndroid Build Coastguard Worker if (isVertexCase)
121*35238bceSAndroid Build Coastguard Worker {
122*35238bceSAndroid Build Coastguard Worker spParams["DECLARATIONS"] = "attribute highp vec4 a_position;\n"
123*35238bceSAndroid Build Coastguard Worker "attribute highp vec4 a_coords;\n"
124*35238bceSAndroid Build Coastguard Worker "varying mediump vec4 v_color;";
125*35238bceSAndroid Build Coastguard Worker spParams["COORDS"] = "a_coords";
126*35238bceSAndroid Build Coastguard Worker spParams["DST"] = "v_color";
127*35238bceSAndroid Build Coastguard Worker spParams["ASSIGN_POS"] = "gl_Position = a_position;";
128*35238bceSAndroid Build Coastguard Worker }
129*35238bceSAndroid Build Coastguard Worker else
130*35238bceSAndroid Build Coastguard Worker {
131*35238bceSAndroid Build Coastguard Worker spParams["DECLARATIONS"] = "precision highp float;\n"
132*35238bceSAndroid Build Coastguard Worker "varying mediump vec4 v_coords;";
133*35238bceSAndroid Build Coastguard Worker spParams["COORDS"] = "v_coords";
134*35238bceSAndroid Build Coastguard Worker spParams["DST"] = "gl_FragColor";
135*35238bceSAndroid Build Coastguard Worker spParams["ASSIGN_POS"] = "";
136*35238bceSAndroid Build Coastguard Worker }
137*35238bceSAndroid Build Coastguard Worker if (additionalParams)
138*35238bceSAndroid Build Coastguard Worker spParams.insert(additionalParams->begin(), additionalParams->end());
139*35238bceSAndroid Build Coastguard Worker
140*35238bceSAndroid Build Coastguard Worker if (isVertexCase)
141*35238bceSAndroid Build Coastguard Worker return new ShaderFunctionCase(context, name, description, isVertexCase, evalFunc, setupUniforms,
142*35238bceSAndroid Build Coastguard Worker tcu::StringTemplate(shaderSrc.str()).specialize(spParams).c_str(),
143*35238bceSAndroid Build Coastguard Worker defaultFragSrc);
144*35238bceSAndroid Build Coastguard Worker else
145*35238bceSAndroid Build Coastguard Worker return new ShaderFunctionCase(context, name, description, isVertexCase, evalFunc, setupUniforms, defaultVertSrc,
146*35238bceSAndroid Build Coastguard Worker tcu::StringTemplate(shaderSrc.str()).specialize(spParams).c_str());
147*35238bceSAndroid Build Coastguard Worker }
148*35238bceSAndroid Build Coastguard Worker
ShaderFunctionTests(Context & context)149*35238bceSAndroid Build Coastguard Worker ShaderFunctionTests::ShaderFunctionTests(Context &context) : TestCaseGroup(context, "function", "Function Tests")
150*35238bceSAndroid Build Coastguard Worker {
151*35238bceSAndroid Build Coastguard Worker }
152*35238bceSAndroid Build Coastguard Worker
~ShaderFunctionTests(void)153*35238bceSAndroid Build Coastguard Worker ShaderFunctionTests::~ShaderFunctionTests(void)
154*35238bceSAndroid Build Coastguard Worker {
155*35238bceSAndroid Build Coastguard Worker }
156*35238bceSAndroid Build Coastguard Worker
init(void)157*35238bceSAndroid Build Coastguard Worker void ShaderFunctionTests::init(void)
158*35238bceSAndroid Build Coastguard Worker {
159*35238bceSAndroid Build Coastguard Worker #define FUNCTION_CASE_PARAMETERIZED(NAME, DESCRIPTION, SHADER_SRC, EVAL_FUNC_BODY, PARAMS) \
160*35238bceSAndroid Build Coastguard Worker do \
161*35238bceSAndroid Build Coastguard Worker { \
162*35238bceSAndroid Build Coastguard Worker struct Eval_##NAME \
163*35238bceSAndroid Build Coastguard Worker { \
164*35238bceSAndroid Build Coastguard Worker static void eval(ShaderEvalContext &c) EVAL_FUNC_BODY \
165*35238bceSAndroid Build Coastguard Worker }; /* NOLINT(EVAL_FUNC_BODY) */ \
166*35238bceSAndroid Build Coastguard Worker addChild(createStructCase(m_context, #NAME "_vertex", DESCRIPTION, true, &Eval_##NAME::eval, DE_NULL, \
167*35238bceSAndroid Build Coastguard Worker SHADER_SRC, PARAMS)); \
168*35238bceSAndroid Build Coastguard Worker addChild(createStructCase(m_context, #NAME "_fragment", DESCRIPTION, false, &Eval_##NAME::eval, DE_NULL, \
169*35238bceSAndroid Build Coastguard Worker SHADER_SRC, PARAMS)); \
170*35238bceSAndroid Build Coastguard Worker } while (false)
171*35238bceSAndroid Build Coastguard Worker
172*35238bceSAndroid Build Coastguard Worker #define FUNCTION_CASE(NAME, DESCRIPTION, SHADER_SRC, EVAL_FUNC_BODY) \
173*35238bceSAndroid Build Coastguard Worker FUNCTION_CASE_PARAMETERIZED(NAME, DESCRIPTION, SHADER_SRC, EVAL_FUNC_BODY, DE_NULL)
174*35238bceSAndroid Build Coastguard Worker
175*35238bceSAndroid Build Coastguard Worker FUNCTION_CASE(local_variable_aliasing, "Function out parameter aliases local variable",
176*35238bceSAndroid Build Coastguard Worker LineStream() << "${DECLARATIONS}"
177*35238bceSAndroid Build Coastguard Worker << ""
178*35238bceSAndroid Build Coastguard Worker << "bool out_params_are_distinct(float x, out float y)"
179*35238bceSAndroid Build Coastguard Worker << "{"
180*35238bceSAndroid Build Coastguard Worker << " y = 2.;"
181*35238bceSAndroid Build Coastguard Worker << " return x == 1. && y == 2.;"
182*35238bceSAndroid Build Coastguard Worker << "}"
183*35238bceSAndroid Build Coastguard Worker << ""
184*35238bceSAndroid Build Coastguard Worker << "void main (void)"
185*35238bceSAndroid Build Coastguard Worker << "{"
186*35238bceSAndroid Build Coastguard Worker << " float x = 1.;"
187*35238bceSAndroid Build Coastguard Worker << " ${DST} = out_params_are_distinct(x, x) ? vec4(0.,1.,0.,1.) : vec4(1.,0.,0.,1.);"
188*35238bceSAndroid Build Coastguard Worker << " ${ASSIGN_POS}"
189*35238bceSAndroid Build Coastguard Worker << "}",
190*35238bceSAndroid Build Coastguard Worker { c.color.xyz() = tcu::Vec3(0.0f, 1.0f, 0.0f); });
191*35238bceSAndroid Build Coastguard Worker
192*35238bceSAndroid Build Coastguard Worker FUNCTION_CASE(
193*35238bceSAndroid Build Coastguard Worker global_variable_aliasing, "Function out parameter aliases global variable",
194*35238bceSAndroid Build Coastguard Worker LineStream() << "${DECLARATIONS}"
195*35238bceSAndroid Build Coastguard Worker << ""
196*35238bceSAndroid Build Coastguard Worker << ""
197*35238bceSAndroid Build Coastguard Worker << "float x = 1.;"
198*35238bceSAndroid Build Coastguard Worker << "bool out_params_are_distinct_from_global(out float y) {"
199*35238bceSAndroid Build Coastguard Worker << " y = 2.;"
200*35238bceSAndroid Build Coastguard Worker << " return x == 1. && y == 2.;"
201*35238bceSAndroid Build Coastguard Worker << "}"
202*35238bceSAndroid Build Coastguard Worker << ""
203*35238bceSAndroid Build Coastguard Worker << "void main (void)"
204*35238bceSAndroid Build Coastguard Worker << "{"
205*35238bceSAndroid Build Coastguard Worker << " ${DST} = out_params_are_distinct_from_global(x) ? vec4(0.,1.,0.,1.) : vec4(1.,0.,0.,1.);"
206*35238bceSAndroid Build Coastguard Worker << " ${ASSIGN_POS}"
207*35238bceSAndroid Build Coastguard Worker << "}",
208*35238bceSAndroid Build Coastguard Worker { c.color.xyz() = tcu::Vec3(0.0f, 1.0f, 0.0f); });
209*35238bceSAndroid Build Coastguard Worker }
210*35238bceSAndroid Build Coastguard Worker
211*35238bceSAndroid Build Coastguard Worker } // namespace Functional
212*35238bceSAndroid Build Coastguard Worker } // namespace gles2
213*35238bceSAndroid Build Coastguard Worker } // namespace deqp
214