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

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

Issue 2380683003: add range check to service-side MapBufferRange (Closed)
Patch Set: rebase over reformat 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
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 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_decoder.cc ('k') | gpu/command_buffer/service/gles2_cmd_decoder_unittest_framebuffers.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698