Index: cc/trees/layer_tree_host_unittest_damage.cc |
diff --git a/cc/trees/layer_tree_host_unittest_damage.cc b/cc/trees/layer_tree_host_unittest_damage.cc |
deleted file mode 100644 |
index daff40beb2dec4bff98288a3a946901ffa4f83fc..0000000000000000000000000000000000000000 |
--- a/cc/trees/layer_tree_host_unittest_damage.cc |
+++ /dev/null |
@@ -1,534 +0,0 @@ |
-// Copyright 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "cc/trees/layer_tree_host.h" |
- |
-#include "base/bind.h" |
-#include "base/callback.h" |
-#include "base/location.h" |
-#include "base/message_loop/message_loop_proxy.h" |
-#include "base/time/time.h" |
-#include "cc/test/fake_content_layer.h" |
-#include "cc/test/fake_content_layer_client.h" |
-#include "cc/test/fake_painted_scrollbar_layer.h" |
-#include "cc/test/fake_picture_layer.h" |
-#include "cc/test/layer_tree_test.h" |
-#include "cc/trees/damage_tracker.h" |
-#include "cc/trees/layer_tree_impl.h" |
- |
-namespace cc { |
-namespace { |
- |
-// These tests deal with damage tracking. |
-class LayerTreeHostDamageTest : public LayerTreeTest {}; |
- |
-// LayerTreeHost::SetNeedsRedraw should damage the whole viewport. |
-class LayerTreeHostDamageTestSetNeedsRedraw |
- : public LayerTreeHostDamageTest { |
- void SetupTree() override { |
- // Viewport is 10x10. |
- scoped_refptr<FakeContentLayer> root = FakeContentLayer::Create(&client_); |
- root->SetBounds(gfx::Size(10, 10)); |
- |
- layer_tree_host()->SetRootLayer(root); |
- LayerTreeHostDamageTest::SetupTree(); |
- } |
- |
- void BeginTest() override { |
- draw_count_ = 0; |
- PostSetNeedsCommitToMainThread(); |
- } |
- |
- void DidCommitAndDrawFrame() override { |
- switch (layer_tree_host()->source_frame_number()) { |
- case 1: |
- layer_tree_host()->SetNeedsRedraw(); |
- break; |
- } |
- } |
- |
- DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* impl, |
- LayerTreeHostImpl::FrameData* frame_data, |
- DrawResult draw_result) override { |
- EXPECT_EQ(DRAW_SUCCESS, draw_result); |
- |
- RenderSurfaceImpl* root_surface = |
- impl->active_tree()->root_layer()->render_surface(); |
- gfx::RectF root_damage = |
- root_surface->damage_tracker()->current_damage_rect(); |
- |
- switch (draw_count_) { |
- case 0: |
- // The first frame has full damage. |
- EXPECT_EQ(gfx::RectF(10.f, 10.f).ToString(), root_damage.ToString()); |
- break; |
- case 1: |
- // The second frame has full damage. |
- EXPECT_EQ(gfx::RectF(10.f, 10.f).ToString(), root_damage.ToString()); |
- EndTest(); |
- break; |
- case 2: |
- NOTREACHED(); |
- } |
- |
- ++draw_count_; |
- return draw_result; |
- } |
- |
- void AfterTest() override {} |
- |
- int draw_count_; |
- FakeContentLayerClient client_; |
-}; |
- |
-SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDamageTestSetNeedsRedraw); |
- |
-// LayerTreeHost::SetViewportSize should damage the whole viewport. |
-class LayerTreeHostDamageTestSetViewportSize |
- : public LayerTreeHostDamageTest { |
- void SetupTree() override { |
- // Viewport is 10x10. |
- scoped_refptr<FakeContentLayer> root = FakeContentLayer::Create(&client_); |
- root->SetBounds(gfx::Size(10, 10)); |
- |
- layer_tree_host()->SetRootLayer(root); |
- LayerTreeHostDamageTest::SetupTree(); |
- } |
- |
- void BeginTest() override { |
- draw_count_ = 0; |
- PostSetNeedsCommitToMainThread(); |
- } |
- |
- void DidCommitAndDrawFrame() override { |
- switch (layer_tree_host()->source_frame_number()) { |
- case 1: |
- layer_tree_host()->SetViewportSize(gfx::Size(15, 15)); |
- break; |
- } |
- } |
- |
- DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* impl, |
- LayerTreeHostImpl::FrameData* frame_data, |
- DrawResult draw_result) override { |
- EXPECT_EQ(DRAW_SUCCESS, draw_result); |
- |
- RenderSurfaceImpl* root_surface = |
- impl->active_tree()->root_layer()->render_surface(); |
- gfx::RectF root_damage = |
- root_surface->damage_tracker()->current_damage_rect(); |
- |
- switch (draw_count_) { |
- case 0: |
- // The first frame has full damage. |
- EXPECT_EQ(gfx::RectF(10.f, 10.f).ToString(), root_damage.ToString()); |
- break; |
- case 1: |
- // The second frame has full damage. |
- EXPECT_EQ(gfx::RectF(15.f, 15.f).ToString(), root_damage.ToString()); |
- EndTest(); |
- break; |
- case 2: |
- NOTREACHED(); |
- } |
- |
- ++draw_count_; |
- return draw_result; |
- } |
- |
- void AfterTest() override {} |
- |
- int draw_count_; |
- FakeContentLayerClient client_; |
-}; |
- |
-SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostDamageTestSetViewportSize); |
- |
-class LayerTreeHostDamageTestNoDamageDoesNotSwap |
- : public LayerTreeHostDamageTest { |
- void BeginTest() override { |
- expect_swap_and_succeed_ = 0; |
- did_swaps_ = 0; |
- did_swap_and_succeed_ = 0; |
- PostSetNeedsCommitToMainThread(); |
- } |
- |
- void SetupTree() override { |
- scoped_refptr<FakeContentLayer> root = FakeContentLayer::Create(&client_); |
- root->SetBounds(gfx::Size(10, 10)); |
- |
- // Most of the layer isn't visible. |
- content_ = FakeContentLayer::Create(&client_); |
- content_->SetBounds(gfx::Size(2000, 100)); |
- root->AddChild(content_); |
- |
- layer_tree_host()->SetRootLayer(root); |
- LayerTreeHostDamageTest::SetupTree(); |
- } |
- |
- DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, |
- LayerTreeHostImpl::FrameData* frame_data, |
- DrawResult draw_result) override { |
- EXPECT_EQ(DRAW_SUCCESS, draw_result); |
- |
- int source_frame = host_impl->active_tree()->source_frame_number(); |
- switch (source_frame) { |
- case 0: |
- // The first frame has damage, so we should draw and swap. |
- ++expect_swap_and_succeed_; |
- break; |
- case 1: |
- // The second frame has no damage, so we should not draw and swap. |
- break; |
- case 2: |
- // The third frame has damage again, so we should draw and swap. |
- ++expect_swap_and_succeed_; |
- break; |
- case 3: |
- // The fourth frame has no visible damage, so we should not draw and |
- // swap. |
- EndTest(); |
- break; |
- } |
- return draw_result; |
- } |
- |
- void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) override { |
- ++did_swaps_; |
- if (result) |
- ++did_swap_and_succeed_; |
- EXPECT_EQ(expect_swap_and_succeed_, did_swap_and_succeed_); |
- } |
- |
- void DidCommit() override { |
- int next_frame = layer_tree_host()->source_frame_number(); |
- switch (next_frame) { |
- case 1: |
- layer_tree_host()->SetNeedsCommit(); |
- break; |
- case 2: |
- // Cause visible damage. |
- content_->SetNeedsDisplayRect( |
- gfx::Rect(layer_tree_host()->device_viewport_size())); |
- break; |
- case 3: |
- // Cause non-visible damage. |
- content_->SetNeedsDisplayRect(gfx::Rect(1990, 1990, 10, 10)); |
- layer_tree_host()->SetNeedsCommit(); |
- break; |
- } |
- } |
- |
- void AfterTest() override { |
- EXPECT_EQ(4, did_swaps_); |
- EXPECT_EQ(2, expect_swap_and_succeed_); |
- EXPECT_EQ(expect_swap_and_succeed_, did_swap_and_succeed_); |
- } |
- |
- FakeContentLayerClient client_; |
- scoped_refptr<FakeContentLayer> content_; |
- int expect_swap_and_succeed_; |
- int did_swaps_; |
- int did_swap_and_succeed_; |
-}; |
- |
-SINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F( |
- LayerTreeHostDamageTestNoDamageDoesNotSwap); |
- |
-class LayerTreeHostDamageTestForcedFullDamage : public LayerTreeHostDamageTest { |
- void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
- |
- void SetupTree() override { |
- root_ = FakeContentLayer::Create(&client_); |
- child_ = FakeContentLayer::Create(&client_); |
- |
- root_->SetBounds(gfx::Size(500, 500)); |
- child_->SetPosition(gfx::Point(100, 100)); |
- child_->SetBounds(gfx::Size(30, 30)); |
- |
- root_->AddChild(child_); |
- layer_tree_host()->SetRootLayer(root_); |
- LayerTreeHostDamageTest::SetupTree(); |
- } |
- |
- DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, |
- LayerTreeHostImpl::FrameData* frame_data, |
- DrawResult draw_result) override { |
- EXPECT_EQ(DRAW_SUCCESS, draw_result); |
- |
- RenderSurfaceImpl* root_surface = |
- host_impl->active_tree()->root_layer()->render_surface(); |
- gfx::RectF root_damage = |
- root_surface->damage_tracker()->current_damage_rect(); |
- root_damage.Intersect(root_surface->content_rect()); |
- |
- int source_frame = host_impl->active_tree()->source_frame_number(); |
- switch (source_frame) { |
- case 0: |
- // The first frame draws and clears any damage. |
- EXPECT_EQ(gfx::RectF(root_surface->content_rect()).ToString(), |
- root_damage.ToString()); |
- EXPECT_FALSE(frame_data->has_no_damage); |
- break; |
- case 1: |
- // If we get a frame without damage then we don't draw. |
- EXPECT_EQ(gfx::RectF().ToString(), root_damage.ToString()); |
- EXPECT_TRUE(frame_data->has_no_damage); |
- |
- // Then we set full damage for the next frame. |
- host_impl->SetFullRootLayerDamage(); |
- break; |
- case 2: |
- // The whole frame should be damaged as requested. |
- EXPECT_EQ(gfx::RectF(root_surface->content_rect()).ToString(), |
- root_damage.ToString()); |
- EXPECT_FALSE(frame_data->has_no_damage); |
- |
- // Just a part of the next frame should be damaged. |
- child_damage_rect_ = gfx::Rect(10, 11, 12, 13); |
- break; |
- case 3: |
- // The update rect in the child should be damaged and the damaged area |
- // should match the invalidation. |
- EXPECT_EQ(gfx::RectF(100+10, 100+11, 12, 13).ToString(), |
- root_damage.ToString()); |
- |
- // TODO(danakj): Remove this when impl side painting is always on. |
- if (delegating_renderer() || |
- host_impl->settings().impl_side_painting) { |
- // When using a delegating renderer, or using impl side painting, the |
- // entire child is considered damaged as we need to replace its |
- // resources with newly created ones. The damaged area is kept as it |
- // is, but entire child is painted. |
- |
- // The paint rect should match the layer bounds. |
- gfx::RectF paint_rect = child_->LastPaintRect(); |
- paint_rect.set_origin(child_->position()); |
- EXPECT_EQ(gfx::RectF(100, 100, 30, 30).ToString(), |
- paint_rect.ToString()); |
- } |
- EXPECT_FALSE(frame_data->has_no_damage); |
- |
- // If we damage part of the frame, but also damage the full |
- // frame, then the whole frame should be damaged. |
- child_damage_rect_ = gfx::Rect(10, 11, 12, 13); |
- host_impl->SetFullRootLayerDamage(); |
- break; |
- case 4: |
- // The whole frame is damaged. |
- EXPECT_EQ(gfx::RectF(root_surface->content_rect()).ToString(), |
- root_damage.ToString()); |
- EXPECT_FALSE(frame_data->has_no_damage); |
- |
- EndTest(); |
- break; |
- } |
- return draw_result; |
- } |
- |
- void DidCommitAndDrawFrame() override { |
- if (!TestEnded()) |
- layer_tree_host()->SetNeedsCommit(); |
- |
- if (!child_damage_rect_.IsEmpty()) { |
- child_->SetNeedsDisplayRect(child_damage_rect_); |
- child_damage_rect_ = gfx::Rect(); |
- } |
- } |
- |
- void AfterTest() override {} |
- |
- FakeContentLayerClient client_; |
- scoped_refptr<FakeContentLayer> root_; |
- scoped_refptr<FakeContentLayer> child_; |
- gfx::Rect child_damage_rect_; |
-}; |
- |
-SINGLE_AND_MULTI_THREAD_NOIMPL_TEST_F(LayerTreeHostDamageTestForcedFullDamage); |
- |
-class LayerTreeHostScrollbarDamageTest : public LayerTreeHostDamageTest { |
- void SetupTree() override { |
- scoped_refptr<Layer> root_layer = Layer::Create(); |
- root_layer->SetBounds(gfx::Size(400, 400)); |
- root_layer->SetMasksToBounds(true); |
- layer_tree_host()->SetRootLayer(root_layer); |
- |
- scoped_refptr<Layer> scroll_clip_layer = Layer::Create(); |
- scoped_refptr<Layer> content_layer = FakeContentLayer::Create(&client_); |
- content_layer->SetScrollClipLayerId(scroll_clip_layer->id()); |
- content_layer->SetScrollOffset(gfx::ScrollOffset(10, 20)); |
- content_layer->SetBounds(gfx::Size(100, 200)); |
- scroll_clip_layer->SetBounds( |
- gfx::Size(content_layer->bounds().width() - 30, |
- content_layer->bounds().height() - 50)); |
- scroll_clip_layer->AddChild(content_layer); |
- root_layer->AddChild(scroll_clip_layer); |
- |
- scoped_refptr<Layer> scrollbar_layer = |
- FakePaintedScrollbarLayer::Create(false, true, content_layer->id()); |
- scrollbar_layer->SetPosition(gfx::Point(300, 300)); |
- scrollbar_layer->SetBounds(gfx::Size(10, 100)); |
- scrollbar_layer->ToScrollbarLayer()->SetClipLayer(scroll_clip_layer->id()); |
- scrollbar_layer->ToScrollbarLayer()->SetScrollLayer(content_layer->id()); |
- root_layer->AddChild(scrollbar_layer); |
- |
- gfx::RectF content_rect(content_layer->position(), |
- content_layer->bounds()); |
- gfx::RectF scrollbar_rect(scrollbar_layer->position(), |
- scrollbar_layer->bounds()); |
- EXPECT_FALSE(content_rect.Intersects(scrollbar_rect)); |
- |
- LayerTreeHostDamageTest::SetupTree(); |
- } |
- |
- private: |
- FakeContentLayerClient client_; |
-}; |
- |
-class LayerTreeHostDamageTestScrollbarDoesDamage |
- : public LayerTreeHostScrollbarDamageTest { |
- void BeginTest() override { |
- did_swaps_ = 0; |
- PostSetNeedsCommitToMainThread(); |
- } |
- |
- DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, |
- LayerTreeHostImpl::FrameData* frame_data, |
- DrawResult draw_result) override { |
- EXPECT_EQ(DRAW_SUCCESS, draw_result); |
- RenderSurfaceImpl* root_surface = |
- host_impl->active_tree()->root_layer()->render_surface(); |
- gfx::RectF root_damage = |
- root_surface->damage_tracker()->current_damage_rect(); |
- root_damage.Intersect(root_surface->content_rect()); |
- switch (did_swaps_) { |
- case 0: |
- // The first frame has damage, so we should draw and swap. |
- break; |
- case 1: |
- // The second frame should not damage the scrollbars. |
- EXPECT_FALSE(root_damage.Intersects(gfx::Rect(300, 300, 10, 100))); |
- break; |
- case 2: |
- // The third frame should damage the scrollbars. |
- EXPECT_TRUE(root_damage.Contains(gfx::Rect(300, 300, 10, 100))); |
- break; |
- case 3: |
- // The fourth frame should damage the scrollbars. |
- EXPECT_TRUE(root_damage.Contains(gfx::Rect(300, 300, 10, 100))); |
- EndTest(); |
- break; |
- } |
- return draw_result; |
- } |
- |
- void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) override { |
- ++did_swaps_; |
- EXPECT_TRUE(result); |
- LayerImpl* root = host_impl->active_tree()->root_layer(); |
- LayerImpl* scroll_clip_layer = root->children()[0]; |
- LayerImpl* scroll_layer = scroll_clip_layer->children()[0]; |
- switch (did_swaps_) { |
- case 1: |
- // Test that modifying the position of the content layer (not |
- // scrolling) won't damage the scrollbar. |
- scroll_layer->SetPosition(gfx::Point(1, 1)); |
- scroll_layer->PushScrollOffsetFromMainThread( |
- scroll_layer->BaseScrollOffset()); |
- host_impl->SetNeedsRedraw(); |
- break; |
- case 2: |
- scroll_layer->ScrollBy(gfx::Vector2dF(10.f, 10.f)); |
- host_impl->SetNeedsRedraw(); |
- break; |
- case 3: |
- scroll_layer->SetBounds(gfx::Size(root->bounds().width() + 60, |
- root->bounds().height() + 100)); |
- host_impl->SetNeedsRedraw(); |
- break; |
- } |
- } |
- |
- void AfterTest() override { EXPECT_EQ(4, did_swaps_); } |
- |
- int did_swaps_; |
-}; |
- |
-MULTI_THREAD_TEST_F(LayerTreeHostDamageTestScrollbarDoesDamage); |
- |
-class LayerTreeHostDamageTestScrollbarCommitDoesNoDamage |
- : public LayerTreeHostScrollbarDamageTest { |
- void BeginTest() override { |
- did_swaps_ = 0; |
- PostSetNeedsCommitToMainThread(); |
- } |
- |
- DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, |
- LayerTreeHostImpl::FrameData* frame_data, |
- DrawResult draw_result) override { |
- EXPECT_EQ(DRAW_SUCCESS, draw_result); |
- RenderSurfaceImpl* root_surface = |
- host_impl->active_tree()->root_layer()->render_surface(); |
- gfx::RectF root_damage = |
- root_surface->damage_tracker()->current_damage_rect(); |
- root_damage.Intersect(root_surface->content_rect()); |
- int frame = host_impl->active_tree()->source_frame_number(); |
- switch (did_swaps_) { |
- case 0: |
- // The first frame has damage, so we should draw and swap. |
- EXPECT_EQ(0, frame); |
- break; |
- case 1: |
- // The second frame has scrolled, so the scrollbar should be damaged. |
- EXPECT_EQ(0, frame); |
- EXPECT_TRUE(root_damage.Contains(gfx::Rect(300, 300, 10, 100))); |
- break; |
- case 2: |
- // The third frame (after the commit) has no changes, so it shouldn't. |
- EXPECT_EQ(1, frame); |
- EXPECT_FALSE(root_damage.Intersects(gfx::Rect(300, 300, 10, 100))); |
- break; |
- default: |
- NOTREACHED(); |
- break; |
- } |
- return draw_result; |
- } |
- |
- void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, bool result) override { |
- ++did_swaps_; |
- EXPECT_TRUE(result); |
- LayerImpl* root = host_impl->active_tree()->root_layer(); |
- LayerImpl* scroll_clip_layer = root->children()[0]; |
- LayerImpl* scroll_layer = scroll_clip_layer->children()[0]; |
- switch (did_swaps_) { |
- case 1: |
- // Scroll on the thread. This should damage the scrollbar for the |
- // next draw on the thread. |
- scroll_layer->ScrollBy(gfx::Vector2dF(10.f, 10.f)); |
- host_impl->SetNeedsRedraw(); |
- break; |
- case 2: |
- // Forcibly send the scroll to the main thread. |
- PostSetNeedsCommitToMainThread(); |
- break; |
- case 3: |
- // First swap after second commit. |
- EndTest(); |
- break; |
- default: |
- NOTREACHED(); |
- break; |
- } |
- } |
- |
- void AfterTest() override { EXPECT_EQ(3, did_swaps_); } |
- |
- int did_swaps_; |
-}; |
- |
-MULTI_THREAD_TEST_F(LayerTreeHostDamageTestScrollbarCommitDoesNoDamage); |
- |
-} // namespace |
-} // namespace cc |