xref: /aosp_15_r20/external/angle/src/tests/gl_tests/SimpleOperationTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 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 // SimpleOperationTest:
7*8975f5c5SAndroid Build Coastguard Worker //   Basic GL commands such as linking a program, initializing a buffer, etc.
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #include <vector>
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "util/EGLWindow.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "util/random_utils.h"
16*8975f5c5SAndroid Build Coastguard Worker 
17*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
18*8975f5c5SAndroid Build Coastguard Worker 
19*8975f5c5SAndroid Build Coastguard Worker namespace
20*8975f5c5SAndroid Build Coastguard Worker {
21*8975f5c5SAndroid Build Coastguard Worker constexpr char kBasicVertexShader[] =
22*8975f5c5SAndroid Build Coastguard Worker     R"(attribute vec3 position;
23*8975f5c5SAndroid Build Coastguard Worker void main()
24*8975f5c5SAndroid Build Coastguard Worker {
25*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(position, 1);
26*8975f5c5SAndroid Build Coastguard Worker })";
27*8975f5c5SAndroid Build Coastguard Worker 
28*8975f5c5SAndroid Build Coastguard Worker constexpr char kGreenFragmentShader[] =
29*8975f5c5SAndroid Build Coastguard Worker     R"(void main()
30*8975f5c5SAndroid Build Coastguard Worker {
31*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = vec4(0, 1, 0, 1);
32*8975f5c5SAndroid Build Coastguard Worker })";
33*8975f5c5SAndroid Build Coastguard Worker 
34*8975f5c5SAndroid Build Coastguard Worker class SimpleOperationTest : public ANGLETest<>
35*8975f5c5SAndroid Build Coastguard Worker {
36*8975f5c5SAndroid Build Coastguard Worker   protected:
SimpleOperationTest()37*8975f5c5SAndroid Build Coastguard Worker     SimpleOperationTest()
38*8975f5c5SAndroid Build Coastguard Worker     {
39*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(128);
40*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(128);
41*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
42*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
43*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
44*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
45*8975f5c5SAndroid Build Coastguard Worker     }
46*8975f5c5SAndroid Build Coastguard Worker 
47*8975f5c5SAndroid Build Coastguard Worker     void verifyBuffer(const std::vector<uint8_t> &data, GLenum binding);
48*8975f5c5SAndroid Build Coastguard Worker 
49*8975f5c5SAndroid Build Coastguard Worker     template <typename T>
50*8975f5c5SAndroid Build Coastguard Worker     void testDrawElementsLineLoopUsingClientSideMemory(GLenum indexType,
51*8975f5c5SAndroid Build Coastguard Worker                                                        int windowWidth,
52*8975f5c5SAndroid Build Coastguard Worker                                                        int windowHeight);
53*8975f5c5SAndroid Build Coastguard Worker };
54*8975f5c5SAndroid Build Coastguard Worker 
55*8975f5c5SAndroid Build Coastguard Worker class SimpleOperationTest31 : public SimpleOperationTest
56*8975f5c5SAndroid Build Coastguard Worker {};
57*8975f5c5SAndroid Build Coastguard Worker 
verifyBuffer(const std::vector<uint8_t> & data,GLenum binding)58*8975f5c5SAndroid Build Coastguard Worker void SimpleOperationTest::verifyBuffer(const std::vector<uint8_t> &data, GLenum binding)
59*8975f5c5SAndroid Build Coastguard Worker {
60*8975f5c5SAndroid Build Coastguard Worker     if (!IsGLExtensionEnabled("GL_EXT_map_buffer_range"))
61*8975f5c5SAndroid Build Coastguard Worker     {
62*8975f5c5SAndroid Build Coastguard Worker         return;
63*8975f5c5SAndroid Build Coastguard Worker     }
64*8975f5c5SAndroid Build Coastguard Worker 
65*8975f5c5SAndroid Build Coastguard Worker     uint8_t *mapPointer =
66*8975f5c5SAndroid Build Coastguard Worker         static_cast<uint8_t *>(glMapBufferRangeEXT(GL_ARRAY_BUFFER, 0, 1024, GL_MAP_READ_BIT));
67*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
68*8975f5c5SAndroid Build Coastguard Worker 
69*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint8_t> readbackData(data.size());
70*8975f5c5SAndroid Build Coastguard Worker     memcpy(readbackData.data(), mapPointer, data.size());
71*8975f5c5SAndroid Build Coastguard Worker     glUnmapBufferOES(GL_ARRAY_BUFFER);
72*8975f5c5SAndroid Build Coastguard Worker 
73*8975f5c5SAndroid Build Coastguard Worker     EXPECT_EQ(data, readbackData);
74*8975f5c5SAndroid Build Coastguard Worker }
75*8975f5c5SAndroid Build Coastguard Worker 
76*8975f5c5SAndroid Build Coastguard Worker // Validates if culling rasterization states work. Simply draws a quad with
77*8975f5c5SAndroid Build Coastguard Worker // cull face enabled and make sure we still render correctly.
TEST_P(SimpleOperationTest,CullFaceEnabledState)78*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, CullFaceEnabledState)
79*8975f5c5SAndroid Build Coastguard Worker {
80*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
81*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
82*8975f5c5SAndroid Build Coastguard Worker 
83*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
84*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_CULL_FACE);
85*8975f5c5SAndroid Build Coastguard Worker 
86*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.0f, 1.0f, true);
87*8975f5c5SAndroid Build Coastguard Worker 
88*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
89*8975f5c5SAndroid Build Coastguard Worker 
90*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
91*8975f5c5SAndroid Build Coastguard Worker }
92*8975f5c5SAndroid Build Coastguard Worker 
93*8975f5c5SAndroid Build Coastguard Worker // Validates if culling rasterization states work. Simply draws a quad with
94*8975f5c5SAndroid Build Coastguard Worker // cull face enabled with cullface front and make sure the face have not been rendered.
TEST_P(SimpleOperationTest,CullFaceFrontEnabledState)95*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, CullFaceFrontEnabledState)
96*8975f5c5SAndroid Build Coastguard Worker {
97*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
98*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
99*8975f5c5SAndroid Build Coastguard Worker 
100*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
101*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_CULL_FACE);
102*8975f5c5SAndroid Build Coastguard Worker 
103*8975f5c5SAndroid Build Coastguard Worker     // Should make the quad disappear since we draw it front facing.
104*8975f5c5SAndroid Build Coastguard Worker     glCullFace(GL_FRONT);
105*8975f5c5SAndroid Build Coastguard Worker 
106*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.0f, 1.0f, true);
107*8975f5c5SAndroid Build Coastguard Worker 
108*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
109*8975f5c5SAndroid Build Coastguard Worker 
110*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
111*8975f5c5SAndroid Build Coastguard Worker }
112*8975f5c5SAndroid Build Coastguard Worker 
113*8975f5c5SAndroid Build Coastguard Worker // Validates if blending render states work. Simply draws twice and verify the color have been
114*8975f5c5SAndroid Build Coastguard Worker // added in the final output.
TEST_P(SimpleOperationTest,BlendingRenderState)115*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, BlendingRenderState)
116*8975f5c5SAndroid Build Coastguard Worker {
117*8975f5c5SAndroid Build Coastguard Worker     // The precision when blending isn't perfect and some tests fail with a color of 254 instead
118*8975f5c5SAndroid Build Coastguard Worker     // of 255 on the green component. This is why we need 0.51 green instead of .5
119*8975f5c5SAndroid Build Coastguard Worker     constexpr char halfGreenFragmentShader[] =
120*8975f5c5SAndroid Build Coastguard Worker         R"(void main()
121*8975f5c5SAndroid Build Coastguard Worker {
122*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = vec4(0, 0.51, 0, 1);
123*8975f5c5SAndroid Build Coastguard Worker })";
124*8975f5c5SAndroid Build Coastguard Worker 
125*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kBasicVertexShader, halfGreenFragmentShader);
126*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
127*8975f5c5SAndroid Build Coastguard Worker 
128*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
129*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_BLEND);
130*8975f5c5SAndroid Build Coastguard Worker     glBlendFunc(GL_ONE, GL_ONE);
131*8975f5c5SAndroid Build Coastguard Worker     glBlendEquation(GL_FUNC_ADD);
132*8975f5c5SAndroid Build Coastguard Worker 
133*8975f5c5SAndroid Build Coastguard Worker     auto vertices = GetQuadVertices();
134*8975f5c5SAndroid Build Coastguard Worker 
135*8975f5c5SAndroid Build Coastguard Worker     const GLint positionLocation = glGetAttribLocation(program, "position");
136*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, positionLocation);
137*8975f5c5SAndroid Build Coastguard Worker 
138*8975f5c5SAndroid Build Coastguard Worker     GLBuffer vertexBuffer;
139*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
140*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * vertices.size(), vertices.data(),
141*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
142*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
143*8975f5c5SAndroid Build Coastguard Worker 
144*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(positionLocation);
145*8975f5c5SAndroid Build Coastguard Worker 
146*8975f5c5SAndroid Build Coastguard Worker     // Drawing a quad once will give 0.51 green, but if we enable blending
147*8975f5c5SAndroid Build Coastguard Worker     // with additive function we should end up with full green of 1.0 with
148*8975f5c5SAndroid Build Coastguard Worker     // a clamping func of 1.0.
149*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLES, 0, static_cast<GLsizei>(vertices.size()));
150*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLES, 0, static_cast<GLsizei>(vertices.size()));
151*8975f5c5SAndroid Build Coastguard Worker 
152*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
153*8975f5c5SAndroid Build Coastguard Worker 
154*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
155*8975f5c5SAndroid Build Coastguard Worker }
156*8975f5c5SAndroid Build Coastguard Worker 
157*8975f5c5SAndroid Build Coastguard Worker // Tests getting the GL_BLEND_EQUATION integer
TEST_P(SimpleOperationTest,BlendEquationGetInteger)158*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, BlendEquationGetInteger)
159*8975f5c5SAndroid Build Coastguard Worker {
160*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_BLEND);
161*8975f5c5SAndroid Build Coastguard Worker     glBlendFunc(GL_ONE, GL_ONE);
162*8975f5c5SAndroid Build Coastguard Worker 
163*8975f5c5SAndroid Build Coastguard Worker     constexpr std::array<GLenum, 5> equations = {GL_FUNC_ADD, GL_FUNC_SUBTRACT,
164*8975f5c5SAndroid Build Coastguard Worker                                                  GL_FUNC_REVERSE_SUBTRACT, GL_MIN, GL_MAX};
165*8975f5c5SAndroid Build Coastguard Worker 
166*8975f5c5SAndroid Build Coastguard Worker     for (GLenum equation : equations)
167*8975f5c5SAndroid Build Coastguard Worker     {
168*8975f5c5SAndroid Build Coastguard Worker         glBlendEquation(equation);
169*8975f5c5SAndroid Build Coastguard Worker 
170*8975f5c5SAndroid Build Coastguard Worker         GLint currentEquation;
171*8975f5c5SAndroid Build Coastguard Worker         glGetIntegerv(GL_BLEND_EQUATION, &currentEquation);
172*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
173*8975f5c5SAndroid Build Coastguard Worker 
174*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(currentEquation, static_cast<GLint>(equation));
175*8975f5c5SAndroid Build Coastguard Worker     }
176*8975f5c5SAndroid Build Coastguard Worker }
177*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(SimpleOperationTest,CompileVertexShader)178*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, CompileVertexShader)
179*8975f5c5SAndroid Build Coastguard Worker {
180*8975f5c5SAndroid Build Coastguard Worker     GLuint shader = CompileShader(GL_VERTEX_SHADER, kBasicVertexShader);
181*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(shader, 0u);
182*8975f5c5SAndroid Build Coastguard Worker     glDeleteShader(shader);
183*8975f5c5SAndroid Build Coastguard Worker 
184*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
185*8975f5c5SAndroid Build Coastguard Worker }
186*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(SimpleOperationTest,CompileFragmentShaderSingleVaryingInput)187*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, CompileFragmentShaderSingleVaryingInput)
188*8975f5c5SAndroid Build Coastguard Worker {
189*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(precision mediump float;
190*8975f5c5SAndroid Build Coastguard Worker varying vec4 v_input;
191*8975f5c5SAndroid Build Coastguard Worker void main()
192*8975f5c5SAndroid Build Coastguard Worker {
193*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = v_input;
194*8975f5c5SAndroid Build Coastguard Worker })";
195*8975f5c5SAndroid Build Coastguard Worker 
196*8975f5c5SAndroid Build Coastguard Worker     GLuint shader = CompileShader(GL_FRAGMENT_SHADER, kFS);
197*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(shader, 0u);
198*8975f5c5SAndroid Build Coastguard Worker     glDeleteShader(shader);
199*8975f5c5SAndroid Build Coastguard Worker 
200*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
201*8975f5c5SAndroid Build Coastguard Worker }
202*8975f5c5SAndroid Build Coastguard Worker 
203*8975f5c5SAndroid Build Coastguard Worker // Covers a simple bug in Vulkan to do with dependencies between the Surface and the default
204*8975f5c5SAndroid Build Coastguard Worker // Framebuffer.
TEST_P(SimpleOperationTest,ClearAndSwap)205*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, ClearAndSwap)
206*8975f5c5SAndroid Build Coastguard Worker {
207*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0, 0.0, 0.0, 1.0);
208*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
209*8975f5c5SAndroid Build Coastguard Worker     swapBuffers();
210*8975f5c5SAndroid Build Coastguard Worker 
211*8975f5c5SAndroid Build Coastguard Worker     // Can't check the pixel result after the swap, and checking the pixel result affects the
212*8975f5c5SAndroid Build Coastguard Worker     // behaviour of the test on the Vulkan back-end, so don't bother checking correctness.
213*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
214*8975f5c5SAndroid Build Coastguard Worker     ASSERT_FALSE(getGLWindow()->hasError());
215*8975f5c5SAndroid Build Coastguard Worker }
216*8975f5c5SAndroid Build Coastguard Worker 
217*8975f5c5SAndroid Build Coastguard Worker // Simple case of setting a scissor, enabled or disabled.
TEST_P(SimpleOperationTest,ScissorTest)218*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, ScissorTest)
219*8975f5c5SAndroid Build Coastguard Worker {
220*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
221*8975f5c5SAndroid Build Coastguard Worker 
222*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
223*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SCISSOR_TEST);
224*8975f5c5SAndroid Build Coastguard Worker     glScissor(getWindowWidth() / 4, getWindowHeight() / 4, getWindowWidth() / 2,
225*8975f5c5SAndroid Build Coastguard Worker               getWindowHeight() / 2);
226*8975f5c5SAndroid Build Coastguard Worker 
227*8975f5c5SAndroid Build Coastguard Worker     // Fill the whole screen with a quad.
228*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.0f, 1.0f, true);
229*8975f5c5SAndroid Build Coastguard Worker 
230*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
231*8975f5c5SAndroid Build Coastguard Worker 
232*8975f5c5SAndroid Build Coastguard Worker     // Test outside the scissor test, pitch black.
233*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
234*8975f5c5SAndroid Build Coastguard Worker 
235*8975f5c5SAndroid Build Coastguard Worker     // Test inside, green of the fragment shader.
236*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(getWindowWidth() / 2, getWindowHeight() / 2, GLColor::green);
237*8975f5c5SAndroid Build Coastguard Worker }
238*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(SimpleOperationTest,LinkProgramShadersNoInputs)239*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, LinkProgramShadersNoInputs)
240*8975f5c5SAndroid Build Coastguard Worker {
241*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] = "void main() { gl_Position = vec4(1.0, 1.0, 1.0, 1.0); }";
242*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = "void main() { gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); }";
243*8975f5c5SAndroid Build Coastguard Worker 
244*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
245*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
246*8975f5c5SAndroid Build Coastguard Worker }
247*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(SimpleOperationTest,LinkProgramWithUniforms)248*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, LinkProgramWithUniforms)
249*8975f5c5SAndroid Build Coastguard Worker {
250*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] = R"(void main()
251*8975f5c5SAndroid Build Coastguard Worker {
252*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(1.0, 1.0, 1.0, 1.0);
253*8975f5c5SAndroid Build Coastguard Worker })";
254*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(precision mediump float;
255*8975f5c5SAndroid Build Coastguard Worker uniform vec4 u_input;
256*8975f5c5SAndroid Build Coastguard Worker void main()
257*8975f5c5SAndroid Build Coastguard Worker {
258*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = u_input;
259*8975f5c5SAndroid Build Coastguard Worker })";
260*8975f5c5SAndroid Build Coastguard Worker 
261*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
262*8975f5c5SAndroid Build Coastguard Worker 
263*8975f5c5SAndroid Build Coastguard Worker     const GLint uniformLoc = glGetUniformLocation(program, "u_input");
264*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(-1, uniformLoc);
265*8975f5c5SAndroid Build Coastguard Worker 
266*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
267*8975f5c5SAndroid Build Coastguard Worker }
268*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(SimpleOperationTest,LinkProgramWithAttributes)269*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, LinkProgramWithAttributes)
270*8975f5c5SAndroid Build Coastguard Worker {
271*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] = R"(attribute vec4 a_input;
272*8975f5c5SAndroid Build Coastguard Worker void main()
273*8975f5c5SAndroid Build Coastguard Worker {
274*8975f5c5SAndroid Build Coastguard Worker     gl_Position = a_input;
275*8975f5c5SAndroid Build Coastguard Worker })";
276*8975f5c5SAndroid Build Coastguard Worker 
277*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kGreenFragmentShader);
278*8975f5c5SAndroid Build Coastguard Worker 
279*8975f5c5SAndroid Build Coastguard Worker     const GLint attribLoc = glGetAttribLocation(program, "a_input");
280*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(-1, attribLoc);
281*8975f5c5SAndroid Build Coastguard Worker 
282*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
283*8975f5c5SAndroid Build Coastguard Worker }
284*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(SimpleOperationTest,BufferDataWithData)285*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, BufferDataWithData)
286*8975f5c5SAndroid Build Coastguard Worker {
287*8975f5c5SAndroid Build Coastguard Worker     GLBuffer buffer;
288*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, buffer);
289*8975f5c5SAndroid Build Coastguard Worker 
290*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint8_t> data(1024);
291*8975f5c5SAndroid Build Coastguard Worker     FillVectorWithRandomUBytes(&data);
292*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, data.size(), &data[0], GL_STATIC_DRAW);
293*8975f5c5SAndroid Build Coastguard Worker 
294*8975f5c5SAndroid Build Coastguard Worker     verifyBuffer(data, GL_ARRAY_BUFFER);
295*8975f5c5SAndroid Build Coastguard Worker 
296*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
297*8975f5c5SAndroid Build Coastguard Worker }
298*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(SimpleOperationTest,BufferDataWithNoData)299*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, BufferDataWithNoData)
300*8975f5c5SAndroid Build Coastguard Worker {
301*8975f5c5SAndroid Build Coastguard Worker     GLBuffer buffer;
302*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, buffer);
303*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, 1024, nullptr, GL_STATIC_DRAW);
304*8975f5c5SAndroid Build Coastguard Worker 
305*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
306*8975f5c5SAndroid Build Coastguard Worker }
307*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(SimpleOperationTest,BufferSubData)308*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, BufferSubData)
309*8975f5c5SAndroid Build Coastguard Worker {
310*8975f5c5SAndroid Build Coastguard Worker     GLBuffer buffer;
311*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, buffer);
312*8975f5c5SAndroid Build Coastguard Worker 
313*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t bufferSize = 1024;
314*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint8_t> data(bufferSize);
315*8975f5c5SAndroid Build Coastguard Worker     FillVectorWithRandomUBytes(&data);
316*8975f5c5SAndroid Build Coastguard Worker 
317*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, bufferSize, nullptr, GL_STATIC_DRAW);
318*8975f5c5SAndroid Build Coastguard Worker 
319*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t subDataCount = 16;
320*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t sliceSize    = bufferSize / subDataCount;
321*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < subDataCount; i++)
322*8975f5c5SAndroid Build Coastguard Worker     {
323*8975f5c5SAndroid Build Coastguard Worker         size_t offset = i * sliceSize;
324*8975f5c5SAndroid Build Coastguard Worker         glBufferSubData(GL_ARRAY_BUFFER, offset, sliceSize, &data[offset]);
325*8975f5c5SAndroid Build Coastguard Worker     }
326*8975f5c5SAndroid Build Coastguard Worker 
327*8975f5c5SAndroid Build Coastguard Worker     verifyBuffer(data, GL_ARRAY_BUFFER);
328*8975f5c5SAndroid Build Coastguard Worker 
329*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
330*8975f5c5SAndroid Build Coastguard Worker }
331*8975f5c5SAndroid Build Coastguard Worker 
332*8975f5c5SAndroid Build Coastguard Worker // Simple quad test.
TEST_P(SimpleOperationTest,DrawQuad)333*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, DrawQuad)
334*8975f5c5SAndroid Build Coastguard Worker {
335*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
336*8975f5c5SAndroid Build Coastguard Worker 
337*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f, 1.0f, true);
338*8975f5c5SAndroid Build Coastguard Worker 
339*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
340*8975f5c5SAndroid Build Coastguard Worker 
341*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
342*8975f5c5SAndroid Build Coastguard Worker }
343*8975f5c5SAndroid Build Coastguard Worker 
344*8975f5c5SAndroid Build Coastguard Worker // Simple quad test with data in client memory, not vertex buffer.
TEST_P(SimpleOperationTest,DrawQuadFromClientMemory)345*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, DrawQuadFromClientMemory)
346*8975f5c5SAndroid Build Coastguard Worker {
347*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
348*8975f5c5SAndroid Build Coastguard Worker 
349*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f, 1.0f, false);
350*8975f5c5SAndroid Build Coastguard Worker 
351*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
352*8975f5c5SAndroid Build Coastguard Worker 
353*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
354*8975f5c5SAndroid Build Coastguard Worker }
355*8975f5c5SAndroid Build Coastguard Worker 
356*8975f5c5SAndroid Build Coastguard Worker // Simple double quad test.
TEST_P(SimpleOperationTest,DrawQuadTwice)357*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, DrawQuadTwice)
358*8975f5c5SAndroid Build Coastguard Worker {
359*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
360*8975f5c5SAndroid Build Coastguard Worker 
361*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f, 1.0f, true);
362*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f, 1.0f, true);
363*8975f5c5SAndroid Build Coastguard Worker 
364*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
365*8975f5c5SAndroid Build Coastguard Worker 
366*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
367*8975f5c5SAndroid Build Coastguard Worker }
368*8975f5c5SAndroid Build Coastguard Worker 
369*8975f5c5SAndroid Build Coastguard Worker // Simple line test.
TEST_P(SimpleOperationTest,DrawLine)370*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, DrawLine)
371*8975f5c5SAndroid Build Coastguard Worker {
372*8975f5c5SAndroid Build Coastguard Worker     // We assume in the test the width and height are equal and we are tracing
373*8975f5c5SAndroid Build Coastguard Worker     // the line from bottom left to top right. Verify that all pixels along that line
374*8975f5c5SAndroid Build Coastguard Worker     // have been traced with green.
375*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(getWindowWidth(), getWindowHeight());
376*8975f5c5SAndroid Build Coastguard Worker 
377*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
378*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
379*8975f5c5SAndroid Build Coastguard Worker 
380*8975f5c5SAndroid Build Coastguard Worker     std::vector<Vector3> vertices = {{-1.0f, -1.0f, 0.0f}, {1.0f, 1.0f, 0.0f}};
381*8975f5c5SAndroid Build Coastguard Worker 
382*8975f5c5SAndroid Build Coastguard Worker     const GLint positionLocation = glGetAttribLocation(program, "position");
383*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, positionLocation);
384*8975f5c5SAndroid Build Coastguard Worker 
385*8975f5c5SAndroid Build Coastguard Worker     GLBuffer vertexBuffer;
386*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
387*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * vertices.size(), vertices.data(),
388*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
389*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
390*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(positionLocation);
391*8975f5c5SAndroid Build Coastguard Worker 
392*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
393*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_LINES, 0, static_cast<GLsizei>(vertices.size()));
394*8975f5c5SAndroid Build Coastguard Worker 
395*8975f5c5SAndroid Build Coastguard Worker     glDisableVertexAttribArray(positionLocation);
396*8975f5c5SAndroid Build Coastguard Worker 
397*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
398*8975f5c5SAndroid Build Coastguard Worker 
399*8975f5c5SAndroid Build Coastguard Worker     for (int x = 0; x < getWindowWidth(); x++)
400*8975f5c5SAndroid Build Coastguard Worker     {
401*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(x, x, GLColor::green);
402*8975f5c5SAndroid Build Coastguard Worker     }
403*8975f5c5SAndroid Build Coastguard Worker }
404*8975f5c5SAndroid Build Coastguard Worker 
405*8975f5c5SAndroid Build Coastguard Worker // Simple line test that will use a very large offset in the vertex attributes.
TEST_P(SimpleOperationTest,DrawLineWithLargeAttribPointerOffset)406*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, DrawLineWithLargeAttribPointerOffset)
407*8975f5c5SAndroid Build Coastguard Worker {
408*8975f5c5SAndroid Build Coastguard Worker     // We assume in the test the width and height are equal and we are tracing
409*8975f5c5SAndroid Build Coastguard Worker     // the line from bottom left to top right. Verify that all pixels along that line
410*8975f5c5SAndroid Build Coastguard Worker     // have been traced with green.
411*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(getWindowWidth(), getWindowHeight());
412*8975f5c5SAndroid Build Coastguard Worker 
413*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
414*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
415*8975f5c5SAndroid Build Coastguard Worker 
416*8975f5c5SAndroid Build Coastguard Worker     int kOffset = 3315;
417*8975f5c5SAndroid Build Coastguard Worker     std::vector<Vector3> vertices(kOffset);
418*8975f5c5SAndroid Build Coastguard Worker     Vector3 vector1{-1.0f, -1.0f, 0.0f};
419*8975f5c5SAndroid Build Coastguard Worker     Vector3 vector2{1.0f, 1.0f, 0.0f};
420*8975f5c5SAndroid Build Coastguard Worker     vertices.emplace_back(vector1);
421*8975f5c5SAndroid Build Coastguard Worker     vertices.emplace_back(vector2);
422*8975f5c5SAndroid Build Coastguard Worker 
423*8975f5c5SAndroid Build Coastguard Worker     const GLint positionLocation = glGetAttribLocation(program, "position");
424*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, positionLocation);
425*8975f5c5SAndroid Build Coastguard Worker 
426*8975f5c5SAndroid Build Coastguard Worker     GLBuffer vertexBuffer;
427*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
428*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * vertices.size(), vertices.data(),
429*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
430*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0,
431*8975f5c5SAndroid Build Coastguard Worker                           reinterpret_cast<const void *>(kOffset * sizeof(vertices[0])));
432*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(positionLocation);
433*8975f5c5SAndroid Build Coastguard Worker 
434*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
435*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_LINES, 0, 2);
436*8975f5c5SAndroid Build Coastguard Worker 
437*8975f5c5SAndroid Build Coastguard Worker     glDisableVertexAttribArray(positionLocation);
438*8975f5c5SAndroid Build Coastguard Worker 
439*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
440*8975f5c5SAndroid Build Coastguard Worker 
441*8975f5c5SAndroid Build Coastguard Worker     for (auto x = 0; x < getWindowWidth(); x++)
442*8975f5c5SAndroid Build Coastguard Worker     {
443*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(x, x, GLColor::green);
444*8975f5c5SAndroid Build Coastguard Worker     }
445*8975f5c5SAndroid Build Coastguard Worker }
446*8975f5c5SAndroid Build Coastguard Worker 
447*8975f5c5SAndroid Build Coastguard Worker // Simple line strip test.
TEST_P(SimpleOperationTest,DrawLineStrip)448*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, DrawLineStrip)
449*8975f5c5SAndroid Build Coastguard Worker {
450*8975f5c5SAndroid Build Coastguard Worker     // We assume in the test the width and height are equal and we are tracing
451*8975f5c5SAndroid Build Coastguard Worker     // the line from bottom left to center, then from center to bottom right.
452*8975f5c5SAndroid Build Coastguard Worker     // Verify that all pixels along these lines have been traced with green.
453*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(getWindowWidth(), getWindowHeight());
454*8975f5c5SAndroid Build Coastguard Worker 
455*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
456*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
457*8975f5c5SAndroid Build Coastguard Worker 
458*8975f5c5SAndroid Build Coastguard Worker     auto vertices =
459*8975f5c5SAndroid Build Coastguard Worker         std::vector<Vector3>{{-1.0f, -1.0f, 0.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, -1.0f, 0.0f}};
460*8975f5c5SAndroid Build Coastguard Worker 
461*8975f5c5SAndroid Build Coastguard Worker     const GLint positionLocation = glGetAttribLocation(program, "position");
462*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, positionLocation);
463*8975f5c5SAndroid Build Coastguard Worker 
464*8975f5c5SAndroid Build Coastguard Worker     GLBuffer vertexBuffer;
465*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
466*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * vertices.size(), vertices.data(),
467*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
468*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
469*8975f5c5SAndroid Build Coastguard Worker 
470*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(positionLocation);
471*8975f5c5SAndroid Build Coastguard Worker 
472*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
473*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_LINE_STRIP, 0, static_cast<GLsizei>(vertices.size()));
474*8975f5c5SAndroid Build Coastguard Worker 
475*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
476*8975f5c5SAndroid Build Coastguard Worker 
477*8975f5c5SAndroid Build Coastguard Worker     const auto centerX = getWindowWidth() / 2;
478*8975f5c5SAndroid Build Coastguard Worker     const auto centerY = getWindowHeight() / 2;
479*8975f5c5SAndroid Build Coastguard Worker 
480*8975f5c5SAndroid Build Coastguard Worker     for (auto x = 0; x < centerX; x++)
481*8975f5c5SAndroid Build Coastguard Worker     {
482*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(x, x, GLColor::green);
483*8975f5c5SAndroid Build Coastguard Worker     }
484*8975f5c5SAndroid Build Coastguard Worker 
485*8975f5c5SAndroid Build Coastguard Worker     for (auto x = centerX, y = centerY - 1; x < getWindowWidth() && y >= 0; x++, y--)
486*8975f5c5SAndroid Build Coastguard Worker     {
487*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(x, y, GLColor::green);
488*8975f5c5SAndroid Build Coastguard Worker     }
489*8975f5c5SAndroid Build Coastguard Worker }
490*8975f5c5SAndroid Build Coastguard Worker 
491*8975f5c5SAndroid Build Coastguard Worker class TriangleFanDrawTest : public SimpleOperationTest
492*8975f5c5SAndroid Build Coastguard Worker {
493*8975f5c5SAndroid Build Coastguard Worker   protected:
testSetUp()494*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
495*8975f5c5SAndroid Build Coastguard Worker     {
496*8975f5c5SAndroid Build Coastguard Worker         // We assume in the test the width and height are equal and we are tracing
497*8975f5c5SAndroid Build Coastguard Worker         // 2 triangles to cover half the surface like this:
498*8975f5c5SAndroid Build Coastguard Worker         ASSERT_EQ(getWindowWidth(), getWindowHeight());
499*8975f5c5SAndroid Build Coastguard Worker 
500*8975f5c5SAndroid Build Coastguard Worker         mProgram.makeRaster(kBasicVertexShader, kGreenFragmentShader);
501*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(mProgram.valid());
502*8975f5c5SAndroid Build Coastguard Worker         glUseProgram(mProgram);
503*8975f5c5SAndroid Build Coastguard Worker 
504*8975f5c5SAndroid Build Coastguard Worker         const GLint positionLocation = glGetAttribLocation(mProgram, "position");
505*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(-1, positionLocation);
506*8975f5c5SAndroid Build Coastguard Worker 
507*8975f5c5SAndroid Build Coastguard Worker         glBindBuffer(GL_ARRAY_BUFFER, mVertexBuffer);
508*8975f5c5SAndroid Build Coastguard Worker         glBufferData(GL_ARRAY_BUFFER, sizeof(mVertices[0]) * mVertices.size(), mVertices.data(),
509*8975f5c5SAndroid Build Coastguard Worker                      GL_STATIC_DRAW);
510*8975f5c5SAndroid Build Coastguard Worker         glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
511*8975f5c5SAndroid Build Coastguard Worker         glEnableVertexAttribArray(positionLocation);
512*8975f5c5SAndroid Build Coastguard Worker 
513*8975f5c5SAndroid Build Coastguard Worker         glClearColor(1, 0, 0, 1);
514*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
515*8975f5c5SAndroid Build Coastguard Worker     }
516*8975f5c5SAndroid Build Coastguard Worker 
readPixels()517*8975f5c5SAndroid Build Coastguard Worker     void readPixels()
518*8975f5c5SAndroid Build Coastguard Worker     {
519*8975f5c5SAndroid Build Coastguard Worker         if (mReadPixels.empty())
520*8975f5c5SAndroid Build Coastguard Worker         {
521*8975f5c5SAndroid Build Coastguard Worker             mReadPixels.resize(getWindowWidth() * getWindowWidth());
522*8975f5c5SAndroid Build Coastguard Worker         }
523*8975f5c5SAndroid Build Coastguard Worker 
524*8975f5c5SAndroid Build Coastguard Worker         glReadPixels(0, 0, getWindowWidth(), getWindowHeight(), GL_RGBA, GL_UNSIGNED_BYTE,
525*8975f5c5SAndroid Build Coastguard Worker                      mReadPixels.data());
526*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
527*8975f5c5SAndroid Build Coastguard Worker     }
528*8975f5c5SAndroid Build Coastguard Worker 
verifyPixelAt(int x,int y,const GLColor & expected)529*8975f5c5SAndroid Build Coastguard Worker     void verifyPixelAt(int x, int y, const GLColor &expected)
530*8975f5c5SAndroid Build Coastguard Worker     {
531*8975f5c5SAndroid Build Coastguard Worker         EXPECT_EQ(mReadPixels[y * getWindowWidth() + x], expected);
532*8975f5c5SAndroid Build Coastguard Worker     }
533*8975f5c5SAndroid Build Coastguard Worker 
verifyTriangles()534*8975f5c5SAndroid Build Coastguard Worker     void verifyTriangles()
535*8975f5c5SAndroid Build Coastguard Worker     {
536*8975f5c5SAndroid Build Coastguard Worker         readPixels();
537*8975f5c5SAndroid Build Coastguard Worker 
538*8975f5c5SAndroid Build Coastguard Worker         // Check 4 lines accross de triangles to make sure we filled it.
539*8975f5c5SAndroid Build Coastguard Worker         // Don't check every pixel as it would slow down our tests.
540*8975f5c5SAndroid Build Coastguard Worker         for (auto x = 0; x < getWindowWidth(); x++)
541*8975f5c5SAndroid Build Coastguard Worker         {
542*8975f5c5SAndroid Build Coastguard Worker             verifyPixelAt(x, x, GLColor::green);
543*8975f5c5SAndroid Build Coastguard Worker         }
544*8975f5c5SAndroid Build Coastguard Worker 
545*8975f5c5SAndroid Build Coastguard Worker         for (auto x = getWindowWidth() / 3, y = 0; x < getWindowWidth(); x++, y++)
546*8975f5c5SAndroid Build Coastguard Worker         {
547*8975f5c5SAndroid Build Coastguard Worker             verifyPixelAt(x, y, GLColor::green);
548*8975f5c5SAndroid Build Coastguard Worker         }
549*8975f5c5SAndroid Build Coastguard Worker 
550*8975f5c5SAndroid Build Coastguard Worker         for (auto x = getWindowWidth() / 2, y = 0; x < getWindowWidth(); x++, y++)
551*8975f5c5SAndroid Build Coastguard Worker         {
552*8975f5c5SAndroid Build Coastguard Worker             verifyPixelAt(x, y, GLColor::green);
553*8975f5c5SAndroid Build Coastguard Worker         }
554*8975f5c5SAndroid Build Coastguard Worker 
555*8975f5c5SAndroid Build Coastguard Worker         for (auto x = (getWindowWidth() / 4) * 3, y = 0; x < getWindowWidth(); x++, y++)
556*8975f5c5SAndroid Build Coastguard Worker         {
557*8975f5c5SAndroid Build Coastguard Worker             verifyPixelAt(x, y, GLColor::green);
558*8975f5c5SAndroid Build Coastguard Worker         }
559*8975f5c5SAndroid Build Coastguard Worker 
560*8975f5c5SAndroid Build Coastguard Worker         // Area outside triangles
561*8975f5c5SAndroid Build Coastguard Worker         for (auto x = 0; x < getWindowWidth() - 2; x++)
562*8975f5c5SAndroid Build Coastguard Worker         {
563*8975f5c5SAndroid Build Coastguard Worker             verifyPixelAt(x, x + 2, GLColor::red);
564*8975f5c5SAndroid Build Coastguard Worker         }
565*8975f5c5SAndroid Build Coastguard Worker     }
566*8975f5c5SAndroid Build Coastguard Worker 
567*8975f5c5SAndroid Build Coastguard Worker     const std::vector<Vector3> mVertices = {{0.0f, 0.0f, 0.0f},
568*8975f5c5SAndroid Build Coastguard Worker                                             {-1.0f, -1.0f, 0.0f},
569*8975f5c5SAndroid Build Coastguard Worker                                             {0.0f, -1.0f, 0.0f},
570*8975f5c5SAndroid Build Coastguard Worker                                             {1.0f, -1.0f, 0.0f},
571*8975f5c5SAndroid Build Coastguard Worker                                             {1.0f, 1.0f, 0.0f}};
572*8975f5c5SAndroid Build Coastguard Worker 
573*8975f5c5SAndroid Build Coastguard Worker     GLBuffer mVertexBuffer;
574*8975f5c5SAndroid Build Coastguard Worker     GLProgram mProgram;
575*8975f5c5SAndroid Build Coastguard Worker 
576*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> mReadPixels;
577*8975f5c5SAndroid Build Coastguard Worker };
578*8975f5c5SAndroid Build Coastguard Worker 
579*8975f5c5SAndroid Build Coastguard Worker // Simple triangle fans test.
TEST_P(TriangleFanDrawTest,DrawTriangleFan)580*8975f5c5SAndroid Build Coastguard Worker TEST_P(TriangleFanDrawTest, DrawTriangleFan)
581*8975f5c5SAndroid Build Coastguard Worker {
582*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
583*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLE_FAN, 0, static_cast<GLsizei>(mVertices.size()));
584*8975f5c5SAndroid Build Coastguard Worker 
585*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
586*8975f5c5SAndroid Build Coastguard Worker 
587*8975f5c5SAndroid Build Coastguard Worker     verifyTriangles();
588*8975f5c5SAndroid Build Coastguard Worker }
589*8975f5c5SAndroid Build Coastguard Worker 
590*8975f5c5SAndroid Build Coastguard Worker // Triangle fans test with index buffer.
TEST_P(TriangleFanDrawTest,DrawTriangleFanElements)591*8975f5c5SAndroid Build Coastguard Worker TEST_P(TriangleFanDrawTest, DrawTriangleFanElements)
592*8975f5c5SAndroid Build Coastguard Worker {
593*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> indices = {0, 1, 2, 3, 4};
594*8975f5c5SAndroid Build Coastguard Worker 
595*8975f5c5SAndroid Build Coastguard Worker     GLBuffer indexBuffer;
596*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
597*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices[0]) * indices.size(), indices.data(),
598*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
599*8975f5c5SAndroid Build Coastguard Worker 
600*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
601*8975f5c5SAndroid Build Coastguard Worker     glDrawElements(GL_TRIANGLE_FAN, static_cast<GLsizei>(indices.size()), GL_UNSIGNED_BYTE, 0);
602*8975f5c5SAndroid Build Coastguard Worker 
603*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
604*8975f5c5SAndroid Build Coastguard Worker 
605*8975f5c5SAndroid Build Coastguard Worker     verifyTriangles();
606*8975f5c5SAndroid Build Coastguard Worker }
607*8975f5c5SAndroid Build Coastguard Worker 
608*8975f5c5SAndroid Build Coastguard Worker // Triangle fans test with primitive restart index at the middle.
TEST_P(TriangleFanDrawTest,DrawTriangleFanPrimitiveRestartAtMiddle)609*8975f5c5SAndroid Build Coastguard Worker TEST_P(TriangleFanDrawTest, DrawTriangleFanPrimitiveRestartAtMiddle)
610*8975f5c5SAndroid Build Coastguard Worker {
611*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
612*8975f5c5SAndroid Build Coastguard Worker 
613*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> indices = {0, 1, 2, 3, 0xff, 0, 4, 3};
614*8975f5c5SAndroid Build Coastguard Worker 
615*8975f5c5SAndroid Build Coastguard Worker     GLBuffer indexBuffer;
616*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
617*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices[0]) * indices.size(), indices.data(),
618*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
619*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
620*8975f5c5SAndroid Build Coastguard Worker 
621*8975f5c5SAndroid Build Coastguard Worker     glDrawElements(GL_TRIANGLE_FAN, static_cast<GLsizei>(indices.size()), GL_UNSIGNED_BYTE, 0);
622*8975f5c5SAndroid Build Coastguard Worker 
623*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
624*8975f5c5SAndroid Build Coastguard Worker 
625*8975f5c5SAndroid Build Coastguard Worker     verifyTriangles();
626*8975f5c5SAndroid Build Coastguard Worker }
627*8975f5c5SAndroid Build Coastguard Worker 
628*8975f5c5SAndroid Build Coastguard Worker // Triangle fans test with primitive restart at begin.
TEST_P(TriangleFanDrawTest,DrawTriangleFanPrimitiveRestartAtBegin)629*8975f5c5SAndroid Build Coastguard Worker TEST_P(TriangleFanDrawTest, DrawTriangleFanPrimitiveRestartAtBegin)
630*8975f5c5SAndroid Build Coastguard Worker {
631*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
632*8975f5c5SAndroid Build Coastguard Worker 
633*8975f5c5SAndroid Build Coastguard Worker     // Primitive restart index is at middle, but we will use draw call which index offset=4.
634*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> indices = {0, 1, 2, 3, 0xff, 0, 4, 3};
635*8975f5c5SAndroid Build Coastguard Worker 
636*8975f5c5SAndroid Build Coastguard Worker     GLBuffer indexBuffer;
637*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
638*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices[0]) * indices.size(), indices.data(),
639*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
640*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
641*8975f5c5SAndroid Build Coastguard Worker 
642*8975f5c5SAndroid Build Coastguard Worker     glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_BYTE, 0);
643*8975f5c5SAndroid Build Coastguard Worker     glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_BYTE,
644*8975f5c5SAndroid Build Coastguard Worker                    reinterpret_cast<void *>(sizeof(indices[0]) * 4));
645*8975f5c5SAndroid Build Coastguard Worker 
646*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
647*8975f5c5SAndroid Build Coastguard Worker 
648*8975f5c5SAndroid Build Coastguard Worker     verifyTriangles();
649*8975f5c5SAndroid Build Coastguard Worker }
650*8975f5c5SAndroid Build Coastguard Worker 
651*8975f5c5SAndroid Build Coastguard Worker // Triangle fans test with primitive restart at end.
TEST_P(TriangleFanDrawTest,DrawTriangleFanPrimitiveRestartAtEnd)652*8975f5c5SAndroid Build Coastguard Worker TEST_P(TriangleFanDrawTest, DrawTriangleFanPrimitiveRestartAtEnd)
653*8975f5c5SAndroid Build Coastguard Worker {
654*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
655*8975f5c5SAndroid Build Coastguard Worker 
656*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> indices = {0, 1, 2, 3, 4, 0xff};
657*8975f5c5SAndroid Build Coastguard Worker 
658*8975f5c5SAndroid Build Coastguard Worker     GLBuffer indexBuffer;
659*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
660*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices[0]) * indices.size(), indices.data(),
661*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
662*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
663*8975f5c5SAndroid Build Coastguard Worker 
664*8975f5c5SAndroid Build Coastguard Worker     glDrawElements(GL_TRIANGLE_FAN, static_cast<GLsizei>(indices.size()), GL_UNSIGNED_BYTE, 0);
665*8975f5c5SAndroid Build Coastguard Worker 
666*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
667*8975f5c5SAndroid Build Coastguard Worker 
668*8975f5c5SAndroid Build Coastguard Worker     verifyTriangles();
669*8975f5c5SAndroid Build Coastguard Worker }
670*8975f5c5SAndroid Build Coastguard Worker 
671*8975f5c5SAndroid Build Coastguard Worker // Triangle fans test with primitive restart enabled, but no indexed draw.
TEST_P(TriangleFanDrawTest,DrawTriangleFanPrimitiveRestartNonIndexedDraw)672*8975f5c5SAndroid Build Coastguard Worker TEST_P(TriangleFanDrawTest, DrawTriangleFanPrimitiveRestartNonIndexedDraw)
673*8975f5c5SAndroid Build Coastguard Worker {
674*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
675*8975f5c5SAndroid Build Coastguard Worker 
676*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> indices = {0, 1, 2, 3, 4};
677*8975f5c5SAndroid Build Coastguard Worker 
678*8975f5c5SAndroid Build Coastguard Worker     GLBuffer indexBuffer;
679*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
680*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices[0]) * indices.size(), indices.data(),
681*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
682*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
683*8975f5c5SAndroid Build Coastguard Worker 
684*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLE_FAN, 0, 5);
685*8975f5c5SAndroid Build Coastguard Worker 
686*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
687*8975f5c5SAndroid Build Coastguard Worker 
688*8975f5c5SAndroid Build Coastguard Worker     verifyTriangles();
689*8975f5c5SAndroid Build Coastguard Worker }
690*8975f5c5SAndroid Build Coastguard Worker 
691*8975f5c5SAndroid Build Coastguard Worker // Simple repeated draw and swap test.
TEST_P(SimpleOperationTest,DrawQuadAndSwap)692*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, DrawQuadAndSwap)
693*8975f5c5SAndroid Build Coastguard Worker {
694*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
695*8975f5c5SAndroid Build Coastguard Worker 
696*8975f5c5SAndroid Build Coastguard Worker     for (int i = 0; i < 8; ++i)
697*8975f5c5SAndroid Build Coastguard Worker     {
698*8975f5c5SAndroid Build Coastguard Worker         drawQuad(program, "position", 0.5f, 1.0f, true);
699*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
700*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
701*8975f5c5SAndroid Build Coastguard Worker         swapBuffers();
702*8975f5c5SAndroid Build Coastguard Worker     }
703*8975f5c5SAndroid Build Coastguard Worker 
704*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
705*8975f5c5SAndroid Build Coastguard Worker }
706*8975f5c5SAndroid Build Coastguard Worker 
707*8975f5c5SAndroid Build Coastguard Worker // Simple indexed quad test.
TEST_P(SimpleOperationTest,DrawIndexedQuad)708*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, DrawIndexedQuad)
709*8975f5c5SAndroid Build Coastguard Worker {
710*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
711*8975f5c5SAndroid Build Coastguard Worker 
712*8975f5c5SAndroid Build Coastguard Worker     drawIndexedQuad(program, "position", 0.5f, 1.0f, true);
713*8975f5c5SAndroid Build Coastguard Worker 
714*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
715*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
716*8975f5c5SAndroid Build Coastguard Worker }
717*8975f5c5SAndroid Build Coastguard Worker 
718*8975f5c5SAndroid Build Coastguard Worker // Simple repeated indexed draw and swap test.
TEST_P(SimpleOperationTest,DrawIndexedQuadAndSwap)719*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, DrawIndexedQuadAndSwap)
720*8975f5c5SAndroid Build Coastguard Worker {
721*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
722*8975f5c5SAndroid Build Coastguard Worker 
723*8975f5c5SAndroid Build Coastguard Worker     // 32 iterations is an arbitrary number. The more iterations, the more flaky syncronization
724*8975f5c5SAndroid Build Coastguard Worker     // issues will reproduce consistently.
725*8975f5c5SAndroid Build Coastguard Worker     for (int i = 0; i < 32; ++i)
726*8975f5c5SAndroid Build Coastguard Worker     {
727*8975f5c5SAndroid Build Coastguard Worker         drawIndexedQuad(program, "position", 0.5f, 1.0f, true);
728*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
729*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
730*8975f5c5SAndroid Build Coastguard Worker         swapBuffers();
731*8975f5c5SAndroid Build Coastguard Worker     }
732*8975f5c5SAndroid Build Coastguard Worker 
733*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
734*8975f5c5SAndroid Build Coastguard Worker }
735*8975f5c5SAndroid Build Coastguard Worker 
736*8975f5c5SAndroid Build Coastguard Worker // Draw with a fragment uniform.
TEST_P(SimpleOperationTest,DrawQuadWithFragmentUniform)737*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, DrawQuadWithFragmentUniform)
738*8975f5c5SAndroid Build Coastguard Worker {
739*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] =
740*8975f5c5SAndroid Build Coastguard Worker         "uniform mediump vec4 color;\n"
741*8975f5c5SAndroid Build Coastguard Worker         "void main()\n"
742*8975f5c5SAndroid Build Coastguard Worker         "{\n"
743*8975f5c5SAndroid Build Coastguard Worker         "    gl_FragColor = color;\n"
744*8975f5c5SAndroid Build Coastguard Worker         "}";
745*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kBasicVertexShader, kFS);
746*8975f5c5SAndroid Build Coastguard Worker 
747*8975f5c5SAndroid Build Coastguard Worker     GLint location = glGetUniformLocation(program, "color");
748*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, location);
749*8975f5c5SAndroid Build Coastguard Worker 
750*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
751*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(location, 0.0f, 1.0f, 0.0f, 1.0f);
752*8975f5c5SAndroid Build Coastguard Worker 
753*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f, 1.0f, true);
754*8975f5c5SAndroid Build Coastguard Worker 
755*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
756*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
757*8975f5c5SAndroid Build Coastguard Worker }
758*8975f5c5SAndroid Build Coastguard Worker 
759*8975f5c5SAndroid Build Coastguard Worker // Draw with a vertex uniform.
TEST_P(SimpleOperationTest,DrawQuadWithVertexUniform)760*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, DrawQuadWithVertexUniform)
761*8975f5c5SAndroid Build Coastguard Worker {
762*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] =
763*8975f5c5SAndroid Build Coastguard Worker         "attribute vec3 position;\n"
764*8975f5c5SAndroid Build Coastguard Worker         "uniform vec4 color;\n"
765*8975f5c5SAndroid Build Coastguard Worker         "varying vec4 vcolor;\n"
766*8975f5c5SAndroid Build Coastguard Worker         "void main()\n"
767*8975f5c5SAndroid Build Coastguard Worker         "{\n"
768*8975f5c5SAndroid Build Coastguard Worker         "    gl_Position = vec4(position, 1);\n"
769*8975f5c5SAndroid Build Coastguard Worker         "    vcolor = color;\n"
770*8975f5c5SAndroid Build Coastguard Worker         "}";
771*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] =
772*8975f5c5SAndroid Build Coastguard Worker         "varying mediump vec4 vcolor;\n"
773*8975f5c5SAndroid Build Coastguard Worker         "void main()\n"
774*8975f5c5SAndroid Build Coastguard Worker         "{\n"
775*8975f5c5SAndroid Build Coastguard Worker         "    gl_FragColor = vcolor;\n"
776*8975f5c5SAndroid Build Coastguard Worker         "}";
777*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
778*8975f5c5SAndroid Build Coastguard Worker 
779*8975f5c5SAndroid Build Coastguard Worker     const GLint location = glGetUniformLocation(program, "color");
780*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, location);
781*8975f5c5SAndroid Build Coastguard Worker 
782*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
783*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(location, 0.0f, 1.0f, 0.0f, 1.0f);
784*8975f5c5SAndroid Build Coastguard Worker 
785*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f, 1.0f, true);
786*8975f5c5SAndroid Build Coastguard Worker 
787*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
788*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
789*8975f5c5SAndroid Build Coastguard Worker }
790*8975f5c5SAndroid Build Coastguard Worker 
791*8975f5c5SAndroid Build Coastguard Worker // Draw with two uniforms.
TEST_P(SimpleOperationTest,DrawQuadWithTwoUniforms)792*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, DrawQuadWithTwoUniforms)
793*8975f5c5SAndroid Build Coastguard Worker {
794*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] =
795*8975f5c5SAndroid Build Coastguard Worker         "attribute vec3 position;\n"
796*8975f5c5SAndroid Build Coastguard Worker         "uniform vec4 color1;\n"
797*8975f5c5SAndroid Build Coastguard Worker         "varying vec4 vcolor1;\n"
798*8975f5c5SAndroid Build Coastguard Worker         "void main()\n"
799*8975f5c5SAndroid Build Coastguard Worker         "{\n"
800*8975f5c5SAndroid Build Coastguard Worker         "    gl_Position = vec4(position, 1);\n"
801*8975f5c5SAndroid Build Coastguard Worker         "    vcolor1 = color1;\n"
802*8975f5c5SAndroid Build Coastguard Worker         "}";
803*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] =
804*8975f5c5SAndroid Build Coastguard Worker         "uniform mediump vec4 color2;\n"
805*8975f5c5SAndroid Build Coastguard Worker         "varying mediump vec4 vcolor1;\n"
806*8975f5c5SAndroid Build Coastguard Worker         "void main()\n"
807*8975f5c5SAndroid Build Coastguard Worker         "{\n"
808*8975f5c5SAndroid Build Coastguard Worker         "    gl_FragColor = vcolor1 + color2;\n"
809*8975f5c5SAndroid Build Coastguard Worker         "}";
810*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
811*8975f5c5SAndroid Build Coastguard Worker 
812*8975f5c5SAndroid Build Coastguard Worker     const GLint location1 = glGetUniformLocation(program, "color1");
813*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, location1);
814*8975f5c5SAndroid Build Coastguard Worker 
815*8975f5c5SAndroid Build Coastguard Worker     const GLint location2 = glGetUniformLocation(program, "color2");
816*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, location2);
817*8975f5c5SAndroid Build Coastguard Worker 
818*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
819*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(location1, 0.0f, 1.0f, 0.0f, 1.0f);
820*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(location2, 1.0f, 0.0f, 0.0f, 1.0f);
821*8975f5c5SAndroid Build Coastguard Worker 
822*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f, 1.0f, true);
823*8975f5c5SAndroid Build Coastguard Worker 
824*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
825*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::yellow);
826*8975f5c5SAndroid Build Coastguard Worker }
827*8975f5c5SAndroid Build Coastguard Worker 
828*8975f5c5SAndroid Build Coastguard Worker // Tests a shader program with more than one vertex attribute, with vertex buffers.
TEST_P(SimpleOperationTest,ThreeVertexAttributes)829*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, ThreeVertexAttributes)
830*8975f5c5SAndroid Build Coastguard Worker {
831*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] = R"(attribute vec2 position;
832*8975f5c5SAndroid Build Coastguard Worker attribute vec4 color1;
833*8975f5c5SAndroid Build Coastguard Worker attribute vec4 color2;
834*8975f5c5SAndroid Build Coastguard Worker varying vec4 color;
835*8975f5c5SAndroid Build Coastguard Worker void main()
836*8975f5c5SAndroid Build Coastguard Worker {
837*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(position, 0, 1);
838*8975f5c5SAndroid Build Coastguard Worker     color = color1 + color2;
839*8975f5c5SAndroid Build Coastguard Worker })";
840*8975f5c5SAndroid Build Coastguard Worker 
841*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] = R"(precision mediump float;
842*8975f5c5SAndroid Build Coastguard Worker varying vec4 color;
843*8975f5c5SAndroid Build Coastguard Worker void main()
844*8975f5c5SAndroid Build Coastguard Worker {
845*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = color;
846*8975f5c5SAndroid Build Coastguard Worker }
847*8975f5c5SAndroid Build Coastguard Worker )";
848*8975f5c5SAndroid Build Coastguard Worker 
849*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVS, kFS);
850*8975f5c5SAndroid Build Coastguard Worker 
851*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
852*8975f5c5SAndroid Build Coastguard Worker 
853*8975f5c5SAndroid Build Coastguard Worker     const GLint color1Loc = glGetAttribLocation(program, "color1");
854*8975f5c5SAndroid Build Coastguard Worker     const GLint color2Loc = glGetAttribLocation(program, "color2");
855*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, color1Loc);
856*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, color2Loc);
857*8975f5c5SAndroid Build Coastguard Worker 
858*8975f5c5SAndroid Build Coastguard Worker     const auto &indices = GetQuadIndices();
859*8975f5c5SAndroid Build Coastguard Worker 
860*8975f5c5SAndroid Build Coastguard Worker     // Make colored corners with red == x or 1 -x , and green = y or 1 - y.
861*8975f5c5SAndroid Build Coastguard Worker 
862*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, 4> baseColors1 = {
863*8975f5c5SAndroid Build Coastguard Worker         {GLColor::black, GLColor::red, GLColor::green, GLColor::yellow}};
864*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, 4> baseColors2 = {
865*8975f5c5SAndroid Build Coastguard Worker         {GLColor::yellow, GLColor::green, GLColor::red, GLColor::black}};
866*8975f5c5SAndroid Build Coastguard Worker 
867*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> colors1;
868*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> colors2;
869*8975f5c5SAndroid Build Coastguard Worker 
870*8975f5c5SAndroid Build Coastguard Worker     for (GLushort index : indices)
871*8975f5c5SAndroid Build Coastguard Worker     {
872*8975f5c5SAndroid Build Coastguard Worker         colors1.push_back(baseColors1[index]);
873*8975f5c5SAndroid Build Coastguard Worker         colors2.push_back(baseColors2[index]);
874*8975f5c5SAndroid Build Coastguard Worker     }
875*8975f5c5SAndroid Build Coastguard Worker 
876*8975f5c5SAndroid Build Coastguard Worker     GLBuffer color1Buffer;
877*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, color1Buffer);
878*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, colors1.size() * sizeof(GLColor), colors1.data(), GL_STATIC_DRAW);
879*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(color1Loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, nullptr);
880*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(color1Loc);
881*8975f5c5SAndroid Build Coastguard Worker 
882*8975f5c5SAndroid Build Coastguard Worker     GLBuffer color2Buffer;
883*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, color2Buffer);
884*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, colors2.size() * sizeof(GLColor), colors2.data(), GL_STATIC_DRAW);
885*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(color2Loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, nullptr);
886*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(color2Loc);
887*8975f5c5SAndroid Build Coastguard Worker 
888*8975f5c5SAndroid Build Coastguard Worker     // Draw a non-indexed quad with all vertex buffers. Should draw yellow to the entire window.
889*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f, 1.0f, true);
890*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
891*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_RECT_EQ(0, 0, getWindowWidth(), getWindowHeight(), GLColor::yellow);
892*8975f5c5SAndroid Build Coastguard Worker }
893*8975f5c5SAndroid Build Coastguard Worker 
894*8975f5c5SAndroid Build Coastguard Worker // Creates a 2D texture, no other operations.
TEST_P(SimpleOperationTest,CreateTexture2DNoData)895*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, CreateTexture2DNoData)
896*8975f5c5SAndroid Build Coastguard Worker {
897*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
898*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
899*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
900*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
901*8975f5c5SAndroid Build Coastguard Worker }
902*8975f5c5SAndroid Build Coastguard Worker 
903*8975f5c5SAndroid Build Coastguard Worker // Creates a 2D texture, no other operations.
TEST_P(SimpleOperationTest,CreateTexture2DWithData)904*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, CreateTexture2DWithData)
905*8975f5c5SAndroid Build Coastguard Worker {
906*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> colors(16 * 16, GLColor::red);
907*8975f5c5SAndroid Build Coastguard Worker 
908*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
909*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
910*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, colors.data());
911*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
912*8975f5c5SAndroid Build Coastguard Worker }
913*8975f5c5SAndroid Build Coastguard Worker 
914*8975f5c5SAndroid Build Coastguard Worker // Creates a cube texture, no other operations.
TEST_P(SimpleOperationTest,CreateTextureCubeNoData)915*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, CreateTextureCubeNoData)
916*8975f5c5SAndroid Build Coastguard Worker {
917*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
918*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, texture);
919*8975f5c5SAndroid Build Coastguard Worker     for (GLenum cubeFace : kCubeFaces)
920*8975f5c5SAndroid Build Coastguard Worker     {
921*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(cubeFace, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
922*8975f5c5SAndroid Build Coastguard Worker     }
923*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
924*8975f5c5SAndroid Build Coastguard Worker }
925*8975f5c5SAndroid Build Coastguard Worker 
926*8975f5c5SAndroid Build Coastguard Worker // Creates a cube texture, no other operations.
TEST_P(SimpleOperationTest,CreateTextureCubeWithData)927*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, CreateTextureCubeWithData)
928*8975f5c5SAndroid Build Coastguard Worker {
929*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLColor> colors(16 * 16, GLColor::red);
930*8975f5c5SAndroid Build Coastguard Worker 
931*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
932*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, texture);
933*8975f5c5SAndroid Build Coastguard Worker     for (GLenum cubeFace : kCubeFaces)
934*8975f5c5SAndroid Build Coastguard Worker     {
935*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(cubeFace, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, colors.data());
936*8975f5c5SAndroid Build Coastguard Worker     }
937*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
938*8975f5c5SAndroid Build Coastguard Worker }
939*8975f5c5SAndroid Build Coastguard Worker 
940*8975f5c5SAndroid Build Coastguard Worker // Creates a program with a texture.
TEST_P(SimpleOperationTest,LinkProgramWithTexture)941*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, LinkProgramWithTexture)
942*8975f5c5SAndroid Build Coastguard Worker {
943*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(0u, get2DTexturedQuadProgram());
944*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
945*8975f5c5SAndroid Build Coastguard Worker }
946*8975f5c5SAndroid Build Coastguard Worker 
947*8975f5c5SAndroid Build Coastguard Worker // Creates a program with a 2D texture and renders with it.
TEST_P(SimpleOperationTest,DrawWith2DTexture)948*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, DrawWith2DTexture)
949*8975f5c5SAndroid Build Coastguard Worker {
950*8975f5c5SAndroid Build Coastguard Worker     std::array<GLColor, 4> colors = {
951*8975f5c5SAndroid Build Coastguard Worker         {GLColor::red, GLColor::green, GLColor::blue, GLColor::yellow}};
952*8975f5c5SAndroid Build Coastguard Worker 
953*8975f5c5SAndroid Build Coastguard Worker     GLTexture tex;
954*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, tex);
955*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, colors.data());
956*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
957*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
958*8975f5c5SAndroid Build Coastguard Worker 
959*8975f5c5SAndroid Build Coastguard Worker     draw2DTexturedQuad(0.5f, 1.0f, true);
960*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
961*8975f5c5SAndroid Build Coastguard Worker 
962*8975f5c5SAndroid Build Coastguard Worker     int w = getWindowWidth() - 2;
963*8975f5c5SAndroid Build Coastguard Worker     int h = getWindowHeight() - 2;
964*8975f5c5SAndroid Build Coastguard Worker 
965*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
966*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(w, 0, GLColor::green);
967*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, h, GLColor::blue);
968*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(w, h, GLColor::yellow);
969*8975f5c5SAndroid Build Coastguard Worker }
970*8975f5c5SAndroid Build Coastguard Worker 
971*8975f5c5SAndroid Build Coastguard Worker template <typename T>
testDrawElementsLineLoopUsingClientSideMemory(GLenum indexType,int windowWidth,int windowHeight)972*8975f5c5SAndroid Build Coastguard Worker void SimpleOperationTest::testDrawElementsLineLoopUsingClientSideMemory(GLenum indexType,
973*8975f5c5SAndroid Build Coastguard Worker                                                                         int windowWidth,
974*8975f5c5SAndroid Build Coastguard Worker                                                                         int windowHeight)
975*8975f5c5SAndroid Build Coastguard Worker {
976*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
977*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
978*8975f5c5SAndroid Build Coastguard Worker 
979*8975f5c5SAndroid Build Coastguard Worker     // We expect to draw a square with these 4 vertices with a drawArray call.
980*8975f5c5SAndroid Build Coastguard Worker     std::vector<Vector3> vertices;
981*8975f5c5SAndroid Build Coastguard Worker     CreatePixelCenterWindowCoords({{32, 96}, {32, 32}, {96, 32}, {96, 96}}, windowWidth,
982*8975f5c5SAndroid Build Coastguard Worker                                   windowHeight, &vertices);
983*8975f5c5SAndroid Build Coastguard Worker 
984*8975f5c5SAndroid Build Coastguard Worker     // If we use these indices to draw however, we should be drawing an hourglass.
985*8975f5c5SAndroid Build Coastguard Worker     std::vector<T> indices{3, 2, 1, 0};
986*8975f5c5SAndroid Build Coastguard Worker 
987*8975f5c5SAndroid Build Coastguard Worker     GLint positionLocation = glGetAttribLocation(program, "position");
988*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, positionLocation);
989*8975f5c5SAndroid Build Coastguard Worker 
990*8975f5c5SAndroid Build Coastguard Worker     GLBuffer vertexBuffer;
991*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
992*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * vertices.size(), vertices.data(),
993*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
994*8975f5c5SAndroid Build Coastguard Worker 
995*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
996*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(positionLocation);
997*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
998*8975f5c5SAndroid Build Coastguard Worker     glDrawElements(GL_LINE_LOOP, 4, indexType, indices.data());
999*8975f5c5SAndroid Build Coastguard Worker     glDisableVertexAttribArray(positionLocation);
1000*8975f5c5SAndroid Build Coastguard Worker 
1001*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1002*8975f5c5SAndroid Build Coastguard Worker 
1003*8975f5c5SAndroid Build Coastguard Worker     int quarterWidth  = windowWidth / 4;
1004*8975f5c5SAndroid Build Coastguard Worker     int quarterHeight = windowHeight / 4;
1005*8975f5c5SAndroid Build Coastguard Worker 
1006*8975f5c5SAndroid Build Coastguard Worker     // Bottom left
1007*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(quarterWidth, quarterHeight, GLColor::green);
1008*8975f5c5SAndroid Build Coastguard Worker 
1009*8975f5c5SAndroid Build Coastguard Worker     // Top left
1010*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(quarterWidth, (quarterHeight * 3), GLColor::green);
1011*8975f5c5SAndroid Build Coastguard Worker 
1012*8975f5c5SAndroid Build Coastguard Worker     // Top right
1013*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ((quarterWidth * 3), (quarterHeight * 3) - 1, GLColor::green);
1014*8975f5c5SAndroid Build Coastguard Worker 
1015*8975f5c5SAndroid Build Coastguard Worker     // Verify line is closed between the 2 last vertices
1016*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ((quarterWidth * 2), quarterHeight, GLColor::green);
1017*8975f5c5SAndroid Build Coastguard Worker }
1018*8975f5c5SAndroid Build Coastguard Worker 
1019*8975f5c5SAndroid Build Coastguard Worker // Draw a line loop using a drawElement call and client side memory.
TEST_P(SimpleOperationTest,DrawElementsLineLoopUsingUShortClientSideMemory)1020*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, DrawElementsLineLoopUsingUShortClientSideMemory)
1021*8975f5c5SAndroid Build Coastguard Worker {
1022*8975f5c5SAndroid Build Coastguard Worker     testDrawElementsLineLoopUsingClientSideMemory<GLushort>(GL_UNSIGNED_SHORT, getWindowWidth(),
1023*8975f5c5SAndroid Build Coastguard Worker                                                             getWindowHeight());
1024*8975f5c5SAndroid Build Coastguard Worker }
1025*8975f5c5SAndroid Build Coastguard Worker 
1026*8975f5c5SAndroid Build Coastguard Worker // Draw a line loop using a drawElement call and client side memory.
TEST_P(SimpleOperationTest,DrawElementsLineLoopUsingUByteClientSideMemory)1027*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, DrawElementsLineLoopUsingUByteClientSideMemory)
1028*8975f5c5SAndroid Build Coastguard Worker {
1029*8975f5c5SAndroid Build Coastguard Worker     testDrawElementsLineLoopUsingClientSideMemory<GLubyte>(GL_UNSIGNED_BYTE, getWindowWidth(),
1030*8975f5c5SAndroid Build Coastguard Worker                                                            getWindowHeight());
1031*8975f5c5SAndroid Build Coastguard Worker }
1032*8975f5c5SAndroid Build Coastguard Worker 
1033*8975f5c5SAndroid Build Coastguard Worker // Creates a program with a cube texture and renders with it.
TEST_P(SimpleOperationTest,DrawWithCubeTexture)1034*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, DrawWithCubeTexture)
1035*8975f5c5SAndroid Build Coastguard Worker {
1036*8975f5c5SAndroid Build Coastguard Worker     std::array<Vector2, 6 * 4> positions = {{
1037*8975f5c5SAndroid Build Coastguard Worker         {0, 1}, {1, 1}, {1, 2}, {0, 2} /* first face */,
1038*8975f5c5SAndroid Build Coastguard Worker         {1, 0}, {2, 0}, {2, 1}, {1, 1} /* second face */,
1039*8975f5c5SAndroid Build Coastguard Worker         {1, 1}, {2, 1}, {2, 2}, {1, 2} /* third face */,
1040*8975f5c5SAndroid Build Coastguard Worker         {1, 2}, {2, 2}, {2, 3}, {1, 3} /* fourth face */,
1041*8975f5c5SAndroid Build Coastguard Worker         {2, 1}, {3, 1}, {3, 2}, {2, 2} /* fifth face */,
1042*8975f5c5SAndroid Build Coastguard Worker         {3, 1}, {4, 1}, {4, 2}, {3, 2} /* sixth face */,
1043*8975f5c5SAndroid Build Coastguard Worker     }};
1044*8975f5c5SAndroid Build Coastguard Worker 
1045*8975f5c5SAndroid Build Coastguard Worker     const float w4 = 1.0f / 4.0f;
1046*8975f5c5SAndroid Build Coastguard Worker     const float h3 = 1.0f / 3.0f;
1047*8975f5c5SAndroid Build Coastguard Worker 
1048*8975f5c5SAndroid Build Coastguard Worker     // This draws a "T" shape based on the four faces of the cube. The window is divided into four
1049*8975f5c5SAndroid Build Coastguard Worker     // tiles horizontally and three tiles vertically (hence the w4 and h3 variable naming).
1050*8975f5c5SAndroid Build Coastguard Worker     for (Vector2 &pos : positions)
1051*8975f5c5SAndroid Build Coastguard Worker     {
1052*8975f5c5SAndroid Build Coastguard Worker         pos.data()[0] = pos.data()[0] * w4 * 2.0f - 1.0f;
1053*8975f5c5SAndroid Build Coastguard Worker         pos.data()[1] = pos.data()[1] * h3 * 2.0f - 1.0f;
1054*8975f5c5SAndroid Build Coastguard Worker     }
1055*8975f5c5SAndroid Build Coastguard Worker 
1056*8975f5c5SAndroid Build Coastguard Worker     const Vector3 posX(1, 0, 0);
1057*8975f5c5SAndroid Build Coastguard Worker     const Vector3 negX(-1, 0, 0);
1058*8975f5c5SAndroid Build Coastguard Worker     const Vector3 posY(0, 1, 0);
1059*8975f5c5SAndroid Build Coastguard Worker     const Vector3 negY(0, -1, 0);
1060*8975f5c5SAndroid Build Coastguard Worker     const Vector3 posZ(0, 0, 1);
1061*8975f5c5SAndroid Build Coastguard Worker     const Vector3 negZ(0, 0, -1);
1062*8975f5c5SAndroid Build Coastguard Worker 
1063*8975f5c5SAndroid Build Coastguard Worker     std::array<Vector3, 6 * 4> coords = {{
1064*8975f5c5SAndroid Build Coastguard Worker         posX, posX, posX, posX /* first face */, negX, negX, negX, negX /* second face */,
1065*8975f5c5SAndroid Build Coastguard Worker         posY, posY, posY, posY /* third face */, negY, negY, negY, negY /* fourth face */,
1066*8975f5c5SAndroid Build Coastguard Worker         posZ, posZ, posZ, posZ /* fifth face */, negZ, negZ, negZ, negZ /* sixth face */,
1067*8975f5c5SAndroid Build Coastguard Worker     }};
1068*8975f5c5SAndroid Build Coastguard Worker 
1069*8975f5c5SAndroid Build Coastguard Worker     const std::array<std::array<GLColor, 4>, 6> colors = {{
1070*8975f5c5SAndroid Build Coastguard Worker         {GLColor::red, GLColor::red, GLColor::red, GLColor::red},
1071*8975f5c5SAndroid Build Coastguard Worker         {GLColor::green, GLColor::green, GLColor::green, GLColor::green},
1072*8975f5c5SAndroid Build Coastguard Worker         {GLColor::blue, GLColor::blue, GLColor::blue, GLColor::blue},
1073*8975f5c5SAndroid Build Coastguard Worker         {GLColor::yellow, GLColor::yellow, GLColor::yellow, GLColor::yellow},
1074*8975f5c5SAndroid Build Coastguard Worker         {GLColor::cyan, GLColor::cyan, GLColor::cyan, GLColor::cyan},
1075*8975f5c5SAndroid Build Coastguard Worker         {GLColor::magenta, GLColor::magenta, GLColor::magenta, GLColor::magenta},
1076*8975f5c5SAndroid Build Coastguard Worker     }};
1077*8975f5c5SAndroid Build Coastguard Worker 
1078*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
1079*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, texture);
1080*8975f5c5SAndroid Build Coastguard Worker 
1081*8975f5c5SAndroid Build Coastguard Worker     for (size_t faceIndex = 0; faceIndex < kCubeFaces.size(); ++faceIndex)
1082*8975f5c5SAndroid Build Coastguard Worker     {
1083*8975f5c5SAndroid Build Coastguard Worker         glTexImage2D(kCubeFaces[faceIndex], 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1084*8975f5c5SAndroid Build Coastguard Worker                      colors[faceIndex].data());
1085*8975f5c5SAndroid Build Coastguard Worker     }
1086*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1087*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1088*8975f5c5SAndroid Build Coastguard Worker 
1089*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVertexShader[] = R"(attribute vec2 pos;
1090*8975f5c5SAndroid Build Coastguard Worker attribute vec3 coord;
1091*8975f5c5SAndroid Build Coastguard Worker varying vec3 texCoord;
1092*8975f5c5SAndroid Build Coastguard Worker void main()
1093*8975f5c5SAndroid Build Coastguard Worker {
1094*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vec4(pos, 0, 1);
1095*8975f5c5SAndroid Build Coastguard Worker     texCoord = coord;
1096*8975f5c5SAndroid Build Coastguard Worker })";
1097*8975f5c5SAndroid Build Coastguard Worker 
1098*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFragmentShader[] = R"(precision mediump float;
1099*8975f5c5SAndroid Build Coastguard Worker varying vec3 texCoord;
1100*8975f5c5SAndroid Build Coastguard Worker uniform samplerCube tex;
1101*8975f5c5SAndroid Build Coastguard Worker void main()
1102*8975f5c5SAndroid Build Coastguard Worker {
1103*8975f5c5SAndroid Build Coastguard Worker     gl_FragColor = textureCube(tex, texCoord);
1104*8975f5c5SAndroid Build Coastguard Worker })";
1105*8975f5c5SAndroid Build Coastguard Worker 
1106*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kVertexShader, kFragmentShader);
1107*8975f5c5SAndroid Build Coastguard Worker     GLint samplerLoc = glGetUniformLocation(program, "tex");
1108*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(samplerLoc, 0);
1109*8975f5c5SAndroid Build Coastguard Worker 
1110*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
1111*8975f5c5SAndroid Build Coastguard Worker 
1112*8975f5c5SAndroid Build Coastguard Worker     GLint posLoc = glGetAttribLocation(program, "pos");
1113*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, posLoc);
1114*8975f5c5SAndroid Build Coastguard Worker 
1115*8975f5c5SAndroid Build Coastguard Worker     GLint coordLoc = glGetAttribLocation(program, "coord");
1116*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, coordLoc);
1117*8975f5c5SAndroid Build Coastguard Worker 
1118*8975f5c5SAndroid Build Coastguard Worker     GLBuffer posBuffer;
1119*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, posBuffer);
1120*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, positions.size() * sizeof(Vector2), positions.data(),
1121*8975f5c5SAndroid Build Coastguard Worker                  GL_STATIC_DRAW);
1122*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(posLoc, 2, GL_FLOAT, GL_FALSE, 0, nullptr);
1123*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(posLoc);
1124*8975f5c5SAndroid Build Coastguard Worker 
1125*8975f5c5SAndroid Build Coastguard Worker     GLBuffer coordBuffer;
1126*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ARRAY_BUFFER, coordBuffer);
1127*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ARRAY_BUFFER, coords.size() * sizeof(Vector3), coords.data(), GL_STATIC_DRAW);
1128*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(coordLoc, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
1129*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(coordLoc);
1130*8975f5c5SAndroid Build Coastguard Worker 
1131*8975f5c5SAndroid Build Coastguard Worker     auto quadIndices = GetQuadIndices();
1132*8975f5c5SAndroid Build Coastguard Worker     std::array<GLushort, 6 * 6> kElementsData;
1133*8975f5c5SAndroid Build Coastguard Worker     for (GLushort quadIndex = 0; quadIndex < 6; ++quadIndex)
1134*8975f5c5SAndroid Build Coastguard Worker     {
1135*8975f5c5SAndroid Build Coastguard Worker         for (GLushort elementIndex = 0; elementIndex < 6; ++elementIndex)
1136*8975f5c5SAndroid Build Coastguard Worker         {
1137*8975f5c5SAndroid Build Coastguard Worker             kElementsData[quadIndex * 6 + elementIndex] = quadIndices[elementIndex] + 4 * quadIndex;
1138*8975f5c5SAndroid Build Coastguard Worker         }
1139*8975f5c5SAndroid Build Coastguard Worker     }
1140*8975f5c5SAndroid Build Coastguard Worker 
1141*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
1142*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1143*8975f5c5SAndroid Build Coastguard Worker 
1144*8975f5c5SAndroid Build Coastguard Worker     GLBuffer elementBuffer;
1145*8975f5c5SAndroid Build Coastguard Worker     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuffer);
1146*8975f5c5SAndroid Build Coastguard Worker     glBufferData(GL_ELEMENT_ARRAY_BUFFER, kElementsData.size() * sizeof(GLushort),
1147*8975f5c5SAndroid Build Coastguard Worker                  kElementsData.data(), GL_STATIC_DRAW);
1148*8975f5c5SAndroid Build Coastguard Worker     glDrawElements(GL_TRIANGLES, static_cast<GLsizei>(kElementsData.size()), GL_UNSIGNED_SHORT,
1149*8975f5c5SAndroid Build Coastguard Worker                    nullptr);
1150*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1151*8975f5c5SAndroid Build Coastguard Worker 
1152*8975f5c5SAndroid Build Coastguard Worker     for (int faceIndex = 0; faceIndex < 6; ++faceIndex)
1153*8975f5c5SAndroid Build Coastguard Worker     {
1154*8975f5c5SAndroid Build Coastguard Worker         int index      = faceIndex * 4;
1155*8975f5c5SAndroid Build Coastguard Worker         Vector2 center = (positions[index] + positions[index + 1] + positions[index + 2] +
1156*8975f5c5SAndroid Build Coastguard Worker                           positions[index + 3]) /
1157*8975f5c5SAndroid Build Coastguard Worker                          4.0f;
1158*8975f5c5SAndroid Build Coastguard Worker         center *= 0.5f;
1159*8975f5c5SAndroid Build Coastguard Worker         center += Vector2(0.5f);
1160*8975f5c5SAndroid Build Coastguard Worker         center *= Vector2(getWindowWidth(), getWindowHeight());
1161*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(static_cast<GLint>(center.x()), static_cast<GLint>(center.y()),
1162*8975f5c5SAndroid Build Coastguard Worker                               colors[faceIndex][0]);
1163*8975f5c5SAndroid Build Coastguard Worker     }
1164*8975f5c5SAndroid Build Coastguard Worker }
1165*8975f5c5SAndroid Build Coastguard Worker 
1166*8975f5c5SAndroid Build Coastguard Worker // Tests rendering to a user framebuffer.
TEST_P(SimpleOperationTest,RenderToTexture)1167*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, RenderToTexture)
1168*8975f5c5SAndroid Build Coastguard Worker {
1169*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize = 16;
1170*8975f5c5SAndroid Build Coastguard Worker 
1171*8975f5c5SAndroid Build Coastguard Worker     GLTexture texture;
1172*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, texture);
1173*8975f5c5SAndroid Build Coastguard Worker     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1174*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1175*8975f5c5SAndroid Build Coastguard Worker 
1176*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
1177*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1178*8975f5c5SAndroid Build Coastguard Worker     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
1179*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1180*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1181*8975f5c5SAndroid Build Coastguard Worker 
1182*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
1183*8975f5c5SAndroid Build Coastguard Worker 
1184*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
1185*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f, 1.0f, true);
1186*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1187*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1188*8975f5c5SAndroid Build Coastguard Worker }
1189*8975f5c5SAndroid Build Coastguard Worker 
1190*8975f5c5SAndroid Build Coastguard Worker // Create a simple basic Renderbuffer.
TEST_P(SimpleOperationTest,CreateRenderbuffer)1191*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, CreateRenderbuffer)
1192*8975f5c5SAndroid Build Coastguard Worker {
1193*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer renderbuffer;
1194*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
1195*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 16, 16);
1196*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1197*8975f5c5SAndroid Build Coastguard Worker }
1198*8975f5c5SAndroid Build Coastguard Worker 
1199*8975f5c5SAndroid Build Coastguard Worker // Render to a simple color Renderbuffer.
TEST_P(SimpleOperationTest,RenderbufferAttachment)1200*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, RenderbufferAttachment)
1201*8975f5c5SAndroid Build Coastguard Worker {
1202*8975f5c5SAndroid Build Coastguard Worker     constexpr int kSize = 16;
1203*8975f5c5SAndroid Build Coastguard Worker 
1204*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer renderbuffer;
1205*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
1206*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, kSize, kSize);
1207*8975f5c5SAndroid Build Coastguard Worker 
1208*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer framebuffer;
1209*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
1210*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer);
1211*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1212*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1213*8975f5c5SAndroid Build Coastguard Worker 
1214*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kSize, kSize);
1215*8975f5c5SAndroid Build Coastguard Worker 
1216*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
1217*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f, 1.0f, true);
1218*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1219*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1220*8975f5c5SAndroid Build Coastguard Worker }
1221*8975f5c5SAndroid Build Coastguard Worker 
1222*8975f5c5SAndroid Build Coastguard Worker // Tests that using desktop GL_QUADS/GL_POLYGONS enums generate the correct error.
TEST_P(SimpleOperationTest,PrimitiveModeNegativeTest)1223*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, PrimitiveModeNegativeTest)
1224*8975f5c5SAndroid Build Coastguard Worker {
1225*8975f5c5SAndroid Build Coastguard Worker     // Draw a correct quad.
1226*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
1227*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
1228*8975f5c5SAndroid Build Coastguard Worker 
1229*8975f5c5SAndroid Build Coastguard Worker     GLint positionLocation = glGetAttribLocation(program, "position");
1230*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, positionLocation);
1231*8975f5c5SAndroid Build Coastguard Worker 
1232*8975f5c5SAndroid Build Coastguard Worker     setupQuadVertexBuffer(0.5f, 1.0f);
1233*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
1234*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(positionLocation);
1235*8975f5c5SAndroid Build Coastguard Worker 
1236*8975f5c5SAndroid Build Coastguard Worker     // Tests that TRIANGLES works.
1237*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLES, 0, 6);
1238*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1239*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1240*8975f5c5SAndroid Build Coastguard Worker 
1241*8975f5c5SAndroid Build Coastguard Worker     // Tests that specific invalid enums don't work.
1242*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(static_cast<GLenum>(7), 0, 6);
1243*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
1244*8975f5c5SAndroid Build Coastguard Worker 
1245*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(static_cast<GLenum>(8), 0, 6);
1246*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
1247*8975f5c5SAndroid Build Coastguard Worker 
1248*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(static_cast<GLenum>(9), 0, 6);
1249*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
1250*8975f5c5SAndroid Build Coastguard Worker }
1251*8975f5c5SAndroid Build Coastguard Worker 
1252*8975f5c5SAndroid Build Coastguard Worker // Tests that using GL_LINES_ADJACENCY should not crash the app even if the backend doesn't support
1253*8975f5c5SAndroid Build Coastguard Worker // LinesAdjacent mode.
1254*8975f5c5SAndroid Build Coastguard Worker // This is to verify that the crash in crbug.com/1457840 won't happen.
TEST_P(SimpleOperationTest,PrimitiveModeLinesAdjacentNegativeTest)1255*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, PrimitiveModeLinesAdjacentNegativeTest)
1256*8975f5c5SAndroid Build Coastguard Worker {
1257*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
1258*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
1259*8975f5c5SAndroid Build Coastguard Worker 
1260*8975f5c5SAndroid Build Coastguard Worker     GLint positionLocation = glGetAttribLocation(program, "position");
1261*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, positionLocation);
1262*8975f5c5SAndroid Build Coastguard Worker 
1263*8975f5c5SAndroid Build Coastguard Worker     setupQuadVertexBuffer(0.5f, 1.0f);
1264*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
1265*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(positionLocation);
1266*8975f5c5SAndroid Build Coastguard Worker 
1267*8975f5c5SAndroid Build Coastguard Worker     {
1268*8975f5c5SAndroid Build Coastguard Worker         // Tests that TRIANGLES works.
1269*8975f5c5SAndroid Build Coastguard Worker         glDrawArrays(GL_TRIANGLES, 0, 6);
1270*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1271*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1272*8975f5c5SAndroid Build Coastguard Worker     }
1273*8975f5c5SAndroid Build Coastguard Worker 
1274*8975f5c5SAndroid Build Coastguard Worker     {
1275*8975f5c5SAndroid Build Coastguard Worker         // Drawing with GL_LINES_ADJACENCY won't crash even if the backend doesn't support it.
1276*8975f5c5SAndroid Build Coastguard Worker         glDrawArrays(GL_LINES_ADJACENCY, 0, 6);
1277*8975f5c5SAndroid Build Coastguard Worker 
1278*8975f5c5SAndroid Build Coastguard Worker         if (IsGLExtensionEnabled("GL_ANGLE_instanced_arrays"))
1279*8975f5c5SAndroid Build Coastguard Worker         {
1280*8975f5c5SAndroid Build Coastguard Worker             glDrawArraysInstancedANGLE(GL_LINES_ADJACENCY, 0, 6, 2);
1281*8975f5c5SAndroid Build Coastguard Worker         }
1282*8975f5c5SAndroid Build Coastguard Worker     }
1283*8975f5c5SAndroid Build Coastguard Worker 
1284*8975f5c5SAndroid Build Coastguard Worker     // Indexed draws with GL_LINES_ADJACENCY
1285*8975f5c5SAndroid Build Coastguard Worker     setupIndexedQuadVertexBuffer(0.5f, 1.0f);
1286*8975f5c5SAndroid Build Coastguard Worker     setupIndexedQuadIndexBuffer();
1287*8975f5c5SAndroid Build Coastguard Worker 
1288*8975f5c5SAndroid Build Coastguard Worker     // Clear GL error state, since ahove calls may have set GL_INVALID_ENUM.
1289*8975f5c5SAndroid Build Coastguard Worker     glGetError();
1290*8975f5c5SAndroid Build Coastguard Worker 
1291*8975f5c5SAndroid Build Coastguard Worker     {
1292*8975f5c5SAndroid Build Coastguard Worker         // Tests that TRIANGLES works.
1293*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
1294*8975f5c5SAndroid Build Coastguard Worker         glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, nullptr);
1295*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1296*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1297*8975f5c5SAndroid Build Coastguard Worker     }
1298*8975f5c5SAndroid Build Coastguard Worker 
1299*8975f5c5SAndroid Build Coastguard Worker     {
1300*8975f5c5SAndroid Build Coastguard Worker         // Indexed drawing with GL_LINES_ADJACENCY won't crash even if the backend doesn't support
1301*8975f5c5SAndroid Build Coastguard Worker         // it.
1302*8975f5c5SAndroid Build Coastguard Worker         glDrawElements(GL_LINES_ADJACENCY, 6, GL_UNSIGNED_SHORT, nullptr);
1303*8975f5c5SAndroid Build Coastguard Worker         if (IsGLExtensionEnabled("GL_ANGLE_instanced_arrays"))
1304*8975f5c5SAndroid Build Coastguard Worker         {
1305*8975f5c5SAndroid Build Coastguard Worker             glDrawElementsInstancedANGLE(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, nullptr, 1);
1306*8975f5c5SAndroid Build Coastguard Worker         }
1307*8975f5c5SAndroid Build Coastguard Worker     }
1308*8975f5c5SAndroid Build Coastguard Worker }
1309*8975f5c5SAndroid Build Coastguard Worker 
1310*8975f5c5SAndroid Build Coastguard Worker // Tests all primitive modes, including some invalid ones, with a vertex shader that receives
1311*8975f5c5SAndroid Build Coastguard Worker // no data for its vertex attributes (constant values). This is a port of the test case from
1312*8975f5c5SAndroid Build Coastguard Worker // crbug.com/1457840, exercising slightly different code paths.
TEST_P(SimpleOperationTest,DrawsWithNoAttributeData)1313*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, DrawsWithNoAttributeData)
1314*8975f5c5SAndroid Build Coastguard Worker {
1315*8975f5c5SAndroid Build Coastguard Worker     constexpr char kTestVertexShader[] =
1316*8975f5c5SAndroid Build Coastguard Worker         R"(attribute vec4 vPosition;
1317*8975f5c5SAndroid Build Coastguard Worker attribute vec2 texCoord0;
1318*8975f5c5SAndroid Build Coastguard Worker varying vec2 texCoord;
1319*8975f5c5SAndroid Build Coastguard Worker void main() {
1320*8975f5c5SAndroid Build Coastguard Worker     gl_Position = vPosition;
1321*8975f5c5SAndroid Build Coastguard Worker     texCoord = texCoord0;
1322*8975f5c5SAndroid Build Coastguard Worker })";
1323*8975f5c5SAndroid Build Coastguard Worker     constexpr char kTestFragmentShader[] =
1324*8975f5c5SAndroid Build Coastguard Worker         R"(precision mediump float;
1325*8975f5c5SAndroid Build Coastguard Worker uniform sampler2D tex;
1326*8975f5c5SAndroid Build Coastguard Worker uniform float divisor;
1327*8975f5c5SAndroid Build Coastguard Worker varying vec2 texCoord;
1328*8975f5c5SAndroid Build Coastguard Worker void main() {
1329*8975f5c5SAndroid Build Coastguard Worker     gl_FragData[0] = texture2DProj(tex, vec3(texCoord, divisor));
1330*8975f5c5SAndroid Build Coastguard Worker })";
1331*8975f5c5SAndroid Build Coastguard Worker 
1332*8975f5c5SAndroid Build Coastguard Worker     constexpr std::array<GLenum, 12> kPrimitiveModes = {
1333*8975f5c5SAndroid Build Coastguard Worker         {GL_POINTS, GL_LINES, GL_LINE_LOOP, GL_LINE_STRIP, GL_TRIANGLES, GL_TRIANGLE_STRIP,
1334*8975f5c5SAndroid Build Coastguard Worker          GL_TRIANGLE_FAN,
1335*8975f5c5SAndroid Build Coastguard Worker 
1336*8975f5c5SAndroid Build Coastguard Worker          // Illegal or possibly-illegal modes
1337*8975f5c5SAndroid Build Coastguard Worker          GL_QUERY_RESULT, GL_LINES_ADJACENCY, GL_LINE_STRIP_ADJACENCY, GL_TRIANGLES_ADJACENCY,
1338*8975f5c5SAndroid Build Coastguard Worker          GL_TRIANGLE_STRIP_ADJACENCY}};
1339*8975f5c5SAndroid Build Coastguard Worker 
1340*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kTestVertexShader, kTestFragmentShader);
1341*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
1342*8975f5c5SAndroid Build Coastguard Worker 
1343*8975f5c5SAndroid Build Coastguard Worker     for (GLenum mode : kPrimitiveModes)
1344*8975f5c5SAndroid Build Coastguard Worker     {
1345*8975f5c5SAndroid Build Coastguard Worker         glDrawArrays(mode, 0, 0x8866);
1346*8975f5c5SAndroid Build Coastguard Worker     }
1347*8975f5c5SAndroid Build Coastguard Worker 
1348*8975f5c5SAndroid Build Coastguard Worker     // If the test reaches this point then it hasn't crashed.
1349*8975f5c5SAndroid Build Coastguard Worker }
1350*8975f5c5SAndroid Build Coastguard Worker 
1351*8975f5c5SAndroid Build Coastguard Worker // Verify we don't crash when attempting to draw using GL_TRIANGLES without a program bound.
TEST_P(SimpleOperationTest31,DrawTrianglesWithoutProgramBound)1352*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest31, DrawTrianglesWithoutProgramBound)
1353*8975f5c5SAndroid Build Coastguard Worker {
1354*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLES, 0, 6);
1355*8975f5c5SAndroid Build Coastguard Worker }
1356*8975f5c5SAndroid Build Coastguard Worker 
1357*8975f5c5SAndroid Build Coastguard Worker // Verify we don't crash when attempting to draw using GL_LINE_STRIP_ADJACENCY without a program
1358*8975f5c5SAndroid Build Coastguard Worker // bound.
TEST_P(SimpleOperationTest31,DrawLineStripAdjacencyWithoutProgramBound)1359*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest31, DrawLineStripAdjacencyWithoutProgramBound)
1360*8975f5c5SAndroid Build Coastguard Worker {
1361*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_geometry_shader"));
1362*8975f5c5SAndroid Build Coastguard Worker 
1363*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_LINE_STRIP_ADJACENCY, 0, 10);
1364*8975f5c5SAndroid Build Coastguard Worker }
1365*8975f5c5SAndroid Build Coastguard Worker 
1366*8975f5c5SAndroid Build Coastguard Worker // Verify instanceCount == 0 is no-op
TEST_P(SimpleOperationTest,DrawArraysZeroInstanceCountIsNoOp)1367*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, DrawArraysZeroInstanceCountIsNoOp)
1368*8975f5c5SAndroid Build Coastguard Worker {
1369*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_instanced_arrays"));
1370*8975f5c5SAndroid Build Coastguard Worker 
1371*8975f5c5SAndroid Build Coastguard Worker     // Draw a correct green quad.
1372*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
1373*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
1374*8975f5c5SAndroid Build Coastguard Worker 
1375*8975f5c5SAndroid Build Coastguard Worker     GLint positionLocation = glGetAttribLocation(program, "position");
1376*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, positionLocation);
1377*8975f5c5SAndroid Build Coastguard Worker 
1378*8975f5c5SAndroid Build Coastguard Worker     setupQuadVertexBuffer(0.5f, 1.0f);
1379*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
1380*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(positionLocation);
1381*8975f5c5SAndroid Build Coastguard Worker 
1382*8975f5c5SAndroid Build Coastguard Worker     // If nothing is drawn it should be red
1383*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0, 0.0, 0.0, 1.0);
1384*8975f5c5SAndroid Build Coastguard Worker 
1385*8975f5c5SAndroid Build Coastguard Worker     {
1386*8975f5c5SAndroid Build Coastguard Worker         // Non-instanced draw should draw
1387*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
1388*8975f5c5SAndroid Build Coastguard Worker         glDrawArrays(GL_TRIANGLES, 0, 6);
1389*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1390*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1391*8975f5c5SAndroid Build Coastguard Worker     }
1392*8975f5c5SAndroid Build Coastguard Worker     {
1393*8975f5c5SAndroid Build Coastguard Worker         // instanceCount == 0 should be no-op
1394*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
1395*8975f5c5SAndroid Build Coastguard Worker         glDrawArraysInstancedANGLE(GL_TRIANGLES, 0, 6, 0);
1396*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1397*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1398*8975f5c5SAndroid Build Coastguard Worker     }
1399*8975f5c5SAndroid Build Coastguard Worker     {
1400*8975f5c5SAndroid Build Coastguard Worker         // instanceCount > 0 should draw
1401*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
1402*8975f5c5SAndroid Build Coastguard Worker         glDrawArraysInstancedANGLE(GL_TRIANGLES, 0, 6, 1);
1403*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1404*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1405*8975f5c5SAndroid Build Coastguard Worker     }
1406*8975f5c5SAndroid Build Coastguard Worker }
1407*8975f5c5SAndroid Build Coastguard Worker 
1408*8975f5c5SAndroid Build Coastguard Worker // Verify instanceCount == 0 is no-op
TEST_P(SimpleOperationTest,DrawElementsZeroInstanceCountIsNoOp)1409*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, DrawElementsZeroInstanceCountIsNoOp)
1410*8975f5c5SAndroid Build Coastguard Worker {
1411*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_instanced_arrays"));
1412*8975f5c5SAndroid Build Coastguard Worker 
1413*8975f5c5SAndroid Build Coastguard Worker     // Draw a correct green quad.
1414*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
1415*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
1416*8975f5c5SAndroid Build Coastguard Worker 
1417*8975f5c5SAndroid Build Coastguard Worker     GLint positionLocation = glGetAttribLocation(program, "position");
1418*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(-1, positionLocation);
1419*8975f5c5SAndroid Build Coastguard Worker 
1420*8975f5c5SAndroid Build Coastguard Worker     setupIndexedQuadVertexBuffer(0.5f, 1.0f);
1421*8975f5c5SAndroid Build Coastguard Worker     glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
1422*8975f5c5SAndroid Build Coastguard Worker     glEnableVertexAttribArray(positionLocation);
1423*8975f5c5SAndroid Build Coastguard Worker 
1424*8975f5c5SAndroid Build Coastguard Worker     setupIndexedQuadIndexBuffer();
1425*8975f5c5SAndroid Build Coastguard Worker 
1426*8975f5c5SAndroid Build Coastguard Worker     // If nothing is drawn it should be red
1427*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0, 0.0, 0.0, 1.0);
1428*8975f5c5SAndroid Build Coastguard Worker 
1429*8975f5c5SAndroid Build Coastguard Worker     {
1430*8975f5c5SAndroid Build Coastguard Worker         // Non-instanced draw should draw
1431*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
1432*8975f5c5SAndroid Build Coastguard Worker         glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, nullptr);
1433*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1434*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1435*8975f5c5SAndroid Build Coastguard Worker     }
1436*8975f5c5SAndroid Build Coastguard Worker     {
1437*8975f5c5SAndroid Build Coastguard Worker         // instanceCount == 0 should be no-op
1438*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
1439*8975f5c5SAndroid Build Coastguard Worker         glDrawElementsInstancedANGLE(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, nullptr, 0);
1440*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1441*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1442*8975f5c5SAndroid Build Coastguard Worker     }
1443*8975f5c5SAndroid Build Coastguard Worker     {
1444*8975f5c5SAndroid Build Coastguard Worker         // instanceCount > 0 should draw
1445*8975f5c5SAndroid Build Coastguard Worker         glClear(GL_COLOR_BUFFER_BIT);
1446*8975f5c5SAndroid Build Coastguard Worker         glDrawElementsInstancedANGLE(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, nullptr, 1);
1447*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
1448*8975f5c5SAndroid Build Coastguard Worker         EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1449*8975f5c5SAndroid Build Coastguard Worker     }
1450*8975f5c5SAndroid Build Coastguard Worker }
1451*8975f5c5SAndroid Build Coastguard Worker 
1452*8975f5c5SAndroid Build Coastguard Worker // Test that sample coverage does not affect single sample rendering
TEST_P(SimpleOperationTest,DrawSingleSampleWithCoverage)1453*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, DrawSingleSampleWithCoverage)
1454*8975f5c5SAndroid Build Coastguard Worker {
1455*8975f5c5SAndroid Build Coastguard Worker     GLint sampleBuffers = -1;
1456*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_SAMPLE_BUFFERS, &sampleBuffers);
1457*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(sampleBuffers, 0);
1458*8975f5c5SAndroid Build Coastguard Worker 
1459*8975f5c5SAndroid Build Coastguard Worker     GLint samples = -1;
1460*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_SAMPLES, &samples);
1461*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(samples, 0);
1462*8975f5c5SAndroid Build Coastguard Worker 
1463*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0, 0.0, 1.0, 1.0);
1464*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1465*8975f5c5SAndroid Build Coastguard Worker 
1466*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SAMPLE_COVERAGE);
1467*8975f5c5SAndroid Build Coastguard Worker     glSampleCoverage(0.0f, false);
1468*8975f5c5SAndroid Build Coastguard Worker 
1469*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
1470*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
1471*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1472*8975f5c5SAndroid Build Coastguard Worker 
1473*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1474*8975f5c5SAndroid Build Coastguard Worker }
1475*8975f5c5SAndroid Build Coastguard Worker 
1476*8975f5c5SAndroid Build Coastguard Worker // Test that sample coverage affects multi sample rendering with only one sample
TEST_P(SimpleOperationTest,DrawSingleMultiSampleWithCoverage)1477*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, DrawSingleMultiSampleWithCoverage)
1478*8975f5c5SAndroid Build Coastguard Worker {
1479*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
1480*8975f5c5SAndroid Build Coastguard Worker 
1481*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
1482*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1483*8975f5c5SAndroid Build Coastguard Worker 
1484*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rbo;
1485*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo);
1486*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorageMultisample(GL_RENDERBUFFER, 1, GL_RGBA8, 1, 1);
1487*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
1488*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1489*8975f5c5SAndroid Build Coastguard Worker 
1490*8975f5c5SAndroid Build Coastguard Worker     GLint samples = -1;
1491*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_SAMPLES, &samples);
1492*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GT(samples, 0);
1493*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(samples != 1);
1494*8975f5c5SAndroid Build Coastguard Worker 
1495*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0, 0.0, 1.0, 1.0);
1496*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1497*8975f5c5SAndroid Build Coastguard Worker 
1498*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SAMPLE_COVERAGE);
1499*8975f5c5SAndroid Build Coastguard Worker     glSampleCoverage(0.0f, false);
1500*8975f5c5SAndroid Build Coastguard Worker 
1501*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Green());
1502*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
1503*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1504*8975f5c5SAndroid Build Coastguard Worker 
1505*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
1506*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
1507*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, 1, 1, 0, 0, 1, 1, GL_COLOR_BUFFER_BIT, GL_NEAREST);
1508*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
1509*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
1510*8975f5c5SAndroid Build Coastguard Worker }
1511*8975f5c5SAndroid Build Coastguard Worker 
1512*8975f5c5SAndroid Build Coastguard Worker // Test that alpha-to-coverage does not affect single-sampled rendering
TEST_P(SimpleOperationTest,DrawSingleSampleWithAlphaToCoverage)1513*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, DrawSingleSampleWithAlphaToCoverage)
1514*8975f5c5SAndroid Build Coastguard Worker {
1515*8975f5c5SAndroid Build Coastguard Worker     GLint sampleBuffers = -1;
1516*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_SAMPLE_BUFFERS, &sampleBuffers);
1517*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(sampleBuffers, 0);
1518*8975f5c5SAndroid Build Coastguard Worker 
1519*8975f5c5SAndroid Build Coastguard Worker     GLint samples = -1;
1520*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_SAMPLES, &samples);
1521*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EQ(samples, 0);
1522*8975f5c5SAndroid Build Coastguard Worker 
1523*8975f5c5SAndroid Build Coastguard Worker     glClearColor(1.0, 0.0, 1.0, 1.0);
1524*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1525*8975f5c5SAndroid Build Coastguard Worker 
1526*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE);
1527*8975f5c5SAndroid Build Coastguard Worker 
1528*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
1529*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
1530*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(glGetUniformLocation(program, essl1_shaders::ColorUniform()), 0, 1, 0, 0);
1531*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
1532*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1533*8975f5c5SAndroid Build Coastguard Worker 
1534*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor(0, 255, 0, 0));
1535*8975f5c5SAndroid Build Coastguard Worker }
1536*8975f5c5SAndroid Build Coastguard Worker 
1537*8975f5c5SAndroid Build Coastguard Worker // Test that alpha-to-coverage affects multisampled rendering with only one sample
TEST_P(SimpleOperationTest,DrawSingleMultiSampleWithAlphaToCoverage)1538*8975f5c5SAndroid Build Coastguard Worker TEST_P(SimpleOperationTest, DrawSingleMultiSampleWithAlphaToCoverage)
1539*8975f5c5SAndroid Build Coastguard Worker {
1540*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
1541*8975f5c5SAndroid Build Coastguard Worker 
1542*8975f5c5SAndroid Build Coastguard Worker     GLFramebuffer fbo;
1543*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1544*8975f5c5SAndroid Build Coastguard Worker 
1545*8975f5c5SAndroid Build Coastguard Worker     GLRenderbuffer rbo;
1546*8975f5c5SAndroid Build Coastguard Worker     glBindRenderbuffer(GL_RENDERBUFFER, rbo);
1547*8975f5c5SAndroid Build Coastguard Worker     glRenderbufferStorageMultisample(GL_RENDERBUFFER, 1, GL_RGBA8, 1, 1);
1548*8975f5c5SAndroid Build Coastguard Worker     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
1549*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
1550*8975f5c5SAndroid Build Coastguard Worker 
1551*8975f5c5SAndroid Build Coastguard Worker     GLint samples = -1;
1552*8975f5c5SAndroid Build Coastguard Worker     glGetIntegerv(GL_SAMPLES, &samples);
1553*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GT(samples, 0);
1554*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(samples != 1);
1555*8975f5c5SAndroid Build Coastguard Worker 
1556*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0, 0.0, 1.0, 1.0);
1557*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
1558*8975f5c5SAndroid Build Coastguard Worker 
1559*8975f5c5SAndroid Build Coastguard Worker     glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE);
1560*8975f5c5SAndroid Build Coastguard Worker 
1561*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::UniformColor());
1562*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
1563*8975f5c5SAndroid Build Coastguard Worker     glUniform4f(glGetUniformLocation(program, essl1_shaders::ColorUniform()), 0, 1, 0, 0);
1564*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, essl1_shaders::PositionAttrib(), 0.0);
1565*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
1566*8975f5c5SAndroid Build Coastguard Worker 
1567*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
1568*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
1569*8975f5c5SAndroid Build Coastguard Worker     glBlitFramebuffer(0, 0, 1, 1, 0, 0, 1, 1, GL_COLOR_BUFFER_BIT, GL_NEAREST);
1570*8975f5c5SAndroid Build Coastguard Worker     glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
1571*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
1572*8975f5c5SAndroid Build Coastguard Worker }
1573*8975f5c5SAndroid Build Coastguard Worker 
1574*8975f5c5SAndroid Build Coastguard Worker // Use this to select which configurations (e.g. which renderer, which GLES major version) these
1575*8975f5c5SAndroid Build Coastguard Worker // tests should be run against.
1576*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2_AND_ES3_AND(
1577*8975f5c5SAndroid Build Coastguard Worker     SimpleOperationTest,
1578*8975f5c5SAndroid Build Coastguard Worker     ES3_METAL().enable(Feature::ForceBufferGPUStorage),
1579*8975f5c5SAndroid Build Coastguard Worker     ES3_METAL().disable(Feature::HasExplicitMemBarrier).disable(Feature::HasCheapRenderPass),
1580*8975f5c5SAndroid Build Coastguard Worker     WithVulkanSecondaries(ES3_VULKAN_SWIFTSHADER()));
1581*8975f5c5SAndroid Build Coastguard Worker 
1582*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2_AND_ES3_AND(
1583*8975f5c5SAndroid Build Coastguard Worker     TriangleFanDrawTest,
1584*8975f5c5SAndroid Build Coastguard Worker     ES3_METAL().enable(Feature::ForceBufferGPUStorage),
1585*8975f5c5SAndroid Build Coastguard Worker     ES3_METAL().disable(Feature::HasExplicitMemBarrier).disable(Feature::HasCheapRenderPass));
1586*8975f5c5SAndroid Build Coastguard Worker 
1587*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2_AND_ES3_AND_ES31(SimpleOperationTest31);
1588*8975f5c5SAndroid Build Coastguard Worker 
1589*8975f5c5SAndroid Build Coastguard Worker }  // namespace
1590