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, ¤tEquation);
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