| 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 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 void TearDown() override {} | 112 void TearDown() override {} |
| 113 | 113 |
| 114 void UpdateRendererCapabilitiesOnImplThread() override {} | 114 void UpdateRendererCapabilitiesOnImplThread() override {} |
| 115 void DidLoseOutputSurfaceOnImplThread() override {} | 115 void DidLoseOutputSurfaceOnImplThread() override {} |
| 116 void CommitVSyncParameters(base::TimeTicks timebase, | 116 void CommitVSyncParameters(base::TimeTicks timebase, |
| 117 base::TimeDelta interval) override {} | 117 base::TimeDelta interval) override {} |
| 118 void SetEstimatedParentDrawTime(base::TimeDelta draw_time) override {} | 118 void SetEstimatedParentDrawTime(base::TimeDelta draw_time) override {} |
| 119 void SetMaxSwapsPendingOnImplThread(int max) override {} | 119 void SetMaxSwapsPendingOnImplThread(int max) override {} |
| 120 void DidSwapBuffersOnImplThread() override {} | 120 void DidSwapBuffersOnImplThread() override {} |
| 121 void DidSwapBuffersCompleteOnImplThread() override {} | 121 void DidSwapBuffersCompleteOnImplThread() override {} |
| 122 void OnResourcelessSoftareDrawStateChanged(bool resourceless_draw) override {} |
| 122 void OnCanDrawStateChanged(bool can_draw) override { | 123 void OnCanDrawStateChanged(bool can_draw) override { |
| 123 on_can_draw_state_changed_called_ = true; | 124 on_can_draw_state_changed_called_ = true; |
| 124 } | 125 } |
| 125 void NotifyReadyToActivate() override { | 126 void NotifyReadyToActivate() override { |
| 126 did_notify_ready_to_activate_ = true; | 127 did_notify_ready_to_activate_ = true; |
| 127 host_impl_->ActivateSyncTree(); | 128 host_impl_->ActivateSyncTree(); |
| 128 } | 129 } |
| 129 void NotifyReadyToDraw() override {} | 130 void NotifyReadyToDraw() override {} |
| 130 void SetNeedsRedrawOnImplThread() override { did_request_redraw_ = true; } | 131 void SetNeedsRedrawOnImplThread() override { did_request_redraw_ = true; } |
| 131 void SetNeedsRedrawRectOnImplThread(const gfx::Rect& damage_rect) override { | 132 void SetNeedsRedrawRectOnImplThread(const gfx::Rect& damage_rect) override { |
| (...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 460 } | 461 } |
| 461 }; | 462 }; |
| 462 | 463 |
| 463 TEST_F(LayerTreeHostImplTest, NotifyIfCanDrawChanged) { | 464 TEST_F(LayerTreeHostImplTest, NotifyIfCanDrawChanged) { |
| 464 bool always_draw = false; | 465 bool always_draw = false; |
| 465 CheckNotifyCalledIfCanDrawChanged(always_draw); | 466 CheckNotifyCalledIfCanDrawChanged(always_draw); |
| 466 } | 467 } |
| 467 | 468 |
| 468 TEST_F(LayerTreeHostImplTest, CanDrawIncompleteFrames) { | 469 TEST_F(LayerTreeHostImplTest, CanDrawIncompleteFrames) { |
| 469 CreateHostImpl(DefaultSettings(), | 470 CreateHostImpl(DefaultSettings(), |
| 470 FakeOutputSurface::CreateAlwaysDrawAndSwap3d()); | 471 FakeOutputSurface::CreateSoftware( |
| 472 make_scoped_ptr(new SoftwareOutputDevice()))); |
| 473 const gfx::Transform external_transform; |
| 474 const gfx::Rect external_viewport; |
| 475 const gfx::Rect external_clip; |
| 476 const bool resourceless_software_draw = true; |
| 477 host_impl_->SetExternalDrawConstraints( |
| 478 external_transform, external_viewport, external_clip, external_viewport, |
| 479 external_transform, resourceless_software_draw); |
| 471 | 480 |
| 472 bool always_draw = true; | 481 bool always_draw = true; |
| 473 CheckNotifyCalledIfCanDrawChanged(always_draw); | 482 CheckNotifyCalledIfCanDrawChanged(always_draw); |
| 474 } | 483 } |
| 475 | 484 |
| 476 TEST_F(LayerTreeHostImplTest, ScrollDeltaNoLayers) { | 485 TEST_F(LayerTreeHostImplTest, ScrollDeltaNoLayers) { |
| 477 ASSERT_FALSE(host_impl_->active_tree()->root_layer()); | 486 ASSERT_FALSE(host_impl_->active_tree()->root_layer()); |
| 478 | 487 |
| 479 scoped_ptr<ScrollAndScaleSet> scroll_info = host_impl_->ProcessScrollDeltas(); | 488 scoped_ptr<ScrollAndScaleSet> scroll_info = host_impl_->ProcessScrollDeltas(); |
| 480 ASSERT_EQ(scroll_info->scrolls.size(), 0u); | 489 ASSERT_EQ(scroll_info->scrolls.size(), 0u); |
| (...skipping 2630 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3111 EXPECT_EQ(testcase.expected_result, PrepareToDrawFrame(&frame)); | 3120 EXPECT_EQ(testcase.expected_result, PrepareToDrawFrame(&frame)); |
| 3112 host_impl_->DrawLayers(&frame); | 3121 host_impl_->DrawLayers(&frame); |
| 3113 host_impl_->DidDrawAllLayers(frame); | 3122 host_impl_->DidDrawAllLayers(frame); |
| 3114 host_impl_->SwapBuffers(frame); | 3123 host_impl_->SwapBuffers(frame); |
| 3115 } | 3124 } |
| 3116 } | 3125 } |
| 3117 | 3126 |
| 3118 TEST_F(LayerTreeHostImplTest, | 3127 TEST_F(LayerTreeHostImplTest, |
| 3119 PrepareToDrawWhenDrawAndSwapFullViewportEveryFrame) { | 3128 PrepareToDrawWhenDrawAndSwapFullViewportEveryFrame) { |
| 3120 CreateHostImpl(DefaultSettings(), | 3129 CreateHostImpl(DefaultSettings(), |
| 3121 FakeOutputSurface::CreateAlwaysDrawAndSwap3d()); | 3130 FakeOutputSurface::CreateSoftware( |
| 3122 EXPECT_TRUE(host_impl_->output_surface() | 3131 make_scoped_ptr(new SoftwareOutputDevice()))); |
| 3123 ->capabilities() | 3132 |
| 3124 .draw_and_swap_full_viewport_every_frame); | 3133 const gfx::Transform external_transform; |
| 3134 const gfx::Rect external_viewport; |
| 3135 const gfx::Rect external_clip; |
| 3136 const bool resourceless_software_draw = true; |
| 3137 host_impl_->SetExternalDrawConstraints( |
| 3138 external_transform, external_viewport, external_clip, external_viewport, |
| 3139 external_transform, resourceless_software_draw); |
| 3125 | 3140 |
| 3126 std::vector<PrepareToDrawSuccessTestCase> cases; | 3141 std::vector<PrepareToDrawSuccessTestCase> cases; |
| 3127 | 3142 |
| 3128 // 0. Default case. | 3143 // 0. Default case. |
| 3129 cases.push_back(PrepareToDrawSuccessTestCase(DRAW_SUCCESS)); | 3144 cases.push_back(PrepareToDrawSuccessTestCase(DRAW_SUCCESS)); |
| 3130 // 1. Animation with missing tile. | 3145 // 1. Animation with missing tile. |
| 3131 cases.push_back(PrepareToDrawSuccessTestCase(DRAW_SUCCESS)); | 3146 cases.push_back(PrepareToDrawSuccessTestCase(DRAW_SUCCESS)); |
| 3132 cases.back().layer_between.has_missing_tile = true; | 3147 cases.back().layer_between.has_missing_tile = true; |
| 3133 cases.back().layer_between.is_animating = true; | 3148 cases.back().layer_between.is_animating = true; |
| 3134 // 2. High res required with incomplete tile. | 3149 // 2. High res required with incomplete tile. |
| (...skipping 2388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5523 host_impl_->DidDrawAllLayers(frame); | 5538 host_impl_->DidDrawAllLayers(frame); |
| 5524 } | 5539 } |
| 5525 | 5540 |
| 5526 class LayerTreeHostImplViewportCoveredTest : public LayerTreeHostImplTest { | 5541 class LayerTreeHostImplViewportCoveredTest : public LayerTreeHostImplTest { |
| 5527 protected: | 5542 protected: |
| 5528 LayerTreeHostImplViewportCoveredTest() : | 5543 LayerTreeHostImplViewportCoveredTest() : |
| 5529 gutter_quad_material_(DrawQuad::SOLID_COLOR), | 5544 gutter_quad_material_(DrawQuad::SOLID_COLOR), |
| 5530 child_(NULL), | 5545 child_(NULL), |
| 5531 did_activate_pending_tree_(false) {} | 5546 did_activate_pending_tree_(false) {} |
| 5532 | 5547 |
| 5533 scoped_ptr<OutputSurface> CreateFakeOutputSurface(bool always_draw) { | 5548 scoped_ptr<OutputSurface> CreateFakeOutputSurface(bool software) { |
| 5534 if (always_draw) { | 5549 if (software) { |
| 5535 return FakeOutputSurface::CreateAlwaysDrawAndSwap3d(); | 5550 return FakeOutputSurface::CreateSoftware( |
| 5551 make_scoped_ptr(new SoftwareOutputDevice())); |
| 5536 } | 5552 } |
| 5537 return FakeOutputSurface::Create3d(); | 5553 return FakeOutputSurface::Create3d(); |
| 5538 } | 5554 } |
| 5539 | 5555 |
| 5540 void SetupActiveTreeLayers() { | 5556 void SetupActiveTreeLayers() { |
| 5541 host_impl_->active_tree()->set_background_color(SK_ColorGRAY); | 5557 host_impl_->active_tree()->set_background_color(SK_ColorGRAY); |
| 5542 host_impl_->active_tree()->SetRootLayer( | 5558 host_impl_->active_tree()->SetRootLayer( |
| 5543 LayerImpl::Create(host_impl_->active_tree(), 1)); | 5559 LayerImpl::Create(host_impl_->active_tree(), 1)); |
| 5544 host_impl_->active_tree()->root_layer()->SetHasRenderSurface(true); | 5560 host_impl_->active_tree()->root_layer()->SetHasRenderSurface(true); |
| 5545 host_impl_->active_tree()->root_layer()->AddChild( | 5561 host_impl_->active_tree()->root_layer()->AddChild( |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5675 texture_quad->uv_bottom_right.y(), | 5691 texture_quad->uv_bottom_right.y(), |
| 5676 texture_quad->rect.bottom() / gutter_texture_size_pixels.height()); | 5692 texture_quad->rect.bottom() / gutter_texture_size_pixels.height()); |
| 5677 } | 5693 } |
| 5678 } | 5694 } |
| 5679 | 5695 |
| 5680 gfx::Size DipSizeToPixelSize(const gfx::Size& size) { | 5696 gfx::Size DipSizeToPixelSize(const gfx::Size& size) { |
| 5681 return gfx::ScaleToRoundedSize( | 5697 return gfx::ScaleToRoundedSize( |
| 5682 size, host_impl_->active_tree()->device_scale_factor()); | 5698 size, host_impl_->active_tree()->device_scale_factor()); |
| 5683 } | 5699 } |
| 5684 | 5700 |
| 5701 void SetResourcelessSoftwareDraw() { |
| 5702 const gfx::Transform external_transform; |
| 5703 const gfx::Rect external_viewport; |
| 5704 const gfx::Rect external_clip; |
| 5705 const bool resourceless_software_draw = true; |
| 5706 host_impl_->SetExternalDrawConstraints( |
| 5707 external_transform, external_viewport, external_clip, external_viewport, |
| 5708 external_transform, resourceless_software_draw); |
| 5709 } |
| 5710 |
| 5685 DrawQuad::Material gutter_quad_material_; | 5711 DrawQuad::Material gutter_quad_material_; |
| 5686 gfx::Size gutter_texture_size_; | 5712 gfx::Size gutter_texture_size_; |
| 5687 gfx::Size viewport_size_; | 5713 gfx::Size viewport_size_; |
| 5688 BlendStateCheckLayer* child_; | 5714 BlendStateCheckLayer* child_; |
| 5689 bool did_activate_pending_tree_; | 5715 bool did_activate_pending_tree_; |
| 5690 }; | 5716 }; |
| 5691 | 5717 |
| 5692 TEST_F(LayerTreeHostImplViewportCoveredTest, ViewportCovered) { | 5718 TEST_F(LayerTreeHostImplViewportCoveredTest, ViewportCovered) { |
| 5693 viewport_size_ = gfx::Size(1000, 1000); | 5719 viewport_size_ = gfx::Size(1000, 1000); |
| 5694 | 5720 |
| 5695 bool always_draw = false; | 5721 bool software = false; |
| 5696 CreateHostImpl(DefaultSettings(), CreateFakeOutputSurface(always_draw)); | 5722 CreateHostImpl(DefaultSettings(), CreateFakeOutputSurface(software)); |
| 5697 | 5723 |
| 5698 host_impl_->SetViewportSize(DipSizeToPixelSize(viewport_size_)); | 5724 host_impl_->SetViewportSize(DipSizeToPixelSize(viewport_size_)); |
| 5699 SetupActiveTreeLayers(); | 5725 SetupActiveTreeLayers(); |
| 5700 TestLayerCoversFullViewport(); | 5726 TestLayerCoversFullViewport(); |
| 5701 TestEmptyLayer(); | 5727 TestEmptyLayer(); |
| 5702 TestLayerInMiddleOfViewport(); | 5728 TestLayerInMiddleOfViewport(); |
| 5703 TestLayerIsLargerThanViewport(); | 5729 TestLayerIsLargerThanViewport(); |
| 5704 } | 5730 } |
| 5705 | 5731 |
| 5706 TEST_F(LayerTreeHostImplViewportCoveredTest, ViewportCoveredScaled) { | 5732 TEST_F(LayerTreeHostImplViewportCoveredTest, ViewportCoveredScaled) { |
| 5707 viewport_size_ = gfx::Size(1000, 1000); | 5733 viewport_size_ = gfx::Size(1000, 1000); |
| 5708 | 5734 |
| 5709 bool always_draw = false; | 5735 bool software = false; |
| 5710 CreateHostImpl(DefaultSettings(), CreateFakeOutputSurface(always_draw)); | 5736 CreateHostImpl(DefaultSettings(), CreateFakeOutputSurface(software)); |
| 5711 | 5737 |
| 5712 host_impl_->active_tree()->SetDeviceScaleFactor(2.f); | 5738 host_impl_->active_tree()->SetDeviceScaleFactor(2.f); |
| 5713 host_impl_->SetViewportSize(DipSizeToPixelSize(viewport_size_)); | 5739 host_impl_->SetViewportSize(DipSizeToPixelSize(viewport_size_)); |
| 5714 SetupActiveTreeLayers(); | 5740 SetupActiveTreeLayers(); |
| 5715 TestLayerCoversFullViewport(); | 5741 TestLayerCoversFullViewport(); |
| 5716 TestEmptyLayer(); | 5742 TestEmptyLayer(); |
| 5717 TestLayerInMiddleOfViewport(); | 5743 TestLayerInMiddleOfViewport(); |
| 5718 TestLayerIsLargerThanViewport(); | 5744 TestLayerIsLargerThanViewport(); |
| 5719 } | 5745 } |
| 5720 | 5746 |
| 5721 TEST_F(LayerTreeHostImplViewportCoveredTest, ActiveTreeGrowViewportInvalid) { | 5747 TEST_F(LayerTreeHostImplViewportCoveredTest, ActiveTreeGrowViewportInvalid) { |
| 5722 viewport_size_ = gfx::Size(1000, 1000); | 5748 viewport_size_ = gfx::Size(1000, 1000); |
| 5723 | 5749 |
| 5724 bool always_draw = true; | 5750 bool software = true; |
| 5725 CreateHostImpl(DefaultSettings(), CreateFakeOutputSurface(always_draw)); | 5751 CreateHostImpl(DefaultSettings(), CreateFakeOutputSurface(software)); |
| 5752 SetResourcelessSoftwareDraw(); |
| 5726 | 5753 |
| 5727 // Pending tree to force active_tree size invalid. Not used otherwise. | 5754 // Pending tree to force active_tree size invalid. Not used otherwise. |
| 5728 host_impl_->CreatePendingTree(); | 5755 host_impl_->CreatePendingTree(); |
| 5729 host_impl_->SetViewportSize(DipSizeToPixelSize(viewport_size_)); | 5756 host_impl_->SetViewportSize(DipSizeToPixelSize(viewport_size_)); |
| 5730 EXPECT_TRUE(host_impl_->active_tree()->ViewportSizeInvalid()); | 5757 EXPECT_TRUE(host_impl_->active_tree()->ViewportSizeInvalid()); |
| 5731 | 5758 |
| 5732 SetupActiveTreeLayers(); | 5759 SetupActiveTreeLayers(); |
| 5733 TestEmptyLayer(); | 5760 TestEmptyLayer(); |
| 5734 TestLayerInMiddleOfViewport(); | 5761 TestLayerInMiddleOfViewport(); |
| 5735 TestLayerIsLargerThanViewport(); | 5762 TestLayerIsLargerThanViewport(); |
| 5736 } | 5763 } |
| 5737 | 5764 |
| 5738 TEST_F(LayerTreeHostImplViewportCoveredTest, ActiveTreeShrinkViewportInvalid) { | 5765 TEST_F(LayerTreeHostImplViewportCoveredTest, ActiveTreeShrinkViewportInvalid) { |
| 5739 viewport_size_ = gfx::Size(1000, 1000); | 5766 viewport_size_ = gfx::Size(1000, 1000); |
| 5740 | 5767 |
| 5741 bool always_draw = true; | 5768 bool software = true; |
| 5742 CreateHostImpl(DefaultSettings(), CreateFakeOutputSurface(always_draw)); | 5769 CreateHostImpl(DefaultSettings(), CreateFakeOutputSurface(software)); |
| 5770 SetResourcelessSoftwareDraw(); |
| 5743 | 5771 |
| 5744 // Set larger viewport and activate it to active tree. | 5772 // Set larger viewport and activate it to active tree. |
| 5745 host_impl_->CreatePendingTree(); | 5773 host_impl_->CreatePendingTree(); |
| 5746 gfx::Size larger_viewport(viewport_size_.width() + 100, | 5774 gfx::Size larger_viewport(viewport_size_.width() + 100, |
| 5747 viewport_size_.height() + 100); | 5775 viewport_size_.height() + 100); |
| 5748 host_impl_->SetViewportSize(DipSizeToPixelSize(larger_viewport)); | 5776 host_impl_->SetViewportSize(DipSizeToPixelSize(larger_viewport)); |
| 5749 EXPECT_TRUE(host_impl_->active_tree()->ViewportSizeInvalid()); | 5777 EXPECT_TRUE(host_impl_->active_tree()->ViewportSizeInvalid()); |
| 5750 host_impl_->ActivateSyncTree(); | 5778 host_impl_->ActivateSyncTree(); |
| 5751 EXPECT_TRUE(did_activate_pending_tree_); | 5779 EXPECT_TRUE(did_activate_pending_tree_); |
| 5752 EXPECT_FALSE(host_impl_->active_tree()->ViewportSizeInvalid()); | 5780 EXPECT_FALSE(host_impl_->active_tree()->ViewportSizeInvalid()); |
| (...skipping 2465 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 634 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8877 host_impl_->ActivateSyncTree(); | 8902 host_impl_->ActivateSyncTree(); |
| 8878 host_impl_->active_tree()->UpdateDrawProperties(false); | 8903 host_impl_->active_tree()->UpdateDrawProperties(false); |
| 8879 active_tree_node = | 8904 active_tree_node = |
| 8880 host_impl_->active_tree()->property_trees()->transform_tree.Node( | 8905 host_impl_->active_tree()->property_trees()->transform_tree.Node( |
| 8881 page_scale_layer->transform_tree_index()); | 8906 page_scale_layer->transform_tree_index()); |
| 8882 EXPECT_EQ(active_tree_node->data.post_local_scale_factor, 2.f); | 8907 EXPECT_EQ(active_tree_node->data.post_local_scale_factor, 2.f); |
| 8883 } | 8908 } |
| 8884 | 8909 |
| 8885 } // namespace | 8910 } // namespace |
| 8886 } // namespace cc | 8911 } // namespace cc |
| OLD | NEW |