Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(625)

Side by Side Diff: cc/trees/layer_tree_host_impl_unittest.cc

Issue 1394263004: android webview: allow cc to fail hardware draw (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: damage before hardware to avoid invalidate-draw loop Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/trees/layer_tree_host_impl.cc ('k') | cc/trees/layer_tree_host_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host_impl.cc ('k') | cc/trees/layer_tree_host_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698