Merge "Fix color change verification in dithering tests" into nougat-cts-dev am:...
[platform/upstream/VK-GL-CTS.git] / modules / gles3 / functional / es3fRasterizerDiscardTests.cpp
1 /*-------------------------------------------------------------------------
2  * drawElements Quality Program OpenGL ES 3.0 Module
3  * -------------------------------------------------
4  *
5  * Copyright 2014 The Android Open Source Project
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  *//*!
20  * \file
21  * \brief Rasterizer discard tests.
22  *//*--------------------------------------------------------------------*/
23
24 #include "es3fRasterizerDiscardTests.hpp"
25
26 #include "tcuTestLog.hpp"
27 #include "tcuVector.hpp"
28 #include "tcuSurface.hpp"
29 #include "tcuRenderTarget.hpp"
30 #include "gluShaderProgram.hpp"
31 #include "gluPixelTransfer.hpp"
32 #include "deRandom.hpp"
33 #include "deStringUtil.hpp"
34 #include "deString.h"
35
36 #include "glw.h"
37
38 using tcu::Vec4;
39 using tcu::TestLog;
40
41 namespace deqp
42 {
43 namespace gles3
44 {
45 namespace Functional
46 {
47
48 static const int        NUM_CASE_ITERATIONS = 1;
49 static const Vec4       FAIL_COLOR_RED          = Vec4(1.0f, 0.0f, 0.0f, 1.0f);
50 static const Vec4       PASS_COLOR_BLUE         = Vec4(0.0f, 0.0f, 0.5f, 1.0f);
51 static const Vec4       BLACK_COLOR                     = Vec4(0.0f, 0.0f, 0.0f, 1.0f);
52 static const float      FAIL_DEPTH                      = 0.0f;
53 static const int        FAIL_STENCIL            = 1;
54 static const float      UNIT_SQUARE[16] =
55 {
56          1.0f,  1.0f, 0.05f, 1.0f,
57          1.0f, -1.0f, 0.05f, 1.0f,
58         -1.0f,  1.0f, 0.05f, 1.0f,
59         -1.0f, -1.0f, 0.05f, 1.0f
60 };
61
62 enum CaseType
63 {
64         CASE_WRITE_DEPTH,
65         CASE_WRITE_STENCIL,
66         CASE_CLEAR_COLOR,
67         CASE_CLEAR_DEPTH,
68         CASE_CLEAR_STENCIL
69 };
70
71 enum CaseOptions
72 {
73         CASEOPTION_FBO          = (1 << 0),
74         CASEOPTION_SCISSOR      = (1 << 1)
75 };
76
77 class RasterizerDiscardCase : public TestCase
78 {
79 public:
80                                                                 RasterizerDiscardCase   (Context& context, const char* name, const char* description, int numPrimitives, CaseType caseType, deUint32 caseOptions, deUint32 drawMode = GL_TRIANGLES);
81                                                                 ~RasterizerDiscardCase  (void);
82
83         void                                            init                                    (void);
84         void                                            deinit                                  (void);
85         IterateResult                           iterate                                 (void);
86
87 private:
88                                                                 RasterizerDiscardCase   (const RasterizerDiscardCase& other);
89         RasterizerDiscardCase&          operator=                               (const RasterizerDiscardCase& other);
90
91         void                                            setupFramebufferObject  (void);
92         void                                            deleteFramebufferObject (void);
93
94         int                                                     m_numPrimitives;
95         CaseType                                        m_caseType;
96         deUint32                                        m_caseOptions;
97         deUint32                                        m_drawMode;
98
99         glu::ShaderProgram*                     m_program;
100         deUint32                                        m_fbo;
101         deUint32                                        m_colorBuf;
102         deUint32                                        m_depthStencilBuf;
103         int                                                     m_iterNdx;
104         de::Random                                      m_rnd;
105 };
106
107 RasterizerDiscardCase::RasterizerDiscardCase (Context& context, const char* name, const char* description, int numPrimitives, CaseType caseType, deUint32 caseOptions, deUint32 drawMode)
108         : TestCase                              (context, name, description)
109         , m_numPrimitives               (numPrimitives)
110         , m_caseType                    (caseType)
111         , m_caseOptions                 (caseOptions)
112         , m_drawMode                    (drawMode)
113         , m_program                             (DE_NULL)
114         , m_fbo                                 (0)
115         , m_colorBuf                    (0)
116         , m_depthStencilBuf             (0)
117         , m_iterNdx                             (0)
118         , m_rnd                                 (deStringHash(name))
119 {
120 }
121
122 RasterizerDiscardCase::~RasterizerDiscardCase (void)
123 {
124         RasterizerDiscardCase::deinit();
125 }
126
127 static void generateVertices (std::vector<float>& dst, int numPrimitives, de::Random& rnd, deUint32 drawMode)
128 {
129         int numVertices;
130
131         switch (drawMode)
132         {
133                 case GL_POINTS:                 numVertices = numPrimitives;    break;
134                 case GL_LINES:                  numVertices = 2*numPrimitives;  break;
135                 case GL_LINE_STRIP:             numVertices = numPrimitives+1;  break;
136                 case GL_LINE_LOOP:              numVertices = numPrimitives+2;  break;
137                 case GL_TRIANGLES:              numVertices = 3*numPrimitives;  break;
138                 case GL_TRIANGLE_STRIP: numVertices = numPrimitives+2;  break;
139                 case GL_TRIANGLE_FAN:   numVertices = numPrimitives+2;  break;
140                 default:
141                         DE_ASSERT(false);
142                         numVertices = 0;
143         }
144
145         dst.resize(numVertices * 4);
146
147         for (int i = 0; i < numVertices; i++)
148         {
149                 dst[i*4    ] = rnd.getFloat(-1.0f, 1.0f);       // x
150                 dst[i*4 + 1] = rnd.getFloat(-1.0f, 1.0f);       // y
151                 dst[i*4 + 2] = rnd.getFloat( 0.1f, 0.9f);       // z
152                 dst[i*4 + 3] = 1.0f;                                            // w
153         }
154 }
155
156 void RasterizerDiscardCase::setupFramebufferObject (void)
157 {
158         int width  = m_context.getRenderTarget().getWidth();
159         int height = m_context.getRenderTarget().getHeight();
160
161         // Create framebuffer object
162
163         glGenFramebuffers       (1, &m_fbo);                            // FBO
164         glGenTextures           (1, &m_colorBuf);                       // Color attachment
165         glGenRenderbuffers      (1, &m_depthStencilBuf);        // Depth and stencil attachments
166
167         // Create color texture
168
169         glBindTexture   (GL_TEXTURE_2D, m_colorBuf);
170         glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,              GL_CLAMP_TO_EDGE);
171         glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,              GL_CLAMP_TO_EDGE);
172         glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,  GL_LINEAR);
173         glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,  GL_LINEAR);
174         glTexImage2D    (GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
175
176         // Create depth and stencil buffers
177
178         glBindRenderbuffer        (GL_RENDERBUFFER, m_depthStencilBuf);
179         glRenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);
180
181         // Attach texture and buffers to FBO
182
183         glBindFramebuffer                 (GL_FRAMEBUFFER, m_fbo);
184         glFramebufferTexture2D    (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_colorBuf, 0);
185         glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthStencilBuf);
186         glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_depthStencilBuf);
187
188         deUint32 fboStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER);
189
190         if (fboStatus == GL_FRAMEBUFFER_UNSUPPORTED)
191                 throw tcu::NotSupportedError("Framebuffer unsupported", "", __FILE__, __LINE__);
192         else if (fboStatus != GL_FRAMEBUFFER_COMPLETE)
193                 throw tcu::TestError("Failed to create framebuffer object", "", __FILE__, __LINE__);
194 }
195
196 void RasterizerDiscardCase::deleteFramebufferObject (void)
197 {
198         glDeleteTextures                (1, &m_colorBuf);                       // Color attachment
199         glDeleteRenderbuffers   (1, &m_depthStencilBuf);        // Depth and stencil attachments
200         glDeleteFramebuffers    (1, &m_fbo);                            // FBO
201 }
202
203 void RasterizerDiscardCase::init (void)
204 {
205         const char*     vertShaderSource =
206                                 "#version 300 es\n"
207                                 "layout(location = 0) in mediump vec4 a_position;\n"
208                                 "\n"
209                                 "void main (void)\n"
210                                 "{\n"
211                                 "       gl_Position = a_position;\n"
212                                 "}\n";
213
214         const char* fragShaderSource =
215                                 "#version 300 es\n"
216                                 "layout(location = 0) out mediump vec4 dEQP_FragColor;\n"
217                                 "uniform mediump vec4 u_color;\n"
218                                 "\n"
219                                 "void main (void)\n"
220                                 "{\n"
221                                 "       mediump float depth_gradient = gl_FragCoord.z;\n"
222                                 "       mediump float bias = 0.1;\n"
223                                 "       dEQP_FragColor = vec4(u_color.xyz * (depth_gradient + bias), 1.0);\n"
224                                 "}\n";
225
226         DE_ASSERT(!m_program);
227         m_program = new glu::ShaderProgram(m_context.getRenderContext(), glu::makeVtxFragSources(vertShaderSource, fragShaderSource));
228
229         if (!m_program->isOk())
230         {
231                 m_testCtx.getLog() << *m_program;
232                 TCU_FAIL("Failed to compile shader program");
233         }
234
235         m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); // Initialize test result to pass.
236         GLU_CHECK_MSG ("Case initialization finished");
237 }
238
239 void RasterizerDiscardCase::deinit (void)
240 {
241         deleteFramebufferObject();
242         delete m_program;
243         m_program = DE_NULL;
244 }
245
246 RasterizerDiscardCase::IterateResult RasterizerDiscardCase::iterate (void)
247 {
248         TestLog&                                        log                             = m_testCtx.getLog();
249         const tcu::RenderTarget&        renderTarget    = m_context.getRenderTarget();
250         deUint32                                        colorUnif               = glGetUniformLocation(m_program->getProgram(), "u_color");
251         bool                                            failColorFound  = false;
252         bool                                            passColorFound  = false;
253         std::vector<float>                      vertices;
254
255         std::string header = "Case iteration " + de::toString(m_iterNdx+1) + " / " + de::toString(NUM_CASE_ITERATIONS);
256         log << TestLog::Section(header, header);
257
258         DE_ASSERT (m_program);
259
260         // Create and bind FBO if needed
261
262         if (m_caseOptions & CASEOPTION_FBO)
263         {
264                 try
265                 {
266                         setupFramebufferObject();
267                 }
268                 catch (tcu::NotSupportedError& e)
269                 {
270                         log << TestLog::Message << "ERROR: " << e.what() << "." << TestLog::EndMessage << TestLog::EndSection;
271                         m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not supported");
272                         return STOP;
273                 }
274                 catch (tcu::InternalError& e)
275                 {
276                         log << TestLog::Message << "ERROR: " << e.what() << "." << TestLog::EndMessage << TestLog::EndSection;
277                         m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Error");
278                         return STOP;
279                 }
280         }
281
282         if (m_caseOptions & CASEOPTION_SCISSOR)
283         {
284                 glEnable (GL_SCISSOR_TEST);
285                 glScissor(0, 0, renderTarget.getWidth(), renderTarget.getHeight());
286                 log << TestLog::Message << "Scissor test enabled: glScissor(0, 0, " << renderTarget.getWidth() << ", " << renderTarget.getHeight() << ")" << TestLog::EndMessage;
287         }
288
289         glUseProgram    (m_program->getProgram());
290
291         glEnable                (GL_DEPTH_TEST);
292         glDepthRangef   (0.0f, 1.0f);
293         glDepthFunc             (GL_LEQUAL);
294
295         glEnable                (GL_STENCIL_TEST);
296         glStencilFunc   (GL_NOTEQUAL, 1, 0xFF);
297         glStencilOp             (GL_REPLACE, GL_KEEP, GL_KEEP);
298
299         glClearColor    (PASS_COLOR_BLUE.x(), PASS_COLOR_BLUE.y(), PASS_COLOR_BLUE.z(), PASS_COLOR_BLUE.w());
300         glClearDepthf   (1.0f);
301         glClearStencil  (0);
302         glClear                 (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
303
304         // Generate vertices
305
306         glEnableVertexAttribArray (0);
307         generateVertices                  (vertices, m_numPrimitives, m_rnd, m_drawMode);
308         glVertexAttribPointer     (0, 4, GL_FLOAT, GL_FALSE, 0, &vertices[0]);
309
310         // Clear color to black for depth and stencil clear cases
311
312         if (m_caseType == CASE_CLEAR_DEPTH || m_caseType == CASE_CLEAR_STENCIL)
313         {
314                 glClearColor    (BLACK_COLOR.x(), BLACK_COLOR.y(), BLACK_COLOR.z(), BLACK_COLOR.w());
315                 glClear                 (GL_COLOR_BUFFER_BIT);
316         }
317
318         // Set fail values for color, depth and stencil
319
320         glUniform4f             (colorUnif, FAIL_COLOR_RED.x(), FAIL_COLOR_RED.y(), FAIL_COLOR_RED.z(), FAIL_COLOR_RED.w());
321         glClearColor    (FAIL_COLOR_RED.x(), FAIL_COLOR_RED.y(), FAIL_COLOR_RED.z(), FAIL_COLOR_RED.w());
322         glClearDepthf   (FAIL_DEPTH);
323         glClearStencil  (FAIL_STENCIL);
324
325         // Enable rasterizer discard
326
327         glEnable                (GL_RASTERIZER_DISCARD);
328         GLU_CHECK_MSG   ("Rasterizer discard enabled");
329
330         // Do to-be-discarded primitive draws and buffer clears
331
332         switch (m_caseType)
333         {
334                 case CASE_WRITE_DEPTH:                  glDrawArrays(m_drawMode, 0, (int)vertices.size() / 4);                                                                                                                                  break;
335                 case CASE_WRITE_STENCIL:                glDrawArrays(m_drawMode, 0, (int)vertices.size() / 4);                                                                                                                                  break;
336                 case CASE_CLEAR_COLOR:                  (m_caseOptions & CASEOPTION_FBO) ? glClearBufferfv(GL_COLOR, 0, &FAIL_COLOR_RED[0])     : glClear(GL_COLOR_BUFFER_BIT);         break;
337                 case CASE_CLEAR_DEPTH:                  (m_caseOptions & CASEOPTION_FBO) ? glClearBufferfv(GL_DEPTH, 0, &FAIL_DEPTH)            : glClear(GL_DEPTH_BUFFER_BIT);         break;
338                 case CASE_CLEAR_STENCIL:                (m_caseOptions & CASEOPTION_FBO) ? glClearBufferiv(GL_STENCIL, 0, &FAIL_STENCIL)        : glClear(GL_STENCIL_BUFFER_BIT);       break;
339                 default:                                                DE_ASSERT(false);
340         }
341
342         // Disable rasterizer discard
343
344         glDisable               (GL_RASTERIZER_DISCARD);
345         GLU_CHECK_MSG   ("Rasterizer discard disabled");
346
347         if (m_caseType == CASE_WRITE_STENCIL)
348         {
349                 if ((m_caseOptions & CASEOPTION_FBO) || m_context.getRenderTarget().getStencilBits() > 0)
350                 {
351                         // Draw a full-screen square that colors all pixels red if they have stencil value 1.
352
353                         glVertexAttribPointer (0, 4, GL_FLOAT, GL_FALSE, 0, &UNIT_SQUARE[0]);
354                         glStencilFunc             (GL_EQUAL, 1, 0xFF);
355                         glDrawArrays              (GL_TRIANGLE_STRIP, 0, 4);
356                 }
357                 // \note If no stencil buffers are present and test is rendering to default framebuffer, test will always pass.
358         }
359         else if (m_caseType == CASE_CLEAR_DEPTH || m_caseType == CASE_CLEAR_STENCIL)
360         {
361                 // Draw pass-indicating primitives for depth and stencil clear cases
362
363                 glUniform4f      (colorUnif, PASS_COLOR_BLUE.x(), PASS_COLOR_BLUE.y(), PASS_COLOR_BLUE.z(), PASS_COLOR_BLUE.w());
364                 glDrawArrays (m_drawMode, 0, (int)vertices.size() / 4);
365         }
366
367         glFinish  ();
368         glDisable (GL_STENCIL_TEST);
369         glDisable (GL_DEPTH_TEST);
370         glDisable (GL_SCISSOR_TEST);
371
372         // Read and check pixel data
373
374         tcu::Surface pixels(renderTarget.getWidth(), renderTarget.getHeight());
375         glu::readPixels(m_context.getRenderContext(), 0, 0, pixels.getAccess());
376
377         {
378                 int width = pixels.getWidth();
379                 int height = pixels.getHeight();
380
381                 for (int y = 0; y < height; y++)
382                 {
383                         for (int x = 0; x < width; x++)
384                         {
385                                 if (pixels.getPixel(x,y).getBlue() != 0)
386                                         passColorFound = true;
387
388                                 if (pixels.getPixel(x,y).getRed() != 0)
389                                 {
390                                         failColorFound = true;
391                                         break;
392                                 }
393                         }
394                         if (failColorFound) break;
395                 }
396         }
397
398         // Delete FBO if created
399
400         if (m_caseOptions & CASEOPTION_FBO)
401                 deleteFramebufferObject();
402
403         // Evaluate test result
404
405         bool testOk = passColorFound && !failColorFound;
406
407         if (!testOk)
408                 log << TestLog::Image ("Result image", "Result image", pixels);
409         log << TestLog::Message << "Test result: " << (testOk ? "Passed!" : "Failed!") << TestLog::EndMessage;
410
411         if (!testOk)
412         {
413                 log << TestLog::Message << "Primitive or buffer clear was not discarded." << TestLog::EndMessage << TestLog::EndSection;
414                 m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
415                 return STOP;
416         }
417
418         log << TestLog::Message << "Primitive or buffer clear was discarded correctly." << TestLog::EndMessage << TestLog::EndSection;
419
420         return (++m_iterNdx < NUM_CASE_ITERATIONS) ? CONTINUE : STOP;
421 }
422
423 RasterizerDiscardTests::RasterizerDiscardTests (Context& context)
424         : TestCaseGroup(context, "rasterizer_discard", "Rasterizer Discard Tests")
425 {
426 }
427
428 RasterizerDiscardTests::~RasterizerDiscardTests (void)
429 {
430 }
431
432 void RasterizerDiscardTests::init (void)
433 {
434         tcu::TestCaseGroup* basic       = new tcu::TestCaseGroup(m_testCtx, "basic",    "Rasterizer discard test for default framebuffer");
435         tcu::TestCaseGroup*     scissor = new tcu::TestCaseGroup(m_testCtx, "scissor",  "Rasterizer discard test for default framebuffer with scissor test enabled");
436         tcu::TestCaseGroup*     fbo             = new tcu::TestCaseGroup(m_testCtx, "fbo",              "Rasterizer discard test for framebuffer object");
437
438         addChild(basic);
439         addChild(scissor);
440         addChild(fbo);
441
442         // Default framebuffer cases
443
444         basic->addChild(new RasterizerDiscardCase(m_context, "write_depth_points",                              "points",                       4, CASE_WRITE_DEPTH,    0, GL_POINTS));
445         basic->addChild(new RasterizerDiscardCase(m_context, "write_depth_lines",                               "lines",                        4, CASE_WRITE_DEPTH,    0, GL_LINES));
446         basic->addChild(new RasterizerDiscardCase(m_context, "write_depth_line_strip",                  "line_strip",           4, CASE_WRITE_DEPTH,    0, GL_LINE_STRIP));
447         basic->addChild(new RasterizerDiscardCase(m_context, "write_depth_line_loop",                   "line_loop",            4, CASE_WRITE_DEPTH,    0, GL_LINE_LOOP));
448         basic->addChild(new RasterizerDiscardCase(m_context, "write_depth_triangles",                   "triangles",            4, CASE_WRITE_DEPTH,    0, GL_TRIANGLES));
449         basic->addChild(new RasterizerDiscardCase(m_context, "write_depth_triangle_strip",              "triangle_strip",       4, CASE_WRITE_DEPTH,    0, GL_TRIANGLE_STRIP));
450         basic->addChild(new RasterizerDiscardCase(m_context, "write_depth_triangle_fan",                "triangle_fan",         4, CASE_WRITE_DEPTH,    0, GL_TRIANGLE_FAN));
451
452         basic->addChild(new RasterizerDiscardCase(m_context, "write_stencil_points",                    "points",                       4, CASE_WRITE_STENCIL,  0, GL_POINTS));
453         basic->addChild(new RasterizerDiscardCase(m_context, "write_stencil_lines",                             "lines",                        4, CASE_WRITE_STENCIL,  0, GL_LINES));
454         basic->addChild(new RasterizerDiscardCase(m_context, "write_stencil_line_strip",                "line_strip",           4, CASE_WRITE_STENCIL,  0, GL_LINE_STRIP));
455         basic->addChild(new RasterizerDiscardCase(m_context, "write_stencil_line_loop",                 "line_loop",            4, CASE_WRITE_STENCIL,  0, GL_LINE_LOOP));
456         basic->addChild(new RasterizerDiscardCase(m_context, "write_stencil_triangles",                 "triangles",            4, CASE_WRITE_STENCIL,  0, GL_TRIANGLES));
457         basic->addChild(new RasterizerDiscardCase(m_context, "write_stencil_triangle_strip",    "triangle_strip",       4, CASE_WRITE_STENCIL,  0, GL_TRIANGLE_STRIP));
458         basic->addChild(new RasterizerDiscardCase(m_context, "write_stencil_triangle_fan",              "triangle_fan",         4, CASE_WRITE_STENCIL,  0, GL_TRIANGLE_FAN));
459
460         basic->addChild(new RasterizerDiscardCase(m_context, "clear_color",                                             "clear_color",          4, CASE_CLEAR_COLOR,    0));
461         basic->addChild(new RasterizerDiscardCase(m_context, "clear_depth",                                             "clear_depth",          4, CASE_CLEAR_DEPTH,    0));
462         basic->addChild(new RasterizerDiscardCase(m_context, "clear_stencil",                                   "clear_stencil",        4, CASE_CLEAR_STENCIL,  0));
463
464         // Default framebuffer cases with scissor test enabled
465
466         scissor->addChild(new RasterizerDiscardCase(m_context, "write_depth_points",                    "points",                       4, CASE_WRITE_DEPTH,    CASEOPTION_SCISSOR, GL_POINTS));
467         scissor->addChild(new RasterizerDiscardCase(m_context, "write_depth_lines",                             "lines",                        4, CASE_WRITE_DEPTH,    CASEOPTION_SCISSOR, GL_LINES));
468         scissor->addChild(new RasterizerDiscardCase(m_context, "write_depth_line_strip",                "line_strip",           4, CASE_WRITE_DEPTH,    CASEOPTION_SCISSOR, GL_LINE_STRIP));
469         scissor->addChild(new RasterizerDiscardCase(m_context, "write_depth_line_loop",                 "line_loop",            4, CASE_WRITE_DEPTH,    CASEOPTION_SCISSOR, GL_LINE_LOOP));
470         scissor->addChild(new RasterizerDiscardCase(m_context, "write_depth_triangles",                 "triangles",            4, CASE_WRITE_DEPTH,    CASEOPTION_SCISSOR, GL_TRIANGLES));
471         scissor->addChild(new RasterizerDiscardCase(m_context, "write_depth_triangle_strip",    "triangle_strip",       4, CASE_WRITE_DEPTH,    CASEOPTION_SCISSOR, GL_TRIANGLE_STRIP));
472         scissor->addChild(new RasterizerDiscardCase(m_context, "write_depth_triangle_fan",              "triangle_fan",         4, CASE_WRITE_DEPTH,    CASEOPTION_SCISSOR, GL_TRIANGLE_FAN));
473
474         scissor->addChild(new RasterizerDiscardCase(m_context, "write_stencil_points",                  "points",                       4, CASE_WRITE_STENCIL,  CASEOPTION_SCISSOR, GL_POINTS));
475         scissor->addChild(new RasterizerDiscardCase(m_context, "write_stencil_lines",                   "lines",                        4, CASE_WRITE_STENCIL,  CASEOPTION_SCISSOR, GL_LINES));
476         scissor->addChild(new RasterizerDiscardCase(m_context, "write_stencil_line_strip",              "line_strip",           4, CASE_WRITE_STENCIL,  CASEOPTION_SCISSOR, GL_LINE_STRIP));
477         scissor->addChild(new RasterizerDiscardCase(m_context, "write_stencil_line_loop",               "line_loop",            4, CASE_WRITE_STENCIL,  CASEOPTION_SCISSOR, GL_LINE_LOOP));
478         scissor->addChild(new RasterizerDiscardCase(m_context, "write_stencil_triangles",               "triangles",            4, CASE_WRITE_STENCIL,  CASEOPTION_SCISSOR, GL_TRIANGLES));
479         scissor->addChild(new RasterizerDiscardCase(m_context, "write_stencil_triangle_strip",  "triangle_strip",       4, CASE_WRITE_STENCIL,  CASEOPTION_SCISSOR, GL_TRIANGLE_STRIP));
480         scissor->addChild(new RasterizerDiscardCase(m_context, "write_stencil_triangle_fan",    "triangle_fan",         4, CASE_WRITE_STENCIL,  CASEOPTION_SCISSOR, GL_TRIANGLE_FAN));
481
482         scissor->addChild(new RasterizerDiscardCase(m_context, "clear_color",                                   "clear_color",          4, CASE_CLEAR_COLOR,    CASEOPTION_SCISSOR));
483         scissor->addChild(new RasterizerDiscardCase(m_context, "clear_depth",                                   "clear_depth",          4, CASE_CLEAR_DEPTH,    CASEOPTION_SCISSOR));
484         scissor->addChild(new RasterizerDiscardCase(m_context, "clear_stencil",                                 "clear_stencil",        4, CASE_CLEAR_STENCIL,  CASEOPTION_SCISSOR));
485
486         // FBO cases
487
488         fbo->addChild(new RasterizerDiscardCase(m_context, "write_depth_points",                        "points",                       4, CASE_WRITE_DEPTH,    CASEOPTION_FBO, GL_POINTS));
489         fbo->addChild(new RasterizerDiscardCase(m_context, "write_depth_lines",                         "lines",                        4, CASE_WRITE_DEPTH,    CASEOPTION_FBO, GL_LINES));
490         fbo->addChild(new RasterizerDiscardCase(m_context, "write_depth_line_strip",            "line_strip",           4, CASE_WRITE_DEPTH,    CASEOPTION_FBO, GL_LINE_STRIP));
491         fbo->addChild(new RasterizerDiscardCase(m_context, "write_depth_line_loop",                     "line_loop",            4, CASE_WRITE_DEPTH,    CASEOPTION_FBO, GL_LINE_LOOP));
492         fbo->addChild(new RasterizerDiscardCase(m_context, "write_depth_triangles",                     "triangles",            4, CASE_WRITE_DEPTH,    CASEOPTION_FBO, GL_TRIANGLES));
493         fbo->addChild(new RasterizerDiscardCase(m_context, "write_depth_triangle_strip",        "triangle_strip",       4, CASE_WRITE_DEPTH,    CASEOPTION_FBO, GL_TRIANGLE_STRIP));
494         fbo->addChild(new RasterizerDiscardCase(m_context, "write_depth_triangle_fan",          "triangle_fan",         4, CASE_WRITE_DEPTH,    CASEOPTION_FBO, GL_TRIANGLE_FAN));
495
496         fbo->addChild(new RasterizerDiscardCase(m_context, "write_stencil_points",                      "points",                       4, CASE_WRITE_STENCIL,  CASEOPTION_FBO, GL_POINTS));
497         fbo->addChild(new RasterizerDiscardCase(m_context, "write_stencil_lines",                       "lines",                        4, CASE_WRITE_STENCIL,  CASEOPTION_FBO, GL_LINES));
498         fbo->addChild(new RasterizerDiscardCase(m_context, "write_stencil_line_strip",          "line_strip",           4, CASE_WRITE_STENCIL,  CASEOPTION_FBO, GL_LINE_STRIP));
499         fbo->addChild(new RasterizerDiscardCase(m_context, "write_stencil_line_loop",           "line_loop",            4, CASE_WRITE_STENCIL,  CASEOPTION_FBO, GL_LINE_LOOP));
500         fbo->addChild(new RasterizerDiscardCase(m_context, "write_stencil_triangles",           "triangles",            4, CASE_WRITE_STENCIL,  CASEOPTION_FBO, GL_TRIANGLES));
501         fbo->addChild(new RasterizerDiscardCase(m_context, "write_stencil_triangle_strip",      "triangle_strip",       4, CASE_WRITE_STENCIL,  CASEOPTION_FBO, GL_TRIANGLE_STRIP));
502         fbo->addChild(new RasterizerDiscardCase(m_context, "write_stencil_triangle_fan",        "triangle_fan",         4, CASE_WRITE_STENCIL,  CASEOPTION_FBO, GL_TRIANGLE_FAN));
503
504         fbo->addChild(new RasterizerDiscardCase(m_context, "clear_color",                                       "clear_color",          4, CASE_CLEAR_COLOR,    CASEOPTION_FBO));
505         fbo->addChild(new RasterizerDiscardCase(m_context, "clear_depth",                                       "clear_depth",          4, CASE_CLEAR_DEPTH,    CASEOPTION_FBO));
506         fbo->addChild(new RasterizerDiscardCase(m_context, "clear_stencil",                                     "clear_stencil",        4, CASE_CLEAR_STENCIL,  CASEOPTION_FBO));
507 }
508
509 } // Functional
510 } // gles3
511 } // deqp