diff options
author | epenner@chromium.org <epenner@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-07 04:32:14 +0000 |
---|---|---|
committer | epenner@chromium.org <epenner@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-07 04:32:14 +0000 |
commit | 1e212c9bbd9f750af687171ad64e0d4a17004d47 (patch) | |
tree | 84f1be2bc9eeb0dfb9c6b7052fa6b9f0f47495a8 /cc/trees/layer_tree_host_unittest_damage.cc | |
parent | 306b92072c17b06051ff98f187620c654a61157f (diff) | |
download | chromium_src-1e212c9bbd9f750af687171ad64e0d4a17004d47.zip chromium_src-1e212c9bbd9f750af687171ad64e0d4a17004d47.tar.gz chromium_src-1e212c9bbd9f750af687171ad64e0d4a17004d47.tar.bz2 |
CC: Fix missing swap-used-incomplete-tile updates
When we early-out of a frame that has no damage, we didn't
correctly detect if the frame had incomplete tiles. This
patch only updates the flag if a swap actually occurs.
To prevent this kind of bug in the future, this patch
always sets the did-swap-use-incomplete-tile flag when it is
known, rather than resetting it to false in one place and
hoping it will always be set again correctly in all cases.
The test times-out without this patch.
BUG=284810
Review URL: https://chromiumcodereview.appspot.com/23686011
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@221891 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc/trees/layer_tree_host_unittest_damage.cc')
-rw-r--r-- | cc/trees/layer_tree_host_unittest_damage.cc | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/cc/trees/layer_tree_host_unittest_damage.cc b/cc/trees/layer_tree_host_unittest_damage.cc index 9c61b11..bb66b20 100644 --- a/cc/trees/layer_tree_host_unittest_damage.cc +++ b/cc/trees/layer_tree_host_unittest_damage.cc @@ -12,6 +12,7 @@ #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" @@ -688,5 +689,102 @@ class LayerTreeHostDamageTestScrollbarCommitDoesNoDamage MULTI_THREAD_TEST_F(LayerTreeHostDamageTestScrollbarCommitDoesNoDamage); +class LayerTreeHostDamageTestVisibleTilesStillTriggerDraws + : public LayerTreeHostDamageTest { + + virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { + settings->impl_side_painting = true; + } + + virtual void BeginTest() OVERRIDE { + PostSetNeedsCommitToMainThread(); + } + + virtual void SetupTree() OVERRIDE { + scoped_refptr<FakePictureLayer> root = FakePictureLayer::Create(&client_); + root->SetBounds(gfx::Size(500, 500)); + layer_tree_host()->SetRootLayer(root); + LayerTreeHostDamageTest::SetupTree(); + + swap_count_ = 0; + prepare_to_draw_count_ = 0; + update_visible_tile_count_ = 0; + } + + virtual bool PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, + LayerTreeHostImpl::FrameData* frame_data, + bool result) OVERRIDE { + EXPECT_TRUE(result); + prepare_to_draw_count_++; + switch (prepare_to_draw_count_) { + case 1: + // Detect that we have an incomplete tile, during the first frame. + // The first frame should have damage. + frame_data->contains_incomplete_tile = true; + DCHECK(!frame_data->has_no_damage); + break; + case 2: + // Make a no-damage frame. We early out and can't detect + // incomplete tiles, even if they still exist. + frame_data->contains_incomplete_tile = false; + frame_data->has_no_damage = true; + break; + case 3: + // Trigger the last swap for the completed tile. + frame_data->contains_incomplete_tile = false; + frame_data->has_no_damage = false; + EndTest(); + break; + default: + NOTREACHED(); + break; + } + + return result; + } + + virtual void UpdateVisibleTilesOnThread( + LayerTreeHostImpl* host_impl) OVERRIDE { + // Simulate creating some visible tiles (that trigger prepare-to-draws). + // The first we make into a no-damage-frame during prepare-to-draw (see + // above). This is to ensure we still get UpdateVisibleTiles calls after + // a no-damage or aborted frame. + update_visible_tile_count_++; + switch (update_visible_tile_count_) { + case 3: + case 6: + host_impl->DidInitializeVisibleTileForTesting(); + break; + case 7: + NOTREACHED(); + break; + } + } + + virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, + bool didSwap) OVERRIDE { + if (!didSwap) + return; + ++swap_count_; + } + + virtual void AfterTest() OVERRIDE { + // We should keep getting update-visible-tiles calls + // until we report there are no more incomplete-tiles. + EXPECT_EQ(update_visible_tile_count_, 6); + // First frame, plus two triggered by DidInitializeVisibleTile() + EXPECT_EQ(prepare_to_draw_count_, 3); + // First swap, plus final swap (contained damage). + EXPECT_EQ(swap_count_, 2); + } + + FakeContentLayerClient client_; + int swap_count_; + int prepare_to_draw_count_; + int update_visible_tile_count_; +}; + +MULTI_THREAD_TEST_F(LayerTreeHostDamageTestVisibleTilesStillTriggerDraws); + } // namespace } // namespace cc |