summaryrefslogtreecommitdiffstats
path: root/cc/trees/layer_tree_host_unittest_damage.cc
diff options
context:
space:
mode:
authorepenner@chromium.org <epenner@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-07 04:32:14 +0000
committerepenner@chromium.org <epenner@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-07 04:32:14 +0000
commit1e212c9bbd9f750af687171ad64e0d4a17004d47 (patch)
tree84f1be2bc9eeb0dfb9c6b7052fa6b9f0f47495a8 /cc/trees/layer_tree_host_unittest_damage.cc
parent306b92072c17b06051ff98f187620c654a61157f (diff)
downloadchromium_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.cc98
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