Title: [152806] trunk/Source/WebCore
- Revision
- 152806
- Author
- [email protected]
- Date
- 2013-07-17 15:08:35 -0700 (Wed, 17 Jul 2013)
Log Message
Optimize RenderLayerCompositor's OverlapMap
https://bugs.webkit.org/show_bug.cgi?id=118764
Reviewed by Tim Horton.
Overlap stack items can have RectLists with hundreds of rectangles.
This makes the linear search in OverlapMap::overlapsLayers() very slow.
Optimize by storing the bounding rect of the list of rects, and doing an early
check on that. This reduces time spent in RenderLayer::scrollTo() by 13% in some
content with lots of layers inside an overflow:scroll.
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::OverlapMap::overlapsLayers):
(WebCore::RenderLayerCompositor::OverlapMap::popCompositingContainer):
(WebCore::RenderLayerCompositor::OverlapMap::RectList::append):
(WebCore::RenderLayerCompositor::OverlapMap::RectList::intersects):
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (152805 => 152806)
--- trunk/Source/WebCore/ChangeLog 2013-07-17 22:05:45 UTC (rev 152805)
+++ trunk/Source/WebCore/ChangeLog 2013-07-17 22:08:35 UTC (rev 152806)
@@ -1,3 +1,23 @@
+2013-07-17 Simon Fraser <[email protected]>
+
+ Optimize RenderLayerCompositor's OverlapMap
+ https://bugs.webkit.org/show_bug.cgi?id=118764
+
+ Reviewed by Tim Horton.
+
+ Overlap stack items can have RectLists with hundreds of rectangles.
+ This makes the linear search in OverlapMap::overlapsLayers() very slow.
+
+ Optimize by storing the bounding rect of the list of rects, and doing an early
+ check on that. This reduces time spent in RenderLayer::scrollTo() by 13% in some
+ content with lots of layers inside an overflow:scroll.
+
+ * rendering/RenderLayerCompositor.cpp:
+ (WebCore::RenderLayerCompositor::OverlapMap::overlapsLayers):
+ (WebCore::RenderLayerCompositor::OverlapMap::popCompositingContainer):
+ (WebCore::RenderLayerCompositor::OverlapMap::RectList::append):
+ (WebCore::RenderLayerCompositor::OverlapMap::RectList::intersects):
+
2013-07-17 Bem Jones-Bey <[email protected]>
[CSS Shapes] Port refactoring of shape-outside code from Blink
Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (152805 => 152806)
--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp 2013-07-17 22:05:45 UTC (rev 152805)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp 2013-07-17 22:08:35 UTC (rev 152806)
@@ -119,12 +119,7 @@
bool overlapsLayers(const IntRect& bounds) const
{
- const RectList& layerRects = m_overlapStack.last();
- for (unsigned i = 0; i < layerRects.size(); i++) {
- if (layerRects[i].intersects(bounds))
- return true;
- }
- return false;
+ return m_overlapStack.last().intersects(bounds);
}
bool isEmpty()
@@ -139,14 +134,42 @@
void popCompositingContainer()
{
- m_overlapStack[m_overlapStack.size() - 2].appendVector(m_overlapStack.last());
+ m_overlapStack[m_overlapStack.size() - 2].append(m_overlapStack.last());
m_overlapStack.removeLast();
}
RenderGeometryMap& geometryMap() { return m_geometryMap; }
private:
- typedef Vector<IntRect> RectList;
+ struct RectList {
+ Vector<IntRect> rects;
+ IntRect boundingRect;
+
+ void append(const IntRect& rect)
+ {
+ rects.append(rect);
+ boundingRect.unite(rect);
+ }
+
+ void append(const RectList& rectList)
+ {
+ rects.appendVector(rectList.rects);
+ boundingRect.unite(rectList.boundingRect);
+ }
+
+ bool intersects(const IntRect& rect) const
+ {
+ if (!rects.size() || !boundingRect.intersects(rect))
+ return false;
+
+ for (unsigned i = 0; i < rects.size(); i++) {
+ if (rects[i].intersects(rect))
+ return true;
+ }
+ return false;
+ }
+ };
+
Vector<RectList> m_overlapStack;
HashSet<const RenderLayer*> m_layers;
RenderGeometryMap m_geometryMap;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes