| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/layer_tree_host_common.h" | 5 #include "cc/layer_tree_host_common.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
| 10 #include "cc/layer.h" | 10 #include "cc/layer.h" |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 228 { | 228 { |
| 229 // If the opacity is being animated then the opacity on the main thread is u
nreliable | 229 // If the opacity is being animated then the opacity on the main thread is u
nreliable |
| 230 // (since the impl thread may be using a different opacity), so it should no
t be trusted. | 230 // (since the impl thread may be using a different opacity), so it should no
t be trusted. |
| 231 // In particular, it should not cause the subtree to be skipped. | 231 // In particular, it should not cause the subtree to be skipped. |
| 232 return !layer->opacity() && !layer->opacityIsAnimating(); | 232 return !layer->opacity() && !layer->opacityIsAnimating(); |
| 233 } | 233 } |
| 234 | 234 |
| 235 // Called on each layer that could be drawn after all information from | 235 // Called on each layer that could be drawn after all information from |
| 236 // calcDrawProperties has been updated on that layer. May have some false | 236 // calcDrawProperties has been updated on that layer. May have some false |
| 237 // positives (e.g. layers get this called on them but don't actually get drawn). | 237 // positives (e.g. layers get this called on them but don't actually get drawn). |
| 238 static inline void markLayerAsUpdated(LayerImpl* layer) | 238 static inline void updateTilePrioritiesForLayer(LayerImpl* layer) |
| 239 { | 239 { |
| 240 layer->didUpdateTransforms(); | 240 layer->updateTilePriorities(); |
| 241 | 241 |
| 242 // Mask layers don't get this call, so explicitly update them so they can | 242 // Mask layers don't get this call, so explicitly update them so they can |
| 243 // kick off tile rasterization. | 243 // kick off tile rasterization. |
| 244 if (layer->maskLayer()) | 244 if (layer->maskLayer()) |
| 245 layer->maskLayer()->didUpdateTransforms(); | 245 layer->maskLayer()->updateTilePriorities(); |
| 246 if (layer->replicaLayer()) { | 246 if (layer->replicaLayer()) { |
| 247 layer->replicaLayer()->didUpdateTransforms(); | 247 layer->replicaLayer()->updateTilePriorities(); |
| 248 if (layer->replicaLayer()->maskLayer()) | 248 if (layer->replicaLayer()->maskLayer()) |
| 249 layer->replicaLayer()->maskLayer()->didUpdateTransforms(); | 249 layer->replicaLayer()->maskLayer()->updateTilePriorities(); |
| 250 } | 250 } |
| 251 } | 251 } |
| 252 | 252 |
| 253 static inline void markLayerAsUpdated(Layer* layer) | 253 static inline void updateTilePrioritiesForLayer(Layer* layer) |
| 254 { | 254 { |
| 255 } | 255 } |
| 256 | 256 |
| 257 template<typename LayerType> | 257 template<typename LayerType> |
| 258 static bool subtreeShouldRenderToSeparateSurface(LayerType* layer, bool axisAlig
nedWithRespectToParent) | 258 static bool subtreeShouldRenderToSeparateSurface(LayerType* layer, bool axisAlig
nedWithRespectToParent) |
| 259 { | 259 { |
| 260 // | 260 // |
| 261 // A layer and its descendants should render onto a new RenderSurfaceImpl if
any of these rules hold: | 261 // A layer and its descendants should render onto a new RenderSurfaceImpl if
any of these rules hold: |
| 262 // | 262 // |
| 263 | 263 |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 527 } | 527 } |
| 528 | 528 |
| 529 // Recursively walks the layer tree starting at the given node and computes all
the | 529 // Recursively walks the layer tree starting at the given node and computes all
the |
| 530 // necessary transformations, clipRects, render surfaces, etc. | 530 // necessary transformations, clipRects, render surfaces, etc. |
| 531 template<typename LayerType, typename LayerList, typename RenderSurfaceType> | 531 template<typename LayerType, typename LayerList, typename RenderSurfaceType> |
| 532 static void calculateDrawPropertiesInternal(LayerType* layer, const gfx::Transfo
rm& parentMatrix, | 532 static void calculateDrawPropertiesInternal(LayerType* layer, const gfx::Transfo
rm& parentMatrix, |
| 533 const gfx::Transform& fullHierarchyMatrix, const gfx::Transform& currentScro
llCompensationMatrix, | 533 const gfx::Transform& fullHierarchyMatrix, const gfx::Transform& currentScro
llCompensationMatrix, |
| 534 const gfx::Rect& clipRectFromAncestor, const gfx::Rect& clipRectFromAncestor
InDescendantSpace, bool ancestorClipsSubtree, | 534 const gfx::Rect& clipRectFromAncestor, const gfx::Rect& clipRectFromAncestor
InDescendantSpace, bool ancestorClipsSubtree, |
| 535 RenderSurfaceType* nearestAncestorThatMovesPixels, LayerList& renderSurfaceL
ayerList, LayerList& layerList, | 535 RenderSurfaceType* nearestAncestorThatMovesPixels, LayerList& renderSurfaceL
ayerList, LayerList& layerList, |
| 536 LayerSorter* layerSorter, int maxTextureSize, float deviceScaleFactor, float
pageScaleFactor, bool subtreeCanUseLCDText, | 536 LayerSorter* layerSorter, int maxTextureSize, float deviceScaleFactor, float
pageScaleFactor, bool subtreeCanUseLCDText, |
| 537 gfx::Rect& drawableContentRectOfSubtree) | 537 gfx::Rect& drawableContentRectOfSubtree, bool updateTilePriorities) |
| 538 { | 538 { |
| 539 // This function computes the new matrix transformations recursively for thi
s | 539 // This function computes the new matrix transformations recursively for thi
s |
| 540 // layer and all its descendants. It also computes the appropriate render su
rfaces. | 540 // layer and all its descendants. It also computes the appropriate render su
rfaces. |
| 541 // Some important points to remember: | 541 // Some important points to remember: |
| 542 // | 542 // |
| 543 // 0. Here, transforms are notated in Matrix x Vector order, and in words we
describe what | 543 // 0. Here, transforms are notated in Matrix x Vector order, and in words we
describe what |
| 544 // the transform does from left to right. | 544 // the transform does from left to right. |
| 545 // | 545 // |
| 546 // 1. In our terminology, the "layer origin" refers to the top-left corner o
f a layer, and the | 546 // 1. In our terminology, the "layer origin" refers to the top-left corner o
f a layer, and the |
| 547 // positive Y-axis points downwards. This interpretation is valid because
the orthographic | 547 // positive Y-axis points downwards. This interpretation is valid because
the orthographic |
| (...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 873 | 873 |
| 874 gfx::Transform nextScrollCompensationMatrix = computeScrollCompensationMatri
xForChildren(layer, parentMatrix, currentScrollCompensationMatrix);; | 874 gfx::Transform nextScrollCompensationMatrix = computeScrollCompensationMatri
xForChildren(layer, parentMatrix, currentScrollCompensationMatrix);; |
| 875 | 875 |
| 876 gfx::Rect accumulatedDrawableContentRectOfChildren; | 876 gfx::Rect accumulatedDrawableContentRectOfChildren; |
| 877 for (size_t i = 0; i < layer->children().size(); ++i) { | 877 for (size_t i = 0; i < layer->children().size(); ++i) { |
| 878 LayerType* child = LayerTreeHostCommon::getChildAsRawPtr(layer->children
(), i); | 878 LayerType* child = LayerTreeHostCommon::getChildAsRawPtr(layer->children
(), i); |
| 879 gfx::Rect drawableContentRectOfChildSubtree; | 879 gfx::Rect drawableContentRectOfChildSubtree; |
| 880 calculateDrawPropertiesInternal<LayerType, LayerList, RenderSurfaceType>
(child, sublayerMatrix, nextHierarchyMatrix, nextScrollCompensationMatrix, | 880 calculateDrawPropertiesInternal<LayerType, LayerList, RenderSurfaceType>
(child, sublayerMatrix, nextHierarchyMatrix, nextScrollCompensationMatrix, |
| 881
clipRectForSubtree, clipRectForSubtreeInDescendantSpace, subtreeShouldBeClipped
, nearestAncestorThatMovesPixels, | 881
clipRectForSubtree, clipRectForSubtreeInDescendantSpace, subtreeShouldBeClipped
, nearestAncestorThatMovesPixels, |
| 882
renderSurfaceLayerList, descendants, layerSorter, maxTextureSize, deviceScaleFa
ctor, pageScaleFactor, | 882
renderSurfaceLayerList, descendants, layerSorter, maxTextureSize, deviceScaleFa
ctor, pageScaleFactor, |
| 883
subtreeCanUseLCDText, drawableContentRectOfChildSubtree); | 883
subtreeCanUseLCDText, drawableContentRectOfChildSubtree, updateTilePriorities); |
| 884 if (!drawableContentRectOfChildSubtree.IsEmpty()) { | 884 if (!drawableContentRectOfChildSubtree.IsEmpty()) { |
| 885 accumulatedDrawableContentRectOfChildren.Union(drawableContentRectOf
ChildSubtree); | 885 accumulatedDrawableContentRectOfChildren.Union(drawableContentRectOf
ChildSubtree); |
| 886 if (child->renderSurface()) | 886 if (child->renderSurface()) |
| 887 descendants.push_back(child); | 887 descendants.push_back(child); |
| 888 } | 888 } |
| 889 } | 889 } |
| 890 | 890 |
| 891 if (layer->renderSurface() && !isRootLayer(layer) && !layer->renderSurface()
->layerList().size()) { | 891 if (layer->renderSurface() && !isRootLayer(layer) && !layer->renderSurface()
->layerList().size()) { |
| 892 removeSurfaceForEarlyExit(layer, renderSurfaceLayerList); | 892 removeSurfaceForEarlyExit(layer, renderSurfaceLayerList); |
| 893 return; | 893 return; |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 973 // Compute the replica's "originTransform" that maps from the replic
a's origin space to the target surface origin space. | 973 // Compute the replica's "originTransform" that maps from the replic
a's origin space to the target surface origin space. |
| 974 gfx::Transform replicaOriginTransform = layer->renderSurface()->draw
Transform() * surfaceOriginToReplicaOriginTransform; | 974 gfx::Transform replicaOriginTransform = layer->renderSurface()->draw
Transform() * surfaceOriginToReplicaOriginTransform; |
| 975 renderSurface->setReplicaDrawTransform(replicaOriginTransform); | 975 renderSurface->setReplicaDrawTransform(replicaOriginTransform); |
| 976 | 976 |
| 977 // Compute the replica's "screenSpaceTransform" that maps from the r
eplica's origin space to the screen's origin space. | 977 // Compute the replica's "screenSpaceTransform" that maps from the r
eplica's origin space to the screen's origin space. |
| 978 gfx::Transform replicaScreenSpaceTransform = layer->renderSurface()-
>screenSpaceTransform() * surfaceOriginToReplicaOriginTransform; | 978 gfx::Transform replicaScreenSpaceTransform = layer->renderSurface()-
>screenSpaceTransform() * surfaceOriginToReplicaOriginTransform; |
| 979 renderSurface->setReplicaScreenSpaceTransform(replicaScreenSpaceTran
sform); | 979 renderSurface->setReplicaScreenSpaceTransform(replicaScreenSpaceTran
sform); |
| 980 } | 980 } |
| 981 } | 981 } |
| 982 | 982 |
| 983 markLayerAsUpdated(layer); | 983 if (updateTilePriorities) |
| 984 updateTilePrioritiesForLayer(layer); |
| 984 | 985 |
| 985 // If neither this layer nor any of its children were added, early out. | 986 // If neither this layer nor any of its children were added, early out. |
| 986 if (sortingStartIndex == descendants.size()) | 987 if (sortingStartIndex == descendants.size()) |
| 987 return; | 988 return; |
| 988 | 989 |
| 989 // If preserves-3d then sort all the descendants in 3D so that they can be | 990 // If preserves-3d then sort all the descendants in 3D so that they can be |
| 990 // drawn from back to front. If the preserves-3d property is also set on the
parent then | 991 // drawn from back to front. If the preserves-3d property is also set on the
parent then |
| 991 // skip the sorting as the parent will sort all the descendants anyway. | 992 // skip the sorting as the parent will sort all the descendants anyway. |
| 992 if (layerSorter && descendants.size() && layer->preserves3D() && (!layer->pa
rent() || !layer->parent()->preserves3D())) | 993 if (layerSorter && descendants.size() && layer->preserves3D() && (!layer->pa
rent() || !layer->parent()->preserves3D())) |
| 993 sortLayers(descendants.begin() + sortingStartIndex, descendants.end(), l
ayerSorter); | 994 sortLayers(descendants.begin() + sortingStartIndex, descendants.end(), l
ayerSorter); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1005 { | 1006 { |
| 1006 gfx::Rect totalDrawableContentRect; | 1007 gfx::Rect totalDrawableContentRect; |
| 1007 gfx::Transform identityMatrix; | 1008 gfx::Transform identityMatrix; |
| 1008 gfx::Transform deviceScaleTransform; | 1009 gfx::Transform deviceScaleTransform; |
| 1009 deviceScaleTransform.Scale(deviceScaleFactor, deviceScaleFactor); | 1010 deviceScaleTransform.Scale(deviceScaleFactor, deviceScaleFactor); |
| 1010 std::vector<scoped_refptr<Layer> > dummyLayerList; | 1011 std::vector<scoped_refptr<Layer> > dummyLayerList; |
| 1011 | 1012 |
| 1012 // The root layer's renderSurface should receive the deviceViewport as the i
nitial clipRect. | 1013 // The root layer's renderSurface should receive the deviceViewport as the i
nitial clipRect. |
| 1013 bool subtreeShouldBeClipped = true; | 1014 bool subtreeShouldBeClipped = true; |
| 1014 gfx::Rect deviceViewportRect(gfx::Point(), deviceViewportSize); | 1015 gfx::Rect deviceViewportRect(gfx::Point(), deviceViewportSize); |
| 1016 bool updateTilePriorities = false; |
| 1015 | 1017 |
| 1016 // This function should have received a root layer. | 1018 // This function should have received a root layer. |
| 1017 DCHECK(isRootLayer(rootLayer)); | 1019 DCHECK(isRootLayer(rootLayer)); |
| 1018 | 1020 |
| 1019 preCalculateMetaInformation<Layer>(rootLayer); | 1021 preCalculateMetaInformation<Layer>(rootLayer); |
| 1020 calculateDrawPropertiesInternal<Layer, std::vector<scoped_refptr<Layer> >, R
enderSurface>( | 1022 calculateDrawPropertiesInternal<Layer, std::vector<scoped_refptr<Layer> >, R
enderSurface>( |
| 1021 rootLayer, deviceScaleTransform, identityMatrix, identityMatrix, | 1023 rootLayer, deviceScaleTransform, identityMatrix, identityMatrix, |
| 1022 deviceViewportRect, deviceViewportRect, subtreeShouldBeClipped, 0, rende
rSurfaceLayerList, | 1024 deviceViewportRect, deviceViewportRect, subtreeShouldBeClipped, 0, rende
rSurfaceLayerList, |
| 1023 dummyLayerList, 0, maxTextureSize, | 1025 dummyLayerList, 0, maxTextureSize, |
| 1024 deviceScaleFactor, pageScaleFactor, canUseLCDText, totalDrawableContentR
ect); | 1026 deviceScaleFactor, pageScaleFactor, canUseLCDText, totalDrawableContentR
ect, |
| 1027 updateTilePriorities); |
| 1025 | 1028 |
| 1026 // The dummy layer list should not have been used. | 1029 // The dummy layer list should not have been used. |
| 1027 DCHECK(dummyLayerList.size() == 0); | 1030 DCHECK(dummyLayerList.size() == 0); |
| 1028 // A root layer renderSurface should always exist after calculateDrawPropert
ies. | 1031 // A root layer renderSurface should always exist after calculateDrawPropert
ies. |
| 1029 DCHECK(rootLayer->renderSurface()); | 1032 DCHECK(rootLayer->renderSurface()); |
| 1030 } | 1033 } |
| 1031 | 1034 |
| 1032 void LayerTreeHostCommon::calculateDrawProperties(LayerImpl* rootLayer, const gf
x::Size& deviceViewportSize, float deviceScaleFactor, float pageScaleFactor, int
maxTextureSize, bool canUseLCDText, std::vector<LayerImpl*>& renderSurfaceLayer
List) | 1035 void LayerTreeHostCommon::calculateDrawProperties(LayerImpl* rootLayer, const gf
x::Size& deviceViewportSize, float deviceScaleFactor, float pageScaleFactor, int
maxTextureSize, bool canUseLCDText, std::vector<LayerImpl*>& renderSurfaceLayer
List, bool updateTilePriorities) |
| 1033 { | 1036 { |
| 1034 gfx::Rect totalDrawableContentRect; | 1037 gfx::Rect totalDrawableContentRect; |
| 1035 gfx::Transform identityMatrix; | 1038 gfx::Transform identityMatrix; |
| 1036 gfx::Transform deviceScaleTransform; | 1039 gfx::Transform deviceScaleTransform; |
| 1037 deviceScaleTransform.Scale(deviceScaleFactor, deviceScaleFactor); | 1040 deviceScaleTransform.Scale(deviceScaleFactor, deviceScaleFactor); |
| 1038 std::vector<LayerImpl*> dummyLayerList; | 1041 std::vector<LayerImpl*> dummyLayerList; |
| 1039 LayerSorter layerSorter; | 1042 LayerSorter layerSorter; |
| 1040 | 1043 |
| 1041 // The root layer's renderSurface should receive the deviceViewport as the i
nitial clipRect. | 1044 // The root layer's renderSurface should receive the deviceViewport as the i
nitial clipRect. |
| 1042 bool subtreeShouldBeClipped = true; | 1045 bool subtreeShouldBeClipped = true; |
| 1043 gfx::Rect deviceViewportRect(gfx::Point(), deviceViewportSize); | 1046 gfx::Rect deviceViewportRect(gfx::Point(), deviceViewportSize); |
| 1044 | 1047 |
| 1045 // This function should have received a root layer. | 1048 // This function should have received a root layer. |
| 1046 DCHECK(isRootLayer(rootLayer)); | 1049 DCHECK(isRootLayer(rootLayer)); |
| 1047 | 1050 |
| 1048 preCalculateMetaInformation<LayerImpl>(rootLayer); | 1051 preCalculateMetaInformation<LayerImpl>(rootLayer); |
| 1049 calculateDrawPropertiesInternal<LayerImpl, std::vector<LayerImpl*>, RenderSu
rfaceImpl>( | 1052 calculateDrawPropertiesInternal<LayerImpl, std::vector<LayerImpl*>, RenderSu
rfaceImpl>( |
| 1050 rootLayer, deviceScaleTransform, identityMatrix, identityMatrix, | 1053 rootLayer, deviceScaleTransform, identityMatrix, identityMatrix, |
| 1051 deviceViewportRect, deviceViewportRect, subtreeShouldBeClipped, 0, rende
rSurfaceLayerList, | 1054 deviceViewportRect, deviceViewportRect, subtreeShouldBeClipped, 0, rende
rSurfaceLayerList, |
| 1052 dummyLayerList, &layerSorter, maxTextureSize, | 1055 dummyLayerList, &layerSorter, maxTextureSize, |
| 1053 deviceScaleFactor, pageScaleFactor, canUseLCDText, totalDrawableContentR
ect); | 1056 deviceScaleFactor, pageScaleFactor, canUseLCDText, totalDrawableContentR
ect, |
| 1057 updateTilePriorities); |
| 1054 | 1058 |
| 1055 // The dummy layer list should not have been used. | 1059 // The dummy layer list should not have been used. |
| 1056 DCHECK(dummyLayerList.size() == 0); | 1060 DCHECK(dummyLayerList.size() == 0); |
| 1057 // A root layer renderSurface should always exist after calculateDrawPropert
ies. | 1061 // A root layer renderSurface should always exist after calculateDrawPropert
ies. |
| 1058 DCHECK(rootLayer->renderSurface()); | 1062 DCHECK(rootLayer->renderSurface()); |
| 1059 } | 1063 } |
| 1060 | 1064 |
| 1061 static bool pointHitsRect(const gfx::PointF& screenSpacePoint, const gfx::Transf
orm& localSpaceToScreenSpaceTransform, gfx::RectF localSpaceRect) | 1065 static bool pointHitsRect(const gfx::PointF& screenSpacePoint, const gfx::Transf
orm& localSpaceToScreenSpaceTransform, gfx::RectF localSpaceRect) |
| 1062 { | 1066 { |
| 1063 // If the transform is not invertible, then assume that this point doesn't h
it this rect. | 1067 // If the transform is not invertible, then assume that this point doesn't h
it this rect. |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1183 | 1187 |
| 1184 // At this point, we think the point does hit the touch event handler region o
n the layer, but we need to walk up | 1188 // At this point, we think the point does hit the touch event handler region o
n the layer, but we need to walk up |
| 1185 // the parents to ensure that the layer was not clipped in such a way that the | 1189 // the parents to ensure that the layer was not clipped in such a way that the |
| 1186 // hit point actually should not hit the layer. | 1190 // hit point actually should not hit the layer. |
| 1187 if (pointIsClippedBySurfaceOrClipRect(screenSpacePoint, layerImpl)) | 1191 if (pointIsClippedBySurfaceOrClipRect(screenSpacePoint, layerImpl)) |
| 1188 return false; | 1192 return false; |
| 1189 | 1193 |
| 1190 return true; | 1194 return true; |
| 1191 } | 1195 } |
| 1192 } // namespace cc | 1196 } // namespace cc |
| OLD | NEW |