OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "gpu/command_buffer/service/buffer_manager.h" | 5 #include "gpu/command_buffer/service/buffer_manager.h" |
| 6 #include "gpu/command_buffer/service/cmd_buffer_engine.h" |
| 7 #include "gpu/command_buffer/service/common_decoder.h" |
6 #include "gpu/command_buffer/common/gl_mock.h" | 8 #include "gpu/command_buffer/common/gl_mock.h" |
7 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
8 | 10 |
9 namespace gpu { | 11 namespace gpu { |
10 namespace gles2 { | 12 namespace gles2 { |
11 | 13 |
| 14 class MockDecoder : public CommonDecoder { |
| 15 public: |
| 16 virtual ~MockDecoder() { } |
| 17 MOCK_METHOD3(DoCommand, error::Error( |
| 18 unsigned int command, |
| 19 unsigned int arg_count, |
| 20 const void* cmd_data)); |
| 21 MOCK_CONST_METHOD1(GetCommandName, const char* (unsigned int command_id)); |
| 22 }; |
| 23 |
12 class BufferManagerTest : public testing::Test { | 24 class BufferManagerTest : public testing::Test { |
13 public: | 25 public: |
| 26 static const int32 kSharedMemoryId = 401; |
| 27 static const size_t kSharedBufferSize = 2048; |
| 28 static const uint32 kSharedMemoryOffset = 132; |
| 29 static const int32 kInvalidSharedMemoryId = 402; |
| 30 static const uint32 kInvalidSharedMemoryOffset = kSharedBufferSize + 1; |
| 31 static const uint8 kInitialMemoryValue = 0xBDu; |
| 32 |
14 BufferManagerTest() { | 33 BufferManagerTest() { |
15 } | 34 } |
16 ~BufferManagerTest() { | 35 ~BufferManagerTest() { |
17 manager_.Destroy(false); | 36 manager_.Destroy(false); |
18 } | 37 } |
19 | 38 |
20 protected: | 39 protected: |
| 40 class MockCommandBufferEngine : public CommandBufferEngine { |
| 41 public: |
| 42 MockCommandBufferEngine() { |
| 43 data_.reset(new int8[kSharedBufferSize]); |
| 44 ClearSharedMemory(); |
| 45 valid_buffer_.ptr = data_.get(); |
| 46 valid_buffer_.size = kSharedBufferSize; |
| 47 } |
| 48 |
| 49 virtual ~MockCommandBufferEngine() { |
| 50 } |
| 51 |
| 52 virtual Buffer GetSharedMemoryBuffer(int32 shm_id) OVERRIDE { |
| 53 return shm_id == kSharedMemoryId ? valid_buffer_ : invalid_buffer_; |
| 54 } |
| 55 |
| 56 void ClearSharedMemory() { |
| 57 memset(data_.get(), kInitialMemoryValue, kSharedBufferSize); |
| 58 } |
| 59 |
| 60 virtual void set_token(int32 token) OVERRIDE { |
| 61 DCHECK(false); |
| 62 } |
| 63 |
| 64 virtual bool SetGetBuffer(int32 /* transfer_buffer_id */) OVERRIDE { |
| 65 DCHECK(false); |
| 66 return false; |
| 67 } |
| 68 |
| 69 // Overridden from CommandBufferEngine. |
| 70 virtual bool SetGetOffset(int32 offset) OVERRIDE { |
| 71 DCHECK(false); |
| 72 return false; |
| 73 } |
| 74 |
| 75 // Overridden from CommandBufferEngine. |
| 76 virtual int32 GetGetOffset() OVERRIDE { |
| 77 DCHECK(false); |
| 78 return 0; |
| 79 } |
| 80 |
| 81 private: |
| 82 scoped_array<int8> data_; |
| 83 Buffer valid_buffer_; |
| 84 Buffer invalid_buffer_; |
| 85 }; |
| 86 |
21 virtual void SetUp() { | 87 virtual void SetUp() { |
22 gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); | 88 gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); |
23 ::gfx::GLInterface::SetGLInterface(gl_.get()); | 89 ::gfx::GLInterface::SetGLInterface(gl_.get()); |
| 90 engine_.reset(new MockCommandBufferEngine()); |
24 } | 91 } |
25 | 92 |
26 virtual void TearDown() { | 93 virtual void TearDown() { |
| 94 engine_.reset(); |
27 ::gfx::GLInterface::SetGLInterface(NULL); | 95 ::gfx::GLInterface::SetGLInterface(NULL); |
28 gl_.reset(); | 96 gl_.reset(); |
29 } | 97 } |
30 | 98 |
31 GLenum GetTarget(const BufferManager::BufferInfo* info) const { | 99 GLenum GetTarget(const BufferManager::BufferInfo* info) const { |
32 return info->target(); | 100 return info->target(); |
33 } | 101 } |
34 | 102 |
35 // Use StrictMock to make 100% sure we know how GL will be called. | 103 // Use StrictMock to make 100% sure we know how GL will be called. |
36 scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; | 104 scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; |
| 105 scoped_ptr<MockCommandBufferEngine> engine_; |
37 BufferManager manager_; | 106 BufferManager manager_; |
38 }; | 107 }; |
39 | 108 |
| 109 // GCC requires these declarations, but MSVC requires they not be present |
| 110 #ifndef COMPILER_MSVC |
| 111 const int32 BufferManagerTest::kSharedMemoryId; |
| 112 const size_t BufferManagerTest::kSharedBufferSize; |
| 113 const uint32 BufferManagerTest::kSharedMemoryOffset; |
| 114 const int32 BufferManagerTest::kInvalidSharedMemoryId; |
| 115 const uint32 BufferManagerTest::kInvalidSharedMemoryOffset; |
| 116 const uint8 BufferManagerTest::kInitialMemoryValue; |
| 117 #endif |
| 118 |
40 TEST_F(BufferManagerTest, Basic) { | 119 TEST_F(BufferManagerTest, Basic) { |
41 const GLuint kClientBuffer1Id = 1; | 120 const GLuint kClientBuffer1Id = 1; |
42 const GLuint kServiceBuffer1Id = 11; | 121 const GLuint kServiceBuffer1Id = 11; |
43 const GLsizeiptr kBuffer1Size = 123; | 122 const GLsizeiptr kBuffer1Size = 123; |
44 const GLuint kClientBuffer2Id = 2; | 123 const GLuint kClientBuffer2Id = 2; |
45 // Check we can create buffer. | 124 // Check we can create buffer. |
46 manager_.CreateBufferInfo(kClientBuffer1Id, kServiceBuffer1Id); | 125 manager_.CreateBufferInfo(kClientBuffer1Id, kServiceBuffer1Id); |
47 // Check buffer got created. | 126 // Check buffer got created. |
48 BufferManager::BufferInfo* info1 = manager_.GetBufferInfo(kClientBuffer1Id); | 127 BufferManager::BufferInfo* info1 = manager_.GetBufferInfo(kClientBuffer1Id); |
49 ASSERT_TRUE(info1 != NULL); | 128 ASSERT_TRUE(info1 != NULL); |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 manager_.RemoveBufferInfo(kClientBufferId); | 316 manager_.RemoveBufferInfo(kClientBufferId); |
238 // Use it after removing | 317 // Use it after removing |
239 manager_.SetInfo(info, sizeof(data), GL_STATIC_DRAW); | 318 manager_.SetInfo(info, sizeof(data), GL_STATIC_DRAW); |
240 // Check that it gets deleted when the last reference is released. | 319 // Check that it gets deleted when the last reference is released. |
241 EXPECT_CALL(*gl_, DeleteBuffersARB(1, ::testing::Pointee(kServiceBufferId))) | 320 EXPECT_CALL(*gl_, DeleteBuffersARB(1, ::testing::Pointee(kServiceBufferId))) |
242 .Times(1) | 321 .Times(1) |
243 .RetiresOnSaturation(); | 322 .RetiresOnSaturation(); |
244 info = NULL; | 323 info = NULL; |
245 } | 324 } |
246 | 325 |
| 326 TEST_F(BufferManagerTest, SharedMemory) { |
| 327 const GLuint kClientBufferId = 1; |
| 328 const GLuint kServiceBufferId = 11; |
| 329 const uint8 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; |
| 330 manager_.CreateBufferInfo(kClientBufferId, kServiceBufferId); |
| 331 BufferManager::BufferInfo* info = manager_.GetBufferInfo(kClientBufferId); |
| 332 ASSERT_TRUE(info != NULL); |
| 333 |
| 334 manager_.SetTarget(info, GL_ARRAY_BUFFER); |
| 335 scoped_ptr<MockDecoder> decoder; |
| 336 decoder.reset(new MockDecoder()); |
| 337 decoder->set_engine(engine_.get()); |
| 338 // Set shared memory. |
| 339 manager_.SetInfo(info, sizeof(data), GL_DYNAMIC_DRAW, decoder.get(), |
| 340 kSharedMemoryId, kSharedMemoryOffset); |
| 341 const uint8* buf = static_cast<const uint8*>( |
| 342 info->GetRange(0, sizeof(data))); |
| 343 ASSERT_TRUE(buf != NULL); |
| 344 ASSERT_EQ(kInitialMemoryValue, buf[0]); |
| 345 ASSERT_EQ(kInitialMemoryValue, buf[sizeof(data) - 1]); |
| 346 |
| 347 // Check that SetRange modifies shared memory. |
| 348 info->SetRange(0, sizeof(data), data); |
| 349 uint8* shm_buf = decoder->GetSharedMemoryAs<uint8*>( |
| 350 kSharedMemoryId, kSharedMemoryOffset, sizeof(data)); |
| 351 ASSERT_TRUE(shm_buf != NULL); |
| 352 ASSERT_EQ(buf[0], shm_buf[0]); |
| 353 ASSERT_EQ(buf[sizeof(data) - 1], shm_buf[sizeof(data) - 1]); |
| 354 |
| 355 // Reset shared memory to initial value. |
| 356 engine_->ClearSharedMemory(); |
| 357 const uint8* buf1 = static_cast<const uint8*>( |
| 358 info->GetRange(0, sizeof(data))); |
| 359 ASSERT_TRUE(buf1 != NULL); |
| 360 ASSERT_EQ(kInitialMemoryValue, buf[0]); |
| 361 ASSERT_EQ(kInitialMemoryValue, buf[sizeof(data) - 1]); |
| 362 |
| 363 // Remove decoder. |
| 364 decoder.reset(); |
| 365 // Check that GetRange returns NULL after removing decoder. |
| 366 const uint8* buf2 = static_cast<const uint8*>( |
| 367 info->GetRange(0, sizeof(data))); |
| 368 ASSERT_TRUE(buf2 == NULL); |
| 369 } |
| 370 |
247 } // namespace gles2 | 371 } // namespace gles2 |
248 } // namespace gpu | 372 } // namespace gpu |
249 | |
250 | |
OLD | NEW |