xref: /aosp_15_r20/external/deqp/modules/gles3/functional/es3fFragDepthTests.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 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