| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/trees/layer_tree_host_impl.h" | 5 #include "cc/trees/layer_tree_host_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 #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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |