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