1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL ES 3.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 "es3fShaderFunctionTests.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 gles3
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 bool usesTextures, ShaderEvalFunc evalFunc, SetupUniformsFunc setupUniformsFunc,
46*35238bceSAndroid Build Coastguard Worker const char *vertShaderSource, 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 SetupUniformsFunc m_setupUniforms;
59*35238bceSAndroid Build Coastguard Worker bool m_usesTexture;
60*35238bceSAndroid Build Coastguard Worker
61*35238bceSAndroid Build Coastguard Worker glu::Texture2D *m_brickTexture;
62*35238bceSAndroid Build Coastguard Worker };
63*35238bceSAndroid Build Coastguard Worker
ShaderFunctionCase(Context & context,const char * name,const char * description,bool isVertexCase,bool usesTextures,ShaderEvalFunc evalFunc,SetupUniformsFunc setupUniformsFunc,const char * vertShaderSource,const char * fragShaderSource)64*35238bceSAndroid Build Coastguard Worker ShaderFunctionCase::ShaderFunctionCase(Context &context, const char *name, const char *description, bool isVertexCase,
65*35238bceSAndroid Build Coastguard Worker bool usesTextures, ShaderEvalFunc evalFunc, SetupUniformsFunc setupUniformsFunc,
66*35238bceSAndroid Build Coastguard Worker const char *vertShaderSource, const char *fragShaderSource)
67*35238bceSAndroid Build Coastguard Worker : ShaderRenderCase(context.getTestContext(), context.getRenderContext(), context.getContextInfo(), name,
68*35238bceSAndroid Build Coastguard Worker description, isVertexCase, evalFunc)
69*35238bceSAndroid Build Coastguard Worker , m_setupUniforms(setupUniformsFunc)
70*35238bceSAndroid Build Coastguard Worker , m_usesTexture(usesTextures)
71*35238bceSAndroid Build Coastguard Worker , m_brickTexture(DE_NULL)
72*35238bceSAndroid Build Coastguard Worker {
73*35238bceSAndroid Build Coastguard Worker m_vertShaderSource = vertShaderSource;
74*35238bceSAndroid Build Coastguard Worker m_fragShaderSource = fragShaderSource;
75*35238bceSAndroid Build Coastguard Worker }
76*35238bceSAndroid Build Coastguard Worker
~ShaderFunctionCase(void)77*35238bceSAndroid Build Coastguard Worker ShaderFunctionCase::~ShaderFunctionCase(void)
78*35238bceSAndroid Build Coastguard Worker {
79*35238bceSAndroid Build Coastguard Worker delete m_brickTexture;
80*35238bceSAndroid Build Coastguard Worker }
81*35238bceSAndroid Build Coastguard Worker
init(void)82*35238bceSAndroid Build Coastguard Worker void ShaderFunctionCase::init(void)
83*35238bceSAndroid Build Coastguard Worker {
84*35238bceSAndroid Build Coastguard Worker if (m_usesTexture)
85*35238bceSAndroid Build Coastguard Worker {
86*35238bceSAndroid Build Coastguard Worker m_brickTexture = glu::Texture2D::create(m_renderCtx, m_ctxInfo, m_testCtx.getArchive(), "data/brick.png");
87*35238bceSAndroid Build Coastguard Worker m_textures.push_back(TextureBinding(
88*35238bceSAndroid Build Coastguard Worker m_brickTexture, tcu::Sampler(tcu::Sampler::CLAMP_TO_EDGE, tcu::Sampler::CLAMP_TO_EDGE,
89*35238bceSAndroid Build Coastguard Worker tcu::Sampler::CLAMP_TO_EDGE, tcu::Sampler::LINEAR, tcu::Sampler::LINEAR)));
90*35238bceSAndroid Build Coastguard Worker DE_ASSERT(m_textures.size() == 1);
91*35238bceSAndroid Build Coastguard Worker }
92*35238bceSAndroid Build Coastguard Worker gls::ShaderRenderCase::init();
93*35238bceSAndroid Build Coastguard Worker }
94*35238bceSAndroid Build Coastguard Worker
deinit(void)95*35238bceSAndroid Build Coastguard Worker void ShaderFunctionCase::deinit(void)
96*35238bceSAndroid Build Coastguard Worker {
97*35238bceSAndroid Build Coastguard Worker gls::ShaderRenderCase::deinit();
98*35238bceSAndroid Build Coastguard Worker delete m_brickTexture;
99*35238bceSAndroid Build Coastguard Worker m_brickTexture = DE_NULL;
100*35238bceSAndroid Build Coastguard Worker }
101*35238bceSAndroid Build Coastguard Worker
setupUniforms(int programID,const tcu::Vec4 & constCoords)102*35238bceSAndroid Build Coastguard Worker void ShaderFunctionCase::setupUniforms(int programID, const tcu::Vec4 &constCoords)
103*35238bceSAndroid Build Coastguard Worker {
104*35238bceSAndroid Build Coastguard Worker ShaderRenderCase::setupUniforms(programID, constCoords);
105*35238bceSAndroid Build Coastguard Worker if (m_setupUniforms)
106*35238bceSAndroid Build Coastguard Worker m_setupUniforms(m_renderCtx.getFunctions(), programID, constCoords);
107*35238bceSAndroid Build Coastguard Worker }
108*35238bceSAndroid Build Coastguard Worker
createStructCase(Context & context,const char * name,const char * description,bool isVertexCase,bool usesTextures,ShaderEvalFunc evalFunc,SetupUniformsFunc setupUniforms,const LineStream & shaderSrc,const std::map<std::string,std::string> * additionalParams)109*35238bceSAndroid Build Coastguard Worker static ShaderFunctionCase *createStructCase(Context &context, const char *name, const char *description,
110*35238bceSAndroid Build Coastguard Worker bool isVertexCase, bool usesTextures, ShaderEvalFunc evalFunc,
111*35238bceSAndroid Build Coastguard Worker SetupUniformsFunc setupUniforms, const LineStream &shaderSrc,
112*35238bceSAndroid Build Coastguard Worker const std::map<std::string, std::string> *additionalParams)
113*35238bceSAndroid Build Coastguard Worker {
114*35238bceSAndroid Build Coastguard Worker static const char *defaultVertSrc = "#version 300 es\n"
115*35238bceSAndroid Build Coastguard Worker "in highp vec4 a_position;\n"
116*35238bceSAndroid Build Coastguard Worker "in highp vec4 a_coords;\n"
117*35238bceSAndroid Build Coastguard Worker "out mediump vec4 v_coords;\n\n"
118*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
119*35238bceSAndroid Build Coastguard Worker "{\n"
120*35238bceSAndroid Build Coastguard Worker " v_coords = a_coords;\n"
121*35238bceSAndroid Build Coastguard Worker " gl_Position = a_position;\n"
122*35238bceSAndroid Build Coastguard Worker "}\n";
123*35238bceSAndroid Build Coastguard Worker static const char *defaultFragSrc = "#version 300 es\n"
124*35238bceSAndroid Build Coastguard Worker "in mediump vec4 v_color;\n"
125*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out mediump vec4 o_color;\n\n"
126*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
127*35238bceSAndroid Build Coastguard Worker "{\n"
128*35238bceSAndroid Build Coastguard Worker " o_color = v_color;\n"
129*35238bceSAndroid Build Coastguard Worker "}\n";
130*35238bceSAndroid Build Coastguard Worker
131*35238bceSAndroid Build Coastguard Worker // Fill in specialization parameters.
132*35238bceSAndroid Build Coastguard Worker std::map<std::string, std::string> spParams;
133*35238bceSAndroid Build Coastguard Worker if (isVertexCase)
134*35238bceSAndroid Build Coastguard Worker {
135*35238bceSAndroid Build Coastguard Worker spParams["HEADER"] = "#version 300 es\n"
136*35238bceSAndroid Build Coastguard Worker "in highp vec4 a_position;\n"
137*35238bceSAndroid Build Coastguard Worker "in highp vec4 a_coords;\n"
138*35238bceSAndroid Build Coastguard Worker "out mediump vec4 v_color;";
139*35238bceSAndroid Build Coastguard Worker spParams["COORDS"] = "a_coords";
140*35238bceSAndroid Build Coastguard Worker spParams["DST"] = "v_color";
141*35238bceSAndroid Build Coastguard Worker spParams["ASSIGN_POS"] = "gl_Position = a_position;";
142*35238bceSAndroid Build Coastguard Worker }
143*35238bceSAndroid Build Coastguard Worker else
144*35238bceSAndroid Build Coastguard Worker {
145*35238bceSAndroid Build Coastguard Worker spParams["HEADER"] = "#version 300 es\n"
146*35238bceSAndroid Build Coastguard Worker "precision mediump float;\n"
147*35238bceSAndroid Build Coastguard Worker "in mediump vec4 v_coords;\n"
148*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out mediump vec4 o_color;";
149*35238bceSAndroid Build Coastguard Worker spParams["COORDS"] = "v_coords";
150*35238bceSAndroid Build Coastguard Worker spParams["DST"] = "o_color";
151*35238bceSAndroid Build Coastguard Worker spParams["ASSIGN_POS"] = "";
152*35238bceSAndroid Build Coastguard Worker }
153*35238bceSAndroid Build Coastguard Worker if (additionalParams)
154*35238bceSAndroid Build Coastguard Worker spParams.insert(additionalParams->begin(), additionalParams->end());
155*35238bceSAndroid Build Coastguard Worker
156*35238bceSAndroid Build Coastguard Worker if (isVertexCase)
157*35238bceSAndroid Build Coastguard Worker return new ShaderFunctionCase(context, name, description, isVertexCase, usesTextures, evalFunc, setupUniforms,
158*35238bceSAndroid Build Coastguard Worker tcu::StringTemplate(shaderSrc.str()).specialize(spParams).c_str(),
159*35238bceSAndroid Build Coastguard Worker defaultFragSrc);
160*35238bceSAndroid Build Coastguard Worker else
161*35238bceSAndroid Build Coastguard Worker return new ShaderFunctionCase(context, name, description, isVertexCase, usesTextures, evalFunc, setupUniforms,
162*35238bceSAndroid Build Coastguard Worker defaultVertSrc,
163*35238bceSAndroid Build Coastguard Worker tcu::StringTemplate(shaderSrc.str()).specialize(spParams).c_str());
164*35238bceSAndroid Build Coastguard Worker }
165*35238bceSAndroid Build Coastguard Worker
ShaderFunctionTests(Context & context)166*35238bceSAndroid Build Coastguard Worker ShaderFunctionTests::ShaderFunctionTests(Context &context) : TestCaseGroup(context, "function", "Function Tests")
167*35238bceSAndroid Build Coastguard Worker {
168*35238bceSAndroid Build Coastguard Worker }
169*35238bceSAndroid Build Coastguard Worker
~ShaderFunctionTests(void)170*35238bceSAndroid Build Coastguard Worker ShaderFunctionTests::~ShaderFunctionTests(void)
171*35238bceSAndroid Build Coastguard Worker {
172*35238bceSAndroid Build Coastguard Worker }
173*35238bceSAndroid Build Coastguard Worker
init(void)174*35238bceSAndroid Build Coastguard Worker void ShaderFunctionTests::init(void)
175*35238bceSAndroid Build Coastguard Worker {
176*35238bceSAndroid Build Coastguard Worker #define FUNCTION_CASE_PARAMETERIZED(NAME, DESCRIPTION, SHADER_SRC, EVAL_FUNC_BODY, PARAMS) \
177*35238bceSAndroid Build Coastguard Worker do \
178*35238bceSAndroid Build Coastguard Worker { \
179*35238bceSAndroid Build Coastguard Worker struct Eval_##NAME \
180*35238bceSAndroid Build Coastguard Worker { \
181*35238bceSAndroid Build Coastguard Worker static void eval(ShaderEvalContext &c) EVAL_FUNC_BODY \
182*35238bceSAndroid Build Coastguard Worker }; /* NOLINT(EVAL_FUNC_BODY) */ \
183*35238bceSAndroid Build Coastguard Worker addChild(createStructCase(m_context, #NAME "_vertex", DESCRIPTION, true, false, &Eval_##NAME::eval, DE_NULL, \
184*35238bceSAndroid Build Coastguard Worker SHADER_SRC, PARAMS)); \
185*35238bceSAndroid Build Coastguard Worker addChild(createStructCase(m_context, #NAME "_fragment", DESCRIPTION, false, false, &Eval_##NAME::eval, \
186*35238bceSAndroid Build Coastguard Worker DE_NULL, SHADER_SRC, PARAMS)); \
187*35238bceSAndroid Build Coastguard Worker } while (false)
188*35238bceSAndroid Build Coastguard Worker
189*35238bceSAndroid Build Coastguard Worker #define FUNCTION_CASE(NAME, DESCRIPTION, SHADER_SRC, EVAL_FUNC_BODY) \
190*35238bceSAndroid Build Coastguard Worker FUNCTION_CASE_PARAMETERIZED(NAME, DESCRIPTION, SHADER_SRC, EVAL_FUNC_BODY, DE_NULL)
191*35238bceSAndroid Build Coastguard Worker
192*35238bceSAndroid Build Coastguard Worker FUNCTION_CASE(local_variable_aliasing, "Function out parameter aliases local variable",
193*35238bceSAndroid Build Coastguard Worker LineStream() << "${HEADER}"
194*35238bceSAndroid Build Coastguard Worker << ""
195*35238bceSAndroid Build Coastguard Worker << "bool out_params_are_distinct(float x, out float y) {"
196*35238bceSAndroid Build Coastguard Worker << " y = 2.;"
197*35238bceSAndroid Build Coastguard Worker << " return x == 1. && y == 2.;"
198*35238bceSAndroid Build Coastguard Worker << "}"
199*35238bceSAndroid Build Coastguard Worker << ""
200*35238bceSAndroid Build Coastguard Worker << "void main (void)"
201*35238bceSAndroid Build Coastguard Worker << "{"
202*35238bceSAndroid Build Coastguard Worker << " float x = 1.;"
203*35238bceSAndroid Build Coastguard Worker << " ${DST} = out_params_are_distinct(x, x) ? vec4(0.,1.,0.,1.) : vec4(1.,0.,0.,1.);"
204*35238bceSAndroid Build Coastguard Worker << " ${ASSIGN_POS}"
205*35238bceSAndroid Build Coastguard Worker << "}",
206*35238bceSAndroid Build Coastguard Worker { c.color.xyz() = tcu::Vec3(0.0f, 1.0f, 0.0f); });
207*35238bceSAndroid Build Coastguard Worker
208*35238bceSAndroid Build Coastguard Worker FUNCTION_CASE(
209*35238bceSAndroid Build Coastguard Worker global_variable_aliasing, "Function out parameter aliases global variable",
210*35238bceSAndroid Build Coastguard Worker LineStream() << "${HEADER}"
211*35238bceSAndroid Build Coastguard Worker << ""
212*35238bceSAndroid Build Coastguard Worker << ""
213*35238bceSAndroid Build Coastguard Worker << "float x = 1.;"
214*35238bceSAndroid Build Coastguard Worker << "bool out_params_are_distinct_from_global(out float y) {"
215*35238bceSAndroid Build Coastguard Worker << " y = 2.;"
216*35238bceSAndroid Build Coastguard Worker << " return x == 1. && y == 2.;"
217*35238bceSAndroid Build Coastguard Worker << "}"
218*35238bceSAndroid Build Coastguard Worker << ""
219*35238bceSAndroid Build Coastguard Worker << "void main (void)"
220*35238bceSAndroid Build Coastguard Worker << "{"
221*35238bceSAndroid Build Coastguard Worker << " ${DST} = out_params_are_distinct_from_global(x) ? vec4(0.,1.,0.,1.) : vec4(1.,0.,0.,1.);"
222*35238bceSAndroid Build Coastguard Worker << " ${ASSIGN_POS}"
223*35238bceSAndroid Build Coastguard Worker << "}",
224*35238bceSAndroid Build Coastguard Worker { c.color.xyz() = tcu::Vec3(0.0f, 1.0f, 0.0f); });
225*35238bceSAndroid Build Coastguard Worker }
226*35238bceSAndroid Build Coastguard Worker
227*35238bceSAndroid Build Coastguard Worker } // namespace Functional
228*35238bceSAndroid Build Coastguard Worker } // namespace gles3
229*35238bceSAndroid Build Coastguard Worker } // namespace deqp
230