| 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 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 decoder_->set_unsafe_es3_apis_enabled(false); | 122 decoder_->set_unsafe_es3_apis_enabled(false); |
| 123 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd)); | 123 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd)); |
| 124 decoder_->set_unsafe_es3_apis_enabled(true); | 124 decoder_->set_unsafe_es3_apis_enabled(true); |
| 125 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 125 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 126 } | 126 } |
| 127 | 127 |
| 128 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 128 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
| 129 } | 129 } |
| 130 | 130 |
| 131 TEST_P(GLES2DecoderTest, MapBufferRangeUnmapBufferWriteSucceeds) { | 131 TEST_P(GLES2DecoderTest, MapBufferRangeUnmapBufferWriteSucceeds) { |
| 132 const GLenum kTarget = GL_ARRAY_BUFFER; | 132 const GLenum kTarget = GL_ELEMENT_ARRAY_BUFFER; |
| 133 const GLintptr kOffset = 10; | 133 const GLintptr kOffset = 10; |
| 134 const GLsizeiptr kSize = 64; | 134 const GLsizeiptr kSize = 64; |
| 135 const GLsizeiptr kTotalSize = kOffset + kSize; |
| 135 const GLbitfield kAccess = GL_MAP_WRITE_BIT; | 136 const GLbitfield kAccess = GL_MAP_WRITE_BIT; |
| 136 const GLbitfield kMappedAccess = GL_MAP_WRITE_BIT | GL_MAP_READ_BIT; | 137 const GLbitfield kMappedAccess = GL_MAP_WRITE_BIT | GL_MAP_READ_BIT; |
| 137 | 138 |
| 138 uint32_t result_shm_id = kSharedMemoryId; | 139 uint32_t result_shm_id = kSharedMemoryId; |
| 139 uint32_t result_shm_offset = kSharedMemoryOffset; | 140 uint32_t result_shm_offset = kSharedMemoryOffset; |
| 140 uint32_t data_shm_id = kSharedMemoryId; | 141 uint32_t data_shm_id = kSharedMemoryId; |
| 141 // uint32_t is Result for both MapBufferRange and UnmapBuffer commands. | 142 // uint32_t is Result for both MapBufferRange and UnmapBuffer commands. |
| 142 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(uint32_t); | 143 uint32_t data_shm_offset = kSharedMemoryOffset + sizeof(uint32_t); |
| 143 | 144 |
| 145 typedef MapBufferRange::Result Result; |
| 146 Result* result = GetSharedMemoryAs<Result*>(); |
| 147 int8_t* client_data = GetSharedMemoryAs<int8_t*>() + sizeof(uint32_t); |
| 148 |
| 144 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); | 149 DoBindBuffer(kTarget, client_buffer_id_, kServiceBufferId); |
| 145 DoBufferData(kTarget, kSize + kOffset); | 150 Buffer* buffer = GetBuffer(client_buffer_id_); |
| 151 EXPECT_TRUE(buffer != nullptr); |
| 152 DoBufferData(kTarget, kTotalSize); |
| 153 std::vector<int8_t> gpu_data(kTotalSize); |
| 154 for (GLsizeiptr ii = 0; ii < kTotalSize; ++ii) { |
| 155 gpu_data[ii] = static_cast<int8_t>(ii % 128); |
| 156 } |
| 157 DoBufferSubData(kTarget, 0, kTotalSize, &gpu_data[0]); |
| 146 | 158 |
| 147 std::vector<int8_t> data(kSize); | 159 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
| 148 for (GLsizeiptr ii = 0; ii < kSize; ++ii) { | 160 EXPECT_TRUE(buffer->shadowed()); |
| 149 data[ii] = static_cast<int8_t>(ii % 255); | 161 const int8_t* shadow_data = reinterpret_cast<const int8_t*>( |
| 162 buffer->GetRange(0, kTotalSize)); |
| 163 EXPECT_TRUE(shadow_data); |
| 164 // Verify the shadow data is initialized. |
| 165 for (GLsizeiptr ii = 0; ii < kTotalSize; ++ii) { |
| 166 EXPECT_EQ(static_cast<int8_t>(ii % 128), shadow_data[ii]); |
| 150 } | 167 } |
| 151 | 168 |
| 152 { // MapBufferRange succeeds | 169 { // MapBufferRange succeeds |
| 153 EXPECT_CALL(*gl_, | 170 EXPECT_CALL(*gl_, |
| 154 MapBufferRange(kTarget, kOffset, kSize, kMappedAccess)) | 171 MapBufferRange(kTarget, kOffset, kSize, kMappedAccess)) |
| 155 .WillOnce(Return(&data[0])) | 172 .WillOnce(Return(&gpu_data[kOffset])) |
| 156 .RetiresOnSaturation(); | 173 .RetiresOnSaturation(); |
| 157 | 174 |
| 158 typedef MapBufferRange::Result Result; | |
| 159 Result* result = GetSharedMemoryAs<Result*>(); | |
| 160 | |
| 161 MapBufferRange cmd; | 175 MapBufferRange cmd; |
| 162 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, |
| 163 result_shm_id, result_shm_offset); | 177 result_shm_id, result_shm_offset); |
| 164 decoder_->set_unsafe_es3_apis_enabled(false); | 178 decoder_->set_unsafe_es3_apis_enabled(false); |
| 165 *result = 0; | 179 *result = 0; |
| 166 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd)); | 180 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd)); |
| 167 EXPECT_EQ(0u, *result); | 181 EXPECT_EQ(0u, *result); |
| 168 decoder_->set_unsafe_es3_apis_enabled(true); | 182 decoder_->set_unsafe_es3_apis_enabled(true); |
| 169 *result = 0; | 183 *result = 0; |
| 170 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 184 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 171 int8_t* mem = reinterpret_cast<int8_t*>(&result[1]); | |
| 172 EXPECT_EQ(0, memcmp(&data[0], mem, kSize)); | |
| 173 EXPECT_EQ(1u, *result); | 185 EXPECT_EQ(1u, *result); |
| 186 // Verify the buffer range from GPU is copied to client mem. |
| 187 EXPECT_EQ(0, memcmp(&gpu_data[kOffset], client_data, kSize)); |
| 174 } | 188 } |
| 175 | 189 |
| 176 { // UnmapBuffer succeeds | 190 // Update the client mem. |
| 191 const int8_t kValue0 = 21; |
| 192 memset(client_data, kValue0, kSize); |
| 193 |
| 194 { // UnmapBuffer succeeds |
| 177 EXPECT_CALL(*gl_, UnmapBuffer(kTarget)) | 195 EXPECT_CALL(*gl_, UnmapBuffer(kTarget)) |
| 178 .WillOnce(Return(GL_TRUE)) | 196 .WillOnce(Return(GL_TRUE)) |
| 179 .RetiresOnSaturation(); | 197 .RetiresOnSaturation(); |
| 180 | 198 |
| 181 UnmapBuffer cmd; | 199 UnmapBuffer cmd; |
| 182 cmd.Init(kTarget); | 200 cmd.Init(kTarget); |
| 183 decoder_->set_unsafe_es3_apis_enabled(false); | 201 decoder_->set_unsafe_es3_apis_enabled(false); |
| 184 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd)); | 202 EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd)); |
| 185 decoder_->set_unsafe_es3_apis_enabled(true); | 203 decoder_->set_unsafe_es3_apis_enabled(true); |
| 186 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); | 204 EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); |
| 205 |
| 206 // Verify the GPU mem and shadow data are both updated |
| 207 for (GLsizeiptr ii = 0; ii < kTotalSize; ++ii) { |
| 208 if (ii < kOffset) { |
| 209 EXPECT_EQ(static_cast<int8_t>(ii % 128), gpu_data[ii]); |
| 210 EXPECT_EQ(static_cast<int8_t>(ii % 128), shadow_data[ii]); |
| 211 } else { |
| 212 EXPECT_EQ(kValue0, gpu_data[ii]); |
| 213 EXPECT_EQ(kValue0, shadow_data[ii]); |
| 214 } |
| 215 } |
| 187 } | 216 } |
| 188 | 217 |
| 189 EXPECT_EQ(GL_NO_ERROR, GetGLError()); | 218 EXPECT_EQ(GL_NO_ERROR, GetGLError()); |
| 190 } | 219 } |
| 191 | 220 |
| 192 TEST_P(GLES2DecoderTest, MapBufferRangeNotInitFails) { | 221 TEST_P(GLES2DecoderTest, MapBufferRangeNotInitFails) { |
| 193 const GLenum kTarget = GL_ARRAY_BUFFER; | 222 const GLenum kTarget = GL_ARRAY_BUFFER; |
| 194 const GLintptr kOffset = 10; | 223 const GLintptr kOffset = 10; |
| 195 const GLsizeiptr kSize = 64; | 224 const GLsizeiptr kSize = 64; |
| 196 const GLbitfield kAccess = GL_MAP_READ_BIT; | 225 const GLbitfield kAccess = GL_MAP_READ_BIT; |
| (...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 601 if (ii >= kWriteOffset && ii < kWriteOffset + kCopySize) { | 630 if (ii >= kWriteOffset && ii < kWriteOffset + kCopySize) { |
| 602 EXPECT_EQ(kValue0, shadow_data[ii]); | 631 EXPECT_EQ(kValue0, shadow_data[ii]); |
| 603 } else { | 632 } else { |
| 604 EXPECT_EQ(kValue1, shadow_data[ii]); | 633 EXPECT_EQ(kValue1, shadow_data[ii]); |
| 605 } | 634 } |
| 606 } | 635 } |
| 607 } | 636 } |
| 608 | 637 |
| 609 } // namespace gles2 | 638 } // namespace gles2 |
| 610 } // namespace gpu | 639 } // namespace gpu |
| OLD | NEW |