xref: /aosp_15_r20/external/deqp/modules/gles2/functional/es2fShaderDiscardTests.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 discard statement tests.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "es2fShaderDiscardTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "glsShaderRenderCase.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "tcuStringTemplate.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "gluTexture.hpp"
28*35238bceSAndroid Build Coastguard Worker 
29*35238bceSAndroid Build Coastguard Worker #include <map>
30*35238bceSAndroid Build Coastguard Worker #include <sstream>
31*35238bceSAndroid Build Coastguard Worker #include <string>
32*35238bceSAndroid Build Coastguard Worker 
33*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
35*35238bceSAndroid Build Coastguard Worker 
36*35238bceSAndroid Build Coastguard Worker using tcu::StringTemplate;
37*35238bceSAndroid Build Coastguard Worker 
38*35238bceSAndroid Build Coastguard Worker using std::map;
39*35238bceSAndroid Build Coastguard Worker using std::ostringstream;
40*35238bceSAndroid Build Coastguard Worker using std::string;
41*35238bceSAndroid Build Coastguard Worker 
42*35238bceSAndroid Build Coastguard Worker using namespace glu;
43*35238bceSAndroid Build Coastguard Worker using namespace deqp::gls;
44*35238bceSAndroid Build Coastguard Worker 
45*35238bceSAndroid Build Coastguard Worker namespace deqp
46*35238bceSAndroid Build Coastguard Worker {
47*35238bceSAndroid Build Coastguard Worker namespace gles2
48*35238bceSAndroid Build Coastguard Worker {
49*35238bceSAndroid Build Coastguard Worker namespace Functional
50*35238bceSAndroid Build Coastguard Worker {
51*35238bceSAndroid Build Coastguard Worker 
52*35238bceSAndroid Build Coastguard Worker enum CaseFlags
53*35238bceSAndroid Build Coastguard Worker {
54*35238bceSAndroid Build Coastguard Worker     FLAG_USES_TEXTURES          = (1 << 0),
55*35238bceSAndroid Build Coastguard Worker     FLAG_REQUIRES_DYNAMIC_LOOPS = (1 << 1),
56*35238bceSAndroid Build Coastguard Worker };
57*35238bceSAndroid Build Coastguard Worker 
58*35238bceSAndroid Build Coastguard Worker class ShaderDiscardCase : public ShaderRenderCase
59*35238bceSAndroid Build Coastguard Worker {
60*35238bceSAndroid Build Coastguard Worker public:
61*35238bceSAndroid Build Coastguard Worker     ShaderDiscardCase(Context &context, const char *name, const char *description, const char *shaderSource,
62*35238bceSAndroid Build Coastguard Worker                       ShaderEvalFunc evalFunc, uint32_t flags);
63*35238bceSAndroid Build Coastguard Worker     virtual ~ShaderDiscardCase(void);
64*35238bceSAndroid Build Coastguard Worker 
65*35238bceSAndroid Build Coastguard Worker     void init(void);
66*35238bceSAndroid Build Coastguard Worker     void deinit(void);
67*35238bceSAndroid Build Coastguard Worker 
68*35238bceSAndroid Build Coastguard Worker     void setupUniforms(int programID, const tcu::Vec4 &constCoords);
69*35238bceSAndroid Build Coastguard Worker 
70*35238bceSAndroid Build Coastguard Worker private:
71*35238bceSAndroid Build Coastguard Worker     const uint32_t m_flags;
72*35238bceSAndroid Build Coastguard Worker     glu::Texture2D *m_brickTexture;
73*35238bceSAndroid Build Coastguard Worker };
74*35238bceSAndroid Build Coastguard Worker 
ShaderDiscardCase(Context & context,const char * name,const char * description,const char * shaderSource,ShaderEvalFunc evalFunc,uint32_t flags)75*35238bceSAndroid Build Coastguard Worker ShaderDiscardCase::ShaderDiscardCase(Context &context, const char *name, const char *description,
76*35238bceSAndroid Build Coastguard Worker                                      const char *shaderSource, ShaderEvalFunc evalFunc, uint32_t flags)
77*35238bceSAndroid Build Coastguard Worker     : ShaderRenderCase(context.getTestContext(), context.getRenderContext(), context.getContextInfo(), name,
78*35238bceSAndroid Build Coastguard Worker                        description, false, evalFunc)
79*35238bceSAndroid Build Coastguard Worker     , m_flags(flags)
80*35238bceSAndroid Build Coastguard Worker     , m_brickTexture(DE_NULL)
81*35238bceSAndroid Build Coastguard Worker {
82*35238bceSAndroid Build Coastguard Worker     m_fragShaderSource = shaderSource;
83*35238bceSAndroid Build Coastguard Worker     m_vertShaderSource = "attribute highp   vec4 a_position;\n"
84*35238bceSAndroid Build Coastguard Worker                          "attribute highp   vec4 a_coords;\n"
85*35238bceSAndroid Build Coastguard Worker                          "varying   mediump vec4 v_color;\n"
86*35238bceSAndroid Build Coastguard Worker                          "varying   mediump vec4 v_coords;\n\n"
87*35238bceSAndroid Build Coastguard Worker                          "void main (void)\n"
88*35238bceSAndroid Build Coastguard Worker                          "{\n"
89*35238bceSAndroid Build Coastguard Worker                          "    gl_Position = a_position;\n"
90*35238bceSAndroid Build Coastguard Worker                          "    v_color = vec4(a_coords.xyz, 1.0);\n"
91*35238bceSAndroid Build Coastguard Worker                          "    v_coords = a_coords;\n"
92*35238bceSAndroid Build Coastguard Worker                          "}\n";
93*35238bceSAndroid Build Coastguard Worker }
94*35238bceSAndroid Build Coastguard Worker 
~ShaderDiscardCase(void)95*35238bceSAndroid Build Coastguard Worker ShaderDiscardCase::~ShaderDiscardCase(void)
96*35238bceSAndroid Build Coastguard Worker {
97*35238bceSAndroid Build Coastguard Worker     delete m_brickTexture;
98*35238bceSAndroid Build Coastguard Worker }
99*35238bceSAndroid Build Coastguard Worker 
init(void)100*35238bceSAndroid Build Coastguard Worker void ShaderDiscardCase::init(void)
101*35238bceSAndroid Build Coastguard Worker {
102*35238bceSAndroid Build Coastguard Worker     try
103*35238bceSAndroid Build Coastguard Worker     {
104*35238bceSAndroid Build Coastguard Worker         gls::ShaderRenderCase::init();
105*35238bceSAndroid Build Coastguard Worker     }
106*35238bceSAndroid Build Coastguard Worker     catch (const CompileFailed &)
107*35238bceSAndroid Build Coastguard Worker     {
108*35238bceSAndroid Build Coastguard Worker         if (m_flags & FLAG_REQUIRES_DYNAMIC_LOOPS)
109*35238bceSAndroid Build Coastguard Worker         {
110*35238bceSAndroid Build Coastguard Worker             const bool isSupported =
111*35238bceSAndroid Build Coastguard Worker                 m_isVertexCase ? m_ctxInfo.isVertexDynamicLoopSupported() : m_ctxInfo.isFragmentDynamicLoopSupported();
112*35238bceSAndroid Build Coastguard Worker             if (!isSupported)
113*35238bceSAndroid Build Coastguard Worker                 throw tcu::NotSupportedError("Dynamic loops not supported");
114*35238bceSAndroid Build Coastguard Worker         }
115*35238bceSAndroid Build Coastguard Worker 
116*35238bceSAndroid Build Coastguard Worker         throw;
117*35238bceSAndroid Build Coastguard Worker     }
118*35238bceSAndroid Build Coastguard Worker 
119*35238bceSAndroid Build Coastguard Worker     if (m_flags & FLAG_USES_TEXTURES)
120*35238bceSAndroid Build Coastguard Worker     {
121*35238bceSAndroid Build Coastguard Worker         m_brickTexture = glu::Texture2D::create(m_renderCtx, m_ctxInfo, m_testCtx.getArchive(), "data/brick.png");
122*35238bceSAndroid Build Coastguard Worker         m_textures.push_back(TextureBinding(
123*35238bceSAndroid Build Coastguard Worker             m_brickTexture, tcu::Sampler(tcu::Sampler::CLAMP_TO_EDGE, tcu::Sampler::CLAMP_TO_EDGE,
124*35238bceSAndroid Build Coastguard Worker                                          tcu::Sampler::CLAMP_TO_EDGE, tcu::Sampler::LINEAR, tcu::Sampler::LINEAR)));
125*35238bceSAndroid Build Coastguard Worker     }
126*35238bceSAndroid Build Coastguard Worker }
127*35238bceSAndroid Build Coastguard Worker 
deinit(void)128*35238bceSAndroid Build Coastguard Worker void ShaderDiscardCase::deinit(void)
129*35238bceSAndroid Build Coastguard Worker {
130*35238bceSAndroid Build Coastguard Worker     gls::ShaderRenderCase::deinit();
131*35238bceSAndroid Build Coastguard Worker     delete m_brickTexture;
132*35238bceSAndroid Build Coastguard Worker     m_brickTexture = DE_NULL;
133*35238bceSAndroid Build Coastguard Worker }
134*35238bceSAndroid Build Coastguard Worker 
setupUniforms(int programID,const tcu::Vec4 &)135*35238bceSAndroid Build Coastguard Worker void ShaderDiscardCase::setupUniforms(int programID, const tcu::Vec4 &)
136*35238bceSAndroid Build Coastguard Worker {
137*35238bceSAndroid Build Coastguard Worker     const glw::Functions &gl = m_renderCtx.getFunctions();
138*35238bceSAndroid Build Coastguard Worker     gl.uniform1i(gl.getUniformLocation(programID, "ut_brick"), 0);
139*35238bceSAndroid Build Coastguard Worker }
140*35238bceSAndroid Build Coastguard Worker 
ShaderDiscardTests(Context & context)141*35238bceSAndroid Build Coastguard Worker ShaderDiscardTests::ShaderDiscardTests(Context &context) : TestCaseGroup(context, "discard", "Discard statement tests")
142*35238bceSAndroid Build Coastguard Worker {
143*35238bceSAndroid Build Coastguard Worker }
144*35238bceSAndroid Build Coastguard Worker 
~ShaderDiscardTests(void)145*35238bceSAndroid Build Coastguard Worker ShaderDiscardTests::~ShaderDiscardTests(void)
146*35238bceSAndroid Build Coastguard Worker {
147*35238bceSAndroid Build Coastguard Worker }
148*35238bceSAndroid Build Coastguard Worker 
149*35238bceSAndroid Build Coastguard Worker enum DiscardMode
150*35238bceSAndroid Build Coastguard Worker {
151*35238bceSAndroid Build Coastguard Worker     DISCARDMODE_ALWAYS = 0,
152*35238bceSAndroid Build Coastguard Worker     DISCARDMODE_NEVER,
153*35238bceSAndroid Build Coastguard Worker     DISCARDMODE_UNIFORM,
154*35238bceSAndroid Build Coastguard Worker     DISCARDMODE_DYNAMIC,
155*35238bceSAndroid Build Coastguard Worker     DISCARDMODE_TEXTURE,
156*35238bceSAndroid Build Coastguard Worker 
157*35238bceSAndroid Build Coastguard Worker     DISCARDMODE_LAST
158*35238bceSAndroid Build Coastguard Worker };
159*35238bceSAndroid Build Coastguard Worker 
160*35238bceSAndroid Build Coastguard Worker enum DiscardTemplate
161*35238bceSAndroid Build Coastguard Worker {
162*35238bceSAndroid Build Coastguard Worker     DISCARDTEMPLATE_MAIN_BASIC = 0,
163*35238bceSAndroid Build Coastguard Worker     DISCARDTEMPLATE_FUNCTION_BASIC,
164*35238bceSAndroid Build Coastguard Worker     DISCARDTEMPLATE_MAIN_STATIC_LOOP,
165*35238bceSAndroid Build Coastguard Worker     DISCARDTEMPLATE_MAIN_DYNAMIC_LOOP,
166*35238bceSAndroid Build Coastguard Worker     DISCARDTEMPLATE_FUNCTION_STATIC_LOOP,
167*35238bceSAndroid Build Coastguard Worker 
168*35238bceSAndroid Build Coastguard Worker     DISCARDTEMPLATE_LAST
169*35238bceSAndroid Build Coastguard Worker };
170*35238bceSAndroid Build Coastguard Worker 
171*35238bceSAndroid Build Coastguard Worker // Evaluation functions
evalDiscardAlways(ShaderEvalContext & c)172*35238bceSAndroid Build Coastguard Worker inline void evalDiscardAlways(ShaderEvalContext &c)
173*35238bceSAndroid Build Coastguard Worker {
174*35238bceSAndroid Build Coastguard Worker     c.discard();
175*35238bceSAndroid Build Coastguard Worker }
evalDiscardNever(ShaderEvalContext & c)176*35238bceSAndroid Build Coastguard Worker inline void evalDiscardNever(ShaderEvalContext &c)
177*35238bceSAndroid Build Coastguard Worker {
178*35238bceSAndroid Build Coastguard Worker     c.color.xyz() = c.coords.swizzle(0, 1, 2);
179*35238bceSAndroid Build Coastguard Worker }
evalDiscardDynamic(ShaderEvalContext & c)180*35238bceSAndroid Build Coastguard Worker inline void evalDiscardDynamic(ShaderEvalContext &c)
181*35238bceSAndroid Build Coastguard Worker {
182*35238bceSAndroid Build Coastguard Worker     c.color.xyz() = c.coords.swizzle(0, 1, 2);
183*35238bceSAndroid Build Coastguard Worker     if (c.coords.x() + c.coords.y() > 0.0f)
184*35238bceSAndroid Build Coastguard Worker         c.discard();
185*35238bceSAndroid Build Coastguard Worker }
186*35238bceSAndroid Build Coastguard Worker 
evalDiscardTexture(ShaderEvalContext & c)187*35238bceSAndroid Build Coastguard Worker inline void evalDiscardTexture(ShaderEvalContext &c)
188*35238bceSAndroid Build Coastguard Worker {
189*35238bceSAndroid Build Coastguard Worker     c.color.xyz() = c.coords.swizzle(0, 1, 2);
190*35238bceSAndroid Build Coastguard Worker     if (c.texture2D(0, c.coords.swizzle(0, 1) * 0.25f + 0.5f).x() < 0.7f)
191*35238bceSAndroid Build Coastguard Worker         c.discard();
192*35238bceSAndroid Build Coastguard Worker }
193*35238bceSAndroid Build Coastguard Worker 
getEvalFunc(DiscardMode mode)194*35238bceSAndroid Build Coastguard Worker static ShaderEvalFunc getEvalFunc(DiscardMode mode)
195*35238bceSAndroid Build Coastguard Worker {
196*35238bceSAndroid Build Coastguard Worker     switch (mode)
197*35238bceSAndroid Build Coastguard Worker     {
198*35238bceSAndroid Build Coastguard Worker     case DISCARDMODE_ALWAYS:
199*35238bceSAndroid Build Coastguard Worker         return evalDiscardAlways;
200*35238bceSAndroid Build Coastguard Worker     case DISCARDMODE_NEVER:
201*35238bceSAndroid Build Coastguard Worker         return evalDiscardNever;
202*35238bceSAndroid Build Coastguard Worker     case DISCARDMODE_UNIFORM:
203*35238bceSAndroid Build Coastguard Worker         return evalDiscardAlways;
204*35238bceSAndroid Build Coastguard Worker     case DISCARDMODE_DYNAMIC:
205*35238bceSAndroid Build Coastguard Worker         return evalDiscardDynamic;
206*35238bceSAndroid Build Coastguard Worker     case DISCARDMODE_TEXTURE:
207*35238bceSAndroid Build Coastguard Worker         return evalDiscardTexture;
208*35238bceSAndroid Build Coastguard Worker     default:
209*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
210*35238bceSAndroid Build Coastguard Worker         return evalDiscardAlways;
211*35238bceSAndroid Build Coastguard Worker     }
212*35238bceSAndroid Build Coastguard Worker }
213*35238bceSAndroid Build Coastguard Worker 
getTemplate(DiscardTemplate variant)214*35238bceSAndroid Build Coastguard Worker static const char *getTemplate(DiscardTemplate variant)
215*35238bceSAndroid Build Coastguard Worker {
216*35238bceSAndroid Build Coastguard Worker     switch (variant)
217*35238bceSAndroid Build Coastguard Worker     {
218*35238bceSAndroid Build Coastguard Worker     case DISCARDTEMPLATE_MAIN_BASIC:
219*35238bceSAndroid Build Coastguard Worker         return "varying mediump vec4 v_color;\n"
220*35238bceSAndroid Build Coastguard Worker                "varying mediump vec4 v_coords;\n"
221*35238bceSAndroid Build Coastguard Worker                "uniform sampler2D    ut_brick;\n"
222*35238bceSAndroid Build Coastguard Worker                "uniform mediump int  ui_one;\n\n"
223*35238bceSAndroid Build Coastguard Worker                "void main (void)\n"
224*35238bceSAndroid Build Coastguard Worker                "{\n"
225*35238bceSAndroid Build Coastguard Worker                "    gl_FragColor = v_color;\n"
226*35238bceSAndroid Build Coastguard Worker                "    ${DISCARD};\n"
227*35238bceSAndroid Build Coastguard Worker                "}\n";
228*35238bceSAndroid Build Coastguard Worker 
229*35238bceSAndroid Build Coastguard Worker     case DISCARDTEMPLATE_FUNCTION_BASIC:
230*35238bceSAndroid Build Coastguard Worker         return "varying mediump vec4 v_color;\n"
231*35238bceSAndroid Build Coastguard Worker                "varying mediump vec4 v_coords;\n"
232*35238bceSAndroid Build Coastguard Worker                "uniform sampler2D    ut_brick;\n"
233*35238bceSAndroid Build Coastguard Worker                "uniform mediump int  ui_one;\n\n"
234*35238bceSAndroid Build Coastguard Worker                "void myfunc (void)\n"
235*35238bceSAndroid Build Coastguard Worker                "{\n"
236*35238bceSAndroid Build Coastguard Worker                "    ${DISCARD};\n"
237*35238bceSAndroid Build Coastguard Worker                "}\n\n"
238*35238bceSAndroid Build Coastguard Worker                "void main (void)\n"
239*35238bceSAndroid Build Coastguard Worker                "{\n"
240*35238bceSAndroid Build Coastguard Worker                "    gl_FragColor = v_color;\n"
241*35238bceSAndroid Build Coastguard Worker                "    myfunc();\n"
242*35238bceSAndroid Build Coastguard Worker                "}\n";
243*35238bceSAndroid Build Coastguard Worker 
244*35238bceSAndroid Build Coastguard Worker     case DISCARDTEMPLATE_MAIN_STATIC_LOOP:
245*35238bceSAndroid Build Coastguard Worker         return "varying mediump vec4 v_color;\n"
246*35238bceSAndroid Build Coastguard Worker                "varying mediump vec4 v_coords;\n"
247*35238bceSAndroid Build Coastguard Worker                "uniform sampler2D    ut_brick;\n"
248*35238bceSAndroid Build Coastguard Worker                "uniform mediump int  ui_one;\n\n"
249*35238bceSAndroid Build Coastguard Worker                "void main (void)\n"
250*35238bceSAndroid Build Coastguard Worker                "{\n"
251*35238bceSAndroid Build Coastguard Worker                "    gl_FragColor = v_color;\n"
252*35238bceSAndroid Build Coastguard Worker                "    for (int i = 0; i < 2; i++)\n"
253*35238bceSAndroid Build Coastguard Worker                "    {\n"
254*35238bceSAndroid Build Coastguard Worker                "        if (i > 0)\n"
255*35238bceSAndroid Build Coastguard Worker                "            ${DISCARD};\n"
256*35238bceSAndroid Build Coastguard Worker                "    }\n"
257*35238bceSAndroid Build Coastguard Worker                "}\n";
258*35238bceSAndroid Build Coastguard Worker 
259*35238bceSAndroid Build Coastguard Worker     case DISCARDTEMPLATE_MAIN_DYNAMIC_LOOP:
260*35238bceSAndroid Build Coastguard Worker         return "varying mediump vec4 v_color;\n"
261*35238bceSAndroid Build Coastguard Worker                "varying mediump vec4 v_coords;\n"
262*35238bceSAndroid Build Coastguard Worker                "uniform sampler2D    ut_brick;\n"
263*35238bceSAndroid Build Coastguard Worker                "uniform mediump int  ui_one;\n"
264*35238bceSAndroid Build Coastguard Worker                "uniform mediump int  ui_two;\n\n"
265*35238bceSAndroid Build Coastguard Worker                "void main (void)\n"
266*35238bceSAndroid Build Coastguard Worker                "{\n"
267*35238bceSAndroid Build Coastguard Worker                "    gl_FragColor = v_color;\n"
268*35238bceSAndroid Build Coastguard Worker                "    for (int i = 0; i < ui_two; i++)\n"
269*35238bceSAndroid Build Coastguard Worker                "    {\n"
270*35238bceSAndroid Build Coastguard Worker                "        if (i > 0)\n"
271*35238bceSAndroid Build Coastguard Worker                "            ${DISCARD};\n"
272*35238bceSAndroid Build Coastguard Worker                "    }\n"
273*35238bceSAndroid Build Coastguard Worker                "}\n";
274*35238bceSAndroid Build Coastguard Worker 
275*35238bceSAndroid Build Coastguard Worker     case DISCARDTEMPLATE_FUNCTION_STATIC_LOOP:
276*35238bceSAndroid Build Coastguard Worker         return "varying mediump vec4 v_color;\n"
277*35238bceSAndroid Build Coastguard Worker                "varying mediump vec4 v_coords;\n"
278*35238bceSAndroid Build Coastguard Worker                "uniform sampler2D    ut_brick;\n"
279*35238bceSAndroid Build Coastguard Worker                "uniform mediump int  ui_one;\n\n"
280*35238bceSAndroid Build Coastguard Worker                "void myfunc (void)\n"
281*35238bceSAndroid Build Coastguard Worker                "{\n"
282*35238bceSAndroid Build Coastguard Worker                "    for (int i = 0; i < 2; i++)\n"
283*35238bceSAndroid Build Coastguard Worker                "    {\n"
284*35238bceSAndroid Build Coastguard Worker                "        if (i > 0)\n"
285*35238bceSAndroid Build Coastguard Worker                "            ${DISCARD};\n"
286*35238bceSAndroid Build Coastguard Worker                "    }\n"
287*35238bceSAndroid Build Coastguard Worker                "}\n\n"
288*35238bceSAndroid Build Coastguard Worker                "void main (void)\n"
289*35238bceSAndroid Build Coastguard Worker                "{\n"
290*35238bceSAndroid Build Coastguard Worker                "    gl_FragColor = v_color;\n"
291*35238bceSAndroid Build Coastguard Worker                "    myfunc();\n"
292*35238bceSAndroid Build Coastguard Worker                "}\n";
293*35238bceSAndroid Build Coastguard Worker 
294*35238bceSAndroid Build Coastguard Worker     default:
295*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
296*35238bceSAndroid Build Coastguard Worker         return DE_NULL;
297*35238bceSAndroid Build Coastguard Worker     }
298*35238bceSAndroid Build Coastguard Worker }
299*35238bceSAndroid Build Coastguard Worker 
getTemplateName(DiscardTemplate variant)300*35238bceSAndroid Build Coastguard Worker static const char *getTemplateName(DiscardTemplate variant)
301*35238bceSAndroid Build Coastguard Worker {
302*35238bceSAndroid Build Coastguard Worker     switch (variant)
303*35238bceSAndroid Build Coastguard Worker     {
304*35238bceSAndroid Build Coastguard Worker     case DISCARDTEMPLATE_MAIN_BASIC:
305*35238bceSAndroid Build Coastguard Worker         return "basic";
306*35238bceSAndroid Build Coastguard Worker     case DISCARDTEMPLATE_FUNCTION_BASIC:
307*35238bceSAndroid Build Coastguard Worker         return "function";
308*35238bceSAndroid Build Coastguard Worker     case DISCARDTEMPLATE_MAIN_STATIC_LOOP:
309*35238bceSAndroid Build Coastguard Worker         return "static_loop";
310*35238bceSAndroid Build Coastguard Worker     case DISCARDTEMPLATE_MAIN_DYNAMIC_LOOP:
311*35238bceSAndroid Build Coastguard Worker         return "dynamic_loop";
312*35238bceSAndroid Build Coastguard Worker     case DISCARDTEMPLATE_FUNCTION_STATIC_LOOP:
313*35238bceSAndroid Build Coastguard Worker         return "function_static_loop";
314*35238bceSAndroid Build Coastguard Worker     default:
315*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
316*35238bceSAndroid Build Coastguard Worker         return DE_NULL;
317*35238bceSAndroid Build Coastguard Worker     }
318*35238bceSAndroid Build Coastguard Worker }
319*35238bceSAndroid Build Coastguard Worker 
getModeName(DiscardMode mode)320*35238bceSAndroid Build Coastguard Worker static const char *getModeName(DiscardMode mode)
321*35238bceSAndroid Build Coastguard Worker {
322*35238bceSAndroid Build Coastguard Worker     switch (mode)
323*35238bceSAndroid Build Coastguard Worker     {
324*35238bceSAndroid Build Coastguard Worker     case DISCARDMODE_ALWAYS:
325*35238bceSAndroid Build Coastguard Worker         return "always";
326*35238bceSAndroid Build Coastguard Worker     case DISCARDMODE_NEVER:
327*35238bceSAndroid Build Coastguard Worker         return "never";
328*35238bceSAndroid Build Coastguard Worker     case DISCARDMODE_UNIFORM:
329*35238bceSAndroid Build Coastguard Worker         return "uniform";
330*35238bceSAndroid Build Coastguard Worker     case DISCARDMODE_DYNAMIC:
331*35238bceSAndroid Build Coastguard Worker         return "dynamic";
332*35238bceSAndroid Build Coastguard Worker     case DISCARDMODE_TEXTURE:
333*35238bceSAndroid Build Coastguard Worker         return "texture";
334*35238bceSAndroid Build Coastguard Worker     default:
335*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
336*35238bceSAndroid Build Coastguard Worker         return DE_NULL;
337*35238bceSAndroid Build Coastguard Worker     }
338*35238bceSAndroid Build Coastguard Worker }
339*35238bceSAndroid Build Coastguard Worker 
getTemplateDesc(DiscardTemplate variant)340*35238bceSAndroid Build Coastguard Worker static const char *getTemplateDesc(DiscardTemplate variant)
341*35238bceSAndroid Build Coastguard Worker {
342*35238bceSAndroid Build Coastguard Worker     switch (variant)
343*35238bceSAndroid Build Coastguard Worker     {
344*35238bceSAndroid Build Coastguard Worker     case DISCARDTEMPLATE_MAIN_BASIC:
345*35238bceSAndroid Build Coastguard Worker         return "main";
346*35238bceSAndroid Build Coastguard Worker     case DISCARDTEMPLATE_FUNCTION_BASIC:
347*35238bceSAndroid Build Coastguard Worker         return "function";
348*35238bceSAndroid Build Coastguard Worker     case DISCARDTEMPLATE_MAIN_STATIC_LOOP:
349*35238bceSAndroid Build Coastguard Worker         return "static loop";
350*35238bceSAndroid Build Coastguard Worker     case DISCARDTEMPLATE_MAIN_DYNAMIC_LOOP:
351*35238bceSAndroid Build Coastguard Worker         return "dynamic loop";
352*35238bceSAndroid Build Coastguard Worker     case DISCARDTEMPLATE_FUNCTION_STATIC_LOOP:
353*35238bceSAndroid Build Coastguard Worker         return "static loop in function";
354*35238bceSAndroid Build Coastguard Worker     default:
355*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
356*35238bceSAndroid Build Coastguard Worker         return DE_NULL;
357*35238bceSAndroid Build Coastguard Worker     }
358*35238bceSAndroid Build Coastguard Worker }
359*35238bceSAndroid Build Coastguard Worker 
getModeDesc(DiscardMode mode)360*35238bceSAndroid Build Coastguard Worker static const char *getModeDesc(DiscardMode mode)
361*35238bceSAndroid Build Coastguard Worker {
362*35238bceSAndroid Build Coastguard Worker     switch (mode)
363*35238bceSAndroid Build Coastguard Worker     {
364*35238bceSAndroid Build Coastguard Worker     case DISCARDMODE_ALWAYS:
365*35238bceSAndroid Build Coastguard Worker         return "Always discard";
366*35238bceSAndroid Build Coastguard Worker     case DISCARDMODE_NEVER:
367*35238bceSAndroid Build Coastguard Worker         return "Never discard";
368*35238bceSAndroid Build Coastguard Worker     case DISCARDMODE_UNIFORM:
369*35238bceSAndroid Build Coastguard Worker         return "Discard based on uniform value";
370*35238bceSAndroid Build Coastguard Worker     case DISCARDMODE_DYNAMIC:
371*35238bceSAndroid Build Coastguard Worker         return "Discard based on varying values";
372*35238bceSAndroid Build Coastguard Worker     case DISCARDMODE_TEXTURE:
373*35238bceSAndroid Build Coastguard Worker         return "Discard based on texture value";
374*35238bceSAndroid Build Coastguard Worker     default:
375*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
376*35238bceSAndroid Build Coastguard Worker         return DE_NULL;
377*35238bceSAndroid Build Coastguard Worker     }
378*35238bceSAndroid Build Coastguard Worker }
379*35238bceSAndroid Build Coastguard Worker 
makeDiscardCase(Context & context,DiscardTemplate tmpl,DiscardMode mode)380*35238bceSAndroid Build Coastguard Worker ShaderDiscardCase *makeDiscardCase(Context &context, DiscardTemplate tmpl, DiscardMode mode)
381*35238bceSAndroid Build Coastguard Worker {
382*35238bceSAndroid Build Coastguard Worker     StringTemplate shaderTemplate(getTemplate(tmpl));
383*35238bceSAndroid Build Coastguard Worker 
384*35238bceSAndroid Build Coastguard Worker     map<string, string> params;
385*35238bceSAndroid Build Coastguard Worker 
386*35238bceSAndroid Build Coastguard Worker     switch (mode)
387*35238bceSAndroid Build Coastguard Worker     {
388*35238bceSAndroid Build Coastguard Worker     case DISCARDMODE_ALWAYS:
389*35238bceSAndroid Build Coastguard Worker         params["DISCARD"] = "discard";
390*35238bceSAndroid Build Coastguard Worker         break;
391*35238bceSAndroid Build Coastguard Worker     case DISCARDMODE_NEVER:
392*35238bceSAndroid Build Coastguard Worker         params["DISCARD"] = "if (false) discard";
393*35238bceSAndroid Build Coastguard Worker         break;
394*35238bceSAndroid Build Coastguard Worker     case DISCARDMODE_UNIFORM:
395*35238bceSAndroid Build Coastguard Worker         params["DISCARD"] = "if (ui_one > 0) discard";
396*35238bceSAndroid Build Coastguard Worker         break;
397*35238bceSAndroid Build Coastguard Worker     case DISCARDMODE_DYNAMIC:
398*35238bceSAndroid Build Coastguard Worker         params["DISCARD"] = "if (v_coords.x+v_coords.y > 0.0) discard";
399*35238bceSAndroid Build Coastguard Worker         break;
400*35238bceSAndroid Build Coastguard Worker     case DISCARDMODE_TEXTURE:
401*35238bceSAndroid Build Coastguard Worker         params["DISCARD"] = "if (texture2D(ut_brick, v_coords.xy*0.25+0.5).x < 0.7) discard";
402*35238bceSAndroid Build Coastguard Worker         break;
403*35238bceSAndroid Build Coastguard Worker     default:
404*35238bceSAndroid Build Coastguard Worker         DE_ASSERT(false);
405*35238bceSAndroid Build Coastguard Worker         break;
406*35238bceSAndroid Build Coastguard Worker     }
407*35238bceSAndroid Build Coastguard Worker 
408*35238bceSAndroid Build Coastguard Worker     string name        = string(getTemplateName(tmpl)) + "_" + getModeName(mode);
409*35238bceSAndroid Build Coastguard Worker     string description = string(getModeDesc(mode)) + " in " + getTemplateDesc(tmpl);
410*35238bceSAndroid Build Coastguard Worker     uint32_t flags     = (mode == DISCARDMODE_TEXTURE ? FLAG_USES_TEXTURES : 0) |
411*35238bceSAndroid Build Coastguard Worker                      (tmpl == DISCARDTEMPLATE_MAIN_DYNAMIC_LOOP ? FLAG_REQUIRES_DYNAMIC_LOOPS : 0);
412*35238bceSAndroid Build Coastguard Worker 
413*35238bceSAndroid Build Coastguard Worker     return new ShaderDiscardCase(context, name.c_str(), description.c_str(), shaderTemplate.specialize(params).c_str(),
414*35238bceSAndroid Build Coastguard Worker                                  getEvalFunc(mode), flags);
415*35238bceSAndroid Build Coastguard Worker }
416*35238bceSAndroid Build Coastguard Worker 
init(void)417*35238bceSAndroid Build Coastguard Worker void ShaderDiscardTests::init(void)
418*35238bceSAndroid Build Coastguard Worker {
419*35238bceSAndroid Build Coastguard Worker     for (int tmpl = 0; tmpl < DISCARDTEMPLATE_LAST; tmpl++)
420*35238bceSAndroid Build Coastguard Worker         for (int mode = 0; mode < DISCARDMODE_LAST; mode++)
421*35238bceSAndroid Build Coastguard Worker             addChild(makeDiscardCase(m_context, (DiscardTemplate)tmpl, (DiscardMode)mode));
422*35238bceSAndroid Build Coastguard Worker }
423*35238bceSAndroid Build Coastguard Worker 
424*35238bceSAndroid Build Coastguard Worker } // namespace Functional
425*35238bceSAndroid Build Coastguard Worker } // namespace gles2
426*35238bceSAndroid Build Coastguard Worker } // namespace deqp
427