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 Buffer
CreateTransferBuffer(size_t size
, int32
* id
) OVERRIDE
{
33 return MockClientCommandBuffer::CreateTransferBuffer(size
, id
);
36 void set_context_lost(bool context_lost
) {
37 context_lost_
= context_lost
;
44 class BufferTrackerTest
: public testing::Test
{
46 static const int32 kNumCommandEntries
= 400;
47 static const int32 kCommandBufferSizeBytes
=
48 kNumCommandEntries
* sizeof(CommandBufferEntry
);
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()));
59 virtual void TearDown() {
60 buffer_tracker_
.reset();
61 mapped_memory_
.reset();
63 command_buffer_
.reset();
66 scoped_ptr
<MockClientCommandBufferImpl
> command_buffer_
;
67 scoped_ptr
<GLES2CmdHelper
> helper_
;
68 scoped_ptr
<MappedMemoryManager
> mapped_memory_
;
69 scoped_ptr
<BufferTracker
> buffer_tracker_
;
72 TEST_F(BufferTrackerTest
, Basic
) {
73 const GLuint kId1
= 123;
74 const GLuint kId2
= 124;
75 const GLsizeiptr size
= 64;
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
);
97 TEST_F(BufferTrackerTest
, ZeroSize
) {
98 const GLuint kId
= 123;
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
);
111 TEST_F(BufferTrackerTest
, LostContext
) {
112 const GLuint kId
= 123;
113 const GLsizeiptr size
= 64;
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
);