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 |