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
3 // found in the LICENSE file.
4
5 // Tests for the BufferTracker.
6
7 #include "gpu/command_buffer/client/buffer_tracker.h"
8
9 #include <GLES2/gl2ext.h>
10 #include "base/memory/scoped_ptr.h"
11 #include "gpu/command_buffer/client/client_test_helper.h"
12 #include "gpu/command_buffer/client/gles2_cmd_helper.h"
13 #include "gpu/command_buffer/client/mapped_memory.h"
14 #include "gpu/command_buffer/common/command_buffer.h"
15 #include "testing/gmock/include/gmock/gmock.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17
18 namespace gpu {
19 namespace gles2 {
20
21 class MockClientCommandBufferImpl : public MockClientCommandBuffer {
22 public:
MockClientCommandBufferImpl()23 MockClientCommandBufferImpl()
24 : MockClientCommandBuffer(),
25 context_lost_(false) {}
~MockClientCommandBufferImpl()26 virtual ~MockClientCommandBufferImpl() {}
27
CreateTransferBuffer(size_t size,int32 * id)28 virtual scoped_refptr<gpu::Buffer> CreateTransferBuffer(size_t size,
29 int32* id) OVERRIDE {
30 if (context_lost_) {
31 *id = -1;
32 return NULL;
33 }
34 return MockClientCommandBuffer::CreateTransferBuffer(size, id);
35 }
36
set_context_lost(bool context_lost)37 void set_context_lost(bool context_lost) {
38 context_lost_ = context_lost;
39 }
40
41 private:
42 bool context_lost_;
43 };
44
45 namespace {
EmptyPoll()46 void EmptyPoll() {
47 }
48 }
49
50 class BufferTrackerTest : public testing::Test {
51 protected:
52 static const int32 kNumCommandEntries = 400;
53 static const int32 kCommandBufferSizeBytes =
54 kNumCommandEntries * sizeof(CommandBufferEntry);
55
SetUp()56 virtual void SetUp() {
57 command_buffer_.reset(new MockClientCommandBufferImpl());
58 helper_.reset(new GLES2CmdHelper(command_buffer_.get()));
59 helper_->Initialize(kCommandBufferSizeBytes);
60 mapped_memory_.reset(new MappedMemoryManager(
61 helper_.get(), base::Bind(&EmptyPoll), MappedMemoryManager::kNoLimit));
62 buffer_tracker_.reset(new BufferTracker(mapped_memory_.get()));
63 }
64
TearDown()65 virtual void TearDown() {
66 buffer_tracker_.reset();
67 mapped_memory_.reset();
68 helper_.reset();
69 command_buffer_.reset();
70 }
71
72 scoped_ptr<MockClientCommandBufferImpl> command_buffer_;
73 scoped_ptr<GLES2CmdHelper> helper_;
74 scoped_ptr<MappedMemoryManager> mapped_memory_;
75 scoped_ptr<BufferTracker> buffer_tracker_;
76 };
77
TEST_F(BufferTrackerTest,Basic)78 TEST_F(BufferTrackerTest, Basic) {
79 const GLuint kId1 = 123;
80 const GLuint kId2 = 124;
81 const GLsizeiptr size = 64;
82
83 // Check we can create a Buffer.
84 BufferTracker::Buffer* buffer = buffer_tracker_->CreateBuffer(kId1, size);
85 ASSERT_TRUE(buffer != NULL);
86 // Check we can get the same Buffer.
87 EXPECT_EQ(buffer, buffer_tracker_->GetBuffer(kId1));
88 // Check mapped memory address.
89 EXPECT_TRUE(buffer->address() != NULL);
90 // Check shared memory was allocated.
91 EXPECT_EQ(1lu, mapped_memory_->num_chunks());
92 // Check we get nothing for a non-existent buffer.
93 EXPECT_TRUE(buffer_tracker_->GetBuffer(kId2) == NULL);
94 // Check we can delete the buffer.
95 buffer_tracker_->RemoveBuffer(kId1);
96 // Check shared memory was freed.
97 mapped_memory_->FreeUnused();
98 EXPECT_EQ(0lu, mapped_memory_->num_chunks());
99 // Check we get nothing for a non-existent buffer.
100 EXPECT_TRUE(buffer_tracker_->GetBuffer(kId1) == NULL);
101 }
102
TEST_F(BufferTrackerTest,ZeroSize)103 TEST_F(BufferTrackerTest, ZeroSize) {
104 const GLuint kId = 123;
105
106 // Check we can create a Buffer with zero size.
107 BufferTracker::Buffer* buffer = buffer_tracker_->CreateBuffer(kId, 0);
108 ASSERT_TRUE(buffer != NULL);
109 // Check mapped memory address.
110 EXPECT_TRUE(buffer->address() == NULL);
111 // Check no shared memory was allocated.
112 EXPECT_EQ(0lu, mapped_memory_->num_chunks());
113 // Check we can delete the buffer.
114 buffer_tracker_->RemoveBuffer(kId);
115 }
116
TEST_F(BufferTrackerTest,LostContext)117 TEST_F(BufferTrackerTest, LostContext) {
118 const GLuint kId = 123;
119 const GLsizeiptr size = 64;
120
121 command_buffer_->set_context_lost(true);
122 // Check we can create a Buffer when after losing context.
123 BufferTracker::Buffer* buffer = buffer_tracker_->CreateBuffer(kId, size);
124 ASSERT_TRUE(buffer != NULL);
125 // Check mapped memory address.
126 EXPECT_EQ(64u, buffer->size());
127 // Check mapped memory address.
128 EXPECT_TRUE(buffer->address() == NULL);
129 // Check no shared memory was allocated.
130 EXPECT_EQ(0lu, mapped_memory_->num_chunks());
131 // Check we can delete the buffer.
132 buffer_tracker_->RemoveBuffer(kId);
133 }
134
TEST_F(BufferTrackerTest,Unmanage)135 TEST_F(BufferTrackerTest, Unmanage) {
136 const GLuint kId = 123;
137 const GLsizeiptr size = 64;
138
139 BufferTracker::Buffer* buffer = buffer_tracker_->CreateBuffer(kId, size);
140 ASSERT_TRUE(buffer != NULL);
141 EXPECT_EQ(mapped_memory_->bytes_in_use(), static_cast<size_t>(size));
142
143 void* mem = buffer->address();
144 buffer_tracker_->Unmanage(buffer);
145 buffer_tracker_->RemoveBuffer(kId);
146 EXPECT_EQ(mapped_memory_->bytes_in_use(), static_cast<size_t>(size));
147
148 mapped_memory_->Free(mem);
149 EXPECT_EQ(mapped_memory_->bytes_in_use(), static_cast<size_t>(0));
150 }
151
152 } // namespace gles2
153 } // namespace gpu
154