| Index: gpu/command_buffer/service/gles2_cmd_decoder_unittest_buffers.cc
|
| diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_buffers.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_buffers.cc
|
| index cf05a4b3f015453c8756bc37369b3e394220335a..6d15c515998e348d79f91e08330125d2aa94c2df 100644
|
| --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_buffers.cc
|
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_buffers.cc
|
| @@ -129,9 +129,10 @@ TEST_P(GLES2DecoderTest, MapBufferRangeUnmapBufferReadSucceeds) {
|
| }
|
|
|
| TEST_P(GLES2DecoderTest, MapBufferRangeUnmapBufferWriteSucceeds) {
|
| - const GLenum kTarget = GL_ARRAY_BUFFER;
|
| + const GLenum kTarget = GL_ELEMENT_ARRAY_BUFFER;
|
| const GLintptr kOffset = 10;
|
| const GLsizeiptr kSize = 64;
|
| + const GLsizeiptr kTotalSize = kOffset + kSize;
|
| const GLbitfield kAccess = GL_MAP_WRITE_BIT;
|
| const GLbitfield kMappedAccess = GL_MAP_WRITE_BIT | GL_MAP_READ_BIT;
|
|
|
| @@ -141,23 +142,36 @@ TEST_P(GLES2DecoderTest, MapBufferRangeUnmapBufferWriteSucceeds) {
|
| // uint32_t is Result for both MapBufferRange and UnmapBuffer commands.
|
| uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(uint32_t);
|
|
|
| + typedef MapBufferRange::Result Result;
|
| + Result* result = GetSharedMemoryAs<Result*>();
|
| + int8_t* client_data = GetSharedMemoryAs<int8_t*>() + sizeof(uint32_t);
|
| +
|
| DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId);
|
| - DoBufferData(kTarget, kSize + kOffset);
|
| + Buffer* buffer = GetBuffer(client_buffer_id_);
|
| + EXPECT_TRUE(buffer != nullptr);
|
| + DoBufferData(kTarget, kTotalSize);
|
| + std::vector<int8_t> gpu_data(kTotalSize);
|
| + for (GLsizeiptr ii = 0; ii < kTotalSize; ++ii) {
|
| + gpu_data[ii] = static_cast<int8_t>(ii % 128);
|
| + }
|
| + DoBufferSubData(kTarget, 0, kTotalSize, &gpu_data[0]);
|
|
|
| - std::vector<int8_t> data(kSize);
|
| - for (GLsizeiptr ii = 0; ii < kSize; ++ii) {
|
| - data[ii] = static_cast<int8_t>(ii % 255);
|
| + EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
| + EXPECT_TRUE(buffer->shadowed());
|
| + const int8_t* shadow_data = reinterpret_cast<const int8_t*>(
|
| + buffer->GetRange(0, kTotalSize));
|
| + EXPECT_TRUE(shadow_data);
|
| + // Verify the shadow data is initialized.
|
| + for (GLsizeiptr ii = 0; ii < kTotalSize; ++ii) {
|
| + EXPECT_EQ(static_cast<int8_t>(ii % 128), shadow_data[ii]);
|
| }
|
|
|
| { // MapBufferRange succeeds
|
| EXPECT_CALL(*gl_,
|
| MapBufferRange(kTarget, kOffset, kSize, kMappedAccess))
|
| - .WillOnce(Return(&data[0]))
|
| + .WillOnce(Return(&gpu_data[kOffset]))
|
| .RetiresOnSaturation();
|
|
|
| - typedef MapBufferRange::Result Result;
|
| - Result* result = GetSharedMemoryAs<Result*>();
|
| -
|
| MapBufferRange cmd;
|
| cmd.Init(kTarget, kOffset, kSize, kAccess, data_shm_id, data_shm_offset,
|
| result_shm_id, result_shm_offset);
|
| @@ -168,12 +182,16 @@ TEST_P(GLES2DecoderTest, MapBufferRangeUnmapBufferWriteSucceeds) {
|
| decoder_->set_unsafe_es3_apis_enabled(true);
|
| *result = 0;
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| - int8_t* mem = reinterpret_cast<int8_t*>(&result[1]);
|
| - EXPECT_EQ(0, memcmp(&data[0], mem, kSize));
|
| EXPECT_EQ(1u, *result);
|
| + // Verify the buffer range from GPU is copied to client mem.
|
| + EXPECT_EQ(0, memcmp(&gpu_data[kOffset], client_data, kSize));
|
| }
|
|
|
| - { // UnmapBuffer succeeds
|
| + // Update the client mem.
|
| + const int8_t kValue0 = 21;
|
| + memset(client_data, kValue0, kSize);
|
| +
|
| + { // UnmapBuffer succeeds
|
| EXPECT_CALL(*gl_, UnmapBuffer(kTarget))
|
| .WillOnce(Return(GL_TRUE))
|
| .RetiresOnSaturation();
|
| @@ -184,6 +202,17 @@ TEST_P(GLES2DecoderTest, MapBufferRangeUnmapBufferWriteSucceeds) {
|
| EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
|
| decoder_->set_unsafe_es3_apis_enabled(true);
|
| EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
| +
|
| + // Verify the GPU mem and shadow data are both updated
|
| + for (GLsizeiptr ii = 0; ii < kTotalSize; ++ii) {
|
| + if (ii < kOffset) {
|
| + EXPECT_EQ(static_cast<int8_t>(ii % 128), gpu_data[ii]);
|
| + EXPECT_EQ(static_cast<int8_t>(ii % 128), shadow_data[ii]);
|
| + } else {
|
| + EXPECT_EQ(kValue0, gpu_data[ii]);
|
| + EXPECT_EQ(kValue0, shadow_data[ii]);
|
| + }
|
| + }
|
| }
|
|
|
| EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
|
|