Chromium Code Reviews| 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_impl.h" | 5 #include "cc/trees/layer_tree_host_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 113 void TearDown() override {} | 113 void TearDown() override {} |
| 114 | 114 |
| 115 void UpdateRendererCapabilitiesOnImplThread() override {} | 115 void UpdateRendererCapabilitiesOnImplThread() override {} |
| 116 void DidLoseOutputSurfaceOnImplThread() override {} | 116 void DidLoseOutputSurfaceOnImplThread() override {} |
| 117 void CommitVSyncParameters(base::TimeTicks timebase, | 117 void CommitVSyncParameters(base::TimeTicks timebase, |
| 118 base::TimeDelta interval) override {} | 118 base::TimeDelta interval) override {} |
| 119 void SetEstimatedParentDrawTime(base::TimeDelta draw_time) override {} | 119 void SetEstimatedParentDrawTime(base::TimeDelta draw_time) override {} |
| 120 void SetMaxSwapsPendingOnImplThread(int max) override {} | 120 void SetMaxSwapsPendingOnImplThread(int max) override {} |
| 121 void DidSwapBuffersOnImplThread() override {} | 121 void DidSwapBuffersOnImplThread() override {} |
| 122 void DidSwapBuffersCompleteOnImplThread() override {} | 122 void DidSwapBuffersCompleteOnImplThread() override {} |
| 123 void OnResourcelessSoftareDrawStateChanged(bool resourceless_draw) override {} | |
| 123 void OnCanDrawStateChanged(bool can_draw) override { | 124 void OnCanDrawStateChanged(bool can_draw) override { |
| 124 on_can_draw_state_changed_called_ = true; | 125 on_can_draw_state_changed_called_ = true; |
| 125 } | 126 } |
| 126 void NotifyReadyToActivate() override { | 127 void NotifyReadyToActivate() override { |
| 127 did_notify_ready_to_activate_ = true; | 128 did_notify_ready_to_activate_ = true; |
| 128 host_impl_->ActivateSyncTree(); | 129 host_impl_->ActivateSyncTree(); |
| 129 } | 130 } |
| 130 void NotifyReadyToDraw() override {} | 131 void NotifyReadyToDraw() override {} |
| 131 void SetNeedsRedrawOnImplThread() override { did_request_redraw_ = true; } | 132 void SetNeedsRedrawOnImplThread() override { did_request_redraw_ = true; } |
| 132 void SetNeedsRedrawRectOnImplThread(const gfx::Rect& damage_rect) override { | 133 void SetNeedsRedrawRectOnImplThread(const gfx::Rect& damage_rect) override { |
| (...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 461 } | 462 } |
| 462 }; | 463 }; |
| 463 | 464 |
| 464 TEST_F(LayerTreeHostImplTest, NotifyIfCanDrawChanged) { | 465 TEST_F(LayerTreeHostImplTest, NotifyIfCanDrawChanged) { |
| 465 bool always_draw = false; | 466 bool always_draw = false; |
| 466 CheckNotifyCalledIfCanDrawChanged(always_draw); | 467 CheckNotifyCalledIfCanDrawChanged(always_draw); |
| 467 } | 468 } |
| 468 | 469 |
| 469 TEST_F(LayerTreeHostImplTest, CanDrawIncompleteFrames) { | 470 TEST_F(LayerTreeHostImplTest, CanDrawIncompleteFrames) { |
| 470 CreateHostImpl(DefaultSettings(), | 471 CreateHostImpl(DefaultSettings(), |
| 471 FakeOutputSurface::CreateAlwaysDrawAndSwap3d()); | 472 FakeOutputSurface::CreateSoftware( |
| 473 make_scoped_ptr(new SoftwareOutputDevice()))); | |
| 474 const gfx::Transform external_transform; | |
| 475 const gfx::Rect external_viewport; | |
| 476 const gfx::Rect external_clip; | |
| 477 const bool resourceless_software_draw = true; | |
| 478 host_impl_->SetExternalDrawConstraints( | |
| 479 external_transform, external_viewport, external_clip, external_viewport, | |
| 480 external_transform, resourceless_software_draw); | |
| 472 | 481 |
| 473 bool always_draw = true; | 482 bool always_draw = true; |
| 474 CheckNotifyCalledIfCanDrawChanged(always_draw); | 483 CheckNotifyCalledIfCanDrawChanged(always_draw); |
| 475 } | 484 } |
| 476 | 485 |
| 477 TEST_F(LayerTreeHostImplTest, ScrollDeltaNoLayers) { | 486 TEST_F(LayerTreeHostImplTest, ScrollDeltaNoLayers) { |
| 478 ASSERT_FALSE(host_impl_->active_tree()->root_layer()); | 487 ASSERT_FALSE(host_impl_->active_tree()->root_layer()); |
| 479 | 488 |
| 480 scoped_ptr<ScrollAndScaleSet> scroll_info = host_impl_->ProcessScrollDeltas(); | 489 scoped_ptr<ScrollAndScaleSet> scroll_info = host_impl_->ProcessScrollDeltas(); |
| 481 ASSERT_EQ(scroll_info->scrolls.size(), 0u); | 490 ASSERT_EQ(scroll_info->scrolls.size(), 0u); |
| (...skipping 2630 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3112 EXPECT_EQ(testcase.expected_result, PrepareToDrawFrame(&frame)); | 3121 EXPECT_EQ(testcase.expected_result, PrepareToDrawFrame(&frame)); |
| 3113 host_impl_->DrawLayers(&frame); | 3122 host_impl_->DrawLayers(&frame); |
| 3114 host_impl_->DidDrawAllLayers(frame); | 3123 host_impl_->DidDrawAllLayers(frame); |
| 3115 host_impl_->SwapBuffers(frame); | 3124 host_impl_->SwapBuffers(frame); |
| 3116 } | 3125 } |
| 3117 } | 3126 } |
| 3118 | 3127 |
| 3119 TEST_F(LayerTreeHostImplTest, | 3128 TEST_F(LayerTreeHostImplTest, |
| 3120 PrepareToDrawWhenDrawAndSwapFullViewportEveryFrame) { | 3129 PrepareToDrawWhenDrawAndSwapFullViewportEveryFrame) { |
| 3121 CreateHostImpl(DefaultSettings(), | 3130 CreateHostImpl(DefaultSettings(), |
| 3122 FakeOutputSurface::CreateAlwaysDrawAndSwap3d()); | 3131 FakeOutputSurface::CreateSoftware( |
| 3123 EXPECT_TRUE(host_impl_->output_surface() | 3132 make_scoped_ptr(new SoftwareOutputDevice()))); |
| 3124 ->capabilities() | 3133 |
| 3125 .draw_and_swap_full_viewport_every_frame); | 3134 const gfx::Transform external_transform; |
| 3135 const gfx::Rect external_viewport; | |
| 3136 const gfx::Rect external_clip; | |
| 3137 const bool resourceless_software_draw = true; | |
| 3138 host_impl_->SetExternalDrawConstraints( | |
| 3139 external_transform, external_viewport, external_clip, external_viewport, | |
| 3140 external_transform, resourceless_software_draw); | |
| 3126 | 3141 |
| 3127 std::vector<PrepareToDrawSuccessTestCase> cases; | 3142 std::vector<PrepareToDrawSuccessTestCase> cases; |
| 3128 | 3143 |
| 3129 // 0. Default case. | 3144 // 0. Default case. |
| 3130 cases.push_back(PrepareToDrawSuccessTestCase(DRAW_SUCCESS)); | 3145 cases.push_back(PrepareToDrawSuccessTestCase(DRAW_SUCCESS)); |
| 3131 // 1. Animation with missing tile. | 3146 // 1. Animation with missing tile. |
| 3132 cases.push_back(PrepareToDrawSuccessTestCase(DRAW_SUCCESS)); | 3147 cases.push_back(PrepareToDrawSuccessTestCase(DRAW_SUCCESS)); |
| 3133 cases.back().layer_between.has_missing_tile = true; | 3148 cases.back().layer_between.has_missing_tile = true; |
| 3134 cases.back().layer_between.is_animating = true; | 3149 cases.back().layer_between.is_animating = true; |
| 3135 // 2. High res required with incomplete tile. | 3150 // 2. High res required with incomplete tile. |
| (...skipping 2390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5526 | 5541 |
| 5527 class LayerTreeHostImplViewportCoveredTest : public LayerTreeHostImplTest { | 5542 class LayerTreeHostImplViewportCoveredTest : public LayerTreeHostImplTest { |
| 5528 protected: | 5543 protected: |
| 5529 LayerTreeHostImplViewportCoveredTest() : | 5544 LayerTreeHostImplViewportCoveredTest() : |
| 5530 gutter_quad_material_(DrawQuad::SOLID_COLOR), | 5545 gutter_quad_material_(DrawQuad::SOLID_COLOR), |
| 5531 child_(NULL), | 5546 child_(NULL), |
| 5532 did_activate_pending_tree_(false) {} | 5547 did_activate_pending_tree_(false) {} |
| 5533 | 5548 |
| 5534 scoped_ptr<OutputSurface> CreateFakeOutputSurface(bool always_draw) { | 5549 scoped_ptr<OutputSurface> CreateFakeOutputSurface(bool always_draw) { |
| 5535 if (always_draw) { | 5550 if (always_draw) { |
| 5536 return FakeOutputSurface::CreateAlwaysDrawAndSwap3d(); | 5551 return FakeOutputSurface::CreateSoftware( |
| 5552 make_scoped_ptr(new SoftwareOutputDevice())); | |
| 5537 } | 5553 } |
| 5538 return FakeOutputSurface::Create3d(); | 5554 return FakeOutputSurface::Create3d(); |
| 5539 } | 5555 } |
| 5540 | 5556 |
| 5541 void SetupActiveTreeLayers() { | 5557 void SetupActiveTreeLayers() { |
| 5542 host_impl_->active_tree()->set_background_color(SK_ColorGRAY); | 5558 host_impl_->active_tree()->set_background_color(SK_ColorGRAY); |
| 5543 host_impl_->active_tree()->SetRootLayer( | 5559 host_impl_->active_tree()->SetRootLayer( |
| 5544 LayerImpl::Create(host_impl_->active_tree(), 1)); | 5560 LayerImpl::Create(host_impl_->active_tree(), 1)); |
| 5545 host_impl_->active_tree()->root_layer()->SetHasRenderSurface(true); | 5561 host_impl_->active_tree()->root_layer()->SetHasRenderSurface(true); |
| 5546 host_impl_->active_tree()->root_layer()->AddChild( | 5562 host_impl_->active_tree()->root_layer()->AddChild( |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5676 texture_quad->uv_bottom_right.y(), | 5692 texture_quad->uv_bottom_right.y(), |
| 5677 texture_quad->rect.bottom() / gutter_texture_size_pixels.height()); | 5693 texture_quad->rect.bottom() / gutter_texture_size_pixels.height()); |
| 5678 } | 5694 } |
| 5679 } | 5695 } |
| 5680 | 5696 |
| 5681 gfx::Size DipSizeToPixelSize(const gfx::Size& size) { | 5697 gfx::Size DipSizeToPixelSize(const gfx::Size& size) { |
| 5682 return gfx::ScaleToRoundedSize( | 5698 return gfx::ScaleToRoundedSize( |
| 5683 size, host_impl_->active_tree()->device_scale_factor()); | 5699 size, host_impl_->active_tree()->device_scale_factor()); |
| 5684 } | 5700 } |
| 5685 | 5701 |
| 5702 void SetAlwaysDraw() { | |
| 5703 const gfx::Transform external_transform; | |
| 5704 const gfx::Rect external_viewport; | |
| 5705 const gfx::Rect external_clip; | |
| 5706 const bool resourceless_software_draw = true; | |
| 5707 host_impl_->SetExternalDrawConstraints( | |
| 5708 external_transform, external_viewport, external_clip, external_viewport, | |
| 5709 external_transform, resourceless_software_draw); | |
| 5710 } | |
| 5711 | |
| 5686 DrawQuad::Material gutter_quad_material_; | 5712 DrawQuad::Material gutter_quad_material_; |
| 5687 gfx::Size gutter_texture_size_; | 5713 gfx::Size gutter_texture_size_; |
| 5688 gfx::Size viewport_size_; | 5714 gfx::Size viewport_size_; |
| 5689 BlendStateCheckLayer* child_; | 5715 BlendStateCheckLayer* child_; |
| 5690 bool did_activate_pending_tree_; | 5716 bool did_activate_pending_tree_; |
| 5691 }; | 5717 }; |
| 5692 | 5718 |
| 5693 TEST_F(LayerTreeHostImplViewportCoveredTest, ViewportCovered) { | 5719 TEST_F(LayerTreeHostImplViewportCoveredTest, ViewportCovered) { |
| 5694 viewport_size_ = gfx::Size(1000, 1000); | 5720 viewport_size_ = gfx::Size(1000, 1000); |
| 5695 | 5721 |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 5717 TestEmptyLayer(); | 5743 TestEmptyLayer(); |
| 5718 TestLayerInMiddleOfViewport(); | 5744 TestLayerInMiddleOfViewport(); |
| 5719 TestLayerIsLargerThanViewport(); | 5745 TestLayerIsLargerThanViewport(); |
| 5720 } | 5746 } |
| 5721 | 5747 |
| 5722 TEST_F(LayerTreeHostImplViewportCoveredTest, ActiveTreeGrowViewportInvalid) { | 5748 TEST_F(LayerTreeHostImplViewportCoveredTest, ActiveTreeGrowViewportInvalid) { |
| 5723 viewport_size_ = gfx::Size(1000, 1000); | 5749 viewport_size_ = gfx::Size(1000, 1000); |
| 5724 | 5750 |
| 5725 bool always_draw = true; | 5751 bool always_draw = true; |
| 5726 CreateHostImpl(DefaultSettings(), CreateFakeOutputSurface(always_draw)); | 5752 CreateHostImpl(DefaultSettings(), CreateFakeOutputSurface(always_draw)); |
| 5753 SetAlwaysDraw(); | |
|
brianderson
2015/10/21 22:43:04
Why isn't this called from other LayerTreeHostImpl
boliu
2015/10/21 22:46:34
The above two tests have always_draw = false.
| |
| 5727 | 5754 |
| 5728 // Pending tree to force active_tree size invalid. Not used otherwise. | 5755 // Pending tree to force active_tree size invalid. Not used otherwise. |
| 5729 host_impl_->CreatePendingTree(); | 5756 host_impl_->CreatePendingTree(); |
| 5730 host_impl_->SetViewportSize(DipSizeToPixelSize(viewport_size_)); | 5757 host_impl_->SetViewportSize(DipSizeToPixelSize(viewport_size_)); |
| 5731 EXPECT_TRUE(host_impl_->active_tree()->ViewportSizeInvalid()); | 5758 EXPECT_TRUE(host_impl_->active_tree()->ViewportSizeInvalid()); |
| 5732 | 5759 |
| 5733 SetupActiveTreeLayers(); | 5760 SetupActiveTreeLayers(); |
| 5734 TestEmptyLayer(); | 5761 TestEmptyLayer(); |
| 5735 TestLayerInMiddleOfViewport(); | 5762 TestLayerInMiddleOfViewport(); |
| 5736 TestLayerIsLargerThanViewport(); | 5763 TestLayerIsLargerThanViewport(); |
| 5737 } | 5764 } |
| 5738 | 5765 |
| 5739 TEST_F(LayerTreeHostImplViewportCoveredTest, ActiveTreeShrinkViewportInvalid) { | 5766 TEST_F(LayerTreeHostImplViewportCoveredTest, ActiveTreeShrinkViewportInvalid) { |
| 5740 viewport_size_ = gfx::Size(1000, 1000); | 5767 viewport_size_ = gfx::Size(1000, 1000); |
| 5741 | 5768 |
| 5742 bool always_draw = true; | 5769 bool always_draw = true; |
| 5743 CreateHostImpl(DefaultSettings(), CreateFakeOutputSurface(always_draw)); | 5770 CreateHostImpl(DefaultSettings(), CreateFakeOutputSurface(always_draw)); |
| 5771 SetAlwaysDraw(); | |
| 5744 | 5772 |
| 5745 // Set larger viewport and activate it to active tree. | 5773 // Set larger viewport and activate it to active tree. |
| 5746 host_impl_->CreatePendingTree(); | 5774 host_impl_->CreatePendingTree(); |
| 5747 gfx::Size larger_viewport(viewport_size_.width() + 100, | 5775 gfx::Size larger_viewport(viewport_size_.width() + 100, |
| 5748 viewport_size_.height() + 100); | 5776 viewport_size_.height() + 100); |
| 5749 host_impl_->SetViewportSize(DipSizeToPixelSize(larger_viewport)); | 5777 host_impl_->SetViewportSize(DipSizeToPixelSize(larger_viewport)); |
| 5750 EXPECT_TRUE(host_impl_->active_tree()->ViewportSizeInvalid()); | 5778 EXPECT_TRUE(host_impl_->active_tree()->ViewportSizeInvalid()); |
| 5751 host_impl_->ActivateSyncTree(); | 5779 host_impl_->ActivateSyncTree(); |
| 5752 EXPECT_TRUE(did_activate_pending_tree_); | 5780 EXPECT_TRUE(did_activate_pending_tree_); |
| 5753 EXPECT_FALSE(host_impl_->active_tree()->ViewportSizeInvalid()); | 5781 EXPECT_FALSE(host_impl_->active_tree()->ViewportSizeInvalid()); |
| (...skipping 2464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 8218 // Resourceless software draw toggles do not need redraw. Damage is | 8246 // Resourceless software draw toggles do not need redraw. Damage is |
| 8219 // set externally by SynchronousCompositorOutputSurface in this case. | 8247 // set externally by SynchronousCompositorOutputSurface in this case. |
| 8220 | 8248 |
| 8221 // Setting resourceless_software_draw do not need redraw. | 8249 // Setting resourceless_software_draw do not need redraw. |
| 8222 did_request_redraw_ = false; | 8250 did_request_redraw_ = false; |
| 8223 resourceless_software_draw = true; | 8251 resourceless_software_draw = true; |
| 8224 host_impl_->SetExternalDrawConstraints( | 8252 host_impl_->SetExternalDrawConstraints( |
| 8225 external_transform, external_viewport, external_clip1, external_viewport, | 8253 external_transform, external_viewport, external_clip1, external_viewport, |
| 8226 external_transform, resourceless_software_draw); | 8254 external_transform, resourceless_software_draw); |
| 8227 EXPECT_FALSE(did_request_redraw_); | 8255 EXPECT_FALSE(did_request_redraw_); |
| 8228 { | 8256 // Can't call PrepareToDrawFrame with no change for resourceless software |
| 8229 LayerTreeHostImpl::FrameData frame; | 8257 // draw. |
| 8230 EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(&frame)); | |
| 8231 EXPECT_TRUE(frame.has_no_damage); | |
| 8232 } | |
| 8233 | 8258 |
| 8234 // Unsetting resourceless_software_draw do not need redraw. | 8259 // Unsetting resourceless_software_draw do not need redraw. |
| 8235 did_request_redraw_ = false; | 8260 did_request_redraw_ = false; |
| 8236 resourceless_software_draw = false; | 8261 resourceless_software_draw = false; |
| 8237 host_impl_->SetExternalDrawConstraints( | 8262 host_impl_->SetExternalDrawConstraints( |
| 8238 external_transform, external_viewport, external_clip2, external_viewport, | 8263 external_transform, external_viewport, external_clip2, external_viewport, |
| 8239 external_transform, resourceless_software_draw); | 8264 external_transform, resourceless_software_draw); |
| 8240 EXPECT_FALSE(did_request_redraw_); | 8265 EXPECT_FALSE(did_request_redraw_); |
| 8241 { | 8266 { |
| 8242 LayerTreeHostImpl::FrameData frame; | 8267 LayerTreeHostImpl::FrameData frame; |
| (...skipping 593 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 8836 host_impl_->ActivateSyncTree(); | 8861 host_impl_->ActivateSyncTree(); |
| 8837 host_impl_->active_tree()->UpdateDrawProperties(false); | 8862 host_impl_->active_tree()->UpdateDrawProperties(false); |
| 8838 active_tree_node = | 8863 active_tree_node = |
| 8839 host_impl_->active_tree()->property_trees()->transform_tree.Node( | 8864 host_impl_->active_tree()->property_trees()->transform_tree.Node( |
| 8840 page_scale_layer->transform_tree_index()); | 8865 page_scale_layer->transform_tree_index()); |
| 8841 EXPECT_EQ(active_tree_node->data.post_local_scale_factor, 2.f); | 8866 EXPECT_EQ(active_tree_node->data.post_local_scale_factor, 2.f); |
| 8842 } | 8867 } |
| 8843 | 8868 |
| 8844 } // namespace | 8869 } // namespace |
| 8845 } // namespace cc | 8870 } // namespace cc |
| OLD | NEW |