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

Unified Diff: cc/trees/property_tree_builder.cc

Issue 2781483006: cc : Compute render surface is_clipped outside property tree building (Closed)
Patch Set: . Created 3 years, 9 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
« cc/trees/draw_property_utils.cc ('K') | « cc/trees/property_tree_builder.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/trees/property_tree_builder.cc
diff --git a/cc/trees/property_tree_builder.cc b/cc/trees/property_tree_builder.cc
index 590297d669dd558d8b60d508a4d63d8d0e40703a..09a721d78540d1522a2357d09f8c94eba14fda73 100644
--- a/cc/trees/property_tree_builder.cc
+++ b/cc/trees/property_tree_builder.cc
@@ -50,7 +50,6 @@ struct DataForRecursion {
bool affected_by_outer_viewport_bounds_delta;
bool should_flatten;
bool is_hidden;
- bool apply_ancestor_clip;
uint32_t main_thread_scrolling_reasons;
bool scroll_tree_parent_created_by_uninheritable_criteria;
const gfx::Transform* device_transform;
@@ -87,93 +86,6 @@ static LayerStickyPositionConstraint StickyPositionConstraint(
return layer->test_properties()->sticky_position_constraint;
}
-struct PreCalculateMetaInformationRecursiveData {
- size_t num_unclipped_descendants;
- int num_descendants_that_draw_content;
-
- PreCalculateMetaInformationRecursiveData()
- : num_unclipped_descendants(0),
- num_descendants_that_draw_content(0) {}
-
- void Merge(const PreCalculateMetaInformationRecursiveData& data) {
- num_unclipped_descendants += data.num_unclipped_descendants;
- num_descendants_that_draw_content += data.num_descendants_that_draw_content;
- }
-};
-
-static inline bool IsRootLayer(const Layer* layer) {
- return !layer->parent();
-}
-
-static bool IsMetaInformationRecomputationNeeded(Layer* layer) {
- return layer->layer_tree_host()->needs_meta_info_recomputation();
-}
-
-// Recursively walks the layer tree(if needed) to compute any information
-// that is needed before doing the main recursion.
-static void PreCalculateMetaInformationInternal(
- Layer* layer,
- PreCalculateMetaInformationRecursiveData* recursive_data) {
- if (!IsMetaInformationRecomputationNeeded(layer)) {
- DCHECK(IsRootLayer(layer));
- return;
- }
-
- if (layer->clip_parent())
- recursive_data->num_unclipped_descendants++;
-
- for (size_t i = 0; i < layer->children().size(); ++i) {
- Layer* child_layer = layer->child_at(i);
-
- PreCalculateMetaInformationRecursiveData data_for_child;
- PreCalculateMetaInformationInternal(child_layer, &data_for_child);
- recursive_data->Merge(data_for_child);
- }
-
- if (layer->clip_children()) {
- size_t num_clip_children = layer->clip_children()->size();
- DCHECK_GE(recursive_data->num_unclipped_descendants, num_clip_children);
- recursive_data->num_unclipped_descendants -= num_clip_children;
- }
-
- layer->set_num_unclipped_descendants(
- recursive_data->num_unclipped_descendants);
-
- if (IsRootLayer(layer))
- layer->layer_tree_host()->SetNeedsMetaInfoRecomputation(false);
-}
-
-static void PreCalculateMetaInformationInternalForTesting(
- LayerImpl* layer,
- PreCalculateMetaInformationRecursiveData* recursive_data) {
- if (layer->test_properties()->clip_parent)
- recursive_data->num_unclipped_descendants++;
-
- for (size_t i = 0; i < layer->test_properties()->children.size(); ++i) {
- LayerImpl* child_layer = layer->test_properties()->children[i];
-
- PreCalculateMetaInformationRecursiveData data_for_child;
- PreCalculateMetaInformationInternalForTesting(child_layer, &data_for_child);
- recursive_data->Merge(data_for_child);
- }
-
- if (layer->test_properties()->clip_children) {
- size_t num_clip_children = layer->test_properties()->clip_children->size();
- DCHECK_GE(recursive_data->num_unclipped_descendants, num_clip_children);
- recursive_data->num_unclipped_descendants -= num_clip_children;
- }
-
- layer->test_properties()->num_unclipped_descendants =
- recursive_data->num_unclipped_descendants;
- // TODO(enne): this should be synced from the main thread, so is only
- // for tests constructing layers on the compositor thread.
- layer->test_properties()->num_descendants_that_draw_content =
- recursive_data->num_descendants_that_draw_content;
-
- if (layer->DrawsContent())
- recursive_data->num_descendants_that_draw_content++;
-}
-
static LayerImplList& Children(LayerImpl* layer) {
return layer->test_properties()->children;
}
@@ -214,14 +126,6 @@ static LayerImpl* ClipParent(LayerImpl* layer) {
return layer->test_properties()->clip_parent;
}
-static size_t NumUnclippedDescendants(Layer* layer) {
- return layer->num_unclipped_descendants();
-}
-
-static size_t NumUnclippedDescendants(LayerImpl* layer) {
- return layer->test_properties()->num_unclipped_descendants;
-}
-
static inline const FilterOperations& Filters(Layer* layer) {
return layer->filters();
}
@@ -340,24 +244,6 @@ static LayerImpl* Parent(LayerImpl* layer) {
return layer->test_properties()->parent;
}
-template <typename LayerType>
-static void SetSurfaceIsClipped(DataForRecursion<LayerType>* data_for_children,
- bool apply_ancestor_clip,
- LayerType* layer) {
- // A surface with unclipped descendants cannot be clipped by its ancestor
- // clip at draw time since the unclipped descendants aren't affected by the
- // ancestor clip.
- EffectNode* effect_node = data_for_children->property_trees->effect_tree.Node(
- data_for_children->render_target);
- DCHECK_EQ(effect_node->owning_layer_id, layer->id());
- effect_node->surface_is_clipped =
- apply_ancestor_clip && !NumUnclippedDescendants(layer);
- // The ancestor clip should propagate to children only if the surface doesn't
- // apply the clip.
- data_for_children->apply_ancestor_clip =
- apply_ancestor_clip && !effect_node->surface_is_clipped;
-}
-
static inline int SortingContextId(Layer* layer) {
return layer->sorting_context_id();
}
@@ -383,45 +269,8 @@ void AddClipNodeIfNeeded(const DataForRecursion<LayerType>& data_from_ancestor,
const bool inherits_clip = !ClipParent(layer);
const int parent_id = inherits_clip ? data_from_ancestor.clip_tree_parent
: ClipParent(layer)->clip_tree_index();
- ClipNode* parent =
- data_from_ancestor.property_trees->clip_tree.Node(parent_id);
-
- bool apply_ancestor_clip = false;
- if (inherits_clip) {
- apply_ancestor_clip = data_from_ancestor.apply_ancestor_clip;
- } else {
- const EffectNode* parent_effect_node =
- data_from_ancestor.property_trees->effect_tree.Node(
- ClipParent(layer)->effect_tree_index());
- if (parent_effect_node->clip_id == parent->id) {
- if (parent_effect_node->surface_is_clipped) {
- // In this case, there is no clipping layer between the clip parent and
- // its target and the target has applied the clip.
- apply_ancestor_clip = false;
- } else {
- // In this case, there is no clipping layer between the clip parent and
- // its target and the target has not applied the clip. There are two
- // cases when a target doesn't apply clip. First, there is no ancestor
- // clip to apply, in this case apply_ancestor_clip should be false.
- // Second, there is a clip to apply but there are unclipped descendants,
- // so the target cannot apply the clip. In this case,
- // apply_ancestor_clip should be true.
- apply_ancestor_clip = parent_effect_node->has_unclipped_descendants;
- }
- } else {
- // In this case, there is a clipping layer between the clip parent and
- // its target.
- apply_ancestor_clip = true;
- }
- }
- if (created_render_surface)
- SetSurfaceIsClipped(data_for_children, apply_ancestor_clip, layer);
bool layer_clips_subtree = LayerClipsSubtree(layer);
- if (layer_clips_subtree) {
- data_for_children->apply_ancestor_clip = true;
- }
-
bool requires_node =
layer_clips_subtree || Filters(layer).HasFilterThatMovesPixels();
if (!requires_node) {
@@ -808,8 +657,24 @@ static inline int NumDescendantsThatDrawContent(Layer* layer) {
return layer->NumDescendantsThatDrawContent();
}
+static inline int NumLayerOrDescendantsThatDrawContentRecursive(
+ LayerImpl* layer) {
+ int num = layer->DrawsContent() ? 1 : 0;
+ for (size_t i = 0; i < layer->test_properties()->children.size(); ++i) {
+ LayerImpl* child_layer = layer->test_properties()->children[i];
+ num += NumLayerOrDescendantsThatDrawContentRecursive(child_layer);
+ }
+ return num;
+}
+
static inline int NumDescendantsThatDrawContent(LayerImpl* layer) {
- return layer->test_properties()->num_descendants_that_draw_content;
+ int num_descendants_that_draw_content = 0;
+ for (size_t i = 0; i < layer->test_properties()->children.size(); ++i) {
+ LayerImpl* child_layer = layer->test_properties()->children[i];
+ num_descendants_that_draw_content +=
+ NumLayerOrDescendantsThatDrawContentRecursive(child_layer);
+ }
+ return num_descendants_that_draw_content;
}
static inline float EffectiveOpacity(Layer* layer) {
@@ -1074,7 +939,6 @@ bool AddEffectNodeIfNeeded(
// transform id.
node.transform_id =
data_from_ancestor.property_trees->transform_tree.next_available_id();
- node.has_unclipped_descendants = (NumUnclippedDescendants(layer) != 0);
}
node.clip_id = data_from_ancestor.clip_tree_parent;
} else {
@@ -1346,18 +1210,6 @@ void BuildPropertyTreesInternal(
} // namespace
-void CC_EXPORT
-PropertyTreeBuilder::PreCalculateMetaInformation(Layer* root_layer) {
- PreCalculateMetaInformationRecursiveData recursive_data;
- PreCalculateMetaInformationInternal(root_layer, &recursive_data);
-}
-
-void CC_EXPORT PropertyTreeBuilder::PreCalculateMetaInformationForTesting(
- LayerImpl* root_layer) {
- PreCalculateMetaInformationRecursiveData recursive_data;
- PreCalculateMetaInformationInternalForTesting(root_layer, &recursive_data);
-}
-
Layer* PropertyTreeBuilder::FindFirstScrollableLayer(Layer* layer) {
if (!layer)
return nullptr;
@@ -1422,8 +1274,6 @@ void BuildPropertyTreesTopLevelInternal(
data_for_recursion.affected_by_outer_viewport_bounds_delta = false;
data_for_recursion.should_flatten = false;
data_for_recursion.is_hidden = false;
- // The root clip is always applied.
- data_for_recursion.apply_ancestor_clip = true;
data_for_recursion.main_thread_scrolling_reasons =
MainThreadScrollingReason::kNotScrollingOnMain;
data_for_recursion.scroll_tree_parent_created_by_uninheritable_criteria =
« cc/trees/draw_property_utils.cc ('K') | « cc/trees/property_tree_builder.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698