| 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 8fd9743f6d11a527018c6cab91265180ca68b2e3..a80ec86d31d4f2dbf917e1dcb542e442e52ad014 100644
|
| --- a/cc/trees/layer_tree_host_unittest_context.cc
|
| +++ b/cc/trees/layer_tree_host_unittest_context.cc
|
| @@ -65,6 +65,8 @@ class LayerTreeHostContextTest : public LayerTreeTest {
|
| }
|
|
|
| void LoseContext() {
|
| + if (!context3d_)
|
| + return;
|
| context3d_->loseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB,
|
| GL_INNOCENT_CONTEXT_RESET_ARB);
|
| context3d_ = NULL;
|
| @@ -594,11 +596,18 @@ class LayerTreeHostContextTestLostContextWhileUpdatingResources
|
| virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
|
|
|
| virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
|
| - EXPECT_EQ(0, times_to_lose_on_end_query_);
|
| + // In the multi-thread case, the scheduler sees the context loss and forces
|
| + // re-creation of the output surface before any drawing is attempted.
|
| + // In the single-thread case, we still draw even if the context is lost
|
| + // during resource creation. The loss will be detected later.
|
| + if (HasImplThread())
|
| + EXPECT_EQ(0, times_to_lose_on_end_query_);
|
| EndTest();
|
| }
|
|
|
| virtual void AfterTest() OVERRIDE {
|
| + // We have recovered from all context losses in both the single- and
|
| + // multi-threaded cases.
|
| EXPECT_EQ(0, times_to_lose_on_end_query_);
|
| }
|
|
|
| @@ -657,6 +666,12 @@ class LayerTreeHostContextTestLayersNotified : public LayerTreeHostContextTest {
|
| EXPECT_GE(1u, grandchild->lost_output_surface_count());
|
| EndTest();
|
| break;
|
| + case 3:
|
| + // The single thread proxy issues extra commits after context lost.
|
| + // http://crbug.com/287250
|
| + if (HasImplThread())
|
| + NOTREACHED();
|
| + break;
|
| default:
|
| NOTREACHED();
|
| }
|
| @@ -984,6 +999,7 @@ class ScrollbarLayerLostContext : public LayerTreeHostContextTest {
|
| EndTest();
|
| break;
|
| case 3:
|
| + case 4:
|
| // Single thread proxy issues extra commits after context lost.
|
| // http://crbug.com/287250
|
| if (HasImplThread())
|
| @@ -1097,7 +1113,7 @@ class UIResourceLostAfterCommit : public UIResourceLostTestSimple {
|
| if (HasImplThread())
|
| NOTREACHED();
|
| break;
|
| - case 6:
|
| + case 7:
|
| NOTREACHED();
|
| }
|
| }
|
| @@ -1114,16 +1130,27 @@ class UIResourceLostAfterCommit : public UIResourceLostTestSimple {
|
| LoseContext();
|
| break;
|
| case 3:
|
| - // The resources should have been recreated. The bitmap callback should
|
| - // have been called once with the resource_lost flag set to true.
|
| - EXPECT_EQ(1, 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()));
|
| - PostSetNeedsCommitToMainThread();
|
| + if (HasImplThread())
|
| + CheckForLossRecoveryThenContinue(impl);
|
| + break;
|
| + case 4:
|
| + // In the single-threaded case, the layer tree host sees the
|
| + // loss one step later.
|
| + if (!HasImplThread())
|
| + CheckForLossRecoveryThenContinue(impl);
|
| break;
|
| }
|
| }
|
| +
|
| + void CheckForLossRecoveryThenContinue(LayerTreeHostImpl* impl) {
|
| + // The resources should have been recreated. The bitmap callback should
|
| + // have been called once with the resource_lost flag set to true.
|
| + EXPECT_EQ(1, ui_resource_->lost_resource_count);
|
| + // The resource id on the impl-side should have been recreated as well.
|
| + // Note that the same UIResourceId persists after the context is lost.
|
| + EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
|
| + PostSetNeedsCommitToMainThread();
|
| + }
|
| };
|
|
|
| SINGLE_AND_MULTI_THREAD_TEST_F(UIResourceLostAfterCommit);
|
| @@ -1450,8 +1477,18 @@ class LayerTreeHostContextTestSurfaceCreateCallback
|
| EXPECT_EQ(1u, layer_->output_surface_created_count());
|
| break;
|
| case 4:
|
| - EXPECT_EQ(2u, layer_->output_surface_created_count());
|
| - layer_tree_host()->SetNeedsCommit();
|
| + if (HasImplThread()) {
|
| + EXPECT_EQ(2u, layer_->output_surface_created_count());
|
| + layer_tree_host()->SetNeedsCommit();
|
| + }
|
| + break;
|
| + case 5:
|
| + // The single thread proxy notices the context is lost after the commit
|
| + // has completed.
|
| + if (!HasImplThread()) {
|
| + EXPECT_EQ(2u, layer_->output_surface_created_count());
|
| + layer_tree_host()->SetNeedsCommit();
|
| + }
|
| break;
|
| }
|
| }
|
|
|