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