| 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 76c91a0ca1989dd1a5bf09e384f18ba1fed1681c..14149181542030833dd98a146234ed75f0b54780 100644
|
| --- a/cc/trees/layer_tree_host_common.cc
|
| +++ b/cc/trees/layer_tree_host_common.cc
|
| @@ -668,7 +668,7 @@ static inline bool SubtreeShouldBeSkipped(LayerImpl* layer,
|
| // 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->opacity();
|
| + return !layer->EffectiveOpacity();
|
| }
|
|
|
| static inline void SavePaintPropertiesLayer(LayerImpl* layer) {}
|
| @@ -1515,7 +1515,7 @@ static void CalculateDrawPropertiesInternal(
|
| // the right results.
|
| const bool layer_is_visible =
|
| data_from_ancestor.subtree_is_visible_from_ancestor &&
|
| - !layer->hide_layer_and_subtree();
|
| + layer->EffectiveOpacity() != 0;
|
| const bool layer_is_drawn = layer_is_visible || layer->HasCopyRequest();
|
|
|
| // The root layer cannot skip CalcDrawProperties.
|
| @@ -2327,11 +2327,21 @@ enum PropertyTreeOption {
|
| };
|
|
|
| void CalculateRenderTargetInternal(LayerImpl* layer,
|
| + PropertyTrees* property_trees,
|
| bool subtree_visible_from_ancestor,
|
| - bool can_render_to_separate_surface) {
|
| - const bool layer_is_visible =
|
| - subtree_visible_from_ancestor && !layer->hide_layer_and_subtree();
|
| - const bool layer_is_drawn = layer_is_visible || layer->HasCopyRequest();
|
| + bool can_render_to_separate_surface,
|
| + bool use_property_trees) {
|
| + bool layer_is_drawn;
|
| + if (use_property_trees) {
|
| + DCHECK_GE(layer->effect_tree_index(), 0);
|
| + layer_is_drawn =
|
| + property_trees->effect_tree.Node(layer->effect_tree_index())
|
| + ->data.is_drawn;
|
| + } else {
|
| + layer_is_drawn =
|
| + (subtree_visible_from_ancestor && layer->EffectiveOpacity() != 0) ||
|
| + layer->HasCopyRequest();
|
| + }
|
|
|
| // The root layer cannot be skipped.
|
| if (!IsRootLayer(layer) && SubtreeShouldBeSkipped(layer, layer_is_drawn)) {
|
| @@ -2364,7 +2374,8 @@ void CalculateRenderTargetInternal(LayerImpl* layer,
|
| for (size_t i = 0; i < layer->children().size(); ++i) {
|
| CalculateRenderTargetInternal(
|
| LayerTreeHostCommon::get_layer_as_raw_ptr(layer->children(), i),
|
| - layer_is_drawn, can_render_to_separate_surface);
|
| + property_trees, layer_is_drawn, can_render_to_separate_surface,
|
| + use_property_trees);
|
| }
|
| }
|
|
|
| @@ -2395,14 +2406,17 @@ void CalculateRenderSurfaceLayerListInternal(
|
|
|
| // |can_render_to_separate_surface| and |current_render_surface_layer_list_id|
|
| // are settings that should stay the same during recursion.
|
| -
|
| - // Layers that are marked as hidden will hide themselves and their subtree.
|
| - // Exception: Layers with copy requests, whether hidden or not, must be drawn
|
| - // anyway. In this case, we will inform their subtree they are visible to get
|
| - // the right results.
|
| - const bool layer_is_visible =
|
| - subtree_visible_from_ancestor && !layer->hide_layer_and_subtree();
|
| - const bool layer_is_drawn = layer_is_visible || layer->HasCopyRequest();
|
| + bool layer_is_drawn = false;
|
| + if (use_property_trees) {
|
| + DCHECK_GE(layer->effect_tree_index(), 0);
|
| + layer_is_drawn =
|
| + property_trees->effect_tree.Node(layer->effect_tree_index())
|
| + ->data.is_drawn;
|
| + } else {
|
| + layer_is_drawn =
|
| + (subtree_visible_from_ancestor && layer->EffectiveOpacity() != 0) ||
|
| + layer->HasCopyRequest();
|
| + }
|
|
|
| // The root layer cannot be skipped.
|
| if (!IsRootLayer(layer) && SubtreeShouldBeSkipped(layer, layer_is_drawn)) {
|
| @@ -2451,10 +2465,14 @@ void CalculateRenderSurfaceLayerListInternal(
|
| // target.
|
| layer->render_surface()->set_contributes_to_drawn_surface(false);
|
| } else {
|
| - // Even if the |layer_is_drawn|, it only contributes to a drawn surface
|
| - // when the |layer_is_visible|.
|
| + bool contributes_to_drawn_surface =
|
| + use_property_trees
|
| + ? property_trees->effect_tree.ContributesToDrawnSurface(
|
| + layer->effect_tree_index())
|
| + : subtree_visible_from_ancestor &&
|
| + layer->EffectiveOpacity() != 0.f;
|
| layer->render_surface()->set_contributes_to_drawn_surface(
|
| - layer_is_visible);
|
| + contributes_to_drawn_surface);
|
| }
|
|
|
| // Ignore occlusion from outside the surface when surface contents need to
|
| @@ -2619,8 +2637,10 @@ void CalculateRenderSurfaceLayerListInternal(
|
|
|
| void CalculateRenderTarget(
|
| LayerTreeHostCommon::CalcDrawPropsImplInputs* inputs) {
|
| - CalculateRenderTargetInternal(inputs->root_layer, true,
|
| - inputs->can_render_to_separate_surface);
|
| + CalculateRenderTargetInternal(
|
| + inputs->root_layer, inputs->property_trees, true,
|
| + inputs->can_render_to_separate_surface,
|
| + inputs->verify_property_trees || inputs->use_property_trees);
|
| }
|
|
|
| void CalculateRenderSurfaceLayerList(
|
|
|