| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/trees/layer_tree_host.h" | 5 #include "cc/trees/layer_tree_host.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "cc/layers/content_layer.h" | 8 #include "cc/layers/content_layer.h" |
| 9 #include "cc/layers/delegated_frame_provider.h" | 9 #include "cc/layers/delegated_frame_provider.h" |
| 10 #include "cc/layers/delegated_frame_resource_collection.h" | 10 #include "cc/layers/delegated_frame_resource_collection.h" |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 58 times_to_fail_recreate_(0), | 58 times_to_fail_recreate_(0), |
| 59 times_to_expect_create_failed_(0), | 59 times_to_expect_create_failed_(0), |
| 60 times_create_failed_(0), | 60 times_create_failed_(0), |
| 61 committed_at_least_once_(false), | 61 committed_at_least_once_(false), |
| 62 context_should_support_io_surface_(false), | 62 context_should_support_io_surface_(false), |
| 63 fallback_context_works_(false) { | 63 fallback_context_works_(false) { |
| 64 media::InitializeMediaLibraryForTesting(); | 64 media::InitializeMediaLibraryForTesting(); |
| 65 } | 65 } |
| 66 | 66 |
| 67 void LoseContext() { | 67 void LoseContext() { |
| 68 // For sanity-checking tests, they should only call this when the | |
| 69 // context is not lost. | |
| 70 CHECK(context3d_); | |
| 71 context3d_->loseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB, | 68 context3d_->loseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB, |
| 72 GL_INNOCENT_CONTEXT_RESET_ARB); | 69 GL_INNOCENT_CONTEXT_RESET_ARB); |
| 73 context3d_ = NULL; | 70 context3d_ = NULL; |
| 74 } | 71 } |
| 75 | 72 |
| 76 virtual scoped_ptr<TestWebGraphicsContext3D> CreateContext3d() { | 73 virtual scoped_ptr<TestWebGraphicsContext3D> CreateContext3d() { |
| 77 return TestWebGraphicsContext3D::Create(); | 74 return TestWebGraphicsContext3D::Create(); |
| 78 } | 75 } |
| 79 | 76 |
| 80 virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback) | 77 virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback) |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 304 EXPECT_TRUE(false); | 301 EXPECT_TRUE(false); |
| 305 return scoped_ptr<OutputSurface>(); | 302 return scoped_ptr<OutputSurface>(); |
| 306 } | 303 } |
| 307 | 304 |
| 308 virtual void DidInitializeOutputSurface() OVERRIDE { EXPECT_TRUE(false); } | 305 virtual void DidInitializeOutputSurface() OVERRIDE { EXPECT_TRUE(false); } |
| 309 | 306 |
| 310 virtual void AfterTest() OVERRIDE { | 307 virtual void AfterTest() OVERRIDE { |
| 311 } | 308 } |
| 312 }; | 309 }; |
| 313 | 310 |
| 314 SINGLE_AND_MULTI_THREAD_TEST_F( | 311 MULTI_THREAD_TEST_F(LayerTreeHostClientNotReadyDoesNotCreateOutputSurface); |
| 315 LayerTreeHostClientNotReadyDoesNotCreateOutputSurface); | |
| 316 | 312 |
| 317 class LayerTreeHostContextTestLostContextSucceedsWithContent | 313 class LayerTreeHostContextTestLostContextSucceedsWithContent |
| 318 : public LayerTreeHostContextTestLostContextSucceeds { | 314 : public LayerTreeHostContextTestLostContextSucceeds { |
| 319 public: | 315 public: |
| 320 virtual void SetupTree() OVERRIDE { | 316 virtual void SetupTree() OVERRIDE { |
| 321 root_ = Layer::Create(); | 317 root_ = Layer::Create(); |
| 322 root_->SetBounds(gfx::Size(10, 10)); | 318 root_->SetBounds(gfx::Size(10, 10)); |
| 323 root_->SetIsDrawable(true); | 319 root_->SetIsDrawable(true); |
| 324 | 320 |
| 325 content_ = FakeContentLayer::Create(&client_); | 321 content_ = FakeContentLayer::Create(&client_); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 363 : public LayerTreeHostContextTest { | 359 : public LayerTreeHostContextTest { |
| 364 public: | 360 public: |
| 365 // Run a test that initially fails OutputSurface creation |times_to_fail| | 361 // Run a test that initially fails OutputSurface creation |times_to_fail| |
| 366 // times. If |expect_fallback_attempt| is |true|, an attempt to create a | 362 // times. If |expect_fallback_attempt| is |true|, an attempt to create a |
| 367 // fallback/software OutputSurface is expected to occur. | 363 // fallback/software OutputSurface is expected to occur. |
| 368 LayerTreeHostContextTestCreateOutputSurfaceFails(int times_to_fail, | 364 LayerTreeHostContextTestCreateOutputSurfaceFails(int times_to_fail, |
| 369 bool expect_fallback_attempt) | 365 bool expect_fallback_attempt) |
| 370 : times_to_fail_(times_to_fail), | 366 : times_to_fail_(times_to_fail), |
| 371 expect_fallback_attempt_(expect_fallback_attempt), | 367 expect_fallback_attempt_(expect_fallback_attempt), |
| 372 did_attempt_fallback_(false), | 368 did_attempt_fallback_(false), |
| 373 times_initialized_(0) { | 369 times_initialized_(0) {} |
| 374 times_to_fail_create_ = times_to_fail_; | |
| 375 } | |
| 376 | 370 |
| 377 virtual void BeginTest() OVERRIDE { | 371 virtual void BeginTest() OVERRIDE { |
| 372 times_to_fail_create_ = times_to_fail_; |
| 378 PostSetNeedsCommitToMainThread(); | 373 PostSetNeedsCommitToMainThread(); |
| 379 } | 374 } |
| 380 | 375 |
| 381 virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback) | 376 virtual scoped_ptr<FakeOutputSurface> CreateFakeOutputSurface(bool fallback) |
| 382 OVERRIDE { | 377 OVERRIDE { |
| 383 scoped_ptr<FakeOutputSurface> surface = | 378 scoped_ptr<FakeOutputSurface> surface = |
| 384 LayerTreeHostContextTest::CreateFakeOutputSurface(fallback); | 379 LayerTreeHostContextTest::CreateFakeOutputSurface(fallback); |
| 385 | 380 |
| 386 if (surface) | 381 if (surface) |
| 387 EXPECT_EQ(times_to_fail_, times_create_failed_); | 382 EXPECT_EQ(times_to_fail_, times_create_failed_); |
| (...skipping 593 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 981 // backtrack). | 976 // backtrack). |
| 982 EXPECT_EQ(1, scrollbar_layer_->update_count()); | 977 EXPECT_EQ(1, scrollbar_layer_->update_count()); |
| 983 LoseContext(); | 978 LoseContext(); |
| 984 break; | 979 break; |
| 985 case 2: | 980 case 2: |
| 986 // Second update, after the lost context, we should still upload 2 | 981 // Second update, after the lost context, we should still upload 2 |
| 987 // resources even if the contents haven't changed. | 982 // resources even if the contents haven't changed. |
| 988 EXPECT_EQ(2, scrollbar_layer_->update_count()); | 983 EXPECT_EQ(2, scrollbar_layer_->update_count()); |
| 989 EndTest(); | 984 EndTest(); |
| 990 break; | 985 break; |
| 986 case 3: |
| 987 // Single thread proxy issues extra commits after context lost. |
| 988 // http://crbug.com/287250 |
| 989 if (HasImplThread()) |
| 990 NOTREACHED(); |
| 991 break; |
| 991 default: | 992 default: |
| 992 NOTREACHED(); | 993 NOTREACHED(); |
| 993 } | 994 } |
| 994 } | 995 } |
| 995 | 996 |
| 996 private: | 997 private: |
| 997 int commits_; | 998 int commits_; |
| 998 scoped_refptr<FakePaintedScrollbarLayer> scrollbar_layer_; | 999 scoped_refptr<FakePaintedScrollbarLayer> scrollbar_layer_; |
| 999 }; | 1000 }; |
| 1000 | 1001 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1024 void PostStepCompleteToMainThread() { | 1025 void PostStepCompleteToMainThread() { |
| 1025 proxy()->MainThreadTaskRunner()->PostTask( | 1026 proxy()->MainThreadTaskRunner()->PostTask( |
| 1026 FROM_HERE, | 1027 FROM_HERE, |
| 1027 base::Bind(&UIResourceLostTest::StepCompleteOnMainThreadInternal, | 1028 base::Bind(&UIResourceLostTest::StepCompleteOnMainThreadInternal, |
| 1028 base::Unretained(this), | 1029 base::Unretained(this), |
| 1029 time_step_)); | 1030 time_step_)); |
| 1030 } | 1031 } |
| 1031 | 1032 |
| 1032 void PostLoseContextToImplThread() { | 1033 void PostLoseContextToImplThread() { |
| 1033 EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); | 1034 EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); |
| 1034 ImplThreadTaskRunner()->PostTask( | 1035 base::SingleThreadTaskRunner* task_runner = |
| 1035 FROM_HERE, | 1036 HasImplThread() ? ImplThreadTaskRunner() |
| 1036 base::Bind(&LayerTreeHostContextTest::LoseContext, | 1037 : base::MessageLoopProxy::current(); |
| 1037 base::Unretained(this))); | 1038 task_runner->PostTask(FROM_HERE, |
| 1039 base::Bind(&LayerTreeHostContextTest::LoseContext, |
| 1040 base::Unretained(this))); |
| 1038 } | 1041 } |
| 1039 | 1042 |
| 1040 protected: | 1043 protected: |
| 1041 int time_step_; | 1044 int time_step_; |
| 1042 scoped_ptr<FakeScopedUIResource> ui_resource_; | 1045 scoped_ptr<FakeScopedUIResource> ui_resource_; |
| 1043 | 1046 |
| 1044 private: | 1047 private: |
| 1045 void StepCompleteOnMainThreadInternal(int step) { | 1048 void StepCompleteOnMainThreadInternal(int step) { |
| 1046 EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); | 1049 EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); |
| 1047 StepCompleteOnMainThread(step); | 1050 StepCompleteOnMainThread(step); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1082 // Expects a valid UIResourceId. | 1085 // Expects a valid UIResourceId. |
| 1083 EXPECT_NE(0, ui_resource_->id()); | 1086 EXPECT_NE(0, ui_resource_->id()); |
| 1084 PostSetNeedsCommitToMainThread(); | 1087 PostSetNeedsCommitToMainThread(); |
| 1085 break; | 1088 break; |
| 1086 case 4: | 1089 case 4: |
| 1087 // Release resource before ending the test. | 1090 // Release resource before ending the test. |
| 1088 ui_resource_.reset(); | 1091 ui_resource_.reset(); |
| 1089 EndTest(); | 1092 EndTest(); |
| 1090 break; | 1093 break; |
| 1091 case 5: | 1094 case 5: |
| 1095 // Single thread proxy issues extra commits after context lost. |
| 1096 // http://crbug.com/287250 |
| 1097 if (HasImplThread()) |
| 1098 NOTREACHED(); |
| 1099 break; |
| 1100 case 6: |
| 1092 NOTREACHED(); | 1101 NOTREACHED(); |
| 1093 break; | |
| 1094 } | 1102 } |
| 1095 } | 1103 } |
| 1096 | 1104 |
| 1097 virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE { | 1105 virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE { |
| 1098 LayerTreeHostContextTest::CommitCompleteOnThread(impl); | 1106 LayerTreeHostContextTest::CommitCompleteOnThread(impl); |
| 1099 switch (time_step_) { | 1107 switch (time_step_) { |
| 1100 case 1: | 1108 case 1: |
| 1101 // The resource should have been created on LTHI after the commit. | 1109 // The resource should have been created on LTHI after the commit. |
| 1102 EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); | 1110 EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); |
| 1103 PostSetNeedsCommitToMainThread(); | 1111 PostSetNeedsCommitToMainThread(); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1171 layer_tree_host()->DeleteUIResource(test_id0_); | 1179 layer_tree_host()->DeleteUIResource(test_id0_); |
| 1172 // Delete the resouce and then lose the context. | 1180 // Delete the resouce and then lose the context. |
| 1173 PostLoseContextToImplThread(); | 1181 PostLoseContextToImplThread(); |
| 1174 break; | 1182 break; |
| 1175 case 5: | 1183 case 5: |
| 1176 // Release resource before ending the test. | 1184 // Release resource before ending the test. |
| 1177 ui_resource_.reset(); | 1185 ui_resource_.reset(); |
| 1178 EndTest(); | 1186 EndTest(); |
| 1179 break; | 1187 break; |
| 1180 case 6: | 1188 case 6: |
| 1189 // Single thread proxy issues extra commits after context lost. |
| 1190 // http://crbug.com/287250 |
| 1191 if (HasImplThread()) |
| 1192 NOTREACHED(); |
| 1193 break; |
| 1194 case 8: |
| 1181 NOTREACHED(); | 1195 NOTREACHED(); |
| 1182 break; | |
| 1183 } | 1196 } |
| 1184 } | 1197 } |
| 1185 | 1198 |
| 1186 virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE { | 1199 virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE { |
| 1187 LayerTreeHostContextTest::CommitCompleteOnThread(impl); | 1200 LayerTreeHostContextTest::CommitCompleteOnThread(impl); |
| 1188 switch (time_step_) { | 1201 switch (time_step_) { |
| 1189 case 1: | 1202 case 1: |
| 1190 // Sequence 1 (continued): | 1203 // Sequence 1 (continued): |
| 1191 // The first context lost happens before the resources were created, | 1204 // The first context lost happens before the resources were created, |
| 1192 // and because it resulted in no resources being destroyed, it does not | 1205 // and because it resulted in no resources being destroyed, it does not |
| 1193 // trigger resource re-creation. | 1206 // trigger resource re-creation. |
| 1194 EXPECT_EQ(1, ui_resource_->resource_create_count); | 1207 EXPECT_EQ(1, ui_resource_->resource_create_count); |
| 1195 EXPECT_EQ(0, ui_resource_->lost_resource_count); | 1208 EXPECT_EQ(0, ui_resource_->lost_resource_count); |
| 1196 // Resource Id on the impl-side has been created. | 1209 // Resource Id on the impl-side has been created. |
| 1197 PostSetNeedsCommitToMainThread(); | 1210 PostSetNeedsCommitToMainThread(); |
| 1198 break; | 1211 break; |
| 1199 case 3: | 1212 case 3: |
| 1200 // Sequence 2 (continued): | 1213 // Sequence 2 (continued): |
| 1201 // The previous resource should have been deleted. | 1214 // The previous resource should have been deleted. |
| 1202 EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_)); | 1215 EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_)); |
| 1203 // The second resource should have been created. | 1216 if (HasImplThread()) { |
| 1204 EXPECT_NE(0u, impl->ResourceIdForUIResource(test_id1_)); | 1217 // The second resource should have been created. |
| 1218 EXPECT_NE(0u, impl->ResourceIdForUIResource(test_id1_)); |
| 1219 } else { |
| 1220 // The extra commit that happens at context lost in the single thread |
| 1221 // proxy changes the timing so that the resource has been destroyed. |
| 1222 // http://crbug.com/287250 |
| 1223 EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id1_)); |
| 1224 } |
| 1205 // The second resource called the resource callback once and since the | 1225 // The second resource called the resource callback once and since the |
| 1206 // context is lost, a "resource lost" callback was also issued. | 1226 // context is lost, a "resource lost" callback was also issued. |
| 1207 EXPECT_EQ(2, ui_resource_->resource_create_count); | 1227 EXPECT_EQ(2, ui_resource_->resource_create_count); |
| 1208 EXPECT_EQ(1, ui_resource_->lost_resource_count); | 1228 EXPECT_EQ(1, ui_resource_->lost_resource_count); |
| 1209 break; | 1229 break; |
| 1210 case 5: | 1230 case 5: |
| 1211 // Sequence 3 (continued): | 1231 // Sequence 3 (continued): |
| 1212 // Expect the resource callback to have been called once. | 1232 // Expect the resource callback to have been called once. |
| 1213 EXPECT_EQ(1, ui_resource_->resource_create_count); | 1233 EXPECT_EQ(1, ui_resource_->resource_create_count); |
| 1214 // No "resource lost" callbacks. | 1234 // No "resource lost" callbacks. |
| (...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1510 EXPECT_FALSE(layer_tree_host()->output_surface_lost()); | 1530 EXPECT_FALSE(layer_tree_host()->output_surface_lost()); |
| 1511 } | 1531 } |
| 1512 | 1532 |
| 1513 virtual void DidCommitAndDrawFrame() OVERRIDE { EndTest(); } | 1533 virtual void DidCommitAndDrawFrame() OVERRIDE { EndTest(); } |
| 1514 | 1534 |
| 1515 virtual void AfterTest() OVERRIDE {} | 1535 virtual void AfterTest() OVERRIDE {} |
| 1516 | 1536 |
| 1517 bool deferred_; | 1537 bool deferred_; |
| 1518 }; | 1538 }; |
| 1519 | 1539 |
| 1520 SINGLE_AND_MULTI_THREAD_TEST_F( | 1540 // TODO(danakj): We don't use scheduler with SingleThreadProxy yet. |
| 1521 LayerTreeHostContextTestLoseAfterSendingBeginMainFrame); | 1541 MULTI_THREAD_TEST_F(LayerTreeHostContextTestLoseAfterSendingBeginMainFrame); |
| 1522 | 1542 |
| 1523 } // namespace | 1543 } // namespace |
| 1524 } // namespace cc | 1544 } // namespace cc |
| OLD | NEW |