Index: cc/layer_tree_host_common.cc |
diff --git a/cc/layer_tree_host_common.cc b/cc/layer_tree_host_common.cc |
index 446cfbbb53648f89ab43a44fbbd02e3a39b69f03..d3bee7262d42fd3cf47c89612152fc876d73996c 100644 |
--- a/cc/layer_tree_host_common.cc |
+++ b/cc/layer_tree_host_common.cc |
@@ -211,7 +211,7 @@ static inline bool subtreeShouldBeSkipped(Layer* layer) |
} |
// Called on each layer that could be drawn after all information from |
-// calcDrawTransforms has been updated on that layer. May have some false |
+// calcDrawProperties has been updated on that layer. May have some false |
// positives (e.g. layers get this called on them but don't actually get drawn). |
static inline void markLayerAsUpdated(LayerImpl* layer) |
{ |
@@ -391,7 +391,7 @@ static inline void updateLayerContentsScale(Layer* layer, const gfx::Transform& |
// Recursively walks the layer tree starting at the given node and computes all the |
// necessary transformations, clipRects, render surfaces, etc. |
template<typename LayerType, typename LayerList, typename RenderSurfaceType, typename LayerSorter> |
-static void calculateDrawTransformsInternal(LayerType* layer, const gfx::Transform& parentMatrix, |
+static void calculateDrawPropertiesInternal(LayerType* layer, const gfx::Transform& parentMatrix, |
const gfx::Transform& fullHierarchyMatrix, const gfx::Transform& currentScrollCompensationMatrix, |
const gfx::Rect& clipRectFromAncestor, bool ancestorClipsSubtree, |
RenderSurfaceType* nearestAncestorThatMovesPixels, LayerList& renderSurfaceLayerList, LayerList& layerList, |
@@ -482,17 +482,23 @@ static void calculateDrawTransformsInternal(LayerType* layer, const gfx::Transfo |
// If we early-exit anywhere in this function, the drawableContentRect of this subtree should be considered empty. |
drawableContentRectOfSubtree = gfx::Rect(); |
- // The root layer cannot skip calcDrawTransforms. |
+ // The root layer cannot skip calcDrawProperties. |
if (!isRootLayer(layer) && subtreeShouldBeSkipped(layer)) |
return; |
+ // As this function proceeds, these are the properties for the current |
+ // layer that actually get computed. To avoid unnecessary copies |
+ // (particularly for matrices), we do computations directly on these values |
+ // when possible. |
+ DrawProperties<LayerType, RenderSurfaceType>& 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(); |
} |
@@ -535,16 +541,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.target_space_transform = combinedTransform; |
// M[draw] = M[parent] * LT * S[layer2content] |
- drawTransform.Scale(1.0 / layer->contentsScaleX(), 1.0 / layer->contentsScaleY()); |
+ layerDrawProperties.target_space_transform.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.screen_space_transform = fullHierarchyMatrix; |
if (!layer->preserves3D()) |
- MathUtil::flattenTransformTo2d(layerScreenSpaceTransform); |
- layerScreenSpaceTransform.PreconcatTransform(drawTransform); |
- layer->setScreenSpaceTransform(layerScreenSpaceTransform); |
+ MathUtil::flattenTransformTo2d(layerDrawProperties.screen_space_transform); |
+ layerDrawProperties.screen_space_transform.PreconcatTransform(layerDrawProperties.target_space_transform); |
gfx::RectF contentRect(gfx::PointF(), layer->contentBounds()); |
@@ -575,9 +580,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.target_space_transform.MakeIdentity(); |
+ layerDrawProperties.target_space_transform.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 |
@@ -586,16 +590,16 @@ 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.opacity = 1; |
+ layerDrawProperties.opacity_is_animating = false; |
renderSurface->setTargetSurfaceTransformsAreAnimating(animatingTransformToTarget); |
renderSurface->setScreenSpaceTransformsAreAnimating(animatingTransformToScreen); |
animatingTransformToTarget = false; |
- layer->setDrawTransformIsAnimating(animatingTransformToTarget); |
- layer->setScreenSpaceTransformIsAnimating(animatingTransformToScreen); |
+ layerDrawProperties.target_space_transform_is_animating = animatingTransformToTarget; |
+ layerDrawProperties.screen_space_transform_is_animating = animatingTransformToScreen; |
// Update the aggregate hierarchy matrix to include the transform of the |
// newly created RenderSurfaceImpl. |
@@ -608,13 +612,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, RenderSurfaceType>& maskLayerDrawProperties = layer->maskLayer()->drawProperties(); |
+ maskLayerDrawProperties.render_target = layer; |
+ maskLayerDrawProperties.visible_content_rect = 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, RenderSurfaceType>& replicaMaskDrawProperties = layer->replicaLayer()->maskLayer()->drawProperties(); |
+ replicaMaskDrawProperties.render_target = layer; |
+ replicaMaskDrawProperties.visible_content_rect = gfx::Rect(gfx::Point(), layer->contentBounds()); |
} |
// FIXME: make this smarter for the SkImageFilter case (check for |
@@ -635,14 +641,14 @@ static void calculateDrawTransformsInternal(LayerType* layer, const gfx::Transfo |
} else { |
DCHECK(layer->parent()); |
- layer->setDrawTransform(drawTransform); |
- layer->setDrawTransformIsAnimating(animatingTransformToTarget); |
- layer->setScreenSpaceTransformIsAnimating(animatingTransformToScreen); |
+ // Note: layerDrawProperties.target_space_transform is computed above, |
+ // before this if-else statement. |
+ layerDrawProperties.target_space_transform_is_animating = animatingTransformToTarget; |
+ layerDrawProperties.screen_space_transform_is_animating = animatingTransformToScreen; |
+ layerDrawProperties.opacity = accumulatedDrawOpacity; |
+ layerDrawProperties.opacity_is_animating = drawOpacityIsAnimating; |
sublayerMatrix = combinedTransform; |
- layer->setDrawOpacity(drawOpacity); |
- layer->setDrawOpacityIsAnimating(drawOpacityIsAnimating); |
- |
layer->clearRenderSurface(); |
// Layers without renderSurfaces directly inherit the ancestor's clip status. |
@@ -651,7 +657,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.render_target = layer->parent()->renderTarget(); |
} |
gfx::Rect rectInTargetSpace = ToEnclosingRect(MathUtil::mapClippedRect(layer->drawTransform(), contentRect)); |
@@ -690,7 +696,7 @@ static void calculateDrawTransformsInternal(LayerType* layer, const gfx::Transfo |
for (size_t i = 0; i < layer->children().size(); ++i) { |
LayerType* child = LayerTreeHostCommon::getChildAsRawPtr(layer->children(), i); |
gfx::Rect drawableContentRectOfChildSubtree; |
- calculateDrawTransformsInternal<LayerType, LayerList, RenderSurfaceType, LayerSorter>(child, sublayerMatrix, nextHierarchyMatrix, nextScrollCompensationMatrix, |
+ calculateDrawPropertiesInternal<LayerType, LayerList, RenderSurfaceType, LayerSorter>(child, sublayerMatrix, nextHierarchyMatrix, nextScrollCompensationMatrix, |
clipRectForSubtree, subtreeShouldBeClipped, nearestAncestorThatMovesPixels, |
renderSurfaceLayerList, descendants, layerSorter, maxTextureSize, deviceScaleFactor, pageScaleFactor, drawableContentRectOfChildSubtree); |
if (!drawableContentRectOfChildSubtree.IsEmpty()) { |
@@ -708,27 +714,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.drawable_content_rect = rectInTargetSpace; |
if (subtreeShouldBeClipped) |
- drawableContentRectOfLayer.Intersect(clipRectForSubtree); |
- layer->setDrawableContentRect(drawableContentRectOfLayer); |
+ layerDrawProperties.drawable_content_rect.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.is_clipped = subtreeShouldBeClipped; |
if (subtreeShouldBeClipped) |
- layer->setClipRect(clipRectForSubtree); |
+ layerDrawProperties.clip_rect = 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.clip_rect = rectInTargetSpace; |
} |
// Compute the layer's visible content rect (the rect is in content space) |
- gfx::Rect visibleContentRectOfLayer = calculateVisibleContentRect(layer); |
- layer->setVisibleContentRect(visibleContentRectOfLayer); |
+ layerDrawProperties.visible_content_rect = calculateVisibleContentRect(layer); |
// Compute the remaining properties for the render surface, if the layer has one. |
if (isRootLayer(layer)) { |
@@ -824,7 +828,7 @@ static void calculateDrawTransformsInternal(LayerType* layer, const gfx::Transfo |
layer->renderTarget()->renderSurface()->addContributingDelegatedRenderPassLayer(layer); |
} |
-void LayerTreeHostCommon::calculateDrawTransforms(Layer* rootLayer, const gfx::Size& deviceViewportSize, float deviceScaleFactor, float pageScaleFactor, int maxTextureSize, std::vector<scoped_refptr<Layer> >& renderSurfaceLayerList) |
+void LayerTreeHostCommon::calculateDrawProperties(Layer* rootLayer, const gfx::Size& deviceViewportSize, float deviceScaleFactor, float pageScaleFactor, int maxTextureSize, std::vector<scoped_refptr<Layer> >& renderSurfaceLayerList) |
{ |
gfx::Rect totalDrawableContentRect; |
gfx::Transform identityMatrix; |
@@ -839,7 +843,7 @@ void LayerTreeHostCommon::calculateDrawTransforms(Layer* rootLayer, const gfx::S |
// This function should have received a root layer. |
DCHECK(isRootLayer(rootLayer)); |
- cc::calculateDrawTransformsInternal<Layer, std::vector<scoped_refptr<Layer> >, RenderSurface, void>( |
+ cc::calculateDrawPropertiesInternal<Layer, std::vector<scoped_refptr<Layer> >, RenderSurface, void>( |
rootLayer, deviceScaleTransform, identityMatrix, identityMatrix, |
deviceViewportRect, subtreeShouldBeClipped, 0, renderSurfaceLayerList, |
dummyLayerList, 0, maxTextureSize, |
@@ -847,11 +851,11 @@ void LayerTreeHostCommon::calculateDrawTransforms(Layer* rootLayer, const gfx::S |
// The dummy layer list should not have been used. |
DCHECK(dummyLayerList.size() == 0); |
- // A root layer renderSurface should always exist after calculateDrawTransforms. |
+ // A root layer renderSurface should always exist after calculateDrawProperties. |
DCHECK(rootLayer->renderSurface()); |
} |
-void LayerTreeHostCommon::calculateDrawTransforms(LayerImpl* rootLayer, const gfx::Size& deviceViewportSize, float deviceScaleFactor, float pageScaleFactor, LayerSorter* layerSorter, int maxTextureSize, std::vector<LayerImpl*>& renderSurfaceLayerList) |
+void LayerTreeHostCommon::calculateDrawProperties(LayerImpl* rootLayer, const gfx::Size& deviceViewportSize, float deviceScaleFactor, float pageScaleFactor, LayerSorter* layerSorter, int maxTextureSize, std::vector<LayerImpl*>& renderSurfaceLayerList) |
{ |
gfx::Rect totalDrawableContentRect; |
gfx::Transform identityMatrix; |
@@ -866,7 +870,7 @@ void LayerTreeHostCommon::calculateDrawTransforms(LayerImpl* rootLayer, const gf |
// This function should have received a root layer. |
DCHECK(isRootLayer(rootLayer)); |
- cc::calculateDrawTransformsInternal<LayerImpl, std::vector<LayerImpl*>, RenderSurfaceImpl, LayerSorter>( |
+ cc::calculateDrawPropertiesInternal<LayerImpl, std::vector<LayerImpl*>, RenderSurfaceImpl, LayerSorter>( |
rootLayer, deviceScaleTransform, identityMatrix, identityMatrix, |
deviceViewportRect, subtreeShouldBeClipped, 0, renderSurfaceLayerList, |
dummyLayerList, layerSorter, maxTextureSize, |
@@ -874,7 +878,7 @@ void LayerTreeHostCommon::calculateDrawTransforms(LayerImpl* rootLayer, const gf |
// The dummy layer list should not have been used. |
DCHECK(dummyLayerList.size() == 0); |
- // A root layer renderSurface should always exist after calculateDrawTransforms. |
+ // A root layer renderSurface should always exist after calculateDrawProperties. |
DCHECK(rootLayer->renderSurface()); |
} |