xref: /aosp_15_r20/external/angle/src/tests/gl_tests/FragDepthTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2022 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // FragDepthTest:
7*8975f5c5SAndroid Build Coastguard Worker //   Tests the correctness of gl_FragDepth usage.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker class FragDepthTest : public ANGLETest<>
16*8975f5c5SAndroid Build Coastguard Worker {
17*8975f5c5SAndroid Build Coastguard Worker   protected:
18*8975f5c5SAndroid Build Coastguard Worker     struct FragDepthTestResources
19*8975f5c5SAndroid Build Coastguard Worker     {
20*8975f5c5SAndroid Build Coastguard Worker         GLuint program;
21*8975f5c5SAndroid Build Coastguard Worker         GLint depthLocation;
22*8975f5c5SAndroid Build Coastguard Worker         GLTexture colorTexture;
23*8975f5c5SAndroid Build Coastguard Worker         GLTexture depthTexture;
24*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer framebuffer;
25*8975f5c5SAndroid Build Coastguard Worker     };
26*8975f5c5SAndroid Build Coastguard Worker 
setupResources(FragDepthTestResources & resources)27*8975f5c5SAndroid Build Coastguard Worker     void setupResources(FragDepthTestResources &resources)
28*8975f5c5SAndroid Build Coastguard Worker     {
29*8975f5c5SAndroid Build Coastguard Worker 
30*8975f5c5SAndroid Build Coastguard Worker         // Writes a fixed depth value and green.
31*8975f5c5SAndroid Build Coastguard Worker         constexpr char kFS[] =
32*8975f5c5SAndroid Build Coastguard Worker             R"(#version 300 es
33*8975f5c5SAndroid Build Coastguard Worker             precision highp float;
34*8975f5c5SAndroid Build Coastguard Worker             layout(location = 0) out vec4 fragColor;
35*8975f5c5SAndroid Build Coastguard Worker             uniform float u_depth;
36*8975f5c5SAndroid Build Coastguard Worker             void main(){
37*8975f5c5SAndroid Build Coastguard Worker                 gl_FragDepth = u_depth;
38*8975f5c5SAndroid Build Coastguard Worker                 fragColor = vec4(0.0, 1.0, 0.0, 1.0);
39*8975f5c5SAndroid Build Coastguard Worker             })";
40*8975f5c5SAndroid Build Coastguard Worker 
41*8975f5c5SAndroid Build Coastguard Worker         resources.program       = CompileProgram(essl3_shaders::vs::Simple(), kFS);
42*8975f5c5SAndroid Build Coastguard Worker         resources.depthLocation = glGetUniformLocation(resources.program, "u_depth");
43*8975f5c5SAndroid Build Coastguard Worker 
44*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, resources.colorTexture);
45*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 1, 1);
46*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
47*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
48*8975f5c5SAndroid Build Coastguard Worker 
49*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, resources.depthTexture);
50*8975f5c5SAndroid Build Coastguard Worker         glTexStorage2D(GL_TEXTURE_2D, 1, GL_DEPTH_COMPONENT32F, 1, 1);
51*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
52*8975f5c5SAndroid Build Coastguard Worker         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
53*8975f5c5SAndroid Build Coastguard Worker 
54*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, resources.framebuffer);
55*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
56*8975f5c5SAndroid Build Coastguard Worker                                resources.colorTexture, 0);
57*8975f5c5SAndroid Build Coastguard Worker     }
58*8975f5c5SAndroid Build Coastguard Worker 
cleanupResources(FragDepthTestResources & resources)59*8975f5c5SAndroid Build Coastguard Worker     void cleanupResources(FragDepthTestResources &resources) { glDeleteProgram(resources.program); }
60*8975f5c5SAndroid Build Coastguard Worker 
checkDepthWritten(float expectedDepth,float fsDepth,bool bindDepthBuffer)61*8975f5c5SAndroid Build Coastguard Worker     void checkDepthWritten(float expectedDepth, float fsDepth, bool bindDepthBuffer)
62*8975f5c5SAndroid Build Coastguard Worker     {
63*8975f5c5SAndroid Build Coastguard Worker         FragDepthTestResources resources;
64*8975f5c5SAndroid Build Coastguard Worker         setupResources(resources);
65*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(0u, resources.program);
66*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, resources.depthLocation);
67*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
68*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
69*8975f5c5SAndroid Build Coastguard Worker 
70*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, resources.framebuffer);
71*8975f5c5SAndroid Build Coastguard Worker         if (bindDepthBuffer)
72*8975f5c5SAndroid Build Coastguard Worker         {
73*8975f5c5SAndroid Build Coastguard Worker             glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D,
74*8975f5c5SAndroid Build Coastguard Worker                                    resources.depthTexture, 0);
75*8975f5c5SAndroid Build Coastguard Worker             EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
76*8975f5c5SAndroid Build Coastguard Worker 
77*8975f5c5SAndroid Build Coastguard Worker             // Clear to the expected depth so it will be compared to the FS depth with
78*8975f5c5SAndroid Build Coastguard Worker             // DepthFunc(GL_EQUAL)
79*8975f5c5SAndroid Build Coastguard Worker             glClearDepthf(expectedDepth);
80*8975f5c5SAndroid Build Coastguard Worker             glDepthFunc(GL_EQUAL);
81*8975f5c5SAndroid Build Coastguard Worker             glEnable(GL_DEPTH_TEST);
82*8975f5c5SAndroid Build Coastguard Worker         }
83*8975f5c5SAndroid Build Coastguard Worker         else
84*8975f5c5SAndroid Build Coastguard Worker         {
85*8975f5c5SAndroid Build Coastguard Worker             glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 0, 0);
86*8975f5c5SAndroid Build Coastguard Worker             EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
87*8975f5c5SAndroid Build Coastguard Worker             glDisable(GL_DEPTH_TEST);
88*8975f5c5SAndroid Build Coastguard Worker         }
89*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(resources.program);
90*8975f5c5SAndroid Build Coastguard Worker 
91*8975f5c5SAndroid Build Coastguard Worker         // Clear to red, the FS will write green on success
92*8975f5c5SAndroid Build Coastguard Worker         glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
93*8975f5c5SAndroid Build Coastguard Worker         // Clear to the expected depth so it will be compared to the FS depth with
94*8975f5c5SAndroid Build Coastguard Worker         // DepthFunc(GL_EQUAL)
95*8975f5c5SAndroid Build Coastguard Worker 
96*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
97*8975f5c5SAndroid Build Coastguard Worker         glUniform1f(resources.depthLocation, fsDepth);
98*8975f5c5SAndroid Build Coastguard Worker 
99*8975f5c5SAndroid Build Coastguard Worker         drawQuad(resources.program, "a_position", 0.0f);
100*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
101*8975f5c5SAndroid Build Coastguard Worker 
102*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
103*8975f5c5SAndroid Build Coastguard Worker         cleanupResources(resources);
104*8975f5c5SAndroid Build Coastguard Worker     }
105*8975f5c5SAndroid Build Coastguard Worker };
106*8975f5c5SAndroid Build Coastguard Worker 
107*8975f5c5SAndroid Build Coastguard Worker // Test that writing to gl_FragDepth works
TEST_P(FragDepthTest,DepthBufferBound)108*8975f5c5SAndroid Build Coastguard Worker TEST_P(FragDepthTest, DepthBufferBound)
109*8975f5c5SAndroid Build Coastguard Worker {
110*8975f5c5SAndroid Build Coastguard Worker     checkDepthWritten(0.5f, 0.5f, true);
111*8975f5c5SAndroid Build Coastguard Worker }
112*8975f5c5SAndroid Build Coastguard Worker 
113*8975f5c5SAndroid Build Coastguard Worker // Test that writing to gl_FragDepth with no depth buffer works.
TEST_P(FragDepthTest,DepthBufferUnbound)114*8975f5c5SAndroid Build Coastguard Worker TEST_P(FragDepthTest, DepthBufferUnbound)
115*8975f5c5SAndroid Build Coastguard Worker {
116*8975f5c5SAndroid Build Coastguard Worker     // Depth test is disabled, so the expected depth should not matter.
117*8975f5c5SAndroid Build Coastguard Worker     checkDepthWritten(0.f, 0.5f, false);
118*8975f5c5SAndroid Build Coastguard Worker }
119*8975f5c5SAndroid Build Coastguard Worker 
120*8975f5c5SAndroid Build Coastguard Worker // Test that fragment shader depth writes to a no-depth framebuffer do not fail
121*8975f5c5SAndroid Build Coastguard Worker // after using a depth-enabled framebuffer with the same program.
TEST_P(FragDepthTest,SwitchToNoDepthFramebuffer)122*8975f5c5SAndroid Build Coastguard Worker TEST_P(FragDepthTest, SwitchToNoDepthFramebuffer)
123*8975f5c5SAndroid Build Coastguard Worker {
124*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 300 es
125*8975f5c5SAndroid Build Coastguard Worker     out highp vec4 color;
126*8975f5c5SAndroid Build Coastguard Worker     void main() {
127*8975f5c5SAndroid Build Coastguard Worker       color = vec4(1.0, 0.0, 0.0, 1.0);
128*8975f5c5SAndroid Build Coastguard Worker       gl_FragDepth = 1.0;
129*8975f5c5SAndroid Build Coastguard Worker     })";
130*8975f5c5SAndroid Build Coastguard Worker 
131*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
132*8975f5c5SAndroid Build Coastguard Worker 
133*8975f5c5SAndroid Build Coastguard Worker     // Draw to a depth-enabled framebuffer first
134*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo1;
135*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo1);
136*8975f5c5SAndroid Build Coastguard Worker 
137*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rb10;
138*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rb10);
139*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 128, 128);
140*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rb10);
141*8975f5c5SAndroid Build Coastguard Worker 
142*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rb1d;
143*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rb1d);
144*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT32F, 128, 128);
145*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rb1d);
146*8975f5c5SAndroid Build Coastguard Worker 
147*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
148*8975f5c5SAndroid Build Coastguard Worker 
149*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "a_position", 0.0f);
150*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
151*8975f5c5SAndroid Build Coastguard Worker 
152*8975f5c5SAndroid Build Coastguard Worker     // Draw to a no-depth framebuffer using the same program
153*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo2;
154*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo2);
155*8975f5c5SAndroid Build Coastguard Worker 
156*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rb20;
157*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rb20);
158*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_R8, 64, 64);
159*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rb20);
160*8975f5c5SAndroid Build Coastguard Worker 
161*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
162*8975f5c5SAndroid Build Coastguard Worker 
163*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "a_position", 0.0f);
164*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
165*8975f5c5SAndroid Build Coastguard Worker }
166*8975f5c5SAndroid Build Coastguard Worker 
167*8975f5c5SAndroid Build Coastguard Worker class FragDepthRedeclarationTest : public ANGLETest<>
168*8975f5c5SAndroid Build Coastguard Worker {};
169*8975f5c5SAndroid Build Coastguard Worker 
170*8975f5c5SAndroid Build Coastguard Worker // Test gl_FragDepth redeclared as vertex output
TEST_P(FragDepthRedeclarationTest,VSOutput)171*8975f5c5SAndroid Build Coastguard Worker TEST_P(FragDepthRedeclarationTest, VSOutput)
172*8975f5c5SAndroid Build Coastguard Worker {
173*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] = R"(#version 300 es
174*8975f5c5SAndroid Build Coastguard Worker #extension GL_EXT_conservative_depth: enable
175*8975f5c5SAndroid Build Coastguard Worker out highp float gl_FragDepth;
176*8975f5c5SAndroid Build Coastguard Worker void main() {
177*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(0.0, 0.0, 0.0, 1.0);
178*8975f5c5SAndroid Build Coastguard Worker     gl_FragDepth = 1.0;
179*8975f5c5SAndroid Build Coastguard Worker })";
180*8975f5c5SAndroid Build Coastguard Worker 
181*8975f5c5SAndroid Build Coastguard Worker     GLProgram prg;
182*8975f5c5SAndroid Build Coastguard Worker     prg.makeRaster(kVS, essl3_shaders::fs::Red());
183*8975f5c5SAndroid Build Coastguard Worker     EXPECT_FALSE(prg.valid());
184*8975f5c5SAndroid Build Coastguard Worker }
185*8975f5c5SAndroid Build Coastguard Worker 
186*8975f5c5SAndroid Build Coastguard Worker // Test gl_FragDepth redeclared as fragment input
TEST_P(FragDepthRedeclarationTest,FSInput)187*8975f5c5SAndroid Build Coastguard Worker TEST_P(FragDepthRedeclarationTest, FSInput)
188*8975f5c5SAndroid Build Coastguard Worker {
189*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 300 es
190*8975f5c5SAndroid Build Coastguard Worker #extension GL_EXT_conservative_depth: enable
191*8975f5c5SAndroid Build Coastguard Worker out highp vec4 color;
192*8975f5c5SAndroid Build Coastguard Worker in highp float gl_FragDepth;
193*8975f5c5SAndroid Build Coastguard Worker void main() {
194*8975f5c5SAndroid Build Coastguard Worker     color = vec4(gl_FragDepth, 0.0, 0.0, 1.0);
195*8975f5c5SAndroid Build Coastguard Worker })";
196*8975f5c5SAndroid Build Coastguard Worker 
197*8975f5c5SAndroid Build Coastguard Worker     GLProgram prg;
198*8975f5c5SAndroid Build Coastguard Worker     prg.makeRaster(essl3_shaders::vs::Simple(), kFS);
199*8975f5c5SAndroid Build Coastguard Worker     EXPECT_FALSE(prg.valid());
200*8975f5c5SAndroid Build Coastguard Worker }
201*8975f5c5SAndroid Build Coastguard Worker 
202*8975f5c5SAndroid Build Coastguard Worker // Test gl_FragDepth redeclaration with no layout qualifier
TEST_P(FragDepthRedeclarationTest,NoLayout)203*8975f5c5SAndroid Build Coastguard Worker TEST_P(FragDepthRedeclarationTest, NoLayout)
204*8975f5c5SAndroid Build Coastguard Worker {
205*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_conservative_depth"));
206*8975f5c5SAndroid Build Coastguard Worker 
207*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 300 es
208*8975f5c5SAndroid Build Coastguard Worker #extension GL_EXT_conservative_depth: require
209*8975f5c5SAndroid Build Coastguard Worker out highp vec4 color;
210*8975f5c5SAndroid Build Coastguard Worker out highp float gl_FragDepth;
211*8975f5c5SAndroid Build Coastguard Worker void main() {
212*8975f5c5SAndroid Build Coastguard Worker     color = vec4(1.0, 0.0, 0.0, 1.0);
213*8975f5c5SAndroid Build Coastguard Worker     gl_FragDepth = 1.0;
214*8975f5c5SAndroid Build Coastguard Worker })";
215*8975f5c5SAndroid Build Coastguard Worker 
216*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
217*8975f5c5SAndroid Build Coastguard Worker }
218*8975f5c5SAndroid Build Coastguard Worker 
219*8975f5c5SAndroid Build Coastguard Worker // Test gl_FragDepth redeclaration with depth_any layout qualifier
TEST_P(FragDepthRedeclarationTest,Any)220*8975f5c5SAndroid Build Coastguard Worker TEST_P(FragDepthRedeclarationTest, Any)
221*8975f5c5SAndroid Build Coastguard Worker {
222*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_conservative_depth"));
223*8975f5c5SAndroid Build Coastguard Worker 
224*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 300 es
225*8975f5c5SAndroid Build Coastguard Worker #extension GL_EXT_conservative_depth: require
226*8975f5c5SAndroid Build Coastguard Worker out highp vec4 color;
227*8975f5c5SAndroid Build Coastguard Worker layout (depth_any) out highp float gl_FragDepth;
228*8975f5c5SAndroid Build Coastguard Worker void main() {
229*8975f5c5SAndroid Build Coastguard Worker     color = vec4(1.0, 0.0, 0.0, 1.0);
230*8975f5c5SAndroid Build Coastguard Worker     gl_FragDepth = 1.0;
231*8975f5c5SAndroid Build Coastguard Worker })";
232*8975f5c5SAndroid Build Coastguard Worker 
233*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
234*8975f5c5SAndroid Build Coastguard Worker }
235*8975f5c5SAndroid Build Coastguard Worker 
236*8975f5c5SAndroid Build Coastguard Worker // Test gl_FragDepth redeclaration with depth_greater layout qualifier
TEST_P(FragDepthRedeclarationTest,Greater)237*8975f5c5SAndroid Build Coastguard Worker TEST_P(FragDepthRedeclarationTest, Greater)
238*8975f5c5SAndroid Build Coastguard Worker {
239*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_conservative_depth"));
240*8975f5c5SAndroid Build Coastguard Worker 
241*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 300 es
242*8975f5c5SAndroid Build Coastguard Worker #extension GL_EXT_conservative_depth: require
243*8975f5c5SAndroid Build Coastguard Worker out highp vec4 color;
244*8975f5c5SAndroid Build Coastguard Worker layout (depth_greater) out highp float gl_FragDepth;
245*8975f5c5SAndroid Build Coastguard Worker void main() {
246*8975f5c5SAndroid Build Coastguard Worker     color = vec4(1.0, 0.0, 0.0, 1.0);
247*8975f5c5SAndroid Build Coastguard Worker     gl_FragDepth = 1.0;
248*8975f5c5SAndroid Build Coastguard Worker })";
249*8975f5c5SAndroid Build Coastguard Worker 
250*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
251*8975f5c5SAndroid Build Coastguard Worker }
252*8975f5c5SAndroid Build Coastguard Worker 
253*8975f5c5SAndroid Build Coastguard Worker // Test gl_FragDepth redeclaration with depth_less layout qualifier
TEST_P(FragDepthRedeclarationTest,Less)254*8975f5c5SAndroid Build Coastguard Worker TEST_P(FragDepthRedeclarationTest, Less)
255*8975f5c5SAndroid Build Coastguard Worker {
256*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_conservative_depth"));
257*8975f5c5SAndroid Build Coastguard Worker 
258*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 300 es
259*8975f5c5SAndroid Build Coastguard Worker #extension GL_EXT_conservative_depth: require
260*8975f5c5SAndroid Build Coastguard Worker out highp vec4 color;
261*8975f5c5SAndroid Build Coastguard Worker layout (depth_less) out highp float gl_FragDepth;
262*8975f5c5SAndroid Build Coastguard Worker void main() {
263*8975f5c5SAndroid Build Coastguard Worker     color = vec4(1.0, 0.0, 0.0, 1.0);
264*8975f5c5SAndroid Build Coastguard Worker     gl_FragDepth = 1.0;
265*8975f5c5SAndroid Build Coastguard Worker })";
266*8975f5c5SAndroid Build Coastguard Worker 
267*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
268*8975f5c5SAndroid Build Coastguard Worker }
269*8975f5c5SAndroid Build Coastguard Worker 
270*8975f5c5SAndroid Build Coastguard Worker // Test gl_FragDepth redeclaration with depth_unchanged layout qualifier
TEST_P(FragDepthRedeclarationTest,Unchanged)271*8975f5c5SAndroid Build Coastguard Worker TEST_P(FragDepthRedeclarationTest, Unchanged)
272*8975f5c5SAndroid Build Coastguard Worker {
273*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_conservative_depth"));
274*8975f5c5SAndroid Build Coastguard Worker 
275*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(#version 300 es
276*8975f5c5SAndroid Build Coastguard Worker #extension GL_EXT_conservative_depth: require
277*8975f5c5SAndroid Build Coastguard Worker out highp vec4 color;
278*8975f5c5SAndroid Build Coastguard Worker layout (depth_unchanged) out highp float gl_FragDepth;
279*8975f5c5SAndroid Build Coastguard Worker void main() {
280*8975f5c5SAndroid Build Coastguard Worker     color = vec4(1.0, 0.0, 0.0, 1.0);
281*8975f5c5SAndroid Build Coastguard Worker     gl_FragDepth = 1.0;
282*8975f5c5SAndroid Build Coastguard Worker })";
283*8975f5c5SAndroid Build Coastguard Worker 
284*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Simple(), kFS);
285*8975f5c5SAndroid Build Coastguard Worker }
286*8975f5c5SAndroid Build Coastguard Worker 
287*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(FragDepthTest);
288*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(FragDepthTest);
289*8975f5c5SAndroid Build Coastguard Worker 
290*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(FragDepthRedeclarationTest);
291*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(FragDepthRedeclarationTest);
292