xref: /aosp_15_r20/external/angle/src/tests/gl_tests/PolygonModeTest.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 // PolygonModeTest.cpp: Test cases for GL_NV_polygon_mode and GL_ANGLE_polygon_mode
7*8975f5c5SAndroid Build Coastguard Worker //
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
10*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker class PolygonModeTest : public ANGLETest<>
15*8975f5c5SAndroid Build Coastguard Worker {
16*8975f5c5SAndroid Build Coastguard Worker   protected:
PolygonModeTest()17*8975f5c5SAndroid Build Coastguard Worker     PolygonModeTest()
18*8975f5c5SAndroid Build Coastguard Worker     {
19*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
20*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
21*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
22*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
23*8975f5c5SAndroid Build Coastguard Worker         setConfigDepthBits(24);
24*8975f5c5SAndroid Build Coastguard Worker         setExtensionsEnabled(false);
25*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(16);
26*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(16);
27*8975f5c5SAndroid Build Coastguard Worker     }
28*8975f5c5SAndroid Build Coastguard Worker };
29*8975f5c5SAndroid Build Coastguard Worker 
30*8975f5c5SAndroid Build Coastguard Worker // New state queries and commands fail without the extension
TEST_P(PolygonModeTest,NoExtension)31*8975f5c5SAndroid Build Coastguard Worker TEST_P(PolygonModeTest, NoExtension)
32*8975f5c5SAndroid Build Coastguard Worker {
33*8975f5c5SAndroid Build Coastguard Worker     {
34*8975f5c5SAndroid Build Coastguard Worker         GLint mode = 0;
35*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_POLYGON_MODE_NV, &mode);
36*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
37*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(mode, 0);
38*8975f5c5SAndroid Build Coastguard Worker 
39*8975f5c5SAndroid Build Coastguard Worker         glPolygonModeNV(GL_FRONT_AND_BACK, GL_FILL_NV);
40*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_OPERATION);
41*8975f5c5SAndroid Build Coastguard Worker 
42*8975f5c5SAndroid Build Coastguard Worker         glPolygonModeANGLE(GL_FRONT_AND_BACK, GL_FILL_NV);
43*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_OPERATION);
44*8975f5c5SAndroid Build Coastguard Worker     }
45*8975f5c5SAndroid Build Coastguard Worker     for (GLenum state : {GL_POLYGON_OFFSET_POINT_NV, GL_POLYGON_OFFSET_LINE_NV})
46*8975f5c5SAndroid Build Coastguard Worker     {
47*8975f5c5SAndroid Build Coastguard Worker         EXPECT_FALSE(glIsEnabled(state));
48*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
49*8975f5c5SAndroid Build Coastguard Worker 
50*8975f5c5SAndroid Build Coastguard Worker         GLboolean enabled = true;
51*8975f5c5SAndroid Build Coastguard Worker         glGetBooleanv(state, &enabled);
52*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
53*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(enabled);
54*8975f5c5SAndroid Build Coastguard Worker 
55*8975f5c5SAndroid Build Coastguard Worker         glEnable(state);
56*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
57*8975f5c5SAndroid Build Coastguard Worker 
58*8975f5c5SAndroid Build Coastguard Worker         glDisable(state);
59*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
60*8975f5c5SAndroid Build Coastguard Worker     }
61*8975f5c5SAndroid Build Coastguard Worker }
62*8975f5c5SAndroid Build Coastguard Worker 
63*8975f5c5SAndroid Build Coastguard Worker // Test NV_polygon_mode entrypoints
TEST_P(PolygonModeTest,ExtensionStateNV)64*8975f5c5SAndroid Build Coastguard Worker TEST_P(PolygonModeTest, ExtensionStateNV)
65*8975f5c5SAndroid Build Coastguard Worker {
66*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_NV_polygon_mode"));
67*8975f5c5SAndroid Build Coastguard Worker 
68*8975f5c5SAndroid Build Coastguard Worker     // Default state
69*8975f5c5SAndroid Build Coastguard Worker     {
70*8975f5c5SAndroid Build Coastguard Worker         GLint mode = 0;
71*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_POLYGON_MODE_NV, &mode);
72*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GLENUM_EQ(GL_FILL_NV, mode);
73*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
74*8975f5c5SAndroid Build Coastguard Worker     }
75*8975f5c5SAndroid Build Coastguard Worker     for (GLenum state : {GL_POLYGON_OFFSET_POINT_NV, GL_POLYGON_OFFSET_LINE_NV})
76*8975f5c5SAndroid Build Coastguard Worker     {
77*8975f5c5SAndroid Build Coastguard Worker         EXPECT_FALSE(glIsEnabled(state));
78*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
79*8975f5c5SAndroid Build Coastguard Worker 
80*8975f5c5SAndroid Build Coastguard Worker         GLboolean enabled = true;
81*8975f5c5SAndroid Build Coastguard Worker         glGetBooleanv(state, &enabled);
82*8975f5c5SAndroid Build Coastguard Worker         EXPECT_FALSE(enabled);
83*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
84*8975f5c5SAndroid Build Coastguard Worker     }
85*8975f5c5SAndroid Build Coastguard Worker 
86*8975f5c5SAndroid Build Coastguard Worker     // Polygon mode state updates
87*8975f5c5SAndroid Build Coastguard Worker     for (GLenum mode : {GL_POINT_NV, GL_LINE_NV, GL_FILL_NV})
88*8975f5c5SAndroid Build Coastguard Worker     {
89*8975f5c5SAndroid Build Coastguard Worker         glPolygonModeNV(GL_FRONT_AND_BACK, mode);
90*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
91*8975f5c5SAndroid Build Coastguard Worker 
92*8975f5c5SAndroid Build Coastguard Worker         GLint result = 0;
93*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_POLYGON_MODE_NV, &result);
94*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GLENUM_EQ(mode, result);
95*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
96*8975f5c5SAndroid Build Coastguard Worker     }
97*8975f5c5SAndroid Build Coastguard Worker 
98*8975f5c5SAndroid Build Coastguard Worker     // Polygon offset state updates
99*8975f5c5SAndroid Build Coastguard Worker     for (GLenum state : {GL_POLYGON_OFFSET_POINT_NV, GL_POLYGON_OFFSET_LINE_NV})
100*8975f5c5SAndroid Build Coastguard Worker     {
101*8975f5c5SAndroid Build Coastguard Worker         GLboolean enabled = false;
102*8975f5c5SAndroid Build Coastguard Worker 
103*8975f5c5SAndroid Build Coastguard Worker         glEnable(state);
104*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
105*8975f5c5SAndroid Build Coastguard Worker 
106*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(glIsEnabled(state));
107*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
108*8975f5c5SAndroid Build Coastguard Worker 
109*8975f5c5SAndroid Build Coastguard Worker         glGetBooleanv(state, &enabled);
110*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
111*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(enabled);
112*8975f5c5SAndroid Build Coastguard Worker 
113*8975f5c5SAndroid Build Coastguard Worker         glDisable(state);
114*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
115*8975f5c5SAndroid Build Coastguard Worker 
116*8975f5c5SAndroid Build Coastguard Worker         EXPECT_FALSE(glIsEnabled(state));
117*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
118*8975f5c5SAndroid Build Coastguard Worker 
119*8975f5c5SAndroid Build Coastguard Worker         glGetBooleanv(state, &enabled);
120*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
121*8975f5c5SAndroid Build Coastguard Worker         EXPECT_FALSE(enabled);
122*8975f5c5SAndroid Build Coastguard Worker     }
123*8975f5c5SAndroid Build Coastguard Worker 
124*8975f5c5SAndroid Build Coastguard Worker     // Errors
125*8975f5c5SAndroid Build Coastguard Worker     {
126*8975f5c5SAndroid Build Coastguard Worker         glPolygonModeNV(GL_FRONT, GL_FILL_NV);
127*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
128*8975f5c5SAndroid Build Coastguard Worker 
129*8975f5c5SAndroid Build Coastguard Worker         glPolygonModeNV(GL_BACK, GL_FILL_NV);
130*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
131*8975f5c5SAndroid Build Coastguard Worker 
132*8975f5c5SAndroid Build Coastguard Worker         glPolygonModeNV(GL_FRONT_AND_BACK, 0);
133*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
134*8975f5c5SAndroid Build Coastguard Worker     }
135*8975f5c5SAndroid Build Coastguard Worker }
136*8975f5c5SAndroid Build Coastguard Worker 
137*8975f5c5SAndroid Build Coastguard Worker // Test ANGLE_polygon_mode entrypoints
TEST_P(PolygonModeTest,ExtensionStateANGLE)138*8975f5c5SAndroid Build Coastguard Worker TEST_P(PolygonModeTest, ExtensionStateANGLE)
139*8975f5c5SAndroid Build Coastguard Worker {
140*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_polygon_mode"));
141*8975f5c5SAndroid Build Coastguard Worker 
142*8975f5c5SAndroid Build Coastguard Worker     // Default state
143*8975f5c5SAndroid Build Coastguard Worker     {
144*8975f5c5SAndroid Build Coastguard Worker         GLint mode = 0;
145*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_POLYGON_MODE_ANGLE, &mode);
146*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GLENUM_EQ(GL_FILL_ANGLE, mode);
147*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
148*8975f5c5SAndroid Build Coastguard Worker     }
149*8975f5c5SAndroid Build Coastguard Worker     for (GLenum state : {GL_POLYGON_OFFSET_LINE_ANGLE})
150*8975f5c5SAndroid Build Coastguard Worker     {
151*8975f5c5SAndroid Build Coastguard Worker         EXPECT_FALSE(glIsEnabled(state));
152*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
153*8975f5c5SAndroid Build Coastguard Worker 
154*8975f5c5SAndroid Build Coastguard Worker         GLboolean enabled = true;
155*8975f5c5SAndroid Build Coastguard Worker         glGetBooleanv(state, &enabled);
156*8975f5c5SAndroid Build Coastguard Worker         EXPECT_FALSE(enabled);
157*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
158*8975f5c5SAndroid Build Coastguard Worker     }
159*8975f5c5SAndroid Build Coastguard Worker 
160*8975f5c5SAndroid Build Coastguard Worker     // Polygon mode state updates
161*8975f5c5SAndroid Build Coastguard Worker     for (GLenum mode : {GL_LINE_ANGLE, GL_FILL_ANGLE})
162*8975f5c5SAndroid Build Coastguard Worker     {
163*8975f5c5SAndroid Build Coastguard Worker         glPolygonModeANGLE(GL_FRONT_AND_BACK, mode);
164*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
165*8975f5c5SAndroid Build Coastguard Worker 
166*8975f5c5SAndroid Build Coastguard Worker         GLint result = 0;
167*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_POLYGON_MODE_ANGLE, &result);
168*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GLENUM_EQ(mode, result);
169*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
170*8975f5c5SAndroid Build Coastguard Worker     }
171*8975f5c5SAndroid Build Coastguard Worker 
172*8975f5c5SAndroid Build Coastguard Worker     // Polygon offset state updates
173*8975f5c5SAndroid Build Coastguard Worker     for (GLenum state : {GL_POLYGON_OFFSET_LINE_ANGLE})
174*8975f5c5SAndroid Build Coastguard Worker     {
175*8975f5c5SAndroid Build Coastguard Worker         GLboolean enabled = false;
176*8975f5c5SAndroid Build Coastguard Worker 
177*8975f5c5SAndroid Build Coastguard Worker         glEnable(state);
178*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
179*8975f5c5SAndroid Build Coastguard Worker 
180*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(glIsEnabled(state));
181*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
182*8975f5c5SAndroid Build Coastguard Worker 
183*8975f5c5SAndroid Build Coastguard Worker         glGetBooleanv(state, &enabled);
184*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
185*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(enabled);
186*8975f5c5SAndroid Build Coastguard Worker 
187*8975f5c5SAndroid Build Coastguard Worker         glDisable(state);
188*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
189*8975f5c5SAndroid Build Coastguard Worker 
190*8975f5c5SAndroid Build Coastguard Worker         EXPECT_FALSE(glIsEnabled(state));
191*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
192*8975f5c5SAndroid Build Coastguard Worker 
193*8975f5c5SAndroid Build Coastguard Worker         glGetBooleanv(state, &enabled);
194*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
195*8975f5c5SAndroid Build Coastguard Worker         EXPECT_FALSE(enabled);
196*8975f5c5SAndroid Build Coastguard Worker     }
197*8975f5c5SAndroid Build Coastguard Worker 
198*8975f5c5SAndroid Build Coastguard Worker     // Errors
199*8975f5c5SAndroid Build Coastguard Worker     {
200*8975f5c5SAndroid Build Coastguard Worker         glPolygonModeANGLE(GL_FRONT, GL_FILL_ANGLE);
201*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
202*8975f5c5SAndroid Build Coastguard Worker 
203*8975f5c5SAndroid Build Coastguard Worker         glPolygonModeANGLE(GL_BACK, GL_FILL_ANGLE);
204*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
205*8975f5c5SAndroid Build Coastguard Worker 
206*8975f5c5SAndroid Build Coastguard Worker         glPolygonModeANGLE(GL_FRONT_AND_BACK, 0);
207*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
208*8975f5c5SAndroid Build Coastguard Worker 
209*8975f5c5SAndroid Build Coastguard Worker         glPolygonModeANGLE(GL_FRONT_AND_BACK, GL_POINT_NV);
210*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
211*8975f5c5SAndroid Build Coastguard Worker 
212*8975f5c5SAndroid Build Coastguard Worker         glIsEnabled(GL_POLYGON_OFFSET_POINT_NV);
213*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
214*8975f5c5SAndroid Build Coastguard Worker 
215*8975f5c5SAndroid Build Coastguard Worker         GLboolean enabled = true;
216*8975f5c5SAndroid Build Coastguard Worker         glGetBooleanv(GL_POLYGON_OFFSET_POINT_NV, &enabled);
217*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
218*8975f5c5SAndroid Build Coastguard Worker     }
219*8975f5c5SAndroid Build Coastguard Worker }
220*8975f5c5SAndroid Build Coastguard Worker 
221*8975f5c5SAndroid Build Coastguard Worker // Test line rasterization mode
TEST_P(PolygonModeTest,DrawLines)222*8975f5c5SAndroid Build Coastguard Worker TEST_P(PolygonModeTest, DrawLines)
223*8975f5c5SAndroid Build Coastguard Worker {
224*8975f5c5SAndroid Build Coastguard Worker     const bool extensionNV    = EnsureGLExtensionEnabled("GL_NV_polygon_mode");
225*8975f5c5SAndroid Build Coastguard Worker     const bool extensionANGLE = EnsureGLExtensionEnabled("GL_ANGLE_polygon_mode");
226*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!extensionNV && !extensionANGLE);
227*8975f5c5SAndroid Build Coastguard Worker 
228*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
229*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
230*8975f5c5SAndroid Build Coastguard Worker     GLint colorLocation = glGetUniformLocation(program, essl1_shaders::ColorUniform());
231*8975f5c5SAndroid Build Coastguard Worker 
232*8975f5c5SAndroid Build Coastguard Worker     const int w = getWindowWidth();
233*8975f5c5SAndroid Build Coastguard Worker     const int h = getWindowHeight();
234*8975f5c5SAndroid Build Coastguard Worker     ASSERT(w == h);
235*8975f5c5SAndroid Build Coastguard Worker 
236*8975f5c5SAndroid Build Coastguard Worker     for (bool useNV : {true, false})
237*8975f5c5SAndroid Build Coastguard Worker     {
238*8975f5c5SAndroid Build Coastguard Worker         if (useNV && !extensionNV)
239*8975f5c5SAndroid Build Coastguard Worker         {
240*8975f5c5SAndroid Build Coastguard Worker             continue;
241*8975f5c5SAndroid Build Coastguard Worker         }
242*8975f5c5SAndroid Build Coastguard Worker 
243*8975f5c5SAndroid Build Coastguard Worker         glClearColor(1, 0, 0, 1);
244*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
245*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, w, h, GLColor::red);
246*8975f5c5SAndroid Build Coastguard Worker 
247*8975f5c5SAndroid Build Coastguard Worker         // Draw green quad with lines
248*8975f5c5SAndroid Build Coastguard Worker         if (useNV)
249*8975f5c5SAndroid Build Coastguard Worker         {
250*8975f5c5SAndroid Build Coastguard Worker             glPolygonModeNV(GL_FRONT_AND_BACK, GL_LINE_NV);
251*8975f5c5SAndroid Build Coastguard Worker         }
252*8975f5c5SAndroid Build Coastguard Worker         else
253*8975f5c5SAndroid Build Coastguard Worker         {
254*8975f5c5SAndroid Build Coastguard Worker             glPolygonModeANGLE(GL_FRONT_AND_BACK, GL_LINE_ANGLE);
255*8975f5c5SAndroid Build Coastguard Worker         }
256*8975f5c5SAndroid Build Coastguard Worker         glUniform4f(colorLocation, 0.0, 1.0, 0.0, 1.0);
257*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
258*8975f5c5SAndroid Build Coastguard Worker 
259*8975f5c5SAndroid Build Coastguard Worker         // Nothing was drawn inside triangles
260*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(1, 1, 5, 5, GLColor::red);
261*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(9, 9, 5, 5, GLColor::red);
262*8975f5c5SAndroid Build Coastguard Worker 
263*8975f5c5SAndroid Build Coastguard Worker         // Main diagonal was drawn
264*8975f5c5SAndroid Build Coastguard Worker         std::vector<GLColor> colors(w * h);
265*8975f5c5SAndroid Build Coastguard Worker         glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, colors.data());
266*8975f5c5SAndroid Build Coastguard Worker         for (int i = 0; i < w; i++)
267*8975f5c5SAndroid Build Coastguard Worker         {
268*8975f5c5SAndroid Build Coastguard Worker             const int x = i;
269*8975f5c5SAndroid Build Coastguard Worker             const int y = w - 1 - i;
270*8975f5c5SAndroid Build Coastguard Worker             EXPECT_EQ(GLColor::green, colors[y * w + x]) << "x: " << x << " y: " << y;
271*8975f5c5SAndroid Build Coastguard Worker         }
272*8975f5c5SAndroid Build Coastguard Worker 
273*8975f5c5SAndroid Build Coastguard Worker         // Draw blue quad with triangles
274*8975f5c5SAndroid Build Coastguard Worker         if (useNV)
275*8975f5c5SAndroid Build Coastguard Worker         {
276*8975f5c5SAndroid Build Coastguard Worker             glPolygonModeNV(GL_FRONT_AND_BACK, GL_FILL_NV);
277*8975f5c5SAndroid Build Coastguard Worker         }
278*8975f5c5SAndroid Build Coastguard Worker         else
279*8975f5c5SAndroid Build Coastguard Worker         {
280*8975f5c5SAndroid Build Coastguard Worker             glPolygonModeANGLE(GL_FRONT_AND_BACK, GL_FILL_ANGLE);
281*8975f5c5SAndroid Build Coastguard Worker         }
282*8975f5c5SAndroid Build Coastguard Worker         glUniform4f(colorLocation, 0.0, 0.0, 1.0, 1.0);
283*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
284*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, w, h, GLColor::blue);
285*8975f5c5SAndroid Build Coastguard Worker     }
286*8975f5c5SAndroid Build Coastguard Worker }
287*8975f5c5SAndroid Build Coastguard Worker 
288*8975f5c5SAndroid Build Coastguard Worker // Test line rasterization mode with depth offset
TEST_P(PolygonModeTest,DrawLinesWithDepthOffset)289*8975f5c5SAndroid Build Coastguard Worker TEST_P(PolygonModeTest, DrawLinesWithDepthOffset)
290*8975f5c5SAndroid Build Coastguard Worker {
291*8975f5c5SAndroid Build Coastguard Worker     const bool extensionNV    = EnsureGLExtensionEnabled("GL_NV_polygon_mode");
292*8975f5c5SAndroid Build Coastguard Worker     const bool extensionANGLE = EnsureGLExtensionEnabled("GL_ANGLE_polygon_mode");
293*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!extensionNV && !extensionANGLE);
294*8975f5c5SAndroid Build Coastguard Worker 
295*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
296*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
297*8975f5c5SAndroid Build Coastguard Worker     GLint colorLocation = glGetUniformLocation(program, essl1_shaders::ColorUniform());
298*8975f5c5SAndroid Build Coastguard Worker 
299*8975f5c5SAndroid Build Coastguard Worker     const int w = getWindowWidth();
300*8975f5c5SAndroid Build Coastguard Worker     const int h = getWindowHeight();
301*8975f5c5SAndroid Build Coastguard Worker     ASSERT(w == h);
302*8975f5c5SAndroid Build Coastguard Worker 
303*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_DEPTH_TEST);
304*8975f5c5SAndroid Build Coastguard Worker 
305*8975f5c5SAndroid Build Coastguard Worker     for (bool useNV : {true, false})
306*8975f5c5SAndroid Build Coastguard Worker     {
307*8975f5c5SAndroid Build Coastguard Worker         if (useNV && !extensionNV)
308*8975f5c5SAndroid Build Coastguard Worker         {
309*8975f5c5SAndroid Build Coastguard Worker             continue;
310*8975f5c5SAndroid Build Coastguard Worker         }
311*8975f5c5SAndroid Build Coastguard Worker 
312*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
313*8975f5c5SAndroid Build Coastguard Worker 
314*8975f5c5SAndroid Build Coastguard Worker         // Draw red quad filled
315*8975f5c5SAndroid Build Coastguard Worker         if (useNV)
316*8975f5c5SAndroid Build Coastguard Worker         {
317*8975f5c5SAndroid Build Coastguard Worker             glPolygonModeNV(GL_FRONT_AND_BACK, GL_FILL_NV);
318*8975f5c5SAndroid Build Coastguard Worker         }
319*8975f5c5SAndroid Build Coastguard Worker         else
320*8975f5c5SAndroid Build Coastguard Worker         {
321*8975f5c5SAndroid Build Coastguard Worker             glPolygonModeANGLE(GL_FRONT_AND_BACK, GL_FILL_ANGLE);
322*8975f5c5SAndroid Build Coastguard Worker         }
323*8975f5c5SAndroid Build Coastguard Worker         glUniform4f(colorLocation, 1.0, 0.0, 0.0, 1.0);
324*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl1_shaders::PositionAttrib(), 0.5);
325*8975f5c5SAndroid Build Coastguard Worker 
326*8975f5c5SAndroid Build Coastguard Worker         // Draw green quad using lines with offset failing the depth test
327*8975f5c5SAndroid Build Coastguard Worker         if (useNV)
328*8975f5c5SAndroid Build Coastguard Worker         {
329*8975f5c5SAndroid Build Coastguard Worker             glEnable(GL_POLYGON_OFFSET_LINE_NV);
330*8975f5c5SAndroid Build Coastguard Worker             glPolygonModeNV(GL_FRONT_AND_BACK, GL_LINE_NV);
331*8975f5c5SAndroid Build Coastguard Worker         }
332*8975f5c5SAndroid Build Coastguard Worker         else
333*8975f5c5SAndroid Build Coastguard Worker         {
334*8975f5c5SAndroid Build Coastguard Worker             glEnable(GL_POLYGON_OFFSET_LINE_ANGLE);
335*8975f5c5SAndroid Build Coastguard Worker             glPolygonModeANGLE(GL_FRONT_AND_BACK, GL_LINE_ANGLE);
336*8975f5c5SAndroid Build Coastguard Worker         }
337*8975f5c5SAndroid Build Coastguard Worker         glPolygonOffset(0.0, 2.0);
338*8975f5c5SAndroid Build Coastguard Worker         glUniform4f(colorLocation, 0.0, 1.0, 0.0, 1.0);
339*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl1_shaders::PositionAttrib(), 0.5);
340*8975f5c5SAndroid Build Coastguard Worker 
341*8975f5c5SAndroid Build Coastguard Worker         // Depth test must fail
342*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_RECT_EQ(0, 0, w, h, GLColor::red);
343*8975f5c5SAndroid Build Coastguard Worker 
344*8975f5c5SAndroid Build Coastguard Worker         // Draw green quad with triangles
345*8975f5c5SAndroid Build Coastguard Worker         if (useNV)
346*8975f5c5SAndroid Build Coastguard Worker         {
347*8975f5c5SAndroid Build Coastguard Worker             glPolygonModeNV(GL_FRONT_AND_BACK, GL_FILL_NV);
348*8975f5c5SAndroid Build Coastguard Worker         }
349*8975f5c5SAndroid Build Coastguard Worker         else
350*8975f5c5SAndroid Build Coastguard Worker         {
351*8975f5c5SAndroid Build Coastguard Worker             glPolygonModeANGLE(GL_FRONT_AND_BACK, GL_FILL_ANGLE);
352*8975f5c5SAndroid Build Coastguard Worker         }
353*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
354*8975f5c5SAndroid Build Coastguard Worker 
355*8975f5c5SAndroid Build Coastguard Worker         // Change the offset so that depth test passes
356*8975f5c5SAndroid Build Coastguard Worker         glPolygonOffset(0.0, -2.0);
357*8975f5c5SAndroid Build Coastguard Worker 
358*8975f5c5SAndroid Build Coastguard Worker         // Draw blue quad with lines
359*8975f5c5SAndroid Build Coastguard Worker         if (useNV)
360*8975f5c5SAndroid Build Coastguard Worker         {
361*8975f5c5SAndroid Build Coastguard Worker             glPolygonModeNV(GL_FRONT_AND_BACK, GL_LINE_NV);
362*8975f5c5SAndroid Build Coastguard Worker         }
363*8975f5c5SAndroid Build Coastguard Worker         else
364*8975f5c5SAndroid Build Coastguard Worker         {
365*8975f5c5SAndroid Build Coastguard Worker             glPolygonModeANGLE(GL_FRONT_AND_BACK, GL_LINE_ANGLE);
366*8975f5c5SAndroid Build Coastguard Worker         }
367*8975f5c5SAndroid Build Coastguard Worker         glUniform4f(colorLocation, 0.0, 0.0, 1.0, 1.0);
368*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
369*8975f5c5SAndroid Build Coastguard Worker 
370*8975f5c5SAndroid Build Coastguard Worker         // Main diagonal was drawn
371*8975f5c5SAndroid Build Coastguard Worker         std::vector<GLColor> colors(w * h);
372*8975f5c5SAndroid Build Coastguard Worker         glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, colors.data());
373*8975f5c5SAndroid Build Coastguard Worker         for (int i = 0; i < w; i++)
374*8975f5c5SAndroid Build Coastguard Worker         {
375*8975f5c5SAndroid Build Coastguard Worker             const int x = i;
376*8975f5c5SAndroid Build Coastguard Worker             const int y = w - 1 - i;
377*8975f5c5SAndroid Build Coastguard Worker             EXPECT_EQ(GLColor::blue, colors[y * w + x]) << "x: " << x << " y: " << y;
378*8975f5c5SAndroid Build Coastguard Worker         }
379*8975f5c5SAndroid Build Coastguard Worker     }
380*8975f5c5SAndroid Build Coastguard Worker }
381*8975f5c5SAndroid Build Coastguard Worker 
382*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(PolygonModeTest);
383