xref: /aosp_15_r20/external/deqp/modules/gles3/functional/es3fRasterizerDiscardTests.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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::TestLog;
39 using tcu::Vec4;
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]   = {1.0f,  1.0f, 0.05f, 1.0f, 1.0f,  -1.0f, 0.05f, 1.0f,
55                                         -1.0f, 1.0f, 0.05f, 1.0f, -1.0f, -1.0f, 0.05f, 1.0f};
56 
57 enum CaseType
58 {
59     CASE_WRITE_DEPTH,
60     CASE_WRITE_STENCIL,
61     CASE_CLEAR_COLOR,
62     CASE_CLEAR_DEPTH,
63     CASE_CLEAR_STENCIL
64 };
65 
66 enum CaseOptions
67 {
68     CASEOPTION_FBO     = (1 << 0),
69     CASEOPTION_SCISSOR = (1 << 1)
70 };
71 
72 class RasterizerDiscardCase : public TestCase
73 {
74 public:
75     RasterizerDiscardCase(Context &context, const char *name, const char *description, int numPrimitives,
76                           CaseType caseType, uint32_t caseOptions, uint32_t drawMode = GL_TRIANGLES);
77     ~RasterizerDiscardCase(void);
78 
79     void init(void);
80     void deinit(void);
81     IterateResult iterate(void);
82 
83 private:
84     RasterizerDiscardCase(const RasterizerDiscardCase &other);
85     RasterizerDiscardCase &operator=(const RasterizerDiscardCase &other);
86 
87     void setupFramebufferObject(void);
88     void deleteFramebufferObject(void);
89 
90     int m_numPrimitives;
91     CaseType m_caseType;
92     uint32_t m_caseOptions;
93     uint32_t m_drawMode;
94 
95     glu::ShaderProgram *m_program;
96     uint32_t m_fbo;
97     uint32_t m_colorBuf;
98     uint32_t m_depthStencilBuf;
99     int m_iterNdx;
100     de::Random m_rnd;
101 };
102 
RasterizerDiscardCase(Context & context,const char * name,const char * description,int numPrimitives,CaseType caseType,uint32_t caseOptions,uint32_t drawMode)103 RasterizerDiscardCase::RasterizerDiscardCase(Context &context, const char *name, const char *description,
104                                              int numPrimitives, CaseType caseType, uint32_t caseOptions,
105                                              uint32_t drawMode)
106     : TestCase(context, name, description)
107     , m_numPrimitives(numPrimitives)
108     , m_caseType(caseType)
109     , m_caseOptions(caseOptions)
110     , m_drawMode(drawMode)
111     , m_program(DE_NULL)
112     , m_fbo(0)
113     , m_colorBuf(0)
114     , m_depthStencilBuf(0)
115     , m_iterNdx(0)
116     , m_rnd(deStringHash(name))
117 {
118 }
119 
~RasterizerDiscardCase(void)120 RasterizerDiscardCase::~RasterizerDiscardCase(void)
121 {
122     RasterizerDiscardCase::deinit();
123 }
124 
generateVertices(std::vector<float> & dst,int numPrimitives,de::Random & rnd,uint32_t drawMode)125 static void generateVertices(std::vector<float> &dst, int numPrimitives, de::Random &rnd, uint32_t drawMode)
126 {
127     int numVertices;
128 
129     switch (drawMode)
130     {
131     case GL_POINTS:
132         numVertices = numPrimitives;
133         break;
134     case GL_LINES:
135         numVertices = 2 * numPrimitives;
136         break;
137     case GL_LINE_STRIP:
138         numVertices = numPrimitives + 1;
139         break;
140     case GL_LINE_LOOP:
141         numVertices = numPrimitives + 2;
142         break;
143     case GL_TRIANGLES:
144         numVertices = 3 * numPrimitives;
145         break;
146     case GL_TRIANGLE_STRIP:
147         numVertices = numPrimitives + 2;
148         break;
149     case GL_TRIANGLE_FAN:
150         numVertices = numPrimitives + 2;
151         break;
152     default:
153         DE_ASSERT(false);
154         numVertices = 0;
155     }
156 
157     dst.resize(numVertices * 4);
158 
159     for (int i = 0; i < numVertices; i++)
160     {
161         dst[i * 4]     = rnd.getFloat(-1.0f, 1.0f); // x
162         dst[i * 4 + 1] = rnd.getFloat(-1.0f, 1.0f); // y
163         dst[i * 4 + 2] = rnd.getFloat(0.1f, 0.9f);  // z
164         dst[i * 4 + 3] = 1.0f;                      // w
165     }
166 }
167 
setupFramebufferObject(void)168 void RasterizerDiscardCase::setupFramebufferObject(void)
169 {
170     int width  = m_context.getRenderTarget().getWidth();
171     int height = m_context.getRenderTarget().getHeight();
172 
173     // Create framebuffer object
174 
175     glGenFramebuffers(1, &m_fbo);              // FBO
176     glGenTextures(1, &m_colorBuf);             // Color attachment
177     glGenRenderbuffers(1, &m_depthStencilBuf); // Depth and stencil attachments
178 
179     // Create color texture
180 
181     glBindTexture(GL_TEXTURE_2D, m_colorBuf);
182     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
183     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
184     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
185     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
186     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, DE_NULL);
187 
188     // Create depth and stencil buffers
189 
190     glBindRenderbuffer(GL_RENDERBUFFER, m_depthStencilBuf);
191     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);
192 
193     // Attach texture and buffers to FBO
194 
195     glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
196     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_colorBuf, 0);
197     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthStencilBuf);
198     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_depthStencilBuf);
199 
200     uint32_t fboStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER);
201 
202     if (fboStatus == GL_FRAMEBUFFER_UNSUPPORTED)
203         throw tcu::NotSupportedError("Framebuffer unsupported", "", __FILE__, __LINE__);
204     else if (fboStatus != GL_FRAMEBUFFER_COMPLETE)
205         throw tcu::TestError("Failed to create framebuffer object", "", __FILE__, __LINE__);
206 }
207 
deleteFramebufferObject(void)208 void RasterizerDiscardCase::deleteFramebufferObject(void)
209 {
210     glDeleteTextures(1, &m_colorBuf);             // Color attachment
211     glDeleteRenderbuffers(1, &m_depthStencilBuf); // Depth and stencil attachments
212     glDeleteFramebuffers(1, &m_fbo);              // FBO
213 }
214 
init(void)215 void RasterizerDiscardCase::init(void)
216 {
217     const char *vertShaderSource = "#version 300 es\n"
218                                    "layout(location = 0) in mediump vec4 a_position;\n"
219                                    "\n"
220                                    "void main (void)\n"
221                                    "{\n"
222                                    "    gl_Position = a_position;\n"
223                                    "}\n";
224 
225     const char *fragShaderSource = "#version 300 es\n"
226                                    "layout(location = 0) out mediump vec4 dEQP_FragColor;\n"
227                                    "uniform mediump vec4 u_color;\n"
228                                    "\n"
229                                    "void main (void)\n"
230                                    "{\n"
231                                    "    mediump float depth_gradient = gl_FragCoord.z;\n"
232                                    "    mediump float bias = 0.1;\n"
233                                    "    dEQP_FragColor = vec4(u_color.xyz * (depth_gradient + bias), 1.0);\n"
234                                    "}\n";
235 
236     DE_ASSERT(!m_program);
237     m_program = new glu::ShaderProgram(m_context.getRenderContext(),
238                                        glu::makeVtxFragSources(vertShaderSource, fragShaderSource));
239 
240     if (!m_program->isOk())
241     {
242         m_testCtx.getLog() << *m_program;
243         TCU_FAIL("Failed to compile shader program");
244     }
245 
246     m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass"); // Initialize test result to pass.
247     GLU_CHECK_MSG("Case initialization finished");
248 }
249 
deinit(void)250 void RasterizerDiscardCase::deinit(void)
251 {
252     deleteFramebufferObject();
253     delete m_program;
254     m_program = DE_NULL;
255 }
256 
iterate(void)257 RasterizerDiscardCase::IterateResult RasterizerDiscardCase::iterate(void)
258 {
259     TestLog &log                          = m_testCtx.getLog();
260     const tcu::RenderTarget &renderTarget = m_context.getRenderTarget();
261     uint32_t colorUnif                    = glGetUniformLocation(m_program->getProgram(), "u_color");
262     bool failColorFound                   = false;
263     bool passColorFound                   = false;
264     std::vector<float> vertices;
265 
266     std::string header = "Case iteration " + de::toString(m_iterNdx + 1) + " / " + de::toString(NUM_CASE_ITERATIONS);
267     log << TestLog::Section(header, header);
268 
269     DE_ASSERT(m_program);
270 
271     // Create and bind FBO if needed
272 
273     if (m_caseOptions & CASEOPTION_FBO)
274     {
275         try
276         {
277             setupFramebufferObject();
278         }
279         catch (tcu::NotSupportedError &e)
280         {
281             log << TestLog::Message << "ERROR: " << e.what() << "." << TestLog::EndMessage << TestLog::EndSection;
282             m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Not supported");
283             return STOP;
284         }
285         catch (tcu::InternalError &e)
286         {
287             log << TestLog::Message << "ERROR: " << e.what() << "." << TestLog::EndMessage << TestLog::EndSection;
288             m_testCtx.setTestResult(QP_TEST_RESULT_INTERNAL_ERROR, "Error");
289             return STOP;
290         }
291     }
292 
293     if (m_caseOptions & CASEOPTION_SCISSOR)
294     {
295         glEnable(GL_SCISSOR_TEST);
296         glScissor(0, 0, renderTarget.getWidth(), renderTarget.getHeight());
297         log << TestLog::Message << "Scissor test enabled: glScissor(0, 0, " << renderTarget.getWidth() << ", "
298             << renderTarget.getHeight() << ")" << TestLog::EndMessage;
299     }
300 
301     glUseProgram(m_program->getProgram());
302 
303     glEnable(GL_DEPTH_TEST);
304     glDepthRangef(0.0f, 1.0f);
305     glDepthFunc(GL_LEQUAL);
306 
307     glEnable(GL_STENCIL_TEST);
308     glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
309     glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP);
310 
311     glClearColor(PASS_COLOR_BLUE.x(), PASS_COLOR_BLUE.y(), PASS_COLOR_BLUE.z(), PASS_COLOR_BLUE.w());
312     glClearDepthf(1.0f);
313     glClearStencil(0);
314     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
315 
316     // Generate vertices
317 
318     glEnableVertexAttribArray(0);
319     generateVertices(vertices, m_numPrimitives, m_rnd, m_drawMode);
320     glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, &vertices[0]);
321 
322     // Clear color to black for depth and stencil clear cases
323 
324     if (m_caseType == CASE_CLEAR_DEPTH || m_caseType == CASE_CLEAR_STENCIL)
325     {
326         glClearColor(BLACK_COLOR.x(), BLACK_COLOR.y(), BLACK_COLOR.z(), BLACK_COLOR.w());
327         glClear(GL_COLOR_BUFFER_BIT);
328     }
329 
330     // Set fail values for color, depth and stencil
331 
332     glUniform4f(colorUnif, FAIL_COLOR_RED.x(), FAIL_COLOR_RED.y(), FAIL_COLOR_RED.z(), FAIL_COLOR_RED.w());
333     glClearColor(FAIL_COLOR_RED.x(), FAIL_COLOR_RED.y(), FAIL_COLOR_RED.z(), FAIL_COLOR_RED.w());
334     glClearDepthf(FAIL_DEPTH);
335     glClearStencil(FAIL_STENCIL);
336 
337     // Enable rasterizer discard
338 
339     glEnable(GL_RASTERIZER_DISCARD);
340     GLU_CHECK_MSG("Rasterizer discard enabled");
341 
342     // Do to-be-discarded primitive draws and buffer clears
343 
344     switch (m_caseType)
345     {
346     case CASE_WRITE_DEPTH:
347         glDrawArrays(m_drawMode, 0, (int)vertices.size() / 4);
348         break;
349     case CASE_WRITE_STENCIL:
350         glDrawArrays(m_drawMode, 0, (int)vertices.size() / 4);
351         break;
352     case CASE_CLEAR_COLOR:
353         (m_caseOptions & CASEOPTION_FBO) ? glClearBufferfv(GL_COLOR, 0, &FAIL_COLOR_RED[0]) :
354                                            glClear(GL_COLOR_BUFFER_BIT);
355         break;
356     case CASE_CLEAR_DEPTH:
357         (m_caseOptions & CASEOPTION_FBO) ? glClearBufferfv(GL_DEPTH, 0, &FAIL_DEPTH) : glClear(GL_DEPTH_BUFFER_BIT);
358         break;
359     case CASE_CLEAR_STENCIL:
360         (m_caseOptions & CASEOPTION_FBO) ? glClearBufferiv(GL_STENCIL, 0, &FAIL_STENCIL) :
361                                            glClear(GL_STENCIL_BUFFER_BIT);
362         break;
363     default:
364         DE_ASSERT(false);
365     }
366 
367     // Disable rasterizer discard
368 
369     glDisable(GL_RASTERIZER_DISCARD);
370     GLU_CHECK_MSG("Rasterizer discard disabled");
371 
372     if (m_caseType == CASE_WRITE_STENCIL)
373     {
374         if ((m_caseOptions & CASEOPTION_FBO) || m_context.getRenderTarget().getStencilBits() > 0)
375         {
376             // Draw a full-screen square that colors all pixels red if they have stencil value 1.
377 
378             glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, &UNIT_SQUARE[0]);
379             glStencilFunc(GL_EQUAL, 1, 0xFF);
380             glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
381         }
382         // \note If no stencil buffers are present and test is rendering to default framebuffer, test will always pass.
383     }
384     else if (m_caseType == CASE_CLEAR_DEPTH || m_caseType == CASE_CLEAR_STENCIL)
385     {
386         // Draw pass-indicating primitives for depth and stencil clear cases
387 
388         glUniform4f(colorUnif, PASS_COLOR_BLUE.x(), PASS_COLOR_BLUE.y(), PASS_COLOR_BLUE.z(), PASS_COLOR_BLUE.w());
389         glDrawArrays(m_drawMode, 0, (int)vertices.size() / 4);
390     }
391 
392     glFinish();
393     glDisable(GL_STENCIL_TEST);
394     glDisable(GL_DEPTH_TEST);
395     glDisable(GL_SCISSOR_TEST);
396 
397     // Read and check pixel data
398 
399     tcu::Surface pixels(renderTarget.getWidth(), renderTarget.getHeight());
400     glu::readPixels(m_context.getRenderContext(), 0, 0, pixels.getAccess());
401 
402     {
403         int width  = pixels.getWidth();
404         int height = pixels.getHeight();
405 
406         for (int y = 0; y < height; y++)
407         {
408             for (int x = 0; x < width; x++)
409             {
410                 if (pixels.getPixel(x, y).getBlue() != 0)
411                     passColorFound = true;
412 
413                 if (pixels.getPixel(x, y).getRed() != 0)
414                 {
415                     failColorFound = true;
416                     break;
417                 }
418             }
419             if (failColorFound)
420                 break;
421         }
422     }
423 
424     // Delete FBO if created
425 
426     if (m_caseOptions & CASEOPTION_FBO)
427         deleteFramebufferObject();
428 
429     // Evaluate test result
430 
431     bool testOk = passColorFound && !failColorFound;
432 
433     if (!testOk)
434         log << TestLog::Image("Result image", "Result image", pixels);
435     log << TestLog::Message << "Test result: " << (testOk ? "Passed!" : "Failed!") << TestLog::EndMessage;
436 
437     if (!testOk)
438     {
439         log << TestLog::Message << "Primitive or buffer clear was not discarded." << TestLog::EndMessage
440             << TestLog::EndSection;
441         m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");
442         return STOP;
443     }
444 
445     log << TestLog::Message << "Primitive or buffer clear was discarded correctly." << TestLog::EndMessage
446         << TestLog::EndSection;
447 
448     return (++m_iterNdx < NUM_CASE_ITERATIONS) ? CONTINUE : STOP;
449 }
450 
RasterizerDiscardTests(Context & context)451 RasterizerDiscardTests::RasterizerDiscardTests(Context &context)
452     : TestCaseGroup(context, "rasterizer_discard", "Rasterizer Discard Tests")
453 {
454 }
455 
~RasterizerDiscardTests(void)456 RasterizerDiscardTests::~RasterizerDiscardTests(void)
457 {
458 }
459 
init(void)460 void RasterizerDiscardTests::init(void)
461 {
462     tcu::TestCaseGroup *basic =
463         new tcu::TestCaseGroup(m_testCtx, "basic", "Rasterizer discard test for default framebuffer");
464     tcu::TestCaseGroup *scissor = new tcu::TestCaseGroup(
465         m_testCtx, "scissor", "Rasterizer discard test for default framebuffer with scissor test enabled");
466     tcu::TestCaseGroup *fbo =
467         new tcu::TestCaseGroup(m_testCtx, "fbo", "Rasterizer discard test for framebuffer object");
468 
469     addChild(basic);
470     addChild(scissor);
471     addChild(fbo);
472 
473     // Default framebuffer cases
474 
475     basic->addChild(
476         new RasterizerDiscardCase(m_context, "write_depth_points", "points", 4, CASE_WRITE_DEPTH, 0, GL_POINTS));
477     basic->addChild(
478         new RasterizerDiscardCase(m_context, "write_depth_lines", "lines", 4, CASE_WRITE_DEPTH, 0, GL_LINES));
479     basic->addChild(new RasterizerDiscardCase(m_context, "write_depth_line_strip", "line_strip", 4, CASE_WRITE_DEPTH, 0,
480                                               GL_LINE_STRIP));
481     basic->addChild(new RasterizerDiscardCase(m_context, "write_depth_line_loop", "line_loop", 4, CASE_WRITE_DEPTH, 0,
482                                               GL_LINE_LOOP));
483     basic->addChild(new RasterizerDiscardCase(m_context, "write_depth_triangles", "triangles", 4, CASE_WRITE_DEPTH, 0,
484                                               GL_TRIANGLES));
485     basic->addChild(new RasterizerDiscardCase(m_context, "write_depth_triangle_strip", "triangle_strip", 4,
486                                               CASE_WRITE_DEPTH, 0, GL_TRIANGLE_STRIP));
487     basic->addChild(new RasterizerDiscardCase(m_context, "write_depth_triangle_fan", "triangle_fan", 4,
488                                               CASE_WRITE_DEPTH, 0, GL_TRIANGLE_FAN));
489 
490     basic->addChild(
491         new RasterizerDiscardCase(m_context, "write_stencil_points", "points", 4, CASE_WRITE_STENCIL, 0, GL_POINTS));
492     basic->addChild(
493         new RasterizerDiscardCase(m_context, "write_stencil_lines", "lines", 4, CASE_WRITE_STENCIL, 0, GL_LINES));
494     basic->addChild(new RasterizerDiscardCase(m_context, "write_stencil_line_strip", "line_strip", 4,
495                                               CASE_WRITE_STENCIL, 0, GL_LINE_STRIP));
496     basic->addChild(new RasterizerDiscardCase(m_context, "write_stencil_line_loop", "line_loop", 4, CASE_WRITE_STENCIL,
497                                               0, GL_LINE_LOOP));
498     basic->addChild(new RasterizerDiscardCase(m_context, "write_stencil_triangles", "triangles", 4, CASE_WRITE_STENCIL,
499                                               0, GL_TRIANGLES));
500     basic->addChild(new RasterizerDiscardCase(m_context, "write_stencil_triangle_strip", "triangle_strip", 4,
501                                               CASE_WRITE_STENCIL, 0, GL_TRIANGLE_STRIP));
502     basic->addChild(new RasterizerDiscardCase(m_context, "write_stencil_triangle_fan", "triangle_fan", 4,
503                                               CASE_WRITE_STENCIL, 0, GL_TRIANGLE_FAN));
504 
505     basic->addChild(new RasterizerDiscardCase(m_context, "clear_color", "clear_color", 4, CASE_CLEAR_COLOR, 0));
506     basic->addChild(new RasterizerDiscardCase(m_context, "clear_depth", "clear_depth", 4, CASE_CLEAR_DEPTH, 0));
507     basic->addChild(new RasterizerDiscardCase(m_context, "clear_stencil", "clear_stencil", 4, CASE_CLEAR_STENCIL, 0));
508 
509     // Default framebuffer cases with scissor test enabled
510 
511     scissor->addChild(new RasterizerDiscardCase(m_context, "write_depth_points", "points", 4, CASE_WRITE_DEPTH,
512                                                 CASEOPTION_SCISSOR, GL_POINTS));
513     scissor->addChild(new RasterizerDiscardCase(m_context, "write_depth_lines", "lines", 4, CASE_WRITE_DEPTH,
514                                                 CASEOPTION_SCISSOR, GL_LINES));
515     scissor->addChild(new RasterizerDiscardCase(m_context, "write_depth_line_strip", "line_strip", 4, CASE_WRITE_DEPTH,
516                                                 CASEOPTION_SCISSOR, GL_LINE_STRIP));
517     scissor->addChild(new RasterizerDiscardCase(m_context, "write_depth_line_loop", "line_loop", 4, CASE_WRITE_DEPTH,
518                                                 CASEOPTION_SCISSOR, GL_LINE_LOOP));
519     scissor->addChild(new RasterizerDiscardCase(m_context, "write_depth_triangles", "triangles", 4, CASE_WRITE_DEPTH,
520                                                 CASEOPTION_SCISSOR, GL_TRIANGLES));
521     scissor->addChild(new RasterizerDiscardCase(m_context, "write_depth_triangle_strip", "triangle_strip", 4,
522                                                 CASE_WRITE_DEPTH, CASEOPTION_SCISSOR, GL_TRIANGLE_STRIP));
523     scissor->addChild(new RasterizerDiscardCase(m_context, "write_depth_triangle_fan", "triangle_fan", 4,
524                                                 CASE_WRITE_DEPTH, CASEOPTION_SCISSOR, GL_TRIANGLE_FAN));
525 
526     scissor->addChild(new RasterizerDiscardCase(m_context, "write_stencil_points", "points", 4, CASE_WRITE_STENCIL,
527                                                 CASEOPTION_SCISSOR, GL_POINTS));
528     scissor->addChild(new RasterizerDiscardCase(m_context, "write_stencil_lines", "lines", 4, CASE_WRITE_STENCIL,
529                                                 CASEOPTION_SCISSOR, GL_LINES));
530     scissor->addChild(new RasterizerDiscardCase(m_context, "write_stencil_line_strip", "line_strip", 4,
531                                                 CASE_WRITE_STENCIL, CASEOPTION_SCISSOR, GL_LINE_STRIP));
532     scissor->addChild(new RasterizerDiscardCase(m_context, "write_stencil_line_loop", "line_loop", 4,
533                                                 CASE_WRITE_STENCIL, CASEOPTION_SCISSOR, GL_LINE_LOOP));
534     scissor->addChild(new RasterizerDiscardCase(m_context, "write_stencil_triangles", "triangles", 4,
535                                                 CASE_WRITE_STENCIL, CASEOPTION_SCISSOR, GL_TRIANGLES));
536     scissor->addChild(new RasterizerDiscardCase(m_context, "write_stencil_triangle_strip", "triangle_strip", 4,
537                                                 CASE_WRITE_STENCIL, CASEOPTION_SCISSOR, GL_TRIANGLE_STRIP));
538     scissor->addChild(new RasterizerDiscardCase(m_context, "write_stencil_triangle_fan", "triangle_fan", 4,
539                                                 CASE_WRITE_STENCIL, CASEOPTION_SCISSOR, GL_TRIANGLE_FAN));
540 
541     scissor->addChild(
542         new RasterizerDiscardCase(m_context, "clear_color", "clear_color", 4, CASE_CLEAR_COLOR, CASEOPTION_SCISSOR));
543     scissor->addChild(
544         new RasterizerDiscardCase(m_context, "clear_depth", "clear_depth", 4, CASE_CLEAR_DEPTH, CASEOPTION_SCISSOR));
545     scissor->addChild(new RasterizerDiscardCase(m_context, "clear_stencil", "clear_stencil", 4, CASE_CLEAR_STENCIL,
546                                                 CASEOPTION_SCISSOR));
547 
548     // FBO cases
549 
550     fbo->addChild(new RasterizerDiscardCase(m_context, "write_depth_points", "points", 4, CASE_WRITE_DEPTH,
551                                             CASEOPTION_FBO, GL_POINTS));
552     fbo->addChild(new RasterizerDiscardCase(m_context, "write_depth_lines", "lines", 4, CASE_WRITE_DEPTH,
553                                             CASEOPTION_FBO, GL_LINES));
554     fbo->addChild(new RasterizerDiscardCase(m_context, "write_depth_line_strip", "line_strip", 4, CASE_WRITE_DEPTH,
555                                             CASEOPTION_FBO, GL_LINE_STRIP));
556     fbo->addChild(new RasterizerDiscardCase(m_context, "write_depth_line_loop", "line_loop", 4, CASE_WRITE_DEPTH,
557                                             CASEOPTION_FBO, GL_LINE_LOOP));
558     fbo->addChild(new RasterizerDiscardCase(m_context, "write_depth_triangles", "triangles", 4, CASE_WRITE_DEPTH,
559                                             CASEOPTION_FBO, GL_TRIANGLES));
560     fbo->addChild(new RasterizerDiscardCase(m_context, "write_depth_triangle_strip", "triangle_strip", 4,
561                                             CASE_WRITE_DEPTH, CASEOPTION_FBO, GL_TRIANGLE_STRIP));
562     fbo->addChild(new RasterizerDiscardCase(m_context, "write_depth_triangle_fan", "triangle_fan", 4, CASE_WRITE_DEPTH,
563                                             CASEOPTION_FBO, GL_TRIANGLE_FAN));
564 
565     fbo->addChild(new RasterizerDiscardCase(m_context, "write_stencil_points", "points", 4, CASE_WRITE_STENCIL,
566                                             CASEOPTION_FBO, GL_POINTS));
567     fbo->addChild(new RasterizerDiscardCase(m_context, "write_stencil_lines", "lines", 4, CASE_WRITE_STENCIL,
568                                             CASEOPTION_FBO, GL_LINES));
569     fbo->addChild(new RasterizerDiscardCase(m_context, "write_stencil_line_strip", "line_strip", 4, CASE_WRITE_STENCIL,
570                                             CASEOPTION_FBO, GL_LINE_STRIP));
571     fbo->addChild(new RasterizerDiscardCase(m_context, "write_stencil_line_loop", "line_loop", 4, CASE_WRITE_STENCIL,
572                                             CASEOPTION_FBO, GL_LINE_LOOP));
573     fbo->addChild(new RasterizerDiscardCase(m_context, "write_stencil_triangles", "triangles", 4, CASE_WRITE_STENCIL,
574                                             CASEOPTION_FBO, GL_TRIANGLES));
575     fbo->addChild(new RasterizerDiscardCase(m_context, "write_stencil_triangle_strip", "triangle_strip", 4,
576                                             CASE_WRITE_STENCIL, CASEOPTION_FBO, GL_TRIANGLE_STRIP));
577     fbo->addChild(new RasterizerDiscardCase(m_context, "write_stencil_triangle_fan", "triangle_fan", 4,
578                                             CASE_WRITE_STENCIL, CASEOPTION_FBO, GL_TRIANGLE_FAN));
579 
580     fbo->addChild(
581         new RasterizerDiscardCase(m_context, "clear_color", "clear_color", 4, CASE_CLEAR_COLOR, CASEOPTION_FBO));
582     fbo->addChild(
583         new RasterizerDiscardCase(m_context, "clear_depth", "clear_depth", 4, CASE_CLEAR_DEPTH, CASEOPTION_FBO));
584     fbo->addChild(
585         new RasterizerDiscardCase(m_context, "clear_stencil", "clear_stencil", 4, CASE_CLEAR_STENCIL, CASEOPTION_FBO));
586 }
587 
588 } // namespace Functional
589 } // namespace gles3
590 } // namespace deqp
591