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.
5 // Tests for the BufferTracker.
7 #include "gpu/command_buffer/client/buffer_tracker.h"
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"
21 class MockClientCommandBufferImpl : public MockClientCommandBuffer {
23 MockClientCommandBufferImpl()
24 : MockClientCommandBuffer(),
25 context_lost_(false) {}
26 virtual ~MockClientCommandBufferImpl() {}
28 virtual scoped_refptr<gpu::Buffer> CreateTransferBuffer(size_t size,
34 return MockClientCommandBuffer::CreateTransferBuffer(size, id);
37 void set_context_lost(bool context_lost) {
38 context_lost_ = context_lost;
45 class BufferTrackerTest : public testing::Test {
47 static const int32 kNumCommandEntries = 400;
48 static const int32 kCommandBufferSizeBytes =
49 kNumCommandEntries * sizeof(CommandBufferEntry);
51 virtual void SetUp() {
52 command_buffer_.reset(new MockClientCommandBufferImpl());
53 helper_.reset(new GLES2CmdHelper(command_buffer_.get()));
54 helper_->Initialize(kCommandBufferSizeBytes);
55 mapped_memory_.reset(new MappedMemoryManager(
56 helper_.get(), MappedMemoryManager::kNoLimit));
57 buffer_tracker_.reset(new BufferTracker(mapped_memory_.get()));
60 virtual void TearDown() {
61 buffer_tracker_.reset();
62 mapped_memory_.reset();
64 command_buffer_.reset();
67 scoped_ptr<MockClientCommandBufferImpl> command_buffer_;
68 scoped_ptr<GLES2CmdHelper> helper_;
69 scoped_ptr<MappedMemoryManager> mapped_memory_;
70 scoped_ptr<BufferTracker> buffer_tracker_;
73 TEST_F(BufferTrackerTest, Basic) {
74 const GLuint kId1 = 123;
75 const GLuint kId2 = 124;
76 const GLsizeiptr size = 64;
78 // Check we can create a Buffer.
79 BufferTracker::Buffer* buffer = buffer_tracker_->CreateBuffer(kId1, size);
80 ASSERT_TRUE(buffer != NULL);
81 // Check we can get the same Buffer.
82 EXPECT_EQ(buffer, buffer_tracker_->GetBuffer(kId1));
83 // Check mapped memory address.
84 EXPECT_TRUE(buffer->address() != NULL);
85 // Check shared memory was allocated.
86 EXPECT_EQ(1lu, mapped_memory_->num_chunks());
87 // Check we get nothing for a non-existent buffer.
88 EXPECT_TRUE(buffer_tracker_->GetBuffer(kId2) == NULL);
89 // Check we can delete the buffer.
90 buffer_tracker_->RemoveBuffer(kId1);
91 // Check shared memory was freed.
92 mapped_memory_->FreeUnused();
93 EXPECT_EQ(0lu, mapped_memory_->num_chunks());
94 // Check we get nothing for a non-existent buffer.
95 EXPECT_TRUE(buffer_tracker_->GetBuffer(kId1) == NULL);
98 TEST_F(BufferTrackerTest, ZeroSize) {
99 const GLuint kId = 123;
101 // Check we can create a Buffer with zero size.
102 BufferTracker::Buffer* buffer = buffer_tracker_->CreateBuffer(kId, 0);
103 ASSERT_TRUE(buffer != NULL);
104 // Check mapped memory address.
105 EXPECT_TRUE(buffer->address() == NULL);
106 // Check no shared memory was allocated.
107 EXPECT_EQ(0lu, mapped_memory_->num_chunks());
108 // Check we can delete the buffer.
109 buffer_tracker_->RemoveBuffer(kId);
112 TEST_F(BufferTrackerTest, LostContext) {
113 const GLuint kId = 123;
114 const GLsizeiptr size = 64;
116 command_buffer_->set_context_lost(true);
117 // Check we can create a Buffer when after losing context.
118 BufferTracker::Buffer* buffer = buffer_tracker_->CreateBuffer(kId, size);
119 ASSERT_TRUE(buffer != NULL);
120 // Check mapped memory address.
121 EXPECT_EQ(64u, buffer->size());
122 // Check mapped memory address.
123 EXPECT_TRUE(buffer->address() == NULL);
124 // Check no shared memory was allocated.
125 EXPECT_EQ(0lu, mapped_memory_->num_chunks());
126 // Check we can delete the buffer.
127 buffer_tracker_->RemoveBuffer(kId);