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