Index: cc/trees/draw_property_utils.cc |
diff --git a/cc/trees/draw_property_utils.cc b/cc/trees/draw_property_utils.cc |
index 601d8f8ccad6b356f481df251ad0f6cb9e836667..dcee6146177efae08438ab21459f195d7bd0c42c 100644 |
--- a/cc/trees/draw_property_utils.cc |
+++ b/cc/trees/draw_property_utils.cc |
@@ -53,26 +53,6 @@ static void ValidateRenderSurfaceForLayer(LayerImpl* layer) { |
DCHECK(effect_node->filters.IsEmpty()); |
DCHECK(effect_node->background_filters.IsEmpty()); |
} |
- |
-void VerifySurfaceContentsScalesMatch(const int target_effect_id, |
- const int target_transform_id, |
- const EffectTree& effect_tree, |
- const TransformTree& transform_tree) { |
- if (target_effect_id == EffectTree::kInvalidNodeId) { |
- // This can happen when PaintArtifactCompositor builds property trees as it |
- // doesn't set effect ids on clip nodes. |
- return; |
- } |
- const TransformNode* target_transform_node = |
- transform_tree.Node(target_transform_id); |
- const EffectNode* target_effect_node = effect_tree.Node(target_effect_id); |
- DCHECK(target_transform_node->surface_contents_scale == |
- target_effect_node->surface_contents_scale) |
- << " surface contents scale from transform tree: " |
- << target_transform_node->surface_contents_scale.ToString() |
- << " surface contents scale from effect tree: " |
- << target_effect_node->surface_contents_scale.ToString(); |
-} |
#endif |
static const EffectNode* ContentsTargetEffectNode( |
@@ -106,25 +86,11 @@ bool ComputeClipRectInTargetSpace(const LayerImpl* layer, |
// In this case, layer has a scroll parent. We need to keep the scale |
// at the layer's target but remove the scale at the scroll parent's |
// target. |
- if (property_trees->ComputeTransformToTarget(clip_node->target_transform_id, |
- target_effect_node->id, |
- &clip_to_target)) { |
- PostConcatSurfaceContentsScale(target_effect_node, &clip_to_target); |
-#if DCHECK_IS_ON() |
- const TransformTree& transform_tree = property_trees->transform_tree; |
- VerifySurfaceContentsScalesMatch(layer->effect_tree_index(), |
- target_node_id, effect_tree, |
- transform_tree); |
-#endif |
- |
+ if (property_trees->GetToTarget(clip_node->target_transform_id, |
+ target_effect_node->id, &clip_to_target)) { |
const EffectNode* source_node = |
effect_tree.Node(clip_node->target_effect_id); |
ConcatInverseSurfaceContentsScale(source_node, &clip_to_target); |
-#if DCHECK_IS_ON() |
- VerifySurfaceContentsScalesMatch(clip_node->target_effect_id, |
- clip_node->target_transform_id, |
- effect_tree, transform_tree); |
-#endif |
*clip_rect_in_target_space = |
MathUtil::MapClippedRect(clip_to_target, clip_from_clip_node); |
} else { |
@@ -178,19 +144,11 @@ static ConditionalClip ComputeLocalRectInTargetSpace( |
int target_transform_id, |
int target_effect_id) { |
gfx::Transform current_to_target; |
- if (!property_trees->ComputeTransformToTarget( |
- current_transform_id, target_effect_id, ¤t_to_target)) { |
+ if (!property_trees->GetToTarget(current_transform_id, target_effect_id, |
+ ¤t_to_target)) { |
// If transform is not invertible, cannot apply clip. |
return ConditionalClip{false, gfx::RectF()}; |
} |
- const EffectTree& effect_tree = property_trees->effect_tree; |
- const EffectNode* target_effect_node = effect_tree.Node(target_effect_id); |
- PostConcatSurfaceContentsScale(target_effect_node, ¤t_to_target); |
-#if DCHECK_IS_ON() |
- const TransformTree& transform_tree = property_trees->transform_tree; |
- VerifySurfaceContentsScalesMatch(target_effect_id, target_transform_id, |
- effect_tree, transform_tree); |
-#endif |
if (current_transform_id > target_transform_id) |
return ConditionalClip{true, // is_clipped. |
@@ -490,8 +448,10 @@ void CalculateVisibleRects(const LayerImplList& visible_layer_list, |
} |
// The clip rect should be intersected with layer rect in target space. |
- gfx::Transform content_to_target = transform_tree.ToTarget( |
- transform_node->id, layer->render_target_effect_tree_index()); |
+ gfx::Transform content_to_target; |
+ property_trees->GetToTarget(transform_node->id, |
+ layer->render_target_effect_tree_index(), |
+ &content_to_target); |
content_to_target.Translate(layer->offset_to_transform_parent().x(), |
layer->offset_to_transform_parent().y()); |
gfx::Rect layer_content_rect = gfx::Rect(layer_bounds); |
@@ -515,8 +475,9 @@ void CalculateVisibleRects(const LayerImplList& visible_layer_list, |
gfx::Transform target_to_layer; |
if (transform_node->ancestors_are_invertible) { |
- target_to_layer = transform_tree.FromTarget( |
- transform_node->id, layer->render_target_effect_tree_index()); |
+ property_trees->GetFromTarget(transform_node->id, |
+ layer->render_target_effect_tree_index(), |
+ &target_to_layer); |
} else { |
const EffectNode* target_effect_node = |
ContentsTargetEffectNode(layer->effect_tree_index(), effect_tree); |
@@ -530,10 +491,6 @@ void CalculateVisibleRects(const LayerImplList& visible_layer_list, |
continue; |
} |
ConcatInverseSurfaceContentsScale(target_effect_node, &target_to_layer); |
-#if DCHECK_IS_ON() |
- VerifySurfaceContentsScalesMatch(target_effect_node->id, target_node_id, |
- effect_tree, transform_tree); |
-#endif |
} |
gfx::Transform target_to_content; |
target_to_content.Translate(-layer->offset_to_transform_parent().x(), |
@@ -562,31 +519,36 @@ static int TransformTreeIndexForBackfaceVisibility(LayerType* layer, |
return layer->id() == node->owner_id ? tree.parent(node)->id : node->id; |
} |
-static bool IsTargetSpaceTransformBackFaceVisible(Layer* layer, |
- int transform_tree_index, |
- const TransformTree& tree) { |
+static bool IsTargetSpaceTransformBackFaceVisible( |
+ Layer* layer, |
+ int transform_tree_index, |
+ const PropertyTrees* property_trees) { |
// We do not skip back face invisible layers on main thread as target space |
// transform will not be available here. |
return false; |
} |
-static bool IsTargetSpaceTransformBackFaceVisible(LayerImpl* layer, |
- int transform_tree_index, |
- const TransformTree& tree) { |
- return tree |
- .ToTarget(transform_tree_index, layer->render_target_effect_tree_index()) |
- .IsBackFaceVisible(); |
+static bool IsTargetSpaceTransformBackFaceVisible( |
+ LayerImpl* layer, |
+ int transform_tree_index, |
+ const PropertyTrees* property_trees) { |
+ gfx::Transform to_target; |
+ property_trees->GetToTarget(transform_tree_index, |
+ layer->render_target_effect_tree_index(), |
+ &to_target); |
+ return to_target.IsBackFaceVisible(); |
} |
template <typename LayerType> |
static bool IsLayerBackFaceVisible(LayerType* layer, |
int transform_tree_index, |
- const TransformTree& tree) { |
- const TransformNode* node = tree.Node(transform_tree_index); |
+ const PropertyTrees* property_trees) { |
+ const TransformNode* node = |
+ property_trees->transform_tree.Node(transform_tree_index); |
return layer->use_local_transform_for_backface_visibility() |
? node->local.IsBackFaceVisible() |
: IsTargetSpaceTransformBackFaceVisible( |
- layer, transform_tree_index, tree); |
+ layer, transform_tree_index, property_trees); |
} |
static inline bool TransformToScreenIsKnown(Layer* layer, |
@@ -605,7 +567,7 @@ static inline bool TransformToScreenIsKnown(LayerImpl* layer, |
template <typename LayerType> |
static bool LayerNeedsUpdateInternal(LayerType* layer, |
bool layer_is_drawn, |
- const TransformTree& tree) { |
+ const PropertyTrees* property_trees) { |
// 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). |
@@ -630,6 +592,7 @@ static bool LayerNeedsUpdateInternal(LayerType* layer, |
// 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. |
+ const TransformTree& tree = property_trees->transform_tree; |
if (layer->should_check_backface_visibility()) { |
int backface_transform_id = |
TransformTreeIndexForBackfaceVisibility(layer, tree); |
@@ -637,7 +600,7 @@ static bool LayerNeedsUpdateInternal(LayerType* layer, |
// backface is not visible. |
if (TransformToScreenIsKnown(layer, backface_transform_id, tree) && |
!HasSingularTransform(backface_transform_id, tree) && |
- IsLayerBackFaceVisible(layer, backface_transform_id, tree)) |
+ IsLayerBackFaceVisible(layer, backface_transform_id, property_trees)) |
return false; |
} |
@@ -645,9 +608,11 @@ static bool LayerNeedsUpdateInternal(LayerType* layer, |
} |
void FindLayersThatNeedUpdates(LayerTreeImpl* layer_tree_impl, |
- const TransformTree& transform_tree, |
- const EffectTree& effect_tree, |
+ const PropertyTrees* property_trees, |
std::vector<LayerImpl*>* visible_layer_list) { |
+ const TransformTree& transform_tree = property_trees->transform_tree; |
+ const EffectTree& effect_tree = property_trees->effect_tree; |
+ |
for (auto* layer_impl : *layer_tree_impl) { |
bool layer_is_drawn = |
effect_tree.Node(layer_impl->effect_tree_index())->is_drawn; |
@@ -657,7 +622,7 @@ void FindLayersThatNeedUpdates(LayerTreeImpl* layer_tree_impl, |
effect_tree)) |
continue; |
- if (LayerNeedsUpdate(layer_impl, layer_is_drawn, transform_tree)) |
+ if (LayerNeedsUpdate(layer_impl, layer_is_drawn, property_trees)) |
visible_layer_list->push_back(layer_impl); |
} |
} |
@@ -717,9 +682,10 @@ bool LayerShouldBeSkipped(Layer* layer, |
} |
void FindLayersThatNeedUpdates(LayerTree* layer_tree, |
- const TransformTree& transform_tree, |
- const EffectTree& effect_tree, |
+ const PropertyTrees* property_trees, |
LayerList* update_layer_list) { |
+ const TransformTree& transform_tree = property_trees->transform_tree; |
+ const EffectTree& effect_tree = property_trees->effect_tree; |
for (auto* layer : *layer_tree) { |
bool layer_is_drawn = |
effect_tree.Node(layer->effect_tree_index())->is_drawn; |
@@ -729,7 +695,7 @@ void FindLayersThatNeedUpdates(LayerTree* layer_tree, |
effect_tree)) |
continue; |
- if (LayerNeedsUpdate(layer, layer_is_drawn, transform_tree)) { |
+ if (LayerNeedsUpdate(layer, layer_is_drawn, property_trees)) { |
update_layer_list->push_back(layer); |
} |
@@ -815,20 +781,10 @@ void ComputeClips(PropertyTrees* property_trees, |
const EffectNode* target_effect_node = |
effect_tree.Node(clip_node->target_effect_id); |
PostConcatSurfaceContentsScale(target_effect_node, &parent_to_current); |
-#if DCHECK_IS_ON() |
- VerifySurfaceContentsScalesMatch(clip_node->target_effect_id, |
- clip_node->target_transform_id, |
- effect_tree, transform_tree); |
-#endif |
const EffectNode* parent_target_effect_node = |
effect_tree.Node(parent_clip_node->target_effect_id); |
ConcatInverseSurfaceContentsScale(parent_target_effect_node, |
&parent_to_current); |
-#if DCHECK_IS_ON() |
- VerifySurfaceContentsScalesMatch(parent_clip_node->target_effect_id, |
- parent_clip_node->target_transform_id, |
- effect_tree, transform_tree); |
-#endif |
// If we can't compute a transform, it's because we had to use the inverse |
// of a singular transform. We won't draw in this case, so there's no need |
// to compute clips. |
@@ -846,10 +802,11 @@ void ComputeClips(PropertyTrees* property_trees, |
// it will be lost. |
if (clip_node->resets_clip && non_root_surfaces_enabled) { |
if (clip_node->clip_type == ClipNode::ClipType::APPLIES_LOCAL_CLIP) { |
- clip_node->clip_in_target_space = MathUtil::MapClippedRect( |
- transform_tree.ToTarget(clip_node->transform_id, |
- clip_node->target_effect_id), |
- clip_node->clip); |
+ gfx::Transform to_target; |
+ property_trees->GetToTarget(clip_node->transform_id, |
+ clip_node->target_effect_id, &to_target); |
+ clip_node->clip_in_target_space = |
+ MathUtil::MapClippedRect(to_target, clip_node->clip); |
ResetIfHasNanCoordinate(&clip_node->clip_in_target_space); |
clip_node->combined_clip_in_target_space = |
gfx::IntersectRects(clip_node->clip_in_target_space, |
@@ -886,19 +843,12 @@ void ComputeClips(PropertyTrees* property_trees, |
source_to_target = transform_tree.ToScreen(clip_node->transform_id); |
} else if (transform_tree.ContentTargetId(transform_node->id) == |
clip_node->target_transform_id) { |
- source_to_target = transform_tree.ToTarget(clip_node->transform_id, |
- clip_node->target_effect_id); |
+ property_trees->GetToTarget(clip_node->transform_id, |
+ clip_node->target_effect_id, |
+ &source_to_target); |
} else { |
- success = property_trees->ComputeTransformToTarget( |
+ success = property_trees->GetToTarget( |
transform_node->id, clip_node->target_effect_id, &source_to_target); |
- const EffectNode* target_effect_node = |
- effect_tree.Node(clip_node->target_effect_id); |
- PostConcatSurfaceContentsScale(target_effect_node, &source_to_target); |
-#if DCHECK_IS_ON() |
- VerifySurfaceContentsScalesMatch(clip_node->target_effect_id, |
- clip_node->target_transform_id, |
- effect_tree, transform_tree); |
-#endif |
// source_to_target computation should be successful as target is an |
// ancestor of the transform node. |
DCHECK(success); |
@@ -1033,47 +983,6 @@ static void ComputeLayerClipRect(const PropertyTrees* property_trees, |
} |
} |
-static int FindTargetTransformTreeIndexFromEffectTree( |
- const EffectTree& effect_tree, |
- const int effect_tree_index) { |
- const EffectNode* node = effect_tree.Node(effect_tree_index); |
- if (node->has_render_surface) |
- return node->transform_id; |
- node = effect_tree.Node(node->target_id); |
- return node->transform_id; |
-} |
- |
-static void VerifyDrawTransformsMatch(LayerImpl* layer, |
- PropertyTrees* property_trees) { |
- const int source_id = layer->transform_tree_index(); |
- int destination_id = FindTargetTransformTreeIndexFromEffectTree( |
- property_trees->effect_tree, layer->effect_tree_index()); |
- const EffectNode* target_effect_node = ContentsTargetEffectNode( |
- layer->effect_tree_index(), property_trees->effect_tree); |
- gfx::Transform draw_transform; |
- property_trees->ComputeTransformToTarget(source_id, target_effect_node->id, |
- &draw_transform); |
- PostConcatSurfaceContentsScale(target_effect_node, &draw_transform); |
-#if DCHECK_IS_ON() |
- VerifySurfaceContentsScalesMatch(layer->effect_tree_index(), destination_id, |
- property_trees->effect_tree, |
- property_trees->transform_tree); |
-#endif |
- if (layer->should_flatten_transform_from_property_tree()) |
- draw_transform.FlattenTo2d(); |
- draw_transform.Translate(layer->offset_to_transform_parent().x(), |
- layer->offset_to_transform_parent().y()); |
- DCHECK(draw_transform.ApproximatelyEqual(DrawTransform( |
- layer, property_trees->transform_tree, property_trees->effect_tree))) |
- << " layer: " << layer->id() << " source transform id: " << source_id |
- << " destination transform id: " << destination_id |
- << " draw transform from transform tree: " |
- << DrawTransform(layer, property_trees->transform_tree, |
- property_trees->effect_tree) |
- .ToString() |
- << " v.s." << draw_transform.ToString(); |
-} |
- |
static void ComputeVisibleRectsInternal( |
LayerImpl* root_layer, |
PropertyTrees* property_trees, |
@@ -1096,9 +1005,8 @@ static void ComputeVisibleRectsInternal( |
ComputeEffects(&property_trees->effect_tree); |
ComputeClips(property_trees, can_render_to_separate_surface); |
- FindLayersThatNeedUpdates(root_layer->layer_tree_impl(), |
- property_trees->transform_tree, |
- property_trees->effect_tree, visible_layer_list); |
+ FindLayersThatNeedUpdates(root_layer->layer_tree_impl(), property_trees, |
+ visible_layer_list); |
CalculateClipRects(*visible_layer_list, property_trees, |
can_render_to_separate_surface); |
CalculateVisibleRects(*visible_layer_list, property_trees, |
@@ -1155,12 +1063,6 @@ void VerifyClipTreeCalculations(const LayerImplList& layer_list, |
ComputeLayerClipRect(property_trees, layer); |
} |
-void VerifyTransformTreeCalculations(const LayerImplList& layer_list, |
- PropertyTrees* property_trees) { |
- for (auto* layer : layer_list) |
- VerifyDrawTransformsMatch(layer, property_trees); |
-} |
- |
void ComputeVisibleRects(LayerImpl* root_layer, |
PropertyTrees* property_trees, |
bool can_render_to_separate_surface, |
@@ -1239,14 +1141,14 @@ void VerifyVisibleRectsCalculations(const LayerImplList& layer_list, |
bool LayerNeedsUpdate(Layer* layer, |
bool layer_is_drawn, |
- const TransformTree& tree) { |
- return LayerNeedsUpdateInternal(layer, layer_is_drawn, tree); |
+ const PropertyTrees* property_trees) { |
+ return LayerNeedsUpdateInternal(layer, layer_is_drawn, property_trees); |
} |
bool LayerNeedsUpdate(LayerImpl* layer, |
bool layer_is_drawn, |
- const TransformTree& tree) { |
- return LayerNeedsUpdateInternal(layer, layer_is_drawn, tree); |
+ const PropertyTrees* property_trees) { |
+ return LayerNeedsUpdateInternal(layer, layer_is_drawn, property_trees); |
} |
gfx::Transform DrawTransform(const LayerImpl* layer, |
@@ -1255,11 +1157,13 @@ gfx::Transform DrawTransform(const LayerImpl* layer, |
// TransformTree::ToTarget computes transform between the layer's transform |
// node and surface's transform node and scales it by the surface's content |
// scale. |
- gfx::Transform xform = |
- transform_tree.property_trees()->non_root_surfaces_enabled |
- ? transform_tree.ToTarget(layer->transform_tree_index(), |
- layer->render_target_effect_tree_index()) |
- : transform_tree.ToScreen(layer->transform_tree_index()); |
+ gfx::Transform xform; |
+ if (transform_tree.property_trees()->non_root_surfaces_enabled) |
+ transform_tree.property_trees()->GetToTarget( |
+ layer->transform_tree_index(), layer->render_target_effect_tree_index(), |
+ &xform); |
+ else |
+ xform = transform_tree.ToScreen(layer->transform_tree_index()); |
if (layer->should_flatten_transform_from_property_tree()) |
xform.FlattenTo2d(); |
xform.Translate(layer->offset_to_transform_parent().x(), |
@@ -1284,22 +1188,10 @@ static void SetSurfaceDrawTransform(const PropertyTrees* property_trees, |
gfx::Transform render_surface_transform; |
const EffectNode* target_effect_node = |
effect_tree.Node(effect_node->target_id); |
- property_trees->ComputeTransformToTarget( |
- transform_node->id, target_effect_node->id, &render_surface_transform); |
- PostConcatSurfaceContentsScale(target_effect_node, &render_surface_transform); |
-#if DCHECK_IS_ON() |
- const TransformNode* target_transform_node = |
- transform_tree.Node(transform_tree.TargetId(transform_node->id)); |
- VerifySurfaceContentsScalesMatch(effect_node->target_id, |
- target_transform_node->id, effect_tree, |
- transform_tree); |
-#endif |
+ property_trees->GetToTarget(transform_node->id, target_effect_node->id, |
+ &render_surface_transform); |
ConcatInverseSurfaceContentsScale(effect_node, &render_surface_transform); |
-#if DCHECK_IS_ON() |
- VerifySurfaceContentsScalesMatch(effect_node->id, transform_node->id, |
- effect_tree, transform_tree); |
-#endif |
render_surface->SetDrawTransform(render_surface_transform); |
} |
@@ -1337,7 +1229,7 @@ static void SetSurfaceClipRect(const ClipNode* parent_clip_node, |
const EffectNode* effect_node = |
effect_tree.Node(render_surface->EffectTreeIndex()); |
int target_effect_id = effect_node->target_id; |
- const bool success = property_trees->ComputeTransformToTarget( |
+ const bool success = property_trees->GetToTarget( |
parent_clip_node->target_transform_id, target_effect_id, |
&clip_parent_target_to_target); |
@@ -1346,13 +1238,6 @@ static void SetSurfaceClipRect(const ClipNode* parent_clip_node, |
return; |
} |
- PostConcatSurfaceContentsScale(effect_node, &clip_parent_target_to_target); |
-#if DCHECK_IS_ON() |
- VerifySurfaceContentsScalesMatch(render_surface->EffectTreeIndex(), |
- transform_tree.TargetId(transform_node->id), |
- effect_tree, transform_tree); |
-#endif |
- |
DCHECK_LT(parent_clip_node->target_transform_id, |
transform_tree.TargetId(transform_node->id)); |
render_surface->SetClipRect(gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( |