Index: cc/trees/draw_property_utils.cc |
diff --git a/cc/trees/draw_property_utils.cc b/cc/trees/draw_property_utils.cc |
index 5e1d9b3793cd5a80ad160fd7392782942316ad49..210006b19210598671ad58faecb1ba23bf6dcb31 100644 |
--- a/cc/trees/draw_property_utils.cc |
+++ b/cc/trees/draw_property_utils.cc |
@@ -23,21 +23,26 @@ namespace { |
template <typename LayerType> |
void CalculateVisibleRects(const std::vector<LayerType*>& visible_layer_list, |
const ClipTree& clip_tree, |
- const TransformTree& transform_tree) { |
+ const TransformTree& transform_tree, |
+ bool non_root_surfaces_enabled) { |
for (auto& layer : visible_layer_list) { |
gfx::Size layer_bounds = layer->bounds(); |
const ClipNode* clip_node = clip_tree.Node(layer->clip_tree_index()); |
- const bool is_unclipped = |
- clip_node->data.resets_clip && !clip_node->data.applies_local_clip; |
+ const bool is_unclipped = clip_node->data.resets_clip && |
+ !clip_node->data.applies_local_clip && |
+ non_root_surfaces_enabled; |
// When both the layer and the target are unclipped, the entire layer |
// content rect is visible. |
const bool fully_visible = !clip_node->data.layers_are_clipped && |
- !clip_node->data.target_is_clipped; |
+ !clip_node->data.target_is_clipped && |
+ non_root_surfaces_enabled; |
const TransformNode* transform_node = |
transform_tree.Node(layer->transform_tree_index()); |
if (!is_unclipped && !fully_visible) { |
const TransformNode* target_node = |
- transform_tree.Node(transform_node->data.content_target_id); |
+ non_root_surfaces_enabled |
+ ? transform_tree.Node(transform_node->data.content_target_id) |
+ : transform_tree.Node(0); |
// The clip node stores clip rect in its target space. If required, |
// this clip rect should be mapped to the current layer's target space. |
@@ -45,7 +50,10 @@ void CalculateVisibleRects(const std::vector<LayerType*>& visible_layer_list, |
gfx::Rect combined_clip_rect_in_target_space; |
bool success = true; |
- if (clip_node->data.target_id != target_node->id) { |
+ // When we only have a root surface, the clip node and the layer must |
+ // necessarily have the same target (the root). |
+ if (clip_node->data.target_id != target_node->id && |
+ non_root_surfaces_enabled) { |
// In this case, layer has a clip parent (or shares the target with an |
// ancestor layer that has clip parent) and the clip parent's target is |
// different from the layer's target. As the layer's target has |
@@ -82,7 +90,7 @@ void CalculateVisibleRects(const std::vector<LayerType*>& visible_layer_list, |
} else { |
clip_rect_in_target_space = |
gfx::ToEnclosingRect(clip_node->data.clip_in_target_space); |
- if (clip_node->data.target_is_clipped) |
+ if (clip_node->data.target_is_clipped || !non_root_surfaces_enabled) |
combined_clip_rect_in_target_space = gfx::ToEnclosingRect( |
clip_node->data.combined_clip_in_target_space); |
else |
@@ -97,7 +105,9 @@ void CalculateVisibleRects(const std::vector<LayerType*>& visible_layer_list, |
} |
// The clip rect should be intersected with layer rect in target space. |
- gfx::Transform content_to_target = transform_node->data.to_target; |
+ gfx::Transform content_to_target = non_root_surfaces_enabled |
+ ? transform_node->data.to_target |
+ : transform_node->data.to_screen; |
content_to_target.Translate(layer->offset_to_transform_parent().x(), |
layer->offset_to_transform_parent().y()); |
@@ -126,7 +136,9 @@ void CalculateVisibleRects(const std::vector<LayerType*>& visible_layer_list, |
gfx::Transform target_to_layer; |
if (transform_node->data.ancestors_are_invertible) { |
- target_to_layer = transform_node->data.from_target; |
+ target_to_layer = non_root_surfaces_enabled |
+ ? transform_node->data.from_target |
+ : transform_node->data.from_screen; |
success = true; |
} else { |
success = transform_tree.ComputeTransformWithSourceSublayerScale( |
@@ -415,7 +427,9 @@ void FindLayersThatNeedUpdates( |
} // namespace |
-void ComputeClips(ClipTree* clip_tree, const TransformTree& transform_tree) { |
+void ComputeClips(ClipTree* clip_tree, |
+ const TransformTree& transform_tree, |
+ bool non_root_surfaces_enabled) { |
if (!clip_tree->needs_update()) |
return; |
for (int i = 1; i < static_cast<int>(clip_tree->size()); ++i) { |
@@ -447,7 +461,8 @@ void ComputeClips(ClipTree* clip_tree, const TransformTree& transform_tree) { |
// clip node's target space. |
gfx::RectF parent_combined_clip_in_target_space = |
parent_clip_node->data.combined_clip_in_target_space; |
- if (parent_clip_node->data.target_id != clip_node->data.target_id) { |
+ if (parent_clip_node->data.target_id != clip_node->data.target_id && |
+ non_root_surfaces_enabled) { |
success &= transform_tree.ComputeTransformWithDestinationSublayerScale( |
parent_clip_node->data.target_id, clip_node->data.target_id, |
&parent_to_current); |
@@ -471,7 +486,7 @@ void ComputeClips(ClipTree* clip_tree, const TransformTree& transform_tree) { |
// the combined clip to our children because if they are clipped, they may |
// need to clip using our parent clip and if we don't propagate it here, |
// it will be lost. |
- if (clip_node->data.resets_clip) { |
+ if (clip_node->data.resets_clip && non_root_surfaces_enabled) { |
if (clip_node->data.applies_local_clip) { |
clip_node->data.clip_in_target_space = MathUtil::MapClippedRect( |
transform_node->data.to_target, clip_node->data.clip); |
@@ -491,7 +506,10 @@ void ComputeClips(ClipTree* clip_tree, const TransformTree& transform_tree) { |
if (use_only_parent_clip) { |
clip_node->data.combined_clip_in_target_space = |
parent_combined_clip_in_target_space; |
- if (!clip_node->data.target_is_clipped) { |
+ if (!non_root_surfaces_enabled) { |
+ clip_node->data.clip_in_target_space = |
+ parent_clip_node->data.clip_in_target_space; |
+ } else if (!clip_node->data.target_is_clipped) { |
clip_node->data.clip_in_target_space = |
parent_combined_clip_in_target_space; |
} else { |
@@ -503,7 +521,10 @@ void ComputeClips(ClipTree* clip_tree, const TransformTree& transform_tree) { |
} else { |
gfx::Transform source_to_target; |
- if (transform_node->data.content_target_id == clip_node->data.target_id) { |
+ if (!non_root_surfaces_enabled) { |
+ source_to_target = transform_node->data.to_screen; |
+ } else if (transform_node->data.content_target_id == |
+ clip_node->data.target_id) { |
source_to_target = transform_node->data.to_target; |
} else { |
success = transform_tree.ComputeTransformWithDestinationSublayerScale( |
@@ -516,7 +537,15 @@ void ComputeClips(ClipTree* clip_tree, const TransformTree& transform_tree) { |
gfx::RectF source_clip_in_target_space = |
MathUtil::MapClippedRect(source_to_target, clip_node->data.clip); |
- if (!clip_node->data.layer_clipping_uses_only_local_clip) { |
+ // With surfaces disabled, the only case where we use only the local clip |
+ // for layer clipping is the case where no non-viewport ancestor node |
+ // applies a local clip. |
+ bool layer_clipping_uses_only_local_clip = |
+ non_root_surfaces_enabled |
+ ? clip_node->data.layer_clipping_uses_only_local_clip |
+ : !parent_clip_node->data |
+ .layers_are_clipped_when_surfaces_disabled; |
+ if (!layer_clipping_uses_only_local_clip) { |
gfx::RectF parent_clip_in_target_space = MathUtil::ProjectClippedRect( |
parent_to_current, parent_clip_node->data.clip_in_target_space); |
clip_node->data.clip_in_target_space = gfx::IntersectRects( |
@@ -552,11 +581,18 @@ template <typename LayerType> |
void ComputeVisibleRectsUsingPropertyTreesInternal( |
LayerType* root_layer, |
PropertyTrees* property_trees, |
+ bool can_render_to_separate_surface, |
typename LayerType::LayerListType* update_layer_list) { |
+ if (property_trees->non_root_surfaces_enabled != |
+ can_render_to_separate_surface) { |
+ property_trees->non_root_surfaces_enabled = can_render_to_separate_surface; |
+ property_trees->transform_tree.set_needs_update(true); |
+ } |
if (property_trees->transform_tree.needs_update()) |
property_trees->clip_tree.set_needs_update(true); |
ComputeTransforms(&property_trees->transform_tree); |
- ComputeClips(&property_trees->clip_tree, property_trees->transform_tree); |
+ ComputeClips(&property_trees->clip_tree, property_trees->transform_tree, |
+ can_render_to_separate_surface); |
ComputeOpacities(&property_trees->effect_tree); |
const bool subtree_is_visible_from_ancestor = true; |
@@ -564,9 +600,9 @@ void ComputeVisibleRectsUsingPropertyTreesInternal( |
FindLayersThatNeedUpdates(root_layer, property_trees->transform_tree, |
subtree_is_visible_from_ancestor, update_layer_list, |
&visible_layer_list); |
- CalculateVisibleRects<LayerType>(visible_layer_list, |
- property_trees->clip_tree, |
- property_trees->transform_tree); |
+ CalculateVisibleRects<LayerType>( |
+ visible_layer_list, property_trees->clip_tree, |
+ property_trees->transform_tree, can_render_to_separate_surface); |
} |
void BuildPropertyTreesAndComputeVisibleRects( |
@@ -578,6 +614,7 @@ void BuildPropertyTreesAndComputeVisibleRects( |
float device_scale_factor, |
const gfx::Rect& viewport, |
const gfx::Transform& device_transform, |
+ bool can_render_to_separate_surface, |
PropertyTrees* property_trees, |
LayerList* update_layer_list) { |
PropertyTreeBuilder::BuildPropertyTrees( |
@@ -585,6 +622,7 @@ void BuildPropertyTreesAndComputeVisibleRects( |
outer_viewport_scroll_layer, page_scale_factor, device_scale_factor, |
viewport, device_transform, property_trees); |
ComputeVisibleRectsUsingPropertyTrees(root_layer, property_trees, |
+ can_render_to_separate_surface, |
update_layer_list); |
} |
@@ -597,6 +635,7 @@ void BuildPropertyTreesAndComputeVisibleRects( |
float device_scale_factor, |
const gfx::Rect& viewport, |
const gfx::Transform& device_transform, |
+ bool can_render_to_separate_surface, |
PropertyTrees* property_trees, |
LayerImplList* update_layer_list) { |
PropertyTreeBuilder::BuildPropertyTrees( |
@@ -604,20 +643,25 @@ void BuildPropertyTreesAndComputeVisibleRects( |
outer_viewport_scroll_layer, page_scale_factor, device_scale_factor, |
viewport, device_transform, property_trees); |
ComputeVisibleRectsUsingPropertyTrees(root_layer, property_trees, |
+ can_render_to_separate_surface, |
update_layer_list); |
} |
void ComputeVisibleRectsUsingPropertyTrees(Layer* root_layer, |
PropertyTrees* property_trees, |
+ bool can_render_to_separate_surface, |
LayerList* update_layer_list) { |
ComputeVisibleRectsUsingPropertyTreesInternal(root_layer, property_trees, |
+ can_render_to_separate_surface, |
update_layer_list); |
} |
void ComputeVisibleRectsUsingPropertyTrees(LayerImpl* root_layer, |
PropertyTrees* property_trees, |
+ bool can_render_to_separate_surface, |
LayerImplList* update_layer_list) { |
ComputeVisibleRectsUsingPropertyTreesInternal(root_layer, property_trees, |
+ can_render_to_separate_surface, |
update_layer_list); |
} |
@@ -851,10 +895,15 @@ void ComputeLayerDrawPropertiesUsingPropertyTrees( |
const ClipNode* clip_node = |
property_trees->clip_tree.Node(layer->clip_tree_index()); |
- draw_properties->target_space_transform = |
- DrawTransformFromPropertyTreesInternal(layer, transform_node); |
draw_properties->screen_space_transform = |
ScreenSpaceTransformFromPropertyTreesInternal(layer, transform_node); |
+ if (property_trees->non_root_surfaces_enabled) { |
+ draw_properties->target_space_transform = |
+ DrawTransformFromPropertyTreesInternal(layer, transform_node); |
+ } else { |
+ draw_properties->target_space_transform = |
+ draw_properties->screen_space_transform; |
+ } |
draw_properties->screen_space_transform_is_animating = |
transform_node->data.to_screen_is_animated; |
if (layer->layer_tree_impl() |
@@ -874,7 +923,12 @@ void ComputeLayerDrawPropertiesUsingPropertyTrees( |
draw_properties->can_use_lcd_text = |
LayerCanUseLcdText(layer, layers_always_allowed_lcd_text, |
can_use_lcd_text, transform_node, effect_node); |
- draw_properties->is_clipped = clip_node->data.layers_are_clipped; |
+ if (property_trees->non_root_surfaces_enabled) { |
+ draw_properties->is_clipped = clip_node->data.layers_are_clipped; |
+ } else { |
+ draw_properties->is_clipped = |
+ clip_node->data.layers_are_clipped_when_surfaces_disabled; |
+ } |
gfx::Rect bounds_in_target_space = MathUtil::MapEnclosingClippedRect( |
draw_properties->target_space_transform, gfx::Rect(layer->bounds())); |