| 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/feature_info.h" |
| 7 #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h" |
| 6 #include "gpu/command_buffer/service/mocks.h" | 8 #include "gpu/command_buffer/service/mocks.h" |
| 9 #include "gpu/command_buffer/service/test_helper.h" |
| 7 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
| 8 #include "ui/gl/gl_mock.h" | 11 #include "ui/gl/gl_mock.h" |
| 9 | 12 |
| 13 using ::testing::_; |
| 14 using ::testing::Return; |
| 10 using ::testing::StrictMock; | 15 using ::testing::StrictMock; |
| 11 | 16 |
| 12 namespace gpu { | 17 namespace gpu { |
| 13 namespace gles2 { | 18 namespace gles2 { |
| 14 | 19 |
| 15 class BufferManagerTestBase : public testing::Test { | 20 class BufferManagerTestBase : public testing::Test { |
| 16 protected: | 21 protected: |
| 17 void SetUpBase(MemoryTracker* memory_tracker) { | 22 void SetUpBase( |
| 23 MemoryTracker* memory_tracker, |
| 24 FeatureInfo* feature_info, |
| 25 const char* extensions, |
| 26 const char* vendor, |
| 27 const char* renderer) { |
| 18 gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); | 28 gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); |
| 19 ::gfx::GLInterface::SetGLInterface(gl_.get()); | 29 ::gfx::GLInterface::SetGLInterface(gl_.get()); |
| 20 manager_.reset(new BufferManager(memory_tracker)); | 30 if (feature_info) { |
| 31 TestHelper::SetupFeatureInfoInitExpectationsWithVendor( |
| 32 gl_.get(), extensions, vendor, renderer); |
| 33 feature_info->Initialize(NULL); |
| 34 } |
| 35 decoder_.reset(new MockGLES2Decoder()); |
| 36 manager_.reset(new BufferManager(memory_tracker, feature_info)); |
| 21 } | 37 } |
| 22 | 38 |
| 23 virtual void TearDown() { | 39 virtual void TearDown() { |
| 24 manager_->Destroy(false); | 40 manager_->Destroy(false); |
| 25 manager_.reset(); | 41 manager_.reset(); |
| 26 ::gfx::GLInterface::SetGLInterface(NULL); | 42 ::gfx::GLInterface::SetGLInterface(NULL); |
| 43 decoder_.reset(); |
| 27 gl_.reset(); | 44 gl_.reset(); |
| 28 } | 45 } |
| 29 | 46 |
| 30 GLenum GetTarget(const Buffer* info) const { | 47 GLenum GetTarget(const Buffer* buffer) const { |
| 31 return info->target(); | 48 return buffer->target(); |
| 49 } |
| 50 |
| 51 void DoBufferData( |
| 52 Buffer* buffer, GLsizeiptr size, GLenum usage, const GLvoid* data, |
| 53 GLenum error) { |
| 54 TestHelper::DoBufferData( |
| 55 gl_.get(), decoder_.get(), manager_.get(), |
| 56 buffer, size, usage, data, error); |
| 57 } |
| 58 |
| 59 bool DoBufferSubData( |
| 60 Buffer* buffer, GLintptr offset, GLsizeiptr size, |
| 61 const GLvoid* data) { |
| 62 bool success = true; |
| 63 if (!buffer->CheckRange(offset, size)) { |
| 64 EXPECT_CALL(*decoder_, SetGLError(GL_INVALID_VALUE, _, _)) |
| 65 .Times(1) |
| 66 .RetiresOnSaturation(); |
| 67 success = false; |
| 68 } else if (!buffer->IsClientSideArray()) { |
| 69 EXPECT_CALL(*gl_, BufferSubData( |
| 70 buffer->target(), offset, size, _)) |
| 71 .Times(1) |
| 72 .RetiresOnSaturation(); |
| 73 } |
| 74 manager_->DoBufferSubData( |
| 75 decoder_.get(), buffer, offset, size, data); |
| 76 return success; |
| 32 } | 77 } |
| 33 | 78 |
| 34 // Use StrictMock to make 100% sure we know how GL will be called. | 79 // Use StrictMock to make 100% sure we know how GL will be called. |
| 35 scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; | 80 scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; |
| 36 scoped_ptr<BufferManager> manager_; | 81 scoped_ptr<BufferManager> manager_; |
| 82 scoped_ptr<MockGLES2Decoder> decoder_; |
| 37 }; | 83 }; |
| 38 | 84 |
| 39 class BufferManagerTest : public BufferManagerTestBase { | 85 class BufferManagerTest : public BufferManagerTestBase { |
| 40 protected: | 86 protected: |
| 41 virtual void SetUp() { | 87 virtual void SetUp() { |
| 42 SetUpBase(NULL); | 88 SetUpBase(NULL, NULL, "", "", ""); |
| 43 } | 89 } |
| 44 }; | 90 }; |
| 45 | 91 |
| 46 class BufferManagerMemoryTrackerTest : public BufferManagerTestBase { | 92 class BufferManagerMemoryTrackerTest : public BufferManagerTestBase { |
| 47 protected: | 93 protected: |
| 48 virtual void SetUp() { | 94 virtual void SetUp() { |
| 49 mock_memory_tracker_ = new StrictMock<MockMemoryTracker>(); | 95 mock_memory_tracker_ = new StrictMock<MockMemoryTracker>(); |
| 50 SetUpBase(mock_memory_tracker_.get()); | 96 SetUpBase(mock_memory_tracker_.get(), NULL, "", "", ""); |
| 51 } | 97 } |
| 52 | 98 |
| 53 scoped_refptr<MockMemoryTracker> mock_memory_tracker_; | 99 scoped_refptr<MockMemoryTracker> mock_memory_tracker_; |
| 54 }; | 100 }; |
| 55 | 101 |
| 102 class BufferManagerClientSideArraysTest : public BufferManagerTestBase { |
| 103 protected: |
| 104 virtual void SetUp() { |
| 105 feature_info_ = new FeatureInfo(); |
| 106 SetUpBase(NULL, feature_info_.get(), "", "Imagination Technologies", ""); |
| 107 } |
| 108 |
| 109 scoped_refptr<FeatureInfo> feature_info_; |
| 110 }; |
| 111 |
| 56 #define EXPECT_MEMORY_ALLOCATION_CHANGE(old_size, new_size, pool) \ | 112 #define EXPECT_MEMORY_ALLOCATION_CHANGE(old_size, new_size, pool) \ |
| 57 EXPECT_CALL(*mock_memory_tracker_, \ | 113 EXPECT_CALL(*mock_memory_tracker_, \ |
| 58 TrackMemoryAllocatedChange(old_size, new_size, pool)) \ | 114 TrackMemoryAllocatedChange(old_size, new_size, pool)) \ |
| 59 .Times(1) \ | 115 .Times(1) \ |
| 60 .RetiresOnSaturation() \ | 116 .RetiresOnSaturation() \ |
| 61 | 117 |
| 62 TEST_F(BufferManagerTest, Basic) { | 118 TEST_F(BufferManagerTest, Basic) { |
| 63 const GLuint kClientBuffer1Id = 1; | 119 const GLuint kClientBuffer1Id = 1; |
| 64 const GLuint kServiceBuffer1Id = 11; | 120 const GLuint kServiceBuffer1Id = 11; |
| 65 const GLsizeiptr kBuffer1Size = 123; | 121 const GLsizeiptr kBuffer1Size = 123; |
| 66 const GLuint kClientBuffer2Id = 2; | 122 const GLuint kClientBuffer2Id = 2; |
| 67 // Check we can create buffer. | 123 // Check we can create buffer. |
| 68 manager_->CreateBuffer(kClientBuffer1Id, kServiceBuffer1Id); | 124 manager_->CreateBuffer(kClientBuffer1Id, kServiceBuffer1Id); |
| 69 // Check buffer got created. | 125 // Check buffer got created. |
| 70 Buffer* info1 = manager_->GetBuffer(kClientBuffer1Id); | 126 Buffer* buffer1 = manager_->GetBuffer(kClientBuffer1Id); |
| 71 ASSERT_TRUE(info1 != NULL); | 127 ASSERT_TRUE(buffer1 != NULL); |
| 72 EXPECT_EQ(0u, GetTarget(info1)); | 128 EXPECT_EQ(0u, GetTarget(buffer1)); |
| 73 EXPECT_EQ(0, info1->size()); | 129 EXPECT_EQ(0, buffer1->size()); |
| 74 EXPECT_EQ(static_cast<GLenum>(GL_STATIC_DRAW), info1->usage()); | 130 EXPECT_EQ(static_cast<GLenum>(GL_STATIC_DRAW), buffer1->usage()); |
| 75 EXPECT_FALSE(info1->IsDeleted()); | 131 EXPECT_FALSE(buffer1->IsDeleted()); |
| 76 EXPECT_EQ(kServiceBuffer1Id, info1->service_id()); | 132 EXPECT_FALSE(buffer1->IsClientSideArray()); |
| 133 EXPECT_EQ(kServiceBuffer1Id, buffer1->service_id()); |
| 77 GLuint client_id = 0; | 134 GLuint client_id = 0; |
| 78 EXPECT_TRUE(manager_->GetClientId(info1->service_id(), &client_id)); | 135 EXPECT_TRUE(manager_->GetClientId(buffer1->service_id(), &client_id)); |
| 79 EXPECT_EQ(kClientBuffer1Id, client_id); | 136 EXPECT_EQ(kClientBuffer1Id, client_id); |
| 80 manager_->SetTarget(info1, GL_ELEMENT_ARRAY_BUFFER); | 137 manager_->SetTarget(buffer1, GL_ELEMENT_ARRAY_BUFFER); |
| 81 EXPECT_EQ(static_cast<GLenum>(GL_ELEMENT_ARRAY_BUFFER), GetTarget(info1)); | 138 EXPECT_EQ(static_cast<GLenum>(GL_ELEMENT_ARRAY_BUFFER), GetTarget(buffer1)); |
| 82 // Check we and set its size. | 139 // Check we and set its size. |
| 83 manager_->SetInfo(info1, kBuffer1Size, GL_DYNAMIC_DRAW); | 140 DoBufferData(buffer1, kBuffer1Size, GL_DYNAMIC_DRAW, NULL, GL_NO_ERROR); |
| 84 EXPECT_EQ(kBuffer1Size, info1->size()); | 141 EXPECT_EQ(kBuffer1Size, buffer1->size()); |
| 85 EXPECT_EQ(static_cast<GLenum>(GL_DYNAMIC_DRAW), info1->usage()); | 142 EXPECT_EQ(static_cast<GLenum>(GL_DYNAMIC_DRAW), buffer1->usage()); |
| 86 // Check we get nothing for a non-existent buffer. | 143 // Check we get nothing for a non-existent buffer. |
| 87 EXPECT_TRUE(manager_->GetBuffer(kClientBuffer2Id) == NULL); | 144 EXPECT_TRUE(manager_->GetBuffer(kClientBuffer2Id) == NULL); |
| 88 // Check trying to a remove non-existent buffers does not crash. | 145 // Check trying to a remove non-existent buffers does not crash. |
| 89 manager_->RemoveBuffer(kClientBuffer2Id); | 146 manager_->RemoveBuffer(kClientBuffer2Id); |
| 90 // Check that it gets deleted when the last reference is released. | 147 // Check that it gets deleted when the last reference is released. |
| 91 EXPECT_CALL(*gl_, DeleteBuffersARB(1, ::testing::Pointee(kServiceBuffer1Id))) | 148 EXPECT_CALL(*gl_, DeleteBuffersARB(1, ::testing::Pointee(kServiceBuffer1Id))) |
| 92 .Times(1) | 149 .Times(1) |
| 93 .RetiresOnSaturation(); | 150 .RetiresOnSaturation(); |
| 94 // Check we can't get the buffer after we remove it. | 151 // Check we can't get the buffer after we remove it. |
| 95 manager_->RemoveBuffer(kClientBuffer1Id); | 152 manager_->RemoveBuffer(kClientBuffer1Id); |
| 96 EXPECT_TRUE(manager_->GetBuffer(kClientBuffer1Id) == NULL); | 153 EXPECT_TRUE(manager_->GetBuffer(kClientBuffer1Id) == NULL); |
| 97 } | 154 } |
| 98 | 155 |
| 99 TEST_F(BufferManagerMemoryTrackerTest, Basic) { | 156 TEST_F(BufferManagerMemoryTrackerTest, Basic) { |
| 100 const GLuint kClientBuffer1Id = 1; | 157 const GLuint kClientBuffer1Id = 1; |
| 101 const GLuint kServiceBuffer1Id = 11; | 158 const GLuint kServiceBuffer1Id = 11; |
| 102 const GLsizeiptr kBuffer1Size1 = 123; | 159 const GLsizeiptr kBuffer1Size1 = 123; |
| 103 const GLsizeiptr kBuffer1Size2 = 456; | 160 const GLsizeiptr kBuffer1Size2 = 456; |
| 104 // Check we can create buffer. | 161 // Check we can create buffer. |
| 105 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kManaged); | 162 EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kManaged); |
| 106 manager_->CreateBuffer(kClientBuffer1Id, kServiceBuffer1Id); | 163 manager_->CreateBuffer(kClientBuffer1Id, kServiceBuffer1Id); |
| 107 // Check buffer got created. | 164 // Check buffer got created. |
| 108 Buffer* info1 = manager_->GetBuffer(kClientBuffer1Id); | 165 Buffer* buffer1 = manager_->GetBuffer(kClientBuffer1Id); |
| 109 ASSERT_TRUE(info1 != NULL); | 166 ASSERT_TRUE(buffer1 != NULL); |
| 110 manager_->SetTarget(info1, GL_ELEMENT_ARRAY_BUFFER); | 167 manager_->SetTarget(buffer1, GL_ELEMENT_ARRAY_BUFFER); |
| 111 // Check we and set its size. | 168 // Check we and set its size. |
| 112 EXPECT_MEMORY_ALLOCATION_CHANGE(0, kBuffer1Size1, MemoryTracker::kManaged); | 169 EXPECT_MEMORY_ALLOCATION_CHANGE(0, kBuffer1Size1, MemoryTracker::kManaged); |
| 113 manager_->SetInfo(info1, kBuffer1Size1, GL_DYNAMIC_DRAW); | 170 DoBufferData(buffer1, kBuffer1Size1, GL_DYNAMIC_DRAW, NULL, GL_NO_ERROR); |
| 114 EXPECT_MEMORY_ALLOCATION_CHANGE(kBuffer1Size1, 0, MemoryTracker::kManaged); | 171 EXPECT_MEMORY_ALLOCATION_CHANGE(kBuffer1Size1, 0, MemoryTracker::kManaged); |
| 115 EXPECT_MEMORY_ALLOCATION_CHANGE(0, kBuffer1Size2, MemoryTracker::kManaged); | 172 EXPECT_MEMORY_ALLOCATION_CHANGE(0, kBuffer1Size2, MemoryTracker::kManaged); |
| 116 manager_->SetInfo(info1, kBuffer1Size2, GL_DYNAMIC_DRAW); | 173 DoBufferData(buffer1, kBuffer1Size2, GL_DYNAMIC_DRAW, NULL, GL_NO_ERROR); |
| 117 // On delete it will get freed. | 174 // On delete it will get freed. |
| 118 EXPECT_MEMORY_ALLOCATION_CHANGE(kBuffer1Size2, 0, MemoryTracker::kManaged); | 175 EXPECT_MEMORY_ALLOCATION_CHANGE(kBuffer1Size2, 0, MemoryTracker::kManaged); |
| 119 } | 176 } |
| 120 | 177 |
| 121 TEST_F(BufferManagerTest, Destroy) { | 178 TEST_F(BufferManagerTest, Destroy) { |
| 122 const GLuint kClient1Id = 1; | 179 const GLuint kClient1Id = 1; |
| 123 const GLuint kService1Id = 11; | 180 const GLuint kService1Id = 11; |
| 124 // Check we can create buffer. | 181 // Check we can create buffer. |
| 125 manager_->CreateBuffer(kClient1Id, kService1Id); | 182 manager_->CreateBuffer(kClient1Id, kService1Id); |
| 126 // Check buffer got created. | 183 // Check buffer got created. |
| 127 Buffer* info1 = | 184 Buffer* buffer1 = manager_->GetBuffer(kClient1Id); |
| 128 manager_->GetBuffer(kClient1Id); | 185 ASSERT_TRUE(buffer1 != NULL); |
| 129 ASSERT_TRUE(info1 != NULL); | |
| 130 EXPECT_CALL(*gl_, DeleteBuffersARB(1, ::testing::Pointee(kService1Id))) | 186 EXPECT_CALL(*gl_, DeleteBuffersARB(1, ::testing::Pointee(kService1Id))) |
| 131 .Times(1) | 187 .Times(1) |
| 132 .RetiresOnSaturation(); | 188 .RetiresOnSaturation(); |
| 133 manager_->Destroy(true); | 189 manager_->Destroy(true); |
| 134 // Check the resources were released. | 190 // Check the resources were released. |
| 135 info1 = manager_->GetBuffer(kClient1Id); | 191 buffer1 = manager_->GetBuffer(kClient1Id); |
| 136 ASSERT_TRUE(info1 == NULL); | 192 ASSERT_TRUE(buffer1 == NULL); |
| 137 } | 193 } |
| 138 | 194 |
| 139 TEST_F(BufferManagerTest, SetRange) { | 195 TEST_F(BufferManagerTest, DoBufferSubData) { |
| 140 const GLuint kClientBufferId = 1; | 196 const GLuint kClientBufferId = 1; |
| 141 const GLuint kServiceBufferId = 11; | 197 const GLuint kServiceBufferId = 11; |
| 142 const uint8 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; | 198 const uint8 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; |
| 143 manager_->CreateBuffer(kClientBufferId, kServiceBufferId); | 199 manager_->CreateBuffer(kClientBufferId, kServiceBufferId); |
| 144 Buffer* info = manager_->GetBuffer(kClientBufferId); | 200 Buffer* buffer = manager_->GetBuffer(kClientBufferId); |
| 145 ASSERT_TRUE(info != NULL); | 201 ASSERT_TRUE(buffer != NULL); |
| 146 manager_->SetTarget(info, GL_ELEMENT_ARRAY_BUFFER); | 202 manager_->SetTarget(buffer, GL_ELEMENT_ARRAY_BUFFER); |
| 147 manager_->SetInfo(info, sizeof(data), GL_STATIC_DRAW); | 203 DoBufferData(buffer, sizeof(data), GL_STATIC_DRAW, NULL, GL_NO_ERROR); |
| 148 EXPECT_TRUE(info->SetRange(0, sizeof(data), data)); | 204 EXPECT_TRUE(DoBufferSubData(buffer, 0, sizeof(data), data)); |
| 149 EXPECT_TRUE(info->SetRange(sizeof(data), 0, data)); | 205 EXPECT_TRUE(DoBufferSubData(buffer, sizeof(data), 0, data)); |
| 150 EXPECT_FALSE(info->SetRange(sizeof(data), 1, data)); | 206 EXPECT_FALSE(DoBufferSubData(buffer, sizeof(data), 1, data)); |
| 151 EXPECT_FALSE(info->SetRange(0, sizeof(data) + 1, data)); | 207 EXPECT_FALSE(DoBufferSubData(buffer, 0, sizeof(data) + 1, data)); |
| 152 EXPECT_FALSE(info->SetRange(-1, sizeof(data), data)); | 208 EXPECT_FALSE(DoBufferSubData(buffer, -1, sizeof(data), data)); |
| 153 EXPECT_FALSE(info->SetRange(0, -1, data)); | 209 EXPECT_FALSE(DoBufferSubData(buffer, 0, -1, data)); |
| 154 manager_->SetInfo(info, 1, GL_STATIC_DRAW); | 210 DoBufferData(buffer, 1, GL_STATIC_DRAW, NULL, GL_NO_ERROR); |
| 155 const int size = 0x20000; | 211 const int size = 0x20000; |
| 156 scoped_array<uint8> temp(new uint8[size]); | 212 scoped_array<uint8> temp(new uint8[size]); |
| 157 EXPECT_FALSE(info->SetRange(0 - size, size, temp.get())); | 213 EXPECT_FALSE(DoBufferSubData(buffer, 0 - size, size, temp.get())); |
| 158 EXPECT_FALSE(info->SetRange(1, size / 2, temp.get())); | 214 EXPECT_FALSE(DoBufferSubData(buffer, 1, size / 2, temp.get())); |
| 159 } | 215 } |
| 160 | 216 |
| 161 TEST_F(BufferManagerTest, GetRange) { | 217 TEST_F(BufferManagerTest, GetRange) { |
| 162 const GLuint kClientBufferId = 1; | 218 const GLuint kClientBufferId = 1; |
| 163 const GLuint kServiceBufferId = 11; | 219 const GLuint kServiceBufferId = 11; |
| 164 const uint8 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; | 220 const uint8 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; |
| 165 manager_->CreateBuffer(kClientBufferId, kServiceBufferId); | 221 manager_->CreateBuffer(kClientBufferId, kServiceBufferId); |
| 166 Buffer* info = manager_->GetBuffer(kClientBufferId); | 222 Buffer* buffer = manager_->GetBuffer(kClientBufferId); |
| 167 ASSERT_TRUE(info != NULL); | 223 ASSERT_TRUE(buffer != NULL); |
| 168 manager_->SetTarget(info, GL_ELEMENT_ARRAY_BUFFER); | 224 manager_->SetTarget(buffer, GL_ELEMENT_ARRAY_BUFFER); |
| 169 manager_->SetInfo(info, sizeof(data), GL_STATIC_DRAW); | 225 DoBufferData(buffer, sizeof(data), GL_STATIC_DRAW, NULL, GL_NO_ERROR); |
| 170 const char* buf = static_cast<const char*>(info->GetRange(0, sizeof(data))); | 226 const char* buf = |
| 227 static_cast<const char*>(buffer->GetRange(0, sizeof(data))); |
| 171 ASSERT_TRUE(buf != NULL); | 228 ASSERT_TRUE(buf != NULL); |
| 172 const char* buf1 = | 229 const char* buf1 = |
| 173 static_cast<const char*>(info->GetRange(1, sizeof(data) - 1)); | 230 static_cast<const char*>(buffer->GetRange(1, sizeof(data) - 1)); |
| 174 EXPECT_EQ(buf + 1, buf1); | 231 EXPECT_EQ(buf + 1, buf1); |
| 175 EXPECT_TRUE(info->GetRange(sizeof(data), 1) == NULL); | 232 EXPECT_TRUE(buffer->GetRange(sizeof(data), 1) == NULL); |
| 176 EXPECT_TRUE(info->GetRange(0, sizeof(data) + 1) == NULL); | 233 EXPECT_TRUE(buffer->GetRange(0, sizeof(data) + 1) == NULL); |
| 177 EXPECT_TRUE(info->GetRange(-1, sizeof(data)) == NULL); | 234 EXPECT_TRUE(buffer->GetRange(-1, sizeof(data)) == NULL); |
| 178 EXPECT_TRUE(info->GetRange(-0, -1) == NULL); | 235 EXPECT_TRUE(buffer->GetRange(-0, -1) == NULL); |
| 179 const int size = 0x20000; | 236 const int size = 0x20000; |
| 180 manager_->SetInfo(info, size / 2, GL_STATIC_DRAW); | 237 DoBufferData(buffer, size / 2, GL_STATIC_DRAW, NULL, GL_NO_ERROR); |
| 181 EXPECT_TRUE(info->GetRange(0 - size, size) == NULL); | 238 EXPECT_TRUE(buffer->GetRange(0 - size, size) == NULL); |
| 182 EXPECT_TRUE(info->GetRange(1, size / 2) == NULL); | 239 EXPECT_TRUE(buffer->GetRange(1, size / 2) == NULL); |
| 183 } | 240 } |
| 184 | 241 |
| 185 TEST_F(BufferManagerTest, GetMaxValueForRangeUint8) { | 242 TEST_F(BufferManagerTest, GetMaxValueForRangeUint8) { |
| 186 const GLuint kClientBufferId = 1; | 243 const GLuint kClientBufferId = 1; |
| 187 const GLuint kServiceBufferId = 11; | 244 const GLuint kServiceBufferId = 11; |
| 188 const uint8 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; | 245 const uint8 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; |
| 189 const uint8 new_data[] = {100, 120, 110}; | 246 const uint8 new_data[] = {100, 120, 110}; |
| 190 manager_->CreateBuffer(kClientBufferId, kServiceBufferId); | 247 manager_->CreateBuffer(kClientBufferId, kServiceBufferId); |
| 191 Buffer* info = manager_->GetBuffer(kClientBufferId); | 248 Buffer* buffer = manager_->GetBuffer(kClientBufferId); |
| 192 ASSERT_TRUE(info != NULL); | 249 ASSERT_TRUE(buffer != NULL); |
| 193 manager_->SetTarget(info, GL_ELEMENT_ARRAY_BUFFER); | 250 manager_->SetTarget(buffer, GL_ELEMENT_ARRAY_BUFFER); |
| 194 manager_->SetInfo(info, sizeof(data), GL_STATIC_DRAW); | 251 DoBufferData(buffer, sizeof(data), GL_STATIC_DRAW, NULL, GL_NO_ERROR); |
| 195 EXPECT_TRUE(info->SetRange(0, sizeof(data), data)); | 252 EXPECT_TRUE(DoBufferSubData(buffer, 0, sizeof(data), data)); |
| 196 GLuint max_value; | 253 GLuint max_value; |
| 197 // Check entire range succeeds. | 254 // Check entire range succeeds. |
| 198 EXPECT_TRUE(info->GetMaxValueForRange(0, 10, GL_UNSIGNED_BYTE, &max_value)); | 255 EXPECT_TRUE(buffer->GetMaxValueForRange( |
| 256 0, 10, GL_UNSIGNED_BYTE, &max_value)); |
| 199 EXPECT_EQ(10u, max_value); | 257 EXPECT_EQ(10u, max_value); |
| 200 // Check sub range succeeds. | 258 // Check sub range succeeds. |
| 201 EXPECT_TRUE(info->GetMaxValueForRange(4, 3, GL_UNSIGNED_BYTE, &max_value)); | 259 EXPECT_TRUE(buffer->GetMaxValueForRange( |
| 260 4, 3, GL_UNSIGNED_BYTE, &max_value)); |
| 202 EXPECT_EQ(6u, max_value); | 261 EXPECT_EQ(6u, max_value); |
| 203 // Check changing sub range succeeds. | 262 // Check changing sub range succeeds. |
| 204 EXPECT_TRUE(info->SetRange(4, sizeof(new_data), new_data)); | 263 EXPECT_TRUE(DoBufferSubData(buffer, 4, sizeof(new_data), new_data)); |
| 205 EXPECT_TRUE(info->GetMaxValueForRange(4, 3, GL_UNSIGNED_BYTE, &max_value)); | 264 EXPECT_TRUE(buffer->GetMaxValueForRange( |
| 265 4, 3, GL_UNSIGNED_BYTE, &max_value)); |
| 206 EXPECT_EQ(120u, max_value); | 266 EXPECT_EQ(120u, max_value); |
| 207 max_value = 0; | 267 max_value = 0; |
| 208 EXPECT_TRUE(info->GetMaxValueForRange(0, 10, GL_UNSIGNED_BYTE, &max_value)); | 268 EXPECT_TRUE(buffer->GetMaxValueForRange( |
| 269 0, 10, GL_UNSIGNED_BYTE, &max_value)); |
| 209 EXPECT_EQ(120u, max_value); | 270 EXPECT_EQ(120u, max_value); |
| 210 // Check out of range fails. | 271 // Check out of range fails. |
| 211 EXPECT_FALSE(info->GetMaxValueForRange(0, 11, GL_UNSIGNED_BYTE, &max_value)); | 272 EXPECT_FALSE(buffer->GetMaxValueForRange( |
| 212 EXPECT_FALSE(info->GetMaxValueForRange(10, 1, GL_UNSIGNED_BYTE, &max_value)); | 273 0, 11, GL_UNSIGNED_BYTE, &max_value)); |
| 274 EXPECT_FALSE(buffer->GetMaxValueForRange( |
| 275 10, 1, GL_UNSIGNED_BYTE, &max_value)); |
| 213 } | 276 } |
| 214 | 277 |
| 215 TEST_F(BufferManagerTest, GetMaxValueForRangeUint16) { | 278 TEST_F(BufferManagerTest, GetMaxValueForRangeUint16) { |
| 216 const GLuint kClientBufferId = 1; | 279 const GLuint kClientBufferId = 1; |
| 217 const GLuint kServiceBufferId = 11; | 280 const GLuint kServiceBufferId = 11; |
| 218 const uint16 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; | 281 const uint16 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; |
| 219 const uint16 new_data[] = {100, 120, 110}; | 282 const uint16 new_data[] = {100, 120, 110}; |
| 220 manager_->CreateBuffer(kClientBufferId, kServiceBufferId); | 283 manager_->CreateBuffer(kClientBufferId, kServiceBufferId); |
| 221 Buffer* info = manager_->GetBuffer(kClientBufferId); | 284 Buffer* buffer = manager_->GetBuffer(kClientBufferId); |
| 222 ASSERT_TRUE(info != NULL); | 285 ASSERT_TRUE(buffer != NULL); |
| 223 manager_->SetTarget(info, GL_ELEMENT_ARRAY_BUFFER); | 286 manager_->SetTarget(buffer, GL_ELEMENT_ARRAY_BUFFER); |
| 224 manager_->SetInfo(info, sizeof(data), GL_STATIC_DRAW); | 287 DoBufferData(buffer, sizeof(data), GL_STATIC_DRAW, NULL, GL_NO_ERROR); |
| 225 EXPECT_TRUE(info->SetRange(0, sizeof(data), data)); | 288 EXPECT_TRUE(DoBufferSubData(buffer, 0, sizeof(data), data)); |
| 226 GLuint max_value; | 289 GLuint max_value; |
| 227 // Check entire range succeeds. | 290 // Check entire range succeeds. |
| 228 EXPECT_TRUE(info->GetMaxValueForRange(0, 10, GL_UNSIGNED_SHORT, &max_value)); | 291 EXPECT_TRUE(buffer->GetMaxValueForRange( |
| 292 0, 10, GL_UNSIGNED_SHORT, &max_value)); |
| 229 EXPECT_EQ(10u, max_value); | 293 EXPECT_EQ(10u, max_value); |
| 230 // Check odd offset fails for GL_UNSIGNED_SHORT. | 294 // Check odd offset fails for GL_UNSIGNED_SHORT. |
| 231 EXPECT_FALSE(info->GetMaxValueForRange(1, 10, GL_UNSIGNED_SHORT, &max_value)); | 295 EXPECT_FALSE(buffer->GetMaxValueForRange( |
| 296 1, 10, GL_UNSIGNED_SHORT, &max_value)); |
| 232 // Check sub range succeeds. | 297 // Check sub range succeeds. |
| 233 EXPECT_TRUE(info->GetMaxValueForRange(8, 3, GL_UNSIGNED_SHORT, &max_value)); | 298 EXPECT_TRUE(buffer->GetMaxValueForRange( |
| 299 8, 3, GL_UNSIGNED_SHORT, &max_value)); |
| 234 EXPECT_EQ(6u, max_value); | 300 EXPECT_EQ(6u, max_value); |
| 235 // Check changing sub range succeeds. | 301 // Check changing sub range succeeds. |
| 236 EXPECT_TRUE(info->SetRange(8, sizeof(new_data), new_data)); | 302 EXPECT_TRUE(DoBufferSubData(buffer, 8, sizeof(new_data), new_data)); |
| 237 EXPECT_TRUE(info->GetMaxValueForRange(8, 3, GL_UNSIGNED_SHORT, &max_value)); | 303 EXPECT_TRUE(buffer->GetMaxValueForRange( |
| 304 8, 3, GL_UNSIGNED_SHORT, &max_value)); |
| 238 EXPECT_EQ(120u, max_value); | 305 EXPECT_EQ(120u, max_value); |
| 239 max_value = 0; | 306 max_value = 0; |
| 240 EXPECT_TRUE(info->GetMaxValueForRange(0, 10, GL_UNSIGNED_SHORT, &max_value)); | 307 EXPECT_TRUE(buffer->GetMaxValueForRange( |
| 308 0, 10, GL_UNSIGNED_SHORT, &max_value)); |
| 241 EXPECT_EQ(120u, max_value); | 309 EXPECT_EQ(120u, max_value); |
| 242 // Check out of range fails. | 310 // Check out of range fails. |
| 243 EXPECT_FALSE(info->GetMaxValueForRange(0, 11, GL_UNSIGNED_SHORT, &max_value)); | 311 EXPECT_FALSE(buffer->GetMaxValueForRange( |
| 244 EXPECT_FALSE(info->GetMaxValueForRange(20, 1, GL_UNSIGNED_SHORT, &max_value)); | 312 0, 11, GL_UNSIGNED_SHORT, &max_value)); |
| 313 EXPECT_FALSE(buffer->GetMaxValueForRange( |
| 314 20, 1, GL_UNSIGNED_SHORT, &max_value)); |
| 245 } | 315 } |
| 246 | 316 |
| 247 TEST_F(BufferManagerTest, GetMaxValueForRangeUint32) { | 317 TEST_F(BufferManagerTest, GetMaxValueForRangeUint32) { |
| 248 const GLuint kClientBufferId = 1; | 318 const GLuint kClientBufferId = 1; |
| 249 const GLuint kServiceBufferId = 11; | 319 const GLuint kServiceBufferId = 11; |
| 250 const uint32 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; | 320 const uint32 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; |
| 251 const uint32 new_data[] = {100, 120, 110}; | 321 const uint32 new_data[] = {100, 120, 110}; |
| 252 manager_->CreateBuffer(kClientBufferId, kServiceBufferId); | 322 manager_->CreateBuffer(kClientBufferId, kServiceBufferId); |
| 253 Buffer* info = manager_->GetBuffer(kClientBufferId); | 323 Buffer* buffer = manager_->GetBuffer(kClientBufferId); |
| 254 ASSERT_TRUE(info != NULL); | 324 ASSERT_TRUE(buffer != NULL); |
| 255 manager_->SetTarget(info, GL_ELEMENT_ARRAY_BUFFER); | 325 manager_->SetTarget(buffer, GL_ELEMENT_ARRAY_BUFFER); |
| 256 manager_->SetInfo(info, sizeof(data), GL_STATIC_DRAW); | 326 DoBufferData(buffer, sizeof(data), GL_STATIC_DRAW, NULL, GL_NO_ERROR); |
| 257 EXPECT_TRUE(info->SetRange(0, sizeof(data), data)); | 327 EXPECT_TRUE(DoBufferSubData(buffer, 0, sizeof(data), data)); |
| 258 GLuint max_value; | 328 GLuint max_value; |
| 259 // Check entire range succeeds. | 329 // Check entire range succeeds. |
| 260 EXPECT_TRUE(info->GetMaxValueForRange(0, 10, GL_UNSIGNED_INT, &max_value)); | 330 EXPECT_TRUE( |
| 331 buffer->GetMaxValueForRange(0, 10, GL_UNSIGNED_INT, &max_value)); |
| 261 EXPECT_EQ(10u, max_value); | 332 EXPECT_EQ(10u, max_value); |
| 262 // Check non aligned offsets fails for GL_UNSIGNED_INT. | 333 // Check non aligned offsets fails for GL_UNSIGNED_INT. |
| 263 EXPECT_FALSE(info->GetMaxValueForRange(1, 10, GL_UNSIGNED_INT, &max_value)); | 334 EXPECT_FALSE( |
| 264 EXPECT_FALSE(info->GetMaxValueForRange(2, 10, GL_UNSIGNED_INT, &max_value)); | 335 buffer->GetMaxValueForRange(1, 10, GL_UNSIGNED_INT, &max_value)); |
| 265 EXPECT_FALSE(info->GetMaxValueForRange(3, 10, GL_UNSIGNED_INT, &max_value)); | 336 EXPECT_FALSE( |
| 337 buffer->GetMaxValueForRange(2, 10, GL_UNSIGNED_INT, &max_value)); |
| 338 EXPECT_FALSE( |
| 339 buffer->GetMaxValueForRange(3, 10, GL_UNSIGNED_INT, &max_value)); |
| 266 // Check sub range succeeds. | 340 // Check sub range succeeds. |
| 267 EXPECT_TRUE(info->GetMaxValueForRange(16, 3, GL_UNSIGNED_INT, &max_value)); | 341 EXPECT_TRUE(buffer->GetMaxValueForRange(16, 3, GL_UNSIGNED_INT, &max_value)); |
| 268 EXPECT_EQ(6u, max_value); | 342 EXPECT_EQ(6u, max_value); |
| 269 // Check changing sub range succeeds. | 343 // Check changing sub range succeeds. |
| 270 EXPECT_TRUE(info->SetRange(16, sizeof(new_data), new_data)); | 344 EXPECT_TRUE(DoBufferSubData(buffer, 16, sizeof(new_data), new_data)); |
| 271 EXPECT_TRUE(info->GetMaxValueForRange(16, 3, GL_UNSIGNED_INT, &max_value)); | 345 EXPECT_TRUE(buffer->GetMaxValueForRange(16, 3, GL_UNSIGNED_INT, &max_value)); |
| 272 EXPECT_EQ(120u, max_value); | 346 EXPECT_EQ(120u, max_value); |
| 273 max_value = 0; | 347 max_value = 0; |
| 274 EXPECT_TRUE(info->GetMaxValueForRange(0, 10, GL_UNSIGNED_INT, &max_value)); | 348 EXPECT_TRUE(buffer->GetMaxValueForRange(0, 10, GL_UNSIGNED_INT, &max_value)); |
| 275 EXPECT_EQ(120u, max_value); | 349 EXPECT_EQ(120u, max_value); |
| 276 // Check out of range fails. | 350 // Check out of range fails. |
| 277 EXPECT_FALSE(info->GetMaxValueForRange(0, 11, GL_UNSIGNED_INT, &max_value)); | 351 EXPECT_FALSE( |
| 278 EXPECT_FALSE(info->GetMaxValueForRange(40, 1, GL_UNSIGNED_INT, &max_value)); | 352 buffer->GetMaxValueForRange(0, 11, GL_UNSIGNED_INT, &max_value)); |
| 353 EXPECT_FALSE( |
| 354 buffer->GetMaxValueForRange(40, 1, GL_UNSIGNED_INT, &max_value)); |
| 279 } | 355 } |
| 280 | 356 |
| 281 TEST_F(BufferManagerTest, UseDeletedBuffer) { | 357 TEST_F(BufferManagerTest, UseDeletedBuffer) { |
| 282 const GLuint kClientBufferId = 1; | 358 const GLuint kClientBufferId = 1; |
| 283 const GLuint kServiceBufferId = 11; | 359 const GLuint kServiceBufferId = 11; |
| 284 const uint32 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; | 360 const uint32 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; |
| 285 manager_->CreateBuffer(kClientBufferId, kServiceBufferId); | 361 manager_->CreateBuffer(kClientBufferId, kServiceBufferId); |
| 286 scoped_refptr<Buffer> info = | 362 scoped_refptr<Buffer> buffer = manager_->GetBuffer(kClientBufferId); |
| 287 manager_->GetBuffer(kClientBufferId); | 363 ASSERT_TRUE(buffer != NULL); |
| 288 ASSERT_TRUE(info != NULL); | 364 manager_->SetTarget(buffer, GL_ARRAY_BUFFER); |
| 289 manager_->SetTarget(info, GL_ARRAY_BUFFER); | |
| 290 // Remove buffer | 365 // Remove buffer |
| 291 manager_->RemoveBuffer(kClientBufferId); | 366 manager_->RemoveBuffer(kClientBufferId); |
| 292 // Use it after removing | 367 // Use it after removing |
| 293 manager_->SetInfo(info, sizeof(data), GL_STATIC_DRAW); | 368 DoBufferData(buffer, sizeof(data), GL_STATIC_DRAW, NULL, GL_NO_ERROR); |
| 294 // Check that it gets deleted when the last reference is released. | 369 // Check that it gets deleted when the last reference is released. |
| 295 EXPECT_CALL(*gl_, DeleteBuffersARB(1, ::testing::Pointee(kServiceBufferId))) | 370 EXPECT_CALL(*gl_, DeleteBuffersARB(1, ::testing::Pointee(kServiceBufferId))) |
| 296 .Times(1) | 371 .Times(1) |
| 297 .RetiresOnSaturation(); | 372 .RetiresOnSaturation(); |
| 298 info = NULL; | 373 buffer = NULL; |
| 374 } |
| 375 |
| 376 // Test buffers get shadowed when they are supposed to be. |
| 377 TEST_F(BufferManagerClientSideArraysTest, StreamBuffersAreShadowed) { |
| 378 const GLuint kClientBufferId = 1; |
| 379 const GLuint kServiceBufferId = 11; |
| 380 static const uint32 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; |
| 381 manager_->CreateBuffer(kClientBufferId, kServiceBufferId); |
| 382 Buffer* buffer = manager_->GetBuffer(kClientBufferId); |
| 383 ASSERT_TRUE(buffer != NULL); |
| 384 manager_->SetTarget(buffer, GL_ARRAY_BUFFER); |
| 385 DoBufferData(buffer, sizeof(data), GL_STREAM_DRAW, data, GL_NO_ERROR); |
| 386 EXPECT_TRUE(buffer->IsClientSideArray()); |
| 387 EXPECT_EQ(0, memcmp(data, buffer->GetRange(0, sizeof(data)), sizeof(data))); |
| 388 DoBufferData(buffer, sizeof(data), GL_DYNAMIC_DRAW, data, GL_NO_ERROR); |
| 389 EXPECT_FALSE(buffer->IsClientSideArray()); |
| 299 } | 390 } |
| 300 | 391 |
| 301 } // namespace gles2 | 392 } // namespace gles2 |
| 302 } // namespace gpu | 393 } // namespace gpu |
| 303 | 394 |
| 304 | 395 |
| OLD | NEW |