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

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

Issue 1418273002: cc: Move draw params from SetExternalDrawConstraints to OnDraw (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: EXPECT_SCOPED Created 5 years 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 #include <utility>
9 10
10 #include "base/bind.h" 11 #include "base/bind.h"
11 #include "base/command_line.h" 12 #include "base/command_line.h"
12 #include "base/containers/hash_tables.h" 13 #include "base/containers/hash_tables.h"
13 #include "base/containers/scoped_ptr_hash_map.h" 14 #include "base/containers/scoped_ptr_hash_map.h"
14 #include "base/location.h" 15 #include "base/location.h"
15 #include "base/thread_task_runner_handle.h" 16 #include "base/thread_task_runner_handle.h"
16 #include "cc/animation/scrollbar_animation_controller_thinning.h" 17 #include "cc/animation/scrollbar_animation_controller_thinning.h"
17 #include "cc/animation/transform_operations.h" 18 #include "cc/animation/transform_operations.h"
18 #include "cc/base/math_util.h" 19 #include "cc/base/math_util.h"
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 #include "cc/trees/layer_tree_impl.h" 62 #include "cc/trees/layer_tree_impl.h"
62 #include "cc/trees/single_thread_proxy.h" 63 #include "cc/trees/single_thread_proxy.h"
63 #include "media/base/media.h" 64 #include "media/base/media.h"
64 #include "testing/gmock/include/gmock/gmock.h" 65 #include "testing/gmock/include/gmock/gmock.h"
65 #include "testing/gtest/include/gtest/gtest.h" 66 #include "testing/gtest/include/gtest/gtest.h"
66 #include "third_party/skia/include/core/SkMallocPixelRef.h" 67 #include "third_party/skia/include/core/SkMallocPixelRef.h"
67 #include "ui/gfx/geometry/rect_conversions.h" 68 #include "ui/gfx/geometry/rect_conversions.h"
68 #include "ui/gfx/geometry/size_conversions.h" 69 #include "ui/gfx/geometry/size_conversions.h"
69 #include "ui/gfx/geometry/vector2d_conversions.h" 70 #include "ui/gfx/geometry/vector2d_conversions.h"
70 71
72 #define EXPECT_SCOPED(statements) \
73 { \
74 SCOPED_TRACE(""); \
75 statements; \
76 }
77
71 using ::testing::Mock; 78 using ::testing::Mock;
72 using ::testing::Return; 79 using ::testing::Return;
73 using ::testing::AnyNumber; 80 using ::testing::AnyNumber;
74 using ::testing::AtLeast; 81 using ::testing::AtLeast;
75 using ::testing::_; 82 using ::testing::_;
76 using media::VideoFrame; 83 using media::VideoFrame;
77 84
78 namespace cc { 85 namespace cc {
79 namespace { 86 namespace {
80 87
81 class LayerTreeHostImplTest : public testing::Test, 88 class LayerTreeHostImplTest : public testing::Test,
82 public LayerTreeHostImplClient { 89 public LayerTreeHostImplClient {
83 public: 90 public:
84 LayerTreeHostImplTest() 91 LayerTreeHostImplTest()
85 : task_runner_provider_(base::ThreadTaskRunnerHandle::Get()), 92 : task_runner_provider_(base::ThreadTaskRunnerHandle::Get()),
86 always_main_thread_blocked_(&task_runner_provider_), 93 always_main_thread_blocked_(&task_runner_provider_),
87 on_can_draw_state_changed_called_(false), 94 on_can_draw_state_changed_called_(false),
88 did_notify_ready_to_activate_(false), 95 did_notify_ready_to_activate_(false),
89 did_request_commit_(false), 96 did_request_commit_(false),
90 did_request_redraw_(false), 97 did_request_redraw_(false),
91 did_request_next_frame_(false), 98 did_request_next_frame_(false),
92 did_request_prepare_tiles_(false), 99 did_request_prepare_tiles_(false),
93 did_complete_page_scale_animation_(false), 100 did_complete_page_scale_animation_(false),
94 reduce_memory_result_(true) { 101 reduce_memory_result_(true),
102 skip_draw_layers_in_on_draw_(false) {
95 media::InitializeMediaLibrary(); 103 media::InitializeMediaLibrary();
96 } 104 }
97 105
98 LayerTreeSettings DefaultSettings() { 106 LayerTreeSettings DefaultSettings() {
99 LayerTreeSettings settings; 107 LayerTreeSettings settings;
100 settings.minimum_occlusion_tracking_size = gfx::Size(); 108 settings.minimum_occlusion_tracking_size = gfx::Size();
101 settings.renderer_settings.texture_id_allocation_chunk_size = 1; 109 settings.renderer_settings.texture_id_allocation_chunk_size = 1;
102 settings.gpu_rasterization_enabled = true; 110 settings.gpu_rasterization_enabled = true;
103 settings.verify_property_trees = true; 111 settings.verify_property_trees = true;
104 return settings; 112 return settings;
105 } 113 }
106 114
107 void SetUp() override { 115 void SetUp() override {
108 CreateHostImpl(DefaultSettings(), CreateOutputSurface()); 116 CreateHostImpl(DefaultSettings(), CreateOutputSurface());
109 } 117 }
110 118
111 void TearDown() override {} 119 void TearDown() override {}
112 120
113 void UpdateRendererCapabilitiesOnImplThread() override {} 121 void UpdateRendererCapabilitiesOnImplThread() override {}
114 void DidLoseOutputSurfaceOnImplThread() override {} 122 void DidLoseOutputSurfaceOnImplThread() override {}
115 void CommitVSyncParameters(base::TimeTicks timebase, 123 void CommitVSyncParameters(base::TimeTicks timebase,
116 base::TimeDelta interval) override {} 124 base::TimeDelta interval) override {}
117 void SetEstimatedParentDrawTime(base::TimeDelta draw_time) override {} 125 void SetEstimatedParentDrawTime(base::TimeDelta draw_time) override {}
118 void DidSwapBuffersOnImplThread() override {} 126 void DidSwapBuffersOnImplThread() override {}
119 void DidSwapBuffersCompleteOnImplThread() override {} 127 void DidSwapBuffersCompleteOnImplThread() override {}
120 void OnResourcelessSoftareDrawStateChanged(bool resourceless_draw) override {}
121 void OnCanDrawStateChanged(bool can_draw) override { 128 void OnCanDrawStateChanged(bool can_draw) override {
122 on_can_draw_state_changed_called_ = true; 129 on_can_draw_state_changed_called_ = true;
123 } 130 }
124 void NotifyReadyToActivate() override { 131 void NotifyReadyToActivate() override {
125 did_notify_ready_to_activate_ = true; 132 did_notify_ready_to_activate_ = true;
126 host_impl_->ActivateSyncTree(); 133 host_impl_->ActivateSyncTree();
127 } 134 }
128 void NotifyReadyToDraw() override {} 135 void NotifyReadyToDraw() override {}
129 void SetNeedsRedrawOnImplThread() override { did_request_redraw_ = true; } 136 void SetNeedsRedrawOnImplThread() override { did_request_redraw_ = true; }
130 void SetNeedsRedrawRectOnImplThread(const gfx::Rect& damage_rect) override { 137 void SetNeedsRedrawRectOnImplThread(const gfx::Rect& damage_rect) override {
(...skipping 15 matching lines...) Expand all
146 base::TimeDelta delay) override { 153 base::TimeDelta delay) override {
147 animation_task_ = task; 154 animation_task_ = task;
148 requested_animation_delay_ = delay; 155 requested_animation_delay_ = delay;
149 } 156 }
150 void DidActivateSyncTree() override {} 157 void DidActivateSyncTree() override {}
151 void WillPrepareTiles() override {} 158 void WillPrepareTiles() override {}
152 void DidPrepareTiles() override {} 159 void DidPrepareTiles() override {}
153 void DidCompletePageScaleAnimationOnImplThread() override { 160 void DidCompletePageScaleAnimationOnImplThread() override {
154 did_complete_page_scale_animation_ = true; 161 did_complete_page_scale_animation_ = true;
155 } 162 }
156 void OnDrawForOutputSurface() override {} 163 void OnDrawForOutputSurface(bool resourceless_software_draw) override {
164 scoped_ptr<LayerTreeHostImpl::FrameData> frame(
165 new LayerTreeHostImpl::FrameData);
166 EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(frame.get()));
167 last_on_draw_render_passes_.clear();
168 RenderPass::CopyAll(frame->render_passes, &last_on_draw_render_passes_);
169 if (!skip_draw_layers_in_on_draw_)
170 host_impl_->DrawLayers(frame.get());
171 host_impl_->DidDrawAllLayers(*frame);
172 host_impl_->SwapBuffers(*frame);
173 last_on_draw_frame_ = std::move(frame);
174 }
157 void PostFrameTimingEventsOnImplThread( 175 void PostFrameTimingEventsOnImplThread(
158 scoped_ptr<FrameTimingTracker::CompositeTimingSet> composite_events, 176 scoped_ptr<FrameTimingTracker::CompositeTimingSet> composite_events,
159 scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events) 177 scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events)
160 override {} 178 override {}
161 179
162 void set_reduce_memory_result(bool reduce_memory_result) { 180 void set_reduce_memory_result(bool reduce_memory_result) {
163 reduce_memory_result_ = reduce_memory_result; 181 reduce_memory_result_ = reduce_memory_result;
164 } 182 }
165 183
166 virtual bool CreateHostImpl(const LayerTreeSettings& settings, 184 virtual bool CreateHostImpl(const LayerTreeSettings& settings,
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
377 RebuildPropertyTrees(); 395 RebuildPropertyTrees();
378 return host_impl_->PrepareToDraw(frame); 396 return host_impl_->PrepareToDraw(frame);
379 } 397 }
380 398
381 void pinch_zoom_pan_viewport_forces_commit_redraw(float device_scale_factor); 399 void pinch_zoom_pan_viewport_forces_commit_redraw(float device_scale_factor);
382 void pinch_zoom_pan_viewport_test(float device_scale_factor); 400 void pinch_zoom_pan_viewport_test(float device_scale_factor);
383 void pinch_zoom_pan_viewport_and_scroll_test(float device_scale_factor); 401 void pinch_zoom_pan_viewport_and_scroll_test(float device_scale_factor);
384 void pinch_zoom_pan_viewport_and_scroll_boundary_test( 402 void pinch_zoom_pan_viewport_and_scroll_boundary_test(
385 float device_scale_factor); 403 float device_scale_factor);
386 404
387 void CheckNotifyCalledIfCanDrawChanged(bool always_draw) {
388 // Note: It is not possible to disable the renderer once it has been set,
389 // so we do not need to test that disabling the renderer notifies us
390 // that can_draw changed.
391 EXPECT_FALSE(host_impl_->CanDraw());
392 on_can_draw_state_changed_called_ = false;
393
394 // Set up the root layer, which allows us to draw.
395 SetupScrollAndContentsLayers(gfx::Size(100, 100));
396 EXPECT_TRUE(host_impl_->CanDraw());
397 EXPECT_TRUE(on_can_draw_state_changed_called_);
398 on_can_draw_state_changed_called_ = false;
399
400 // Toggle the root layer to make sure it toggles can_draw
401 host_impl_->active_tree()->SetRootLayer(nullptr);
402 EXPECT_FALSE(host_impl_->CanDraw());
403 EXPECT_TRUE(on_can_draw_state_changed_called_);
404 on_can_draw_state_changed_called_ = false;
405
406 SetupScrollAndContentsLayers(gfx::Size(100, 100));
407 EXPECT_TRUE(host_impl_->CanDraw());
408 EXPECT_TRUE(on_can_draw_state_changed_called_);
409 on_can_draw_state_changed_called_ = false;
410
411 // Toggle the device viewport size to make sure it toggles can_draw.
412 host_impl_->SetViewportSize(gfx::Size());
413 if (always_draw) {
414 EXPECT_TRUE(host_impl_->CanDraw());
415 } else {
416 EXPECT_FALSE(host_impl_->CanDraw());
417 }
418 EXPECT_TRUE(on_can_draw_state_changed_called_);
419 on_can_draw_state_changed_called_ = false;
420
421 host_impl_->SetViewportSize(gfx::Size(100, 100));
422 EXPECT_TRUE(host_impl_->CanDraw());
423 EXPECT_TRUE(on_can_draw_state_changed_called_);
424 on_can_draw_state_changed_called_ = false;
425 }
426
427 void SetupMouseMoveAtWithDeviceScale(float device_scale_factor); 405 void SetupMouseMoveAtWithDeviceScale(float device_scale_factor);
428 406
429 protected: 407 protected:
430 virtual scoped_ptr<OutputSurface> CreateOutputSurface() { 408 virtual scoped_ptr<OutputSurface> CreateOutputSurface() {
431 return FakeOutputSurface::Create3d(); 409 return FakeOutputSurface::Create3d();
432 } 410 }
433 411
434 void DrawOneFrame() { 412 void DrawOneFrame() {
435 LayerTreeHostImpl::FrameData frame_data; 413 LayerTreeHostImpl::FrameData frame_data;
436 PrepareToDrawFrame(&frame_data); 414 PrepareToDrawFrame(&frame_data);
(...skipping 12 matching lines...) Expand all
449 bool on_can_draw_state_changed_called_; 427 bool on_can_draw_state_changed_called_;
450 bool did_notify_ready_to_activate_; 428 bool did_notify_ready_to_activate_;
451 bool did_request_commit_; 429 bool did_request_commit_;
452 bool did_request_redraw_; 430 bool did_request_redraw_;
453 bool did_request_next_frame_; 431 bool did_request_next_frame_;
454 bool did_request_prepare_tiles_; 432 bool did_request_prepare_tiles_;
455 bool did_complete_page_scale_animation_; 433 bool did_complete_page_scale_animation_;
456 bool reduce_memory_result_; 434 bool reduce_memory_result_;
457 base::Closure animation_task_; 435 base::Closure animation_task_;
458 base::TimeDelta requested_animation_delay_; 436 base::TimeDelta requested_animation_delay_;
437 bool skip_draw_layers_in_on_draw_;
438 scoped_ptr<LayerTreeHostImpl::FrameData> last_on_draw_frame_;
439 RenderPassList last_on_draw_render_passes_;
459 }; 440 };
460 441
461 // A test fixture for new animation timelines tests. 442 // A test fixture for new animation timelines tests.
462 class LayerTreeHostImplTimelinesTest : public LayerTreeHostImplTest { 443 class LayerTreeHostImplTimelinesTest : public LayerTreeHostImplTest {
463 public: 444 public:
464 void SetUp() override { 445 void SetUp() override {
465 LayerTreeSettings settings = DefaultSettings(); 446 LayerTreeSettings settings = DefaultSettings();
466 settings.use_compositor_animation_timelines = true; 447 settings.use_compositor_animation_timelines = true;
467 CreateHostImpl(settings, CreateOutputSurface()); 448 CreateHostImpl(settings, CreateOutputSurface());
468 } 449 }
469 }; 450 };
470 451
471 TEST_F(LayerTreeHostImplTest, NotifyIfCanDrawChanged) { 452 TEST_F(LayerTreeHostImplTest, NotifyIfCanDrawChanged) {
472 bool always_draw = false; 453 // Note: It is not possible to disable the renderer once it has been set,
473 CheckNotifyCalledIfCanDrawChanged(always_draw); 454 // so we do not need to test that disabling the renderer notifies us
455 // that can_draw changed.
456 EXPECT_FALSE(host_impl_->CanDraw());
457 on_can_draw_state_changed_called_ = false;
458
459 // Set up the root layer, which allows us to draw.
460 SetupScrollAndContentsLayers(gfx::Size(100, 100));
461 EXPECT_TRUE(host_impl_->CanDraw());
462 EXPECT_TRUE(on_can_draw_state_changed_called_);
463 on_can_draw_state_changed_called_ = false;
464
465 // Toggle the root layer to make sure it toggles can_draw
466 host_impl_->active_tree()->SetRootLayer(nullptr);
467 EXPECT_FALSE(host_impl_->CanDraw());
468 EXPECT_TRUE(on_can_draw_state_changed_called_);
469 on_can_draw_state_changed_called_ = false;
470
471 SetupScrollAndContentsLayers(gfx::Size(100, 100));
472 EXPECT_TRUE(host_impl_->CanDraw());
473 EXPECT_TRUE(on_can_draw_state_changed_called_);
474 on_can_draw_state_changed_called_ = false;
475
476 // Toggle the device viewport size to make sure it toggles can_draw.
477 host_impl_->SetViewportSize(gfx::Size());
478 EXPECT_FALSE(host_impl_->CanDraw());
479 EXPECT_TRUE(on_can_draw_state_changed_called_);
480 on_can_draw_state_changed_called_ = false;
481
482 host_impl_->SetViewportSize(gfx::Size(100, 100));
483 EXPECT_TRUE(host_impl_->CanDraw());
484 EXPECT_TRUE(on_can_draw_state_changed_called_);
485 on_can_draw_state_changed_called_ = false;
474 } 486 }
475 487
476 TEST_F(LayerTreeHostImplTest, CanDrawIncompleteFrames) { 488 TEST_F(LayerTreeHostImplTest, ResourcelessDrawWithEmptyViewport) {
477 CreateHostImpl(DefaultSettings(), 489 CreateHostImpl(DefaultSettings(),
478 FakeOutputSurface::CreateSoftware( 490 FakeOutputSurface::CreateSoftware(
479 make_scoped_ptr(new SoftwareOutputDevice()))); 491 make_scoped_ptr(new SoftwareOutputDevice())));
480 const gfx::Transform external_transform; 492 SetupScrollAndContentsLayers(gfx::Size(100, 100));
481 const gfx::Rect external_viewport; 493 EXPECT_TRUE(host_impl_->CanDraw());
482 const gfx::Rect external_clip; 494 host_impl_->SetViewportSize(gfx::Size());
495 EXPECT_FALSE(host_impl_->CanDraw());
496
497 FakeOutputSurface* fake_output_surface =
498 static_cast<FakeOutputSurface*>(host_impl_->output_surface());
499 EXPECT_EQ(fake_output_surface->num_sent_frames(), 0u);
500 gfx::Transform identity;
501 gfx::Rect viewport(100, 100);
483 const bool resourceless_software_draw = true; 502 const bool resourceless_software_draw = true;
484 host_impl_->SetExternalDrawConstraints( 503 host_impl_->OnDraw(identity, viewport, viewport, resourceless_software_draw);
485 external_transform, external_viewport, external_clip, external_viewport, 504 ASSERT_EQ(fake_output_surface->num_sent_frames(), 1u);
486 external_transform, resourceless_software_draw); 505 EXPECT_EQ(gfx::SizeF(100.f, 100.f),
487 506 fake_output_surface->last_sent_frame().metadata.root_layer_size);
488 bool always_draw = true;
489 CheckNotifyCalledIfCanDrawChanged(always_draw);
490 } 507 }
491 508
492 TEST_F(LayerTreeHostImplTest, ScrollDeltaNoLayers) { 509 TEST_F(LayerTreeHostImplTest, ScrollDeltaNoLayers) {
493 ASSERT_FALSE(host_impl_->active_tree()->root_layer()); 510 ASSERT_FALSE(host_impl_->active_tree()->root_layer());
494 511
495 scoped_ptr<ScrollAndScaleSet> scroll_info = host_impl_->ProcessScrollDeltas(); 512 scoped_ptr<ScrollAndScaleSet> scroll_info = host_impl_->ProcessScrollDeltas();
496 ASSERT_EQ(scroll_info->scrolls.size(), 0u); 513 ASSERT_EQ(scroll_info->scrolls.size(), 0u);
497 } 514 }
498 515
499 TEST_F(LayerTreeHostImplTest, ScrollDeltaTreeButNoChanges) { 516 TEST_F(LayerTreeHostImplTest, ScrollDeltaTreeButNoChanges) {
(...skipping 2875 matching lines...) Expand 10 before | Expand all | Expand 10 after
3375 TEST_F(LayerTreeHostImplTest, 3392 TEST_F(LayerTreeHostImplTest,
3376 PrepareToDrawWhenDrawAndSwapFullViewportEveryFrame) { 3393 PrepareToDrawWhenDrawAndSwapFullViewportEveryFrame) {
3377 CreateHostImpl(DefaultSettings(), 3394 CreateHostImpl(DefaultSettings(),
3378 FakeOutputSurface::CreateSoftware( 3395 FakeOutputSurface::CreateSoftware(
3379 make_scoped_ptr(new SoftwareOutputDevice()))); 3396 make_scoped_ptr(new SoftwareOutputDevice())));
3380 3397
3381 const gfx::Transform external_transform; 3398 const gfx::Transform external_transform;
3382 const gfx::Rect external_viewport; 3399 const gfx::Rect external_viewport;
3383 const gfx::Rect external_clip; 3400 const gfx::Rect external_clip;
3384 const bool resourceless_software_draw = true; 3401 const bool resourceless_software_draw = true;
3385 host_impl_->SetExternalDrawConstraints( 3402 host_impl_->SetExternalTilePriorityConstraints(external_viewport,
3386 external_transform, external_viewport, external_clip, external_viewport, 3403 external_transform);
3387 external_transform, resourceless_software_draw);
3388 3404
3389 std::vector<PrepareToDrawSuccessTestCase> cases; 3405 std::vector<PrepareToDrawSuccessTestCase> cases;
3390 3406
3391 // 0. Default case. 3407 // 0. Default case.
3392 cases.push_back(PrepareToDrawSuccessTestCase(DRAW_SUCCESS)); 3408 cases.push_back(PrepareToDrawSuccessTestCase(DRAW_SUCCESS));
3393 // 1. Animation with missing tile. 3409 // 1. Animation with missing tile.
3394 cases.push_back(PrepareToDrawSuccessTestCase(DRAW_SUCCESS)); 3410 cases.push_back(PrepareToDrawSuccessTestCase(DRAW_SUCCESS));
3395 cases.back().layer_between.has_missing_tile = true; 3411 cases.back().layer_between.has_missing_tile = true;
3396 cases.back().layer_between.is_animating = true; 3412 cases.back().layer_between.is_animating = true;
3397 // 2. High res required with incomplete tile. 3413 // 2. High res required with incomplete tile.
3398 cases.push_back(PrepareToDrawSuccessTestCase(DRAW_SUCCESS)); 3414 cases.push_back(PrepareToDrawSuccessTestCase(DRAW_SUCCESS));
3399 cases.back().high_res_required = true; 3415 cases.back().high_res_required = true;
3400 cases.back().layer_between.has_incomplete_tile = true; 3416 cases.back().layer_between.has_incomplete_tile = true;
3401 // 3. High res required with missing tile. 3417 // 3. High res required with missing tile.
3402 cases.push_back(PrepareToDrawSuccessTestCase(DRAW_SUCCESS)); 3418 cases.push_back(PrepareToDrawSuccessTestCase(DRAW_SUCCESS));
3403 cases.back().high_res_required = true; 3419 cases.back().high_res_required = true;
3404 cases.back().layer_between.has_missing_tile = true; 3420 cases.back().layer_between.has_missing_tile = true;
3405 3421
3406 host_impl_->active_tree()->SetRootLayer( 3422 host_impl_->active_tree()->SetRootLayer(
3407 DidDrawCheckLayer::Create(host_impl_->active_tree(), 1)); 3423 DidDrawCheckLayer::Create(host_impl_->active_tree(), 1));
3408 DidDrawCheckLayer* root = 3424 DidDrawCheckLayer* root =
3409 static_cast<DidDrawCheckLayer*>(host_impl_->active_tree()->root_layer()); 3425 static_cast<DidDrawCheckLayer*>(host_impl_->active_tree()->root_layer());
3410 root->SetForceRenderSurface(true); 3426 root->SetForceRenderSurface(true);
3411 3427
3412 LayerTreeHostImpl::FrameData frame; 3428 host_impl_->OnDraw(external_transform, external_viewport, external_clip,
3413 EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(&frame)); 3429 resourceless_software_draw);
3414 host_impl_->DrawLayers(&frame);
3415 host_impl_->DidDrawAllLayers(frame);
3416 host_impl_->SwapBuffers(frame);
3417 3430
3418 for (size_t i = 0; i < cases.size(); ++i) { 3431 for (size_t i = 0; i < cases.size(); ++i) {
3419 const auto& testcase = cases[i]; 3432 const auto& testcase = cases[i];
3420 std::vector<LayerImpl*> to_remove; 3433 std::vector<LayerImpl*> to_remove;
3421 for (const auto& child : root->children()) 3434 for (const auto& child : root->children())
3422 to_remove.push_back(child.get()); 3435 to_remove.push_back(child.get());
3423 for (auto* child : to_remove) 3436 for (auto* child : to_remove)
3424 root->RemoveChild(child); 3437 root->RemoveChild(child);
3425 3438
3426 std::ostringstream scope; 3439 std::ostringstream scope;
(...skipping 23 matching lines...) Expand all
3450 testcase.layer_after.has_incomplete_tile, 3463 testcase.layer_after.has_incomplete_tile,
3451 testcase.layer_after.is_animating, host_impl_->resource_provider())); 3464 testcase.layer_after.is_animating, host_impl_->resource_provider()));
3452 DidDrawCheckLayer* after = 3465 DidDrawCheckLayer* after =
3453 static_cast<DidDrawCheckLayer*>(root->children().back().get()); 3466 static_cast<DidDrawCheckLayer*>(root->children().back().get());
3454 if (testcase.layer_after.has_copy_request) 3467 if (testcase.layer_after.has_copy_request)
3455 after->AddCopyRequest(); 3468 after->AddCopyRequest();
3456 3469
3457 if (testcase.high_res_required) 3470 if (testcase.high_res_required)
3458 host_impl_->SetRequiresHighResToDraw(); 3471 host_impl_->SetRequiresHighResToDraw();
3459 3472
3460 LayerTreeHostImpl::FrameData frame; 3473 host_impl_->OnDraw(external_transform, external_viewport, external_clip,
3461 EXPECT_EQ(testcase.expected_result, PrepareToDrawFrame(&frame)); 3474 resourceless_software_draw);
3462 host_impl_->DrawLayers(&frame);
3463 host_impl_->DidDrawAllLayers(frame);
3464 host_impl_->SwapBuffers(frame);
3465 } 3475 }
3466 } 3476 }
3467 3477
3468 TEST_F(LayerTreeHostImplTest, ScrollRootIgnored) { 3478 TEST_F(LayerTreeHostImplTest, ScrollRootIgnored) {
3469 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1); 3479 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1);
3470 root->SetScrollClipLayer(Layer::INVALID_ID); 3480 root->SetScrollClipLayer(Layer::INVALID_ID);
3471 root->SetForceRenderSurface(true); 3481 root->SetForceRenderSurface(true);
3472 host_impl_->active_tree()->SetRootLayer(std::move(root)); 3482 host_impl_->active_tree()->SetRootLayer(std::move(root));
3473 DrawFrame(); 3483 DrawFrame();
3474 3484
(...skipping 2368 matching lines...) Expand 10 before | Expand all | Expand 10 after
5843 5853
5844 EXPECT_EQ(0u, CountGutterQuads(frame.render_passes[0]->quad_list)); 5854 EXPECT_EQ(0u, CountGutterQuads(frame.render_passes[0]->quad_list));
5845 EXPECT_EQ(1u, frame.render_passes[0]->quad_list.size()); 5855 EXPECT_EQ(1u, frame.render_passes[0]->quad_list.size());
5846 ValidateTextureDrawQuads(frame.render_passes[0]->quad_list); 5856 ValidateTextureDrawQuads(frame.render_passes[0]->quad_list);
5847 5857
5848 VerifyQuadsExactlyCoverViewport(frame.render_passes[0]->quad_list); 5858 VerifyQuadsExactlyCoverViewport(frame.render_passes[0]->quad_list);
5849 host_impl_->DidDrawAllLayers(frame); 5859 host_impl_->DidDrawAllLayers(frame);
5850 } 5860 }
5851 5861
5852 // Expect fullscreen gutter rect. 5862 // Expect fullscreen gutter rect.
5853 void TestEmptyLayer() { 5863 void SetUpEmptylayer() {
5854 gfx::Rect layer_rect(0, 0, 0, 0); 5864 gfx::Rect layer_rect(0, 0, 0, 0);
5855 child_->SetPosition(gfx::PointF(layer_rect.origin())); 5865 child_->SetPosition(gfx::PointF(layer_rect.origin()));
5856 child_->SetBounds(layer_rect.size()); 5866 child_->SetBounds(layer_rect.size());
5857 child_->SetQuadRect(gfx::Rect(layer_rect.size())); 5867 child_->SetQuadRect(gfx::Rect(layer_rect.size()));
5858 child_->SetQuadVisibleRect(gfx::Rect(layer_rect.size())); 5868 child_->SetQuadVisibleRect(gfx::Rect(layer_rect.size()));
5869 }
5859 5870
5871 void VerifyEmptyLayerRenderPasses(const RenderPassList& render_passes) {
5872 ASSERT_EQ(1u, render_passes.size());
5873
5874 EXPECT_EQ(1u, CountGutterQuads(render_passes[0]->quad_list));
5875 EXPECT_EQ(1u, render_passes[0]->quad_list.size());
5876 ValidateTextureDrawQuads(render_passes[0]->quad_list);
5877
5878 VerifyQuadsExactlyCoverViewport(render_passes[0]->quad_list);
5879 }
5880
5881 void TestEmptyLayer() {
5882 SetUpEmptylayer();
5860 LayerTreeHostImpl::FrameData frame; 5883 LayerTreeHostImpl::FrameData frame;
5861 EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(&frame)); 5884 EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(&frame));
5862 ASSERT_EQ(1u, frame.render_passes.size()); 5885 VerifyEmptyLayerRenderPasses(frame.render_passes);
5863
5864 EXPECT_EQ(1u, CountGutterQuads(frame.render_passes[0]->quad_list));
5865 EXPECT_EQ(1u, frame.render_passes[0]->quad_list.size());
5866 ValidateTextureDrawQuads(frame.render_passes[0]->quad_list);
5867
5868 VerifyQuadsExactlyCoverViewport(frame.render_passes[0]->quad_list);
5869 host_impl_->DidDrawAllLayers(frame); 5886 host_impl_->DidDrawAllLayers(frame);
5870 } 5887 }
5871 5888
5889 void TestEmptyLayerWithOnDraw() {
5890 SetUpEmptylayer();
5891 gfx::Transform identity;
5892 gfx::Rect viewport(viewport_size_);
5893 bool resourceless_software_draw = true;
5894 host_impl_->OnDraw(identity, viewport, viewport,
5895 resourceless_software_draw);
5896 VerifyEmptyLayerRenderPasses(last_on_draw_render_passes_);
5897 }
5898
5872 // Expect four surrounding gutter rects. 5899 // Expect four surrounding gutter rects.
5873 void TestLayerInMiddleOfViewport() { 5900 void SetUpLayerInMiddleOfViewport() {
5874 gfx::Rect layer_rect(500, 500, 200, 200); 5901 gfx::Rect layer_rect(500, 500, 200, 200);
5875 child_->SetPosition(gfx::PointF(layer_rect.origin())); 5902 child_->SetPosition(gfx::PointF(layer_rect.origin()));
5876 child_->SetBounds(layer_rect.size()); 5903 child_->SetBounds(layer_rect.size());
5877 child_->SetQuadRect(gfx::Rect(layer_rect.size())); 5904 child_->SetQuadRect(gfx::Rect(layer_rect.size()));
5878 child_->SetQuadVisibleRect(gfx::Rect(layer_rect.size())); 5905 child_->SetQuadVisibleRect(gfx::Rect(layer_rect.size()));
5906 }
5879 5907
5908 void VerifyLayerInMiddleOfViewport(const RenderPassList& render_passes) {
5909 ASSERT_EQ(1u, render_passes.size());
5910
5911 EXPECT_EQ(4u, CountGutterQuads(render_passes[0]->quad_list));
5912 EXPECT_EQ(5u, render_passes[0]->quad_list.size());
5913 ValidateTextureDrawQuads(render_passes[0]->quad_list);
5914
5915 VerifyQuadsExactlyCoverViewport(render_passes[0]->quad_list);
5916 }
5917
5918 void TestLayerInMiddleOfViewport() {
5919 SetUpLayerInMiddleOfViewport();
5880 LayerTreeHostImpl::FrameData frame; 5920 LayerTreeHostImpl::FrameData frame;
5881 EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(&frame)); 5921 EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(&frame));
5882 ASSERT_EQ(1u, frame.render_passes.size()); 5922 VerifyLayerInMiddleOfViewport(frame.render_passes);
5883
5884 EXPECT_EQ(4u, CountGutterQuads(frame.render_passes[0]->quad_list));
5885 EXPECT_EQ(5u, frame.render_passes[0]->quad_list.size());
5886 ValidateTextureDrawQuads(frame.render_passes[0]->quad_list);
5887
5888 VerifyQuadsExactlyCoverViewport(frame.render_passes[0]->quad_list);
5889 host_impl_->DidDrawAllLayers(frame); 5923 host_impl_->DidDrawAllLayers(frame);
5890 } 5924 }
5891 5925
5926 void TestLayerInMiddleOfViewportWithOnDraw() {
5927 SetUpLayerInMiddleOfViewport();
5928 gfx::Transform identity;
5929 gfx::Rect viewport(viewport_size_);
5930 bool resourceless_software_draw = true;
5931 host_impl_->OnDraw(identity, viewport, viewport,
5932 resourceless_software_draw);
5933 VerifyLayerInMiddleOfViewport(last_on_draw_render_passes_);
5934 }
5935
5892 // Expect no gutter rects. 5936 // Expect no gutter rects.
5893 void TestLayerIsLargerThanViewport() { 5937 void SetUpLayerIsLargerThanViewport() {
5894 gfx::Rect layer_rect(viewport_size_.width() + 10, 5938 gfx::Rect layer_rect(viewport_size_.width() + 10,
5895 viewport_size_.height() + 10); 5939 viewport_size_.height() + 10);
5896 child_->SetPosition(gfx::PointF(layer_rect.origin())); 5940 child_->SetPosition(gfx::PointF(layer_rect.origin()));
5897 child_->SetBounds(layer_rect.size()); 5941 child_->SetBounds(layer_rect.size());
5898 child_->SetQuadRect(gfx::Rect(layer_rect.size())); 5942 child_->SetQuadRect(gfx::Rect(layer_rect.size()));
5899 child_->SetQuadVisibleRect(gfx::Rect(layer_rect.size())); 5943 child_->SetQuadVisibleRect(gfx::Rect(layer_rect.size()));
5944 }
5900 5945
5946 void VerifyLayerIsLargerThanViewport(const RenderPassList& render_passes) {
5947 ASSERT_EQ(1u, render_passes.size());
5948
5949 EXPECT_EQ(0u, CountGutterQuads(render_passes[0]->quad_list));
5950 EXPECT_EQ(1u, render_passes[0]->quad_list.size());
5951 ValidateTextureDrawQuads(render_passes[0]->quad_list);
5952 }
5953
5954 void TestLayerIsLargerThanViewport() {
5955 SetUpLayerIsLargerThanViewport();
5901 LayerTreeHostImpl::FrameData frame; 5956 LayerTreeHostImpl::FrameData frame;
5902 EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(&frame)); 5957 EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(&frame));
5903 ASSERT_EQ(1u, frame.render_passes.size()); 5958 VerifyLayerIsLargerThanViewport(frame.render_passes);
5959 host_impl_->DidDrawAllLayers(frame);
5960 }
5904 5961
5905 EXPECT_EQ(0u, CountGutterQuads(frame.render_passes[0]->quad_list)); 5962 void TestLayerIsLargerThanViewportWithOnDraw() {
5906 EXPECT_EQ(1u, frame.render_passes[0]->quad_list.size()); 5963 SetUpLayerIsLargerThanViewport();
5907 ValidateTextureDrawQuads(frame.render_passes[0]->quad_list); 5964 gfx::Transform identity;
5908 5965 gfx::Rect viewport(viewport_size_);
5909 host_impl_->DidDrawAllLayers(frame); 5966 bool resourceless_software_draw = true;
5967 host_impl_->OnDraw(identity, viewport, viewport,
5968 resourceless_software_draw);
5969 VerifyLayerIsLargerThanViewport(last_on_draw_render_passes_);
5910 } 5970 }
5911 5971
5912 void DidActivateSyncTree() override { did_activate_pending_tree_ = true; } 5972 void DidActivateSyncTree() override { did_activate_pending_tree_ = true; }
5913 5973
5914 void set_gutter_quad_material(DrawQuad::Material material) { 5974 void set_gutter_quad_material(DrawQuad::Material material) {
5915 gutter_quad_material_ = material; 5975 gutter_quad_material_ = material;
5916 } 5976 }
5917 void set_gutter_texture_size(const gfx::Size& gutter_texture_size) { 5977 void set_gutter_texture_size(const gfx::Size& gutter_texture_size) {
5918 gutter_texture_size_ = gutter_texture_size; 5978 gutter_texture_size_ = gutter_texture_size;
5919 } 5979 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
5952 texture_quad->uv_bottom_right.y(), 6012 texture_quad->uv_bottom_right.y(),
5953 texture_quad->rect.bottom() / gutter_texture_size_pixels.height()); 6013 texture_quad->rect.bottom() / gutter_texture_size_pixels.height());
5954 } 6014 }
5955 } 6015 }
5956 6016
5957 gfx::Size DipSizeToPixelSize(const gfx::Size& size) { 6017 gfx::Size DipSizeToPixelSize(const gfx::Size& size) {
5958 return gfx::ScaleToRoundedSize( 6018 return gfx::ScaleToRoundedSize(
5959 size, host_impl_->active_tree()->device_scale_factor()); 6019 size, host_impl_->active_tree()->device_scale_factor());
5960 } 6020 }
5961 6021
5962 void SetResourcelessSoftwareDraw() {
5963 const gfx::Transform external_transform;
5964 const gfx::Rect external_viewport;
5965 const gfx::Rect external_clip;
5966 const bool resourceless_software_draw = true;
5967 host_impl_->SetExternalDrawConstraints(
5968 external_transform, external_viewport, external_clip, external_viewport,
5969 external_transform, resourceless_software_draw);
5970 }
5971
5972 DrawQuad::Material gutter_quad_material_; 6022 DrawQuad::Material gutter_quad_material_;
5973 gfx::Size gutter_texture_size_; 6023 gfx::Size gutter_texture_size_;
5974 gfx::Size viewport_size_; 6024 gfx::Size viewport_size_;
5975 BlendStateCheckLayer* child_; 6025 BlendStateCheckLayer* child_;
5976 bool did_activate_pending_tree_; 6026 bool did_activate_pending_tree_;
5977 }; 6027 };
5978 6028
5979 TEST_F(LayerTreeHostImplViewportCoveredTest, ViewportCovered) { 6029 TEST_F(LayerTreeHostImplViewportCoveredTest, ViewportCovered) {
5980 viewport_size_ = gfx::Size(1000, 1000); 6030 viewport_size_ = gfx::Size(1000, 1000);
5981 6031
5982 bool software = false; 6032 bool software = false;
5983 CreateHostImpl(DefaultSettings(), CreateFakeOutputSurface(software)); 6033 CreateHostImpl(DefaultSettings(), CreateFakeOutputSurface(software));
5984 6034
5985 host_impl_->SetViewportSize(DipSizeToPixelSize(viewport_size_)); 6035 host_impl_->SetViewportSize(DipSizeToPixelSize(viewport_size_));
5986 SetupActiveTreeLayers(); 6036 SetupActiveTreeLayers();
5987 TestLayerCoversFullViewport(); 6037 EXPECT_SCOPED(TestLayerCoversFullViewport());
5988 TestEmptyLayer(); 6038 EXPECT_SCOPED(TestEmptyLayer());
5989 TestLayerInMiddleOfViewport(); 6039 EXPECT_SCOPED(TestLayerInMiddleOfViewport());
5990 TestLayerIsLargerThanViewport(); 6040 EXPECT_SCOPED(TestLayerIsLargerThanViewport());
5991 } 6041 }
5992 6042
5993 TEST_F(LayerTreeHostImplViewportCoveredTest, ViewportCoveredScaled) { 6043 TEST_F(LayerTreeHostImplViewportCoveredTest, ViewportCoveredScaled) {
5994 viewport_size_ = gfx::Size(1000, 1000); 6044 viewport_size_ = gfx::Size(1000, 1000);
5995 6045
5996 bool software = false; 6046 bool software = false;
5997 CreateHostImpl(DefaultSettings(), CreateFakeOutputSurface(software)); 6047 CreateHostImpl(DefaultSettings(), CreateFakeOutputSurface(software));
5998 6048
5999 host_impl_->active_tree()->SetDeviceScaleFactor(2.f); 6049 host_impl_->active_tree()->SetDeviceScaleFactor(2.f);
6000 host_impl_->SetViewportSize(DipSizeToPixelSize(viewport_size_)); 6050 host_impl_->SetViewportSize(DipSizeToPixelSize(viewport_size_));
6001 SetupActiveTreeLayers(); 6051 SetupActiveTreeLayers();
6002 TestLayerCoversFullViewport(); 6052 EXPECT_SCOPED(TestLayerCoversFullViewport());
6003 TestEmptyLayer(); 6053 EXPECT_SCOPED(TestEmptyLayer());
6004 TestLayerInMiddleOfViewport(); 6054 EXPECT_SCOPED(TestLayerInMiddleOfViewport());
6005 TestLayerIsLargerThanViewport(); 6055 EXPECT_SCOPED(TestLayerIsLargerThanViewport());
6006 } 6056 }
6007 6057
6008 TEST_F(LayerTreeHostImplViewportCoveredTest, ActiveTreeGrowViewportInvalid) { 6058 TEST_F(LayerTreeHostImplViewportCoveredTest, ActiveTreeGrowViewportInvalid) {
6009 viewport_size_ = gfx::Size(1000, 1000); 6059 viewport_size_ = gfx::Size(1000, 1000);
6060 skip_draw_layers_in_on_draw_ = true; // Resourceless can't draw tiled quads.
6010 6061
6011 bool software = true; 6062 bool software = true;
6012 CreateHostImpl(DefaultSettings(), CreateFakeOutputSurface(software)); 6063 CreateHostImpl(DefaultSettings(), CreateFakeOutputSurface(software));
6013 SetResourcelessSoftwareDraw();
6014 6064
6015 // Pending tree to force active_tree size invalid. Not used otherwise. 6065 // Pending tree to force active_tree size invalid. Not used otherwise.
6016 host_impl_->CreatePendingTree(); 6066 host_impl_->CreatePendingTree();
6017 host_impl_->SetViewportSize(DipSizeToPixelSize(viewport_size_)); 6067 host_impl_->SetViewportSize(DipSizeToPixelSize(viewport_size_));
6018 EXPECT_TRUE(host_impl_->active_tree()->ViewportSizeInvalid()); 6068 EXPECT_TRUE(host_impl_->active_tree()->ViewportSizeInvalid());
6019 6069
6020 SetupActiveTreeLayers(); 6070 SetupActiveTreeLayers();
6021 TestEmptyLayer(); 6071 EXPECT_SCOPED(TestEmptyLayerWithOnDraw());
6022 TestLayerInMiddleOfViewport(); 6072 EXPECT_SCOPED(TestLayerInMiddleOfViewportWithOnDraw());
6023 TestLayerIsLargerThanViewport(); 6073 EXPECT_SCOPED(TestLayerIsLargerThanViewportWithOnDraw());
6024 } 6074 }
6025 6075
6026 TEST_F(LayerTreeHostImplViewportCoveredTest, ActiveTreeShrinkViewportInvalid) { 6076 TEST_F(LayerTreeHostImplViewportCoveredTest, ActiveTreeShrinkViewportInvalid) {
6027 viewport_size_ = gfx::Size(1000, 1000); 6077 viewport_size_ = gfx::Size(1000, 1000);
6078 skip_draw_layers_in_on_draw_ = true; // Resourceless can't draw tiled quads.
6028 6079
6029 bool software = true; 6080 bool software = true;
6030 CreateHostImpl(DefaultSettings(), CreateFakeOutputSurface(software)); 6081 CreateHostImpl(DefaultSettings(), CreateFakeOutputSurface(software));
6031 SetResourcelessSoftwareDraw();
6032 6082
6033 // Set larger viewport and activate it to active tree. 6083 // Set larger viewport and activate it to active tree.
6034 host_impl_->CreatePendingTree(); 6084 host_impl_->CreatePendingTree();
6035 gfx::Size larger_viewport(viewport_size_.width() + 100, 6085 gfx::Size larger_viewport(viewport_size_.width() + 100,
6036 viewport_size_.height() + 100); 6086 viewport_size_.height() + 100);
6037 host_impl_->SetViewportSize(DipSizeToPixelSize(larger_viewport)); 6087 host_impl_->SetViewportSize(DipSizeToPixelSize(larger_viewport));
6038 EXPECT_TRUE(host_impl_->active_tree()->ViewportSizeInvalid()); 6088 EXPECT_TRUE(host_impl_->active_tree()->ViewportSizeInvalid());
6039 host_impl_->ActivateSyncTree(); 6089 host_impl_->ActivateSyncTree();
6040 EXPECT_TRUE(did_activate_pending_tree_); 6090 EXPECT_TRUE(did_activate_pending_tree_);
6041 EXPECT_FALSE(host_impl_->active_tree()->ViewportSizeInvalid()); 6091 EXPECT_FALSE(host_impl_->active_tree()->ViewportSizeInvalid());
6042 6092
6043 // Shrink pending tree viewport without activating. 6093 // Shrink pending tree viewport without activating.
6044 host_impl_->CreatePendingTree(); 6094 host_impl_->CreatePendingTree();
6045 host_impl_->SetViewportSize(DipSizeToPixelSize(viewport_size_)); 6095 host_impl_->SetViewportSize(DipSizeToPixelSize(viewport_size_));
6046 EXPECT_TRUE(host_impl_->active_tree()->ViewportSizeInvalid()); 6096 EXPECT_TRUE(host_impl_->active_tree()->ViewportSizeInvalid());
6047 6097
6048 SetupActiveTreeLayers(); 6098 SetupActiveTreeLayers();
6049 TestEmptyLayer(); 6099 EXPECT_SCOPED(TestEmptyLayerWithOnDraw());
6050 TestLayerInMiddleOfViewport(); 6100 EXPECT_SCOPED(TestLayerInMiddleOfViewportWithOnDraw());
6051 TestLayerIsLargerThanViewport(); 6101 EXPECT_SCOPED(TestLayerIsLargerThanViewportWithOnDraw());
6052 } 6102 }
6053 6103
6054 class FakeDrawableLayerImpl: public LayerImpl { 6104 class FakeDrawableLayerImpl: public LayerImpl {
6055 public: 6105 public:
6056 static scoped_ptr<LayerImpl> Create(LayerTreeImpl* tree_impl, int id) { 6106 static scoped_ptr<LayerImpl> Create(LayerTreeImpl* tree_impl, int id) {
6057 return make_scoped_ptr(new FakeDrawableLayerImpl(tree_impl, id)); 6107 return make_scoped_ptr(new FakeDrawableLayerImpl(tree_impl, id));
6058 } 6108 }
6059 protected: 6109 protected:
6060 FakeDrawableLayerImpl(LayerTreeImpl* tree_impl, int id) 6110 FakeDrawableLayerImpl(LayerTreeImpl* tree_impl, int id)
6061 : LayerImpl(tree_impl, id) {} 6111 : LayerImpl(tree_impl, id) {}
(...skipping 787 matching lines...) Expand 10 before | Expand all | Expand 10 after
6849 DefaultSettings(), 6899 DefaultSettings(),
6850 FakeOutputSurface::CreateSoftware(make_scoped_ptr(software_device)))); 6900 FakeOutputSurface::CreateSoftware(make_scoped_ptr(software_device))));
6851 host_impl_->SetViewportSize(gfx::Size(50, 50)); 6901 host_impl_->SetViewportSize(gfx::Size(50, 50));
6852 6902
6853 SetupScrollAndContentsLayers(gfx::Size(100, 100)); 6903 SetupScrollAndContentsLayers(gfx::Size(100, 100));
6854 6904
6855 const gfx::Transform external_transform; 6905 const gfx::Transform external_transform;
6856 const gfx::Rect external_viewport; 6906 const gfx::Rect external_viewport;
6857 const gfx::Rect external_clip; 6907 const gfx::Rect external_clip;
6858 const bool resourceless_software_draw = true; 6908 const bool resourceless_software_draw = true;
6859 host_impl_->SetExternalDrawConstraints(external_transform, 6909 host_impl_->SetExternalTilePriorityConstraints(external_viewport,
6860 external_viewport, 6910 external_transform);
6861 external_clip,
6862 external_viewport,
6863 external_transform,
6864 resourceless_software_draw);
6865 6911
6866 EXPECT_EQ(0, software_device->frames_began_); 6912 EXPECT_EQ(0, software_device->frames_began_);
6867 EXPECT_EQ(0, software_device->frames_ended_); 6913 EXPECT_EQ(0, software_device->frames_ended_);
6868 6914
6869 DrawFrame(); 6915 host_impl_->OnDraw(external_transform, external_viewport, external_clip,
6916 resourceless_software_draw);
6870 6917
6871 EXPECT_EQ(1, software_device->frames_began_); 6918 EXPECT_EQ(1, software_device->frames_began_);
6872 EXPECT_EQ(1, software_device->frames_ended_); 6919 EXPECT_EQ(1, software_device->frames_ended_);
6873 6920
6874 // Call another API method that is likely to hit nullptr in this mode. 6921 // Call another API method that is likely to hit nullptr in this mode.
6875 scoped_refptr<base::trace_event::TracedValue> state = 6922 scoped_refptr<base::trace_event::TracedValue> state =
6876 make_scoped_refptr(new base::trace_event::TracedValue()); 6923 make_scoped_refptr(new base::trace_event::TracedValue());
6877 host_impl_->ActivationStateAsValueInto(state.get()); 6924 host_impl_->ActivationStateAsValueInto(state.get());
6878 } 6925 }
6879 6926
6880 TEST_F(LayerTreeHostImplTest, 6927 TEST_F(LayerTreeHostImplTest,
6881 ForcedDrawToSoftwareDeviceSkipsUnsupportedLayers) { 6928 ForcedDrawToSoftwareDeviceSkipsUnsupportedLayers) {
6882 set_reduce_memory_result(false); 6929 set_reduce_memory_result(false);
6883 EXPECT_TRUE(CreateHostImpl(DefaultSettings(), 6930 EXPECT_TRUE(CreateHostImpl(DefaultSettings(),
6884 FakeOutputSurface::CreateSoftware( 6931 FakeOutputSurface::CreateSoftware(
6885 make_scoped_ptr(new CountingSoftwareDevice)))); 6932 make_scoped_ptr(new CountingSoftwareDevice))));
6886 6933
6887 const gfx::Transform external_transform; 6934 const gfx::Transform external_transform;
6888 const gfx::Rect external_viewport; 6935 const gfx::Rect external_viewport;
6889 const gfx::Rect external_clip; 6936 const gfx::Rect external_clip;
6890 const bool resourceless_software_draw = true; 6937 const bool resourceless_software_draw = true;
6891 host_impl_->SetExternalDrawConstraints(external_transform, 6938 host_impl_->SetExternalTilePriorityConstraints(external_viewport,
6892 external_viewport, 6939 external_transform);
6893 external_clip,
6894 external_viewport,
6895 external_transform,
6896 resourceless_software_draw);
6897 6940
6898 // SolidColorLayerImpl will be drawn. 6941 // SolidColorLayerImpl will be drawn.
6899 scoped_ptr<SolidColorLayerImpl> root_layer = 6942 scoped_ptr<SolidColorLayerImpl> root_layer =
6900 SolidColorLayerImpl::Create(host_impl_->active_tree(), 1); 6943 SolidColorLayerImpl::Create(host_impl_->active_tree(), 1);
6901 6944
6902 // VideoLayerImpl will not be drawn. 6945 // VideoLayerImpl will not be drawn.
6903 FakeVideoFrameProvider provider; 6946 FakeVideoFrameProvider provider;
6904 scoped_ptr<VideoLayerImpl> video_layer = VideoLayerImpl::Create( 6947 scoped_ptr<VideoLayerImpl> video_layer = VideoLayerImpl::Create(
6905 host_impl_->active_tree(), 2, &provider, media::VIDEO_ROTATION_0); 6948 host_impl_->active_tree(), 2, &provider, media::VIDEO_ROTATION_0);
6906 video_layer->SetBounds(gfx::Size(10, 10)); 6949 video_layer->SetBounds(gfx::Size(10, 10));
6907 video_layer->SetDrawsContent(true); 6950 video_layer->SetDrawsContent(true);
6908 root_layer->AddChild(std::move(video_layer)); 6951 root_layer->AddChild(std::move(video_layer));
6909 SetupRootLayerImpl(std::move(root_layer)); 6952 SetupRootLayerImpl(std::move(root_layer));
6910 6953
6911 LayerTreeHostImpl::FrameData frame; 6954 host_impl_->OnDraw(external_transform, external_viewport, external_clip,
6912 EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(&frame)); 6955 resourceless_software_draw);
6913 host_impl_->DrawLayers(&frame);
6914 host_impl_->DidDrawAllLayers(frame);
6915 6956
6916 EXPECT_EQ(1u, frame.will_draw_layers.size()); 6957 EXPECT_EQ(1u, last_on_draw_frame_->will_draw_layers.size());
6917 EXPECT_EQ(host_impl_->active_tree()->root_layer(), frame.will_draw_layers[0]); 6958 EXPECT_EQ(host_impl_->active_tree()->root_layer(),
6959 last_on_draw_frame_->will_draw_layers[0]);
6918 } 6960 }
6919 6961
6920 // Checks that we have a non-0 default allocation if we pass a context that 6962 // Checks that we have a non-0 default allocation if we pass a context that
6921 // doesn't support memory management extensions. 6963 // doesn't support memory management extensions.
6922 TEST_F(LayerTreeHostImplTest, DefaultMemoryAllocation) { 6964 TEST_F(LayerTreeHostImplTest, DefaultMemoryAllocation) {
6923 LayerTreeSettings settings = DefaultSettings(); 6965 LayerTreeSettings settings = DefaultSettings();
6924 host_impl_ = LayerTreeHostImpl::Create( 6966 host_impl_ = LayerTreeHostImpl::Create(
6925 settings, this, &task_runner_provider_, &stats_instrumentation_, 6967 settings, this, &task_runner_provider_, &stats_instrumentation_,
6926 &shared_bitmap_manager_, &gpu_memory_buffer_manager_, &task_graph_runner_, 6968 &shared_bitmap_manager_, &gpu_memory_buffer_manager_, &task_graph_runner_,
6927 0); 6969 0);
(...skipping 1501 matching lines...) Expand 10 before | Expand all | Expand 10 after
8429 8471
8430 TEST_F(LayerTreeHostImplTest, ExternalTransformReflectedInNextDraw) { 8472 TEST_F(LayerTreeHostImplTest, ExternalTransformReflectedInNextDraw) {
8431 const gfx::Size layer_size(100, 100); 8473 const gfx::Size layer_size(100, 100);
8432 gfx::Transform external_transform; 8474 gfx::Transform external_transform;
8433 const gfx::Rect external_viewport(layer_size); 8475 const gfx::Rect external_viewport(layer_size);
8434 const gfx::Rect external_clip(layer_size); 8476 const gfx::Rect external_clip(layer_size);
8435 const bool resourceless_software_draw = false; 8477 const bool resourceless_software_draw = false;
8436 LayerImpl* layer = SetupScrollAndContentsLayers(layer_size); 8478 LayerImpl* layer = SetupScrollAndContentsLayers(layer_size);
8437 layer->SetDrawsContent(true); 8479 layer->SetDrawsContent(true);
8438 8480
8439 host_impl_->SetExternalDrawConstraints(external_transform, 8481 host_impl_->SetExternalTilePriorityConstraints(external_viewport,
8440 external_viewport, 8482 external_transform);
8441 external_clip, 8483 host_impl_->OnDraw(external_transform, external_viewport, external_clip,
8442 external_viewport, 8484 resourceless_software_draw);
8443 external_transform,
8444 resourceless_software_draw);
8445 DrawFrame();
8446 EXPECT_TRANSFORMATION_MATRIX_EQ( 8485 EXPECT_TRANSFORMATION_MATRIX_EQ(
8447 external_transform, layer->draw_properties().target_space_transform); 8486 external_transform, layer->draw_properties().target_space_transform);
8448 8487
8449 external_transform.Translate(20, 20); 8488 external_transform.Translate(20, 20);
8450 host_impl_->SetExternalDrawConstraints(external_transform, 8489 host_impl_->SetExternalTilePriorityConstraints(external_viewport,
8451 external_viewport, 8490 external_transform);
8452 external_clip, 8491 host_impl_->OnDraw(external_transform, external_viewport, external_clip,
8453 external_viewport, 8492 resourceless_software_draw);
8454 external_transform,
8455 resourceless_software_draw);
8456 DrawFrame();
8457 EXPECT_TRANSFORMATION_MATRIX_EQ( 8493 EXPECT_TRANSFORMATION_MATRIX_EQ(
8458 external_transform, layer->draw_properties().target_space_transform); 8494 external_transform, layer->draw_properties().target_space_transform);
8459 } 8495 }
8460 8496
8461 TEST_F(LayerTreeHostImplTest, ExternalTransformSetNeedsRedraw) { 8497 TEST_F(LayerTreeHostImplTest, ExternalTransformSetNeedsRedraw) {
8462 SetupRootLayerImpl(LayerImpl::Create(host_impl_->active_tree(), 1)); 8498 SetupRootLayerImpl(LayerImpl::Create(host_impl_->active_tree(), 1));
8463 8499
8464 const gfx::Size layer_size(100, 100); 8500 const gfx::Size viewport_size(100, 100);
8465 const gfx::Transform external_transform; 8501 host_impl_->SetViewportSize(viewport_size);
8466 const gfx::Rect external_viewport(layer_size); 8502
8467 const gfx::Rect external_clip1(layer_size); 8503 const gfx::Transform transform_for_tile_priority;
8468 const gfx::Rect external_clip2(50, 50); 8504 const gfx::Transform draw_transform;
8505 const gfx::Rect viewport_for_tile_priority1(viewport_size);
8506 const gfx::Rect viewport_for_tile_priority2(50, 50);
8507 const gfx::Rect draw_viewport(viewport_size);
8508 const gfx::Rect clip(viewport_size);
8469 bool resourceless_software_draw = false; 8509 bool resourceless_software_draw = false;
8470 8510
8471 resourceless_software_draw = false; 8511 // Clear any damage.
8472 host_impl_->SetExternalDrawConstraints( 8512 host_impl_->SetExternalTilePriorityConstraints(viewport_for_tile_priority1,
8473 external_transform, external_viewport, external_clip1, external_viewport, 8513 transform_for_tile_priority);
8474 external_transform, resourceless_software_draw); 8514 host_impl_->OnDraw(draw_transform, draw_viewport, clip,
8475 { 8515 resourceless_software_draw);
8476 // Clear any damage. 8516 last_on_draw_frame_.reset();
8477 LayerTreeHostImpl::FrameData frame;
8478 EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(&frame));
8479 host_impl_->DrawLayers(&frame);
8480 host_impl_->DidDrawAllLayers(frame);
8481 host_impl_->SwapBuffers(frame);
8482 }
8483 8517
8484 // Setting new constraints needs redraw. 8518 // Setting new constraints needs redraw.
8485 did_request_redraw_ = false; 8519 did_request_redraw_ = false;
8486 host_impl_->SetExternalDrawConstraints( 8520 host_impl_->SetExternalTilePriorityConstraints(viewport_for_tile_priority2,
8487 external_transform, external_viewport, external_clip2, external_viewport, 8521 transform_for_tile_priority);
8488 external_transform, resourceless_software_draw);
8489 EXPECT_TRUE(did_request_redraw_); 8522 EXPECT_TRUE(did_request_redraw_);
8490 { 8523 host_impl_->OnDraw(draw_transform, draw_viewport, clip,
8491 LayerTreeHostImpl::FrameData frame; 8524 resourceless_software_draw);
8492 EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(&frame)); 8525 EXPECT_FALSE(last_on_draw_frame_->has_no_damage);
8493 EXPECT_FALSE(frame.has_no_damage); 8526 }
8494 host_impl_->DrawLayers(&frame); 8527
8495 host_impl_->DidDrawAllLayers(frame); 8528 TEST_F(LayerTreeHostImplTest, OnDrawConstraintSetNeedsRedraw) {
8496 host_impl_->SwapBuffers(frame); 8529 SetupRootLayerImpl(LayerImpl::Create(host_impl_->active_tree(), 1));
8530
8531 const gfx::Size viewport_size(100, 100);
8532 host_impl_->SetViewportSize(viewport_size);
8533
8534 const gfx::Transform draw_transform;
8535 const gfx::Rect draw_viewport1(viewport_size);
8536 const gfx::Rect draw_viewport2(50, 50);
8537 const gfx::Rect clip(viewport_size);
8538 bool resourceless_software_draw = false;
8539
8540 // Clear any damage.
8541 host_impl_->OnDraw(draw_transform, draw_viewport1, clip,
8542 resourceless_software_draw);
8543 last_on_draw_frame_.reset();
8544
8545 // Same draw params does not swap.
8546 did_request_redraw_ = false;
8547 host_impl_->OnDraw(draw_transform, draw_viewport1, clip,
8548 resourceless_software_draw);
8549 EXPECT_FALSE(did_request_redraw_);
8550 EXPECT_TRUE(last_on_draw_frame_->has_no_damage);
8551 last_on_draw_frame_.reset();
8552
8553 // Different draw params does swap.
8554 did_request_redraw_ = false;
8555 host_impl_->OnDraw(draw_transform, draw_viewport2, clip,
8556 resourceless_software_draw);
8557 EXPECT_TRUE(did_request_redraw_);
8558 EXPECT_FALSE(last_on_draw_frame_->has_no_damage);
8559 }
8560
8561 class ResourcelessSoftwareLayerTreeHostImplTest : public LayerTreeHostImplTest {
8562 protected:
8563 scoped_ptr<OutputSurface> CreateOutputSurface() override {
8564 return FakeOutputSurface::Create3dWithResourcelessSoftwareSupport();
8497 } 8565 }
8566 };
8498 8567
8499 // Resourceless software draw toggles do not need redraw. Damage is 8568 TEST_F(ResourcelessSoftwareLayerTreeHostImplTest,
8500 // set externally by SynchronousCompositorOutputSurface in this case. 8569 ResourcelessSoftwareSetNeedsRedraw) {
8570 SetupRootLayerImpl(LayerImpl::Create(host_impl_->active_tree(), 1));
8501 8571
8502 // Setting resourceless_software_draw do not need redraw. 8572 const gfx::Size viewport_size(100, 100);
8503 did_request_redraw_ = false; 8573 host_impl_->SetViewportSize(viewport_size);
8574
8575 const gfx::Transform draw_transform;
8576 const gfx::Rect draw_viewport(viewport_size);
8577 const gfx::Rect clip(viewport_size);
8578 bool resourceless_software_draw = false;
8579
8580 // Clear any damage.
8581 host_impl_->OnDraw(draw_transform, draw_viewport, clip,
8582 resourceless_software_draw);
8583 last_on_draw_frame_.reset();
8584
8585 // Always swap even if same draw params.
8504 resourceless_software_draw = true; 8586 resourceless_software_draw = true;
8505 host_impl_->SetExternalDrawConstraints( 8587 host_impl_->OnDraw(draw_transform, draw_viewport, clip,
8506 external_transform, external_viewport, external_clip1, external_viewport, 8588 resourceless_software_draw);
8507 external_transform, resourceless_software_draw); 8589 EXPECT_FALSE(last_on_draw_frame_->has_no_damage);
8508 EXPECT_FALSE(did_request_redraw_); 8590 last_on_draw_frame_.reset();
8509 // Can't call PrepareToDrawFrame with no change for resourceless software
8510 // draw.
8511 8591
8512 // Unsetting resourceless_software_draw do not need redraw. 8592 // Next hardware draw has damage.
8513 did_request_redraw_ = false;
8514 resourceless_software_draw = false; 8593 resourceless_software_draw = false;
8515 host_impl_->SetExternalDrawConstraints( 8594 host_impl_->OnDraw(draw_transform, draw_viewport, clip,
8516 external_transform, external_viewport, external_clip2, external_viewport, 8595 resourceless_software_draw);
8517 external_transform, resourceless_software_draw); 8596 EXPECT_FALSE(last_on_draw_frame_->has_no_damage);
8518 EXPECT_FALSE(did_request_redraw_);
8519 {
8520 LayerTreeHostImpl::FrameData frame;
8521 EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(&frame));
8522 EXPECT_TRUE(frame.has_no_damage);
8523 }
8524 } 8597 }
8525 8598
8526 TEST_F(LayerTreeHostImplTest, ExternalViewportAffectsVisibleRects) { 8599 TEST_F(LayerTreeHostImplTest, ExternalViewportAffectsVisibleRects) {
8527 const gfx::Size layer_size(100, 100); 8600 const gfx::Size layer_size(100, 100);
8528 SetupScrollAndContentsLayers(layer_size); 8601 SetupScrollAndContentsLayers(layer_size);
8529 LayerImpl* content_layer = host_impl_->active_tree() 8602 LayerImpl* content_layer = host_impl_->active_tree()
8530 ->OuterViewportScrollLayer() 8603 ->OuterViewportScrollLayer()
8531 ->children()[0] 8604 ->children()[0]
8532 .get(); 8605 .get();
8533 RebuildPropertyTrees(); 8606 RebuildPropertyTrees();
8534 8607
8535 bool update_lcd_text = false; 8608 bool update_lcd_text = false;
8536 8609
8537 host_impl_->SetViewportSize(gfx::Size(90, 90)); 8610 host_impl_->SetViewportSize(gfx::Size(90, 90));
8538 host_impl_->active_tree()->UpdateDrawProperties(update_lcd_text); 8611 host_impl_->active_tree()->UpdateDrawProperties(update_lcd_text);
8539 EXPECT_EQ(gfx::Rect(90, 90), content_layer->visible_layer_rect()); 8612 EXPECT_EQ(gfx::Rect(90, 90), content_layer->visible_layer_rect());
8540 8613
8541 gfx::Transform external_transform; 8614 gfx::Transform external_transform;
8542 gfx::Rect external_viewport(10, 20); 8615 gfx::Rect external_viewport(10, 20);
8543 gfx::Rect external_clip(layer_size); 8616 gfx::Rect external_clip(layer_size);
8544 bool resourceless_software_draw = false; 8617 bool resourceless_software_draw = false;
8545 host_impl_->SetExternalDrawConstraints( 8618 host_impl_->SetExternalTilePriorityConstraints(external_viewport,
8546 external_transform, external_viewport, external_clip, external_viewport, 8619 external_transform);
8547 external_transform, resourceless_software_draw); 8620 host_impl_->OnDraw(external_transform, external_viewport, external_clip,
8548 8621 resourceless_software_draw);
8549 // Visible rects should now be clipped by the external viewport.
8550 host_impl_->active_tree()->UpdateDrawProperties(update_lcd_text);
8551 EXPECT_EQ(gfx::Rect(10, 20), content_layer->visible_layer_rect()); 8622 EXPECT_EQ(gfx::Rect(10, 20), content_layer->visible_layer_rect());
8552 8623
8553 // Clear the external viewport. 8624 // Clear the external viewport.
8554 external_viewport = gfx::Rect(); 8625 external_viewport = gfx::Rect();
8555 host_impl_->SetExternalDrawConstraints( 8626 host_impl_->SetExternalTilePriorityConstraints(external_viewport,
8556 external_transform, external_viewport, external_clip, external_viewport, 8627 external_transform);
8557 external_transform, resourceless_software_draw);
8558 8628
8559 host_impl_->active_tree()->UpdateDrawProperties(update_lcd_text); 8629 host_impl_->OnDraw(external_transform, external_viewport, external_clip,
8630 resourceless_software_draw);
8560 EXPECT_EQ(gfx::Rect(90, 90), content_layer->visible_layer_rect()); 8631 EXPECT_EQ(gfx::Rect(90, 90), content_layer->visible_layer_rect());
8561 } 8632 }
8562 8633
8563 TEST_F(LayerTreeHostImplTest, ExternalTransformAffectsVisibleRects) { 8634 TEST_F(LayerTreeHostImplTest, ExternalTransformAffectsVisibleRects) {
8564 const gfx::Size layer_size(100, 100); 8635 const gfx::Size layer_size(100, 100);
8565 SetupScrollAndContentsLayers(layer_size); 8636 SetupScrollAndContentsLayers(layer_size);
8566 LayerImpl* content_layer = host_impl_->active_tree() 8637 LayerImpl* content_layer = host_impl_->active_tree()
8567 ->OuterViewportScrollLayer() 8638 ->OuterViewportScrollLayer()
8568 ->children()[0] 8639 ->children()[0]
8569 .get(); 8640 .get();
8570 RebuildPropertyTrees(); 8641 RebuildPropertyTrees();
8571 8642
8572 bool update_lcd_text = false; 8643 bool update_lcd_text = false;
8573 8644
8574 host_impl_->SetViewportSize(gfx::Size(50, 50)); 8645 host_impl_->SetViewportSize(gfx::Size(50, 50));
8575 host_impl_->active_tree()->UpdateDrawProperties(update_lcd_text); 8646 host_impl_->active_tree()->UpdateDrawProperties(update_lcd_text);
8576 EXPECT_EQ(gfx::Rect(50, 50), content_layer->visible_layer_rect()); 8647 EXPECT_EQ(gfx::Rect(50, 50), content_layer->visible_layer_rect());
8577 8648
8578 gfx::Transform external_transform; 8649 gfx::Transform external_transform;
8579 external_transform.Translate(10, 10); 8650 external_transform.Translate(10, 10);
8580 external_transform.Scale(2, 2); 8651 external_transform.Scale(2, 2);
8581 gfx::Rect external_viewport; 8652 gfx::Rect external_viewport;
8582 gfx::Rect external_clip(layer_size); 8653 gfx::Rect external_clip(layer_size);
8583 bool resourceless_software_draw = false; 8654 bool resourceless_software_draw = false;
8584 host_impl_->SetExternalDrawConstraints( 8655 host_impl_->SetExternalTilePriorityConstraints(external_viewport,
8585 external_transform, external_viewport, external_clip, external_viewport, 8656 external_transform);
8586 external_transform, resourceless_software_draw);
8587 8657
8588 // Visible rects should now be shifted and scaled because of the external 8658 // Visible rects should now be shifted and scaled because of the external
8589 // transform. 8659 // transform.
8590 host_impl_->active_tree()->UpdateDrawProperties(update_lcd_text); 8660 host_impl_->OnDraw(external_transform, external_viewport, external_clip,
8661 resourceless_software_draw);
8591 EXPECT_EQ(gfx::Rect(20, 20), content_layer->visible_layer_rect()); 8662 EXPECT_EQ(gfx::Rect(20, 20), content_layer->visible_layer_rect());
8592 8663
8593 // Clear the external transform. 8664 // Clear the external transform.
8594 external_transform = gfx::Transform(); 8665 external_transform = gfx::Transform();
8595 host_impl_->SetExternalDrawConstraints( 8666 host_impl_->SetExternalTilePriorityConstraints(external_viewport,
8596 external_transform, external_viewport, external_clip, external_viewport, 8667 external_transform);
8597 external_transform, resourceless_software_draw);
8598 8668
8599 host_impl_->active_tree()->UpdateDrawProperties(update_lcd_text); 8669 host_impl_->OnDraw(external_transform, external_viewport, external_clip,
8670 resourceless_software_draw);
8600 EXPECT_EQ(gfx::Rect(50, 50), content_layer->visible_layer_rect()); 8671 EXPECT_EQ(gfx::Rect(50, 50), content_layer->visible_layer_rect());
8601 } 8672 }
8602 8673
8603 TEST_F(LayerTreeHostImplTest, ExternalTransformAffectsSublayerScaleFactor) { 8674 TEST_F(LayerTreeHostImplTest, ExternalTransformAffectsSublayerScaleFactor) {
8604 const gfx::Size layer_size(100, 100); 8675 const gfx::Size layer_size(100, 100);
8605 SetupScrollAndContentsLayers(layer_size); 8676 SetupScrollAndContentsLayers(layer_size);
8606 LayerImpl* content_layer = host_impl_->active_tree() 8677 LayerImpl* content_layer = host_impl_->active_tree()
8607 ->OuterViewportScrollLayer() 8678 ->OuterViewportScrollLayer()
8608 ->children()[0] 8679 ->children()[0]
8609 .get(); 8680 .get();
(...skipping 15 matching lines...) Expand all
8625 host_impl_->active_tree()->property_trees()->transform_tree.Node( 8696 host_impl_->active_tree()->property_trees()->transform_tree.Node(
8626 test_layer->transform_tree_index()); 8697 test_layer->transform_tree_index());
8627 EXPECT_EQ(node->data.sublayer_scale, gfx::Vector2dF(1.f, 1.f)); 8698 EXPECT_EQ(node->data.sublayer_scale, gfx::Vector2dF(1.f, 1.f));
8628 8699
8629 gfx::Transform external_transform; 8700 gfx::Transform external_transform;
8630 external_transform.Translate(10, 10); 8701 external_transform.Translate(10, 10);
8631 external_transform.Scale(2, 2); 8702 external_transform.Scale(2, 2);
8632 gfx::Rect external_viewport; 8703 gfx::Rect external_viewport;
8633 gfx::Rect external_clip(layer_size); 8704 gfx::Rect external_clip(layer_size);
8634 bool resourceless_software_draw = false; 8705 bool resourceless_software_draw = false;
8635 host_impl_->SetExternalDrawConstraints( 8706 host_impl_->SetExternalTilePriorityConstraints(external_viewport,
8636 external_transform, external_viewport, external_clip, external_viewport, 8707 external_transform);
8637 external_transform, resourceless_software_draw);
8638 8708
8639 // Transform node's sublayer scale should include the device transform scale. 8709 // Transform node's sublayer scale should include the device transform scale.
8640 host_impl_->active_tree()->UpdateDrawProperties(update_lcd_text); 8710 host_impl_->OnDraw(external_transform, external_viewport, external_clip,
8711 resourceless_software_draw);
8641 node = host_impl_->active_tree()->property_trees()->transform_tree.Node( 8712 node = host_impl_->active_tree()->property_trees()->transform_tree.Node(
8642 test_layer->transform_tree_index()); 8713 test_layer->transform_tree_index());
8643 EXPECT_EQ(node->data.sublayer_scale, gfx::Vector2dF(2.f, 2.f)); 8714 EXPECT_EQ(node->data.sublayer_scale, gfx::Vector2dF(2.f, 2.f));
8644 8715
8645 // Clear the external transform. 8716 // Clear the external transform.
8646 external_transform = gfx::Transform(); 8717 external_transform = gfx::Transform();
8647 host_impl_->SetExternalDrawConstraints( 8718 host_impl_->SetExternalTilePriorityConstraints(external_viewport,
8648 external_transform, external_viewport, external_clip, external_viewport, 8719 external_transform);
8649 external_transform, resourceless_software_draw);
8650 8720
8651 host_impl_->active_tree()->UpdateDrawProperties(update_lcd_text); 8721 host_impl_->OnDraw(external_transform, external_viewport, external_clip,
8722 resourceless_software_draw);
8652 node = host_impl_->active_tree()->property_trees()->transform_tree.Node( 8723 node = host_impl_->active_tree()->property_trees()->transform_tree.Node(
8653 test_layer->transform_tree_index()); 8724 test_layer->transform_tree_index());
8654 EXPECT_EQ(node->data.sublayer_scale, gfx::Vector2dF(1.f, 1.f)); 8725 EXPECT_EQ(node->data.sublayer_scale, gfx::Vector2dF(1.f, 1.f));
8655 } 8726 }
8656 8727
8657 TEST_F(LayerTreeHostImplTest, ScrollAnimated) { 8728 TEST_F(LayerTreeHostImplTest, ScrollAnimated) {
8658 SetupScrollAndContentsLayers(gfx::Size(100, 200)); 8729 SetupScrollAndContentsLayers(gfx::Size(100, 200));
8659 8730
8660 // Shrink the outer viewport clip layer so that the outer viewport can scroll. 8731 // Shrink the outer viewport clip layer so that the outer viewport can scroll.
8661 host_impl_->OuterViewportScrollLayer()->parent()->SetBounds( 8732 host_impl_->OuterViewportScrollLayer()->parent()->SetBounds(
(...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after
9326 // There should not be any jitter measured till we hit the fixed point hits 9397 // There should not be any jitter measured till we hit the fixed point hits
9327 // threshold. 9398 // threshold.
9328 float expected_jitter = 9399 float expected_jitter =
9329 (i == pending_tree->kFixedPointHitsThreshold) ? 500 : 0; 9400 (i == pending_tree->kFixedPointHitsThreshold) ? 500 : 0;
9330 EXPECT_EQ(jitter, expected_jitter); 9401 EXPECT_EQ(jitter, expected_jitter);
9331 } 9402 }
9332 } 9403 }
9333 9404
9334 } // namespace 9405 } // namespace
9335 } // namespace cc 9406 } // 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