summaryrefslogtreecommitdiffstats
path: root/cc
diff options
context:
space:
mode:
authorboliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-24 16:12:43 +0000
committerboliu@chromium.org <boliu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-24 16:12:43 +0000
commitf0f1366ddef6fc897bef2c0a037866a1987a656e (patch)
treedc40704e2d6799c4a5155daf764c30cc099a8808 /cc
parentb9e7238d7551bcfdeaae1a1afdc69f8e8009b1a6 (diff)
downloadchromium_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.cc3
-rw-r--r--cc/layers/picture_layer_impl_unittest.cc15
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()