OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stdint.h> | 5 #include <stdint.h> |
6 | 6 |
7 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 7 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
8 #include "gpu/command_buffer/service/gles2_cmd_decoder_unittest.h" | 8 #include "gpu/command_buffer/service/gles2_cmd_decoder_unittest.h" |
9 | 9 |
10 using ::gl::MockGLInterface; | 10 using ::gl::MockGLInterface; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
61 EXPECT_CALL(*gl_, GenBuffersARB(1, _)) | 61 EXPECT_CALL(*gl_, GenBuffersARB(1, _)) |
62 .WillOnce(SetArgPointee<1>(kNewServiceId)); | 62 .WillOnce(SetArgPointee<1>(kNewServiceId)); |
63 SpecializedSetup<BindBufferRange, 0>(true); | 63 SpecializedSetup<BindBufferRange, 0>(true); |
64 BindBufferRange cmd; | 64 BindBufferRange cmd; |
65 cmd.Init(GL_TRANSFORM_FEEDBACK_BUFFER, 2, kNewClientId, 4, 4); | 65 cmd.Init(GL_TRANSFORM_FEEDBACK_BUFFER, 2, kNewClientId, 4, 4); |
66 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 66 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
67 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 67 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
68 EXPECT_TRUE(GetBuffer(kNewClientId) != NULL); | 68 EXPECT_TRUE(GetBuffer(kNewClientId) != NULL); |
69 } | 69 } |
70 | 70 |
71 TEST_P(GLES2DecoderTest, MapBufferRangeUnmapBufferReadSucceeds) { | 71 TEST_P(GLES3DecoderTest, MapBufferRangeUnmapBufferReadSucceeds) { |
72 const GLenum kTarget = GL_ARRAY_BUFFER; | 72 const GLenum kTarget = GL_ARRAY_BUFFER; |
73 const GLintptr kOffset = 10; | 73 const GLintptr kOffset = 10; |
74 const GLsizeiptr kSize = 64; | 74 const GLsizeiptr kSize = 64; |
75 const GLbitfield kAccess = GL_MAP_READ_BIT; | 75 const GLbitfield kAccess = GL_MAP_READ_BIT; |
76 | 76 |
77 uint32_t result_shm_id = kSharedMemoryId; | 77 uint32_t result_shm_id = kSharedMemoryId; |
78 uint32_t result_shm_offset = kSharedMemoryOffset; | 78 uint32_t result_shm_offset = kSharedMemoryOffset; |
79 uint32_t data_shm_id = kSharedMemoryId; | 79 uint32_t data_shm_id = kSharedMemoryId; |
80 // uint32_t is Result for both MapBufferRange and UnmapBuffer commands. | 80 // uint32_t is Result for both MapBufferRange and UnmapBuffer commands. |
81 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(uint32_t); | 81 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(uint32_t); |
(...skipping 11 matching lines...) Expand all Loading... |
93 MapBufferRange(kTarget, kOffset, kSize, kAccess)) | 93 MapBufferRange(kTarget, kOffset, kSize, kAccess)) |
94 .WillOnce(Return(&data[0])) | 94 .WillOnce(Return(&data[0])) |
95 .RetiresOnSaturation(); | 95 .RetiresOnSaturation(); |
96 | 96 |
97 typedef MapBufferRange::Result Result; | 97 typedef MapBufferRange::Result Result; |
98 Result* result = GetSharedMemoryAs<Result*>(); | 98 Result* result = GetSharedMemoryAs<Result*>(); |
99 | 99 |
100 MapBufferRange cmd; | 100 MapBufferRange cmd; |
101 cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset, | 101 cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset, |
102 result_shm_id, result_shm_offset); | 102 result_shm_id, result_shm_offset); |
103 decoder_->set_unsafe_es3_apis_enabled(false); | |
104 *result = 0; | |
105 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd)); | |
106 EXPECT_EQ(0u, *result); | |
107 decoder_->set_unsafe_es3_apis_enabled(true); | |
108 *result = 0; | 103 *result = 0; |
109 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 104 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
110 int8_t* mem = reinterpret_cast<int8_t*>(&result[1]); | 105 int8_t* mem = reinterpret_cast<int8_t*>(&result[1]); |
111 EXPECT_EQ(0, memcmp(&data[0], mem, kSize)); | 106 EXPECT_EQ(0, memcmp(&data[0], mem, kSize)); |
112 EXPECT_EQ(1u, *result); | 107 EXPECT_EQ(1u, *result); |
113 } | 108 } |
114 | 109 |
115 { // UnmapBuffer | 110 { // UnmapBuffer |
116 EXPECT_CALL(*gl_, UnmapBuffer(kTarget)) | 111 EXPECT_CALL(*gl_, UnmapBuffer(kTarget)) |
117 .WillOnce(Return(GL_TRUE)) | 112 .WillOnce(Return(GL_TRUE)) |
118 .RetiresOnSaturation(); | 113 .RetiresOnSaturation(); |
119 | 114 |
120 UnmapBuffer cmd; | 115 UnmapBuffer cmd; |
121 cmd.Init(kTarget); | 116 cmd.Init(kTarget); |
122 decoder_->set_unsafe_es3_apis_enabled(false); | |
123 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd)); | |
124 decoder_->set_unsafe_es3_apis_enabled(true); | |
125 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 117 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
126 } | 118 } |
127 | 119 |
128 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 120 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
129 } | 121 } |
130 | 122 |
131 TEST_P(GLES2DecoderTest, MapBufferRangeUnmapBufferWriteSucceeds) { | 123 TEST_P(GLES3DecoderTest, MapBufferRangeUnmapBufferWriteSucceeds) { |
132 const GLenum kTarget = GL_ELEMENT_ARRAY_BUFFER; | 124 const GLenum kTarget = GL_ELEMENT_ARRAY_BUFFER; |
133 const GLintptr kOffset = 10; | 125 const GLintptr kOffset = 10; |
134 const GLsizeiptr kSize = 64; | 126 const GLsizeiptr kSize = 64; |
135 const GLsizeiptr kTotalSize = kOffset + kSize; | 127 const GLsizeiptr kTotalSize = kOffset + kSize; |
136 const GLbitfield kAccess = GL_MAP_WRITE_BIT; | 128 const GLbitfield kAccess = GL_MAP_WRITE_BIT; |
137 const GLbitfield kMappedAccess = GL_MAP_WRITE_BIT | GL_MAP_READ_BIT; | 129 const GLbitfield kMappedAccess = GL_MAP_WRITE_BIT | GL_MAP_READ_BIT; |
138 | 130 |
139 uint32_t result_shm_id = kSharedMemoryId; | 131 uint32_t result_shm_id = kSharedMemoryId; |
140 uint32_t result_shm_offset = kSharedMemoryOffset; | 132 uint32_t result_shm_offset = kSharedMemoryOffset; |
141 uint32_t data_shm_id = kSharedMemoryId; | 133 uint32_t data_shm_id = kSharedMemoryId; |
(...skipping 26 matching lines...) Expand all Loading... |
168 | 160 |
169 { // MapBufferRange succeeds | 161 { // MapBufferRange succeeds |
170 EXPECT_CALL(*gl_, | 162 EXPECT_CALL(*gl_, |
171 MapBufferRange(kTarget, kOffset, kSize, kMappedAccess)) | 163 MapBufferRange(kTarget, kOffset, kSize, kMappedAccess)) |
172 .WillOnce(Return(&gpu_data[kOffset])) | 164 .WillOnce(Return(&gpu_data[kOffset])) |
173 .RetiresOnSaturation(); | 165 .RetiresOnSaturation(); |
174 | 166 |
175 MapBufferRange cmd; | 167 MapBufferRange cmd; |
176 cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset, | 168 cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset, |
177 result_shm_id, result_shm_offset); | 169 result_shm_id, result_shm_offset); |
178 decoder_->set_unsafe_es3_apis_enabled(false); | |
179 *result = 0; | |
180 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd)); | |
181 EXPECT_EQ(0u, *result); | |
182 decoder_->set_unsafe_es3_apis_enabled(true); | |
183 *result = 0; | 170 *result = 0; |
184 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 171 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
185 EXPECT_EQ(1u, *result); | 172 EXPECT_EQ(1u, *result); |
186 // Verify the buffer range from GPU is copied to client mem. | 173 // Verify the buffer range from GPU is copied to client mem. |
187 EXPECT_EQ(0, memcmp(&gpu_data[kOffset], client_data, kSize)); | 174 EXPECT_EQ(0, memcmp(&gpu_data[kOffset], client_data, kSize)); |
188 } | 175 } |
189 | 176 |
190 // Update the client mem. | 177 // Update the client mem. |
191 const int8_t kValue0 = 21; | 178 const int8_t kValue0 = 21; |
192 memset(client_data, kValue0, kSize); | 179 memset(client_data, kValue0, kSize); |
193 | 180 |
194 { // UnmapBuffer succeeds | 181 { // UnmapBuffer succeeds |
195 EXPECT_CALL(*gl_, UnmapBuffer(kTarget)) | 182 EXPECT_CALL(*gl_, UnmapBuffer(kTarget)) |
196 .WillOnce(Return(GL_TRUE)) | 183 .WillOnce(Return(GL_TRUE)) |
197 .RetiresOnSaturation(); | 184 .RetiresOnSaturation(); |
198 | 185 |
199 UnmapBuffer cmd; | 186 UnmapBuffer cmd; |
200 cmd.Init(kTarget); | 187 cmd.Init(kTarget); |
201 decoder_->set_unsafe_es3_apis_enabled(false); | |
202 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd)); | |
203 decoder_->set_unsafe_es3_apis_enabled(true); | |
204 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 188 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
205 | 189 |
206 // Verify the GPU mem and shadow data are both updated | 190 // Verify the GPU mem and shadow data are both updated |
207 for (GLsizeiptr ii = 0; ii < kTotalSize; ++ii) { | 191 for (GLsizeiptr ii = 0; ii < kTotalSize; ++ii) { |
208 if (ii < kOffset) { | 192 if (ii < kOffset) { |
209 EXPECT_EQ(static_cast<int8_t>(ii % 128), gpu_data[ii]); | 193 EXPECT_EQ(static_cast<int8_t>(ii % 128), gpu_data[ii]); |
210 EXPECT_EQ(static_cast<int8_t>(ii % 128), shadow_data[ii]); | 194 EXPECT_EQ(static_cast<int8_t>(ii % 128), shadow_data[ii]); |
211 } else { | 195 } else { |
212 EXPECT_EQ(kValue0, gpu_data[ii]); | 196 EXPECT_EQ(kValue0, gpu_data[ii]); |
213 EXPECT_EQ(kValue0, shadow_data[ii]); | 197 EXPECT_EQ(kValue0, shadow_data[ii]); |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 } else { | 306 } else { |
323 EXPECT_EQ(static_cast<int8_t>(ii % 128), gpu_data[ii]); | 307 EXPECT_EQ(static_cast<int8_t>(ii % 128), gpu_data[ii]); |
324 EXPECT_EQ(static_cast<int8_t>(ii % 128), shadow_data[ii]); | 308 EXPECT_EQ(static_cast<int8_t>(ii % 128), shadow_data[ii]); |
325 } | 309 } |
326 } | 310 } |
327 } | 311 } |
328 | 312 |
329 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 313 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
330 } | 314 } |
331 | 315 |
332 TEST_P(GLES2DecoderTest, MapBufferRangeNotInitFails) { | 316 TEST_P(GLES3DecoderTest, MapBufferRangeNotInitFails) { |
333 const GLenum kTarget = GL_ARRAY_BUFFER; | 317 const GLenum kTarget = GL_ARRAY_BUFFER; |
334 const GLintptr kOffset = 10; | 318 const GLintptr kOffset = 10; |
335 const GLsizeiptr kSize = 64; | 319 const GLsizeiptr kSize = 64; |
336 const GLbitfield kAccess = GL_MAP_READ_BIT; | 320 const GLbitfield kAccess = GL_MAP_READ_BIT; |
337 std::vector<int8_t> data(kSize); | 321 std::vector<int8_t> data(kSize); |
338 | 322 |
339 typedef MapBufferRange::Result Result; | 323 typedef MapBufferRange::Result Result; |
340 Result* result = GetSharedMemoryAs<Result*>(); | 324 Result* result = GetSharedMemoryAs<Result*>(); |
341 *result = 1; // Any value other than 0. | 325 *result = 1; // Any value other than 0. |
342 uint32_t result_shm_id = kSharedMemoryId; | 326 uint32_t result_shm_id = kSharedMemoryId; |
343 uint32_t result_shm_offset = kSharedMemoryOffset; | 327 uint32_t result_shm_offset = kSharedMemoryOffset; |
344 uint32_t data_shm_id = kSharedMemoryId; | 328 uint32_t data_shm_id = kSharedMemoryId; |
345 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(*result); | 329 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(*result); |
346 | 330 |
347 MapBufferRange cmd; | 331 MapBufferRange cmd; |
348 cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset, | 332 cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset, |
349 result_shm_id, result_shm_offset); | 333 result_shm_id, result_shm_offset); |
350 decoder_->set_unsafe_es3_apis_enabled(true); | |
351 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 334 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
352 } | 335 } |
353 | 336 |
354 TEST_P(GLES2DecoderTest, MapBufferRangeWriteInvalidateRangeSucceeds) { | 337 TEST_P(GLES3DecoderTest, MapBufferRangeWriteInvalidateRangeSucceeds) { |
355 const GLenum kTarget = GL_ARRAY_BUFFER; | 338 const GLenum kTarget = GL_ARRAY_BUFFER; |
356 const GLintptr kOffset = 10; | 339 const GLintptr kOffset = 10; |
357 const GLsizeiptr kSize = 64; | 340 const GLsizeiptr kSize = 64; |
358 // With MAP_INVALIDATE_RANGE_BIT, no need to append MAP_READ_BIT. | 341 // With MAP_INVALIDATE_RANGE_BIT, no need to append MAP_READ_BIT. |
359 const GLbitfield kAccess = GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT; | 342 const GLbitfield kAccess = GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT; |
360 | 343 |
361 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); | 344 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); |
362 DoBufferData(kTarget, kSize + kOffset); | 345 DoBufferData(kTarget, kSize + kOffset); |
363 | 346 |
364 std::vector<int8_t> data(kSize); | 347 std::vector<int8_t> data(kSize); |
(...skipping 12 matching lines...) Expand all Loading... |
377 uint32_t result_shm_offset = kSharedMemoryOffset; | 360 uint32_t result_shm_offset = kSharedMemoryOffset; |
378 uint32_t data_shm_id = kSharedMemoryId; | 361 uint32_t data_shm_id = kSharedMemoryId; |
379 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(*result); | 362 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(*result); |
380 | 363 |
381 int8_t* mem = reinterpret_cast<int8_t*>(&result[1]); | 364 int8_t* mem = reinterpret_cast<int8_t*>(&result[1]); |
382 memset(mem, 72, kSize); // Init to a random value other than 0. | 365 memset(mem, 72, kSize); // Init to a random value other than 0. |
383 | 366 |
384 MapBufferRange cmd; | 367 MapBufferRange cmd; |
385 cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset, | 368 cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset, |
386 result_shm_id, result_shm_offset); | 369 result_shm_id, result_shm_offset); |
387 decoder_->set_unsafe_es3_apis_enabled(true); | |
388 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 370 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
389 } | 371 } |
390 | 372 |
391 TEST_P(GLES2DecoderTest, MapBufferRangeWriteInvalidateBufferSucceeds) { | 373 TEST_P(GLES3DecoderTest, MapBufferRangeWriteInvalidateBufferSucceeds) { |
392 // Test INVALIDATE_BUFFER_BIT is mapped to INVALIDATE_RANGE_BIT. | 374 // Test INVALIDATE_BUFFER_BIT is mapped to INVALIDATE_RANGE_BIT. |
393 const GLenum kTarget = GL_ARRAY_BUFFER; | 375 const GLenum kTarget = GL_ARRAY_BUFFER; |
394 const GLintptr kOffset = 10; | 376 const GLintptr kOffset = 10; |
395 const GLsizeiptr kSize = 64; | 377 const GLsizeiptr kSize = 64; |
396 const GLbitfield kAccess = GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT; | 378 const GLbitfield kAccess = GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT; |
397 // With MAP_INVALIDATE_BUFFER_BIT, no need to append MAP_READ_BIT. | 379 // With MAP_INVALIDATE_BUFFER_BIT, no need to append MAP_READ_BIT. |
398 const GLbitfield kFilteredAccess = | 380 const GLbitfield kFilteredAccess = |
399 GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT; | 381 GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT; |
400 | 382 |
401 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); | 383 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); |
(...skipping 15 matching lines...) Expand all Loading... |
417 uint32_t result_shm_offset = kSharedMemoryOffset; | 399 uint32_t result_shm_offset = kSharedMemoryOffset; |
418 uint32_t data_shm_id = kSharedMemoryId; | 400 uint32_t data_shm_id = kSharedMemoryId; |
419 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(*result); | 401 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(*result); |
420 | 402 |
421 int8_t* mem = reinterpret_cast<int8_t*>(&result[1]); | 403 int8_t* mem = reinterpret_cast<int8_t*>(&result[1]); |
422 memset(mem, 72, kSize); // Init to a random value other than 0. | 404 memset(mem, 72, kSize); // Init to a random value other than 0. |
423 | 405 |
424 MapBufferRange cmd; | 406 MapBufferRange cmd; |
425 cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset, | 407 cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset, |
426 result_shm_id, result_shm_offset); | 408 result_shm_id, result_shm_offset); |
427 decoder_->set_unsafe_es3_apis_enabled(true); | |
428 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 409 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
429 } | 410 } |
430 | 411 |
431 TEST_P(GLES2DecoderTest, MapBufferRangeWriteUnsynchronizedBit) { | 412 TEST_P(GLES3DecoderTest, MapBufferRangeWriteUnsynchronizedBit) { |
432 // Test UNSYNCHRONIZED_BIT is filtered out. | 413 // Test UNSYNCHRONIZED_BIT is filtered out. |
433 const GLenum kTarget = GL_ARRAY_BUFFER; | 414 const GLenum kTarget = GL_ARRAY_BUFFER; |
434 const GLintptr kOffset = 10; | 415 const GLintptr kOffset = 10; |
435 const GLsizeiptr kSize = 64; | 416 const GLsizeiptr kSize = 64; |
436 const GLbitfield kAccess = GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT; | 417 const GLbitfield kAccess = GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT; |
437 const GLbitfield kFilteredAccess = GL_MAP_WRITE_BIT | GL_MAP_READ_BIT; | 418 const GLbitfield kFilteredAccess = GL_MAP_WRITE_BIT | GL_MAP_READ_BIT; |
438 | 419 |
439 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); | 420 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); |
440 DoBufferData(kTarget, kSize + kOffset); | 421 DoBufferData(kTarget, kSize + kOffset); |
441 | 422 |
(...skipping 13 matching lines...) Expand all Loading... |
455 uint32_t result_shm_offset = kSharedMemoryOffset; | 436 uint32_t result_shm_offset = kSharedMemoryOffset; |
456 uint32_t data_shm_id = kSharedMemoryId; | 437 uint32_t data_shm_id = kSharedMemoryId; |
457 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(*result); | 438 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(*result); |
458 | 439 |
459 int8_t* mem = reinterpret_cast<int8_t*>(&result[1]); | 440 int8_t* mem = reinterpret_cast<int8_t*>(&result[1]); |
460 memset(mem, 72, kSize); // Init to a random value other than 0. | 441 memset(mem, 72, kSize); // Init to a random value other than 0. |
461 | 442 |
462 MapBufferRange cmd; | 443 MapBufferRange cmd; |
463 cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset, | 444 cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset, |
464 result_shm_id, result_shm_offset); | 445 result_shm_id, result_shm_offset); |
465 decoder_->set_unsafe_es3_apis_enabled(true); | |
466 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 446 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
467 EXPECT_EQ(0, memcmp(&data[0], mem, kSize)); | 447 EXPECT_EQ(0, memcmp(&data[0], mem, kSize)); |
468 } | 448 } |
469 | 449 |
470 TEST_P(GLES2DecoderTest, MapBufferRangeWithError) { | 450 TEST_P(GLES3DecoderTest, MapBufferRangeWithError) { |
471 const GLenum kTarget = GL_ARRAY_BUFFER; | 451 const GLenum kTarget = GL_ARRAY_BUFFER; |
472 const GLintptr kOffset = 10; | 452 const GLintptr kOffset = 10; |
473 const GLsizeiptr kSize = 64; | 453 const GLsizeiptr kSize = 64; |
474 const GLbitfield kAccess = GL_MAP_READ_BIT; | 454 const GLbitfield kAccess = GL_MAP_READ_BIT; |
475 std::vector<int8_t> data(kSize); | 455 std::vector<int8_t> data(kSize); |
476 for (GLsizeiptr ii = 0; ii < kSize; ++ii) { | 456 for (GLsizeiptr ii = 0; ii < kSize; ++ii) { |
477 data[ii] = static_cast<int8_t>(ii % 255); | 457 data[ii] = static_cast<int8_t>(ii % 255); |
478 } | 458 } |
479 | 459 |
480 typedef MapBufferRange::Result Result; | 460 typedef MapBufferRange::Result Result; |
481 Result* result = GetSharedMemoryAs<Result*>(); | 461 Result* result = GetSharedMemoryAs<Result*>(); |
482 *result = 0; | 462 *result = 0; |
483 uint32_t result_shm_id = kSharedMemoryId; | 463 uint32_t result_shm_id = kSharedMemoryId; |
484 uint32_t result_shm_offset = kSharedMemoryOffset; | 464 uint32_t result_shm_offset = kSharedMemoryOffset; |
485 uint32_t data_shm_id = kSharedMemoryId; | 465 uint32_t data_shm_id = kSharedMemoryId; |
486 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(*result); | 466 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(*result); |
487 | 467 |
488 int8_t* mem = reinterpret_cast<int8_t*>(&result[1]); | 468 int8_t* mem = reinterpret_cast<int8_t*>(&result[1]); |
489 memset(mem, 72, kSize); // Init to a random value other than 0. | 469 memset(mem, 72, kSize); // Init to a random value other than 0. |
490 | 470 |
491 MapBufferRange cmd; | 471 MapBufferRange cmd; |
492 cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset, | 472 cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset, |
493 result_shm_id, result_shm_offset); | 473 result_shm_id, result_shm_offset); |
494 decoder_->set_unsafe_es3_apis_enabled(true); | |
495 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 474 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
496 memset(&data[0], 72, kSize); | 475 memset(&data[0], 72, kSize); |
497 // Mem is untouched. | 476 // Mem is untouched. |
498 EXPECT_EQ(0, memcmp(&data[0], mem, kSize)); | 477 EXPECT_EQ(0, memcmp(&data[0], mem, kSize)); |
499 EXPECT_EQ(0u, *result); | 478 EXPECT_EQ(0u, *result); |
500 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | 479 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
501 } | 480 } |
502 | 481 |
503 TEST_P(GLES2DecoderTest, MapBufferRangeBadSharedMemoryFails) { | 482 TEST_P(GLES3DecoderTest, MapBufferRangeBadSharedMemoryFails) { |
504 const GLenum kTarget = GL_ARRAY_BUFFER; | 483 const GLenum kTarget = GL_ARRAY_BUFFER; |
505 const GLintptr kOffset = 10; | 484 const GLintptr kOffset = 10; |
506 const GLsizeiptr kSize = 64; | 485 const GLsizeiptr kSize = 64; |
507 const GLbitfield kAccess = GL_MAP_READ_BIT; | 486 const GLbitfield kAccess = GL_MAP_READ_BIT; |
508 std::vector<int8_t> data(kSize); | 487 std::vector<int8_t> data(kSize); |
509 for (GLsizeiptr ii = 0; ii < kSize; ++ii) { | 488 for (GLsizeiptr ii = 0; ii < kSize; ++ii) { |
510 data[ii] = static_cast<int8_t>(ii % 255); | 489 data[ii] = static_cast<int8_t>(ii % 255); |
511 } | 490 } |
512 | 491 |
513 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); | 492 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); |
514 DoBufferData(kTarget, kOffset + kSize); | 493 DoBufferData(kTarget, kOffset + kSize); |
515 | 494 |
516 typedef MapBufferRange::Result Result; | 495 typedef MapBufferRange::Result Result; |
517 Result* result = GetSharedMemoryAs<Result*>(); | 496 Result* result = GetSharedMemoryAs<Result*>(); |
518 *result = 0; | 497 *result = 0; |
519 uint32_t result_shm_id = kSharedMemoryId; | 498 uint32_t result_shm_id = kSharedMemoryId; |
520 uint32_t result_shm_offset = kSharedMemoryOffset; | 499 uint32_t result_shm_offset = kSharedMemoryOffset; |
521 uint32_t data_shm_id = kSharedMemoryId; | 500 uint32_t data_shm_id = kSharedMemoryId; |
522 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(*result); | 501 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(*result); |
523 | 502 |
524 decoder_->set_unsafe_es3_apis_enabled(true); | |
525 MapBufferRange cmd; | 503 MapBufferRange cmd; |
526 cmd.Init(kTarget, kOffset, kSize, kAccess, | 504 cmd.Init(kTarget, kOffset, kSize, kAccess, |
527 kInvalidSharedMemoryId, data_shm_offset, | 505 kInvalidSharedMemoryId, data_shm_offset, |
528 result_shm_id, result_shm_offset); | 506 result_shm_id, result_shm_offset); |
529 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 507 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
530 cmd.Init(kTarget, kOffset, kSize, kAccess, | 508 cmd.Init(kTarget, kOffset, kSize, kAccess, |
531 data_shm_id, data_shm_offset, | 509 data_shm_id, data_shm_offset, |
532 kInvalidSharedMemoryId, result_shm_offset); | 510 kInvalidSharedMemoryId, result_shm_offset); |
533 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 511 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
534 cmd.Init(kTarget, kOffset, kSize, kAccess, | 512 cmd.Init(kTarget, kOffset, kSize, kAccess, |
535 data_shm_id, kInvalidSharedMemoryOffset, | 513 data_shm_id, kInvalidSharedMemoryOffset, |
536 result_shm_id, result_shm_offset); | 514 result_shm_id, result_shm_offset); |
537 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 515 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
538 cmd.Init(kTarget, kOffset, kSize, kAccess, | 516 cmd.Init(kTarget, kOffset, kSize, kAccess, |
539 data_shm_id, data_shm_offset, | 517 data_shm_id, data_shm_offset, |
540 result_shm_id, kInvalidSharedMemoryOffset); | 518 result_shm_id, kInvalidSharedMemoryOffset); |
541 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); | 519 EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); |
542 } | 520 } |
543 | 521 |
544 TEST_P(GLES2DecoderTest, UnmapBufferWriteNotMappedFails) { | 522 TEST_P(GLES3DecoderTest, UnmapBufferWriteNotMappedFails) { |
545 const GLenum kTarget = GL_ARRAY_BUFFER; | 523 const GLenum kTarget = GL_ARRAY_BUFFER; |
546 | 524 |
547 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); | 525 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); |
548 | 526 |
549 UnmapBuffer cmd; | 527 UnmapBuffer cmd; |
550 cmd.Init(kTarget); | 528 cmd.Init(kTarget); |
551 decoder_->set_unsafe_es3_apis_enabled(true); | |
552 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 529 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
553 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | 530 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
554 } | 531 } |
555 | 532 |
556 TEST_P(GLES2DecoderTest, UnmapBufferWriteNoBoundBufferFails) { | 533 TEST_P(GLES3DecoderTest, UnmapBufferWriteNoBoundBufferFails) { |
557 const GLenum kTarget = GL_ARRAY_BUFFER; | 534 const GLenum kTarget = GL_ARRAY_BUFFER; |
558 | 535 |
559 UnmapBuffer cmd; | 536 UnmapBuffer cmd; |
560 cmd.Init(kTarget); | 537 cmd.Init(kTarget); |
561 decoder_->set_unsafe_es3_apis_enabled(true); | |
562 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 538 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
563 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | 539 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
564 } | 540 } |
565 | 541 |
566 TEST_P(GLES2DecoderTest, BufferDataDestroysDataStore) { | 542 TEST_P(GLES3DecoderTest, BufferDataDestroysDataStore) { |
567 const GLenum kTarget = GL_ARRAY_BUFFER; | 543 const GLenum kTarget = GL_ARRAY_BUFFER; |
568 const GLintptr kOffset = 10; | 544 const GLintptr kOffset = 10; |
569 const GLsizeiptr kSize = 64; | 545 const GLsizeiptr kSize = 64; |
570 const GLbitfield kAccess = GL_MAP_WRITE_BIT; | 546 const GLbitfield kAccess = GL_MAP_WRITE_BIT; |
571 const GLbitfield kFilteredAccess = GL_MAP_WRITE_BIT | GL_MAP_READ_BIT; | 547 const GLbitfield kFilteredAccess = GL_MAP_WRITE_BIT | GL_MAP_READ_BIT; |
572 | 548 |
573 uint32_t result_shm_id = kSharedMemoryId; | 549 uint32_t result_shm_id = kSharedMemoryId; |
574 uint32_t result_shm_offset = kSharedMemoryOffset; | 550 uint32_t result_shm_offset = kSharedMemoryOffset; |
575 uint32_t data_shm_id = kSharedMemoryId; | 551 uint32_t data_shm_id = kSharedMemoryId; |
576 // uint32_t is Result for both MapBufferRange and UnmapBuffer commands. | 552 // uint32_t is Result for both MapBufferRange and UnmapBuffer commands. |
577 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(uint32_t); | 553 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(uint32_t); |
578 | 554 |
579 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); | 555 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); |
580 DoBufferData(kTarget, kSize + kOffset); | 556 DoBufferData(kTarget, kSize + kOffset); |
581 | 557 |
582 std::vector<int8_t> data(kSize); | 558 std::vector<int8_t> data(kSize); |
583 | 559 |
584 decoder_->set_unsafe_es3_apis_enabled(true); | |
585 | |
586 { // MapBufferRange succeeds | 560 { // MapBufferRange succeeds |
587 EXPECT_CALL(*gl_, | 561 EXPECT_CALL(*gl_, |
588 MapBufferRange(kTarget, kOffset, kSize, kFilteredAccess)) | 562 MapBufferRange(kTarget, kOffset, kSize, kFilteredAccess)) |
589 .WillOnce(Return(&data[0])) | 563 .WillOnce(Return(&data[0])) |
590 .RetiresOnSaturation(); | 564 .RetiresOnSaturation(); |
591 | 565 |
592 typedef MapBufferRange::Result Result; | 566 typedef MapBufferRange::Result Result; |
593 Result* result = GetSharedMemoryAs<Result*>(); | 567 Result* result = GetSharedMemoryAs<Result*>(); |
594 | 568 |
595 MapBufferRange cmd; | 569 MapBufferRange cmd; |
(...skipping 10 matching lines...) Expand all Loading... |
606 } | 580 } |
607 | 581 |
608 { // UnmapBuffer fails. | 582 { // UnmapBuffer fails. |
609 UnmapBuffer cmd; | 583 UnmapBuffer cmd; |
610 cmd.Init(kTarget); | 584 cmd.Init(kTarget); |
611 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 585 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
612 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | 586 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
613 } | 587 } |
614 } | 588 } |
615 | 589 |
616 TEST_P(GLES2DecoderTest, DeleteBuffersDestroysDataStore) { | 590 TEST_P(GLES3DecoderTest, DeleteBuffersDestroysDataStore) { |
617 const GLenum kTarget = GL_ARRAY_BUFFER; | 591 const GLenum kTarget = GL_ARRAY_BUFFER; |
618 const GLintptr kOffset = 10; | 592 const GLintptr kOffset = 10; |
619 const GLsizeiptr kSize = 64; | 593 const GLsizeiptr kSize = 64; |
620 const GLbitfield kAccess = GL_MAP_WRITE_BIT; | 594 const GLbitfield kAccess = GL_MAP_WRITE_BIT; |
621 const GLbitfield kFilteredAccess = GL_MAP_WRITE_BIT | GL_MAP_READ_BIT; | 595 const GLbitfield kFilteredAccess = GL_MAP_WRITE_BIT | GL_MAP_READ_BIT; |
622 | 596 |
623 uint32_t result_shm_id = kSharedMemoryId; | 597 uint32_t result_shm_id = kSharedMemoryId; |
624 uint32_t result_shm_offset = kSharedMemoryOffset; | 598 uint32_t result_shm_offset = kSharedMemoryOffset; |
625 uint32_t data_shm_id = kSharedMemoryId; | 599 uint32_t data_shm_id = kSharedMemoryId; |
626 // uint32_t is Result for both MapBufferRange and UnmapBuffer commands. | 600 // uint32_t is Result for both MapBufferRange and UnmapBuffer commands. |
627 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(uint32_t); | 601 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(uint32_t); |
628 | 602 |
629 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); | 603 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); |
630 DoBufferData(kTarget, kSize + kOffset); | 604 DoBufferData(kTarget, kSize + kOffset); |
631 | 605 |
632 std::vector<int8_t> data(kSize); | 606 std::vector<int8_t> data(kSize); |
633 | 607 |
634 decoder_->set_unsafe_es3_apis_enabled(true); | |
635 | |
636 { // MapBufferRange succeeds | 608 { // MapBufferRange succeeds |
637 EXPECT_CALL(*gl_, | 609 EXPECT_CALL(*gl_, |
638 MapBufferRange(kTarget, kOffset, kSize, kFilteredAccess)) | 610 MapBufferRange(kTarget, kOffset, kSize, kFilteredAccess)) |
639 .WillOnce(Return(&data[0])) | 611 .WillOnce(Return(&data[0])) |
640 .RetiresOnSaturation(); | 612 .RetiresOnSaturation(); |
641 | 613 |
642 typedef MapBufferRange::Result Result; | 614 typedef MapBufferRange::Result Result; |
643 Result* result = GetSharedMemoryAs<Result*>(); | 615 Result* result = GetSharedMemoryAs<Result*>(); |
644 | 616 |
645 MapBufferRange cmd; | 617 MapBufferRange cmd; |
(...skipping 10 matching lines...) Expand all Loading... |
656 } | 628 } |
657 | 629 |
658 { // UnmapBuffer fails. | 630 { // UnmapBuffer fails. |
659 UnmapBuffer cmd; | 631 UnmapBuffer cmd; |
660 cmd.Init(kTarget); | 632 cmd.Init(kTarget); |
661 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 633 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
662 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); | 634 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
663 } | 635 } |
664 } | 636 } |
665 | 637 |
666 TEST_P(GLES2DecoderTest, MapUnmapBufferInvalidTarget) { | 638 TEST_P(GLES3DecoderTest, MapUnmapBufferInvalidTarget) { |
667 const GLenum kTarget = GL_TEXTURE_2D; | 639 const GLenum kTarget = GL_TEXTURE_2D; |
668 const GLintptr kOffset = 10; | 640 const GLintptr kOffset = 10; |
669 const GLsizeiptr kSize = 64; | 641 const GLsizeiptr kSize = 64; |
670 const GLbitfield kAccess = GL_MAP_WRITE_BIT; | 642 const GLbitfield kAccess = GL_MAP_WRITE_BIT; |
671 | 643 |
672 uint32_t result_shm_id = kSharedMemoryId; | 644 uint32_t result_shm_id = kSharedMemoryId; |
673 uint32_t result_shm_offset = kSharedMemoryOffset; | 645 uint32_t result_shm_offset = kSharedMemoryOffset; |
674 uint32_t data_shm_id = kSharedMemoryId; | 646 uint32_t data_shm_id = kSharedMemoryId; |
675 // uint32_t is Result for both MapBufferRange and UnmapBuffer commands. | 647 // uint32_t is Result for both MapBufferRange and UnmapBuffer commands. |
676 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(uint32_t); | 648 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(uint32_t); |
677 | 649 |
678 decoder_->set_unsafe_es3_apis_enabled(true); | |
679 | |
680 typedef MapBufferRange::Result Result; | 650 typedef MapBufferRange::Result Result; |
681 Result* result = GetSharedMemoryAs<Result*>(); | 651 Result* result = GetSharedMemoryAs<Result*>(); |
682 | 652 |
683 { | 653 { |
684 MapBufferRange cmd; | 654 MapBufferRange cmd; |
685 cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset, | 655 cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset, |
686 result_shm_id, result_shm_offset); | 656 result_shm_id, result_shm_offset); |
687 *result = 0; | 657 *result = 0; |
688 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 658 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
689 EXPECT_EQ(0u, *result); | 659 EXPECT_EQ(0u, *result); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
744 if (ii >= kWriteOffset && ii < kWriteOffset + kCopySize) { | 714 if (ii >= kWriteOffset && ii < kWriteOffset + kCopySize) { |
745 EXPECT_EQ(kValue0, shadow_data[ii]); | 715 EXPECT_EQ(kValue0, shadow_data[ii]); |
746 } else { | 716 } else { |
747 EXPECT_EQ(kValue1, shadow_data[ii]); | 717 EXPECT_EQ(kValue1, shadow_data[ii]); |
748 } | 718 } |
749 } | 719 } |
750 } | 720 } |
751 | 721 |
752 } // namespace gles2 | 722 } // namespace gles2 |
753 } // namespace gpu | 723 } // namespace gpu |
OLD | NEW |