| 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
|
| index 3b6653bfa9453532a013a34117f7e4eab8371dd8..2f103d8135e82dbe140b2480aa9fbbd2517a0f29 100644
|
| --- a/content/common/gpu/gpu_memory_manager_unittest.cc
|
| +++ b/content/common/gpu/gpu_memory_manager_unittest.cc
|
| @@ -106,6 +106,11 @@ class FakeClient : public GpuMemoryManagerClient {
|
| memory_tracker_ = NULL;
|
| }
|
|
|
| + void SetMemoryAllocation(const MemoryAllocation& alloc) override {
|
| + allocation_ = alloc;
|
| + ClientAssignmentCollector::AddClientStat(this, alloc);
|
| + }
|
| +
|
| void SuggestHaveFrontBuffer(bool suggest_have_frontbuffer) override {
|
| suggest_have_frontbuffer_ = suggest_have_frontbuffer;
|
| }
|
| @@ -186,4 +191,216 @@ class GpuMemoryManagerTest : public testing::Test {
|
| GpuMemoryManager memmgr_;
|
| };
|
|
|
| +// Test GpuMemoryManager::Manage basic functionality.
|
| +// Expect memory allocation to set suggest_have_frontbuffer/backbuffer
|
| +// according to visibility and last used time for stubs with surface.
|
| +// Expect memory allocation to be shared according to share groups for stubs
|
| +// without a surface.
|
| +TEST_F(GpuMemoryManagerTest, TestManageBasicFunctionality) {
|
| + // Test stubs with surface.
|
| + FakeClient stub1(&memmgr_, GenerateUniqueSurfaceId(), true),
|
| + stub2(&memmgr_, GenerateUniqueSurfaceId(), false);
|
| +
|
| + Manage();
|
| + EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub1.allocation_));
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub2.allocation_));
|
| +
|
| + // Test stubs without surface, with share group of 1 stub.
|
| + FakeClient stub3(&memmgr_, &stub1), stub4(&memmgr_, &stub2);
|
| +
|
| + Manage();
|
| + EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub1.allocation_));
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub2.allocation_));
|
| + EXPECT_TRUE(IsAllocationForegroundForSurfaceNo(stub3.allocation_));
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub4.allocation_));
|
| +
|
| + // Test stub without surface, with share group of multiple stubs.
|
| + FakeClient stub5(&memmgr_ , &stub2);
|
| +
|
| + Manage();
|
| + EXPECT_TRUE(IsAllocationForegroundForSurfaceNo(stub4.allocation_));
|
| +}
|
| +
|
| +// Test GpuMemoryManager::Manage functionality: changing visibility.
|
| +// Expect memory allocation to set suggest_have_frontbuffer/backbuffer
|
| +// according to visibility and last used time for stubs with surface.
|
| +// Expect memory allocation to be shared according to share groups for stubs
|
| +// without a surface.
|
| +TEST_F(GpuMemoryManagerTest, TestManageChangingVisibility) {
|
| + FakeClient stub1(&memmgr_, GenerateUniqueSurfaceId(), true),
|
| + stub2(&memmgr_, GenerateUniqueSurfaceId(), false);
|
| +
|
| + FakeClient stub3(&memmgr_, &stub1), stub4(&memmgr_, &stub2);
|
| + FakeClient stub5(&memmgr_ , &stub2);
|
| +
|
| + Manage();
|
| + EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub1.allocation_));
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub2.allocation_));
|
| + EXPECT_TRUE(IsAllocationForegroundForSurfaceNo(stub3.allocation_));
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub4.allocation_));
|
| + EXPECT_TRUE(IsAllocationForegroundForSurfaceNo(stub5.allocation_));
|
| +
|
| + stub1.SetVisible(false);
|
| + stub2.SetVisible(true);
|
| +
|
| + Manage();
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub1.allocation_));
|
| + EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub2.allocation_));
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub3.allocation_));
|
| + EXPECT_TRUE(IsAllocationForegroundForSurfaceNo(stub4.allocation_));
|
| + EXPECT_TRUE(IsAllocationForegroundForSurfaceNo(stub5.allocation_));
|
| +}
|
| +
|
| +// Test GpuMemoryManager::Manage functionality: Test more than threshold number
|
| +// of visible stubs.
|
| +// Expect all allocations to continue to have frontbuffer.
|
| +TEST_F(GpuMemoryManagerTest, TestManageManyVisibleStubs) {
|
| + FakeClient stub1(&memmgr_, GenerateUniqueSurfaceId(), true),
|
| + stub2(&memmgr_, GenerateUniqueSurfaceId(), true),
|
| + stub3(&memmgr_, GenerateUniqueSurfaceId(), true),
|
| + stub4(&memmgr_, GenerateUniqueSurfaceId(), true);
|
| +
|
| + FakeClient stub5(&memmgr_ , &stub1), stub6(&memmgr_ , &stub2);
|
| + FakeClient stub7(&memmgr_ , &stub2);
|
| +
|
| + Manage();
|
| + EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub1.allocation_));
|
| + EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub2.allocation_));
|
| + EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub3.allocation_));
|
| + EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub4.allocation_));
|
| + EXPECT_TRUE(IsAllocationForegroundForSurfaceNo(stub5.allocation_));
|
| + EXPECT_TRUE(IsAllocationForegroundForSurfaceNo(stub6.allocation_));
|
| + EXPECT_TRUE(IsAllocationForegroundForSurfaceNo(stub7.allocation_));
|
| +}
|
| +
|
| +// 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) {
|
| + FakeClient stub1(&memmgr_, GenerateUniqueSurfaceId(), true),
|
| + stub2(&memmgr_, GenerateUniqueSurfaceId(), true),
|
| + stub3(&memmgr_, GenerateUniqueSurfaceId(), true),
|
| + stub4(&memmgr_, GenerateUniqueSurfaceId(), true);
|
| + stub4.SetVisible(false);
|
| + stub3.SetVisible(false);
|
| + stub2.SetVisible(false);
|
| + stub1.SetVisible(false);
|
| +
|
| + FakeClient stub5(&memmgr_ , &stub1), stub6(&memmgr_ , &stub4);
|
| + FakeClient stub7(&memmgr_ , &stub1);
|
| +
|
| + Manage();
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub1.allocation_));
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub2.allocation_));
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub3.allocation_));
|
| + EXPECT_TRUE(IsAllocationHibernatedForSurfaceYes(stub4.allocation_));
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub5.allocation_));
|
| + EXPECT_TRUE(IsAllocationHibernatedForSurfaceNo(stub6.allocation_));
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub7.allocation_));
|
| +}
|
| +
|
| +// 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) {
|
| + FakeClient stub1(&memmgr_, GenerateUniqueSurfaceId(), true),
|
| + stub2(&memmgr_, GenerateUniqueSurfaceId(), true),
|
| + stub3(&memmgr_, GenerateUniqueSurfaceId(), true),
|
| + stub4(&memmgr_, GenerateUniqueSurfaceId(), true);
|
| +
|
| + FakeClient stub5(&memmgr_ , &stub3), stub6(&memmgr_ , &stub4);
|
| + FakeClient stub7(&memmgr_ , &stub3);
|
| +
|
| + // Make stub4 be the least-recently-used client
|
| + stub4.SetVisible(false);
|
| + stub3.SetVisible(false);
|
| + stub2.SetVisible(false);
|
| + stub1.SetVisible(false);
|
| +
|
| + Manage();
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub1.allocation_));
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub2.allocation_));
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub3.allocation_));
|
| + EXPECT_TRUE(IsAllocationHibernatedForSurfaceYes(stub4.allocation_));
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub5.allocation_));
|
| + EXPECT_TRUE(IsAllocationHibernatedForSurfaceNo(stub6.allocation_));
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub7.allocation_));
|
| +
|
| + // Make stub3 become the least-recently-used client.
|
| + stub2.SetVisible(true);
|
| + stub2.SetVisible(false);
|
| + stub4.SetVisible(true);
|
| + stub4.SetVisible(false);
|
| +
|
| + Manage();
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub1.allocation_));
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub2.allocation_));
|
| + EXPECT_TRUE(IsAllocationHibernatedForSurfaceYes(stub3.allocation_));
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub4.allocation_));
|
| + EXPECT_TRUE(IsAllocationHibernatedForSurfaceNo(stub5.allocation_));
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub6.allocation_));
|
| + EXPECT_TRUE(IsAllocationHibernatedForSurfaceNo(stub7.allocation_));
|
| +}
|
| +
|
| +// Test GpuMemoryManager::Manage functionality: Test changing importance of
|
| +// enough stubs so that every stub in share group crosses threshold.
|
| +// Expect memory allocation of the stubs without surface to share memory
|
| +// allocation with the most visible stub in share group.
|
| +TEST_F(GpuMemoryManagerTest, TestManageChangingImportanceShareGroup) {
|
| + FakeClient stub_ignore_a(&memmgr_, GenerateUniqueSurfaceId(), true),
|
| + stub_ignore_b(&memmgr_, GenerateUniqueSurfaceId(), false),
|
| + stub_ignore_c(&memmgr_, GenerateUniqueSurfaceId(), false);
|
| + FakeClient stub1(&memmgr_, GenerateUniqueSurfaceId(), false),
|
| + stub2(&memmgr_, GenerateUniqueSurfaceId(), false);
|
| +
|
| + FakeClient stub3(&memmgr_, &stub2), stub4(&memmgr_, &stub2);
|
| +
|
| + // stub1 and stub2 keep their non-hibernated state because they're
|
| + // either visible or the 2 most recently used clients (through the
|
| + // first three checks).
|
| + stub1.SetVisible(true);
|
| + stub2.SetVisible(true);
|
| + Manage();
|
| + EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub1.allocation_));
|
| + EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub2.allocation_));
|
| + EXPECT_TRUE(IsAllocationForegroundForSurfaceNo(stub3.allocation_));
|
| + EXPECT_TRUE(IsAllocationForegroundForSurfaceNo(stub4.allocation_));
|
| +
|
| + stub1.SetVisible(false);
|
| + Manage();
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub1.allocation_));
|
| + EXPECT_TRUE(IsAllocationForegroundForSurfaceYes(stub2.allocation_));
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub3.allocation_));
|
| + EXPECT_TRUE(IsAllocationForegroundForSurfaceNo(stub4.allocation_));
|
| +
|
| + stub2.SetVisible(false);
|
| + Manage();
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub1.allocation_));
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub2.allocation_));
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub3.allocation_));
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub4.allocation_));
|
| +
|
| + // stub_ignore_b will cause stub1 to become hibernated (because
|
| + // stub_ignore_a, stub_ignore_b, and stub2 are all non-hibernated and more
|
| + // important).
|
| + stub_ignore_b.SetVisible(true);
|
| + stub_ignore_b.SetVisible(false);
|
| + Manage();
|
| + EXPECT_TRUE(IsAllocationHibernatedForSurfaceYes(stub1.allocation_));
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceYes(stub2.allocation_));
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub3.allocation_));
|
| + EXPECT_TRUE(IsAllocationBackgroundForSurfaceNo(stub4.allocation_));
|
| +
|
| + // stub_ignore_c will cause stub2 to become hibernated (because
|
| + // stub_ignore_a, stub_ignore_b, and stub_ignore_c are all non-hibernated
|
| + // and more important).
|
| + stub_ignore_c.SetVisible(true);
|
| + stub_ignore_c.SetVisible(false);
|
| + Manage();
|
| + EXPECT_TRUE(IsAllocationHibernatedForSurfaceYes(stub1.allocation_));
|
| + EXPECT_TRUE(IsAllocationHibernatedForSurfaceYes(stub2.allocation_));
|
| + EXPECT_TRUE(IsAllocationHibernatedForSurfaceNo(stub3.allocation_));
|
| + EXPECT_TRUE(IsAllocationHibernatedForSurfaceNo(stub4.allocation_));
|
| +}
|
| +
|
| } // namespace content
|
|
|