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 |