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