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 Buffer CreateTransferBuffer(size_t size, int32* id) OVERRIDE {
29 if (context_lost_) {
30 *id = -1;
31 return gpu::Buffer();
32 }
33 return MockClientCommandBuffer::CreateTransferBuffer(size, id);
34 }
35
set_context_lost(bool context_lost)36 void set_context_lost(bool context_lost) {
37 context_lost_ = context_lost;
38 }
39
40 private:
41 bool context_lost_;
42 };
43
44 class BufferTrackerTest : public testing::Test {
45 protected:
46 static const int32 kNumCommandEntries = 400;
47 static const int32 kCommandBufferSizeBytes =
48 kNumCommandEntries * sizeof(CommandBufferEntry);
49
SetUp()50 virtual void SetUp() {
51 command_buffer_.reset(new MockClientCommandBufferImpl());
52 helper_.reset(new GLES2CmdHelper(command_buffer_.get()));
53 helper_->Initialize(kCommandBufferSizeBytes);
54 mapped_memory_.reset(new MappedMemoryManager(
55 helper_.get(), MappedMemoryManager::kNoLimit));
56 buffer_tracker_.reset(new BufferTracker(mapped_memory_.get()));
57 }
58
TearDown()59 virtual void TearDown() {
60 buffer_tracker_.reset();
61 mapped_memory_.reset();
62 helper_.reset();
63 command_buffer_.reset();
64 }
65
66 scoped_ptr<MockClientCommandBufferImpl> command_buffer_;
67 scoped_ptr<GLES2CmdHelper> helper_;
68 scoped_ptr<MappedMemoryManager> mapped_memory_;
69 scoped_ptr<BufferTracker> buffer_tracker_;
70 };
71
TEST_F(BufferTrackerTest,Basic)72 TEST_F(BufferTrackerTest, Basic) {
73 const GLuint kId1 = 123;
74 const GLuint kId2 = 124;
75 const GLsizeiptr size = 64;
76
77 // Check we can create a Buffer.
78 BufferTracker::Buffer* buffer = buffer_tracker_->CreateBuffer(kId1, size);
79 ASSERT_TRUE(buffer != NULL);
80 // Check we can get the same Buffer.
81 EXPECT_EQ(buffer, buffer_tracker_->GetBuffer(kId1));
82 // Check mapped memory address.
83 EXPECT_TRUE(buffer->address() != NULL);
84 // Check shared memory was allocated.
85 EXPECT_EQ(1lu, mapped_memory_->num_chunks());
86 // Check we get nothing for a non-existent buffer.
87 EXPECT_TRUE(buffer_tracker_->GetBuffer(kId2) == NULL);
88 // Check we can delete the buffer.
89 buffer_tracker_->RemoveBuffer(kId1);
90 // Check shared memory was freed.
91 mapped_memory_->FreeUnused();
92 EXPECT_EQ(0lu, mapped_memory_->num_chunks());
93 // Check we get nothing for a non-existent buffer.
94 EXPECT_TRUE(buffer_tracker_->GetBuffer(kId1) == NULL);
95 }
96
TEST_F(BufferTrackerTest,ZeroSize)97 TEST_F(BufferTrackerTest, ZeroSize) {
98 const GLuint kId = 123;
99
100 // Check we can create a Buffer with zero size.
101 BufferTracker::Buffer* buffer = buffer_tracker_->CreateBuffer(kId, 0);
102 ASSERT_TRUE(buffer != NULL);
103 // Check mapped memory address.
104 EXPECT_TRUE(buffer->address() == NULL);
105 // Check no shared memory was allocated.
106 EXPECT_EQ(0lu, mapped_memory_->num_chunks());
107 // Check we can delete the buffer.
108 buffer_tracker_->RemoveBuffer(kId);
109 }
110
TEST_F(BufferTrackerTest,LostContext)111 TEST_F(BufferTrackerTest, LostContext) {
112 const GLuint kId = 123;
113 const GLsizeiptr size = 64;
114
115 command_buffer_->set_context_lost(true);
116 // Check we can create a Buffer when after losing context.
117 BufferTracker::Buffer* buffer = buffer_tracker_->CreateBuffer(kId, size);
118 ASSERT_TRUE(buffer != NULL);
119 // Check mapped memory address.
120 EXPECT_EQ(64u, buffer->size());
121 // Check mapped memory address.
122 EXPECT_TRUE(buffer->address() == NULL);
123 // Check no shared memory was allocated.
124 EXPECT_EQ(0lu, mapped_memory_->num_chunks());
125 // Check we can delete the buffer.
126 buffer_tracker_->RemoveBuffer(kId);
127 }
128
129 } // namespace gles2
130 } // namespace gpu
131