Changeset 121124 in webkit
- Timestamp:
- Jun 24, 2012, 5:14:23 PM (14 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 5 edited
-
ChangeLog (modified) (1 diff)
-
rendering/RenderGeometryMap.cpp (modified) (3 diffs)
-
rendering/RenderGeometryMap.h (modified) (3 diffs)
-
rendering/RenderLayer.h (modified) (2 diffs)
-
rendering/RenderLayerCompositor.cpp (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r121123 r121124 1 2012-06-24 Antti Koivisto <antti@apple.com> 2 3 Optimize RenderGeometryMap mappings gathering 4 https://bugs.webkit.org/show_bug.cgi?id=89828 5 6 Reviewed by Simon Fraser. 7 8 RenderGeometryMap currently gathers mappings by climbing the rendering tree. This is slow and can produce 9 large number of mapping steps. In the common case we already have the child layer coordinates available in 10 the layer tree and we can just use that. 11 12 The combination of faster mappings gathering and fewer number of applying steps reduces time spent under 13 RenderLayerCompositor::computeCompositingRequirements to less than half when scrolling the mobile version 14 of twitter.com. 15 16 * rendering/RenderGeometryMap.cpp: 17 (WebCore): 18 (WebCore::RenderGeometryMap::pushMappingsToAncestor): 19 20 Use pre-computed mapping from the layer tree when possible. 21 22 (WebCore::RenderGeometryMap::popMappingsToAncestor): 23 * rendering/RenderGeometryMap.h: 24 25 Add some inline capacity. 26 27 (WebCore): 28 (RenderGeometryMap): 29 * rendering/RenderLayer.h: 30 (WebCore::RenderLayer::canUseConvertToLayerCoords): 31 (RenderLayer): 32 * rendering/RenderLayerCompositor.cpp: 33 (WebCore::RenderLayerCompositor::addToOverlapMapRecursive): 34 (WebCore::RenderLayerCompositor::computeCompositingRequirements): 35 1 36 2012-06-24 Simon Fraser <simon.fraser@apple.com> 2 37 -
trunk/Source/WebCore/rendering/RenderGeometryMap.cpp
r118957 r121124 27 27 #include "RenderGeometryMap.h" 28 28 29 #include "RenderLayer.h" 29 30 #include "RenderView.h" 30 31 #include "TransformState.h" 32 #include <wtf/TemporaryChange.h> 31 33 32 34 namespace WebCore { 33 34 35 35 36 // Stores data about how to map from one renderer to its container. … … 171 172 } 172 173 173 void RenderGeometryMap::pushMappingsToAncestor(const RenderObject* renderer, const RenderBoxModelObject* ancestor) 174 { 175 const RenderObject* currRenderer = renderer; 176 174 void RenderGeometryMap::pushMappingsToAncestor(const RenderObject* renderer, const RenderBoxModelObject* ancestorRenderer) 175 { 177 176 // We need to push mappings in reverse order here, so do insertions rather than appends. 178 m_insertionPosition = m_mapping.size(); 179 177 TemporaryChange<size_t> positionChange(m_insertionPosition, m_mapping.size()); 180 178 do { 181 currRenderer = currRenderer->pushMappingToContainer(ancestor, *this); 182 } while (currRenderer && currRenderer != ancestor); 183 184 m_insertionPosition = notFound; 179 renderer = renderer->pushMappingToContainer(ancestorRenderer, *this); 180 } while (renderer && renderer != ancestorRenderer); 181 } 182 183 void RenderGeometryMap::pushMappingsToAncestor(const RenderLayer* layer, const RenderLayer* ancestorLayer) 184 { 185 const RenderObject* renderer = layer->renderer(); 186 187 // The simple case can be handled fast in the layer tree. 188 bool canConvertInLayerTree = ancestorLayer && renderer->style()->position() != FixedPosition; 189 for (const RenderLayer* current = layer; current != ancestorLayer && canConvertInLayerTree; current = current->parent()) 190 canConvertInLayerTree = current->canUseConvertToLayerCoords(); 191 192 if (canConvertInLayerTree) { 193 TemporaryChange<size_t> positionChange(m_insertionPosition, m_mapping.size()); 194 LayoutPoint layerOffset; 195 layer->convertToLayerCoords(ancestorLayer, layerOffset); 196 push(renderer, toLayoutSize(layerOffset), /*accumulatingTransform*/ true, /*isNonUniform*/ false, /*isFixedPosition*/ false, /*hasTransform*/ false); 197 return; 198 } 199 const RenderBoxModelObject* ancestorRenderer = ancestorLayer ? ancestorLayer->renderer() : 0; 200 pushMappingsToAncestor(renderer, ancestorRenderer); 185 201 } 186 202 … … 221 237 } 222 238 223 void RenderGeometryMap::popMappingsToAncestor(const RenderBoxModelObject* ancestor )239 void RenderGeometryMap::popMappingsToAncestor(const RenderBoxModelObject* ancestorRenderer) 224 240 { 225 241 ASSERT(m_mapping.size()); 226 242 227 while (m_mapping.size() && m_mapping.last()->m_renderer != ancestor ) {243 while (m_mapping.size() && m_mapping.last()->m_renderer != ancestorRenderer) { 228 244 stepRemoved(*m_mapping.last().get()); 229 245 m_mapping.removeLast(); 230 246 } 247 } 248 249 void RenderGeometryMap::popMappingsToAncestor(const RenderLayer* ancestorLayer) 250 { 251 const RenderBoxModelObject* ancestorRenderer = ancestorLayer ? ancestorLayer->renderer() : 0; 252 popMappingsToAncestor(ancestorRenderer); 231 253 } 232 254 -
trunk/Source/WebCore/rendering/RenderGeometryMap.h
r118567 r121124 37 37 38 38 class RenderGeometryMapStep; 39 class RenderLayer; 39 40 40 41 // Can be used while walking the Renderer tree to cache data about offsets and transforms. … … 48 49 49 50 // Called by code walking the renderer or layer trees. 50 void pushMappingsToAncestor(const RenderObject*, const RenderBoxModelObject* ancestor); 51 void pushMappingsToAncestor(const RenderLayer*, const RenderLayer* ancestorLayer); 52 void popMappingsToAncestor(const RenderLayer*); 53 void pushMappingsToAncestor(const RenderObject*, const RenderBoxModelObject* ancestorRenderer); 51 54 void popMappingsToAncestor(const RenderBoxModelObject*); 52 55 … … 71 74 bool hasFixedPositionStep() const { return m_fixedStepsCount; } 72 75 73 typedef Vector<OwnPtr<RenderGeometryMapStep> > RenderGeometryMapSteps; // FIXME: inline capacity?74 76 typedef Vector<OwnPtr<RenderGeometryMapStep>, 32> RenderGeometryMapSteps; 77 75 78 size_t m_insertionPosition; 76 79 int m_nonUniformStepsCount; -
trunk/Source/WebCore/rendering/RenderLayer.h
r120832 r121124 474 474 #endif 475 475 476 bool canUseConvertToLayerCoords() const 477 { 478 // These RenderObject have an impact on their layers' without them knowing about it. 479 return !renderer()->hasColumns() && !renderer()->hasTransform() && !isComposited() 480 #if ENABLE(SVG) 481 && !renderer()->isSVGRoot() 482 #endif 483 ; 484 } 485 476 486 void convertToPixelSnappedLayerCoords(const RenderLayer* ancestorLayer, IntPoint& location) const; 477 487 void convertToPixelSnappedLayerCoords(const RenderLayer* ancestorLayer, IntRect&) const; … … 859 869 LayoutUnit overflowRight() const; 860 870 861 bool canUseConvertToLayerCoords() const862 {863 // These RenderObject have an impact on their layers' without them knowing about it.864 return !renderer()->hasColumns() && !renderer()->hasTransform() && !isComposited()865 #if ENABLE(SVG)866 && !renderer()->isSVGRoot()867 #endif868 ;869 }870 871 871 LayoutUnit verticalScrollbarStart(int minX, int maxX) const; 872 872 LayoutUnit horizontalScrollbarStart(int minX) const; -
trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp
r121123 r121124 672 672 // A null ancestorLayer is an indication that 'layer' has already been pushed. 673 673 if (ancestorLayer) 674 overlapMap.geometryMap().pushMappingsToAncestor(layer ->renderer(), ancestorLayer->renderer());674 overlapMap.geometryMap().pushMappingsToAncestor(layer, ancestorLayer); 675 675 676 676 IntRect bounds; … … 711 711 712 712 if (ancestorLayer) 713 overlapMap.geometryMap().popMappingsToAncestor(ancestorLayer ->renderer());713 overlapMap.geometryMap().popMappingsToAncestor(ancestorLayer); 714 714 } 715 715 … … 728 728 729 729 if (overlapMap) 730 overlapMap->geometryMap().pushMappingsToAncestor(layer ->renderer(), ancestorLayer ? ancestorLayer->renderer() : 0);730 overlapMap->geometryMap().pushMappingsToAncestor(layer, ancestorLayer); 731 731 732 732 // Clear the flag … … 911 911 912 912 if (overlapMap) 913 overlapMap->geometryMap().popMappingsToAncestor(ancestorLayer ? ancestorLayer->renderer() : 0);913 overlapMap->geometryMap().popMappingsToAncestor(ancestorLayer); 914 914 } 915 915
Note:
See TracChangeset
for help on using the changeset viewer.