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 gl_FragDepth tests.
22*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker
24*35238bceSAndroid Build Coastguard Worker #include "es3fFragDepthTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "tcuVector.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "tcuTestLog.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuSurface.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "tcuImageCompare.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "tcuRenderTarget.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "gluPixelTransfer.hpp"
31*35238bceSAndroid Build Coastguard Worker #include "gluShaderProgram.hpp"
32*35238bceSAndroid Build Coastguard Worker #include "gluDrawUtil.hpp"
33*35238bceSAndroid Build Coastguard Worker #include "deRandom.hpp"
34*35238bceSAndroid Build Coastguard Worker #include "deMath.h"
35*35238bceSAndroid Build Coastguard Worker #include "deString.h"
36*35238bceSAndroid Build Coastguard Worker
37*35238bceSAndroid Build Coastguard Worker // For setupDefaultUniforms()
38*35238bceSAndroid Build Coastguard Worker #include "glsShaderRenderCase.hpp"
39*35238bceSAndroid Build Coastguard Worker
40*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
41*35238bceSAndroid Build Coastguard Worker #include "glwFunctions.hpp"
42*35238bceSAndroid Build Coastguard Worker
43*35238bceSAndroid Build Coastguard Worker namespace deqp
44*35238bceSAndroid Build Coastguard Worker {
45*35238bceSAndroid Build Coastguard Worker namespace gles3
46*35238bceSAndroid Build Coastguard Worker {
47*35238bceSAndroid Build Coastguard Worker namespace Functional
48*35238bceSAndroid Build Coastguard Worker {
49*35238bceSAndroid Build Coastguard Worker
50*35238bceSAndroid Build Coastguard Worker using std::string;
51*35238bceSAndroid Build Coastguard Worker using std::vector;
52*35238bceSAndroid Build Coastguard Worker using tcu::TestLog;
53*35238bceSAndroid Build Coastguard Worker using tcu::Vec2;
54*35238bceSAndroid Build Coastguard Worker using tcu::Vec3;
55*35238bceSAndroid Build Coastguard Worker using tcu::Vec4;
56*35238bceSAndroid Build Coastguard Worker
57*35238bceSAndroid Build Coastguard Worker typedef float (*EvalFragDepthFunc)(const Vec2 &coord);
58*35238bceSAndroid Build Coastguard Worker
59*35238bceSAndroid Build Coastguard Worker static const char *s_vertexShaderSrc = "#version 300 es\n"
60*35238bceSAndroid Build Coastguard Worker "in highp vec4 a_position;\n"
61*35238bceSAndroid Build Coastguard Worker "in highp vec2 a_coord;\n"
62*35238bceSAndroid Build Coastguard Worker "out highp vec2 v_coord;\n"
63*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
64*35238bceSAndroid Build Coastguard Worker "{\n"
65*35238bceSAndroid Build Coastguard Worker " gl_Position = a_position;\n"
66*35238bceSAndroid Build Coastguard Worker " v_coord = a_coord;\n"
67*35238bceSAndroid Build Coastguard Worker "}\n";
68*35238bceSAndroid Build Coastguard Worker static const char *s_defaultFragmentShaderSrc = "#version 300 es\n"
69*35238bceSAndroid Build Coastguard Worker "uniform highp vec4 u_color;\n"
70*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out mediump vec4 o_color;\n"
71*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
72*35238bceSAndroid Build Coastguard Worker "{\n"
73*35238bceSAndroid Build Coastguard Worker " o_color = u_color;\n"
74*35238bceSAndroid Build Coastguard Worker "}\n";
75*35238bceSAndroid Build Coastguard Worker
76*35238bceSAndroid Build Coastguard Worker template <typename T>
compare(uint32_t func,T a,T b)77*35238bceSAndroid Build Coastguard Worker static inline bool compare(uint32_t func, T a, T b)
78*35238bceSAndroid Build Coastguard Worker {
79*35238bceSAndroid Build Coastguard Worker switch (func)
80*35238bceSAndroid Build Coastguard Worker {
81*35238bceSAndroid Build Coastguard Worker case GL_NEVER:
82*35238bceSAndroid Build Coastguard Worker return false;
83*35238bceSAndroid Build Coastguard Worker case GL_ALWAYS:
84*35238bceSAndroid Build Coastguard Worker return true;
85*35238bceSAndroid Build Coastguard Worker case GL_LESS:
86*35238bceSAndroid Build Coastguard Worker return a < b;
87*35238bceSAndroid Build Coastguard Worker case GL_LEQUAL:
88*35238bceSAndroid Build Coastguard Worker return a <= b;
89*35238bceSAndroid Build Coastguard Worker case GL_EQUAL:
90*35238bceSAndroid Build Coastguard Worker return a == b;
91*35238bceSAndroid Build Coastguard Worker case GL_NOTEQUAL:
92*35238bceSAndroid Build Coastguard Worker return a != b;
93*35238bceSAndroid Build Coastguard Worker case GL_GEQUAL:
94*35238bceSAndroid Build Coastguard Worker return a >= b;
95*35238bceSAndroid Build Coastguard Worker case GL_GREATER:
96*35238bceSAndroid Build Coastguard Worker return a > b;
97*35238bceSAndroid Build Coastguard Worker default:
98*35238bceSAndroid Build Coastguard Worker DE_ASSERT(false);
99*35238bceSAndroid Build Coastguard Worker return false;
100*35238bceSAndroid Build Coastguard Worker }
101*35238bceSAndroid Build Coastguard Worker }
102*35238bceSAndroid Build Coastguard Worker
103*35238bceSAndroid Build Coastguard Worker class FragDepthCompareCase : public TestCase
104*35238bceSAndroid Build Coastguard Worker {
105*35238bceSAndroid Build Coastguard Worker public:
106*35238bceSAndroid Build Coastguard Worker FragDepthCompareCase(Context &context, const char *name, const char *desc, const char *fragSrc,
107*35238bceSAndroid Build Coastguard Worker EvalFragDepthFunc evalFunc, uint32_t compareFunc);
108*35238bceSAndroid Build Coastguard Worker ~FragDepthCompareCase(void);
109*35238bceSAndroid Build Coastguard Worker
110*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
111*35238bceSAndroid Build Coastguard Worker
112*35238bceSAndroid Build Coastguard Worker private:
113*35238bceSAndroid Build Coastguard Worker string m_fragSrc;
114*35238bceSAndroid Build Coastguard Worker EvalFragDepthFunc m_evalFunc;
115*35238bceSAndroid Build Coastguard Worker uint32_t m_compareFunc;
116*35238bceSAndroid Build Coastguard Worker };
117*35238bceSAndroid Build Coastguard Worker
FragDepthCompareCase(Context & context,const char * name,const char * desc,const char * fragSrc,EvalFragDepthFunc evalFunc,uint32_t compareFunc)118*35238bceSAndroid Build Coastguard Worker FragDepthCompareCase::FragDepthCompareCase(Context &context, const char *name, const char *desc, const char *fragSrc,
119*35238bceSAndroid Build Coastguard Worker EvalFragDepthFunc evalFunc, uint32_t compareFunc)
120*35238bceSAndroid Build Coastguard Worker : TestCase(context, name, desc)
121*35238bceSAndroid Build Coastguard Worker , m_fragSrc(fragSrc)
122*35238bceSAndroid Build Coastguard Worker , m_evalFunc(evalFunc)
123*35238bceSAndroid Build Coastguard Worker , m_compareFunc(compareFunc)
124*35238bceSAndroid Build Coastguard Worker {
125*35238bceSAndroid Build Coastguard Worker }
126*35238bceSAndroid Build Coastguard Worker
~FragDepthCompareCase(void)127*35238bceSAndroid Build Coastguard Worker FragDepthCompareCase::~FragDepthCompareCase(void)
128*35238bceSAndroid Build Coastguard Worker {
129*35238bceSAndroid Build Coastguard Worker }
130*35238bceSAndroid Build Coastguard Worker
iterate(void)131*35238bceSAndroid Build Coastguard Worker FragDepthCompareCase::IterateResult FragDepthCompareCase::iterate(void)
132*35238bceSAndroid Build Coastguard Worker {
133*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
134*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
135*35238bceSAndroid Build Coastguard Worker de::Random rnd(deStringHash(getName()));
136*35238bceSAndroid Build Coastguard Worker const tcu::RenderTarget &renderTarget = m_context.getRenderContext().getRenderTarget();
137*35238bceSAndroid Build Coastguard Worker int viewportW = de::min(128, renderTarget.getWidth());
138*35238bceSAndroid Build Coastguard Worker int viewportH = de::min(128, renderTarget.getHeight());
139*35238bceSAndroid Build Coastguard Worker int viewportX = rnd.getInt(0, renderTarget.getWidth() - viewportW);
140*35238bceSAndroid Build Coastguard Worker int viewportY = rnd.getInt(0, renderTarget.getHeight() - viewportH);
141*35238bceSAndroid Build Coastguard Worker tcu::Surface renderedFrame(viewportW, viewportH);
142*35238bceSAndroid Build Coastguard Worker tcu::Surface referenceFrame(viewportW, viewportH);
143*35238bceSAndroid Build Coastguard Worker const float constDepth = 0.1f;
144*35238bceSAndroid Build Coastguard Worker
145*35238bceSAndroid Build Coastguard Worker if (renderTarget.getDepthBits() == 0)
146*35238bceSAndroid Build Coastguard Worker throw tcu::NotSupportedError("Depth buffer is required", "", __FILE__, __LINE__);
147*35238bceSAndroid Build Coastguard Worker
148*35238bceSAndroid Build Coastguard Worker gl.viewport(viewportX, viewportY, viewportW, viewportH);
149*35238bceSAndroid Build Coastguard Worker gl.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
150*35238bceSAndroid Build Coastguard Worker gl.enable(GL_DEPTH_TEST);
151*35238bceSAndroid Build Coastguard Worker
152*35238bceSAndroid Build Coastguard Worker static const uint16_t quadIndices[] = {0, 1, 2, 2, 1, 3};
153*35238bceSAndroid Build Coastguard Worker
154*35238bceSAndroid Build Coastguard Worker // Fill viewport with 2 quads - one with constant depth and another with d = [-1..1]
155*35238bceSAndroid Build Coastguard Worker {
156*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram basicQuadProgram(m_context.getRenderContext(),
157*35238bceSAndroid Build Coastguard Worker glu::makeVtxFragSources(s_vertexShaderSrc, s_defaultFragmentShaderSrc));
158*35238bceSAndroid Build Coastguard Worker
159*35238bceSAndroid Build Coastguard Worker if (!basicQuadProgram.isOk())
160*35238bceSAndroid Build Coastguard Worker {
161*35238bceSAndroid Build Coastguard Worker log << basicQuadProgram;
162*35238bceSAndroid Build Coastguard Worker TCU_FAIL("Compile failed");
163*35238bceSAndroid Build Coastguard Worker }
164*35238bceSAndroid Build Coastguard Worker
165*35238bceSAndroid Build Coastguard Worker const float constDepthCoord[] = {-1.0f, -1.0f, constDepth, 1.0f, -1.0f, +1.0f, constDepth, 1.0f,
166*35238bceSAndroid Build Coastguard Worker 0.0f, -1.0f, constDepth, 1.0f, 0.0f, +1.0f, constDepth, 1.0f};
167*35238bceSAndroid Build Coastguard Worker const float varyingDepthCoord[] = {0.0f, -1.0f, +1.0f, 1.0f, 0.0f, +1.0f, 0.0f, 1.0f,
168*35238bceSAndroid Build Coastguard Worker +1.0f, -1.0f, 0.0f, 1.0f, +1.0f, +1.0f, -1.0f, 1.0f};
169*35238bceSAndroid Build Coastguard Worker
170*35238bceSAndroid Build Coastguard Worker gl.useProgram(basicQuadProgram.getProgram());
171*35238bceSAndroid Build Coastguard Worker gl.uniform4f(gl.getUniformLocation(basicQuadProgram.getProgram(), "u_color"), 0.0f, 0.0f, 1.0f, 1.0f);
172*35238bceSAndroid Build Coastguard Worker gl.depthFunc(GL_ALWAYS);
173*35238bceSAndroid Build Coastguard Worker
174*35238bceSAndroid Build Coastguard Worker {
175*35238bceSAndroid Build Coastguard Worker glu::VertexArrayBinding posBinding = glu::va::Float("a_position", 4, 4, 0, &constDepthCoord[0]);
176*35238bceSAndroid Build Coastguard Worker glu::draw(m_context.getRenderContext(), basicQuadProgram.getProgram(), 1, &posBinding,
177*35238bceSAndroid Build Coastguard Worker glu::pr::Triangles(DE_LENGTH_OF_ARRAY(quadIndices), &quadIndices[0]));
178*35238bceSAndroid Build Coastguard Worker }
179*35238bceSAndroid Build Coastguard Worker
180*35238bceSAndroid Build Coastguard Worker {
181*35238bceSAndroid Build Coastguard Worker glu::VertexArrayBinding posBinding = glu::va::Float("a_position", 4, 4, 0, &varyingDepthCoord[0]);
182*35238bceSAndroid Build Coastguard Worker glu::draw(m_context.getRenderContext(), basicQuadProgram.getProgram(), 1, &posBinding,
183*35238bceSAndroid Build Coastguard Worker glu::pr::Triangles(DE_LENGTH_OF_ARRAY(quadIndices), &quadIndices[0]));
184*35238bceSAndroid Build Coastguard Worker }
185*35238bceSAndroid Build Coastguard Worker
186*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "Draw base quads");
187*35238bceSAndroid Build Coastguard Worker }
188*35238bceSAndroid Build Coastguard Worker
189*35238bceSAndroid Build Coastguard Worker // Render with depth test.
190*35238bceSAndroid Build Coastguard Worker {
191*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(m_context.getRenderContext(),
192*35238bceSAndroid Build Coastguard Worker glu::makeVtxFragSources(s_vertexShaderSrc, m_fragSrc.c_str()));
193*35238bceSAndroid Build Coastguard Worker log << program;
194*35238bceSAndroid Build Coastguard Worker
195*35238bceSAndroid Build Coastguard Worker if (!program.isOk())
196*35238bceSAndroid Build Coastguard Worker TCU_FAIL("Compile failed");
197*35238bceSAndroid Build Coastguard Worker
198*35238bceSAndroid Build Coastguard Worker const float coord[] = {0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f};
199*35238bceSAndroid Build Coastguard Worker const float position[] = {-1.0f, -1.0f, +1.0f, 1.0f, -1.0f, +1.0f, 0.0f, 1.0f,
200*35238bceSAndroid Build Coastguard Worker +1.0f, -1.0f, 0.0f, 1.0f, +1.0f, +1.0f, -1.0f, 1.0f};
201*35238bceSAndroid Build Coastguard Worker
202*35238bceSAndroid Build Coastguard Worker gl.useProgram(program.getProgram());
203*35238bceSAndroid Build Coastguard Worker gl.depthFunc(m_compareFunc);
204*35238bceSAndroid Build Coastguard Worker gl.uniform4f(gl.getUniformLocation(program.getProgram(), "u_color"), 0.0f, 1.0f, 0.0f, 1.0f);
205*35238bceSAndroid Build Coastguard Worker
206*35238bceSAndroid Build Coastguard Worker // Setup default helper uniforms.
207*35238bceSAndroid Build Coastguard Worker gls::setupDefaultUniforms(m_context.getRenderContext(), program.getProgram());
208*35238bceSAndroid Build Coastguard Worker
209*35238bceSAndroid Build Coastguard Worker {
210*35238bceSAndroid Build Coastguard Worker glu::VertexArrayBinding vertexArrays[] = {glu::va::Float("a_position", 4, 4, 0, &position[0]),
211*35238bceSAndroid Build Coastguard Worker glu::va::Float("a_coord", 2, 4, 0, &coord[0])};
212*35238bceSAndroid Build Coastguard Worker glu::draw(m_context.getRenderContext(), program.getProgram(), DE_LENGTH_OF_ARRAY(vertexArrays),
213*35238bceSAndroid Build Coastguard Worker &vertexArrays[0], glu::pr::Triangles(DE_LENGTH_OF_ARRAY(quadIndices), &quadIndices[0]));
214*35238bceSAndroid Build Coastguard Worker }
215*35238bceSAndroid Build Coastguard Worker
216*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "Draw test quad");
217*35238bceSAndroid Build Coastguard Worker }
218*35238bceSAndroid Build Coastguard Worker
219*35238bceSAndroid Build Coastguard Worker glu::readPixels(m_context.getRenderContext(), viewportX, viewportY, renderedFrame.getAccess());
220*35238bceSAndroid Build Coastguard Worker
221*35238bceSAndroid Build Coastguard Worker // Render reference.
222*35238bceSAndroid Build Coastguard Worker for (int y = 0; y < referenceFrame.getHeight(); y++)
223*35238bceSAndroid Build Coastguard Worker {
224*35238bceSAndroid Build Coastguard Worker float yf = ((float)y + 0.5f) / (float)referenceFrame.getHeight();
225*35238bceSAndroid Build Coastguard Worker int half = de::clamp((int)((float)referenceFrame.getWidth() * 0.5f + 0.5f), 0, referenceFrame.getWidth());
226*35238bceSAndroid Build Coastguard Worker
227*35238bceSAndroid Build Coastguard Worker // Fill left half - comparison to constant 0.5
228*35238bceSAndroid Build Coastguard Worker for (int x = 0; x < half; x++)
229*35238bceSAndroid Build Coastguard Worker {
230*35238bceSAndroid Build Coastguard Worker float xf = ((float)x + 0.5f) / (float)referenceFrame.getWidth();
231*35238bceSAndroid Build Coastguard Worker float d = m_evalFunc(Vec2(xf, yf));
232*35238bceSAndroid Build Coastguard Worker bool dpass = compare(m_compareFunc, d, constDepth * 0.5f + 0.5f);
233*35238bceSAndroid Build Coastguard Worker
234*35238bceSAndroid Build Coastguard Worker referenceFrame.setPixel(x, y, dpass ? tcu::RGBA::green() : tcu::RGBA::blue());
235*35238bceSAndroid Build Coastguard Worker }
236*35238bceSAndroid Build Coastguard Worker
237*35238bceSAndroid Build Coastguard Worker // Fill right half - comparison to interpolated depth
238*35238bceSAndroid Build Coastguard Worker for (int x = half; x < referenceFrame.getWidth(); x++)
239*35238bceSAndroid Build Coastguard Worker {
240*35238bceSAndroid Build Coastguard Worker float xf = ((float)x + 0.5f) / (float)referenceFrame.getWidth();
241*35238bceSAndroid Build Coastguard Worker float xh = ((float)(x - half) + 0.5f) / (float)(referenceFrame.getWidth() - half);
242*35238bceSAndroid Build Coastguard Worker float rd = 1.0f - (xh + yf) * 0.5f;
243*35238bceSAndroid Build Coastguard Worker float d = m_evalFunc(Vec2(xf, yf));
244*35238bceSAndroid Build Coastguard Worker bool dpass = compare(m_compareFunc, d, rd);
245*35238bceSAndroid Build Coastguard Worker
246*35238bceSAndroid Build Coastguard Worker referenceFrame.setPixel(x, y, dpass ? tcu::RGBA::green() : tcu::RGBA::blue());
247*35238bceSAndroid Build Coastguard Worker }
248*35238bceSAndroid Build Coastguard Worker }
249*35238bceSAndroid Build Coastguard Worker
250*35238bceSAndroid Build Coastguard Worker bool isOk = tcu::fuzzyCompare(log, "Result", "Image comparison result", referenceFrame, renderedFrame, 0.05f,
251*35238bceSAndroid Build Coastguard Worker tcu::COMPARE_LOG_RESULT);
252*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL, isOk ? "Pass" : "Fail");
253*35238bceSAndroid Build Coastguard Worker return STOP;
254*35238bceSAndroid Build Coastguard Worker }
255*35238bceSAndroid Build Coastguard Worker
256*35238bceSAndroid Build Coastguard Worker class FragDepthWriteCase : public TestCase
257*35238bceSAndroid Build Coastguard Worker {
258*35238bceSAndroid Build Coastguard Worker public:
259*35238bceSAndroid Build Coastguard Worker FragDepthWriteCase(Context &context, const char *name, const char *desc, const char *fragSrc,
260*35238bceSAndroid Build Coastguard Worker EvalFragDepthFunc evalFunc);
261*35238bceSAndroid Build Coastguard Worker ~FragDepthWriteCase(void);
262*35238bceSAndroid Build Coastguard Worker
263*35238bceSAndroid Build Coastguard Worker IterateResult iterate(void);
264*35238bceSAndroid Build Coastguard Worker
265*35238bceSAndroid Build Coastguard Worker private:
266*35238bceSAndroid Build Coastguard Worker string m_fragSrc;
267*35238bceSAndroid Build Coastguard Worker EvalFragDepthFunc m_evalFunc;
268*35238bceSAndroid Build Coastguard Worker };
269*35238bceSAndroid Build Coastguard Worker
FragDepthWriteCase(Context & context,const char * name,const char * desc,const char * fragSrc,EvalFragDepthFunc evalFunc)270*35238bceSAndroid Build Coastguard Worker FragDepthWriteCase::FragDepthWriteCase(Context &context, const char *name, const char *desc, const char *fragSrc,
271*35238bceSAndroid Build Coastguard Worker EvalFragDepthFunc evalFunc)
272*35238bceSAndroid Build Coastguard Worker : TestCase(context, name, desc)
273*35238bceSAndroid Build Coastguard Worker , m_fragSrc(fragSrc)
274*35238bceSAndroid Build Coastguard Worker , m_evalFunc(evalFunc)
275*35238bceSAndroid Build Coastguard Worker {
276*35238bceSAndroid Build Coastguard Worker }
277*35238bceSAndroid Build Coastguard Worker
~FragDepthWriteCase(void)278*35238bceSAndroid Build Coastguard Worker FragDepthWriteCase::~FragDepthWriteCase(void)
279*35238bceSAndroid Build Coastguard Worker {
280*35238bceSAndroid Build Coastguard Worker }
281*35238bceSAndroid Build Coastguard Worker
iterate(void)282*35238bceSAndroid Build Coastguard Worker FragDepthWriteCase::IterateResult FragDepthWriteCase::iterate(void)
283*35238bceSAndroid Build Coastguard Worker {
284*35238bceSAndroid Build Coastguard Worker TestLog &log = m_testCtx.getLog();
285*35238bceSAndroid Build Coastguard Worker const glw::Functions &gl = m_context.getRenderContext().getFunctions();
286*35238bceSAndroid Build Coastguard Worker de::Random rnd(deStringHash(getName()));
287*35238bceSAndroid Build Coastguard Worker const tcu::RenderTarget &renderTarget = m_context.getRenderContext().getRenderTarget();
288*35238bceSAndroid Build Coastguard Worker int viewportW = de::min(128, renderTarget.getWidth());
289*35238bceSAndroid Build Coastguard Worker int viewportH = de::min(128, renderTarget.getHeight());
290*35238bceSAndroid Build Coastguard Worker int viewportX = rnd.getInt(0, renderTarget.getWidth() - viewportW);
291*35238bceSAndroid Build Coastguard Worker int viewportY = rnd.getInt(0, renderTarget.getHeight() - viewportH);
292*35238bceSAndroid Build Coastguard Worker tcu::Surface renderedFrame(viewportW, viewportH);
293*35238bceSAndroid Build Coastguard Worker tcu::Surface referenceFrame(viewportW, viewportH);
294*35238bceSAndroid Build Coastguard Worker const int numDepthSteps = 16;
295*35238bceSAndroid Build Coastguard Worker const float depthStep = 1.0f / (float)(numDepthSteps - 1);
296*35238bceSAndroid Build Coastguard Worker
297*35238bceSAndroid Build Coastguard Worker if (renderTarget.getDepthBits() == 0)
298*35238bceSAndroid Build Coastguard Worker throw tcu::NotSupportedError("Depth buffer is required", "", __FILE__, __LINE__);
299*35238bceSAndroid Build Coastguard Worker
300*35238bceSAndroid Build Coastguard Worker gl.viewport(viewportX, viewportY, viewportW, viewportH);
301*35238bceSAndroid Build Coastguard Worker gl.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
302*35238bceSAndroid Build Coastguard Worker gl.enable(GL_DEPTH_TEST);
303*35238bceSAndroid Build Coastguard Worker gl.depthFunc(GL_LESS);
304*35238bceSAndroid Build Coastguard Worker
305*35238bceSAndroid Build Coastguard Worker static const uint16_t quadIndices[] = {0, 1, 2, 2, 1, 3};
306*35238bceSAndroid Build Coastguard Worker
307*35238bceSAndroid Build Coastguard Worker // Render with given shader.
308*35238bceSAndroid Build Coastguard Worker {
309*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(m_context.getRenderContext(),
310*35238bceSAndroid Build Coastguard Worker glu::makeVtxFragSources(s_vertexShaderSrc, m_fragSrc.c_str()));
311*35238bceSAndroid Build Coastguard Worker log << program;
312*35238bceSAndroid Build Coastguard Worker
313*35238bceSAndroid Build Coastguard Worker if (!program.isOk())
314*35238bceSAndroid Build Coastguard Worker TCU_FAIL("Compile failed");
315*35238bceSAndroid Build Coastguard Worker
316*35238bceSAndroid Build Coastguard Worker const float coord[] = {0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f};
317*35238bceSAndroid Build Coastguard Worker const float position[] = {-1.0f, -1.0f, +1.0f, 1.0f, -1.0f, +1.0f, 0.0f, 1.0f,
318*35238bceSAndroid Build Coastguard Worker +1.0f, -1.0f, 0.0f, 1.0f, +1.0f, +1.0f, -1.0f, 1.0f};
319*35238bceSAndroid Build Coastguard Worker
320*35238bceSAndroid Build Coastguard Worker gl.useProgram(program.getProgram());
321*35238bceSAndroid Build Coastguard Worker gl.uniform4f(gl.getUniformLocation(program.getProgram(), "u_color"), 0.0f, 1.0f, 0.0f, 1.0f);
322*35238bceSAndroid Build Coastguard Worker
323*35238bceSAndroid Build Coastguard Worker // Setup default helper uniforms.
324*35238bceSAndroid Build Coastguard Worker gls::setupDefaultUniforms(m_context.getRenderContext(), program.getProgram());
325*35238bceSAndroid Build Coastguard Worker
326*35238bceSAndroid Build Coastguard Worker {
327*35238bceSAndroid Build Coastguard Worker glu::VertexArrayBinding vertexArrays[] = {glu::va::Float("a_position", 4, 4, 0, &position[0]),
328*35238bceSAndroid Build Coastguard Worker glu::va::Float("a_coord", 2, 4, 0, &coord[0])};
329*35238bceSAndroid Build Coastguard Worker glu::draw(m_context.getRenderContext(), program.getProgram(), DE_LENGTH_OF_ARRAY(vertexArrays),
330*35238bceSAndroid Build Coastguard Worker &vertexArrays[0], glu::pr::Triangles(DE_LENGTH_OF_ARRAY(quadIndices), &quadIndices[0]));
331*35238bceSAndroid Build Coastguard Worker }
332*35238bceSAndroid Build Coastguard Worker
333*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "Draw test quad");
334*35238bceSAndroid Build Coastguard Worker }
335*35238bceSAndroid Build Coastguard Worker
336*35238bceSAndroid Build Coastguard Worker // Visualize by rendering full-screen quads with increasing depth and color.
337*35238bceSAndroid Build Coastguard Worker {
338*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram program(m_context.getRenderContext(),
339*35238bceSAndroid Build Coastguard Worker glu::makeVtxFragSources(s_vertexShaderSrc, s_defaultFragmentShaderSrc));
340*35238bceSAndroid Build Coastguard Worker if (!program.isOk())
341*35238bceSAndroid Build Coastguard Worker {
342*35238bceSAndroid Build Coastguard Worker log << program;
343*35238bceSAndroid Build Coastguard Worker TCU_FAIL("Compile failed");
344*35238bceSAndroid Build Coastguard Worker }
345*35238bceSAndroid Build Coastguard Worker
346*35238bceSAndroid Build Coastguard Worker int posLoc = gl.getAttribLocation(program.getProgram(), "a_position");
347*35238bceSAndroid Build Coastguard Worker int colorLoc = gl.getUniformLocation(program.getProgram(), "u_color");
348*35238bceSAndroid Build Coastguard Worker
349*35238bceSAndroid Build Coastguard Worker gl.useProgram(program.getProgram());
350*35238bceSAndroid Build Coastguard Worker gl.depthMask(GL_FALSE);
351*35238bceSAndroid Build Coastguard Worker
352*35238bceSAndroid Build Coastguard Worker for (int stepNdx = 0; stepNdx < numDepthSteps; stepNdx++)
353*35238bceSAndroid Build Coastguard Worker {
354*35238bceSAndroid Build Coastguard Worker float f = (float)stepNdx * depthStep;
355*35238bceSAndroid Build Coastguard Worker float depth = f * 2.0f - 1.0f;
356*35238bceSAndroid Build Coastguard Worker Vec4 color = Vec4(f, f, f, 1.0f);
357*35238bceSAndroid Build Coastguard Worker
358*35238bceSAndroid Build Coastguard Worker const float position[] = {-1.0f, -1.0f, depth, 1.0f, -1.0f, +1.0f, depth, 1.0f,
359*35238bceSAndroid Build Coastguard Worker +1.0f, -1.0f, depth, 1.0f, +1.0f, +1.0f, depth, 1.0f};
360*35238bceSAndroid Build Coastguard Worker glu::VertexArrayBinding posBinding = glu::va::Float(posLoc, 4, 4, 0, &position[0]);
361*35238bceSAndroid Build Coastguard Worker
362*35238bceSAndroid Build Coastguard Worker gl.uniform4fv(colorLoc, 1, color.getPtr());
363*35238bceSAndroid Build Coastguard Worker glu::draw(m_context.getRenderContext(), program.getProgram(), 1, &posBinding,
364*35238bceSAndroid Build Coastguard Worker glu::pr::Triangles(DE_LENGTH_OF_ARRAY(quadIndices), &quadIndices[0]));
365*35238bceSAndroid Build Coastguard Worker }
366*35238bceSAndroid Build Coastguard Worker
367*35238bceSAndroid Build Coastguard Worker GLU_EXPECT_NO_ERROR(gl.getError(), "Visualization draw");
368*35238bceSAndroid Build Coastguard Worker }
369*35238bceSAndroid Build Coastguard Worker
370*35238bceSAndroid Build Coastguard Worker glu::readPixels(m_context.getRenderContext(), viewportX, viewportY, renderedFrame.getAccess());
371*35238bceSAndroid Build Coastguard Worker
372*35238bceSAndroid Build Coastguard Worker // Render reference.
373*35238bceSAndroid Build Coastguard Worker for (int y = 0; y < referenceFrame.getHeight(); y++)
374*35238bceSAndroid Build Coastguard Worker {
375*35238bceSAndroid Build Coastguard Worker for (int x = 0; x < referenceFrame.getWidth(); x++)
376*35238bceSAndroid Build Coastguard Worker {
377*35238bceSAndroid Build Coastguard Worker float xf = ((float)x + 0.5f) / (float)referenceFrame.getWidth();
378*35238bceSAndroid Build Coastguard Worker float yf = ((float)y + 0.5f) / (float)referenceFrame.getHeight();
379*35238bceSAndroid Build Coastguard Worker float d = m_evalFunc(Vec2(xf, yf));
380*35238bceSAndroid Build Coastguard Worker int step = (int)deFloatFloor(d / depthStep);
381*35238bceSAndroid Build Coastguard Worker int col = de::clamp(deRoundFloatToInt32((float)step * depthStep * 255.0f), 0, 255);
382*35238bceSAndroid Build Coastguard Worker
383*35238bceSAndroid Build Coastguard Worker referenceFrame.setPixel(x, y, tcu::RGBA(col, col, col, 0xff));
384*35238bceSAndroid Build Coastguard Worker }
385*35238bceSAndroid Build Coastguard Worker }
386*35238bceSAndroid Build Coastguard Worker
387*35238bceSAndroid Build Coastguard Worker bool isOk = tcu::fuzzyCompare(log, "Result", "Image comparison result", referenceFrame, renderedFrame, 0.05f,
388*35238bceSAndroid Build Coastguard Worker tcu::COMPARE_LOG_RESULT);
389*35238bceSAndroid Build Coastguard Worker m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL, isOk ? "Pass" : "Fail");
390*35238bceSAndroid Build Coastguard Worker return STOP;
391*35238bceSAndroid Build Coastguard Worker }
392*35238bceSAndroid Build Coastguard Worker
FragDepthTests(Context & context)393*35238bceSAndroid Build Coastguard Worker FragDepthTests::FragDepthTests(Context &context) : TestCaseGroup(context, "fragdepth", "gl_FragDepth tests")
394*35238bceSAndroid Build Coastguard Worker {
395*35238bceSAndroid Build Coastguard Worker }
396*35238bceSAndroid Build Coastguard Worker
~FragDepthTests(void)397*35238bceSAndroid Build Coastguard Worker FragDepthTests::~FragDepthTests(void)
398*35238bceSAndroid Build Coastguard Worker {
399*35238bceSAndroid Build Coastguard Worker }
400*35238bceSAndroid Build Coastguard Worker
evalConstDepth(const Vec2 & coord)401*35238bceSAndroid Build Coastguard Worker static float evalConstDepth(const Vec2 &coord)
402*35238bceSAndroid Build Coastguard Worker {
403*35238bceSAndroid Build Coastguard Worker DE_UNREF(coord);
404*35238bceSAndroid Build Coastguard Worker return 0.5f;
405*35238bceSAndroid Build Coastguard Worker }
evalDynamicDepth(const Vec2 & coord)406*35238bceSAndroid Build Coastguard Worker static float evalDynamicDepth(const Vec2 &coord)
407*35238bceSAndroid Build Coastguard Worker {
408*35238bceSAndroid Build Coastguard Worker return (coord.x() + coord.y()) * 0.5f;
409*35238bceSAndroid Build Coastguard Worker }
evalNoWrite(const Vec2 & coord)410*35238bceSAndroid Build Coastguard Worker static float evalNoWrite(const Vec2 &coord)
411*35238bceSAndroid Build Coastguard Worker {
412*35238bceSAndroid Build Coastguard Worker return 1.0f - (coord.x() + coord.y()) * 0.5f;
413*35238bceSAndroid Build Coastguard Worker }
414*35238bceSAndroid Build Coastguard Worker
evalDynamicConditionalDepth(const Vec2 & coord)415*35238bceSAndroid Build Coastguard Worker static float evalDynamicConditionalDepth(const Vec2 &coord)
416*35238bceSAndroid Build Coastguard Worker {
417*35238bceSAndroid Build Coastguard Worker float d = (coord.x() + coord.y()) * 0.5f;
418*35238bceSAndroid Build Coastguard Worker if (coord.y() < 0.5f)
419*35238bceSAndroid Build Coastguard Worker return d;
420*35238bceSAndroid Build Coastguard Worker else
421*35238bceSAndroid Build Coastguard Worker return 1.0f - d;
422*35238bceSAndroid Build Coastguard Worker }
423*35238bceSAndroid Build Coastguard Worker
init(void)424*35238bceSAndroid Build Coastguard Worker void FragDepthTests::init(void)
425*35238bceSAndroid Build Coastguard Worker {
426*35238bceSAndroid Build Coastguard Worker static const struct
427*35238bceSAndroid Build Coastguard Worker {
428*35238bceSAndroid Build Coastguard Worker const char *name;
429*35238bceSAndroid Build Coastguard Worker const char *desc;
430*35238bceSAndroid Build Coastguard Worker EvalFragDepthFunc evalFunc;
431*35238bceSAndroid Build Coastguard Worker const char *fragSrc;
432*35238bceSAndroid Build Coastguard Worker } cases[] = {{"no_write", "No gl_FragDepth write", evalNoWrite,
433*35238bceSAndroid Build Coastguard Worker "#version 300 es\n"
434*35238bceSAndroid Build Coastguard Worker "uniform highp vec4 u_color;\n"
435*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out mediump vec4 o_color;\n"
436*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
437*35238bceSAndroid Build Coastguard Worker "{\n"
438*35238bceSAndroid Build Coastguard Worker " o_color = u_color;\n"
439*35238bceSAndroid Build Coastguard Worker "}\n"},
440*35238bceSAndroid Build Coastguard Worker {"const", "Const depth write", evalConstDepth,
441*35238bceSAndroid Build Coastguard Worker "#version 300 es\n"
442*35238bceSAndroid Build Coastguard Worker "uniform highp vec4 u_color;\n"
443*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out mediump vec4 o_color;\n"
444*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
445*35238bceSAndroid Build Coastguard Worker "{\n"
446*35238bceSAndroid Build Coastguard Worker " o_color = u_color;\n"
447*35238bceSAndroid Build Coastguard Worker " gl_FragDepth = 0.5;\n"
448*35238bceSAndroid Build Coastguard Worker "}\n"},
449*35238bceSAndroid Build Coastguard Worker {"uniform", "Uniform depth write", evalConstDepth,
450*35238bceSAndroid Build Coastguard Worker "#version 300 es\n"
451*35238bceSAndroid Build Coastguard Worker "uniform highp vec4 u_color;\n"
452*35238bceSAndroid Build Coastguard Worker "uniform highp float uf_half;\n"
453*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out mediump vec4 o_color;\n"
454*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
455*35238bceSAndroid Build Coastguard Worker "{\n"
456*35238bceSAndroid Build Coastguard Worker " o_color = u_color;\n"
457*35238bceSAndroid Build Coastguard Worker " gl_FragDepth = uf_half;\n"
458*35238bceSAndroid Build Coastguard Worker "}\n"},
459*35238bceSAndroid Build Coastguard Worker {"dynamic", "Dynamic depth write", evalDynamicDepth,
460*35238bceSAndroid Build Coastguard Worker "#version 300 es\n"
461*35238bceSAndroid Build Coastguard Worker "uniform highp vec4 u_color;\n"
462*35238bceSAndroid Build Coastguard Worker "in highp vec2 v_coord;\n"
463*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out mediump vec4 o_color;\n"
464*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
465*35238bceSAndroid Build Coastguard Worker "{\n"
466*35238bceSAndroid Build Coastguard Worker " o_color = u_color;\n"
467*35238bceSAndroid Build Coastguard Worker " gl_FragDepth = (v_coord.x+v_coord.y)*0.5;\n"
468*35238bceSAndroid Build Coastguard Worker "}\n"},
469*35238bceSAndroid Build Coastguard Worker {"fragcoord_z", "gl_FragDepth write from gl_FragCoord.z", evalNoWrite,
470*35238bceSAndroid Build Coastguard Worker "#version 300 es\n"
471*35238bceSAndroid Build Coastguard Worker "uniform highp vec4 u_color;\n"
472*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out mediump vec4 o_color;\n"
473*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
474*35238bceSAndroid Build Coastguard Worker "{\n"
475*35238bceSAndroid Build Coastguard Worker " o_color = u_color;\n"
476*35238bceSAndroid Build Coastguard Worker " gl_FragDepth = gl_FragCoord.z;\n"
477*35238bceSAndroid Build Coastguard Worker "}\n"},
478*35238bceSAndroid Build Coastguard Worker {"uniform_conditional_write", "Uniform conditional write", evalDynamicDepth,
479*35238bceSAndroid Build Coastguard Worker "#version 300 es\n"
480*35238bceSAndroid Build Coastguard Worker "uniform highp vec4 u_color;\n"
481*35238bceSAndroid Build Coastguard Worker "uniform bool ub_true;\n"
482*35238bceSAndroid Build Coastguard Worker "in highp vec2 v_coord;\n"
483*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out mediump vec4 o_color;\n"
484*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
485*35238bceSAndroid Build Coastguard Worker "{\n"
486*35238bceSAndroid Build Coastguard Worker " o_color = u_color;\n"
487*35238bceSAndroid Build Coastguard Worker " if (ub_true)\n"
488*35238bceSAndroid Build Coastguard Worker " gl_FragDepth = (v_coord.x+v_coord.y)*0.5;\n"
489*35238bceSAndroid Build Coastguard Worker "}\n"},
490*35238bceSAndroid Build Coastguard Worker {"dynamic_conditional_write", "Uniform conditional write", evalDynamicConditionalDepth,
491*35238bceSAndroid Build Coastguard Worker "#version 300 es\n"
492*35238bceSAndroid Build Coastguard Worker "uniform highp vec4 u_color;\n"
493*35238bceSAndroid Build Coastguard Worker "uniform bool ub_true;\n"
494*35238bceSAndroid Build Coastguard Worker "in highp vec2 v_coord;\n"
495*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out mediump vec4 o_color;\n"
496*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
497*35238bceSAndroid Build Coastguard Worker "{\n"
498*35238bceSAndroid Build Coastguard Worker " o_color = u_color;\n"
499*35238bceSAndroid Build Coastguard Worker " mediump float d = (v_coord.x+v_coord.y)*0.5f;\n"
500*35238bceSAndroid Build Coastguard Worker " if (v_coord.y < 0.5)\n"
501*35238bceSAndroid Build Coastguard Worker " gl_FragDepth = d;\n"
502*35238bceSAndroid Build Coastguard Worker " else\n"
503*35238bceSAndroid Build Coastguard Worker " gl_FragDepth = 1.0 - d;\n"
504*35238bceSAndroid Build Coastguard Worker "}\n"},
505*35238bceSAndroid Build Coastguard Worker {"uniform_loop_write", "Uniform loop write", evalConstDepth,
506*35238bceSAndroid Build Coastguard Worker "#version 300 es\n"
507*35238bceSAndroid Build Coastguard Worker "uniform highp vec4 u_color;\n"
508*35238bceSAndroid Build Coastguard Worker "uniform int ui_two;\n"
509*35238bceSAndroid Build Coastguard Worker "uniform highp float uf_fourth;\n"
510*35238bceSAndroid Build Coastguard Worker "in highp vec2 v_coord;\n"
511*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out mediump vec4 o_color;\n"
512*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
513*35238bceSAndroid Build Coastguard Worker "{\n"
514*35238bceSAndroid Build Coastguard Worker " o_color = u_color;\n"
515*35238bceSAndroid Build Coastguard Worker " gl_FragDepth = 0.0;\n"
516*35238bceSAndroid Build Coastguard Worker " for (int i = 0; i < ui_two; i++)\n"
517*35238bceSAndroid Build Coastguard Worker " gl_FragDepth += uf_fourth;\n"
518*35238bceSAndroid Build Coastguard Worker "}\n"},
519*35238bceSAndroid Build Coastguard Worker {"write_in_function", "Uniform loop write", evalDynamicDepth,
520*35238bceSAndroid Build Coastguard Worker "#version 300 es\n"
521*35238bceSAndroid Build Coastguard Worker "uniform highp vec4 u_color;\n"
522*35238bceSAndroid Build Coastguard Worker "uniform highp float uf_half;\n"
523*35238bceSAndroid Build Coastguard Worker "in highp vec2 v_coord;\n"
524*35238bceSAndroid Build Coastguard Worker "layout(location = 0) out mediump vec4 o_color;\n"
525*35238bceSAndroid Build Coastguard Worker "void myfunc (highp vec2 coord)\n"
526*35238bceSAndroid Build Coastguard Worker "{\n"
527*35238bceSAndroid Build Coastguard Worker " gl_FragDepth = (coord.x+coord.y)*0.5;\n"
528*35238bceSAndroid Build Coastguard Worker "}\n"
529*35238bceSAndroid Build Coastguard Worker "void main (void)\n"
530*35238bceSAndroid Build Coastguard Worker "{\n"
531*35238bceSAndroid Build Coastguard Worker " o_color = u_color;\n"
532*35238bceSAndroid Build Coastguard Worker " myfunc(v_coord);\n"
533*35238bceSAndroid Build Coastguard Worker "}\n"}};
534*35238bceSAndroid Build Coastguard Worker
535*35238bceSAndroid Build Coastguard Worker // .write
536*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *writeGroup = new tcu::TestCaseGroup(m_testCtx, "write", "gl_FragDepth write tests");
537*35238bceSAndroid Build Coastguard Worker addChild(writeGroup);
538*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(cases); ndx++)
539*35238bceSAndroid Build Coastguard Worker writeGroup->addChild(new FragDepthWriteCase(m_context, cases[ndx].name, cases[ndx].desc, cases[ndx].fragSrc,
540*35238bceSAndroid Build Coastguard Worker cases[ndx].evalFunc));
541*35238bceSAndroid Build Coastguard Worker
542*35238bceSAndroid Build Coastguard Worker // .compare
543*35238bceSAndroid Build Coastguard Worker tcu::TestCaseGroup *compareGroup =
544*35238bceSAndroid Build Coastguard Worker new tcu::TestCaseGroup(m_testCtx, "compare", "gl_FragDepth used with depth comparison");
545*35238bceSAndroid Build Coastguard Worker addChild(compareGroup);
546*35238bceSAndroid Build Coastguard Worker for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(cases); ndx++)
547*35238bceSAndroid Build Coastguard Worker compareGroup->addChild(new FragDepthCompareCase(m_context, cases[ndx].name, cases[ndx].desc, cases[ndx].fragSrc,
548*35238bceSAndroid Build Coastguard Worker cases[ndx].evalFunc, GL_LESS));
549*35238bceSAndroid Build Coastguard Worker }
550*35238bceSAndroid Build Coastguard Worker
551*35238bceSAndroid Build Coastguard Worker } // namespace Functional
552*35238bceSAndroid Build Coastguard Worker } // namespace gles3
553*35238bceSAndroid Build Coastguard Worker } // namespace deqp
554