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