xref: /aosp_15_r20/external/deqp/modules/gles2/functional/es2fShaderFunctionTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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