OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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 <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
10 #include "base/synchronization/lock.h" | 10 #include "base/synchronization/lock.h" |
(...skipping 1094 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1105 void SetTestLayer(Layer* test_layer) { test_layer_ = test_layer; } | 1105 void SetTestLayer(Layer* test_layer) { test_layer_ = test_layer; } |
1106 | 1106 |
1107 void PaintContents( | 1107 void PaintContents( |
1108 SkCanvas* canvas, | 1108 SkCanvas* canvas, |
1109 const gfx::Rect& clip, | 1109 const gfx::Rect& clip, |
1110 ContentLayerClient::GraphicsContextStatus gc_status) override { | 1110 ContentLayerClient::GraphicsContextStatus gc_status) override { |
1111 // Set layer opacity to 0. | 1111 // Set layer opacity to 0. |
1112 if (test_layer_) | 1112 if (test_layer_) |
1113 test_layer_->SetOpacity(0.f); | 1113 test_layer_->SetOpacity(0.f); |
1114 } | 1114 } |
1115 void DidChangeLayerCanUseLCDText() override {} | |
1116 bool FillsBoundsCompletely() const override { return false; } | 1115 bool FillsBoundsCompletely() const override { return false; } |
1117 | 1116 |
1118 private: | 1117 private: |
1119 Layer* test_layer_; | 1118 Layer* test_layer_; |
1120 }; | 1119 }; |
1121 | 1120 |
1122 class ContentLayerWithUpdateTracking : public ContentLayer { | 1121 class ContentLayerWithUpdateTracking : public ContentLayer { |
1123 public: | 1122 public: |
1124 static scoped_refptr<ContentLayerWithUpdateTracking> Create( | 1123 static scoped_refptr<ContentLayerWithUpdateTracking> Create( |
1125 ContentLayerClient* client) { | 1124 ContentLayerClient* client) { |
(...skipping 1173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2299 FakeContentLayerClient client_; | 2298 FakeContentLayerClient client_; |
2300 scoped_refptr<FakeContentLayer> root_layer_; | 2299 scoped_refptr<FakeContentLayer> root_layer_; |
2301 scoped_refptr<FakeContentLayer> child_layer1_; | 2300 scoped_refptr<FakeContentLayer> child_layer1_; |
2302 scoped_refptr<FakeContentLayer> child_layer2_; | 2301 scoped_refptr<FakeContentLayer> child_layer2_; |
2303 int num_commits_; | 2302 int num_commits_; |
2304 }; | 2303 }; |
2305 | 2304 |
2306 SINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F( | 2305 SINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F( |
2307 LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted); | 2306 LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted); |
2308 | 2307 |
2309 class LayerTreeHostTestLCDNotification : public LayerTreeHostTest { | 2308 class LayerTreeHostTestLCDChange : public LayerTreeHostTest { |
2310 public: | 2309 public: |
2311 class NotificationClient : public ContentLayerClient { | 2310 class PaintClient : public FakeContentLayerClient { |
2312 public: | 2311 public: |
2313 NotificationClient() | 2312 PaintClient() : paint_count_(0) {} |
2314 : layer_(0), paint_count_(0), lcd_notification_count_(0) {} | |
2315 | 2313 |
2316 void set_layer(Layer* layer) { layer_ = layer; } | |
2317 int paint_count() const { return paint_count_; } | 2314 int paint_count() const { return paint_count_; } |
2318 int lcd_notification_count() const { return lcd_notification_count_; } | |
2319 | 2315 |
2320 void PaintContents( | 2316 void PaintContents( |
2321 SkCanvas* canvas, | 2317 SkCanvas* canvas, |
2322 const gfx::Rect& clip, | 2318 const gfx::Rect& clip, |
2323 ContentLayerClient::GraphicsContextStatus gc_status) override { | 2319 ContentLayerClient::GraphicsContextStatus gc_status) override { |
| 2320 FakeContentLayerClient::PaintContents(canvas, clip, gc_status); |
2324 ++paint_count_; | 2321 ++paint_count_; |
2325 } | 2322 } |
2326 void DidChangeLayerCanUseLCDText() override { | 2323 |
2327 ++lcd_notification_count_; | |
2328 layer_->SetNeedsDisplay(); | |
2329 } | |
2330 bool FillsBoundsCompletely() const override { return false; } | 2324 bool FillsBoundsCompletely() const override { return false; } |
2331 | 2325 |
2332 private: | 2326 private: |
2333 Layer* layer_; | |
2334 int paint_count_; | 2327 int paint_count_; |
2335 int lcd_notification_count_; | |
2336 }; | 2328 }; |
2337 | 2329 |
2338 void SetupTree() override { | 2330 void SetupTree() override { |
| 2331 num_tiles_rastered_ = 0; |
| 2332 |
2339 scoped_refptr<Layer> root_layer; | 2333 scoped_refptr<Layer> root_layer; |
2340 if (layer_tree_host()->settings().impl_side_painting) | 2334 if (layer_tree_host()->settings().impl_side_painting) |
2341 root_layer = PictureLayer::Create(&client_); | 2335 root_layer = PictureLayer::Create(&client_); |
2342 else | 2336 else |
2343 root_layer = ContentLayer::Create(&client_); | 2337 root_layer = ContentLayer::Create(&client_); |
| 2338 client_.set_fill_with_nonsolid_color(true); |
2344 root_layer->SetIsDrawable(true); | 2339 root_layer->SetIsDrawable(true); |
2345 root_layer->SetBounds(gfx::Size(1, 1)); | 2340 root_layer->SetBounds(gfx::Size(10, 10)); |
| 2341 root_layer->SetContentsOpaque(true); |
2346 | 2342 |
2347 layer_tree_host()->SetRootLayer(root_layer); | 2343 layer_tree_host()->SetRootLayer(root_layer); |
2348 client_.set_layer(root_layer.get()); | |
2349 | 2344 |
2350 // The expecations are based on the assumption that the default | 2345 // The expecations are based on the assumption that the default |
2351 // LCD settings are: | 2346 // LCD settings are: |
2352 EXPECT_TRUE(layer_tree_host()->settings().can_use_lcd_text); | 2347 EXPECT_TRUE(layer_tree_host()->settings().can_use_lcd_text); |
2353 EXPECT_FALSE(root_layer->can_use_lcd_text()); | 2348 EXPECT_FALSE(root_layer->can_use_lcd_text()); |
2354 | 2349 |
2355 LayerTreeHostTest::SetupTree(); | 2350 LayerTreeHostTest::SetupTree(); |
2356 } | 2351 } |
2357 | 2352 |
2358 void BeginTest() override { PostSetNeedsCommitToMainThread(); } | 2353 void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
2359 void AfterTest() override {} | |
2360 | 2354 |
2361 void DidCommit() override { | 2355 void DidCommitAndDrawFrame() override { |
2362 switch (layer_tree_host()->source_frame_number()) { | 2356 switch (layer_tree_host()->source_frame_number()) { |
2363 case 1: | 2357 case 1: |
2364 // The first update consists of one LCD notification and one paint. | 2358 // The first update consists of a paint of the whole layer. |
2365 EXPECT_EQ(1, client_.lcd_notification_count()); | |
2366 EXPECT_EQ(1, client_.paint_count()); | 2359 EXPECT_EQ(1, client_.paint_count()); |
2367 // LCD text must have been enabled on the layer. | 2360 // LCD text must have been enabled on the layer. |
2368 EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text()); | 2361 EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text()); |
2369 PostSetNeedsCommitToMainThread(); | 2362 PostSetNeedsCommitToMainThread(); |
2370 break; | 2363 break; |
2371 case 2: | 2364 case 2: |
2372 // Since nothing changed on layer, there should be no notification | 2365 // Since nothing changed on layer, there should be no paint. |
2373 // or paint on the second update. | |
2374 EXPECT_EQ(1, client_.lcd_notification_count()); | |
2375 EXPECT_EQ(1, client_.paint_count()); | 2366 EXPECT_EQ(1, client_.paint_count()); |
2376 // LCD text must not have changed. | 2367 // LCD text must not have changed. |
2377 EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text()); | 2368 EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text()); |
2378 // Change layer opacity that should trigger lcd notification. | 2369 // Change layer opacity that should trigger lcd change. |
2379 layer_tree_host()->root_layer()->SetOpacity(.5f); | 2370 layer_tree_host()->root_layer()->SetOpacity(.5f); |
2380 // No need to request a commit - setting opacity will do it. | |
2381 break; | 2371 break; |
2382 default: | 2372 case 3: |
2383 // Verify that there is no extra commit due to layer invalidation. | 2373 // LCD text doesn't require re-recording, so no painting should occur. |
2384 EXPECT_EQ(3, layer_tree_host()->source_frame_number()); | 2374 EXPECT_EQ(1, client_.paint_count()); |
2385 // LCD notification count should have incremented due to | |
2386 // change in layer opacity. | |
2387 EXPECT_EQ(2, client_.lcd_notification_count()); | |
2388 // Paint count should be incremented due to invalidation. | |
2389 EXPECT_EQ(2, client_.paint_count()); | |
2390 // LCD text must have been disabled on the layer due to opacity. | 2375 // LCD text must have been disabled on the layer due to opacity. |
2391 EXPECT_FALSE(layer_tree_host()->root_layer()->can_use_lcd_text()); | 2376 EXPECT_FALSE(layer_tree_host()->root_layer()->can_use_lcd_text()); |
| 2377 // Change layer opacity that should not trigger lcd change. |
| 2378 layer_tree_host()->root_layer()->SetOpacity(1.f); |
| 2379 break; |
| 2380 case 4: |
| 2381 // LCD text doesn't require re-recording, so no painting should occur. |
| 2382 EXPECT_EQ(1, client_.paint_count()); |
| 2383 // Even though LCD text could be allowed. |
| 2384 EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text()); |
2392 EndTest(); | 2385 EndTest(); |
2393 break; | 2386 break; |
2394 } | 2387 } |
2395 } | 2388 } |
2396 | 2389 |
| 2390 void NotifyTileStateChangedOnThread(LayerTreeHostImpl* host_impl, |
| 2391 const Tile* tile) override { |
| 2392 ++num_tiles_rastered_; |
| 2393 } |
| 2394 |
| 2395 void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override { |
| 2396 switch (host_impl->active_tree()->source_frame_number()) { |
| 2397 case 0: |
| 2398 // The first draw. |
| 2399 EXPECT_EQ(1, num_tiles_rastered_); |
| 2400 break; |
| 2401 case 1: |
| 2402 // Nothing changed on the layer. |
| 2403 EXPECT_EQ(1, num_tiles_rastered_); |
| 2404 break; |
| 2405 case 2: |
| 2406 // LCD text was disabled, it should be re-rastered with LCD text off. |
| 2407 EXPECT_EQ(2, num_tiles_rastered_); |
| 2408 break; |
| 2409 case 3: |
| 2410 // LCD text was enabled but it's sticky and stays off. |
| 2411 EXPECT_EQ(2, num_tiles_rastered_); |
| 2412 break; |
| 2413 } |
| 2414 } |
| 2415 |
| 2416 void AfterTest() override {} |
| 2417 |
2397 private: | 2418 private: |
2398 NotificationClient client_; | 2419 PaintClient client_; |
| 2420 int num_tiles_rastered_; |
2399 }; | 2421 }; |
2400 | 2422 |
2401 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestLCDNotification); | 2423 SINGLE_AND_MULTI_THREAD_IMPL_TEST_F(LayerTreeHostTestLCDChange); |
2402 | 2424 |
2403 // Verify that the BeginFrame notification is used to initiate rendering. | 2425 // Verify that the BeginFrame notification is used to initiate rendering. |
2404 class LayerTreeHostTestBeginFrameNotification : public LayerTreeHostTest { | 2426 class LayerTreeHostTestBeginFrameNotification : public LayerTreeHostTest { |
2405 public: | 2427 public: |
2406 void InitializeSettings(LayerTreeSettings* settings) override { | 2428 void InitializeSettings(LayerTreeSettings* settings) override { |
2407 settings->use_external_begin_frame_source = true; | 2429 settings->use_external_begin_frame_source = true; |
2408 } | 2430 } |
2409 | 2431 |
2410 void BeginTest() override { | 2432 void BeginTest() override { |
2411 // This will trigger a SetNeedsBeginFrame which will trigger a | 2433 // This will trigger a SetNeedsBeginFrame which will trigger a |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2562 | 2584 |
2563 void set_layer(Layer* layer) { layer_ = layer; } | 2585 void set_layer(Layer* layer) { layer_ = layer; } |
2564 | 2586 |
2565 void PaintContents( | 2587 void PaintContents( |
2566 SkCanvas* canvas, | 2588 SkCanvas* canvas, |
2567 const gfx::Rect& clip, | 2589 const gfx::Rect& clip, |
2568 ContentLayerClient::GraphicsContextStatus gc_status) override { | 2590 ContentLayerClient::GraphicsContextStatus gc_status) override { |
2569 layer_->SetBounds(gfx::Size(2, 2)); | 2591 layer_->SetBounds(gfx::Size(2, 2)); |
2570 } | 2592 } |
2571 | 2593 |
2572 void DidChangeLayerCanUseLCDText() override {} | |
2573 | |
2574 bool FillsBoundsCompletely() const override { return false; } | 2594 bool FillsBoundsCompletely() const override { return false; } |
2575 | 2595 |
2576 private: | 2596 private: |
2577 Layer* layer_; | 2597 Layer* layer_; |
2578 }; | 2598 }; |
2579 | 2599 |
2580 LayerTreeHostTestChangeLayerPropertiesInPaintContents() : num_commits_(0) {} | 2600 LayerTreeHostTestChangeLayerPropertiesInPaintContents() : num_commits_(0) {} |
2581 | 2601 |
2582 void SetupTree() override { | 2602 void SetupTree() override { |
2583 if (layer_tree_host()->settings().impl_side_painting) { | 2603 if (layer_tree_host()->settings().impl_side_painting) { |
(...skipping 2796 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5380 pinch->SetScrollClipLayerId(root->id()); | 5400 pinch->SetScrollClipLayerId(root->id()); |
5381 pinch->SetIsContainerForFixedPositionLayers(true); | 5401 pinch->SetIsContainerForFixedPositionLayers(true); |
5382 root->AddChild(pinch); | 5402 root->AddChild(pinch); |
5383 | 5403 |
5384 scoped_ptr<FakePicturePile> pile(new FakePicturePile); | 5404 scoped_ptr<FakePicturePile> pile(new FakePicturePile); |
5385 pile->SetPlaybackAllowedEvent(&playback_allowed_event_); | 5405 pile->SetPlaybackAllowedEvent(&playback_allowed_event_); |
5386 scoped_refptr<FakePictureLayer> layer = | 5406 scoped_refptr<FakePictureLayer> layer = |
5387 FakePictureLayer::CreateWithRecordingSource(&client_, pile.Pass()); | 5407 FakePictureLayer::CreateWithRecordingSource(&client_, pile.Pass()); |
5388 layer->SetBounds(gfx::Size(500, 500)); | 5408 layer->SetBounds(gfx::Size(500, 500)); |
5389 layer->SetContentsOpaque(true); | 5409 layer->SetContentsOpaque(true); |
| 5410 // Avoid LCD text on the layer so we don't cause extra commits when we |
| 5411 // pinch. |
| 5412 layer->disable_lcd_text(); |
5390 pinch->AddChild(layer); | 5413 pinch->AddChild(layer); |
5391 | 5414 |
5392 layer_tree_host()->RegisterViewportLayers(root, pinch, pinch); | 5415 layer_tree_host()->RegisterViewportLayers(root, pinch, pinch); |
5393 layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 1.f, 4.f); | 5416 layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 1.f, 4.f); |
5394 layer_tree_host()->SetRootLayer(root); | 5417 layer_tree_host()->SetRootLayer(root); |
5395 LayerTreeHostTest::SetupTree(); | 5418 LayerTreeHostTest::SetupTree(); |
5396 } | 5419 } |
5397 | 5420 |
5398 // Returns the delta scale of all quads in the frame's root pass from their | 5421 // Returns the delta scale of all quads in the frame's root pass from their |
5399 // ideal, or 0 if they are not all the same. | 5422 // ideal, or 0 if they are not all the same. |
(...skipping 26 matching lines...) Expand all Loading... |
5426 DrawResult draw_result) override { | 5449 DrawResult draw_result) override { |
5427 float quad_scale_delta = FrameQuadScaleDeltaFromIdeal(frame_data); | 5450 float quad_scale_delta = FrameQuadScaleDeltaFromIdeal(frame_data); |
5428 switch (frame_) { | 5451 switch (frame_) { |
5429 case 1: | 5452 case 1: |
5430 // Drew at page scale 1 before any pinching. | 5453 // Drew at page scale 1 before any pinching. |
5431 EXPECT_EQ(1.f, host_impl->active_tree()->total_page_scale_factor()); | 5454 EXPECT_EQ(1.f, host_impl->active_tree()->total_page_scale_factor()); |
5432 EXPECT_EQ(1.f, quad_scale_delta); | 5455 EXPECT_EQ(1.f, quad_scale_delta); |
5433 PostNextAfterDraw(host_impl); | 5456 PostNextAfterDraw(host_impl); |
5434 break; | 5457 break; |
5435 case 2: | 5458 case 2: |
5436 // Wait for any activations that need to occur due to starting a pinch, | |
5437 // and drawing with a non-identity transform (for eg. LCD text being | |
5438 // disabled). | |
5439 if (host_impl->pending_tree()) | |
5440 break; | |
5441 if (quad_scale_delta != 1.f) | 5459 if (quad_scale_delta != 1.f) |
5442 break; | 5460 break; |
5443 // Drew at page scale 1.5 after pinching in. | 5461 // Drew at page scale 1.5 after pinching in. |
5444 EXPECT_EQ(1.5f, host_impl->active_tree()->total_page_scale_factor()); | 5462 EXPECT_EQ(1.5f, host_impl->active_tree()->total_page_scale_factor()); |
5445 EXPECT_EQ(1.f, quad_scale_delta); | 5463 EXPECT_EQ(1.f, quad_scale_delta); |
5446 PostNextAfterDraw(host_impl); | 5464 PostNextAfterDraw(host_impl); |
5447 break; | 5465 break; |
5448 case 3: | 5466 case 3: |
5449 // By pinching out, we will create a new tiling and raster it. This may | 5467 // By pinching out, we will create a new tiling and raster it. This may |
5450 // cause some additional draws, though we should still be drawing with | 5468 // cause some additional draws, though we should still be drawing with |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5575 LayerTreeHostTestContinuousDrawWhenCreatingVisibleTiles() | 5593 LayerTreeHostTestContinuousDrawWhenCreatingVisibleTiles() |
5576 : playback_allowed_event_(true, true) {} | 5594 : playback_allowed_event_(true, true) {} |
5577 | 5595 |
5578 void InitializeSettings(LayerTreeSettings* settings) override { | 5596 void InitializeSettings(LayerTreeSettings* settings) override { |
5579 settings->impl_side_painting = true; | 5597 settings->impl_side_painting = true; |
5580 } | 5598 } |
5581 | 5599 |
5582 void SetupTree() override { | 5600 void SetupTree() override { |
5583 step_ = 1; | 5601 step_ = 1; |
5584 continuous_draws_ = 0; | 5602 continuous_draws_ = 0; |
5585 expect_draw_ = false; | |
5586 client_.set_fill_with_nonsolid_color(true); | 5603 client_.set_fill_with_nonsolid_color(true); |
5587 | 5604 |
5588 scoped_refptr<Layer> root = Layer::Create(); | 5605 scoped_refptr<Layer> root = Layer::Create(); |
5589 root->SetBounds(gfx::Size(500, 500)); | 5606 root->SetBounds(gfx::Size(500, 500)); |
5590 | 5607 |
5591 scoped_refptr<Layer> pinch = Layer::Create(); | 5608 scoped_refptr<Layer> pinch = Layer::Create(); |
5592 pinch->SetBounds(gfx::Size(500, 500)); | 5609 pinch->SetBounds(gfx::Size(500, 500)); |
5593 pinch->SetScrollClipLayerId(root->id()); | 5610 pinch->SetScrollClipLayerId(root->id()); |
5594 pinch->SetIsContainerForFixedPositionLayers(true); | 5611 pinch->SetIsContainerForFixedPositionLayers(true); |
5595 root->AddChild(pinch); | 5612 root->AddChild(pinch); |
5596 | 5613 |
5597 scoped_ptr<FakePicturePile> pile(new FakePicturePile); | 5614 scoped_ptr<FakePicturePile> pile(new FakePicturePile); |
5598 pile->SetPlaybackAllowedEvent(&playback_allowed_event_); | 5615 pile->SetPlaybackAllowedEvent(&playback_allowed_event_); |
5599 scoped_refptr<FakePictureLayer> layer = | 5616 scoped_refptr<FakePictureLayer> layer = |
5600 FakePictureLayer::CreateWithRecordingSource(&client_, pile.Pass()); | 5617 FakePictureLayer::CreateWithRecordingSource(&client_, pile.Pass()); |
5601 layer->SetBounds(gfx::Size(500, 500)); | 5618 layer->SetBounds(gfx::Size(500, 500)); |
5602 layer->SetContentsOpaque(true); | 5619 layer->SetContentsOpaque(true); |
| 5620 // Avoid LCD text on the layer so we don't cause extra commits when we |
| 5621 // pinch. |
| 5622 layer->disable_lcd_text(); |
5603 pinch->AddChild(layer); | 5623 pinch->AddChild(layer); |
5604 | 5624 |
5605 layer_tree_host()->RegisterViewportLayers(root, pinch, pinch); | 5625 layer_tree_host()->RegisterViewportLayers(root, pinch, pinch); |
5606 layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 1.f, 4.f); | 5626 layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 1.f, 4.f); |
5607 layer_tree_host()->SetRootLayer(root); | 5627 layer_tree_host()->SetRootLayer(root); |
5608 LayerTreeHostTest::SetupTree(); | 5628 LayerTreeHostTest::SetupTree(); |
5609 } | 5629 } |
5610 | 5630 |
5611 // Returns the delta scale of all quads in the frame's root pass from their | 5631 // Returns the delta scale of all quads in the frame's root pass from their |
5612 // ideal, or 0 if they are not all the same. | 5632 // ideal, or 0 if they are not all the same. |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5655 EXPECT_EQ(1.f / 1.5f, quad_scale_delta); | 5675 EXPECT_EQ(1.f / 1.5f, quad_scale_delta); |
5656 break; | 5676 break; |
5657 case 4: | 5677 case 4: |
5658 if (quad_scale_delta != 1.f) | 5678 if (quad_scale_delta != 1.f) |
5659 break; | 5679 break; |
5660 // Drew at scale 1.5 when all the tiles completed. | 5680 // Drew at scale 1.5 when all the tiles completed. |
5661 EXPECT_EQ(1.5f, host_impl->active_tree()->total_page_scale_factor()); | 5681 EXPECT_EQ(1.5f, host_impl->active_tree()->total_page_scale_factor()); |
5662 EXPECT_EQ(1.f, quad_scale_delta); | 5682 EXPECT_EQ(1.f, quad_scale_delta); |
5663 break; | 5683 break; |
5664 case 5: | 5684 case 5: |
5665 // TODO(danakj): We may get one more draw because the NotifyReadyToDraw | 5685 // TODO(danakj): We get more draws before the NotifyReadyToDraw |
5666 // is asynchronous from the previous draw and happens late. | 5686 // because it is asynchronous from the previous draw and happens late. |
5667 break; | 5687 break; |
5668 case 6: | 5688 case 6: |
5669 // We may get another draw if we activate due to the pinch (eg LCD text | 5689 // NotifyReadyToDraw happened. If we were already inside a frame, we may |
5670 // gets disabled). | 5690 // try to draw once more. |
5671 if (expect_draw_) | 5691 break; |
5672 break; | 5692 case 7: |
5673 NOTREACHED() << "No draws should happen once we have a complete frame."; | 5693 NOTREACHED() << "No draws should happen once we have a complete frame."; |
5674 break; | 5694 break; |
5675 } | 5695 } |
5676 expect_draw_ = false; | |
5677 return draw_result; | 5696 return draw_result; |
5678 } | 5697 } |
5679 | 5698 |
5680 void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override { | 5699 void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override { |
5681 switch (step_) { | 5700 switch (step_) { |
5682 case 1: | 5701 case 1: |
5683 // Delay tile production. | 5702 // Delay tile production. |
5684 playback_allowed_event_.Reset(); | 5703 playback_allowed_event_.Reset(); |
5685 // Pinch zoom in to cause new tiles to be required. | 5704 // Pinch zoom in to cause new tiles to be required. |
5686 host_impl->PinchGestureBegin(); | 5705 host_impl->PinchGestureBegin(); |
5687 host_impl->PinchGestureUpdate(1.5f, gfx::Point(100, 100)); | 5706 host_impl->PinchGestureUpdate(1.5f, gfx::Point(100, 100)); |
5688 host_impl->PinchGestureEnd(); | 5707 host_impl->PinchGestureEnd(); |
5689 ++step_; | 5708 ++step_; |
5690 break; | 5709 break; |
5691 case 2: | 5710 case 2: |
5692 ++step_; | 5711 ++step_; |
5693 break; | 5712 break; |
5694 case 3: | 5713 case 3: |
5695 // We should continue to try draw while there are incomplete visible | 5714 // We should continue to try draw while there are incomplete visible |
5696 // tiles. | 5715 // tiles. |
5697 if (++continuous_draws_ > 5) { | 5716 if (++continuous_draws_ > 5) { |
5698 // Allow the tiles to complete. | 5717 // Allow the tiles to complete. |
5699 playback_allowed_event_.Signal(); | 5718 playback_allowed_event_.Signal(); |
5700 ++step_; | 5719 ++step_; |
5701 } | 5720 } |
5702 break; | 5721 break; |
5703 case 4: | 5722 case 4: |
5704 // TODO(danakj): Now we wait for NotifyReadyToDraw to avoid flakiness | 5723 ++step_; |
5705 // since it happens asynchronously. | 5724 break; |
| 5725 case 5: |
| 5726 // Waiting for NotifyReadyToDraw. |
| 5727 break; |
| 5728 case 6: |
| 5729 // NotifyReadyToDraw happened. |
5706 ++step_; | 5730 ++step_; |
5707 break; | 5731 break; |
5708 } | 5732 } |
5709 } | 5733 } |
5710 | 5734 |
5711 void NotifyReadyToDrawOnThread(LayerTreeHostImpl* host_impl) override { | 5735 void NotifyReadyToDrawOnThread(LayerTreeHostImpl* host_impl) override { |
5712 if (step_ == 5) { | 5736 if (step_ == 5) { |
5713 // We should not continue to draw any more. End the test after a timeout | 5737 ++step_; |
5714 // to watch for any extraneous draws. | 5738 // NotifyReadyToDraw has happened, we may draw once more, but should not |
| 5739 // get any more draws after that. End the test after a timeout to watch |
| 5740 // for any extraneous draws. |
5715 // TODO(brianderson): We could remove this delay and instead wait until | 5741 // TODO(brianderson): We could remove this delay and instead wait until |
5716 // the BeginFrameSource decides it doesn't need to send frames anymore, | 5742 // the BeginFrameSource decides it doesn't need to send frames anymore, |
5717 // or test that it already doesn't here. | 5743 // or test that it already doesn't here. |
5718 EndTestAfterDelayMs(16 * 4); | 5744 EndTestAfterDelayMs(16 * 4); |
5719 ++step_; | |
5720 expect_draw_ = true; | |
5721 } | 5745 } |
5722 } | 5746 } |
5723 | 5747 |
5724 void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override { | |
5725 expect_draw_ = true; | |
5726 } | |
5727 | |
5728 void NotifyTileStateChangedOnThread(LayerTreeHostImpl* host_impl, | 5748 void NotifyTileStateChangedOnThread(LayerTreeHostImpl* host_impl, |
5729 const Tile* tile) override { | 5749 const Tile* tile) override { |
5730 // On step_ == 2, we are preventing texture uploads from completing, | 5750 // On step_ == 2, we are preventing texture uploads from completing, |
5731 // so this verifies they are not completing before step_ == 3. | 5751 // so this verifies they are not completing before step_ == 3. |
5732 // Flaky failures here indicate we're failing to prevent uploads from | 5752 // Flaky failures here indicate we're failing to prevent uploads from |
5733 // completing. | 5753 // completing. |
5734 EXPECT_NE(2, step_); | 5754 EXPECT_NE(2, step_); |
5735 } | 5755 } |
5736 | 5756 |
5737 void AfterTest() override { EXPECT_GT(continuous_draws_, 5); } | 5757 void AfterTest() override { EXPECT_GT(continuous_draws_, 5); } |
5738 | 5758 |
5739 FakeContentLayerClient client_; | 5759 FakeContentLayerClient client_; |
5740 int step_; | 5760 int step_; |
5741 int continuous_draws_; | 5761 int continuous_draws_; |
5742 bool expect_draw_; | |
5743 base::WaitableEvent playback_allowed_event_; | 5762 base::WaitableEvent playback_allowed_event_; |
5744 }; | 5763 }; |
5745 | 5764 |
5746 MULTI_THREAD_TEST_F(LayerTreeHostTestContinuousDrawWhenCreatingVisibleTiles); | 5765 MULTI_THREAD_TEST_F(LayerTreeHostTestContinuousDrawWhenCreatingVisibleTiles); |
5747 | 5766 |
5748 } // namespace cc | 5767 } // namespace cc |
OLD | NEW |