| 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 |