blob: a22b8e142f284841748660c903faef6e744745b7 [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{
20
Geoff Langf1e85922015-02-23 14:40:04 -050021class SimpleOperationTest : public ANGLETest
22{
23 protected:
Jamie Madillfa05f602015-05-07 13:47:11 -040024 SimpleOperationTest()
Geoff Langf1e85922015-02-23 14:40:04 -050025 {
26 setWindowWidth(128);
27 setWindowHeight(128);
28 setConfigRedBits(8);
29 setConfigGreenBits(8);
30 setConfigBlueBits(8);
31 setConfigAlphaBits(8);
32 }
Jamie Madillcc6ac252017-01-25 12:57:21 -080033
34 void verifyBuffer(const std::vector<uint8_t> &data, GLenum binding);
Geoff Langf1e85922015-02-23 14:40:04 -050035};
36
Jamie Madillcc6ac252017-01-25 12:57:21 -080037void SimpleOperationTest::verifyBuffer(const std::vector<uint8_t> &data, GLenum binding)
38{
39 if (!extensionEnabled("GL_EXT_map_buffer_range"))
40 {
41 return;
42 }
43
44 uint8_t *mapPointer =
45 static_cast<uint8_t *>(glMapBufferRangeEXT(GL_ARRAY_BUFFER, 0, 1024, GL_MAP_READ_BIT));
46 ASSERT_GL_NO_ERROR();
47
48 std::vector<uint8_t> readbackData(data.size());
49 memcpy(readbackData.data(), mapPointer, data.size());
50 glUnmapBufferOES(GL_ARRAY_BUFFER);
51
52 EXPECT_EQ(data, readbackData);
53}
54
Jamie Madillfa05f602015-05-07 13:47:11 -040055TEST_P(SimpleOperationTest, CompileVertexShader)
Geoff Langf1e85922015-02-23 14:40:04 -050056{
57 const std::string source = SHADER_SOURCE
58 (
59 attribute vec4 a_input;
60 void main()
61 {
62 gl_Position = a_input;
63 }
64 );
65
66 GLuint shader = CompileShader(GL_VERTEX_SHADER, source);
67 EXPECT_NE(shader, 0u);
68 glDeleteShader(shader);
69
70 EXPECT_GL_NO_ERROR();
71}
72
Jamie Madillfa05f602015-05-07 13:47:11 -040073TEST_P(SimpleOperationTest, CompileFragmentShader)
Geoff Langf1e85922015-02-23 14:40:04 -050074{
75 const std::string source = SHADER_SOURCE
76 (
77 precision mediump float;
78 varying vec4 v_input;
79 void main()
80 {
81 gl_FragColor = v_input;
82 }
83 );
84
85 GLuint shader = CompileShader(GL_FRAGMENT_SHADER, source);
86 EXPECT_NE(shader, 0u);
87 glDeleteShader(shader);
88
89 EXPECT_GL_NO_ERROR();
90}
Geoff Langb1f435e2015-02-20 10:01:01 -050091
Jamie Madillfa05f602015-05-07 13:47:11 -040092TEST_P(SimpleOperationTest, LinkProgram)
Geoff Langb1f435e2015-02-20 10:01:01 -050093{
94 const std::string vsSource = SHADER_SOURCE
95 (
96 void main()
97 {
98 gl_Position = vec4(1.0, 1.0, 1.0, 1.0);
99 }
100 );
101
102 const std::string fsSource = SHADER_SOURCE
103 (
104 void main()
105 {
106 gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
107 }
108 );
109
110 GLuint program = CompileProgram(vsSource, fsSource);
111 EXPECT_NE(program, 0u);
112 glDeleteProgram(program);
113
114 EXPECT_GL_NO_ERROR();
115}
116
Jamie Madillfa05f602015-05-07 13:47:11 -0400117TEST_P(SimpleOperationTest, LinkProgramWithUniforms)
Geoff Langb1f435e2015-02-20 10:01:01 -0500118{
Jamie Madillb8353b02017-01-25 12:57:21 -0800119 if (IsVulkan())
120 {
121 // TODO(jmadill): Complete Vulkan implementation.
122 std::cout << "Test skipped on Vulkan." << std::endl;
123 return;
124 }
125
Geoff Langb1f435e2015-02-20 10:01:01 -0500126 const std::string vsSource = SHADER_SOURCE
127 (
128 void main()
129 {
130 gl_Position = vec4(1.0, 1.0, 1.0, 1.0);
131 }
132 );
133
134 const std::string fsSource = SHADER_SOURCE
135 (
136 precision mediump float;
137 uniform vec4 u_input;
138 void main()
139 {
140 gl_FragColor = u_input;
141 }
142 );
143
144 GLuint program = CompileProgram(vsSource, fsSource);
145 EXPECT_NE(program, 0u);
146
147 GLint uniformLoc = glGetUniformLocation(program, "u_input");
148 EXPECT_NE(-1, uniformLoc);
149
150 glDeleteProgram(program);
151
152 EXPECT_GL_NO_ERROR();
153}
154
Jamie Madillfa05f602015-05-07 13:47:11 -0400155TEST_P(SimpleOperationTest, LinkProgramWithAttributes)
Geoff Langb1f435e2015-02-20 10:01:01 -0500156{
Jamie Madillb8353b02017-01-25 12:57:21 -0800157 if (IsVulkan())
158 {
159 // TODO(jmadill): Complete Vulkan implementation.
160 std::cout << "Test skipped on Vulkan." << std::endl;
161 return;
162 }
163
Geoff Langb1f435e2015-02-20 10:01:01 -0500164 const std::string vsSource = SHADER_SOURCE
165 (
166 attribute vec4 a_input;
167 void main()
168 {
169 gl_Position = a_input;
170 }
171 );
172
173 const std::string fsSource = SHADER_SOURCE
174 (
175 void main()
176 {
177 gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
178 }
179 );
180
181 GLuint program = CompileProgram(vsSource, fsSource);
182 EXPECT_NE(program, 0u);
183
184 GLint attribLoc = glGetAttribLocation(program, "a_input");
185 EXPECT_NE(-1, attribLoc);
186
187 glDeleteProgram(program);
188
189 EXPECT_GL_NO_ERROR();
190}
Geoff Lang36c79012015-02-24 11:47:20 -0500191
Jamie Madillfa05f602015-05-07 13:47:11 -0400192TEST_P(SimpleOperationTest, BufferDataWithData)
Geoff Lang36c79012015-02-24 11:47:20 -0500193{
Jamie Madillcc6ac252017-01-25 12:57:21 -0800194 GLBuffer buffer;
195 glBindBuffer(GL_ARRAY_BUFFER, buffer.get());
Geoff Lang36c79012015-02-24 11:47:20 -0500196
197 std::vector<uint8_t> data(1024);
Jamie Madillcc6ac252017-01-25 12:57:21 -0800198 FillVectorWithRandomUBytes(&data);
Geoff Lang36c79012015-02-24 11:47:20 -0500199 glBufferData(GL_ARRAY_BUFFER, data.size(), &data[0], GL_STATIC_DRAW);
200
Jamie Madillcc6ac252017-01-25 12:57:21 -0800201 verifyBuffer(data, GL_ARRAY_BUFFER);
Geoff Lang36c79012015-02-24 11:47:20 -0500202
203 EXPECT_GL_NO_ERROR();
204}
205
Jamie Madillfa05f602015-05-07 13:47:11 -0400206TEST_P(SimpleOperationTest, BufferDataWithNoData)
Geoff Lang36c79012015-02-24 11:47:20 -0500207{
Jamie Madillcc6ac252017-01-25 12:57:21 -0800208 GLBuffer buffer;
209 glBindBuffer(GL_ARRAY_BUFFER, buffer.get());
Geoff Lang36c79012015-02-24 11:47:20 -0500210 glBufferData(GL_ARRAY_BUFFER, 1024, nullptr, GL_STATIC_DRAW);
Geoff Lang36c79012015-02-24 11:47:20 -0500211
212 EXPECT_GL_NO_ERROR();
213}
214
Jamie Madillfa05f602015-05-07 13:47:11 -0400215TEST_P(SimpleOperationTest, BufferSubData)
Geoff Lang36c79012015-02-24 11:47:20 -0500216{
Jamie Madillcc6ac252017-01-25 12:57:21 -0800217 GLBuffer buffer;
218 glBindBuffer(GL_ARRAY_BUFFER, buffer.get());
Geoff Lang36c79012015-02-24 11:47:20 -0500219
Jamie Madillcc6ac252017-01-25 12:57:21 -0800220 constexpr size_t bufferSize = 1024;
221 std::vector<uint8_t> data(bufferSize);
222 FillVectorWithRandomUBytes(&data);
223
Geoff Lang36c79012015-02-24 11:47:20 -0500224 glBufferData(GL_ARRAY_BUFFER, bufferSize, nullptr, GL_STATIC_DRAW);
225
Jamie Madillcc6ac252017-01-25 12:57:21 -0800226 constexpr size_t subDataCount = 16;
227 constexpr size_t sliceSize = bufferSize / subDataCount;
Geoff Lang36c79012015-02-24 11:47:20 -0500228 for (size_t i = 0; i < subDataCount; i++)
229 {
Jamie Madillcc6ac252017-01-25 12:57:21 -0800230 size_t offset = i * sliceSize;
231 glBufferSubData(GL_ARRAY_BUFFER, offset, sliceSize, &data[offset]);
Geoff Lang36c79012015-02-24 11:47:20 -0500232 }
233
Jamie Madillcc6ac252017-01-25 12:57:21 -0800234 verifyBuffer(data, GL_ARRAY_BUFFER);
Geoff Lang36c79012015-02-24 11:47:20 -0500235
236 EXPECT_GL_NO_ERROR();
237}
Jamie Madillfa05f602015-05-07 13:47:11 -0400238
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500239// Simple quad test.
240TEST_P(SimpleOperationTest, DrawQuad)
241{
242 const std::string &vertexShader =
243 "attribute vec3 position;\n"
244 "void main()\n"
245 "{\n"
246 " gl_Position = vec4(position, 1);\n"
247 "}";
248 const std::string &fragmentShader =
249 "void main()\n"
250 "{\n"
251 " gl_FragColor = vec4(0, 1, 0, 1);\n"
252 "}";
253 ANGLE_GL_PROGRAM(program, vertexShader, fragmentShader);
254
255 drawQuad(program.get(), "position", 0.5f, 1.0f, true);
256
257 EXPECT_GL_NO_ERROR();
258 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
259}
260
261// Simple repeatd draw and swap test.
262TEST_P(SimpleOperationTest, DrawQuadAndSwap)
263{
264 const std::string &vertexShader =
265 "attribute vec3 position;\n"
266 "void main()\n"
267 "{\n"
268 " gl_Position = vec4(position, 1);\n"
269 "}";
270 const std::string &fragmentShader =
271 "void main()\n"
272 "{\n"
273 " gl_FragColor = vec4(0, 1, 0, 1);\n"
274 "}";
275 ANGLE_GL_PROGRAM(program, vertexShader, fragmentShader);
276
277 for (int i = 0; i < 8; ++i)
278 {
279 drawQuad(program.get(), "position", 0.5f, 1.0f, true);
280 EXPECT_GL_NO_ERROR();
Jamie Madill4c26fc22017-02-24 11:04:10 -0500281 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
Jamie Madilldf68a6f2017-01-13 17:29:53 -0500282 swapBuffers();
283 }
284
285 EXPECT_GL_NO_ERROR();
286}
287
Jamie Madillfa05f602015-05-07 13:47:11 -0400288// 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 -0500289ANGLE_INSTANTIATE_TEST(SimpleOperationTest,
290 ES2_D3D9(),
Austin Kinross2a63b3f2016-02-08 12:29:08 -0800291 ES2_D3D11(EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE),
292 ES2_D3D11(EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE),
Geoff Lange0cc2a42016-01-20 10:58:17 -0500293 ES3_D3D11(),
294 ES2_OPENGL(),
295 ES3_OPENGL(),
296 ES2_OPENGLES(),
Jamie Madillb8353b02017-01-25 12:57:21 -0800297 ES3_OPENGLES(),
298 ES2_VULKAN());
Jamie Madillfa05f602015-05-07 13:47:11 -0400299
300} // namespace