Make GraphicsLayerCA::backingStoreMemoryEstimate() give a better estimate for tiled...
authorsimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 21 Mar 2013 05:59:13 +0000 (05:59 +0000)
committersimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 21 Mar 2013 05:59:13 +0000 (05:59 +0000)
https://bugs.webkit.org/show_bug.cgi?id=112864

Reviewed by Tim Horton.

If a GraphicsLayerCA has TiledBacking, ask the TiledBacking how
much memory it's using for tiles, rather than just using
height * width * 4.

Implement retainedTileBackingStoreMemory() in the TileController,
summing the memory used by parented tiles.

The original code was incorrectly multiplying by contentsScale
only once rather than twice (2x contents scale uses 4x as much memory).

* platform/graphics/TiledBacking.h:
* platform/graphics/ca/GraphicsLayerCA.cpp:
(WebCore::GraphicsLayerCA::backingStoreMemoryEstimate):
* platform/graphics/ca/mac/TileController.h:
* platform/graphics/ca/mac/TileController.mm:
(WebCore::TileController::retainedTileBackingStoreMemory):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@146438 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/TiledBacking.h
Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp
Source/WebCore/platform/graphics/ca/mac/TileController.h
Source/WebCore/platform/graphics/ca/mac/TileController.mm

index 6ef2ce1..6512202 100644 (file)
@@ -1,3 +1,27 @@
+2013-03-20  Simon Fraser  <simon.fraser@apple.com>
+
+        Make GraphicsLayerCA::backingStoreMemoryEstimate() give a better estimate for tiled layers
+        https://bugs.webkit.org/show_bug.cgi?id=112864
+
+        Reviewed by Tim Horton.
+        
+        If a GraphicsLayerCA has TiledBacking, ask the TiledBacking how
+        much memory it's using for tiles, rather than just using 
+        height * width * 4.
+        
+        Implement retainedTileBackingStoreMemory() in the TileController,
+        summing the memory used by parented tiles.
+
+        The original code was incorrectly multiplying by contentsScale
+        only once rather than twice (2x contents scale uses 4x as much memory).
+
+        * platform/graphics/TiledBacking.h:
+        * platform/graphics/ca/GraphicsLayerCA.cpp:
+        (WebCore::GraphicsLayerCA::backingStoreMemoryEstimate):
+        * platform/graphics/ca/mac/TileController.h:
+        * platform/graphics/ca/mac/TileController.mm:
+        (WebCore::TileController::retainedTileBackingStoreMemory):
+
 2013-03-20  Sheriff Bot  <webkit.review.bot@gmail.com>
 
         Unreviewed, rolling out r146419.
index 5c5ca6b..ffa9ba9 100644 (file)
@@ -79,6 +79,8 @@ public:
     
     virtual void setUnparentsOffscreenTiles(bool) = 0;
     virtual bool unparentsOffscreenTiles() const = 0;
+    
+    virtual double retainedTileBackingStoreMemory() const = 0;
 
     // Exposed for testing
     virtual IntRect tileCoverageRect() const = 0;
index 16cb9ec..e1fc505 100644 (file)
@@ -3027,9 +3027,14 @@ double GraphicsLayerCA::backingStoreMemoryEstimate() const
 {
     if (!drawsContent())
         return 0;
-    
+
     // contentsLayer is given to us, so we don't really know anything about its contents.
-    return static_cast<double>(4 * size().width()) * size().height() * m_layer->contentsScale();
+    // FIXME: ignores layer clones.
+    
+    if (TiledBacking* tiledBacking = this->tiledBacking())
+        return tiledBacking->retainedTileBackingStoreMemory();
+
+    return 4.0 * size().width() * m_layer->contentsScale() * size().height() * m_layer->contentsScale();
 }
 
 } // namespace WebCore
index 3c83dcf..7ad7a46 100644 (file)
@@ -123,6 +123,7 @@ private:
     virtual bool aggressivelyRetainsTiles() const OVERRIDE { return m_aggressivelyRetainsTiles; }
     virtual void setUnparentsOffscreenTiles(bool flag) OVERRIDE { m_unparentsOffscreenTiles = flag; }
     virtual bool unparentsOffscreenTiles() const OVERRIDE { return m_unparentsOffscreenTiles; }
+    virtual double retainedTileBackingStoreMemory() const OVERRIDE;
     virtual IntRect tileCoverageRect() const OVERRIDE;
     virtual CALayer *tiledScrollingIndicatorLayer() OVERRIDE;
     virtual void setScrollingModeIndication(ScrollingModeIndication) OVERRIDE;
index 9af8a87..8643c9e 100644 (file)
@@ -878,6 +878,22 @@ IntRect TileController::tileGridExtent() const
     return IntRect(topLeft.x(), topLeft.y(), bottomRight.x() - topLeft.x() + 1, bottomRight.y() - topLeft.y() + 1);
 }
 
+double TileController::retainedTileBackingStoreMemory() const
+{
+    double totalBytes = 0;
+    
+    for (TileMap::const_iterator it = m_tiles.begin(), end = m_tiles.end(); it != end; ++it) {
+        const TileInfo& tileInfo = it->value;
+        if ([tileInfo.layer.get() superlayer]) {
+            CGRect bounds = [tileInfo.layer.get() bounds];
+            double contentsScale = [tileInfo.layer.get() contentsScale];
+            totalBytes += 4 * bounds.size.width * contentsScale * bounds.size.height * contentsScale;
+        }
+    }
+
+    return totalBytes;
+}
+
 // Return the rect in layer coords, not tile coords.
 IntRect TileController::tileCoverageRect() const
 {