Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(69)

Unified Diff: cc/trees/layer_tree_host_unittest_context.cc

Issue 23548022: [cc] Evict UIResources when the renderer is not visible (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix typo Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/trees/layer_tree_host_impl.cc ('k') | cc/trees/layer_tree_impl.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/trees/layer_tree_host_unittest_context.cc
diff --git a/cc/trees/layer_tree_host_unittest_context.cc b/cc/trees/layer_tree_host_unittest_context.cc
index a592fdb2a7444af11d55f6bf26ef0d2a86a2a57f..6615cfce12a4402bf71db7e3760f8f1ed3fb9527 100644
--- a/cc/trees/layer_tree_host_unittest_context.cc
+++ b/cc/trees/layer_tree_host_unittest_context.cc
@@ -1735,6 +1735,12 @@ class ScrollbarLayerLostContext : public LayerTreeHostContextTest {
EXPECT_EQ(2, scrollbar_layer_->update_count());
EndTest();
break;
+ case 3:
+ // Single thread proxy issues extra commits after context lost.
+ // http://crbug.com/287250
+ if (HasImplThread())
+ NOTREACHED();
+ break;
default:
NOTREACHED();
}
@@ -1911,7 +1917,12 @@ class UIResourceLostAfterCommit : public UIResourceLostTestSimple {
EndTest();
break;
case 5:
- // Make sure no extra commits happened.
+ // Single thread proxy issues extra commits after context lost.
+ // http://crbug.com/287250
+ if (HasImplThread())
+ NOTREACHED();
+ break;
+ case 6:
NOTREACHED();
}
}
@@ -2017,44 +2028,31 @@ class UIResourceLostBeforeCommit : public UIResourceLostTestSimple {
switch (time_step_) {
case 1:
// Sequence 1 (continued):
- if (HasImplThread()) {
- // The resources should have been recreated.
- EXPECT_EQ(2, ui_resource_->resource_create_count);
- // The "resource lost" callback was called once for the resource in
- // the resource map.
- EXPECT_EQ(1, ui_resource_->lost_resource_count);
- } else {
- // The extra commit that happens at context lost in the single thread
- // proxy changes the timing so that the resource recreation callback
- // is skipped.
- // http://crbug.com/287250
- EXPECT_EQ(1, ui_resource_->resource_create_count);
- EXPECT_EQ(0, ui_resource_->lost_resource_count);
- }
- // Resource Id on the impl-side have been recreated as well. Note
- // that the same UIResourceId persists after the context lost.
- EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
+ // The first context lost happens before the resources were created,
+ // and because it resulted in no resources being destroyed, it does not
+ // trigger resource re-creation.
+ EXPECT_EQ(1, ui_resource_->resource_create_count);
+ EXPECT_EQ(0, ui_resource_->lost_resource_count);
+ // Resource Id on the impl-side has been created.
PostSetNeedsCommitToMainThread();
break;
case 3:
// Sequence 2 (continued):
// The previous resource should have been deleted.
EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_));
- // The second resource should have been created.
- EXPECT_NE(0u, impl->ResourceIdForUIResource(test_id1_));
if (HasImplThread()) {
- // The second resource called the resource callback once and since the
- // context is lost, a "resource lost" callback was also issued.
- EXPECT_EQ(2, ui_resource_->resource_create_count);
- EXPECT_EQ(1, ui_resource_->lost_resource_count);
+ // The second resource should have been created.
+ EXPECT_NE(0u, impl->ResourceIdForUIResource(test_id1_));
} else {
// The extra commit that happens at context lost in the single thread
- // proxy changes the timing so that the resource recreation callback
- // is skipped.
+ // proxy changes the timing so that the resource has been destroyed.
// http://crbug.com/287250
- EXPECT_EQ(1, ui_resource_->resource_create_count);
- EXPECT_EQ(0, ui_resource_->lost_resource_count);
+ EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id1_));
}
+ // The second resource called the resource callback once and since the
+ // context is lost, a "resource lost" callback was also issued.
+ EXPECT_EQ(2, ui_resource_->resource_create_count);
+ EXPECT_EQ(1, ui_resource_->lost_resource_count);
break;
case 5:
// Sequence 3 (continued):
@@ -2166,5 +2164,91 @@ TEST_F(UIResourceLostBeforeActivateTree,
RunTest(true, true, true);
}
+// Resources evicted explicitly and by visibility changes.
+class UIResourceLostEviction : public UIResourceLostTestSimple {
+ public:
+ virtual void StepCompleteOnMainThread(int step) OVERRIDE {
+ EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread());
+ switch (step) {
+ case 0:
+ ui_resource_ = FakeScopedUIResource::Create(layer_tree_host());
+ EXPECT_NE(0, ui_resource_->id());
+ PostSetNeedsCommitToMainThread();
+ break;
+ case 2:
+ // Make the tree not visible.
+ PostSetVisibleToMainThread(false);
+ break;
+ case 3:
+ // Release resource before ending the test.
+ ui_resource_.reset();
+ EndTest();
+ break;
+ case 4:
+ NOTREACHED();
+ }
+ }
+
+ virtual void DidSetVisibleOnImplTree(LayerTreeHostImpl* impl,
+ bool visible) OVERRIDE {
+ TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>(
+ impl->output_surface()->context_provider()->Context3d());
+ if (!visible) {
+ // All resources should have been evicted.
+ ASSERT_EQ(0u, context->NumTextures());
+ EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
+ EXPECT_EQ(2, ui_resource_->resource_create_count);
+ EXPECT_EQ(1, ui_resource_->lost_resource_count);
+ // Drawing is disabled both because of the evicted resources and
+ // because the renderer is not visible.
+ EXPECT_FALSE(impl->CanDraw());
+ // Make the renderer visible again.
+ PostSetVisibleToMainThread(true);
+ }
+ }
+
+ virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE {
+ TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>(
+ impl->output_surface()->context_provider()->Context3d());
+ LayerTreeHostContextTest::CommitCompleteOnThread(impl);
+ switch (time_step_) {
+ case 1:
+ // The resource should have been created on LTHI after the commit.
+ ASSERT_EQ(1u, context->NumTextures());
+ EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
+ EXPECT_EQ(1, ui_resource_->resource_create_count);
+ EXPECT_EQ(0, ui_resource_->lost_resource_count);
+ EXPECT_TRUE(impl->CanDraw());
+ // Evict all UI resources. This will trigger a commit.
+ impl->EvictAllUIResources();
+ ASSERT_EQ(0u, context->NumTextures());
+ EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
+ EXPECT_EQ(1, ui_resource_->resource_create_count);
+ EXPECT_EQ(0, ui_resource_->lost_resource_count);
+ EXPECT_FALSE(impl->CanDraw());
+ break;
+ case 2:
+ // The resource should have been recreated.
+ ASSERT_EQ(1u, context->NumTextures());
+ EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
+ EXPECT_EQ(2, ui_resource_->resource_create_count);
+ EXPECT_EQ(1, ui_resource_->lost_resource_count);
+ EXPECT_TRUE(impl->CanDraw());
+ break;
+ case 3:
+ // The resource should have been recreated after visibility was
+ // restored.
+ ASSERT_EQ(1u, context->NumTextures());
+ EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
+ EXPECT_EQ(3, ui_resource_->resource_create_count);
+ EXPECT_EQ(2, ui_resource_->lost_resource_count);
+ EXPECT_TRUE(impl->CanDraw());
+ break;
+ }
+ }
+};
+
+SINGLE_AND_MULTI_THREAD_TEST_F(UIResourceLostEviction);
+
} // namespace
} // namespace cc
« no previous file with comments | « cc/trees/layer_tree_host_impl.cc ('k') | cc/trees/layer_tree_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698