Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(349)

Unified Diff: cc/trees/layer_tree_host_impl_unittest.cc

Issue 2899403003: cc: Give non-drawing layers that are rasterized a lower priority. (Closed)
Patch Set: type Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/trees/layer_tree_host_common_unittest.cc ('k') | cc/trees/layer_tree_impl.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/trees/layer_tree_host_impl_unittest.cc
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index a9e5a559a68a02739e4a0aea73abb2d1255eccb2..405daa0b1b6264d1196ba9c1d568157887d12d26 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -12396,5 +12396,136 @@ TEST_F(LayerTreeHostImplTest, RasterColorSpace) {
EXPECT_EQ(host_impl_->GetRasterColorSpace(), gfx::ColorSpace::CreateSRGB());
}
+TEST_F(LayerTreeHostImplTest, UpdatedTilingsForNonDrawingLayers) {
+ gfx::Size layer_bounds(500, 500);
+
+ host_impl_->SetViewportSize(layer_bounds);
+ host_impl_->CreatePendingTree();
+ std::unique_ptr<LayerImpl> scoped_root =
+ LayerImpl::Create(host_impl_->pending_tree(), 1);
+ scoped_root->SetBounds(layer_bounds);
+ LayerImpl* root = scoped_root.get();
+ host_impl_->pending_tree()->SetRootLayerForTesting(std::move(scoped_root));
+
+ scoped_refptr<FakeRasterSource> raster_source(
+ FakeRasterSource::CreateFilled(layer_bounds));
+ std::unique_ptr<FakePictureLayerImpl> scoped_animated_transform_layer =
+ FakePictureLayerImpl::CreateWithRasterSource(host_impl_->pending_tree(),
+ 2, raster_source);
+ scoped_animated_transform_layer->SetBounds(layer_bounds);
+ scoped_animated_transform_layer->SetDrawsContent(true);
+ gfx::Transform singular;
+ singular.Scale3d(6.f, 6.f, 0.f);
+ scoped_animated_transform_layer->test_properties()->transform = singular;
+ FakePictureLayerImpl* animated_transform_layer =
+ scoped_animated_transform_layer.get();
+ root->test_properties()->AddChild(std::move(scoped_animated_transform_layer));
+
+ // A layer with a non-invertible transform is not drawn or rasterized. Since
+ // this layer is not rasterized, we shouldn't be creating any tilings for it.
+ host_impl_->pending_tree()->BuildLayerListAndPropertyTreesForTesting();
+ EXPECT_FALSE(animated_transform_layer->HasValidTilePriorities());
+ EXPECT_EQ(animated_transform_layer->tilings()->num_tilings(), 0u);
+ host_impl_->pending_tree()->UpdateDrawProperties(false);
+ EXPECT_FALSE(animated_transform_layer->raster_even_if_not_drawn());
+ EXPECT_FALSE(animated_transform_layer->contributes_to_drawn_render_surface());
+ EXPECT_EQ(animated_transform_layer->tilings()->num_tilings(), 0u);
+
+ // Now add a transform animation to this layer. While we don't drawn layers
+ // with non-invertible transforms, we still raster them if there is a
+ // transform animation.
+ host_impl_->pending_tree()->SetElementIdsForTesting();
+ TransformOperations start_transform_operations;
+ start_transform_operations.AppendMatrix(singular);
+ TransformOperations end_transform_operations;
+ AddAnimatedTransformToElementWithPlayer(
+ animated_transform_layer->element_id(), timeline(), 10.0,
+ start_transform_operations, end_transform_operations);
+
+ // The layer is still not drawn, but it will be rasterized. Since the layer is
+ // rasterized, we should be creating tilings for it in UpdateDrawProperties.
+ // However, none of these tiles should be required for activation.
+ host_impl_->pending_tree()->BuildLayerListAndPropertyTreesForTesting();
+ host_impl_->pending_tree()->UpdateDrawProperties(false);
+ EXPECT_TRUE(animated_transform_layer->raster_even_if_not_drawn());
+ EXPECT_FALSE(animated_transform_layer->contributes_to_drawn_render_surface());
+ EXPECT_EQ(animated_transform_layer->tilings()->num_tilings(), 1u);
+ EXPECT_FALSE(animated_transform_layer->tilings()
+ ->tiling_at(0)
+ ->can_require_tiles_for_activation());
+}
+
+TEST_F(LayerTreeHostImplTest, RasterTilePrioritizationForNonDrawingLayers) {
+ gfx::Size layer_bounds(500, 500);
+
+ host_impl_->SetViewportSize(layer_bounds);
+ host_impl_->CreatePendingTree();
+ std::unique_ptr<LayerImpl> scoped_root =
+ LayerImpl::Create(host_impl_->pending_tree(), 1);
+ scoped_root->SetBounds(layer_bounds);
+ LayerImpl* root = scoped_root.get();
+ host_impl_->pending_tree()->SetRootLayerForTesting(std::move(scoped_root));
+
+ scoped_refptr<FakeRasterSource> raster_source(
+ FakeRasterSource::CreateFilled(layer_bounds));
+
+ std::unique_ptr<FakePictureLayerImpl> scoped_hidden_layer =
+ FakePictureLayerImpl::CreateWithRasterSource(host_impl_->pending_tree(),
+ 2, raster_source);
+ scoped_hidden_layer->SetBounds(layer_bounds);
+ scoped_hidden_layer->SetDrawsContent(true);
+ scoped_hidden_layer->set_contributes_to_drawn_render_surface(true);
+ FakePictureLayerImpl* hidden_layer = scoped_hidden_layer.get();
+ root->test_properties()->AddChild(std::move(scoped_hidden_layer));
+
+ std::unique_ptr<FakePictureLayerImpl> scoped_drawing_layer =
+ FakePictureLayerImpl::CreateWithRasterSource(host_impl_->pending_tree(),
+ 3, raster_source);
+ scoped_drawing_layer->SetBounds(layer_bounds);
+ scoped_drawing_layer->SetDrawsContent(true);
+ scoped_drawing_layer->set_contributes_to_drawn_render_surface(true);
+ FakePictureLayerImpl* drawing_layer = scoped_drawing_layer.get();
+ root->test_properties()->AddChild(std::move(scoped_drawing_layer));
+
+ gfx::Rect layer_rect(0, 0, 500, 500);
+ gfx::Rect empty_rect(0, 0, 0, 0);
+ host_impl_->pending_tree()->BuildPropertyTreesForTesting();
+
+ hidden_layer->tilings()->AddTiling(gfx::AxisTransform2d(), raster_source);
+ PictureLayerTiling* hidden_tiling = hidden_layer->tilings()->tiling_at(0);
+ hidden_tiling->set_resolution(TileResolution::LOW_RESOLUTION);
+ hidden_tiling->CreateAllTilesForTesting();
+ hidden_tiling->SetTilePriorityRectsForTesting(
+ layer_rect, // Visible rect.
+ layer_rect, // Skewport rect.
+ layer_rect, // Soon rect.
+ layer_rect); // Eventually rect.
+
+ drawing_layer->tilings()->AddTiling(gfx::AxisTransform2d(), raster_source);
+ PictureLayerTiling* drawing_tiling = drawing_layer->tilings()->tiling_at(0);
+ drawing_tiling->set_resolution(TileResolution::HIGH_RESOLUTION);
+ drawing_tiling->CreateAllTilesForTesting();
+ drawing_tiling->SetTilePriorityRectsForTesting(
+ layer_rect, // Visible rect.
+ layer_rect, // Skewport rect.
+ layer_rect, // Soon rect.
+ layer_rect); // Eventually rect.
+
+ // Both layers are drawn. Since the hidden layer has a low resolution tiling,
+ // in smoothness priority mode its tile is higher priority.
+ std::unique_ptr<RasterTilePriorityQueue> queue =
+ host_impl_->BuildRasterQueue(TreePriority::SMOOTHNESS_TAKES_PRIORITY,
+ RasterTilePriorityQueue::Type::ALL);
+ EXPECT_EQ(queue->Top().tile()->layer_id(), 2);
+
+ // Hide the hidden layer and set it to so it still rasters. Now the drawing
+ // layer should be prioritized over the hidden layer.
+ hidden_layer->set_contributes_to_drawn_render_surface(false);
+ hidden_layer->set_raster_even_if_not_drawn(true);
+ queue = host_impl_->BuildRasterQueue(TreePriority::SMOOTHNESS_TAKES_PRIORITY,
+ RasterTilePriorityQueue::Type::ALL);
+ EXPECT_EQ(queue->Top().tile()->layer_id(), 3);
+}
+
} // namespace
} // namespace cc
« no previous file with comments | « cc/trees/layer_tree_host_common_unittest.cc ('k') | cc/trees/layer_tree_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698