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