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