Index: cc/layer_tree_host_common.cc |
diff --git a/cc/layer_tree_host_common.cc b/cc/layer_tree_host_common.cc |
index 5979d078cb9e0b3f2de21aeac67b77f2528bfbbc..b271a5d6e6146cb4ec9cf71d3a6c69701685531c 100644 |
--- a/cc/layer_tree_host_common.cc |
+++ b/cc/layer_tree_host_common.cc |
@@ -486,13 +486,18 @@ static void calculateDrawTransformsInternal(LayerType* layer, const gfx::Transfo |
if (!isRootLayer(layer) && subtreeShouldBeSkipped(layer)) |
return; |
+ // As this function proceeds, these are the properties for each layer that |
+ // actually get computed. To avoid unnecessary copies (particularly for |
+ // matrices), we do computations directly on these values when possible. |
+ DrawProperties<LayerType>& layerDrawProperties = layer->drawProperties(); |
+ |
gfx::Rect clipRectForSubtree; |
bool subtreeShouldBeClipped = false; |
- float drawOpacity = layer->opacity(); |
+ float accumulatedDrawOpacity = layer->opacity(); |
bool drawOpacityIsAnimating = layer->opacityIsAnimating(); |
if (layer->parent()) { |
- drawOpacity *= layer->parent()->drawOpacity(); |
+ accumulatedDrawOpacity *= layer->parent()->drawOpacity(); |
drawOpacityIsAnimating |= layer->parent()->drawOpacityIsAnimating(); |
} |
@@ -528,16 +533,15 @@ static void calculateDrawTransformsInternal(LayerType* layer, const gfx::Transfo |
// The drawTransform that gets computed below is effectively the layer's drawTransform, unless |
// the layer itself creates a renderSurface. In that case, the renderSurface re-parents the transforms. |
- gfx::Transform drawTransform = combinedTransform; |
+ layerDrawProperties.drawTransform = combinedTransform; |
// M[draw] = M[parent] * LT * S[layer2content] |
- drawTransform.Scale(1.0 / layer->contentsScaleX(), 1.0 / layer->contentsScaleY()); |
+ layerDrawProperties.drawTransform.Scale(1.0 / layer->contentsScaleX(), 1.0 / layer->contentsScaleY()); |
// layerScreenSpaceTransform represents the transform between root layer's "screen space" and local content space. |
- gfx::Transform layerScreenSpaceTransform = fullHierarchyMatrix; |
+ layerDrawProperties.screenSpaceTransform = fullHierarchyMatrix; |
if (!layer->preserves3D()) |
- MathUtil::flattenTransformTo2d(layerScreenSpaceTransform); |
- layerScreenSpaceTransform.PreconcatTransform(drawTransform); |
- layer->setScreenSpaceTransform(layerScreenSpaceTransform); |
+ MathUtil::flattenTransformTo2d(layerDrawProperties.screenSpaceTransform); |
+ layerDrawProperties.screenSpaceTransform.PreconcatTransform(layerDrawProperties.drawTransform); |
gfx::RectF contentRect(gfx::PointF(), layer->contentBounds()); |
@@ -569,8 +573,8 @@ static void calculateDrawTransformsInternal(LayerType* layer, const gfx::Transfo |
// The owning layer's transform was re-parented by the surface, so the layer's new drawTransform |
// only needs to scale the layer to surface space. |
gfx::Transform layerDrawTransform; |
- layerDrawTransform.Scale(renderSurfaceSublayerScale.x() / layer->contentsScaleX(), renderSurfaceSublayerScale.y() / layer->contentsScaleY()); |
- layer->setDrawTransform(layerDrawTransform); |
+ layerDrawProperties.drawTransform.MakeIdentity(); |
+ layerDrawProperties.drawTransform.Scale(renderSurfaceSublayerScale.x() / layer->contentsScaleX(), renderSurfaceSublayerScale.y() / layer->contentsScaleY()); |
// Inside the surface's subtree, we scale everything to the owning layer's scale. |
// The sublayer matrix transforms centered layer rects into target |
@@ -579,16 +583,15 @@ static void calculateDrawTransformsInternal(LayerType* layer, const gfx::Transfo |
sublayerMatrix.Scale(renderSurfaceSublayerScale.x(), renderSurfaceSublayerScale.y()); |
// The opacity value is moved from the layer to its surface, so that the entire subtree properly inherits opacity. |
- renderSurface->setDrawOpacity(drawOpacity); |
+ renderSurface->setDrawOpacity(accumulatedDrawOpacity); |
renderSurface->setDrawOpacityIsAnimating(drawOpacityIsAnimating); |
- layer->setDrawOpacity(1); |
- layer->setDrawOpacityIsAnimating(false); |
+ layerDrawProperties.drawOpacity = 1; |
+ layerDrawProperties.drawOpacityIsAnimating = false; |
renderSurface->setTargetSurfaceTransformsAreAnimating(animatingTransformToTarget); |
renderSurface->setScreenSpaceTransformsAreAnimating(animatingTransformToScreen); |
- animatingTransformToTarget = false; |
- layer->setDrawTransformIsAnimating(animatingTransformToTarget); |
- layer->setScreenSpaceTransformIsAnimating(animatingTransformToScreen); |
+ layerDrawProperties.drawTransformIsAnimating = false; |
+ layerDrawProperties.screenSpaceTransformIsAnimating = animatingTransformToScreen; |
// Update the aggregate hierarchy matrix to include the transform of the |
// newly created RenderSurfaceImpl. |
@@ -601,13 +604,15 @@ static void calculateDrawTransformsInternal(LayerType* layer, const gfx::Transfo |
subtreeShouldBeClipped = false; |
if (layer->maskLayer()) { |
- layer->maskLayer()->setRenderTarget(layer); |
- layer->maskLayer()->setVisibleContentRect(gfx::Rect(gfx::Point(), layer->contentBounds())); |
+ DrawProperties<LayerType>& maskLayerDrawProperties = layer->maskLayer()->drawProperties(); |
+ maskLayerDrawProperties.renderTarget = layer; |
+ maskLayerDrawProperties.visibleContentRect = gfx::Rect(gfx::Point(), layer->contentBounds()); |
} |
if (layer->replicaLayer() && layer->replicaLayer()->maskLayer()) { |
- layer->replicaLayer()->maskLayer()->setRenderTarget(layer); |
- layer->replicaLayer()->maskLayer()->setVisibleContentRect(gfx::Rect(gfx::Point(), layer->contentBounds())); |
+ DrawProperties<LayerType>& replicaMaskDrawProperties = layer->replicaLayer()->maskLayer()->drawProperties(); |
+ replicaMaskDrawProperties.renderTarget = layer; |
+ replicaMaskDrawProperties.visibleContentRect = gfx::Rect(gfx::Point(), layer->contentBounds()); |
} |
// FIXME: make this smarter for the SkImageFilter case (check for |
@@ -628,14 +633,13 @@ static void calculateDrawTransformsInternal(LayerType* layer, const gfx::Transfo |
} else { |
DCHECK(layer->parent()); |
- layer->setDrawTransform(drawTransform); |
- layer->setDrawTransformIsAnimating(animatingTransformToTarget); |
- layer->setScreenSpaceTransformIsAnimating(animatingTransformToScreen); |
+ // layerDrawProperties.drawTransform is computed above, before this if-else statement. |
+ layerDrawProperties.drawTransformIsAnimating = animatingTransformToTarget; |
+ layerDrawProperties.screenSpaceTransformIsAnimating = animatingTransformToScreen; |
+ layerDrawProperties.drawOpacity = accumulatedDrawOpacity; |
+ layerDrawProperties.drawOpacityIsAnimating = drawOpacityIsAnimating; |
sublayerMatrix = combinedTransform; |
- layer->setDrawOpacity(drawOpacity); |
- layer->setDrawOpacityIsAnimating(drawOpacityIsAnimating); |
- |
layer->clearRenderSurface(); |
// Layers without renderSurfaces directly inherit the ancestor's clip status. |
@@ -644,7 +648,7 @@ static void calculateDrawTransformsInternal(LayerType* layer, const gfx::Transfo |
clipRectForSubtree = clipRectFromAncestor; |
// Layers that are not their own renderTarget will render into the target of their nearest ancestor. |
- layer->setRenderTarget(layer->parent()->renderTarget()); |
+ layerDrawProperties.renderTarget = layer->parent()->renderTarget(); |
} |
gfx::Rect rectInTargetSpace = ToEnclosingRect(MathUtil::mapClippedRect(layer->drawTransform(), contentRect)); |
@@ -701,27 +705,25 @@ static void calculateDrawTransformsInternal(LayerType* layer, const gfx::Transfo |
localDrawableContentRectOfSubtree.Intersect(clipRectForSubtree); |
// Compute the layer's drawable content rect (the rect is in targetSurface space) |
- gfx::Rect drawableContentRectOfLayer = rectInTargetSpace; |
+ layerDrawProperties.drawableContentRect = rectInTargetSpace; |
if (subtreeShouldBeClipped) |
- drawableContentRectOfLayer.Intersect(clipRectForSubtree); |
- layer->setDrawableContentRect(drawableContentRectOfLayer); |
+ layerDrawProperties.drawableContentRect.Intersect(clipRectForSubtree); |
// Tell the layer the rect that is clipped by. In theory we could use a |
// tighter clipRect here (drawableContentRect), but that actually does not |
// reduce how much would be drawn, and instead it would create unnecessary |
// changes to scissor state affecting GPU performance. |
- layer->setIsClipped(subtreeShouldBeClipped); |
+ layerDrawProperties.isClipped = subtreeShouldBeClipped; |
if (subtreeShouldBeClipped) |
- layer->setClipRect(clipRectForSubtree); |
+ layerDrawProperties.clipRect = clipRectForSubtree; |
else { |
// Initialize the clipRect to a safe value that will not clip the |
// layer, just in case clipping is still accidentally used. |
- layer->setClipRect(rectInTargetSpace); |
+ layerDrawProperties.clipRect = rectInTargetSpace; |
} |
// Compute the layer's visible content rect (the rect is in content space) |
- gfx::Rect visibleContentRectOfLayer = calculateVisibleContentRect(layer); |
- layer->setVisibleContentRect(visibleContentRectOfLayer); |
+ layerDrawProperties.visibleContentRect = calculateVisibleContentRect(layer); |
// Compute the remaining properties for the render surface, if the layer has one. |
if (isRootLayer(layer)) { |