xref: /aosp_15_r20/external/deqp/modules/gles3/functional/es3fFboDepthbufferTests.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 FBO depthbuffer tests.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "es3fFboDepthbufferTests.hpp"
25*35238bceSAndroid Build Coastguard Worker #include "es3fFboTestCase.hpp"
26*35238bceSAndroid Build Coastguard Worker #include "es3fFboTestUtil.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "gluTextureUtil.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "tcuTextureUtil.hpp"
29*35238bceSAndroid Build Coastguard Worker #include "sglrContextUtil.hpp"
30*35238bceSAndroid Build Coastguard Worker #include "glwEnums.hpp"
31*35238bceSAndroid Build Coastguard Worker 
32*35238bceSAndroid Build Coastguard Worker namespace deqp
33*35238bceSAndroid Build Coastguard Worker {
34*35238bceSAndroid Build Coastguard Worker namespace gles3
35*35238bceSAndroid Build Coastguard Worker {
36*35238bceSAndroid Build Coastguard Worker namespace Functional
37*35238bceSAndroid Build Coastguard Worker {
38*35238bceSAndroid Build Coastguard Worker 
39*35238bceSAndroid Build Coastguard Worker using std::string;
40*35238bceSAndroid Build Coastguard Worker using tcu::IVec2;
41*35238bceSAndroid Build Coastguard Worker using tcu::IVec3;
42*35238bceSAndroid Build Coastguard Worker using tcu::IVec4;
43*35238bceSAndroid Build Coastguard Worker using tcu::UVec4;
44*35238bceSAndroid Build Coastguard Worker using tcu::Vec2;
45*35238bceSAndroid Build Coastguard Worker using tcu::Vec3;
46*35238bceSAndroid Build Coastguard Worker using tcu::Vec4;
47*35238bceSAndroid Build Coastguard Worker using namespace FboTestUtil;
48*35238bceSAndroid Build Coastguard Worker 
49*35238bceSAndroid Build Coastguard Worker class BasicFboDepthCase : public FboTestCase
50*35238bceSAndroid Build Coastguard Worker {
51*35238bceSAndroid Build Coastguard Worker public:
BasicFboDepthCase(Context & context,const char * name,const char * desc,uint32_t format,int width,int height)52*35238bceSAndroid Build Coastguard Worker     BasicFboDepthCase(Context &context, const char *name, const char *desc, uint32_t format, int width, int height)
53*35238bceSAndroid Build Coastguard Worker         : FboTestCase(context, name, desc)
54*35238bceSAndroid Build Coastguard Worker         , m_format(format)
55*35238bceSAndroid Build Coastguard Worker         , m_width(width)
56*35238bceSAndroid Build Coastguard Worker         , m_height(height)
57*35238bceSAndroid Build Coastguard Worker     {
58*35238bceSAndroid Build Coastguard Worker     }
59*35238bceSAndroid Build Coastguard Worker 
60*35238bceSAndroid Build Coastguard Worker protected:
preCheck(void)61*35238bceSAndroid Build Coastguard Worker     void preCheck(void)
62*35238bceSAndroid Build Coastguard Worker     {
63*35238bceSAndroid Build Coastguard Worker         checkFormatSupport(m_format);
64*35238bceSAndroid Build Coastguard Worker     }
65*35238bceSAndroid Build Coastguard Worker 
render(tcu::Surface & dst)66*35238bceSAndroid Build Coastguard Worker     void render(tcu::Surface &dst)
67*35238bceSAndroid Build Coastguard Worker     {
68*35238bceSAndroid Build Coastguard Worker         const uint32_t colorFormat = GL_RGBA8;
69*35238bceSAndroid Build Coastguard Worker         uint32_t fbo               = 0;
70*35238bceSAndroid Build Coastguard Worker         uint32_t colorRbo          = 0;
71*35238bceSAndroid Build Coastguard Worker         uint32_t depthRbo          = 0;
72*35238bceSAndroid Build Coastguard Worker         GradientShader gradShader(glu::TYPE_FLOAT_VEC4);
73*35238bceSAndroid Build Coastguard Worker         Texture2DShader texShader(DataTypes() << glu::TYPE_SAMPLER_2D, glu::TYPE_FLOAT_VEC4);
74*35238bceSAndroid Build Coastguard Worker         uint32_t gradShaderID = getCurrentContext()->createProgram(&gradShader);
75*35238bceSAndroid Build Coastguard Worker         uint32_t texShaderID  = getCurrentContext()->createProgram(&texShader);
76*35238bceSAndroid Build Coastguard Worker         float clearDepth      = 1.0f;
77*35238bceSAndroid Build Coastguard Worker 
78*35238bceSAndroid Build Coastguard Worker         // Setup shaders
79*35238bceSAndroid Build Coastguard Worker         gradShader.setGradient(*getCurrentContext(), gradShaderID, tcu::Vec4(0.0f), tcu::Vec4(1.0f));
80*35238bceSAndroid Build Coastguard Worker         texShader.setUniforms(*getCurrentContext(), texShaderID);
81*35238bceSAndroid Build Coastguard Worker 
82*35238bceSAndroid Build Coastguard Worker         // Setup FBO
83*35238bceSAndroid Build Coastguard Worker 
84*35238bceSAndroid Build Coastguard Worker         glGenFramebuffers(1, &fbo);
85*35238bceSAndroid Build Coastguard Worker         glGenRenderbuffers(1, &colorRbo);
86*35238bceSAndroid Build Coastguard Worker         glGenRenderbuffers(1, &depthRbo);
87*35238bceSAndroid Build Coastguard Worker 
88*35238bceSAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, colorRbo);
89*35238bceSAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, colorFormat, m_width, m_height);
90*35238bceSAndroid Build Coastguard Worker 
91*35238bceSAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, depthRbo);
92*35238bceSAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, m_format, m_width, m_height);
93*35238bceSAndroid Build Coastguard Worker 
94*35238bceSAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, fbo);
95*35238bceSAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRbo);
96*35238bceSAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRbo);
97*35238bceSAndroid Build Coastguard Worker         checkError();
98*35238bceSAndroid Build Coastguard Worker         checkFramebufferStatus(GL_FRAMEBUFFER);
99*35238bceSAndroid Build Coastguard Worker 
100*35238bceSAndroid Build Coastguard Worker         glViewport(0, 0, m_width, m_height);
101*35238bceSAndroid Build Coastguard Worker 
102*35238bceSAndroid Build Coastguard Worker         // Clear depth to 1
103*35238bceSAndroid Build Coastguard Worker         glClearBufferfv(GL_DEPTH, 0, &clearDepth);
104*35238bceSAndroid Build Coastguard Worker 
105*35238bceSAndroid Build Coastguard Worker         // Render gradient with depth = [-1..1]
106*35238bceSAndroid Build Coastguard Worker         glEnable(GL_DEPTH_TEST);
107*35238bceSAndroid Build Coastguard Worker         sglr::drawQuad(*getCurrentContext(), gradShaderID, Vec3(-1.0f, -1.0f, -1.0f), Vec3(1.0f, 1.0f, 1.0f));
108*35238bceSAndroid Build Coastguard Worker 
109*35238bceSAndroid Build Coastguard Worker         // Render grid pattern with depth = 0
110*35238bceSAndroid Build Coastguard Worker         {
111*35238bceSAndroid Build Coastguard Worker             const uint32_t format   = GL_RGBA;
112*35238bceSAndroid Build Coastguard Worker             const uint32_t dataType = GL_UNSIGNED_BYTE;
113*35238bceSAndroid Build Coastguard Worker             const int texW          = 128;
114*35238bceSAndroid Build Coastguard Worker             const int texH          = 128;
115*35238bceSAndroid Build Coastguard Worker             uint32_t gridTex        = 0;
116*35238bceSAndroid Build Coastguard Worker             tcu::TextureLevel data(glu::mapGLTransferFormat(format, dataType), texW, texH, 1);
117*35238bceSAndroid Build Coastguard Worker 
118*35238bceSAndroid Build Coastguard Worker             tcu::fillWithGrid(data.getAccess(), 8, Vec4(0.2f, 0.7f, 0.1f, 1.0f), Vec4(0.7f, 0.1f, 0.5f, 0.8f));
119*35238bceSAndroid Build Coastguard Worker 
120*35238bceSAndroid Build Coastguard Worker             glGenTextures(1, &gridTex);
121*35238bceSAndroid Build Coastguard Worker             glBindTexture(GL_TEXTURE_2D, gridTex);
122*35238bceSAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
123*35238bceSAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
124*35238bceSAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
125*35238bceSAndroid Build Coastguard Worker             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
126*35238bceSAndroid Build Coastguard Worker             glTexImage2D(GL_TEXTURE_2D, 0, format, texW, texH, 0, format, dataType, data.getAccess().getDataPtr());
127*35238bceSAndroid Build Coastguard Worker 
128*35238bceSAndroid Build Coastguard Worker             sglr::drawQuad(*getCurrentContext(), texShaderID, Vec3(-1.0f, -1.0f, 0.0f), Vec3(1.0f, 1.0f, 0.0f));
129*35238bceSAndroid Build Coastguard Worker         }
130*35238bceSAndroid Build Coastguard Worker 
131*35238bceSAndroid Build Coastguard Worker         // Read results.
132*35238bceSAndroid Build Coastguard Worker         readPixels(dst, 0, 0, m_width, m_height, glu::mapGLInternalFormat(colorFormat), Vec4(1.0f), Vec4(0.0f));
133*35238bceSAndroid Build Coastguard Worker     }
134*35238bceSAndroid Build Coastguard Worker 
135*35238bceSAndroid Build Coastguard Worker private:
136*35238bceSAndroid Build Coastguard Worker     uint32_t m_format;
137*35238bceSAndroid Build Coastguard Worker     int m_width;
138*35238bceSAndroid Build Coastguard Worker     int m_height;
139*35238bceSAndroid Build Coastguard Worker };
140*35238bceSAndroid Build Coastguard Worker 
141*35238bceSAndroid Build Coastguard Worker class DepthWriteClampCase : public FboTestCase
142*35238bceSAndroid Build Coastguard Worker {
143*35238bceSAndroid Build Coastguard Worker public:
DepthWriteClampCase(Context & context,const char * name,const char * desc,uint32_t format,int width,int height)144*35238bceSAndroid Build Coastguard Worker     DepthWriteClampCase(Context &context, const char *name, const char *desc, uint32_t format, int width, int height)
145*35238bceSAndroid Build Coastguard Worker         : FboTestCase(context, name, desc)
146*35238bceSAndroid Build Coastguard Worker         , m_format(format)
147*35238bceSAndroid Build Coastguard Worker         , m_width(width)
148*35238bceSAndroid Build Coastguard Worker         , m_height(height)
149*35238bceSAndroid Build Coastguard Worker     {
150*35238bceSAndroid Build Coastguard Worker     }
151*35238bceSAndroid Build Coastguard Worker 
152*35238bceSAndroid Build Coastguard Worker protected:
preCheck(void)153*35238bceSAndroid Build Coastguard Worker     void preCheck(void)
154*35238bceSAndroid Build Coastguard Worker     {
155*35238bceSAndroid Build Coastguard Worker         checkFormatSupport(m_format);
156*35238bceSAndroid Build Coastguard Worker     }
157*35238bceSAndroid Build Coastguard Worker 
render(tcu::Surface & dst)158*35238bceSAndroid Build Coastguard Worker     void render(tcu::Surface &dst)
159*35238bceSAndroid Build Coastguard Worker     {
160*35238bceSAndroid Build Coastguard Worker         const uint32_t colorFormat      = GL_RGBA8;
161*35238bceSAndroid Build Coastguard Worker         uint32_t fbo                    = 0;
162*35238bceSAndroid Build Coastguard Worker         uint32_t colorRbo               = 0;
163*35238bceSAndroid Build Coastguard Worker         uint32_t depthTexture           = 0;
164*35238bceSAndroid Build Coastguard Worker         glu::TransferFormat transferFmt = glu::getTransferFormat(glu::mapGLInternalFormat(m_format));
165*35238bceSAndroid Build Coastguard Worker 
166*35238bceSAndroid Build Coastguard Worker         DepthGradientShader depthGradShader(glu::TYPE_FLOAT_VEC4);
167*35238bceSAndroid Build Coastguard Worker         const uint32_t depthGradShaderID = getCurrentContext()->createProgram(&depthGradShader);
168*35238bceSAndroid Build Coastguard Worker         const float clearDepth           = 1.0f;
169*35238bceSAndroid Build Coastguard Worker         const tcu::Vec4 red(1.0, 0.0, 0.0, 1.0);
170*35238bceSAndroid Build Coastguard Worker         const tcu::Vec4 green(0.0, 1.0, 0.0, 1.0);
171*35238bceSAndroid Build Coastguard Worker 
172*35238bceSAndroid Build Coastguard Worker         // Setup FBO
173*35238bceSAndroid Build Coastguard Worker 
174*35238bceSAndroid Build Coastguard Worker         glGenFramebuffers(1, &fbo);
175*35238bceSAndroid Build Coastguard Worker         glGenRenderbuffers(1, &colorRbo);
176*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &depthTexture);
177*35238bceSAndroid Build Coastguard Worker 
178*35238bceSAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, colorRbo);
179*35238bceSAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, colorFormat, m_width, m_height);
180*35238bceSAndroid Build Coastguard Worker 
181*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, depthTexture);
182*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, m_format, m_width, m_height, 0, transferFmt.format, transferFmt.dataType,
183*35238bceSAndroid Build Coastguard Worker                      DE_NULL);
184*35238bceSAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
185*35238bceSAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
186*35238bceSAndroid Build Coastguard Worker 
187*35238bceSAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, fbo);
188*35238bceSAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRbo);
189*35238bceSAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTexture, 0);
190*35238bceSAndroid Build Coastguard Worker         checkError();
191*35238bceSAndroid Build Coastguard Worker         checkFramebufferStatus(GL_FRAMEBUFFER);
192*35238bceSAndroid Build Coastguard Worker 
193*35238bceSAndroid Build Coastguard Worker         glViewport(0, 0, m_width, m_height);
194*35238bceSAndroid Build Coastguard Worker 
195*35238bceSAndroid Build Coastguard Worker         // Clear depth to 1
196*35238bceSAndroid Build Coastguard Worker         glClearBufferfv(GL_DEPTH, 0, &clearDepth);
197*35238bceSAndroid Build Coastguard Worker 
198*35238bceSAndroid Build Coastguard Worker         // Test that invalid values are not written to the depth buffer
199*35238bceSAndroid Build Coastguard Worker 
200*35238bceSAndroid Build Coastguard Worker         // Render green quad, depth gradient = [-1..2]
201*35238bceSAndroid Build Coastguard Worker         glEnable(GL_DEPTH_TEST);
202*35238bceSAndroid Build Coastguard Worker         glDepthFunc(GL_ALWAYS);
203*35238bceSAndroid Build Coastguard Worker 
204*35238bceSAndroid Build Coastguard Worker         depthGradShader.setUniforms(*getCurrentContext(), depthGradShaderID, -1.0f, 2.0f, green);
205*35238bceSAndroid Build Coastguard Worker         sglr::drawQuad(*getCurrentContext(), depthGradShaderID, Vec3(-1.0f, -1.0f, -1.0f), Vec3(1.0f, 1.0f, 1.0f));
206*35238bceSAndroid Build Coastguard Worker         glDepthMask(GL_FALSE);
207*35238bceSAndroid Build Coastguard Worker 
208*35238bceSAndroid Build Coastguard Worker         // Test if any fragment has greater depth than 1; there should be none
209*35238bceSAndroid Build Coastguard Worker         glDepthFunc(GL_LESS); // (1 < depth) ?
210*35238bceSAndroid Build Coastguard Worker         depthGradShader.setUniforms(*getCurrentContext(), depthGradShaderID, 1.0f, 1.0f, red);
211*35238bceSAndroid Build Coastguard Worker         sglr::drawQuad(*getCurrentContext(), depthGradShaderID, Vec3(-1.0f, -1.0f, -1.0f), Vec3(1.0f, 1.0f, 1.0f));
212*35238bceSAndroid Build Coastguard Worker 
213*35238bceSAndroid Build Coastguard Worker         // Test if any fragment has smaller depth than 0; there should be none
214*35238bceSAndroid Build Coastguard Worker         glDepthFunc(GL_GREATER); // (0 > depth) ?
215*35238bceSAndroid Build Coastguard Worker         depthGradShader.setUniforms(*getCurrentContext(), depthGradShaderID, 0.0f, 0.0f, red);
216*35238bceSAndroid Build Coastguard Worker         sglr::drawQuad(*getCurrentContext(), depthGradShaderID, Vec3(-1.0f, -1.0f, -1.0f), Vec3(1.0f, 1.0f, 1.0f));
217*35238bceSAndroid Build Coastguard Worker 
218*35238bceSAndroid Build Coastguard Worker         // Read results.
219*35238bceSAndroid Build Coastguard Worker         readPixels(dst, 0, 0, m_width, m_height, glu::mapGLInternalFormat(colorFormat), Vec4(1.0f), Vec4(0.0f));
220*35238bceSAndroid Build Coastguard Worker     }
221*35238bceSAndroid Build Coastguard Worker 
222*35238bceSAndroid Build Coastguard Worker private:
223*35238bceSAndroid Build Coastguard Worker     const uint32_t m_format;
224*35238bceSAndroid Build Coastguard Worker     const int m_width;
225*35238bceSAndroid Build Coastguard Worker     const int m_height;
226*35238bceSAndroid Build Coastguard Worker };
227*35238bceSAndroid Build Coastguard Worker 
228*35238bceSAndroid Build Coastguard Worker class DepthTestClampCase : public FboTestCase
229*35238bceSAndroid Build Coastguard Worker {
230*35238bceSAndroid Build Coastguard Worker public:
DepthTestClampCase(Context & context,const char * name,const char * desc,uint32_t format,int width,int height)231*35238bceSAndroid Build Coastguard Worker     DepthTestClampCase(Context &context, const char *name, const char *desc, uint32_t format, int width, int height)
232*35238bceSAndroid Build Coastguard Worker         : FboTestCase(context, name, desc)
233*35238bceSAndroid Build Coastguard Worker         , m_format(format)
234*35238bceSAndroid Build Coastguard Worker         , m_width(width)
235*35238bceSAndroid Build Coastguard Worker         , m_height(height)
236*35238bceSAndroid Build Coastguard Worker     {
237*35238bceSAndroid Build Coastguard Worker     }
238*35238bceSAndroid Build Coastguard Worker 
239*35238bceSAndroid Build Coastguard Worker protected:
preCheck(void)240*35238bceSAndroid Build Coastguard Worker     void preCheck(void)
241*35238bceSAndroid Build Coastguard Worker     {
242*35238bceSAndroid Build Coastguard Worker         checkFormatSupport(m_format);
243*35238bceSAndroid Build Coastguard Worker     }
244*35238bceSAndroid Build Coastguard Worker 
render(tcu::Surface & dst)245*35238bceSAndroid Build Coastguard Worker     void render(tcu::Surface &dst)
246*35238bceSAndroid Build Coastguard Worker     {
247*35238bceSAndroid Build Coastguard Worker         const uint32_t colorFormat      = GL_RGBA8;
248*35238bceSAndroid Build Coastguard Worker         uint32_t fbo                    = 0;
249*35238bceSAndroid Build Coastguard Worker         uint32_t colorRbo               = 0;
250*35238bceSAndroid Build Coastguard Worker         uint32_t depthTexture           = 0;
251*35238bceSAndroid Build Coastguard Worker         glu::TransferFormat transferFmt = glu::getTransferFormat(glu::mapGLInternalFormat(m_format));
252*35238bceSAndroid Build Coastguard Worker 
253*35238bceSAndroid Build Coastguard Worker         DepthGradientShader depthGradShader(glu::TYPE_FLOAT_VEC4);
254*35238bceSAndroid Build Coastguard Worker         const uint32_t depthGradShaderID = getCurrentContext()->createProgram(&depthGradShader);
255*35238bceSAndroid Build Coastguard Worker         const float clearDepth           = 1.0f;
256*35238bceSAndroid Build Coastguard Worker         const tcu::Vec4 yellow(1.0, 1.0, 0.0, 1.0);
257*35238bceSAndroid Build Coastguard Worker         const tcu::Vec4 green(0.0, 1.0, 0.0, 1.0);
258*35238bceSAndroid Build Coastguard Worker 
259*35238bceSAndroid Build Coastguard Worker         // Setup FBO
260*35238bceSAndroid Build Coastguard Worker 
261*35238bceSAndroid Build Coastguard Worker         glGenFramebuffers(1, &fbo);
262*35238bceSAndroid Build Coastguard Worker         glGenRenderbuffers(1, &colorRbo);
263*35238bceSAndroid Build Coastguard Worker         glGenTextures(1, &depthTexture);
264*35238bceSAndroid Build Coastguard Worker 
265*35238bceSAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, colorRbo);
266*35238bceSAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, colorFormat, m_width, m_height);
267*35238bceSAndroid Build Coastguard Worker 
268*35238bceSAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, depthTexture);
269*35238bceSAndroid Build Coastguard Worker         glTexImage2D(GL_TEXTURE_2D, 0, m_format, m_width, m_height, 0, transferFmt.format, transferFmt.dataType,
270*35238bceSAndroid Build Coastguard Worker                      DE_NULL);
271*35238bceSAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
272*35238bceSAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
273*35238bceSAndroid Build Coastguard Worker 
274*35238bceSAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, fbo);
275*35238bceSAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRbo);
276*35238bceSAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTexture, 0);
277*35238bceSAndroid Build Coastguard Worker         checkError();
278*35238bceSAndroid Build Coastguard Worker         checkFramebufferStatus(GL_FRAMEBUFFER);
279*35238bceSAndroid Build Coastguard Worker 
280*35238bceSAndroid Build Coastguard Worker         glViewport(0, 0, m_width, m_height);
281*35238bceSAndroid Build Coastguard Worker 
282*35238bceSAndroid Build Coastguard Worker         // Clear depth to 1
283*35238bceSAndroid Build Coastguard Worker         glClearBufferfv(GL_DEPTH, 0, &clearDepth);
284*35238bceSAndroid Build Coastguard Worker 
285*35238bceSAndroid Build Coastguard Worker         // Test values used in depth test are clamped
286*35238bceSAndroid Build Coastguard Worker 
287*35238bceSAndroid Build Coastguard Worker         // Render green quad, depth gradient = [-1..2]
288*35238bceSAndroid Build Coastguard Worker         glEnable(GL_DEPTH_TEST);
289*35238bceSAndroid Build Coastguard Worker         glDepthFunc(GL_ALWAYS);
290*35238bceSAndroid Build Coastguard Worker 
291*35238bceSAndroid Build Coastguard Worker         depthGradShader.setUniforms(*getCurrentContext(), depthGradShaderID, -1.0f, 2.0f, green);
292*35238bceSAndroid Build Coastguard Worker         sglr::drawQuad(*getCurrentContext(), depthGradShaderID, Vec3(-1.0f, -1.0f, -1.0f), Vec3(1.0f, 1.0f, 1.0f));
293*35238bceSAndroid Build Coastguard Worker 
294*35238bceSAndroid Build Coastguard Worker         // Render yellow quad, depth gradient = [-0.5..3]. Gradients have equal values only outside [0, 1] range due to clamping
295*35238bceSAndroid Build Coastguard Worker         glDepthFunc(GL_EQUAL);
296*35238bceSAndroid Build Coastguard Worker         depthGradShader.setUniforms(*getCurrentContext(), depthGradShaderID, -0.5f, 3.0f, yellow);
297*35238bceSAndroid Build Coastguard Worker         sglr::drawQuad(*getCurrentContext(), depthGradShaderID, Vec3(-1.0f, -1.0f, -1.0f), Vec3(1.0f, 1.0f, 1.0f));
298*35238bceSAndroid Build Coastguard Worker 
299*35238bceSAndroid Build Coastguard Worker         // Read results.
300*35238bceSAndroid Build Coastguard Worker         readPixels(dst, 0, 0, m_width, m_height, glu::mapGLInternalFormat(colorFormat), Vec4(1.0f), Vec4(0.0f));
301*35238bceSAndroid Build Coastguard Worker     }
302*35238bceSAndroid Build Coastguard Worker 
303*35238bceSAndroid Build Coastguard Worker private:
304*35238bceSAndroid Build Coastguard Worker     const uint32_t m_format;
305*35238bceSAndroid Build Coastguard Worker     const int m_width;
306*35238bceSAndroid Build Coastguard Worker     const int m_height;
307*35238bceSAndroid Build Coastguard Worker };
308*35238bceSAndroid Build Coastguard Worker 
FboDepthTests(Context & context)309*35238bceSAndroid Build Coastguard Worker FboDepthTests::FboDepthTests(Context &context) : TestCaseGroup(context, "depth", "Depth tests")
310*35238bceSAndroid Build Coastguard Worker {
311*35238bceSAndroid Build Coastguard Worker }
312*35238bceSAndroid Build Coastguard Worker 
~FboDepthTests(void)313*35238bceSAndroid Build Coastguard Worker FboDepthTests::~FboDepthTests(void)
314*35238bceSAndroid Build Coastguard Worker {
315*35238bceSAndroid Build Coastguard Worker }
316*35238bceSAndroid Build Coastguard Worker 
init(void)317*35238bceSAndroid Build Coastguard Worker void FboDepthTests::init(void)
318*35238bceSAndroid Build Coastguard Worker {
319*35238bceSAndroid Build Coastguard Worker     static const uint32_t depthFormats[] = {GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT16,
320*35238bceSAndroid Build Coastguard Worker                                             GL_DEPTH32F_STENCIL8, GL_DEPTH24_STENCIL8};
321*35238bceSAndroid Build Coastguard Worker 
322*35238bceSAndroid Build Coastguard Worker     // .basic
323*35238bceSAndroid Build Coastguard Worker     {
324*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *basicGroup = new tcu::TestCaseGroup(m_testCtx, "basic", "Basic depth tests");
325*35238bceSAndroid Build Coastguard Worker         addChild(basicGroup);
326*35238bceSAndroid Build Coastguard Worker 
327*35238bceSAndroid Build Coastguard Worker         for (int fmtNdx = 0; fmtNdx < DE_LENGTH_OF_ARRAY(depthFormats); fmtNdx++)
328*35238bceSAndroid Build Coastguard Worker             basicGroup->addChild(new BasicFboDepthCase(m_context, getFormatName(depthFormats[fmtNdx]), "",
329*35238bceSAndroid Build Coastguard Worker                                                        depthFormats[fmtNdx], 119, 127));
330*35238bceSAndroid Build Coastguard Worker     }
331*35238bceSAndroid Build Coastguard Worker 
332*35238bceSAndroid Build Coastguard Worker     // .depth_write_clamp
333*35238bceSAndroid Build Coastguard Worker     {
334*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *depthClampGroup =
335*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "depth_write_clamp", "Depth write clamping tests");
336*35238bceSAndroid Build Coastguard Worker         addChild(depthClampGroup);
337*35238bceSAndroid Build Coastguard Worker 
338*35238bceSAndroid Build Coastguard Worker         for (int fmtNdx = 0; fmtNdx < DE_LENGTH_OF_ARRAY(depthFormats); fmtNdx++)
339*35238bceSAndroid Build Coastguard Worker             depthClampGroup->addChild(new DepthWriteClampCase(m_context, getFormatName(depthFormats[fmtNdx]), "",
340*35238bceSAndroid Build Coastguard Worker                                                               depthFormats[fmtNdx], 119, 127));
341*35238bceSAndroid Build Coastguard Worker     }
342*35238bceSAndroid Build Coastguard Worker 
343*35238bceSAndroid Build Coastguard Worker     // .depth_test_clamp
344*35238bceSAndroid Build Coastguard Worker     {
345*35238bceSAndroid Build Coastguard Worker         tcu::TestCaseGroup *depthClampGroup =
346*35238bceSAndroid Build Coastguard Worker             new tcu::TestCaseGroup(m_testCtx, "depth_test_clamp", "Depth test value clamping tests");
347*35238bceSAndroid Build Coastguard Worker         addChild(depthClampGroup);
348*35238bceSAndroid Build Coastguard Worker 
349*35238bceSAndroid Build Coastguard Worker         for (int fmtNdx = 0; fmtNdx < DE_LENGTH_OF_ARRAY(depthFormats); fmtNdx++)
350*35238bceSAndroid Build Coastguard Worker             depthClampGroup->addChild(new DepthTestClampCase(m_context, getFormatName(depthFormats[fmtNdx]), "",
351*35238bceSAndroid Build Coastguard Worker                                                              depthFormats[fmtNdx], 119, 127));
352*35238bceSAndroid Build Coastguard Worker     }
353*35238bceSAndroid Build Coastguard Worker }
354*35238bceSAndroid Build Coastguard Worker 
355*35238bceSAndroid Build Coastguard Worker } // namespace Functional
356*35238bceSAndroid Build Coastguard Worker } // namespace gles3
357*35238bceSAndroid Build Coastguard Worker } // namespace deqp
358