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

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: rebase + expand test 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
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 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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 2389 matching lines...) Expand 10 before | Expand all | Expand 10 after
5525 } 5540 }
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) {
danakj 2015/10/22 18:49:23 maybe rename always_draw to software?
boliu 2015/10/22 21:50:08 Done.
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
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() {
danakj 2015/10/22 18:49:23 SetResourcelessSoftwareDraw?
boliu 2015/10/22 21:50:08 Done.
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
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();
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
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

Powered by Google App Engine
This is Rietveld 408576698