// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Tests for the BufferTracker. #include "gpu/command_buffer/client/buffer_tracker.h" #include #include #include #include #include #include "gpu/command_buffer/client/client_test_helper.h" #include "gpu/command_buffer/client/gles2_cmd_helper.h" #include "gpu/command_buffer/client/mapped_memory.h" #include "gpu/command_buffer/common/command_buffer.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" namespace gpu { namespace gles2 { class MockClientCommandBufferImpl : public MockClientCommandBuffer { public: MockClientCommandBufferImpl() : MockClientCommandBuffer(), context_lost_(false) {} ~MockClientCommandBufferImpl() override = default; scoped_refptr CreateTransferBuffer(uint32_t size, int32_t* id) override { if (context_lost_) { *id = -1; return nullptr; } return MockClientCommandBuffer::CreateTransferBuffer(size, id); } void set_context_lost(bool context_lost) { context_lost_ = context_lost; } private: bool context_lost_; }; class BufferTrackerTest : public testing::Test { protected: static const int32_t kNumCommandEntries = 400; static const int32_t kCommandBufferSizeBytes = kNumCommandEntries * sizeof(CommandBufferEntry); void SetUp() override { command_buffer_.reset(new MockClientCommandBufferImpl()); helper_.reset(new GLES2CmdHelper(command_buffer_.get())); helper_->Initialize(kCommandBufferSizeBytes); mapped_memory_.reset( new MappedMemoryManager(helper_.get(), MappedMemoryManager::kNoLimit)); buffer_tracker_.reset(new BufferTracker(mapped_memory_.get())); } void TearDown() override { buffer_tracker_.reset(); mapped_memory_.reset(); helper_.reset(); command_buffer_.reset(); } std::unique_ptr command_buffer_; std::unique_ptr helper_; std::unique_ptr mapped_memory_; std::unique_ptr buffer_tracker_; }; TEST_F(BufferTrackerTest, Basic) { const GLuint kId1 = 123; const GLuint kId2 = 124; const GLsizeiptr size = 64; // Check we can create a Buffer. BufferTracker::Buffer* buffer = buffer_tracker_->CreateBuffer(kId1, size); ASSERT_TRUE(buffer != nullptr); // Check we can get the same Buffer. EXPECT_EQ(buffer, buffer_tracker_->GetBuffer(kId1)); // Check mapped memory address. EXPECT_TRUE(buffer->address() != nullptr); // Check shared memory was allocated. EXPECT_EQ(1lu, mapped_memory_->num_chunks()); // Check we get nothing for a non-existent buffer. EXPECT_TRUE(buffer_tracker_->GetBuffer(kId2) == nullptr); // Check we can delete the buffer. buffer_tracker_->RemoveBuffer(kId1); // Check shared memory was freed. mapped_memory_->FreeUnused(); EXPECT_EQ(0lu, mapped_memory_->num_chunks()); // Check we get nothing for a non-existent buffer. EXPECT_TRUE(buffer_tracker_->GetBuffer(kId1) == nullptr); } TEST_F(BufferTrackerTest, ZeroSize) { const GLuint kId = 123; // Check we can create a Buffer with zero size. BufferTracker::Buffer* buffer = buffer_tracker_->CreateBuffer(kId, 0); ASSERT_TRUE(buffer != nullptr); // Check mapped memory address. EXPECT_TRUE(buffer->address() == nullptr); // Check no shared memory was allocated. EXPECT_EQ(0lu, mapped_memory_->num_chunks()); // Check we can delete the buffer. buffer_tracker_->RemoveBuffer(kId); } TEST_F(BufferTrackerTest, LostContext) { const GLuint kId = 123; const GLsizeiptr size = 64; command_buffer_->set_context_lost(true); // Check we can create a Buffer when after losing context. BufferTracker::Buffer* buffer = buffer_tracker_->CreateBuffer(kId, size); ASSERT_TRUE(buffer != nullptr); // Check mapped memory address. EXPECT_EQ(64u, buffer->size()); // Check mapped memory address. EXPECT_TRUE(buffer->address() == nullptr); // Check no shared memory was allocated. EXPECT_EQ(0lu, mapped_memory_->num_chunks()); // Check we can delete the buffer. buffer_tracker_->RemoveBuffer(kId); } TEST_F(BufferTrackerTest, Unmanage) { const GLuint kId = 123; const GLsizeiptr size = 64; BufferTracker::Buffer* buffer = buffer_tracker_->CreateBuffer(kId, size); ASSERT_TRUE(buffer != nullptr); EXPECT_EQ(mapped_memory_->bytes_in_use(), static_cast(size)); void* mem = buffer->address(); buffer_tracker_->Unmanage(buffer); buffer_tracker_->RemoveBuffer(kId); EXPECT_EQ(mapped_memory_->bytes_in_use(), static_cast(size)); mapped_memory_->Free(mem); EXPECT_EQ(mapped_memory_->bytes_in_use(), static_cast(0)); } } // namespace gles2 } // namespace gpu