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

Unified Diff: cc/trees/layer_tree_host_common.cc

Issue 1855373003: cc : Use same layer skipping functions in DrawPropertyUtils and LTHC (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase + typo in comment Created 4 years, 8 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/draw_property_utils.cc ('k') | cc/trees/layer_tree_host_common_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/trees/layer_tree_host_common.cc
diff --git a/cc/trees/layer_tree_host_common.cc b/cc/trees/layer_tree_host_common.cc
index 2b5c66bcb78269ae949dbd56a628122b9e8dc3eb..64c524fd0dcc465e0fd9940d5491899f6114d895 100644
--- a/cc/trees/layer_tree_host_common.cc
+++ b/cc/trees/layer_tree_host_common.cc
@@ -252,132 +252,11 @@ static inline bool IsRootLayer(const LayerImpl* layer) {
}
template <typename LayerType>
-static inline bool LayerIsInExisting3DRenderingContext(LayerType* layer) {
- return layer->Is3dSorted() && layer->parent() &&
- layer->parent()->Is3dSorted() &&
- (layer->parent()->sorting_context_id() == layer->sorting_context_id());
-}
-
-static bool IsLayerBackFaceVisible(LayerImpl* layer,
- const TransformTree& transform_tree) {
- // The current W3C spec on CSS transforms says that backface visibility should
- // be determined differently depending on whether the layer is in a "3d
- // rendering context" or not. For Chromium code, we can determine whether we
- // are in a 3d rendering context by checking if the parent preserves 3d.
-
- if (LayerIsInExisting3DRenderingContext(layer)) {
- return draw_property_utils::DrawTransform(layer, transform_tree)
- .IsBackFaceVisible();
- }
-
- // In this case, either the layer establishes a new 3d rendering context, or
- // is not in a 3d rendering context at all.
- return layer->transform().IsBackFaceVisible();
-}
-
-static bool IsSurfaceBackFaceVisible(LayerImpl* layer,
- const gfx::Transform& draw_transform) {
- return layer->layer_tree_impl()
- ->property_trees()
- ->effect_tree.Node(layer->effect_tree_index())
- ->data.hidden_by_backface_visibility;
-}
-
-static bool LayerShouldBeSkipped(LayerImpl* layer,
- bool layer_is_drawn,
- const TransformTree& transform_tree) {
- // Layers can be skipped if any of these conditions are met.
- // - is not drawn due to it or one of its ancestors being hidden (or having
- // no copy requests).
- // - does not draw content.
- // - is transparent.
- // - has empty bounds
- // - the layer is not double-sided, but its back face is visible.
- //
- // Some additional conditions need to be computed at a later point after the
- // recursion is finished.
- // - the intersection of render_surface content and layer clip_rect is empty
- // - the visible_layer_rect is empty
- //
- // Note, if the layer should not have been drawn due to being fully
- // transparent, we would have skipped the entire subtree and never made it
- // into this function, so it is safe to omit this check here.
-
- if (!layer_is_drawn)
- return true;
-
- if (!layer->DrawsContent() || layer->bounds().IsEmpty())
- return true;
-
- LayerImpl* backface_test_layer = layer;
- if (layer->use_parent_backface_visibility()) {
- DCHECK(!IsRootLayer(layer));
- DCHECK(!layer->parent()->use_parent_backface_visibility());
- backface_test_layer = layer->parent();
- }
-
- // The layer should not be drawn if (1) it is not double-sided and (2) the
- // back of the layer is known to be facing the screen.
- if (!backface_test_layer->double_sided() &&
- IsLayerBackFaceVisible(backface_test_layer, transform_tree))
- return true;
-
- return false;
-}
-
-template <typename LayerType>
static bool HasInvertibleOrAnimatedTransform(LayerType* layer) {
return layer->transform_is_invertible() ||
layer->HasPotentiallyRunningTransformAnimation();
}
-static inline bool SubtreeShouldBeSkipped(LayerImpl* layer,
- bool layer_is_drawn) {
- // If the layer transform is not invertible, it should not be drawn.
- // TODO(ajuma): Correctly process subtrees with singular transform for the
- // case where we may animate to a non-singular transform and wish to
- // pre-raster.
- TransformNode* node =
- layer->layer_tree_impl()->property_trees()->transform_tree.Node(
- layer->transform_tree_index());
- bool has_invertible_transform =
- node->data.is_invertible && node->data.ancestors_are_invertible;
- if (!(has_invertible_transform ||
- layer->HasPotentiallyRunningTransformAnimation()))
- return true;
-
- // When we need to do a readback/copy of a layer's output, we can not skip
- // it or any of its ancestors.
- if (layer->num_copy_requests_in_target_subtree() > 0)
- return false;
-
- // We cannot skip the the subtree if a descendant has a touch handler
- // or the hit testing code will break (it requires fresh transforms, etc).
- if (layer->layer_or_descendant_has_touch_handler())
- return false;
-
- // If the layer is not drawn, then skip it and its subtree.
- if (!layer_is_drawn)
- return true;
-
- // If layer is on the pending tree and opacity is being animated then
- // this subtree can't be skipped as we need to create, prioritize and
- // include tiles for this layer when deciding if tree can be activated.
- if (layer->layer_tree_impl()->IsPendingTree() &&
- layer->HasPotentiallyRunningOpacityAnimation())
- return false;
-
- // If layer has a background filter, don't skip the layer, even it the
- // opacity is 0.
- if (!layer->background_filters().IsEmpty())
- return false;
-
- // The opacity of a layer always applies to its children (either implicitly
- // via a render surface or explicitly if the parent preserves 3D), so the
- // entire subtree can be skipped if this layer is fully transparent.
- return !layer->EffectiveOpacity();
-}
-
static inline void MarkLayerWithRenderSurfaceLayerListId(
LayerImpl* layer,
int current_render_surface_layer_list_id) {
@@ -657,7 +536,9 @@ void CalculateRenderTarget(LayerImpl* layer,
->data.is_drawn;
// The root layer cannot be skipped.
- if (!IsRootLayer(layer) && SubtreeShouldBeSkipped(layer, layer_is_drawn)) {
+ if (!IsRootLayer(layer) &&
+ draw_property_utils::LayerShouldBeSkipped(
+ layer, layer_is_drawn, property_trees->transform_tree)) {
layer->draw_properties().render_target = nullptr;
return;
}
@@ -683,7 +564,6 @@ void CalculateRenderTarget(LayerImpl* layer,
DCHECK(!IsRootLayer(layer));
layer->draw_properties().render_target = layer->parent()->render_target();
}
-
for (size_t i = 0; i < layer->children().size(); ++i) {
CalculateRenderTarget(
LayerTreeHostCommon::get_layer_as_raw_ptr(layer->children(), i),
@@ -722,7 +602,9 @@ void CalculateRenderSurfaceLayerList(
->data.is_drawn;
// The root layer cannot be skipped.
- if (!IsRootLayer(layer) && SubtreeShouldBeSkipped(layer, layer_is_drawn)) {
+ if (!IsRootLayer(layer) &&
+ draw_property_utils::LayerShouldBeSkipped(
+ layer, layer_is_drawn, property_trees->transform_tree)) {
if (layer->render_surface())
layer->ClearRenderSurfaceLayerList();
layer->draw_properties().render_target = nullptr;
@@ -738,13 +620,6 @@ void CalculateRenderSurfaceLayerList(
draw_property_utils::ComputeSurfaceDrawProperties(property_trees,
layer->render_surface());
- if (!layer->double_sided() &&
- IsSurfaceBackFaceVisible(layer,
- layer->render_surface()->draw_transform())) {
- layer->ClearRenderSurfaceLayerList();
- layer->draw_properties().render_target = nullptr;
- return;
- }
if (IsRootLayer(layer)) {
// The root surface does not contribute to any other surface, it has no
@@ -781,7 +656,7 @@ void CalculateRenderSurfaceLayerList(
size_t descendants_size = descendants->size();
- bool layer_should_be_skipped = LayerShouldBeSkipped(
+ bool layer_should_be_skipped = !draw_property_utils::LayerNeedsUpdate(
layer, layer_is_drawn, property_trees->transform_tree);
if (!layer_should_be_skipped) {
MarkLayerWithRenderSurfaceLayerListId(layer,
@@ -997,6 +872,8 @@ void CalculateDrawPropertiesInternal(
DCHECK(inputs->can_render_to_separate_surface ==
inputs->property_trees->non_root_surfaces_enabled);
const bool subtree_visible_from_ancestor = true;
+ for (auto* layer : *inputs->root_layer->layer_tree_impl())
+ layer->draw_properties().render_target = nullptr;
CalculateRenderTarget(inputs->root_layer, inputs->property_trees,
subtree_visible_from_ancestor,
inputs->can_render_to_separate_surface);
« no previous file with comments | « cc/trees/draw_property_utils.cc ('k') | cc/trees/layer_tree_host_common_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698