xref: /aosp_15_r20/external/angle/src/tests/gl_tests/ClipControlTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2023 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 // Test cases for GL_EXT_clip_control
7*8975f5c5SAndroid Build Coastguard Worker // These tests complement dEQP-GLES2.functional.clip_control.*
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 #include "util/EGLWindow.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "util/test_utils.h"
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
16*8975f5c5SAndroid Build Coastguard Worker 
17*8975f5c5SAndroid Build Coastguard Worker class ClipControlTest : public ANGLETest<>
18*8975f5c5SAndroid Build Coastguard Worker {
19*8975f5c5SAndroid Build Coastguard Worker   protected:
20*8975f5c5SAndroid Build Coastguard Worker     static const int w = 64;
21*8975f5c5SAndroid Build Coastguard Worker     static const int h = 64;
22*8975f5c5SAndroid Build Coastguard Worker 
ClipControlTest()23*8975f5c5SAndroid Build Coastguard Worker     ClipControlTest()
24*8975f5c5SAndroid Build Coastguard Worker     {
25*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(w);
26*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(h);
27*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
28*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
29*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
30*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
31*8975f5c5SAndroid Build Coastguard Worker         setConfigDepthBits(24);
32*8975f5c5SAndroid Build Coastguard Worker         setExtensionsEnabled(false);
33*8975f5c5SAndroid Build Coastguard Worker     }
34*8975f5c5SAndroid Build Coastguard Worker };
35*8975f5c5SAndroid Build Coastguard Worker 
36*8975f5c5SAndroid Build Coastguard Worker // Test state queries and updates
TEST_P(ClipControlTest,StateQuery)37*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClipControlTest, StateQuery)
38*8975f5c5SAndroid Build Coastguard Worker {
39*8975f5c5SAndroid Build Coastguard Worker     // Queries with the extension disabled
40*8975f5c5SAndroid Build Coastguard Worker     GLint clipOrigin = -1;
41*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_CLIP_ORIGIN_EXT, &clipOrigin);
42*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(clipOrigin, -1);
43*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
44*8975f5c5SAndroid Build Coastguard Worker     GLint clipDepthMode = -1;
45*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_CLIP_DEPTH_MODE_EXT, &clipDepthMode);
46*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(clipDepthMode, -1);
47*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
48*8975f5c5SAndroid Build Coastguard Worker 
49*8975f5c5SAndroid Build Coastguard Worker     // Command with the extension disabled
50*8975f5c5SAndroid Build Coastguard Worker     glClipControlEXT(GL_UPPER_LEFT_EXT, GL_ZERO_TO_ONE_EXT);
51*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
52*8975f5c5SAndroid Build Coastguard Worker 
53*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_clip_control"));
54*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
55*8975f5c5SAndroid Build Coastguard Worker 
56*8975f5c5SAndroid Build Coastguard Worker     // Default state with the extension enabled
57*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_CLIP_ORIGIN_EXT, &clipOrigin);
58*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_CLIP_DEPTH_MODE_EXT, &clipDepthMode);
59*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_LOWER_LEFT_EXT, clipOrigin);
60*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_NEGATIVE_ONE_TO_ONE_EXT, clipDepthMode);
61*8975f5c5SAndroid Build Coastguard Worker 
62*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
63*8975f5c5SAndroid Build Coastguard Worker 
64*8975f5c5SAndroid Build Coastguard Worker     // Check valid state updates
65*8975f5c5SAndroid Build Coastguard Worker     glClipControlEXT(GL_LOWER_LEFT_EXT, GL_NEGATIVE_ONE_TO_ONE_EXT);
66*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_CLIP_ORIGIN_EXT, &clipOrigin);
67*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_CLIP_DEPTH_MODE_EXT, &clipDepthMode);
68*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_LOWER_LEFT_EXT, clipOrigin);
69*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_NEGATIVE_ONE_TO_ONE_EXT, clipDepthMode);
70*8975f5c5SAndroid Build Coastguard Worker 
71*8975f5c5SAndroid Build Coastguard Worker     glClipControlEXT(GL_LOWER_LEFT_EXT, GL_ZERO_TO_ONE_EXT);
72*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_CLIP_ORIGIN_EXT, &clipOrigin);
73*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_CLIP_DEPTH_MODE_EXT, &clipDepthMode);
74*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_LOWER_LEFT_EXT, clipOrigin);
75*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_ZERO_TO_ONE_EXT, clipDepthMode);
76*8975f5c5SAndroid Build Coastguard Worker 
77*8975f5c5SAndroid Build Coastguard Worker     glClipControlEXT(GL_UPPER_LEFT_EXT, GL_NEGATIVE_ONE_TO_ONE_EXT);
78*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_CLIP_ORIGIN_EXT, &clipOrigin);
79*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_CLIP_DEPTH_MODE_EXT, &clipDepthMode);
80*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_UPPER_LEFT_EXT, clipOrigin);
81*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_NEGATIVE_ONE_TO_ONE_EXT, clipDepthMode);
82*8975f5c5SAndroid Build Coastguard Worker 
83*8975f5c5SAndroid Build Coastguard Worker     glClipControlEXT(GL_UPPER_LEFT_EXT, GL_ZERO_TO_ONE_EXT);
84*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_CLIP_ORIGIN_EXT, &clipOrigin);
85*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_CLIP_DEPTH_MODE_EXT, &clipDepthMode);
86*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_UPPER_LEFT_EXT, clipOrigin);
87*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_ZERO_TO_ONE_EXT, clipDepthMode);
88*8975f5c5SAndroid Build Coastguard Worker 
89*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
90*8975f5c5SAndroid Build Coastguard Worker 
91*8975f5c5SAndroid Build Coastguard Worker     // Check invalid state updates
92*8975f5c5SAndroid Build Coastguard Worker     glClipControlEXT(GL_LOWER_LEFT_EXT, 0);
93*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
94*8975f5c5SAndroid Build Coastguard Worker     glClipControlEXT(0, GL_NEGATIVE_ONE_TO_ONE_EXT);
95*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
96*8975f5c5SAndroid Build Coastguard Worker 
97*8975f5c5SAndroid Build Coastguard Worker     // Invalid command does not change the state
98*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_CLIP_ORIGIN_EXT, &clipOrigin);
99*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_CLIP_DEPTH_MODE_EXT, &clipDepthMode);
100*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_UPPER_LEFT_EXT, clipOrigin);
101*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GLENUM_EQ(GL_ZERO_TO_ONE_EXT, clipDepthMode);
102*8975f5c5SAndroid Build Coastguard Worker 
103*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
104*8975f5c5SAndroid Build Coastguard Worker }
105*8975f5c5SAndroid Build Coastguard Worker 
106*8975f5c5SAndroid Build Coastguard Worker // Test that clip origin does not affect scissored clears
TEST_P(ClipControlTest,OriginScissorClear)107*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClipControlTest, OriginScissorClear)
108*8975f5c5SAndroid Build Coastguard Worker {
109*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_clip_control"));
110*8975f5c5SAndroid Build Coastguard Worker 
111*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Blue());
112*8975f5c5SAndroid Build Coastguard Worker 
113*8975f5c5SAndroid Build Coastguard Worker     auto test = [&](std::string name, bool useES3) {
114*8975f5c5SAndroid Build Coastguard Worker         // Start with lower-left
115*8975f5c5SAndroid Build Coastguard Worker         glClipControlEXT(GL_LOWER_LEFT_EXT, GL_NEGATIVE_ONE_TO_ONE_EXT);
116*8975f5c5SAndroid Build Coastguard Worker 
117*8975f5c5SAndroid Build Coastguard Worker         // Make a draw call without color writes to sync the state
118*8975f5c5SAndroid Build Coastguard Worker         glColorMask(false, false, false, false);
119*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
120*8975f5c5SAndroid Build Coastguard Worker         glColorMask(true, true, true, true);
121*8975f5c5SAndroid Build Coastguard Worker 
122*8975f5c5SAndroid Build Coastguard Worker         // Clear to red
123*8975f5c5SAndroid Build Coastguard Worker         glDisable(GL_SCISSOR_TEST);
124*8975f5c5SAndroid Build Coastguard Worker         if (useES3)
125*8975f5c5SAndroid Build Coastguard Worker         {
126*8975f5c5SAndroid Build Coastguard Worker             float color[4] = {1.0, 0.0, 0.0, 1.0};
127*8975f5c5SAndroid Build Coastguard Worker             glClearBufferfv(GL_COLOR, 0, color);
128*8975f5c5SAndroid Build Coastguard Worker         }
129*8975f5c5SAndroid Build Coastguard Worker         else
130*8975f5c5SAndroid Build Coastguard Worker         {
131*8975f5c5SAndroid Build Coastguard Worker             glClearColor(1.0, 0.0, 0.0, 1.0);
132*8975f5c5SAndroid Build Coastguard Worker             glClear(GL_COLOR_BUFFER_BIT);
133*8975f5c5SAndroid Build Coastguard Worker         }
134*8975f5c5SAndroid Build Coastguard Worker 
135*8975f5c5SAndroid Build Coastguard Worker         // Flip the clip origin
136*8975f5c5SAndroid Build Coastguard Worker         glClipControlEXT(GL_UPPER_LEFT_EXT, GL_NEGATIVE_ONE_TO_ONE_EXT);
137*8975f5c5SAndroid Build Coastguard Worker 
138*8975f5c5SAndroid Build Coastguard Worker         // Make a draw call without color writes to sync the state
139*8975f5c5SAndroid Build Coastguard Worker         glColorMask(false, false, false, false);
140*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
141*8975f5c5SAndroid Build Coastguard Worker         glColorMask(true, true, true, true);
142*8975f5c5SAndroid Build Coastguard Worker 
143*8975f5c5SAndroid Build Coastguard Worker         // Clear lower half to green
144*8975f5c5SAndroid Build Coastguard Worker         glEnable(GL_SCISSOR_TEST);
145*8975f5c5SAndroid Build Coastguard Worker         glScissor(0, 0, w, h / 2);
146*8975f5c5SAndroid Build Coastguard Worker         if (useES3)
147*8975f5c5SAndroid Build Coastguard Worker         {
148*8975f5c5SAndroid Build Coastguard Worker             float color[4] = {0.0, 1.0, 0.0, 1.0};
149*8975f5c5SAndroid Build Coastguard Worker             glClearBufferfv(GL_COLOR, 0, color);
150*8975f5c5SAndroid Build Coastguard Worker         }
151*8975f5c5SAndroid Build Coastguard Worker         else
152*8975f5c5SAndroid Build Coastguard Worker         {
153*8975f5c5SAndroid Build Coastguard Worker             glClearColor(0.0, 1.0, 0.0, 1.0);
154*8975f5c5SAndroid Build Coastguard Worker             glClear(GL_COLOR_BUFFER_BIT);
155*8975f5c5SAndroid Build Coastguard Worker         }
156*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
157*8975f5c5SAndroid Build Coastguard Worker 
158*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0.5 * w, 0.25 * h, GLColor::green) << name;
159*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0.5 * w, 0.75 * h, GLColor::red) << name;
160*8975f5c5SAndroid Build Coastguard Worker     };
161*8975f5c5SAndroid Build Coastguard Worker 
162*8975f5c5SAndroid Build Coastguard Worker     test("Default framebuffer", getClientMajorVersion() > 2);
163*8975f5c5SAndroid Build Coastguard Worker 
164*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_OES_rgb8_rgba8"));
165*8975f5c5SAndroid Build Coastguard Worker 
166*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rb;
167*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rb);
168*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, w, h);
169*8975f5c5SAndroid Build Coastguard Worker 
170*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fb;
171*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fb);
172*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rb);
173*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
174*8975f5c5SAndroid Build Coastguard Worker 
175*8975f5c5SAndroid Build Coastguard Worker     test("User framebuffer", getClientMajorVersion() > 2);
176*8975f5c5SAndroid Build Coastguard Worker }
177*8975f5c5SAndroid Build Coastguard Worker 
178*8975f5c5SAndroid Build Coastguard Worker // Test that changing clip origin state does not affect location of scissor area
TEST_P(ClipControlTest,OriginScissorDraw)179*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClipControlTest, OriginScissorDraw)
180*8975f5c5SAndroid Build Coastguard Worker {
181*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_clip_control"));
182*8975f5c5SAndroid Build Coastguard Worker 
183*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] = R"(
184*8975f5c5SAndroid Build Coastguard Worker attribute vec2 a_position;
185*8975f5c5SAndroid Build Coastguard Worker void main()
186*8975f5c5SAndroid Build Coastguard Worker {
187*8975f5c5SAndroid Build Coastguard Worker     // Square at (0.25, 0.25) -> (0.75, 0.75)
188*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(a_position * 0.25 + 0.5, 0.0, 1.0);
189*8975f5c5SAndroid Build Coastguard Worker })";
190*8975f5c5SAndroid Build Coastguard Worker 
191*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, essl1_shaders::fs::Blue());
192*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
193*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
194*8975f5c5SAndroid Build Coastguard Worker 
195*8975f5c5SAndroid Build Coastguard Worker     auto test = [&](std::string name) {
196*8975f5c5SAndroid Build Coastguard Worker         glClipControlEXT(GL_LOWER_LEFT_EXT, GL_NEGATIVE_ONE_TO_ONE_EXT);
197*8975f5c5SAndroid Build Coastguard Worker 
198*8975f5c5SAndroid Build Coastguard Worker         glDisable(GL_SCISSOR_TEST);
199*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
200*8975f5c5SAndroid Build Coastguard Worker 
201*8975f5c5SAndroid Build Coastguard Worker         // Draw only to the lower half
202*8975f5c5SAndroid Build Coastguard Worker         glEnable(GL_SCISSOR_TEST);
203*8975f5c5SAndroid Build Coastguard Worker         glScissor(0, 0, w, h / 2);
204*8975f5c5SAndroid Build Coastguard Worker 
205*8975f5c5SAndroid Build Coastguard Worker         // Draw blue quad in the upper-right part of the framebuffer; scissor test must fail
206*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, "a_position", 0);
207*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
208*8975f5c5SAndroid Build Coastguard Worker 
209*8975f5c5SAndroid Build Coastguard Worker         // Switch the clip origin and draw again; scissor test must pass
210*8975f5c5SAndroid Build Coastguard Worker         glClipControlEXT(GL_UPPER_LEFT_EXT, GL_NEGATIVE_ONE_TO_ONE_EXT);
211*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, "a_position", 0);
212*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
213*8975f5c5SAndroid Build Coastguard Worker 
214*8975f5c5SAndroid Build Coastguard Worker         // Reads are unaffected by clip origin
215*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0.75 * w, 0.25 * h, GLColor::blue) << name;
216*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0.75 * w, 0.75 * h, GLColor::transparentBlack) << name;
217*8975f5c5SAndroid Build Coastguard Worker     };
218*8975f5c5SAndroid Build Coastguard Worker 
219*8975f5c5SAndroid Build Coastguard Worker     test("Default framebuffer");
220*8975f5c5SAndroid Build Coastguard Worker 
221*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fb;
222*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fb);
223*8975f5c5SAndroid Build Coastguard Worker 
224*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rb;
225*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rb);
226*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, w, h);
227*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rb);
228*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
229*8975f5c5SAndroid Build Coastguard Worker 
230*8975f5c5SAndroid Build Coastguard Worker     test("User framebuffer");
231*8975f5c5SAndroid Build Coastguard Worker }
232*8975f5c5SAndroid Build Coastguard Worker 
233*8975f5c5SAndroid Build Coastguard Worker // Test that changing clip origin state does not affect copyTexImage
TEST_P(ClipControlTest,OriginCopyTexImage)234*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClipControlTest, OriginCopyTexImage)
235*8975f5c5SAndroid Build Coastguard Worker {
236*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_clip_control"));
237*8975f5c5SAndroid Build Coastguard Worker 
238*8975f5c5SAndroid Build Coastguard Worker     auto test = [&](std::string name) {
239*8975f5c5SAndroid Build Coastguard Worker         glClipControlEXT(GL_LOWER_LEFT_EXT, GL_NEGATIVE_ONE_TO_ONE_EXT);
240*8975f5c5SAndroid Build Coastguard Worker 
241*8975f5c5SAndroid Build Coastguard Worker         // Clear to red
242*8975f5c5SAndroid Build Coastguard Worker         glDisable(GL_SCISSOR_TEST);
243*8975f5c5SAndroid Build Coastguard Worker         glClearColor(1.0, 0.0, 0.0, 1.0);
244*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
245*8975f5c5SAndroid Build Coastguard Worker 
246*8975f5c5SAndroid Build Coastguard Worker         // Clear lower half-space to green
247*8975f5c5SAndroid Build Coastguard Worker         glEnable(GL_SCISSOR_TEST);
248*8975f5c5SAndroid Build Coastguard Worker         glScissor(0, 0, w, h / 2);
249*8975f5c5SAndroid Build Coastguard Worker         glClearColor(0.0, 1.0, 0.0, 1.0);
250*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
251*8975f5c5SAndroid Build Coastguard Worker 
252*8975f5c5SAndroid Build Coastguard Worker         // Switch clip origin state, it must have no effect on the next commands
253*8975f5c5SAndroid Build Coastguard Worker         glClipControlEXT(GL_UPPER_LEFT_EXT, GL_NEGATIVE_ONE_TO_ONE_EXT);
254*8975f5c5SAndroid Build Coastguard Worker 
255*8975f5c5SAndroid Build Coastguard Worker         GLTexture tex;
256*8975f5c5SAndroid Build Coastguard Worker         glBindTexture(GL_TEXTURE_2D, tex);
257*8975f5c5SAndroid Build Coastguard Worker         glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, w / 4, h / 4, 0);
258*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
259*8975f5c5SAndroid Build Coastguard Worker 
260*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer readFb;
261*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, readFb);
262*8975f5c5SAndroid Build Coastguard Worker         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
263*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
264*8975f5c5SAndroid Build Coastguard Worker 
265*8975f5c5SAndroid Build Coastguard Worker         // Copied texture must contain values from the lower half-space
266*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w / 8, h / 8, GLColor::green) << name;
267*8975f5c5SAndroid Build Coastguard Worker     };
268*8975f5c5SAndroid Build Coastguard Worker 
269*8975f5c5SAndroid Build Coastguard Worker     test("Default framebuffer");
270*8975f5c5SAndroid Build Coastguard Worker 
271*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fb;
272*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fb);
273*8975f5c5SAndroid Build Coastguard Worker 
274*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rb;
275*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rb);
276*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, w, h);
277*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rb);
278*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
279*8975f5c5SAndroid Build Coastguard Worker 
280*8975f5c5SAndroid Build Coastguard Worker     test("User framebuffer");
281*8975f5c5SAndroid Build Coastguard Worker }
282*8975f5c5SAndroid Build Coastguard Worker 
283*8975f5c5SAndroid Build Coastguard Worker // Test that changing clip origin state does not affect copyTexImage
284*8975f5c5SAndroid Build Coastguard Worker // with Luma format that may use draw calls internally
TEST_P(ClipControlTest,OriginCopyTexImageLuma)285*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClipControlTest, OriginCopyTexImageLuma)
286*8975f5c5SAndroid Build Coastguard Worker {
287*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_clip_control"));
288*8975f5c5SAndroid Build Coastguard Worker 
289*8975f5c5SAndroid Build Coastguard Worker     glClipControlEXT(GL_LOWER_LEFT_EXT, GL_NEGATIVE_ONE_TO_ONE_EXT);
290*8975f5c5SAndroid Build Coastguard Worker 
291*8975f5c5SAndroid Build Coastguard Worker     // Clear to zero
292*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
293*8975f5c5SAndroid Build Coastguard Worker 
294*8975f5c5SAndroid Build Coastguard Worker     // Clear lower half-space to one
295*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
296*8975f5c5SAndroid Build Coastguard Worker     glScissor(0, 0, w, h / 2);
297*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0, 1.0, 1.0, 1.0);
298*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
299*8975f5c5SAndroid Build Coastguard Worker     glDisable(GL_SCISSOR_TEST);
300*8975f5c5SAndroid Build Coastguard Worker 
301*8975f5c5SAndroid Build Coastguard Worker     // Switch clip origin state, it must have no effect on the next commands
302*8975f5c5SAndroid Build Coastguard Worker     glClipControlEXT(GL_UPPER_LEFT_EXT, GL_NEGATIVE_ONE_TO_ONE_EXT);
303*8975f5c5SAndroid Build Coastguard Worker 
304*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
305*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
306*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
307*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
308*8975f5c5SAndroid Build Coastguard Worker     glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 0, 0, w, h, 0);
309*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
310*8975f5c5SAndroid Build Coastguard Worker 
311*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0, 0.0, 1.0, 1.0);
312*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
313*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::magenta);
314*8975f5c5SAndroid Build Coastguard Worker 
315*8975f5c5SAndroid Build Coastguard Worker     // Draw the luma texture
316*8975f5c5SAndroid Build Coastguard Worker     glClipControlEXT(GL_LOWER_LEFT_EXT, GL_NEGATIVE_ONE_TO_ONE_EXT);
317*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(drawTexture, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
318*8975f5c5SAndroid Build Coastguard Worker     drawQuad(drawTexture, essl1_shaders::PositionAttrib(), 0.0f);
319*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
320*8975f5c5SAndroid Build Coastguard Worker 
321*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(w / 2, h * 1 / 4, GLColor::white);
322*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(w / 2, h * 3 / 4, GLColor::black);
323*8975f5c5SAndroid Build Coastguard Worker }
324*8975f5c5SAndroid Build Coastguard Worker 
325*8975f5c5SAndroid Build Coastguard Worker // Test that clip origin does not affect gl_FragCoord
TEST_P(ClipControlTest,OriginFragCoord)326*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClipControlTest, OriginFragCoord)
327*8975f5c5SAndroid Build Coastguard Worker {
328*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_clip_control"));
329*8975f5c5SAndroid Build Coastguard Worker 
330*8975f5c5SAndroid Build Coastguard Worker     const char kFS[] = R"(precision mediump float;
331*8975f5c5SAndroid Build Coastguard Worker void main()
332*8975f5c5SAndroid Build Coastguard Worker {
333*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = vec4(sign(gl_FragCoord.xy / 64.0 - 0.5), 0.0, 1.0);
334*8975f5c5SAndroid Build Coastguard Worker })";
335*8975f5c5SAndroid Build Coastguard Worker 
336*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), kFS);
337*8975f5c5SAndroid Build Coastguard Worker 
338*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0, 0.0, 1.0, 1.0);
339*8975f5c5SAndroid Build Coastguard Worker 
340*8975f5c5SAndroid Build Coastguard Worker     for (GLenum origin : {GL_LOWER_LEFT_EXT, GL_UPPER_LEFT_EXT})
341*8975f5c5SAndroid Build Coastguard Worker     {
342*8975f5c5SAndroid Build Coastguard Worker         glClipControlEXT(origin, GL_NEGATIVE_ONE_TO_ONE_EXT);
343*8975f5c5SAndroid Build Coastguard Worker 
344*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, 0);
345*8975f5c5SAndroid Build Coastguard Worker 
346*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
347*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
348*8975f5c5SAndroid Build Coastguard Worker 
349*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
350*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w - 1, 0, GLColor::red);
351*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, h - 1, GLColor::green);
352*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w - 1, h - 1, GLColor::yellow);
353*8975f5c5SAndroid Build Coastguard Worker 
354*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer fb;
355*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, fb);
356*8975f5c5SAndroid Build Coastguard Worker 
357*8975f5c5SAndroid Build Coastguard Worker         GLRenderbuffer rb;
358*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, rb);
359*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, w, h);
360*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rb);
361*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
362*8975f5c5SAndroid Build Coastguard Worker 
363*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
364*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
365*8975f5c5SAndroid Build Coastguard Worker 
366*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
367*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w - 1, 0, GLColor::red);
368*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, h - 1, GLColor::green);
369*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w - 1, h - 1, GLColor::yellow);
370*8975f5c5SAndroid Build Coastguard Worker     }
371*8975f5c5SAndroid Build Coastguard Worker }
372*8975f5c5SAndroid Build Coastguard Worker 
373*8975f5c5SAndroid Build Coastguard Worker // Test that clip origin does not affect gl_PointCoord
TEST_P(ClipControlTest,OriginPointCoord)374*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClipControlTest, OriginPointCoord)
375*8975f5c5SAndroid Build Coastguard Worker {
376*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_clip_control"));
377*8975f5c5SAndroid Build Coastguard Worker 
378*8975f5c5SAndroid Build Coastguard Worker     float pointSizeRange[2] = {};
379*8975f5c5SAndroid Build Coastguard Worker     glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, pointSizeRange);
380*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(pointSizeRange[1] < 32);
381*8975f5c5SAndroid Build Coastguard Worker 
382*8975f5c5SAndroid Build Coastguard Worker     const char kVS[] = R"(precision mediump float;
383*8975f5c5SAndroid Build Coastguard Worker void main()
384*8975f5c5SAndroid Build Coastguard Worker {
385*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(0.0, 0.0, 0.0, 1.0);
386*8975f5c5SAndroid Build Coastguard Worker     gl_PointSize = 32.0;
387*8975f5c5SAndroid Build Coastguard Worker })";
388*8975f5c5SAndroid Build Coastguard Worker 
389*8975f5c5SAndroid Build Coastguard Worker     const char kFS[] = R"(precision mediump float;
390*8975f5c5SAndroid Build Coastguard Worker void main()
391*8975f5c5SAndroid Build Coastguard Worker {
392*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = vec4(sign(gl_PointCoord.xy - 0.5), 0.0, 1.0);
393*8975f5c5SAndroid Build Coastguard Worker })";
394*8975f5c5SAndroid Build Coastguard Worker 
395*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
396*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
397*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
398*8975f5c5SAndroid Build Coastguard Worker 
399*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0, 0.0, 1.0, 1.0);
400*8975f5c5SAndroid Build Coastguard Worker 
401*8975f5c5SAndroid Build Coastguard Worker     for (GLenum origin : {GL_LOWER_LEFT_EXT, GL_UPPER_LEFT_EXT})
402*8975f5c5SAndroid Build Coastguard Worker     {
403*8975f5c5SAndroid Build Coastguard Worker         glClipControlEXT(origin, GL_NEGATIVE_ONE_TO_ONE_EXT);
404*8975f5c5SAndroid Build Coastguard Worker 
405*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, 0);
406*8975f5c5SAndroid Build Coastguard Worker 
407*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
408*8975f5c5SAndroid Build Coastguard Worker         glDrawArrays(GL_POINTS, 0, 1);
409*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
410*8975f5c5SAndroid Build Coastguard Worker 
411*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w / 2 - 15, h / 2 + 15, GLColor::black);
412*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w / 2 + 15, h / 2 + 15, GLColor::red);
413*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w / 2 - 15, h / 2 - 15, GLColor::green);
414*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w / 2 + 15, h / 2 - 15, GLColor::yellow);
415*8975f5c5SAndroid Build Coastguard Worker 
416*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer fb;
417*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, fb);
418*8975f5c5SAndroid Build Coastguard Worker 
419*8975f5c5SAndroid Build Coastguard Worker         GLRenderbuffer rb;
420*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, rb);
421*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, w, h);
422*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rb);
423*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
424*8975f5c5SAndroid Build Coastguard Worker 
425*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
426*8975f5c5SAndroid Build Coastguard Worker         glDrawArrays(GL_POINTS, 0, 1);
427*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
428*8975f5c5SAndroid Build Coastguard Worker 
429*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w / 2 - 15, h / 2 + 15, GLColor::black);
430*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w / 2 + 15, h / 2 + 15, GLColor::red);
431*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w / 2 - 15, h / 2 - 15, GLColor::green);
432*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(w / 2 + 15, h / 2 - 15, GLColor::yellow);
433*8975f5c5SAndroid Build Coastguard Worker     }
434*8975f5c5SAndroid Build Coastguard Worker }
435*8975f5c5SAndroid Build Coastguard Worker 
436*8975f5c5SAndroid Build Coastguard Worker // Test that clip origin does not affect gl_FrontFacing
TEST_P(ClipControlTest,OriginFrontFacing)437*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClipControlTest, OriginFrontFacing)
438*8975f5c5SAndroid Build Coastguard Worker {
439*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_clip_control"));
440*8975f5c5SAndroid Build Coastguard Worker 
441*8975f5c5SAndroid Build Coastguard Worker     const char kFS[] = R"(precision mediump float;
442*8975f5c5SAndroid Build Coastguard Worker void main()
443*8975f5c5SAndroid Build Coastguard Worker {
444*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = vec4(gl_FrontFacing ? vec2(1.0, 0.0) : vec2(0.0, 1.0), 0.0, 1.0);
445*8975f5c5SAndroid Build Coastguard Worker })";
446*8975f5c5SAndroid Build Coastguard Worker 
447*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), kFS);
448*8975f5c5SAndroid Build Coastguard Worker 
449*8975f5c5SAndroid Build Coastguard Worker     for (GLenum origin : {GL_LOWER_LEFT_EXT, GL_UPPER_LEFT_EXT})
450*8975f5c5SAndroid Build Coastguard Worker     {
451*8975f5c5SAndroid Build Coastguard Worker         glClipControlEXT(origin, GL_NEGATIVE_ONE_TO_ONE_EXT);
452*8975f5c5SAndroid Build Coastguard Worker 
453*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, 0);
454*8975f5c5SAndroid Build Coastguard Worker 
455*8975f5c5SAndroid Build Coastguard Worker         glFrontFace(GL_CCW);
456*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
457*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
458*8975f5c5SAndroid Build Coastguard Worker 
459*8975f5c5SAndroid Build Coastguard Worker         glFrontFace(GL_CW);
460*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
461*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
462*8975f5c5SAndroid Build Coastguard Worker 
463*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer fb;
464*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_FRAMEBUFFER, fb);
465*8975f5c5SAndroid Build Coastguard Worker 
466*8975f5c5SAndroid Build Coastguard Worker         GLRenderbuffer rb;
467*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, rb);
468*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, w, h);
469*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rb);
470*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
471*8975f5c5SAndroid Build Coastguard Worker 
472*8975f5c5SAndroid Build Coastguard Worker         glFrontFace(GL_CCW);
473*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
474*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
475*8975f5c5SAndroid Build Coastguard Worker 
476*8975f5c5SAndroid Build Coastguard Worker         glFrontFace(GL_CW);
477*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
478*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
479*8975f5c5SAndroid Build Coastguard Worker     }
480*8975f5c5SAndroid Build Coastguard Worker }
481*8975f5c5SAndroid Build Coastguard Worker 
482*8975f5c5SAndroid Build Coastguard Worker // Test that clip origin does not affect readPixels
TEST_P(ClipControlTest,OriginReadPixels)483*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClipControlTest, OriginReadPixels)
484*8975f5c5SAndroid Build Coastguard Worker {
485*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_clip_control"));
486*8975f5c5SAndroid Build Coastguard Worker 
487*8975f5c5SAndroid Build Coastguard Worker     const char kFS[] = R"(precision mediump float;
488*8975f5c5SAndroid Build Coastguard Worker uniform float blue;
489*8975f5c5SAndroid Build Coastguard Worker varying vec4 v_position;
490*8975f5c5SAndroid Build Coastguard Worker void main()
491*8975f5c5SAndroid Build Coastguard Worker {
492*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = (v_position.y > 0.0) ? vec4(1.0, 0.0, blue, 1.0) : vec4(0.0, 1.0, blue, 1.0);
493*8975f5c5SAndroid Build Coastguard Worker })";
494*8975f5c5SAndroid Build Coastguard Worker 
495*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Passthrough(), kFS);
496*8975f5c5SAndroid Build Coastguard Worker     const GLint blueUniformLocation = glGetUniformLocation(program, "blue");
497*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
498*8975f5c5SAndroid Build Coastguard Worker 
499*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
500*8975f5c5SAndroid Build Coastguard Worker 
501*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
502*8975f5c5SAndroid Build Coastguard Worker 
503*8975f5c5SAndroid Build Coastguard Worker     glUniform1f(blueUniformLocation, 0.0f);
504*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
505*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, h / 2 + 2, w, h / 2 - 2, GLColor::red);
506*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, w, h / 2 - 2, GLColor::green);
507*8975f5c5SAndroid Build Coastguard Worker 
508*8975f5c5SAndroid Build Coastguard Worker     // Update clip origin and make a draw call that fails the depth test to
509*8975f5c5SAndroid Build Coastguard Worker     // ensure that the backend is synced while the framebuffer is unchanged.
510*8975f5c5SAndroid Build Coastguard Worker     glClipControlEXT(GL_UPPER_LEFT_EXT, GL_NEGATIVE_ONE_TO_ONE_EXT);
511*8975f5c5SAndroid Build Coastguard Worker     glUniform1f(blueUniformLocation, 1.0f);
512*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 1.0);
513*8975f5c5SAndroid Build Coastguard Worker 
514*8975f5c5SAndroid Build Coastguard Worker     // Check that the second draw call has failed the depth test and
515*8975f5c5SAndroid Build Coastguard Worker     // reading from the framebuffer returns the same values as before.
516*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, h / 2 + 2, w, h / 2 - 2, GLColor::red);
517*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, w, h / 2 - 2, GLColor::green);
518*8975f5c5SAndroid Build Coastguard Worker }
519*8975f5c5SAndroid Build Coastguard Worker 
520*8975f5c5SAndroid Build Coastguard Worker // Test that changing only the clip depth mode syncs the state correctly
TEST_P(ClipControlTest,DepthModeSimple)521*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClipControlTest, DepthModeSimple)
522*8975f5c5SAndroid Build Coastguard Worker {
523*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_clip_control"));
524*8975f5c5SAndroid Build Coastguard Worker 
525*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
526*8975f5c5SAndroid Build Coastguard Worker     const GLint colorUniformLocation = glGetUniformLocation(program, essl1_shaders::ColorUniform());
527*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
528*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
529*8975f5c5SAndroid Build Coastguard Worker 
530*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
531*8975f5c5SAndroid Build Coastguard Worker 
532*8975f5c5SAndroid Build Coastguard Worker     glUniform4fv(colorUniformLocation, 1, GLColor::red.toNormalizedVector().data());
533*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
534*8975f5c5SAndroid Build Coastguard Worker 
535*8975f5c5SAndroid Build Coastguard Worker     glClipControlEXT(GL_LOWER_LEFT_EXT, GL_ZERO_TO_ONE_EXT);
536*8975f5c5SAndroid Build Coastguard Worker 
537*8975f5c5SAndroid Build Coastguard Worker     glUniform4fv(colorUniformLocation, 1, GLColor::green.toNormalizedVector().data());
538*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
539*8975f5c5SAndroid Build Coastguard Worker 
540*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
541*8975f5c5SAndroid Build Coastguard Worker }
542*8975f5c5SAndroid Build Coastguard Worker 
543*8975f5c5SAndroid Build Coastguard Worker // Test that gl_FragCoord.z has expected values for ZERO_TO_ONE clip depth mode
TEST_P(ClipControlTest,DepthFragCoord)544*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClipControlTest, DepthFragCoord)
545*8975f5c5SAndroid Build Coastguard Worker {
546*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_clip_control"));
547*8975f5c5SAndroid Build Coastguard Worker 
548*8975f5c5SAndroid Build Coastguard Worker     const char kFS[] = R"(precision mediump float;
549*8975f5c5SAndroid Build Coastguard Worker void main()
550*8975f5c5SAndroid Build Coastguard Worker {
551*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = vec4(gl_FragCoord.z, 0, 0, 1);
552*8975f5c5SAndroid Build Coastguard Worker })";
553*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), kFS);
554*8975f5c5SAndroid Build Coastguard Worker 
555*8975f5c5SAndroid Build Coastguard Worker     glClipControlEXT(GL_LOWER_LEFT_EXT, GL_ZERO_TO_ONE_EXT);
556*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
557*8975f5c5SAndroid Build Coastguard Worker 
558*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 1.0);
559*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
560*8975f5c5SAndroid Build Coastguard Worker 
561*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.5);
562*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(127, 0, 0, 255), 1);
563*8975f5c5SAndroid Build Coastguard Worker 
564*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
565*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::black);
566*8975f5c5SAndroid Build Coastguard Worker }
567*8975f5c5SAndroid Build Coastguard Worker 
568*8975f5c5SAndroid Build Coastguard Worker class ClipControlTestES3 : public ClipControlTest
569*8975f5c5SAndroid Build Coastguard Worker {};
570*8975f5c5SAndroid Build Coastguard Worker 
571*8975f5c5SAndroid Build Coastguard Worker // Test that clip origin state does not affect framebuffer blits
TEST_P(ClipControlTestES3,OriginBlit)572*8975f5c5SAndroid Build Coastguard Worker TEST_P(ClipControlTestES3, OriginBlit)
573*8975f5c5SAndroid Build Coastguard Worker {
574*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_EXT_clip_control"));
575*8975f5c5SAndroid Build Coastguard Worker 
576*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(
577*8975f5c5SAndroid Build Coastguard Worker precision mediump float;
578*8975f5c5SAndroid Build Coastguard Worker varying vec4 v_position;
579*8975f5c5SAndroid Build Coastguard Worker void main()
580*8975f5c5SAndroid Build Coastguard Worker {
581*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = vec4(sign(v_position.xy), 0.0, 1.0);
582*8975f5c5SAndroid Build Coastguard Worker })";
583*8975f5c5SAndroid Build Coastguard Worker 
584*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Passthrough(), kFS);
585*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
586*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
587*8975f5c5SAndroid Build Coastguard Worker 
588*8975f5c5SAndroid Build Coastguard Worker     // Blit default to custom
589*8975f5c5SAndroid Build Coastguard Worker     {
590*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer fb;
591*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb);
592*8975f5c5SAndroid Build Coastguard Worker 
593*8975f5c5SAndroid Build Coastguard Worker         GLRenderbuffer rb;
594*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, rb);
595*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, w, h);
596*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rb);
597*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
598*8975f5c5SAndroid Build Coastguard Worker 
599*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
600*8975f5c5SAndroid Build Coastguard Worker         glClipControlEXT(GL_LOWER_LEFT_EXT, GL_NEGATIVE_ONE_TO_ONE_EXT);
601*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, "a_position", 0);
602*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
603*8975f5c5SAndroid Build Coastguard Worker 
604*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
605*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb);
606*8975f5c5SAndroid Build Coastguard Worker         glClipControlEXT(GL_UPPER_LEFT_EXT, GL_NEGATIVE_ONE_TO_ONE_EXT);
607*8975f5c5SAndroid Build Coastguard Worker         glBlitFramebuffer(0, 0, w, h, 0, 0, w, h, GL_COLOR_BUFFER_BIT, GL_NEAREST);
608*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
609*8975f5c5SAndroid Build Coastguard Worker 
610*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, fb);
611*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0.25 * w, 0.25 * h, GLColor::black);
612*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0.75 * w, 0.25 * h, GLColor::red);
613*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0.25 * w, 0.75 * h, GLColor::green);
614*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0.75 * w, 0.75 * h, GLColor::yellow);
615*8975f5c5SAndroid Build Coastguard Worker     }
616*8975f5c5SAndroid Build Coastguard Worker 
617*8975f5c5SAndroid Build Coastguard Worker     // Blit custom to default
618*8975f5c5SAndroid Build Coastguard Worker     {
619*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer fb;
620*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb);
621*8975f5c5SAndroid Build Coastguard Worker 
622*8975f5c5SAndroid Build Coastguard Worker         GLRenderbuffer rb;
623*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, rb);
624*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, w, h);
625*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rb);
626*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
627*8975f5c5SAndroid Build Coastguard Worker 
628*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb);
629*8975f5c5SAndroid Build Coastguard Worker         glClipControlEXT(GL_LOWER_LEFT_EXT, GL_NEGATIVE_ONE_TO_ONE_EXT);
630*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, "a_position", 0);
631*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
632*8975f5c5SAndroid Build Coastguard Worker 
633*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, fb);
634*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
635*8975f5c5SAndroid Build Coastguard Worker         glClipControlEXT(GL_UPPER_LEFT_EXT, GL_NEGATIVE_ONE_TO_ONE_EXT);
636*8975f5c5SAndroid Build Coastguard Worker         glBlitFramebuffer(0, 0, w, h, 0, 0, w, h, GL_COLOR_BUFFER_BIT, GL_NEAREST);
637*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
638*8975f5c5SAndroid Build Coastguard Worker 
639*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
640*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0.25 * w, 0.25 * h, GLColor::black);
641*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0.75 * w, 0.25 * h, GLColor::red);
642*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0.25 * w, 0.75 * h, GLColor::green);
643*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0.75 * w, 0.75 * h, GLColor::yellow);
644*8975f5c5SAndroid Build Coastguard Worker     }
645*8975f5c5SAndroid Build Coastguard Worker 
646*8975f5c5SAndroid Build Coastguard Worker     // Blit custom to custom
647*8975f5c5SAndroid Build Coastguard Worker     {
648*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer fb1;
649*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb1);
650*8975f5c5SAndroid Build Coastguard Worker 
651*8975f5c5SAndroid Build Coastguard Worker         GLRenderbuffer rb1;
652*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, rb1);
653*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, w, h);
654*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rb1);
655*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
656*8975f5c5SAndroid Build Coastguard Worker 
657*8975f5c5SAndroid Build Coastguard Worker         GLFramebuffer fb2;
658*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb2);
659*8975f5c5SAndroid Build Coastguard Worker 
660*8975f5c5SAndroid Build Coastguard Worker         GLRenderbuffer rb2;
661*8975f5c5SAndroid Build Coastguard Worker         glBindRenderbuffer(GL_RENDERBUFFER, rb2);
662*8975f5c5SAndroid Build Coastguard Worker         glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, w, h);
663*8975f5c5SAndroid Build Coastguard Worker         glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rb2);
664*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_DRAW_FRAMEBUFFER);
665*8975f5c5SAndroid Build Coastguard Worker 
666*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb1);
667*8975f5c5SAndroid Build Coastguard Worker         glClipControlEXT(GL_LOWER_LEFT_EXT, GL_NEGATIVE_ONE_TO_ONE_EXT);
668*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, "a_position", 0);
669*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
670*8975f5c5SAndroid Build Coastguard Worker 
671*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, fb1);
672*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb2);
673*8975f5c5SAndroid Build Coastguard Worker         glClipControlEXT(GL_UPPER_LEFT_EXT, GL_NEGATIVE_ONE_TO_ONE_EXT);
674*8975f5c5SAndroid Build Coastguard Worker         glBlitFramebuffer(0, 0, w, h, 0, 0, w, h, GL_COLOR_BUFFER_BIT, GL_NEAREST);
675*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
676*8975f5c5SAndroid Build Coastguard Worker 
677*8975f5c5SAndroid Build Coastguard Worker         glBindFramebuffer(GL_READ_FRAMEBUFFER, fb2);
678*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0.25 * w, 0.25 * h, GLColor::black);
679*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0.75 * w, 0.25 * h, GLColor::red);
680*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0.25 * w, 0.75 * h, GLColor::green);
681*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0.75 * w, 0.75 * h, GLColor::yellow);
682*8975f5c5SAndroid Build Coastguard Worker     }
683*8975f5c5SAndroid Build Coastguard Worker }
684*8975f5c5SAndroid Build Coastguard Worker 
685*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2_AND_ES3_AND(ClipControlTest,
686*8975f5c5SAndroid Build Coastguard Worker                                        ES2_OPENGLES().enable(Feature::EmulateClipOrigin),
687*8975f5c5SAndroid Build Coastguard Worker                                        ES3_OPENGLES().enable(Feature::EmulateClipOrigin));
688*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3_AND(ClipControlTestES3,
689*8975f5c5SAndroid Build Coastguard Worker                                ES3_OPENGLES().enable(Feature::EmulateClipOrigin));
690