blob: c48d42b8f0292fe9d1a143d64f0af7816d98a473 [file] [log] [blame]
Jamie Madillfa05f602015-05-07 13:47:11 -04001//
2// Copyright 2015 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6// SimpleOperationTest:
7// Basic GL commands such as linking a program, initializing a buffer, etc.
8
Corentin Wallezd3970de2015-05-14 11:07:48 -04009#include "test_utils/ANGLETest.h"
Geoff Langf1e85922015-02-23 14:40:04 -050010
11#include <vector>
12
Jamie Madillcc6ac252017-01-25 12:57:21 -080013#include "random_utils.h"
14#include "test_utils/gl_raii.h"
15
Jamie Madillfa05f602015-05-07 13:47:11 -040016using namespace angle;
Geoff Langf1e85922015-02-23 14:40:04 -050017
Jamie Madillfa05f602015-05-07 13:47:11 -040018namespace
19{
Luc Ferron22294b02018-02-02 10:03:22 -050020constexpr char kBasicVertexShader[] =
21 R"(attribute vec3 position;
22void main()
23{
24 gl_Position = vec4(position, 1);
25})";
26
27constexpr char kGreenFragmentShader[] =
28 R"(void main()
29{
30 gl_FragColor = vec4(0, 1, 0, 1);
31})";
Jamie Madillfa05f602015-05-07 13:47:11 -040032
Geoff Langf1e85922015-02-23 14:40:04 -050033class SimpleOperationTest : public ANGLETest
34{
35 protected:
Jamie Madillfa05f602015-05-07 13:47:11 -040036 SimpleOperationTest()
Geoff Langf1e85922015-02-23 14:40:04 -050037 {
38 setWindowWidth(128);
39 setWindowHeight(128);
40 setConfigRedBits(8);
41 setConfigGreenBits(8);
42 setConfigBlueBits(8);
43 setConfigAlphaBits(8);
44 }
Jamie Madillcc6ac252017-01-25 12:57:21 -080045
46 void verifyBuffer(const std::vector<uint8_t> &data, GLenum binding);
Geoff Langf1e85922015-02-23 14:40:04 -050047};
48
Jamie Madillcc6ac252017-01-25 12:57:21 -080049void SimpleOperationTest::verifyBuffer(const std::vector<uint8_t> &data, GLenum binding)
50{
51 if (!extensionEnabled("GL_EXT_map_buffer_range"))
52 {
53 return;
54 }
55
56 uint8_t *mapPointer =
57 static_cast<uint8_t *>(glMapBufferRangeEXT(GL_ARRAY_BUFFER, 0, 1024, GL_MAP_READ_BIT));
58 ASSERT_GL_NO_ERROR();
59
60 std::vector<uint8_t> readbackData(data.size());
61 memcpy(readbackData.data(), mapPointer, data.size());
62 glUnmapBufferOES(GL_ARRAY_BUFFER);
63
64 EXPECT_EQ(data, readbackData);
65}
66
Jamie Madillfa05f602015-05-07 13:47:11 -040067TEST_P(SimpleOperationTest, CompileVertexShader)
Geoff Langf1e85922015-02-23 14:40:04 -050068{
Luc Ferron22294b02018-02-02 10:03:22 -050069 GLuint shader = CompileShader(GL_VERTEX_SHADER, kBasicVertexShader);
Geoff Langf1e85922015-02-23 14:40:04 -050070 EXPECT_NE(shader, 0u);
71 glDeleteShader(shader);
72
Luc Ferron22294b02018-02-02 10:03:22 -050073 ASSERT_GL_NO_ERROR();
Geoff Langf1e85922015-02-23 14:40:04 -050074}
75
Luc Ferron22294b02018-02-02 10:03:22 -050076TEST_P(SimpleOperationTest, CompileFragmentShaderSingleVaryingInput)
Geoff Langf1e85922015-02-23 14:40:04 -050077{
Olli Etuahoa20af6d2017-09-18 13:32:29 +030078 const std::string source =
79 R"(precision mediump float;
Geoff Langf1e85922015-02-23 14:40:04 -050080 varying vec4 v_input;
81 void main()
82 {
83 gl_FragColor = v_input;
Olli Etuahoa20af6d2017-09-18 13:32:29 +030084 })";
Geoff Langf1e85922015-02-23 14:40:04 -050085
86 GLuint shader = CompileShader(GL_FRAGMENT_SHADER, source);
87 EXPECT_NE(shader, 0u);
88 glDeleteShader(shader);
89
Luc Ferron22294b02018-02-02 10:03:22 -050090 ASSERT_GL_NO_ERROR();
Geoff Langf1e85922015-02-23 14:40:04 -050091}
Geoff Langb1f435e2015-02-20 10:01:01 -050092
Jamie Madillefb5a5c2018-01-29 15:56:59 -050093// Covers a simple bug in Vulkan to do with dependencies between the Surface and the default
94// Framebuffer.
95TEST_P(SimpleOperationTest, ClearAndSwap)
96{
97 glClearColor(1.0, 0.0, 0.0, 1.0);
98 glClear(GL_COLOR_BUFFER_BIT);
99 swapBuffers();
100
101 // Can't check the pixel result after the swap, and checking the pixel result affects the
102 // behaviour of the test on the Vulkan back-end, so don't bother checking correctness.
Luc Ferron22294b02018-02-02 10:03:22 -0500103 ASSERT_GL_NO_ERROR();
Jamie Madillefb5a5c2018-01-29 15:56:59 -0500104 EXPECT_EGL_SUCCESS();
105}
106
Luc Ferron22294b02018-02-02 10:03:22 -0500107TEST_P(SimpleOperationTest, LinkProgramShadersNoInputs)
Geoff Langb1f435e2015-02-20 10:01:01 -0500108{
Olli Etuahoa20af6d2017-09-18 13:32:29 +0300109 const std::string vsSource =
110 R"(void main()
Geoff Langb1f435e2015-02-20 10:01:01 -0500111 {
112 gl_Position = vec4(1.0, 1.0, 1.0, 1.0);
Olli Etuahoa20af6d2017-09-18 13:32:29 +0300113 })";
Geoff Langb1f435e2015-02-20 10:01:01 -0500114
Olli Etuahoa20af6d2017-09-18 13:32:29 +0300115 const std::string fsSource =
116 R"(void main()
Geoff Langb1f435e2015-02-20 10:01:01 -0500117 {
118 gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
Olli Etuahoa20af6d2017-09-18 13:32:29 +0300119 })";
Geoff Langb1f435e2015-02-20 10:01:01 -0500120
Luc Ferron22294b02018-02-02 10:03:22 -0500121 const GLuint program = CompileProgram(vsSource, fsSource);
Geoff Langb1f435e2015-02-20 10:01:01 -0500122 EXPECT_NE(program, 0u);
123 glDeleteProgram(program);
124
Luc Ferron22294b02018-02-02 10:03:22 -0500125 ASSERT_GL_NO_ERROR();
Geoff Langb1f435e2015-02-20 10:01:01 -0500126}
127
Jamie Madillfa05f602015-05-07 13:47:11 -0400128TEST_P(SimpleOperationTest, LinkProgramWithUniforms)
Geoff Langb1f435e2015-02-20 10:01:01 -0500129{
Olli Etuahoa20af6d2017-09-18 13:32:29 +0300130 const std::string vsSource =
131 R"(void main()
Geoff Langb1f435e2015-02-20 10:01:01 -0500132 {
133 gl_Position = vec4(1.0, 1.0, 1.0, 1.0);
Olli Etuahoa20af6d2017-09-18 13:32:29 +0300134 })";
Olli Etuahoa20af6d2017-09-18 13:32:29 +0300135 const std::string fsSource =
136 R"(precision mediump float;
Geoff Langb1f435e2015-02-20 10:01:01 -0500137 uniform vec4 u_input;
138 void main()
139 {
140 gl_FragColor = u_input;
Olli Etuahoa20af6d2017-09-18 13:32:29 +0300141 })";
Geoff Langb1f435e2015-02-20 10:01:01 -0500142
Luc Ferron22294b02018-02-02 10:03:22 -0500143 const GLuint program = CompileProgram(vsSource, fsSource);
Geoff Langb1f435e2015-02-20 10:01:01 -0500144 EXPECT_NE(program, 0u);
145
Luc Ferron22294b02018-02-02 10:03:22 -0500146 const GLint uniformLoc = glGetUniformLocation(program, "u_input");
Geoff Langb1f435e2015-02-20 10:01:01 -0500147 EXPECT_NE(-1, uniformLoc);
148
149 glDeleteProgram(program);
150
Luc Ferron22294b02018-02-02 10:03:22 -0500151 ASSERT_GL_NO_ERROR();
Geoff Langb1f435e2015-02-20 10:01:01 -0500152}
153
Jamie Madillfa05f602015-05-07 13:47:11 -0400154TEST_P(SimpleOperationTest, LinkProgramWithAttributes)
Geoff Langb1f435e2015-02-20 10:01:01 -0500155{
Olli Etuahoa20af6d2017-09-18 13:32:29 +0300156 const std::string vsSource =
157 R"(attribute vec4 a_input;
Geoff Langb1f435e2015-02-20 10:01:01 -0500158 void main()
159 {
160 gl_Position = a_input;
Olli Etuahoa20af6d2017-09-18 13:32:29 +0300161 })";
Geoff Langb1f435e2015-02-20 10:01:01 -0500162
Luc Ferron22294b02018-02-02 10:03:22 -0500163 const GLuint program = CompileProgram(vsSource, kGreenFragmentShader);
Geoff Langb1f435e2015-02-20 10:01:01 -0500164 EXPECT_NE(program, 0u);
165
Luc Ferron22294b02018-02-02 10:03:22 -0500166 const GLint attribLoc = glGetAttribLocation(program, "a_input");
Geoff Langb1f435e2015-02-20 10:01:01 -0500167 EXPECT_NE(-1, attribLoc);
168
169 glDeleteProgram(program);
170
Luc Ferron22294b02018-02-02 10:03:22 -0500171 ASSERT_GL_NO_ERROR();
Geoff Langb1f435e2015-02-20 10:01:01 -0500172}
Geoff Lang36c79012015-02-24 11:47:20 -0500173
Jamie Madillfa05f602015-05-07 13:47:11 -0400174TEST_P(SimpleOperationTest, BufferDataWithData)
Geoff Lang36c79012015-02-24 11:47:20 -0500175{
Jamie Madillcc6ac252017-01-25 12:57:21 -0800176 GLBuffer buffer;
177 glBindBuffer(GL_ARRAY_BUFFER, buffer.get());
Geoff Lang36c79012015-02-24 11:47:20 -0500178
179 std::vector<uint8_t> data(1024);
Jamie Madillcc6ac252017-01-25 12:57:21 -0800180 FillVectorWithRandomUBytes(&data);
Geoff Lang36c79012015-02-24 11:47:20 -0500181 glBufferData(GL_ARRAY_BUFFER, data.size(), &data[0], GL_STATIC_DRAW);
182
Jamie Madillcc6ac252017-01-25 12:57:21 -0800183 verifyBuffer(data, GL_ARRAY_BUFFER);
Geoff Lang36c79012015-02-24 11:47:20 -0500184
Luc Ferron22294b02018-02-02 10:03:22 -0500185 ASSERT_GL_NO_ERROR();
Geoff Lang36c79012015-02-24 11:47:20 -0500186}
187
Jamie Madillfa05f602015-05-07 13:47:11 -0400188TEST_P(SimpleOperationTest, BufferDataWithNoData)
Geoff Lang36c79012015-02-24 11:47:20 -0500189{
Jamie Madillcc6ac252017-01-25 12:57:21 -0800190 GLBuffer buffer;
191 glBindBuffer(GL_ARRAY_BUFFER, buffer.get());
Geoff Lang36c79012015-02-24 11:47:20 -0500192 glBufferData(GL_ARRAY_BUFFER, 1024, nullptr, GL_STATIC_DRAW);
Geoff Lang36c79012015-02-24 11:47:20 -0500193
Luc Ferron22294b02018-02-02 10:03:22 -0500194 ASSERT_GL_NO_ERROR();
Geoff Lang36c79012015-02-24 11:47:20 -0500195}
196
Jamie Madillfa05f602015-05-07 13:47:11 -0400197TEST_P(SimpleOperationTest, BufferSubData)
Geoff Lang36c79012015-02-24 11:47:20 -0500198{
Jamie Madillcc6ac252017-01-25 12:57:21 -0800199 GLBuffer buffer;
200 glBindBuffer(GL_ARRAY_BUFFER, buffer.get());
Geoff Lang36c79012015-02-24 11:47:20 -0500201
Jamie Madillcc6ac252017-01-25 12:57:21 -0800202 constexpr size_t bufferSize = 1024;
203 std::vector<uint8_t> data(bufferSize);
204 FillVectorWithRandomUBytes(&data);
205
Geoff Lang36c79012015-02-24 11:47:20 -0500206 glBufferData(GL_ARRAY_BUFFER, bufferSize, nullptr, GL_STATIC_DRAW);
207
Jamie Madillcc6ac252017-01-25 12:57:21 -0800208 constexpr size_t subDataCount = 16;
209 constexpr size_t sliceSize = bufferSize / subDataCount;
Geoff Lang36c79012015-02-24 11:47:20 -0500210 for (size_t i = 0; i < subDataCount; i++)
211 {
Jamie Madillcc6ac252017-01-25 12:57:21 -0800212 size_t offset = i * sliceSize;
213 glBufferSubData(GL_ARRAY_BUFFER, offset, sliceSize, &data[offset]);
Geoff Lang36c79012015-02-24 11:47:20 -0500214 }
215
Jamie Madillcc6ac252017-01-25 12:57:21 -0800216 verifyBuffer(data, GL_ARRAY_BUFFER);
Geoff Lang36c79012015-02-24 11:47:20 -0500217
Luc Ferron22294b02018-02-02 10:03:22 -0500218 ASSERT_GL_NO_ERROR();
Geoff Lang36c79012015-02-24 11:47:20 -0500219}
Jamie Madillfa05f602015-05-07 13:47:11 -0400220
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500221// Simple quad test.
222TEST_P(SimpleOperationTest, DrawQuad)
223{
Luc Ferron22294b02018-02-02 10:03:22 -0500224 ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500225
226 drawQuad(program.get(), "position", 0.5f, 1.0f, true);
227
Luc Ferron22294b02018-02-02 10:03:22 -0500228 ASSERT_GL_NO_ERROR();
229
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500230 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
231}
232
Luc Ferron22294b02018-02-02 10:03:22 -0500233// Simple line test.
234TEST_P(SimpleOperationTest, DrawLine)
235{
236 ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
237 glUseProgram(program);
238
239 std::vector<Vector3> vertices = {{-1.0f, -1.0f, 0.0f}, {1.0f, 1.0f, 0.0f}};
240
241 const GLint positionLocation = glGetAttribLocation(program, "position");
242 ASSERT_NE(-1, positionLocation);
243
244 GLBuffer vertexBuffer;
245 glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
246 glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * vertices.size(), vertices.data(),
247 GL_STATIC_DRAW);
248 glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
249 glEnableVertexAttribArray(positionLocation);
250
251 glClear(GL_COLOR_BUFFER_BIT);
252 glDrawArrays(GL_LINES, 0, static_cast<GLsizei>(vertices.size()));
253
254 glDisableVertexAttribArray(positionLocation);
255
256 ASSERT_GL_NO_ERROR();
257
258 // We assume in the test the width and height are equal and we are tracing
259 // the line from bottom left to top right. Verify that all pixels along that line
260 // have been traced with green.
261 ASSERT_EQ(getWindowWidth(), getWindowHeight());
262
263 for (auto x = 0; x < getWindowWidth(); x++)
264 {
265 EXPECT_PIXEL_COLOR_EQ(x, x, GLColor::green);
266 }
267}
268
269// Simple line strip test.
270TEST_P(SimpleOperationTest, DrawLineStrip)
271{
272 ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
273 glUseProgram(program);
274
275 auto vertices =
276 std::vector<Vector3>{{-1.0f, -1.0f, 0.0f}, {0.0f, 0.0f, 0.0f}, {1.0f, -1.0f, 0.0f}};
277
278 const GLint positionLocation = glGetAttribLocation(program, "position");
279 ASSERT_NE(-1, positionLocation);
280
281 GLBuffer vertexBuffer;
282 glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer.get());
283 glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * vertices.size(), vertices.data(),
284 GL_STATIC_DRAW);
285 glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
286
287 glEnableVertexAttribArray(positionLocation);
288
289 glClear(GL_COLOR_BUFFER_BIT);
290 glDrawArrays(GL_LINE_STRIP, 0, static_cast<GLsizei>(vertices.size()));
291
292 ASSERT_GL_NO_ERROR();
293
294 // We assume in the test the width and height are equal and we are tracing
295 // the line from bottom left to center, then from center to bottom right.
296 // Verify that all pixels along these lines have been traced with green.
297 ASSERT_EQ(getWindowWidth(), getWindowHeight());
298
299 const auto centerX = getWindowWidth() / 2;
300 const auto centerY = getWindowHeight() / 2;
301
302 for (auto x = 0; x < centerX; x++)
303 {
304 EXPECT_PIXEL_COLOR_EQ(x, x, GLColor::green);
305 }
306
307 for (auto x = centerX, y = centerY - 1; x < getWindowWidth() && y >= 0; x++, y--)
308 {
309 EXPECT_PIXEL_COLOR_EQ(x, y, GLColor::green);
310 }
311}
312
Jamie Madilld03a8492017-10-03 15:46:06 -0400313// Simple repeated draw and swap test.
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500314TEST_P(SimpleOperationTest, DrawQuadAndSwap)
315{
Luc Ferron22294b02018-02-02 10:03:22 -0500316 ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500317
318 for (int i = 0; i < 8; ++i)
319 {
320 drawQuad(program.get(), "position", 0.5f, 1.0f, true);
Luc Ferron22294b02018-02-02 10:03:22 -0500321 ASSERT_GL_NO_ERROR();
Jamie Madill4c26fc22017-02-24 11:04:10 -0500322 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500323 swapBuffers();
324 }
325
Luc Ferron22294b02018-02-02 10:03:22 -0500326 ASSERT_GL_NO_ERROR();
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500327}
328
Jamie Madilld03a8492017-10-03 15:46:06 -0400329// Simple indexed quad test.
330TEST_P(SimpleOperationTest, DrawIndexedQuad)
331{
Luc Ferron22294b02018-02-02 10:03:22 -0500332 ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
Jamie Madilld03a8492017-10-03 15:46:06 -0400333
334 drawIndexedQuad(program.get(), "position", 0.5f, 1.0f, true);
335
Luc Ferron22294b02018-02-02 10:03:22 -0500336 ASSERT_GL_NO_ERROR();
Jamie Madilld03a8492017-10-03 15:46:06 -0400337 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
338}
339
Jamie Madill76e471e2017-10-21 09:56:01 -0400340// Draw with a fragment uniform.
341TEST_P(SimpleOperationTest, DrawQuadWithFragmentUniform)
342{
Jamie Madill76e471e2017-10-21 09:56:01 -0400343 const std::string &fragmentShader =
344 "uniform mediump vec4 color;\n"
345 "void main()\n"
346 "{\n"
347 " gl_FragColor = color;\n"
348 "}";
Luc Ferron22294b02018-02-02 10:03:22 -0500349 ANGLE_GL_PROGRAM(program, kBasicVertexShader, fragmentShader);
Jamie Madill76e471e2017-10-21 09:56:01 -0400350
351 GLint location = glGetUniformLocation(program, "color");
352 ASSERT_NE(-1, location);
353
354 glUseProgram(program);
355 glUniform4f(location, 0.0f, 1.0f, 0.0f, 1.0f);
356
357 drawQuad(program.get(), "position", 0.5f, 1.0f, true);
358
Luc Ferron22294b02018-02-02 10:03:22 -0500359 ASSERT_GL_NO_ERROR();
Jamie Madill76e471e2017-10-21 09:56:01 -0400360 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
361}
362
363// Draw with a vertex uniform.
364TEST_P(SimpleOperationTest, DrawQuadWithVertexUniform)
365{
366 const std::string &vertexShader =
367 "attribute vec3 position;\n"
368 "uniform vec4 color;\n"
369 "varying vec4 vcolor;\n"
370 "void main()\n"
371 "{\n"
372 " gl_Position = vec4(position, 1);\n"
373 " vcolor = color;\n"
374 "}";
375 const std::string &fragmentShader =
376 "varying mediump vec4 vcolor;\n"
377 "void main()\n"
378 "{\n"
379 " gl_FragColor = vcolor;\n"
380 "}";
381 ANGLE_GL_PROGRAM(program, vertexShader, fragmentShader);
382
Luc Ferron22294b02018-02-02 10:03:22 -0500383 const GLint location = glGetUniformLocation(program, "color");
Jamie Madill76e471e2017-10-21 09:56:01 -0400384 ASSERT_NE(-1, location);
385
386 glUseProgram(program);
387 glUniform4f(location, 0.0f, 1.0f, 0.0f, 1.0f);
388
389 drawQuad(program.get(), "position", 0.5f, 1.0f, true);
390
Luc Ferron22294b02018-02-02 10:03:22 -0500391 ASSERT_GL_NO_ERROR();
Jamie Madill76e471e2017-10-21 09:56:01 -0400392 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
393}
394
395// Draw with two uniforms.
396TEST_P(SimpleOperationTest, DrawQuadWithTwoUniforms)
397{
398 const std::string &vertexShader =
399 "attribute vec3 position;\n"
400 "uniform vec4 color1;\n"
401 "varying vec4 vcolor1;\n"
402 "void main()\n"
403 "{\n"
404 " gl_Position = vec4(position, 1);\n"
405 " vcolor1 = color1;\n"
406 "}";
407 const std::string &fragmentShader =
408 "uniform mediump vec4 color2;\n"
409 "varying mediump vec4 vcolor1;\n"
410 "void main()\n"
411 "{\n"
412 " gl_FragColor = vcolor1 + color2;\n"
413 "}";
414 ANGLE_GL_PROGRAM(program, vertexShader, fragmentShader);
415
Luc Ferron22294b02018-02-02 10:03:22 -0500416 const GLint location1 = glGetUniformLocation(program, "color1");
Jamie Madill76e471e2017-10-21 09:56:01 -0400417 ASSERT_NE(-1, location1);
418
Luc Ferron22294b02018-02-02 10:03:22 -0500419 const GLint location2 = glGetUniformLocation(program, "color2");
Jamie Madill76e471e2017-10-21 09:56:01 -0400420 ASSERT_NE(-1, location2);
421
422 glUseProgram(program);
423 glUniform4f(location1, 0.0f, 1.0f, 0.0f, 1.0f);
424 glUniform4f(location2, 1.0f, 0.0f, 0.0f, 1.0f);
425
426 drawQuad(program.get(), "position", 0.5f, 1.0f, true);
427
Luc Ferron22294b02018-02-02 10:03:22 -0500428 ASSERT_GL_NO_ERROR();
Jamie Madill76e471e2017-10-21 09:56:01 -0400429 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::yellow);
430}
431
Jamie Madill2a9e1072017-09-22 11:31:57 -0400432// Tests a shader program with more than one vertex attribute, with vertex buffers.
433TEST_P(SimpleOperationTest, ThreeVertexAttributes)
434{
435 const std::string vertexShader =
436 R"(attribute vec2 position;
437attribute vec4 color1;
438attribute vec4 color2;
439varying vec4 color;
440void main()
441{
442 gl_Position = vec4(position, 0, 1);
443 color = color1 + color2;
444})";
445
446 const std::string fragmentShader =
447 R"(precision mediump float;
448varying vec4 color;
449void main()
450{
451 gl_FragColor = color;
452}
453)";
454
455 ANGLE_GL_PROGRAM(program, vertexShader, fragmentShader);
456
457 glUseProgram(program);
458
Luc Ferron22294b02018-02-02 10:03:22 -0500459 const GLint color1Loc = glGetAttribLocation(program, "color1");
460 const GLint color2Loc = glGetAttribLocation(program, "color2");
Jamie Madill2a9e1072017-09-22 11:31:57 -0400461 ASSERT_NE(-1, color1Loc);
462 ASSERT_NE(-1, color2Loc);
463
464 const auto &indices = GetQuadIndices();
465
466 // Make colored corners with red == x or 1 -x , and green = y or 1 - y.
467
468 std::array<GLColor, 4> baseColors1 = {
469 {GLColor::black, GLColor::red, GLColor::green, GLColor::yellow}};
470 std::array<GLColor, 4> baseColors2 = {
471 {GLColor::yellow, GLColor::green, GLColor::red, GLColor::black}};
472
473 std::vector<GLColor> colors1;
474 std::vector<GLColor> colors2;
475
476 for (GLushort index : indices)
477 {
478 colors1.push_back(baseColors1[index]);
479 colors2.push_back(baseColors2[index]);
480 }
481
482 GLBuffer color1Buffer;
483 glBindBuffer(GL_ARRAY_BUFFER, color1Buffer);
484 glBufferData(GL_ARRAY_BUFFER, colors1.size() * sizeof(GLColor), colors1.data(), GL_STATIC_DRAW);
485 glVertexAttribPointer(color1Loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, nullptr);
486 glEnableVertexAttribArray(color1Loc);
487
488 GLBuffer color2Buffer;
489 glBindBuffer(GL_ARRAY_BUFFER, color2Buffer);
490 glBufferData(GL_ARRAY_BUFFER, colors2.size() * sizeof(GLColor), colors2.data(), GL_STATIC_DRAW);
491 glVertexAttribPointer(color2Loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, nullptr);
492 glEnableVertexAttribArray(color2Loc);
493
494 // Draw a non-indexed quad with all vertex buffers. Should draw yellow to the entire window.
495 drawQuad(program, "position", 0.5f, 1.0f, true);
496 ASSERT_GL_NO_ERROR();
497 EXPECT_PIXEL_RECT_EQ(0, 0, getWindowWidth(), getWindowHeight(), GLColor::yellow);
498}
499
Jamie Madill035fd6b2017-10-03 15:43:22 -0400500// Creates a texture, no other operations.
501TEST_P(SimpleOperationTest, CreateTexture2DNoData)
502{
503 GLTexture texture;
504 glBindTexture(GL_TEXTURE_2D, texture);
505 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
506 ASSERT_GL_NO_ERROR();
507}
508
509// Creates a texture, no other operations.
510TEST_P(SimpleOperationTest, CreateTexture2DWithData)
511{
512 std::vector<GLColor> colors(16 * 16, GLColor::red);
513
514 GLTexture texture;
515 glBindTexture(GL_TEXTURE_2D, texture);
516 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, colors.data());
517 ASSERT_GL_NO_ERROR();
518}
519
Jamie Madillde03e002017-10-21 14:04:20 -0400520// Creates a program with a texture.
521TEST_P(SimpleOperationTest, LinkProgramWithTexture)
522{
523 ASSERT_NE(0u, get2DTexturedQuadProgram());
Luc Ferron22294b02018-02-02 10:03:22 -0500524 ASSERT_GL_NO_ERROR();
Jamie Madillde03e002017-10-21 14:04:20 -0400525}
526
Jamie Madill5547b382017-10-23 18:16:01 -0400527// Creates a program with a texture and renders with it.
528TEST_P(SimpleOperationTest, DrawWithTexture)
529{
530 std::array<GLColor, 4> colors = {
531 {GLColor::red, GLColor::green, GLColor::blue, GLColor::yellow}};
532
533 GLTexture tex;
534 glBindTexture(GL_TEXTURE_2D, tex);
535 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, colors.data());
536 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
537 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
538
539 draw2DTexturedQuad(0.5f, 1.0f, true);
Luc Ferron22294b02018-02-02 10:03:22 -0500540 ASSERT_GL_NO_ERROR();
Jamie Madill5547b382017-10-23 18:16:01 -0400541
542 int w = getWindowWidth() - 2;
543 int h = getWindowHeight() - 2;
544
545 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
546 EXPECT_PIXEL_COLOR_EQ(w, 0, GLColor::green);
547 EXPECT_PIXEL_COLOR_EQ(0, h, GLColor::blue);
548 EXPECT_PIXEL_COLOR_EQ(w, h, GLColor::yellow);
549}
550
Jamie Madillb79e7bb2017-10-24 13:55:50 -0400551// Tests rendering to a user framebuffer.
552TEST_P(SimpleOperationTest, RenderToTexture)
553{
554 constexpr int kSize = 16;
555
556 GLTexture texture;
557 glBindTexture(GL_TEXTURE_2D, texture);
558 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
559 ASSERT_GL_NO_ERROR();
560
561 GLFramebuffer framebuffer;
562 glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
563 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
564 ASSERT_GL_NO_ERROR();
565 ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
566
567 glViewport(0, 0, kSize, kSize);
568
Luc Ferron22294b02018-02-02 10:03:22 -0500569 ANGLE_GL_PROGRAM(program, kBasicVertexShader, kGreenFragmentShader);
Jamie Madillb79e7bb2017-10-24 13:55:50 -0400570 drawQuad(program, "position", 0.5f, 1.0f, true);
571 ASSERT_GL_NO_ERROR();
572 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
573}
574
Jamie Madillfa05f602015-05-07 13:47:11 -0400575// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
Geoff Lange0cc2a42016-01-20 10:58:17 -0500576ANGLE_INSTANTIATE_TEST(SimpleOperationTest,
577 ES2_D3D9(),
Austin Kinross2a63b3f2016-02-08 12:29:08 -0800578 ES2_D3D11(EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE),
579 ES2_D3D11(EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE),
Geoff Lange0cc2a42016-01-20 10:58:17 -0500580 ES3_D3D11(),
581 ES2_OPENGL(),
582 ES3_OPENGL(),
583 ES2_OPENGLES(),
Jamie Madillb8353b02017-01-25 12:57:21 -0800584 ES3_OPENGLES(),
585 ES2_VULKAN());
Jamie Madillfa05f602015-05-07 13:47:11 -0400586
587} // namespace