Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(151)

Side by Side Diff: gpu/command_buffer/service/gles2_cmd_decoder_unittest_buffers.cc

Issue 2383333002: Update shadowed data in MapBufferRange path. (Closed)
Patch Set: This should work Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_decoder.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_decoder.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698