Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(293)

Side by Side Diff: gpu/command_buffer/tests/gl_map_buffer_range_unittest.cc

Issue 2399113003: Add gl tests to make sure when a buffer is unmapped, all access path generates an INVALID_OPERATION. (Closed)
Patch Set: format Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <GLES2/gl2.h>
6 #include <GLES2/gl2ext.h>
7 #include <GLES2/gl2extchromium.h>
8 #include <GLES3/gl3.h>
9 #include <stdint.h>
10
11 #include "base/command_line.h"
12 #include "gpu/command_buffer/service/context_group.h"
13 #include "gpu/command_buffer/tests/gl_manager.h"
14 #include "gpu/command_buffer/tests/gl_test_utils.h"
15 #include "testing/gmock/include/gmock/gmock.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17 #include "ui/gl/gl_switches.h"
18
19 #define SHADER(Src) #Src
20
21 namespace gpu {
22
23 class ES3MapBufferRangeTest : public testing::Test {
24 protected:
25 static const GLsizei kCanvasSize = 4;
26
27 void SetUp() override {
28 GLManager::Options options;
29 options.size = gfx::Size(kCanvasSize, kCanvasSize);
30 options.context_type = gles2::CONTEXT_TYPE_OPENGLES3;
31
32 base::CommandLine cmd_line(base::CommandLine::NO_PROGRAM);
33 cmd_line.AppendSwitch(switches::kEnableUnsafeES3APIs);
34 gl_.InitializeWithCommandLine(options, cmd_line);
35 }
36
37 void TearDown() override { gl_.Destroy(); }
38
39 GLuint SetupSimpleProgram(GLint* ret_position_loc) {
40 static const char* v_shader_src =
41 SHADER(attribute vec2 a_position;
42 void main() { gl_Position = vec4(a_position, 0.0, 1.0); });
43 static const char* f_shader_src =
44 SHADER(precision mediump float;
45 void main() { gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); });
46 GLuint program = GLTestHelper::LoadProgram(v_shader_src, f_shader_src);
47 EXPECT_LT(0u, program);
48 glUseProgram(program);
49 *ret_position_loc = glGetAttribLocation(program, "a_position");
50 EXPECT_LE(0, *ret_position_loc);
51 return program;
52 }
53
54 GLuint SetupTransformFeedbackProgram(GLint* ret_position_loc) {
55 static const char* v_shader_src =
56 "#version 300 es\n"
57 "in vec2 a_position;\n"
58 "out vec3 var0;\n"
59 "out vec2 var1;\n"
60 "void main() {\n"
61 " var0 = vec3(a_position, 0.5);\n"
62 " var1 = a_position;\n"
63 " gl_Position = vec4(a_position, 0.0, 1.0);\n"
64 "}";
65 static const char* f_shader_src =
66 "#version 300 es\n"
67 "precision mediump float;\n"
68 "out vec4 color;\n"
69 "in vec3 var0;\n"
70 "in vec2 var1;\n"
71 "void main() {\n"
72 " color = vec4(0.0, 1.0, 0.0, 1.0);\n"
73 "}";
74 static const char* varyings[] = {"var0", "var1"};
75 GLuint program = GLTestHelper::LoadProgram(v_shader_src, f_shader_src);
76 EXPECT_LT(0u, program);
77 glTransformFeedbackVaryings(program, 2, varyings, GL_SEPARATE_ATTRIBS);
78 glLinkProgram(program);
79 GLint link_status = GL_FALSE;
80 glGetProgramiv(program, GL_LINK_STATUS, &link_status);
81 EXPECT_EQ(GL_TRUE, link_status);
82 glUseProgram(program);
83 *ret_position_loc = glGetAttribLocation(program, "a_position");
84 EXPECT_LE(0, *ret_position_loc);
85 return program;
86 }
87
88 GLManager gl_;
89 };
90
91 TEST_F(ES3MapBufferRangeTest, DrawArraysAndInstanced) {
92 const uint8_t kRedColor[] = {255, 0, 0, 255};
93 const uint8_t kBlackColor[] = {0, 0, 0, 255};
94 const GLsizei kPrimCount = 4;
95
96 GLint position_loc = 0;
97 SetupSimpleProgram(&position_loc);
98 GLTestHelper::CheckGLError("no errors", __LINE__);
99
100 GLuint buffer = GLTestHelper::SetupUnitQuad(position_loc);
101 GLTestHelper::CheckGLError("no errors", __LINE__);
102 EXPECT_LT(0u, buffer);
103
104 glClearColor(0.0, 0.0, 0.0, 1.0);
105 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
106 glDrawArrays(GL_TRIANGLES, 0, 6);
107 GLTestHelper::CheckGLError("no errors", __LINE__);
108 EXPECT_TRUE(
109 GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1, kRedColor));
110
111 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
112 glDrawArraysInstancedANGLE(GL_TRIANGLES, 0, 6, kPrimCount);
113 GLTestHelper::CheckGLError("no errors", __LINE__);
114 EXPECT_TRUE(
115 GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1, kRedColor));
116
117 glMapBufferRange(GL_ARRAY_BUFFER, 0, 6, GL_MAP_READ_BIT);
118 GLTestHelper::CheckGLError("no errors", __LINE__);
119
120 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
121 glDrawArrays(GL_TRIANGLES, 0, 6);
122 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
123 EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
124 kBlackColor));
125
126 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
127 glDrawArraysInstancedANGLE(GL_TRIANGLES, 0, 6, kPrimCount);
128 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
129 EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
130 kBlackColor));
131
132 glUnmapBuffer(GL_ARRAY_BUFFER);
133 GLTestHelper::CheckGLError("no errors", __LINE__);
134
135 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
136 glDrawArrays(GL_TRIANGLES, 0, 6);
137 GLTestHelper::CheckGLError("no errors", __LINE__);
138 EXPECT_TRUE(
139 GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1, kRedColor));
140
141 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
142 glDrawArraysInstancedANGLE(GL_TRIANGLES, 0, 6, kPrimCount);
143 GLTestHelper::CheckGLError("no errors", __LINE__);
144 EXPECT_TRUE(
145 GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1, kRedColor));
146 }
147
148 TEST_F(ES3MapBufferRangeTest, DrawElementsAndInstanced) {
149 const uint8_t kRedColor[] = {255, 0, 0, 255};
150 const uint8_t kBlackColor[] = {0, 0, 0, 255};
151 const GLsizei kPrimCount = 4;
152
153 GLint position_loc = 0;
154 SetupSimpleProgram(&position_loc);
155 GLTestHelper::CheckGLError("no errors", __LINE__);
156
157 std::vector<GLuint> buffers =
158 GLTestHelper::SetupIndexedUnitQuad(position_loc);
159 GLTestHelper::CheckGLError("no errors", __LINE__);
160 EXPECT_EQ(2u, buffers.size());
161 EXPECT_LT(0u, buffers[0]);
162 EXPECT_LT(0u, buffers[1]);
163
164 glClearColor(0.0, 0.0, 0.0, 1.0);
165 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
166 glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0);
167 GLTestHelper::CheckGLError("no errors", __LINE__);
168 EXPECT_TRUE(
169 GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1, kRedColor));
170
171 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
172 glDrawElementsInstancedANGLE(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0,
173 kPrimCount);
174 GLTestHelper::CheckGLError("no errors", __LINE__);
175 EXPECT_TRUE(
176 GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1, kRedColor));
177
178 glMapBufferRange(GL_ARRAY_BUFFER, 0, 6, GL_MAP_READ_BIT);
179 GLTestHelper::CheckGLError("no errors", __LINE__);
180
181 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
182 glDrawArrays(GL_TRIANGLES, 0, 6);
183 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
184 EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
185 kBlackColor));
186
187 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
188 glDrawElementsInstancedANGLE(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0,
189 kPrimCount);
190 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
191 EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
192 kBlackColor));
193
194 glUnmapBuffer(GL_ARRAY_BUFFER);
195 GLTestHelper::CheckGLError("no errors", __LINE__);
196
197 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
198 glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0);
199 GLTestHelper::CheckGLError("no errors", __LINE__);
200 EXPECT_TRUE(
201 GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1, kRedColor));
202
203 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
204 glDrawElementsInstancedANGLE(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0,
205 kPrimCount);
206 GLTestHelper::CheckGLError("no errors", __LINE__);
207 EXPECT_TRUE(
208 GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1, kRedColor));
209
210 glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, 0, 6, GL_MAP_READ_BIT);
211 GLTestHelper::CheckGLError("no errors", __LINE__);
212
213 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
214 glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0);
215 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
216 EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
217 kBlackColor));
218
219 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
220 glDrawElementsInstancedANGLE(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0,
221 kPrimCount);
222 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
223 EXPECT_TRUE(GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1,
224 kBlackColor));
225
226 glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER);
227 GLTestHelper::CheckGLError("no errors", __LINE__);
228
229 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
230 glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0);
231 GLTestHelper::CheckGLError("no errors", __LINE__);
232 EXPECT_TRUE(
233 GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1, kRedColor));
234
235 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
236 glDrawElementsInstancedANGLE(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0,
237 kPrimCount);
238 GLTestHelper::CheckGLError("no errors", __LINE__);
239 EXPECT_TRUE(
240 GLTestHelper::CheckPixels(0, 0, kCanvasSize, kCanvasSize, 1, kRedColor));
241 }
242
243 TEST_F(ES3MapBufferRangeTest, ReadPixels) {
244 GLuint buffer = 0;
245 glGenBuffers(1, &buffer);
246 EXPECT_LT(0u, buffer);
247 glBindBuffer(GL_PIXEL_PACK_BUFFER, buffer);
248 glBufferData(GL_PIXEL_PACK_BUFFER, 4 * kCanvasSize * kCanvasSize, 0,
249 GL_STATIC_READ);
250
251 glReadPixels(0, 0, kCanvasSize, kCanvasSize, GL_RGBA, GL_UNSIGNED_BYTE, 0);
252 GLTestHelper::CheckGLError("no errors", __LINE__);
253
254 glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, 6, GL_MAP_WRITE_BIT);
255 GLTestHelper::CheckGLError("no errors", __LINE__);
256
257 glReadPixels(0, 0, kCanvasSize, kCanvasSize, GL_RGBA, GL_UNSIGNED_BYTE, 0);
258 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
259
260 glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
261 GLTestHelper::CheckGLError("no errors", __LINE__);
262
263 glReadPixels(0, 0, kCanvasSize, kCanvasSize, GL_RGBA, GL_UNSIGNED_BYTE, 0);
264 GLTestHelper::CheckGLError("no errors", __LINE__);
265 }
266
267 TEST_F(ES3MapBufferRangeTest, TexImageAndSubImage2D) {
268 const GLsizei kTextureSize = 4;
269 GLuint buffer = 0;
270 glGenBuffers(1, &buffer);
271 EXPECT_LT(0u, buffer);
272 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer);
273 glBufferData(GL_PIXEL_UNPACK_BUFFER, 4 * kTextureSize * kTextureSize, 0,
274 GL_STATIC_READ);
275
276 GLuint tex = 0;
277 glGenTextures(1, &tex);
278 EXPECT_LT(0u, tex);
279 glBindTexture(GL_TEXTURE_2D, tex);
280 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kTextureSize, kTextureSize, 0,
281 GL_RGBA, GL_UNSIGNED_BYTE, 0);
282 GLTestHelper::CheckGLError("no errors", __LINE__);
283 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kTextureSize, kTextureSize, GL_RGBA,
284 GL_UNSIGNED_BYTE, 0);
285 GLTestHelper::CheckGLError("no errors", __LINE__);
286
287 glMapBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, 6, GL_MAP_READ_BIT);
288 GLTestHelper::CheckGLError("no errors", __LINE__);
289
290 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kTextureSize, kTextureSize, 0,
291 GL_RGBA, GL_UNSIGNED_BYTE, 0);
292 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
293 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kTextureSize, kTextureSize, GL_RGBA,
294 GL_UNSIGNED_BYTE, 0);
295 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
296
297 glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
298 GLTestHelper::CheckGLError("no errors", __LINE__);
299
300 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kTextureSize, kTextureSize, 0,
301 GL_RGBA, GL_UNSIGNED_BYTE, 0);
302 GLTestHelper::CheckGLError("no errors", __LINE__);
303 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kTextureSize, kTextureSize, GL_RGBA,
304 GL_UNSIGNED_BYTE, 0);
305 GLTestHelper::CheckGLError("no errors", __LINE__);
306 }
307
308 TEST_F(ES3MapBufferRangeTest, TexImageAndSubImage3D) {
309 const GLsizei kTextureSize = 4;
310 GLuint buffer = 0;
311 glGenBuffers(1, &buffer);
312 EXPECT_LT(0u, buffer);
313 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, buffer);
314 glBufferData(GL_PIXEL_UNPACK_BUFFER,
315 4 * kTextureSize * kTextureSize * kTextureSize, 0,
316 GL_STATIC_READ);
317
318 GLuint tex = 0;
319 glGenTextures(1, &tex);
320 EXPECT_LT(0u, tex);
321 glBindTexture(GL_TEXTURE_3D, tex);
322 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, kTextureSize, kTextureSize,
323 kTextureSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
324 GLTestHelper::CheckGLError("no errors", __LINE__);
325 glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, kTextureSize, kTextureSize,
326 kTextureSize, GL_RGBA, GL_UNSIGNED_BYTE, 0);
327 GLTestHelper::CheckGLError("no errors", __LINE__);
328
329 glMapBufferRange(GL_PIXEL_UNPACK_BUFFER, 0, 6, GL_MAP_READ_BIT);
330 GLTestHelper::CheckGLError("no errors", __LINE__);
331
332 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, kTextureSize, kTextureSize,
333 kTextureSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
334 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
335 glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, kTextureSize, kTextureSize,
336 kTextureSize, GL_RGBA, GL_UNSIGNED_BYTE, 0);
337 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
338
339 glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
340 GLTestHelper::CheckGLError("no errors", __LINE__);
341
342 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, kTextureSize, kTextureSize,
343 kTextureSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
344 GLTestHelper::CheckGLError("no errors", __LINE__);
345 glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, kTextureSize, kTextureSize,
346 kTextureSize, GL_RGBA, GL_UNSIGNED_BYTE, 0);
347 GLTestHelper::CheckGLError("no errors", __LINE__);
348 }
349
350 // TODO(zmo): Add tests for CompressedTex* functions.
351
352 TEST_F(ES3MapBufferRangeTest, TransformFeedback) {
353 GLuint transform_feedback_buffer[2];
354 glGenBuffers(2, transform_feedback_buffer);
355 EXPECT_LT(0u, transform_feedback_buffer[0]);
356 EXPECT_LT(0u, transform_feedback_buffer[1]);
357 glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0,
358 transform_feedback_buffer[0]);
359 glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 3 * 6 * sizeof(float), 0,
360 GL_STATIC_READ);
361 glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 1,
362 transform_feedback_buffer[1]);
363 glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, 2 * 6 * sizeof(float), 0,
364 GL_STATIC_READ);
365 GLTestHelper::CheckGLError("no errors", __LINE__);
366
367 GLint position_loc = 0;
368 SetupTransformFeedbackProgram(&position_loc);
369 GLTestHelper::CheckGLError("no errors", __LINE__);
370
371 GLuint buffer = GLTestHelper::SetupUnitQuad(position_loc);
372 GLTestHelper::CheckGLError("no errors", __LINE__);
373 EXPECT_LT(0u, buffer);
374
375 GLuint transform_feedback = 0;
376 glGenTransformFeedbacks(1, &transform_feedback);
377 GLTestHelper::CheckGLError("no errors", __LINE__);
378
379 glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, 6, GL_MAP_WRITE_BIT);
380 GLTestHelper::CheckGLError("no errors", __LINE__);
381
382 glBeginTransformFeedback(GL_TRIANGLES);
383 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
384
385 glUnmapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER);
386 GLTestHelper::CheckGLError("no errors", __LINE__);
387
388 glBeginTransformFeedback(GL_TRIANGLES);
389 GLTestHelper::CheckGLError("no errors", __LINE__);
390
391 glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, 6, GL_MAP_WRITE_BIT);
392 EXPECT_EQ(static_cast<GLenum>(GL_INVALID_OPERATION), glGetError());
393
394 glDrawArrays(GL_TRIANGLES, 0, 6);
395 glEndTransformFeedback();
396 GLTestHelper::CheckGLError("no errors", __LINE__);
397
398 glMapBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, 0, 6, GL_MAP_WRITE_BIT);
399 GLTestHelper::CheckGLError("no errors", __LINE__);
400
401 glUnmapBuffer(GL_TRANSFORM_FEEDBACK_BUFFER);
402 GLTestHelper::CheckGLError("no errors", __LINE__);
403 }
404
405 // TODO(zmo): add tests for uniform buffer mapping.
406
vmiura 2016/10/10 18:20:48 These look good. Could you also add a TODO for Co
Zhenyao Mo 2016/10/10 21:02:07 Done.
407 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698