Chromium Code Reviews| Index: content/common/gpu/gpu_memory_manager_unittest.cc |
| diff --git a/content/common/gpu/gpu_memory_manager_unittest.cc b/content/common/gpu/gpu_memory_manager_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..539593796df34953e0cd29af46890fb602ed55b2 |
| --- /dev/null |
| +++ b/content/common/gpu/gpu_memory_manager_unittest.cc |
| @@ -0,0 +1,268 @@ |
| +// Copyright (c) 2011 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. |
| + |
| +#include "content/common/gpu/gpu_command_buffer_stub.h" |
| +#include "content/common/gpu/gpu_memory_allocation.h" |
| +#include "content/common/gpu/gpu_memory_manager.h" |
| + |
| +#include "testing/gtest/include/gtest/gtest.h" |
| + |
| +class FakeCommandBufferStub : public GpuCommandBufferStubBase { |
| + public: |
| + SurfaceState surface_state_; |
| + std::vector<int32> affected_surface_ids_; |
| + GpuMemoryAllocation allocation_; |
| + |
| + FakeCommandBufferStub() |
| + : surface_state_(0, false, base::TimeTicks()) { |
| + } |
| + |
| + FakeCommandBufferStub(int32 surface_id, |
| + bool visible, |
| + base::TimeTicks last_used_time) |
| + : surface_state_(surface_id, visible, last_used_time) { |
| + } |
| + |
| + virtual SurfaceState* surface_state() { |
| + return (surface_state_.surface_id != 0) ? &surface_state_ : NULL; |
| + } |
| + virtual const std::vector<int32>& affected_surface_ids() { |
| + return affected_surface_ids_; |
| + } |
| + virtual void SendMemoryAllocationToProxy(const GpuMemoryAllocation& alloc) { |
| + allocation_ = alloc; |
| + } |
| +}; |
| + |
| +class FakeClient : public GpuMemoryManagerClient { |
| + public: |
| + std::vector<GpuCommandBufferStubBase*> stubs_; |
| + |
| + virtual void AppendAllCommandBufferStubs( |
| + std::vector<GpuCommandBufferStubBase*>& stubs) { |
| + stubs.insert(stubs.end(), stubs_.begin(), stubs_.end()); |
| + } |
| +}; |
| + |
| +class GpuMemoryManagerTest : public testing::Test { |
| + protected: |
| + GpuMemoryManagerTest() |
| + : memory_manager_(&client_) { |
| + } |
| + |
| + virtual void SetUp() { |
| + first_ = base::TimeTicks::FromInternalValue(1); |
|
nduca
2012/02/01 00:01:17
first_, second_, third_ need better names.
|
| + second_ = base::TimeTicks::FromInternalValue(2); |
| + third_ = base::TimeTicks::FromInternalValue(3); |
| + |
| + memory_manager_.SetMaxSurfacesWithFrontbufferSoftLimit(3); |
| + } |
| + |
| + static int32 GenerateUniqueSurfaceId() { |
| + static int32 surface_id_ = 1; |
| + return surface_id_++; |
| + } |
| + |
| + void Manage() { |
| + memory_manager_.Manage(); |
| + } |
| + |
| + base::TimeTicks first_, second_, third_; |
| + FakeClient client_; |
| + GpuMemoryManager memory_manager_; |
| +}; |
| + |
| + |
| +// Create fake stubs with every combination of {visibilty,last_use_time} |
| +// and make sure they compare correctly. Only compare stubs with surfaces. |
| +// Expect {more visible, newer} surfaces to be more important, in that order. |
| +TEST_F(GpuMemoryManagerTest, ComparatorTests) { |
| + FakeCommandBufferStub stub_true1(GenerateUniqueSurfaceId(), true, first_), |
| + stub_true2(GenerateUniqueSurfaceId(), true, second_), |
| + stub_true3(GenerateUniqueSurfaceId(), true, third_), |
| + stub_false1(GenerateUniqueSurfaceId(), false, first_), |
| + stub_false2(GenerateUniqueSurfaceId(), false, second_), |
| + stub_false3(GenerateUniqueSurfaceId(), false, third_); |
| + |
| + GpuMemoryManager::StubWithSurfaceComparator is_more_important; |
| + |
| + // Should never be more important than self: |
| + EXPECT_FALSE(is_more_important(&stub_true1,&stub_true1)); |
| + EXPECT_FALSE(is_more_important(&stub_true2,&stub_true2)); |
| + EXPECT_FALSE(is_more_important(&stub_true3,&stub_true3)); |
| + EXPECT_FALSE(is_more_important(&stub_false1,&stub_false1)); |
| + EXPECT_FALSE(is_more_important(&stub_false2,&stub_false2)); |
| + EXPECT_FALSE(is_more_important(&stub_false3,&stub_false3)); |
| + |
| + // Visible should always be more important than non visible: |
| + EXPECT_TRUE(is_more_important(&stub_true1,&stub_false1)); |
| + EXPECT_TRUE(is_more_important(&stub_true1,&stub_false2)); |
| + EXPECT_TRUE(is_more_important(&stub_true1,&stub_false3)); |
| + EXPECT_TRUE(is_more_important(&stub_true2,&stub_false1)); |
| + EXPECT_TRUE(is_more_important(&stub_true2,&stub_false2)); |
| + EXPECT_TRUE(is_more_important(&stub_true2,&stub_false3)); |
| + EXPECT_TRUE(is_more_important(&stub_true3,&stub_false1)); |
| + EXPECT_TRUE(is_more_important(&stub_true3,&stub_false2)); |
| + EXPECT_TRUE(is_more_important(&stub_true3,&stub_false3)); |
| + |
| + // Not visible should never be more important than visible: |
| + EXPECT_FALSE(is_more_important(&stub_false1,&stub_true1)); |
| + EXPECT_FALSE(is_more_important(&stub_false1,&stub_true2)); |
| + EXPECT_FALSE(is_more_important(&stub_false1,&stub_true3)); |
| + EXPECT_FALSE(is_more_important(&stub_false2,&stub_true1)); |
| + EXPECT_FALSE(is_more_important(&stub_false2,&stub_true2)); |
| + EXPECT_FALSE(is_more_important(&stub_false2,&stub_true3)); |
| + EXPECT_FALSE(is_more_important(&stub_false3,&stub_true1)); |
| + EXPECT_FALSE(is_more_important(&stub_false3,&stub_true2)); |
| + EXPECT_FALSE(is_more_important(&stub_false3,&stub_true3)); |
| + |
| + // Newer should always be more important than older: |
| + EXPECT_TRUE(is_more_important(&stub_true2,&stub_true1)); |
| + EXPECT_TRUE(is_more_important(&stub_true3,&stub_true1)); |
| + EXPECT_TRUE(is_more_important(&stub_true3,&stub_true2)); |
| + EXPECT_TRUE(is_more_important(&stub_false2,&stub_false1)); |
| + EXPECT_TRUE(is_more_important(&stub_false3,&stub_false1)); |
| + EXPECT_TRUE(is_more_important(&stub_false3,&stub_false2)); |
| + |
| + // Older should never be more important than newer: |
| + EXPECT_FALSE(is_more_important(&stub_true1,&stub_true2)); |
| + EXPECT_FALSE(is_more_important(&stub_true1,&stub_true3)); |
| + EXPECT_FALSE(is_more_important(&stub_true2,&stub_true3)); |
| + EXPECT_FALSE(is_more_important(&stub_false1,&stub_false2)); |
| + EXPECT_FALSE(is_more_important(&stub_false1,&stub_false3)); |
| + EXPECT_FALSE(is_more_important(&stub_false2,&stub_false3)); |
| +} |
| + |
| +// Test GpuMemoryManager::Manage functionality: Basic test of stubs with |
| +// surfaces, and stubs without surfaces but with affected surfaces |
|
nduca
2012/02/01 00:01:17
These two first lines dont add a lot of value.
|
| +// Expect memory allocation to set hasFrontbuffer, hasBackbuffer according |
| +// to visibility and last used time. |
| +TEST_F(GpuMemoryManagerTest, TestManageBasicFunctionality) { |
| + FakeCommandBufferStub stub1(GenerateUniqueSurfaceId(), true, first_), |
| + stub2(GenerateUniqueSurfaceId(), false, first_); |
| + client_.stubs_.push_back(&stub1); |
| + client_.stubs_.push_back(&stub2); |
| + |
| + Manage(); |
| + EXPECT_EQ(stub1.allocation_.hasFrontbuffer, true); |
| + EXPECT_EQ(stub1.allocation_.hasBackbuffer, true); |
| + EXPECT_EQ(stub2.allocation_.hasFrontbuffer, true); |
| + EXPECT_EQ(stub2.allocation_.hasBackbuffer, false); |
| + |
| + FakeCommandBufferStub stub3, stub4, stub5; |
| + stub3.affected_surface_ids_.push_back(stub1.surface_state()->surface_id); |
| + stub4.affected_surface_ids_.push_back(stub2.surface_state()->surface_id); |
| + stub5.affected_surface_ids_.push_back(stub1.surface_state()->surface_id); |
| + stub5.affected_surface_ids_.push_back(stub2.surface_state()->surface_id); |
| + client_.stubs_.push_back(&stub3); |
| + client_.stubs_.push_back(&stub4); |
| + client_.stubs_.push_back(&stub5); |
| + |
| + Manage(); |
| + EXPECT_EQ(stub3.allocation_, stub1.allocation_); |
| + EXPECT_EQ(stub4.allocation_, stub2.allocation_); |
| + EXPECT_EQ(stub5.allocation_, stub1.allocation_); |
| +} |
| + |
| +// Test GpuMemoryManager::Manage functionality: Test changing visibility |
| +// Expect memory allocation to set hasFrontbuffer, hasBackbuffer according |
| +// to visibility and last used time. |
| +TEST_F(GpuMemoryManagerTest, TestManageChangingVisibility) { |
| + FakeCommandBufferStub stub1(GenerateUniqueSurfaceId(), true, first_), |
| + stub2(GenerateUniqueSurfaceId(), false, first_); |
| + client_.stubs_.push_back(&stub1); |
| + client_.stubs_.push_back(&stub2); |
| + |
| + Manage(); |
| + EXPECT_EQ(stub1.allocation_.hasFrontbuffer, true); |
| + EXPECT_EQ(stub1.allocation_.hasBackbuffer, true); |
| + EXPECT_EQ(stub2.allocation_.hasFrontbuffer, true); |
| + EXPECT_EQ(stub2.allocation_.hasBackbuffer, false); |
| + |
| + stub1.surface_state()->visible = false; |
| + stub2.surface_state()->visible = true; |
| + |
| + Manage(); |
| + EXPECT_EQ(stub1.allocation_.hasFrontbuffer, true); |
| + EXPECT_EQ(stub1.allocation_.hasBackbuffer, false); |
| + EXPECT_EQ(stub2.allocation_.hasFrontbuffer, true); |
| + EXPECT_EQ(stub2.allocation_.hasBackbuffer, true); |
| +} |
| + |
| +// Test GpuMemoryManager::Manage functionality: Test more than threshold number |
| +// of visible stubs. |
| +// Expect all allocations to continue to have frontbuffer. |
| +TEST_F(GpuMemoryManagerTest, TestManageManyVisibleStubs) { |
| + FakeCommandBufferStub stub1(GenerateUniqueSurfaceId(), true, first_), |
| + stub2(GenerateUniqueSurfaceId(), true, first_), |
| + stub3(GenerateUniqueSurfaceId(), true, first_), |
| + stub4(GenerateUniqueSurfaceId(), true, first_); |
| + client_.stubs_.push_back(&stub1); |
| + client_.stubs_.push_back(&stub2); |
| + client_.stubs_.push_back(&stub3); |
| + client_.stubs_.push_back(&stub4); |
| + |
| + Manage(); |
| + EXPECT_EQ(stub1.allocation_.hasFrontbuffer, true); |
| + EXPECT_EQ(stub1.allocation_.hasBackbuffer, true); |
| + EXPECT_EQ(stub2.allocation_.hasFrontbuffer, true); |
| + EXPECT_EQ(stub2.allocation_.hasBackbuffer, true); |
| + EXPECT_EQ(stub3.allocation_.hasFrontbuffer, true); |
| + EXPECT_EQ(stub3.allocation_.hasBackbuffer, true); |
| + EXPECT_EQ(stub4.allocation_.hasFrontbuffer, true); |
| + EXPECT_EQ(stub4.allocation_.hasBackbuffer, true); |
| +} |
| + |
| +// Test GpuMemoryManager::Manage functionality: Test more than threshold number |
| +// of not visible stubs. |
| +// Expect the stubs surpassing the threshold to not have a backbuffer. |
| +TEST_F(GpuMemoryManagerTest, TestManageManyNotVisibleStubs) { |
| + FakeCommandBufferStub stub1(GenerateUniqueSurfaceId(), false, second_), |
| + stub2(GenerateUniqueSurfaceId(), false, second_), |
| + stub3(GenerateUniqueSurfaceId(), false, second_), |
| + stub4(GenerateUniqueSurfaceId(), false, first_); |
| + client_.stubs_.push_back(&stub1); |
| + client_.stubs_.push_back(&stub2); |
| + client_.stubs_.push_back(&stub3); |
| + client_.stubs_.push_back(&stub4); |
| + |
| + Manage(); |
| + EXPECT_EQ(stub1.allocation_.hasFrontbuffer, true); |
| + EXPECT_EQ(stub1.allocation_.hasBackbuffer, false); |
| + EXPECT_EQ(stub2.allocation_.hasFrontbuffer, true); |
| + EXPECT_EQ(stub2.allocation_.hasBackbuffer, false); |
| + EXPECT_EQ(stub3.allocation_.hasFrontbuffer, true); |
| + EXPECT_EQ(stub3.allocation_.hasBackbuffer, false); |
| + EXPECT_EQ(stub4.allocation_.hasFrontbuffer, false); |
| + EXPECT_EQ(stub4.allocation_.hasBackbuffer, false); |
| +} |
| + |
| +// Test GpuMemoryManager::Manage functionality: Test changing the last used |
| +// time of stubs when doing so causes change in which stubs surpass threshold. |
| +// Expect frontbuffer to be dropped for the older stub. |
| +TEST_F(GpuMemoryManagerTest, TestManageChangingLastUsedTime) { |
| + FakeCommandBufferStub stub1(GenerateUniqueSurfaceId(), false, second_), |
| + stub2(GenerateUniqueSurfaceId(), false, second_), |
| + stub3(GenerateUniqueSurfaceId(), false, second_), |
| + stub4(GenerateUniqueSurfaceId(), false, first_); |
| + client_.stubs_.push_back(&stub1); |
| + client_.stubs_.push_back(&stub2); |
| + client_.stubs_.push_back(&stub3); |
| + client_.stubs_.push_back(&stub4); |
| + |
| + Manage(); |
| + EXPECT_EQ(stub3.allocation_.hasFrontbuffer, true); |
| + EXPECT_EQ(stub3.allocation_.hasBackbuffer, false); |
| + EXPECT_EQ(stub4.allocation_.hasFrontbuffer, false); |
| + EXPECT_EQ(stub4.allocation_.hasBackbuffer, false); |
| + |
| + stub3.surface_state()->last_used_time = first_; |
| + stub4.surface_state()->last_used_time = second_; |
| + |
| + Manage(); |
| + EXPECT_EQ(stub3.allocation_.hasFrontbuffer, false); |
| + EXPECT_EQ(stub3.allocation_.hasBackbuffer, false); |
| + EXPECT_EQ(stub4.allocation_.hasFrontbuffer, true); |
| + EXPECT_EQ(stub4.allocation_.hasBackbuffer, false); |
| +} |