diff options
author | boliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-24 16:12:43 +0000 |
---|---|---|
committer | boliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-24 16:12:43 +0000 |
commit | f0f1366ddef6fc897bef2c0a037866a1987a656e (patch) | |
tree | dc40704e2d6799c4a5155daf764c30cc099a8808 /cc | |
parent | b9e7238d7551bcfdeaae1a1afdc69f8e8009b1a6 (diff) | |
download | chromium_src-f0f1366ddef6fc897bef2c0a037866a1987a656e.zip chromium_src-f0f1366ddef6fc897bef2c0a037866a1987a656e.tar.gz chromium_src-f0f1366ddef6fc897bef2c0a037866a1987a656e.tar.bz2 |
cc: Fix CHECK failure in PictureLayerImpl::UpdateTilePriorities
The should_update_tile_priorities_ in UpdateTilePriorities my fail and
here's the sequence of events:
* Context loss while layer is invisible, which clears
should_update_tile_priorities_
* CalculateContentsScale is skipped because layer is invisible
* Layer becomes visible in next commit, and active layer SyncTiling
during the commit will fail the check.
Any condition that causes CalculateContentsScale on the layer works as
well.
Internal bug b/11265055
BUG=
TEST=PictureLayerImplTest.SyncTilingAfterReleaseResource
Review URL: https://codereview.chromium.org/38863002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@230735 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc')
-rw-r--r-- | cc/layers/picture_layer_impl.cc | 3 | ||||
-rw-r--r-- | cc/layers/picture_layer_impl_unittest.cc | 15 |
2 files changed, 17 insertions, 1 deletions
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc index 36b2ba9..0ab4a5d 100644 --- a/cc/layers/picture_layer_impl.cc +++ b/cc/layers/picture_layer_impl.cc @@ -611,7 +611,8 @@ void PictureLayerImpl::SyncTiling( // get updated prior to drawing or activation. If this tree does not // need update draw properties, then its transforms are up to date and // we can create tiles for this tiling immediately. - if (!layer_tree_impl()->needs_update_draw_properties()) + if (!layer_tree_impl()->needs_update_draw_properties() && + should_update_tile_priorities_) UpdateTilePriorities(); } diff --git a/cc/layers/picture_layer_impl_unittest.cc b/cc/layers/picture_layer_impl_unittest.cc index f9dfb99..2f72c7d 100644 --- a/cc/layers/picture_layer_impl_unittest.cc +++ b/cc/layers/picture_layer_impl_unittest.cc @@ -1106,6 +1106,21 @@ TEST_F(PictureLayerImplTest, ActivateUninitializedLayer) { EXPECT_FALSE(active_layer_->needs_post_commit_initialization()); } +TEST_F(PictureLayerImplTest, SyncTilingAfterReleaseResource) { + SetupDefaultTrees(gfx::Size(10, 10)); + host_impl_.active_tree()->UpdateDrawProperties(); + EXPECT_FALSE(host_impl_.active_tree()->needs_update_draw_properties()); + + // Contrived unit test of a real crash. A layer is transparent during a + // context loss, and later becomes opaque, causing active layer SyncTiling to + // be called. + const float tile_scale = 2.f; + active_layer_->DidLoseOutputSurface(); + EXPECT_FALSE(active_layer_->tilings()->TilingAtScale(tile_scale)); + pending_layer_->AddTiling(2.f); + EXPECT_TRUE(active_layer_->tilings()->TilingAtScale(tile_scale)); +} + class DeferredInitPictureLayerImplTest : public PictureLayerImplTest { public: DeferredInitPictureLayerImplTest() |