| 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 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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); |
| 82 | 82 |
| 83 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); | 83 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); |
| 84 DoBufferData(kTarget, kSize + kOffset); |
| 84 | 85 |
| 85 std::vector<int8_t> data(kSize); | 86 std::vector<int8_t> data(kSize); |
| 86 for (GLsizeiptr ii = 0; ii < kSize; ++ii) { | 87 for (GLsizeiptr ii = 0; ii < kSize; ++ii) { |
| 87 data[ii] = static_cast<int8_t>(ii % 255); | 88 data[ii] = static_cast<int8_t>(ii % 255); |
| 88 } | 89 } |
| 89 | 90 |
| 90 { // MapBufferRange | 91 { // MapBufferRange |
| 91 EXPECT_CALL(*gl_, | 92 EXPECT_CALL(*gl_, |
| 92 MapBufferRange(kTarget, kOffset, kSize, kAccess)) | 93 MapBufferRange(kTarget, kOffset, kSize, kAccess)) |
| 93 .WillOnce(Return(&data[0])) | 94 .WillOnce(Return(&data[0])) |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 const GLbitfield kAccess = GL_MAP_WRITE_BIT; | 135 const GLbitfield kAccess = GL_MAP_WRITE_BIT; |
| 135 const GLbitfield kMappedAccess = GL_MAP_WRITE_BIT | GL_MAP_READ_BIT; | 136 const GLbitfield kMappedAccess = GL_MAP_WRITE_BIT | GL_MAP_READ_BIT; |
| 136 | 137 |
| 137 uint32_t result_shm_id = kSharedMemoryId; | 138 uint32_t result_shm_id = kSharedMemoryId; |
| 138 uint32_t result_shm_offset = kSharedMemoryOffset; | 139 uint32_t result_shm_offset = kSharedMemoryOffset; |
| 139 uint32_t data_shm_id = kSharedMemoryId; | 140 uint32_t data_shm_id = kSharedMemoryId; |
| 140 // uint32_t is Result for both MapBufferRange and UnmapBuffer commands. | 141 // uint32_t is Result for both MapBufferRange and UnmapBuffer commands. |
| 141 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(uint32_t); | 142 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(uint32_t); |
| 142 | 143 |
| 143 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); | 144 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); |
| 145 DoBufferData(kTarget, kSize + kOffset); |
| 144 | 146 |
| 145 std::vector<int8_t> data(kSize); | 147 std::vector<int8_t> data(kSize); |
| 146 for (GLsizeiptr ii = 0; ii < kSize; ++ii) { | 148 for (GLsizeiptr ii = 0; ii < kSize; ++ii) { |
| 147 data[ii] = static_cast<int8_t>(ii % 255); | 149 data[ii] = static_cast<int8_t>(ii % 255); |
| 148 } | 150 } |
| 149 | 151 |
| 150 { // MapBufferRange succeeds | 152 { // MapBufferRange succeeds |
| 151 EXPECT_CALL(*gl_, | 153 EXPECT_CALL(*gl_, |
| 152 MapBufferRange(kTarget, kOffset, kSize, kMappedAccess)) | 154 MapBufferRange(kTarget, kOffset, kSize, kMappedAccess)) |
| 153 .WillOnce(Return(&data[0])) | 155 .WillOnce(Return(&data[0])) |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 } | 212 } |
| 211 | 213 |
| 212 TEST_P(GLES2DecoderTest, MapBufferRangeWriteInvalidateRangeSucceeds) { | 214 TEST_P(GLES2DecoderTest, MapBufferRangeWriteInvalidateRangeSucceeds) { |
| 213 const GLenum kTarget = GL_ARRAY_BUFFER; | 215 const GLenum kTarget = GL_ARRAY_BUFFER; |
| 214 const GLintptr kOffset = 10; | 216 const GLintptr kOffset = 10; |
| 215 const GLsizeiptr kSize = 64; | 217 const GLsizeiptr kSize = 64; |
| 216 // With MAP_INVALIDATE_RANGE_BIT, no need to append MAP_READ_BIT. | 218 // With MAP_INVALIDATE_RANGE_BIT, no need to append MAP_READ_BIT. |
| 217 const GLbitfield kAccess = GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT; | 219 const GLbitfield kAccess = GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT; |
| 218 | 220 |
| 219 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); | 221 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); |
| 222 DoBufferData(kTarget, kSize + kOffset); |
| 220 | 223 |
| 221 std::vector<int8_t> data(kSize); | 224 std::vector<int8_t> data(kSize); |
| 222 for (GLsizeiptr ii = 0; ii < kSize; ++ii) { | 225 for (GLsizeiptr ii = 0; ii < kSize; ++ii) { |
| 223 data[ii] = static_cast<int8_t>(ii % 255); | 226 data[ii] = static_cast<int8_t>(ii % 255); |
| 224 } | 227 } |
| 225 EXPECT_CALL(*gl_, | 228 EXPECT_CALL(*gl_, |
| 226 MapBufferRange(kTarget, kOffset, kSize, kAccess)) | 229 MapBufferRange(kTarget, kOffset, kSize, kAccess)) |
| 227 .WillOnce(Return(&data[0])) | 230 .WillOnce(Return(&data[0])) |
| 228 .RetiresOnSaturation(); | 231 .RetiresOnSaturation(); |
| 229 | 232 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 249 // Test INVALIDATE_BUFFER_BIT is mapped to INVALIDATE_RANGE_BIT. | 252 // Test INVALIDATE_BUFFER_BIT is mapped to INVALIDATE_RANGE_BIT. |
| 250 const GLenum kTarget = GL_ARRAY_BUFFER; | 253 const GLenum kTarget = GL_ARRAY_BUFFER; |
| 251 const GLintptr kOffset = 10; | 254 const GLintptr kOffset = 10; |
| 252 const GLsizeiptr kSize = 64; | 255 const GLsizeiptr kSize = 64; |
| 253 const GLbitfield kAccess = GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT; | 256 const GLbitfield kAccess = GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT; |
| 254 // With MAP_INVALIDATE_BUFFER_BIT, no need to append MAP_READ_BIT. | 257 // With MAP_INVALIDATE_BUFFER_BIT, no need to append MAP_READ_BIT. |
| 255 const GLbitfield kFilteredAccess = | 258 const GLbitfield kFilteredAccess = |
| 256 GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT; | 259 GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT; |
| 257 | 260 |
| 258 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); | 261 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); |
| 262 DoBufferData(kTarget, kSize + kOffset); |
| 259 | 263 |
| 260 std::vector<int8_t> data(kSize); | 264 std::vector<int8_t> data(kSize); |
| 261 for (GLsizeiptr ii = 0; ii < kSize; ++ii) { | 265 for (GLsizeiptr ii = 0; ii < kSize; ++ii) { |
| 262 data[ii] = static_cast<int8_t>(ii % 255); | 266 data[ii] = static_cast<int8_t>(ii % 255); |
| 263 } | 267 } |
| 264 EXPECT_CALL(*gl_, | 268 EXPECT_CALL(*gl_, |
| 265 MapBufferRange(kTarget, kOffset, kSize, kFilteredAccess)) | 269 MapBufferRange(kTarget, kOffset, kSize, kFilteredAccess)) |
| 266 .WillOnce(Return(&data[0])) | 270 .WillOnce(Return(&data[0])) |
| 267 .RetiresOnSaturation(); | 271 .RetiresOnSaturation(); |
| 268 | 272 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 286 | 290 |
| 287 TEST_P(GLES2DecoderTest, MapBufferRangeWriteUnsynchronizedBit) { | 291 TEST_P(GLES2DecoderTest, MapBufferRangeWriteUnsynchronizedBit) { |
| 288 // Test UNSYNCHRONIZED_BIT is filtered out. | 292 // Test UNSYNCHRONIZED_BIT is filtered out. |
| 289 const GLenum kTarget = GL_ARRAY_BUFFER; | 293 const GLenum kTarget = GL_ARRAY_BUFFER; |
| 290 const GLintptr kOffset = 10; | 294 const GLintptr kOffset = 10; |
| 291 const GLsizeiptr kSize = 64; | 295 const GLsizeiptr kSize = 64; |
| 292 const GLbitfield kAccess = GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT; | 296 const GLbitfield kAccess = GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT; |
| 293 const GLbitfield kFilteredAccess = GL_MAP_WRITE_BIT | GL_MAP_READ_BIT; | 297 const GLbitfield kFilteredAccess = GL_MAP_WRITE_BIT | GL_MAP_READ_BIT; |
| 294 | 298 |
| 295 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); | 299 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); |
| 300 DoBufferData(kTarget, kSize + kOffset); |
| 296 | 301 |
| 297 std::vector<int8_t> data(kSize); | 302 std::vector<int8_t> data(kSize); |
| 298 for (GLsizeiptr ii = 0; ii < kSize; ++ii) { | 303 for (GLsizeiptr ii = 0; ii < kSize; ++ii) { |
| 299 data[ii] = static_cast<int8_t>(ii % 255); | 304 data[ii] = static_cast<int8_t>(ii % 255); |
| 300 } | 305 } |
| 301 EXPECT_CALL(*gl_, | 306 EXPECT_CALL(*gl_, |
| 302 MapBufferRange(kTarget, kOffset, kSize, kFilteredAccess)) | 307 MapBufferRange(kTarget, kOffset, kSize, kFilteredAccess)) |
| 303 .WillOnce(Return(&data[0])) | 308 .WillOnce(Return(&data[0])) |
| 304 .RetiresOnSaturation(); | 309 .RetiresOnSaturation(); |
| 305 | 310 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 324 | 329 |
| 325 TEST_P(GLES2DecoderTest, MapBufferRangeWithError) { | 330 TEST_P(GLES2DecoderTest, MapBufferRangeWithError) { |
| 326 const GLenum kTarget = GL_ARRAY_BUFFER; | 331 const GLenum kTarget = GL_ARRAY_BUFFER; |
| 327 const GLintptr kOffset = 10; | 332 const GLintptr kOffset = 10; |
| 328 const GLsizeiptr kSize = 64; | 333 const GLsizeiptr kSize = 64; |
| 329 const GLbitfield kAccess = GL_MAP_READ_BIT; | 334 const GLbitfield kAccess = GL_MAP_READ_BIT; |
| 330 std::vector<int8_t> data(kSize); | 335 std::vector<int8_t> data(kSize); |
| 331 for (GLsizeiptr ii = 0; ii < kSize; ++ii) { | 336 for (GLsizeiptr ii = 0; ii < kSize; ++ii) { |
| 332 data[ii] = static_cast<int8_t>(ii % 255); | 337 data[ii] = static_cast<int8_t>(ii % 255); |
| 333 } | 338 } |
| 334 EXPECT_CALL(*gl_, | |
| 335 MapBufferRange(kTarget, kOffset, kSize, kAccess)) | |
| 336 .WillOnce(Return(nullptr)) // Return nullptr to indicate a GL error. | |
| 337 .RetiresOnSaturation(); | |
| 338 | 339 |
| 339 typedef MapBufferRange::Result Result; | 340 typedef MapBufferRange::Result Result; |
| 340 Result* result = GetSharedMemoryAs<Result*>(); | 341 Result* result = GetSharedMemoryAs<Result*>(); |
| 341 *result = 0; | 342 *result = 0; |
| 342 uint32_t result_shm_id = kSharedMemoryId; | 343 uint32_t result_shm_id = kSharedMemoryId; |
| 343 uint32_t result_shm_offset = kSharedMemoryOffset; | 344 uint32_t result_shm_offset = kSharedMemoryOffset; |
| 344 uint32_t data_shm_id = kSharedMemoryId; | 345 uint32_t data_shm_id = kSharedMemoryId; |
| 345 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(*result); | 346 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(*result); |
| 346 | 347 |
| 347 int8_t* mem = reinterpret_cast<int8_t*>(&result[1]); | 348 int8_t* mem = reinterpret_cast<int8_t*>(&result[1]); |
| 348 memset(mem, 72, kSize); // Init to a random value other than 0. | 349 memset(mem, 72, kSize); // Init to a random value other than 0. |
| 349 | 350 |
| 350 MapBufferRange cmd; | 351 MapBufferRange cmd; |
| 351 cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset, | 352 cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset, |
| 352 result_shm_id, result_shm_offset); | 353 result_shm_id, result_shm_offset); |
| 353 decoder_->set_unsafe_es3_apis_enabled(true); | 354 decoder_->set_unsafe_es3_apis_enabled(true); |
| 354 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 355 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 355 memset(&data[0], 72, kSize); | 356 memset(&data[0], 72, kSize); |
| 356 // Mem is untouched. | 357 // Mem is untouched. |
| 357 EXPECT_EQ(0, memcmp(&data[0], mem, kSize)); | 358 EXPECT_EQ(0, memcmp(&data[0], mem, kSize)); |
| 358 EXPECT_EQ(0u, *result); | 359 EXPECT_EQ(0u, *result); |
| 360 EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); |
| 359 } | 361 } |
| 360 | 362 |
| 361 TEST_P(GLES2DecoderTest, MapBufferRangeBadSharedMemoryFails) { | 363 TEST_P(GLES2DecoderTest, MapBufferRangeBadSharedMemoryFails) { |
| 362 const GLenum kTarget = GL_ARRAY_BUFFER; | 364 const GLenum kTarget = GL_ARRAY_BUFFER; |
| 363 const GLintptr kOffset = 10; | 365 const GLintptr kOffset = 10; |
| 364 const GLsizeiptr kSize = 64; | 366 const GLsizeiptr kSize = 64; |
| 365 const GLbitfield kAccess = GL_MAP_READ_BIT; | 367 const GLbitfield kAccess = GL_MAP_READ_BIT; |
| 366 std::vector<int8_t> data(kSize); | 368 std::vector<int8_t> data(kSize); |
| 367 for (GLsizeiptr ii = 0; ii < kSize; ++ii) { | 369 for (GLsizeiptr ii = 0; ii < kSize; ++ii) { |
| 368 data[ii] = static_cast<int8_t>(ii % 255); | 370 data[ii] = static_cast<int8_t>(ii % 255); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 425 const GLbitfield kAccess = GL_MAP_WRITE_BIT; | 427 const GLbitfield kAccess = GL_MAP_WRITE_BIT; |
| 426 const GLbitfield kFilteredAccess = GL_MAP_WRITE_BIT | GL_MAP_READ_BIT; | 428 const GLbitfield kFilteredAccess = GL_MAP_WRITE_BIT | GL_MAP_READ_BIT; |
| 427 | 429 |
| 428 uint32_t result_shm_id = kSharedMemoryId; | 430 uint32_t result_shm_id = kSharedMemoryId; |
| 429 uint32_t result_shm_offset = kSharedMemoryOffset; | 431 uint32_t result_shm_offset = kSharedMemoryOffset; |
| 430 uint32_t data_shm_id = kSharedMemoryId; | 432 uint32_t data_shm_id = kSharedMemoryId; |
| 431 // uint32_t is Result for both MapBufferRange and UnmapBuffer commands. | 433 // uint32_t is Result for both MapBufferRange and UnmapBuffer commands. |
| 432 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(uint32_t); | 434 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(uint32_t); |
| 433 | 435 |
| 434 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); | 436 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); |
| 437 DoBufferData(kTarget, kSize + kOffset); |
| 435 | 438 |
| 436 std::vector<int8_t> data(kSize); | 439 std::vector<int8_t> data(kSize); |
| 437 | 440 |
| 438 decoder_->set_unsafe_es3_apis_enabled(true); | 441 decoder_->set_unsafe_es3_apis_enabled(true); |
| 439 | 442 |
| 440 { // MapBufferRange succeeds | 443 { // MapBufferRange succeeds |
| 441 EXPECT_CALL(*gl_, | 444 EXPECT_CALL(*gl_, |
| 442 MapBufferRange(kTarget, kOffset, kSize, kFilteredAccess)) | 445 MapBufferRange(kTarget, kOffset, kSize, kFilteredAccess)) |
| 443 .WillOnce(Return(&data[0])) | 446 .WillOnce(Return(&data[0])) |
| 444 .RetiresOnSaturation(); | 447 .RetiresOnSaturation(); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 474 const GLbitfield kAccess = GL_MAP_WRITE_BIT; | 477 const GLbitfield kAccess = GL_MAP_WRITE_BIT; |
| 475 const GLbitfield kFilteredAccess = GL_MAP_WRITE_BIT | GL_MAP_READ_BIT; | 478 const GLbitfield kFilteredAccess = GL_MAP_WRITE_BIT | GL_MAP_READ_BIT; |
| 476 | 479 |
| 477 uint32_t result_shm_id = kSharedMemoryId; | 480 uint32_t result_shm_id = kSharedMemoryId; |
| 478 uint32_t result_shm_offset = kSharedMemoryOffset; | 481 uint32_t result_shm_offset = kSharedMemoryOffset; |
| 479 uint32_t data_shm_id = kSharedMemoryId; | 482 uint32_t data_shm_id = kSharedMemoryId; |
| 480 // uint32_t is Result for both MapBufferRange and UnmapBuffer commands. | 483 // uint32_t is Result for both MapBufferRange and UnmapBuffer commands. |
| 481 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(uint32_t); | 484 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(uint32_t); |
| 482 | 485 |
| 483 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); | 486 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); |
| 487 DoBufferData(kTarget, kSize + kOffset); |
| 484 | 488 |
| 485 std::vector<int8_t> data(kSize); | 489 std::vector<int8_t> data(kSize); |
| 486 | 490 |
| 487 decoder_->set_unsafe_es3_apis_enabled(true); | 491 decoder_->set_unsafe_es3_apis_enabled(true); |
| 488 | 492 |
| 489 { // MapBufferRange succeeds | 493 { // MapBufferRange succeeds |
| 490 EXPECT_CALL(*gl_, | 494 EXPECT_CALL(*gl_, |
| 491 MapBufferRange(kTarget, kOffset, kSize, kFilteredAccess)) | 495 MapBufferRange(kTarget, kOffset, kSize, kFilteredAccess)) |
| 492 .WillOnce(Return(&data[0])) | 496 .WillOnce(Return(&data[0])) |
| 493 .RetiresOnSaturation(); | 497 .RetiresOnSaturation(); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 597 if (ii >= kWriteOffset && ii < kWriteOffset + kCopySize) { | 601 if (ii >= kWriteOffset && ii < kWriteOffset + kCopySize) { |
| 598 EXPECT_EQ(kValue0, shadow_data[ii]); | 602 EXPECT_EQ(kValue0, shadow_data[ii]); |
| 599 } else { | 603 } else { |
| 600 EXPECT_EQ(kValue1, shadow_data[ii]); | 604 EXPECT_EQ(kValue1, shadow_data[ii]); |
| 601 } | 605 } |
| 602 } | 606 } |
| 603 } | 607 } |
| 604 | 608 |
| 605 } // namespace gles2 | 609 } // namespace gles2 |
| 606 } // namespace gpu | 610 } // namespace gpu |
| OLD | NEW |