| Index: gpu/command_buffer/service/buffer_manager_unittest.cc
|
| diff --git a/gpu/command_buffer/service/buffer_manager_unittest.cc b/gpu/command_buffer/service/buffer_manager_unittest.cc
|
| index e782e7f9100983b1614f8dd4e439592f89482112..65dd7ed501864dad3ed79f1e1571781b47ffa493 100644
|
| --- a/gpu/command_buffer/service/buffer_manager_unittest.cc
|
| +++ b/gpu/command_buffer/service/buffer_manager_unittest.cc
|
| @@ -3,10 +3,15 @@
|
| // found in the LICENSE file.
|
|
|
| #include "gpu/command_buffer/service/buffer_manager.h"
|
| +#include "gpu/command_buffer/service/feature_info.h"
|
| +#include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h"
|
| #include "gpu/command_buffer/service/mocks.h"
|
| +#include "gpu/command_buffer/service/test_helper.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| #include "ui/gl/gl_mock.h"
|
|
|
| +using ::testing::_;
|
| +using ::testing::Return;
|
| using ::testing::StrictMock;
|
|
|
| namespace gpu {
|
| @@ -14,32 +19,73 @@ namespace gles2 {
|
|
|
| class BufferManagerTestBase : public testing::Test {
|
| protected:
|
| - void SetUpBase(MemoryTracker* memory_tracker) {
|
| + void SetUpBase(
|
| + MemoryTracker* memory_tracker,
|
| + FeatureInfo* feature_info,
|
| + const char* extensions,
|
| + const char* vendor,
|
| + const char* renderer) {
|
| gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>());
|
| ::gfx::GLInterface::SetGLInterface(gl_.get());
|
| - manager_.reset(new BufferManager(memory_tracker));
|
| + if (feature_info) {
|
| + TestHelper::SetupFeatureInfoInitExpectationsWithVendor(
|
| + gl_.get(), extensions, vendor, renderer);
|
| + feature_info->Initialize(NULL);
|
| + }
|
| + decoder_.reset(new MockGLES2Decoder());
|
| + manager_.reset(new BufferManager(memory_tracker, feature_info));
|
| }
|
|
|
| virtual void TearDown() {
|
| manager_->Destroy(false);
|
| manager_.reset();
|
| ::gfx::GLInterface::SetGLInterface(NULL);
|
| + decoder_.reset();
|
| gl_.reset();
|
| }
|
|
|
| - GLenum GetTarget(const Buffer* info) const {
|
| - return info->target();
|
| + GLenum GetTarget(const Buffer* buffer) const {
|
| + return buffer->target();
|
| + }
|
| +
|
| + void DoBufferData(
|
| + Buffer* buffer, GLsizeiptr size, GLenum usage, const GLvoid* data,
|
| + GLenum error) {
|
| + TestHelper::DoBufferData(
|
| + gl_.get(), decoder_.get(), manager_.get(),
|
| + buffer, size, usage, data, error);
|
| + }
|
| +
|
| + bool DoBufferSubData(
|
| + Buffer* buffer, GLintptr offset, GLsizeiptr size,
|
| + const GLvoid* data) {
|
| + bool success = true;
|
| + if (!buffer->CheckRange(offset, size)) {
|
| + EXPECT_CALL(*decoder_, SetGLError(GL_INVALID_VALUE, _, _))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + success = false;
|
| + } else if (!buffer->IsClientSideArray()) {
|
| + EXPECT_CALL(*gl_, BufferSubData(
|
| + buffer->target(), offset, size, _))
|
| + .Times(1)
|
| + .RetiresOnSaturation();
|
| + }
|
| + manager_->DoBufferSubData(
|
| + decoder_.get(), buffer, offset, size, data);
|
| + return success;
|
| }
|
|
|
| // Use StrictMock to make 100% sure we know how GL will be called.
|
| scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_;
|
| scoped_ptr<BufferManager> manager_;
|
| + scoped_ptr<MockGLES2Decoder> decoder_;
|
| };
|
|
|
| class BufferManagerTest : public BufferManagerTestBase {
|
| protected:
|
| virtual void SetUp() {
|
| - SetUpBase(NULL);
|
| + SetUpBase(NULL, NULL, "", "", "");
|
| }
|
| };
|
|
|
| @@ -47,12 +93,22 @@ class BufferManagerMemoryTrackerTest : public BufferManagerTestBase {
|
| protected:
|
| virtual void SetUp() {
|
| mock_memory_tracker_ = new StrictMock<MockMemoryTracker>();
|
| - SetUpBase(mock_memory_tracker_.get());
|
| + SetUpBase(mock_memory_tracker_.get(), NULL, "", "", "");
|
| }
|
|
|
| scoped_refptr<MockMemoryTracker> mock_memory_tracker_;
|
| };
|
|
|
| +class BufferManagerClientSideArraysTest : public BufferManagerTestBase {
|
| + protected:
|
| + virtual void SetUp() {
|
| + feature_info_ = new FeatureInfo();
|
| + SetUpBase(NULL, feature_info_.get(), "", "Imagination Technologies", "");
|
| + }
|
| +
|
| + scoped_refptr<FeatureInfo> feature_info_;
|
| +};
|
| +
|
| #define EXPECT_MEMORY_ALLOCATION_CHANGE(old_size, new_size, pool) \
|
| EXPECT_CALL(*mock_memory_tracker_, \
|
| TrackMemoryAllocatedChange(old_size, new_size, pool)) \
|
| @@ -67,22 +123,23 @@ TEST_F(BufferManagerTest, Basic) {
|
| // Check we can create buffer.
|
| manager_->CreateBuffer(kClientBuffer1Id, kServiceBuffer1Id);
|
| // Check buffer got created.
|
| - Buffer* info1 = manager_->GetBuffer(kClientBuffer1Id);
|
| - ASSERT_TRUE(info1 != NULL);
|
| - EXPECT_EQ(0u, GetTarget(info1));
|
| - EXPECT_EQ(0, info1->size());
|
| - EXPECT_EQ(static_cast<GLenum>(GL_STATIC_DRAW), info1->usage());
|
| - EXPECT_FALSE(info1->IsDeleted());
|
| - EXPECT_EQ(kServiceBuffer1Id, info1->service_id());
|
| + Buffer* buffer1 = manager_->GetBuffer(kClientBuffer1Id);
|
| + ASSERT_TRUE(buffer1 != NULL);
|
| + EXPECT_EQ(0u, GetTarget(buffer1));
|
| + EXPECT_EQ(0, buffer1->size());
|
| + EXPECT_EQ(static_cast<GLenum>(GL_STATIC_DRAW), buffer1->usage());
|
| + EXPECT_FALSE(buffer1->IsDeleted());
|
| + EXPECT_FALSE(buffer1->IsClientSideArray());
|
| + EXPECT_EQ(kServiceBuffer1Id, buffer1->service_id());
|
| GLuint client_id = 0;
|
| - EXPECT_TRUE(manager_->GetClientId(info1->service_id(), &client_id));
|
| + EXPECT_TRUE(manager_->GetClientId(buffer1->service_id(), &client_id));
|
| EXPECT_EQ(kClientBuffer1Id, client_id);
|
| - manager_->SetTarget(info1, GL_ELEMENT_ARRAY_BUFFER);
|
| - EXPECT_EQ(static_cast<GLenum>(GL_ELEMENT_ARRAY_BUFFER), GetTarget(info1));
|
| + manager_->SetTarget(buffer1, GL_ELEMENT_ARRAY_BUFFER);
|
| + EXPECT_EQ(static_cast<GLenum>(GL_ELEMENT_ARRAY_BUFFER), GetTarget(buffer1));
|
| // Check we and set its size.
|
| - manager_->SetInfo(info1, kBuffer1Size, GL_DYNAMIC_DRAW);
|
| - EXPECT_EQ(kBuffer1Size, info1->size());
|
| - EXPECT_EQ(static_cast<GLenum>(GL_DYNAMIC_DRAW), info1->usage());
|
| + DoBufferData(buffer1, kBuffer1Size, GL_DYNAMIC_DRAW, NULL, GL_NO_ERROR);
|
| + EXPECT_EQ(kBuffer1Size, buffer1->size());
|
| + EXPECT_EQ(static_cast<GLenum>(GL_DYNAMIC_DRAW), buffer1->usage());
|
| // Check we get nothing for a non-existent buffer.
|
| EXPECT_TRUE(manager_->GetBuffer(kClientBuffer2Id) == NULL);
|
| // Check trying to a remove non-existent buffers does not crash.
|
| @@ -105,15 +162,15 @@ TEST_F(BufferManagerMemoryTrackerTest, Basic) {
|
| EXPECT_MEMORY_ALLOCATION_CHANGE(0, 0, MemoryTracker::kManaged);
|
| manager_->CreateBuffer(kClientBuffer1Id, kServiceBuffer1Id);
|
| // Check buffer got created.
|
| - Buffer* info1 = manager_->GetBuffer(kClientBuffer1Id);
|
| - ASSERT_TRUE(info1 != NULL);
|
| - manager_->SetTarget(info1, GL_ELEMENT_ARRAY_BUFFER);
|
| + Buffer* buffer1 = manager_->GetBuffer(kClientBuffer1Id);
|
| + ASSERT_TRUE(buffer1 != NULL);
|
| + manager_->SetTarget(buffer1, GL_ELEMENT_ARRAY_BUFFER);
|
| // Check we and set its size.
|
| EXPECT_MEMORY_ALLOCATION_CHANGE(0, kBuffer1Size1, MemoryTracker::kManaged);
|
| - manager_->SetInfo(info1, kBuffer1Size1, GL_DYNAMIC_DRAW);
|
| + DoBufferData(buffer1, kBuffer1Size1, GL_DYNAMIC_DRAW, NULL, GL_NO_ERROR);
|
| EXPECT_MEMORY_ALLOCATION_CHANGE(kBuffer1Size1, 0, MemoryTracker::kManaged);
|
| EXPECT_MEMORY_ALLOCATION_CHANGE(0, kBuffer1Size2, MemoryTracker::kManaged);
|
| - manager_->SetInfo(info1, kBuffer1Size2, GL_DYNAMIC_DRAW);
|
| + DoBufferData(buffer1, kBuffer1Size2, GL_DYNAMIC_DRAW, NULL, GL_NO_ERROR);
|
| // On delete it will get freed.
|
| EXPECT_MEMORY_ALLOCATION_CHANGE(kBuffer1Size2, 0, MemoryTracker::kManaged);
|
| }
|
| @@ -124,38 +181,37 @@ TEST_F(BufferManagerTest, Destroy) {
|
| // Check we can create buffer.
|
| manager_->CreateBuffer(kClient1Id, kService1Id);
|
| // Check buffer got created.
|
| - Buffer* info1 =
|
| - manager_->GetBuffer(kClient1Id);
|
| - ASSERT_TRUE(info1 != NULL);
|
| + Buffer* buffer1 = manager_->GetBuffer(kClient1Id);
|
| + ASSERT_TRUE(buffer1 != NULL);
|
| EXPECT_CALL(*gl_, DeleteBuffersARB(1, ::testing::Pointee(kService1Id)))
|
| .Times(1)
|
| .RetiresOnSaturation();
|
| manager_->Destroy(true);
|
| // Check the resources were released.
|
| - info1 = manager_->GetBuffer(kClient1Id);
|
| - ASSERT_TRUE(info1 == NULL);
|
| + buffer1 = manager_->GetBuffer(kClient1Id);
|
| + ASSERT_TRUE(buffer1 == NULL);
|
| }
|
|
|
| -TEST_F(BufferManagerTest, SetRange) {
|
| +TEST_F(BufferManagerTest, DoBufferSubData) {
|
| const GLuint kClientBufferId = 1;
|
| const GLuint kServiceBufferId = 11;
|
| const uint8 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
|
| manager_->CreateBuffer(kClientBufferId, kServiceBufferId);
|
| - Buffer* info = manager_->GetBuffer(kClientBufferId);
|
| - ASSERT_TRUE(info != NULL);
|
| - manager_->SetTarget(info, GL_ELEMENT_ARRAY_BUFFER);
|
| - manager_->SetInfo(info, sizeof(data), GL_STATIC_DRAW);
|
| - EXPECT_TRUE(info->SetRange(0, sizeof(data), data));
|
| - EXPECT_TRUE(info->SetRange(sizeof(data), 0, data));
|
| - EXPECT_FALSE(info->SetRange(sizeof(data), 1, data));
|
| - EXPECT_FALSE(info->SetRange(0, sizeof(data) + 1, data));
|
| - EXPECT_FALSE(info->SetRange(-1, sizeof(data), data));
|
| - EXPECT_FALSE(info->SetRange(0, -1, data));
|
| - manager_->SetInfo(info, 1, GL_STATIC_DRAW);
|
| + Buffer* buffer = manager_->GetBuffer(kClientBufferId);
|
| + ASSERT_TRUE(buffer != NULL);
|
| + manager_->SetTarget(buffer, GL_ELEMENT_ARRAY_BUFFER);
|
| + DoBufferData(buffer, sizeof(data), GL_STATIC_DRAW, NULL, GL_NO_ERROR);
|
| + EXPECT_TRUE(DoBufferSubData(buffer, 0, sizeof(data), data));
|
| + EXPECT_TRUE(DoBufferSubData(buffer, sizeof(data), 0, data));
|
| + EXPECT_FALSE(DoBufferSubData(buffer, sizeof(data), 1, data));
|
| + EXPECT_FALSE(DoBufferSubData(buffer, 0, sizeof(data) + 1, data));
|
| + EXPECT_FALSE(DoBufferSubData(buffer, -1, sizeof(data), data));
|
| + EXPECT_FALSE(DoBufferSubData(buffer, 0, -1, data));
|
| + DoBufferData(buffer, 1, GL_STATIC_DRAW, NULL, GL_NO_ERROR);
|
| const int size = 0x20000;
|
| scoped_array<uint8> temp(new uint8[size]);
|
| - EXPECT_FALSE(info->SetRange(0 - size, size, temp.get()));
|
| - EXPECT_FALSE(info->SetRange(1, size / 2, temp.get()));
|
| + EXPECT_FALSE(DoBufferSubData(buffer, 0 - size, size, temp.get()));
|
| + EXPECT_FALSE(DoBufferSubData(buffer, 1, size / 2, temp.get()));
|
| }
|
|
|
| TEST_F(BufferManagerTest, GetRange) {
|
| @@ -163,23 +219,24 @@ TEST_F(BufferManagerTest, GetRange) {
|
| const GLuint kServiceBufferId = 11;
|
| const uint8 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
|
| manager_->CreateBuffer(kClientBufferId, kServiceBufferId);
|
| - Buffer* info = manager_->GetBuffer(kClientBufferId);
|
| - ASSERT_TRUE(info != NULL);
|
| - manager_->SetTarget(info, GL_ELEMENT_ARRAY_BUFFER);
|
| - manager_->SetInfo(info, sizeof(data), GL_STATIC_DRAW);
|
| - const char* buf = static_cast<const char*>(info->GetRange(0, sizeof(data)));
|
| + Buffer* buffer = manager_->GetBuffer(kClientBufferId);
|
| + ASSERT_TRUE(buffer != NULL);
|
| + manager_->SetTarget(buffer, GL_ELEMENT_ARRAY_BUFFER);
|
| + DoBufferData(buffer, sizeof(data), GL_STATIC_DRAW, NULL, GL_NO_ERROR);
|
| + const char* buf =
|
| + static_cast<const char*>(buffer->GetRange(0, sizeof(data)));
|
| ASSERT_TRUE(buf != NULL);
|
| const char* buf1 =
|
| - static_cast<const char*>(info->GetRange(1, sizeof(data) - 1));
|
| + static_cast<const char*>(buffer->GetRange(1, sizeof(data) - 1));
|
| EXPECT_EQ(buf + 1, buf1);
|
| - EXPECT_TRUE(info->GetRange(sizeof(data), 1) == NULL);
|
| - EXPECT_TRUE(info->GetRange(0, sizeof(data) + 1) == NULL);
|
| - EXPECT_TRUE(info->GetRange(-1, sizeof(data)) == NULL);
|
| - EXPECT_TRUE(info->GetRange(-0, -1) == NULL);
|
| + EXPECT_TRUE(buffer->GetRange(sizeof(data), 1) == NULL);
|
| + EXPECT_TRUE(buffer->GetRange(0, sizeof(data) + 1) == NULL);
|
| + EXPECT_TRUE(buffer->GetRange(-1, sizeof(data)) == NULL);
|
| + EXPECT_TRUE(buffer->GetRange(-0, -1) == NULL);
|
| const int size = 0x20000;
|
| - manager_->SetInfo(info, size / 2, GL_STATIC_DRAW);
|
| - EXPECT_TRUE(info->GetRange(0 - size, size) == NULL);
|
| - EXPECT_TRUE(info->GetRange(1, size / 2) == NULL);
|
| + DoBufferData(buffer, size / 2, GL_STATIC_DRAW, NULL, GL_NO_ERROR);
|
| + EXPECT_TRUE(buffer->GetRange(0 - size, size) == NULL);
|
| + EXPECT_TRUE(buffer->GetRange(1, size / 2) == NULL);
|
| }
|
|
|
| TEST_F(BufferManagerTest, GetMaxValueForRangeUint8) {
|
| @@ -188,28 +245,34 @@ TEST_F(BufferManagerTest, GetMaxValueForRangeUint8) {
|
| const uint8 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
|
| const uint8 new_data[] = {100, 120, 110};
|
| manager_->CreateBuffer(kClientBufferId, kServiceBufferId);
|
| - Buffer* info = manager_->GetBuffer(kClientBufferId);
|
| - ASSERT_TRUE(info != NULL);
|
| - manager_->SetTarget(info, GL_ELEMENT_ARRAY_BUFFER);
|
| - manager_->SetInfo(info, sizeof(data), GL_STATIC_DRAW);
|
| - EXPECT_TRUE(info->SetRange(0, sizeof(data), data));
|
| + Buffer* buffer = manager_->GetBuffer(kClientBufferId);
|
| + ASSERT_TRUE(buffer != NULL);
|
| + manager_->SetTarget(buffer, GL_ELEMENT_ARRAY_BUFFER);
|
| + DoBufferData(buffer, sizeof(data), GL_STATIC_DRAW, NULL, GL_NO_ERROR);
|
| + EXPECT_TRUE(DoBufferSubData(buffer, 0, sizeof(data), data));
|
| GLuint max_value;
|
| // Check entire range succeeds.
|
| - EXPECT_TRUE(info->GetMaxValueForRange(0, 10, GL_UNSIGNED_BYTE, &max_value));
|
| + EXPECT_TRUE(buffer->GetMaxValueForRange(
|
| + 0, 10, GL_UNSIGNED_BYTE, &max_value));
|
| EXPECT_EQ(10u, max_value);
|
| // Check sub range succeeds.
|
| - EXPECT_TRUE(info->GetMaxValueForRange(4, 3, GL_UNSIGNED_BYTE, &max_value));
|
| + EXPECT_TRUE(buffer->GetMaxValueForRange(
|
| + 4, 3, GL_UNSIGNED_BYTE, &max_value));
|
| EXPECT_EQ(6u, max_value);
|
| // Check changing sub range succeeds.
|
| - EXPECT_TRUE(info->SetRange(4, sizeof(new_data), new_data));
|
| - EXPECT_TRUE(info->GetMaxValueForRange(4, 3, GL_UNSIGNED_BYTE, &max_value));
|
| + EXPECT_TRUE(DoBufferSubData(buffer, 4, sizeof(new_data), new_data));
|
| + EXPECT_TRUE(buffer->GetMaxValueForRange(
|
| + 4, 3, GL_UNSIGNED_BYTE, &max_value));
|
| EXPECT_EQ(120u, max_value);
|
| max_value = 0;
|
| - EXPECT_TRUE(info->GetMaxValueForRange(0, 10, GL_UNSIGNED_BYTE, &max_value));
|
| + EXPECT_TRUE(buffer->GetMaxValueForRange(
|
| + 0, 10, GL_UNSIGNED_BYTE, &max_value));
|
| EXPECT_EQ(120u, max_value);
|
| // Check out of range fails.
|
| - EXPECT_FALSE(info->GetMaxValueForRange(0, 11, GL_UNSIGNED_BYTE, &max_value));
|
| - EXPECT_FALSE(info->GetMaxValueForRange(10, 1, GL_UNSIGNED_BYTE, &max_value));
|
| + EXPECT_FALSE(buffer->GetMaxValueForRange(
|
| + 0, 11, GL_UNSIGNED_BYTE, &max_value));
|
| + EXPECT_FALSE(buffer->GetMaxValueForRange(
|
| + 10, 1, GL_UNSIGNED_BYTE, &max_value));
|
| }
|
|
|
| TEST_F(BufferManagerTest, GetMaxValueForRangeUint16) {
|
| @@ -218,30 +281,37 @@ TEST_F(BufferManagerTest, GetMaxValueForRangeUint16) {
|
| const uint16 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
|
| const uint16 new_data[] = {100, 120, 110};
|
| manager_->CreateBuffer(kClientBufferId, kServiceBufferId);
|
| - Buffer* info = manager_->GetBuffer(kClientBufferId);
|
| - ASSERT_TRUE(info != NULL);
|
| - manager_->SetTarget(info, GL_ELEMENT_ARRAY_BUFFER);
|
| - manager_->SetInfo(info, sizeof(data), GL_STATIC_DRAW);
|
| - EXPECT_TRUE(info->SetRange(0, sizeof(data), data));
|
| + Buffer* buffer = manager_->GetBuffer(kClientBufferId);
|
| + ASSERT_TRUE(buffer != NULL);
|
| + manager_->SetTarget(buffer, GL_ELEMENT_ARRAY_BUFFER);
|
| + DoBufferData(buffer, sizeof(data), GL_STATIC_DRAW, NULL, GL_NO_ERROR);
|
| + EXPECT_TRUE(DoBufferSubData(buffer, 0, sizeof(data), data));
|
| GLuint max_value;
|
| // Check entire range succeeds.
|
| - EXPECT_TRUE(info->GetMaxValueForRange(0, 10, GL_UNSIGNED_SHORT, &max_value));
|
| + EXPECT_TRUE(buffer->GetMaxValueForRange(
|
| + 0, 10, GL_UNSIGNED_SHORT, &max_value));
|
| EXPECT_EQ(10u, max_value);
|
| // Check odd offset fails for GL_UNSIGNED_SHORT.
|
| - EXPECT_FALSE(info->GetMaxValueForRange(1, 10, GL_UNSIGNED_SHORT, &max_value));
|
| + EXPECT_FALSE(buffer->GetMaxValueForRange(
|
| + 1, 10, GL_UNSIGNED_SHORT, &max_value));
|
| // Check sub range succeeds.
|
| - EXPECT_TRUE(info->GetMaxValueForRange(8, 3, GL_UNSIGNED_SHORT, &max_value));
|
| + EXPECT_TRUE(buffer->GetMaxValueForRange(
|
| + 8, 3, GL_UNSIGNED_SHORT, &max_value));
|
| EXPECT_EQ(6u, max_value);
|
| // Check changing sub range succeeds.
|
| - EXPECT_TRUE(info->SetRange(8, sizeof(new_data), new_data));
|
| - EXPECT_TRUE(info->GetMaxValueForRange(8, 3, GL_UNSIGNED_SHORT, &max_value));
|
| + EXPECT_TRUE(DoBufferSubData(buffer, 8, sizeof(new_data), new_data));
|
| + EXPECT_TRUE(buffer->GetMaxValueForRange(
|
| + 8, 3, GL_UNSIGNED_SHORT, &max_value));
|
| EXPECT_EQ(120u, max_value);
|
| max_value = 0;
|
| - EXPECT_TRUE(info->GetMaxValueForRange(0, 10, GL_UNSIGNED_SHORT, &max_value));
|
| + EXPECT_TRUE(buffer->GetMaxValueForRange(
|
| + 0, 10, GL_UNSIGNED_SHORT, &max_value));
|
| EXPECT_EQ(120u, max_value);
|
| // Check out of range fails.
|
| - EXPECT_FALSE(info->GetMaxValueForRange(0, 11, GL_UNSIGNED_SHORT, &max_value));
|
| - EXPECT_FALSE(info->GetMaxValueForRange(20, 1, GL_UNSIGNED_SHORT, &max_value));
|
| + EXPECT_FALSE(buffer->GetMaxValueForRange(
|
| + 0, 11, GL_UNSIGNED_SHORT, &max_value));
|
| + EXPECT_FALSE(buffer->GetMaxValueForRange(
|
| + 20, 1, GL_UNSIGNED_SHORT, &max_value));
|
| }
|
|
|
| TEST_F(BufferManagerTest, GetMaxValueForRangeUint32) {
|
| @@ -250,32 +320,38 @@ TEST_F(BufferManagerTest, GetMaxValueForRangeUint32) {
|
| const uint32 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
|
| const uint32 new_data[] = {100, 120, 110};
|
| manager_->CreateBuffer(kClientBufferId, kServiceBufferId);
|
| - Buffer* info = manager_->GetBuffer(kClientBufferId);
|
| - ASSERT_TRUE(info != NULL);
|
| - manager_->SetTarget(info, GL_ELEMENT_ARRAY_BUFFER);
|
| - manager_->SetInfo(info, sizeof(data), GL_STATIC_DRAW);
|
| - EXPECT_TRUE(info->SetRange(0, sizeof(data), data));
|
| + Buffer* buffer = manager_->GetBuffer(kClientBufferId);
|
| + ASSERT_TRUE(buffer != NULL);
|
| + manager_->SetTarget(buffer, GL_ELEMENT_ARRAY_BUFFER);
|
| + DoBufferData(buffer, sizeof(data), GL_STATIC_DRAW, NULL, GL_NO_ERROR);
|
| + EXPECT_TRUE(DoBufferSubData(buffer, 0, sizeof(data), data));
|
| GLuint max_value;
|
| // Check entire range succeeds.
|
| - EXPECT_TRUE(info->GetMaxValueForRange(0, 10, GL_UNSIGNED_INT, &max_value));
|
| + EXPECT_TRUE(
|
| + buffer->GetMaxValueForRange(0, 10, GL_UNSIGNED_INT, &max_value));
|
| EXPECT_EQ(10u, max_value);
|
| // Check non aligned offsets fails for GL_UNSIGNED_INT.
|
| - EXPECT_FALSE(info->GetMaxValueForRange(1, 10, GL_UNSIGNED_INT, &max_value));
|
| - EXPECT_FALSE(info->GetMaxValueForRange(2, 10, GL_UNSIGNED_INT, &max_value));
|
| - EXPECT_FALSE(info->GetMaxValueForRange(3, 10, GL_UNSIGNED_INT, &max_value));
|
| + EXPECT_FALSE(
|
| + buffer->GetMaxValueForRange(1, 10, GL_UNSIGNED_INT, &max_value));
|
| + EXPECT_FALSE(
|
| + buffer->GetMaxValueForRange(2, 10, GL_UNSIGNED_INT, &max_value));
|
| + EXPECT_FALSE(
|
| + buffer->GetMaxValueForRange(3, 10, GL_UNSIGNED_INT, &max_value));
|
| // Check sub range succeeds.
|
| - EXPECT_TRUE(info->GetMaxValueForRange(16, 3, GL_UNSIGNED_INT, &max_value));
|
| + EXPECT_TRUE(buffer->GetMaxValueForRange(16, 3, GL_UNSIGNED_INT, &max_value));
|
| EXPECT_EQ(6u, max_value);
|
| // Check changing sub range succeeds.
|
| - EXPECT_TRUE(info->SetRange(16, sizeof(new_data), new_data));
|
| - EXPECT_TRUE(info->GetMaxValueForRange(16, 3, GL_UNSIGNED_INT, &max_value));
|
| + EXPECT_TRUE(DoBufferSubData(buffer, 16, sizeof(new_data), new_data));
|
| + EXPECT_TRUE(buffer->GetMaxValueForRange(16, 3, GL_UNSIGNED_INT, &max_value));
|
| EXPECT_EQ(120u, max_value);
|
| max_value = 0;
|
| - EXPECT_TRUE(info->GetMaxValueForRange(0, 10, GL_UNSIGNED_INT, &max_value));
|
| + EXPECT_TRUE(buffer->GetMaxValueForRange(0, 10, GL_UNSIGNED_INT, &max_value));
|
| EXPECT_EQ(120u, max_value);
|
| // Check out of range fails.
|
| - EXPECT_FALSE(info->GetMaxValueForRange(0, 11, GL_UNSIGNED_INT, &max_value));
|
| - EXPECT_FALSE(info->GetMaxValueForRange(40, 1, GL_UNSIGNED_INT, &max_value));
|
| + EXPECT_FALSE(
|
| + buffer->GetMaxValueForRange(0, 11, GL_UNSIGNED_INT, &max_value));
|
| + EXPECT_FALSE(
|
| + buffer->GetMaxValueForRange(40, 1, GL_UNSIGNED_INT, &max_value));
|
| }
|
|
|
| TEST_F(BufferManagerTest, UseDeletedBuffer) {
|
| @@ -283,19 +359,34 @@ TEST_F(BufferManagerTest, UseDeletedBuffer) {
|
| const GLuint kServiceBufferId = 11;
|
| const uint32 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
|
| manager_->CreateBuffer(kClientBufferId, kServiceBufferId);
|
| - scoped_refptr<Buffer> info =
|
| - manager_->GetBuffer(kClientBufferId);
|
| - ASSERT_TRUE(info != NULL);
|
| - manager_->SetTarget(info, GL_ARRAY_BUFFER);
|
| + scoped_refptr<Buffer> buffer = manager_->GetBuffer(kClientBufferId);
|
| + ASSERT_TRUE(buffer != NULL);
|
| + manager_->SetTarget(buffer, GL_ARRAY_BUFFER);
|
| // Remove buffer
|
| manager_->RemoveBuffer(kClientBufferId);
|
| // Use it after removing
|
| - manager_->SetInfo(info, sizeof(data), GL_STATIC_DRAW);
|
| + DoBufferData(buffer, sizeof(data), GL_STATIC_DRAW, NULL, GL_NO_ERROR);
|
| // Check that it gets deleted when the last reference is released.
|
| EXPECT_CALL(*gl_, DeleteBuffersARB(1, ::testing::Pointee(kServiceBufferId)))
|
| .Times(1)
|
| .RetiresOnSaturation();
|
| - info = NULL;
|
| + buffer = NULL;
|
| +}
|
| +
|
| +// Test buffers get shadowed when they are supposed to be.
|
| +TEST_F(BufferManagerClientSideArraysTest, StreamBuffersAreShadowed) {
|
| + const GLuint kClientBufferId = 1;
|
| + const GLuint kServiceBufferId = 11;
|
| + static const uint32 data[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
|
| + manager_->CreateBuffer(kClientBufferId, kServiceBufferId);
|
| + Buffer* buffer = manager_->GetBuffer(kClientBufferId);
|
| + ASSERT_TRUE(buffer != NULL);
|
| + manager_->SetTarget(buffer, GL_ARRAY_BUFFER);
|
| + DoBufferData(buffer, sizeof(data), GL_STREAM_DRAW, data, GL_NO_ERROR);
|
| + EXPECT_TRUE(buffer->IsClientSideArray());
|
| + EXPECT_EQ(0, memcmp(data, buffer->GetRange(0, sizeof(data)), sizeof(data)));
|
| + DoBufferData(buffer, sizeof(data), GL_DYNAMIC_DRAW, data, GL_NO_ERROR);
|
| + EXPECT_FALSE(buffer->IsClientSideArray());
|
| }
|
|
|
| } // namespace gles2
|
|
|