Title: [106732] trunk/Source/WebCore
Revision
106732
Author
[email protected]
Date
2012-02-04 01:26:17 -0800 (Sat, 04 Feb 2012)

Log Message

[chromium] Fix multi-second hangs in compositor invalidating large layers
https://bugs.webkit.org/show_bug.cgi?id=77774

Reviewed by James Robinson.

Correctness covered by existing tests.

* platform/graphics/chromium/TiledLayerChromium.cpp:
(WebCore::TiledLayerChromium::pushPropertiesTo):
Remove tiles from the tiler when they are invalid (ie., no longer have
texture backing).
(WebCore::TiledLayerChromium::invalidateRect):
Instead of iterating over the tile indices (which may be very large),
iterate over the tile hash map instead.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (106731 => 106732)


--- trunk/Source/WebCore/ChangeLog	2012-02-04 09:24:10 UTC (rev 106731)
+++ trunk/Source/WebCore/ChangeLog	2012-02-04 09:26:17 UTC (rev 106732)
@@ -1,3 +1,20 @@
+2012-02-04  Stephen White  <[email protected]>
+
+        [chromium] Fix multi-second hangs in compositor invalidating large layers
+        https://bugs.webkit.org/show_bug.cgi?id=77774
+
+        Reviewed by James Robinson.
+
+        Correctness covered by existing tests.
+
+        * platform/graphics/chromium/TiledLayerChromium.cpp:
+        (WebCore::TiledLayerChromium::pushPropertiesTo):
+        Remove tiles from the tiler when they are invalid (ie., no longer have
+        texture backing).
+        (WebCore::TiledLayerChromium::invalidateRect):
+        Instead of iterating over the tile indices (which may be very large),
+        iterate over the tile hash map instead.
+
 2012-02-04  Swapna P  <[email protected]>
 
         Reviewed by Antonio Gomes.

Modified: trunk/Source/WebCore/platform/graphics/chromium/TiledLayerChromium.cpp (106731 => 106732)


--- trunk/Source/WebCore/platform/graphics/chromium/TiledLayerChromium.cpp	2012-02-04 09:24:10 UTC (rev 106731)
+++ trunk/Source/WebCore/platform/graphics/chromium/TiledLayerChromium.cpp	2012-02-04 09:26:17 UTC (rev 106732)
@@ -249,18 +249,23 @@
     tiledLayer->setSkipsDraw(m_skipsDraw);
     tiledLayer->setContentsSwizzled(m_sampledTexelFormat != LayerTextureUpdater::SampledTexelFormatRGBA);
     tiledLayer->setTilingData(*m_tiler);
+    Vector<UpdatableTile*> invalidTiles;
 
     for (CCLayerTilingData::TileMap::const_iterator iter = m_tiler->tiles().begin(); iter != m_tiler->tiles().end(); ++iter) {
         int i = iter->first.first;
         int j = iter->first.second;
         UpdatableTile* tile = static_cast<UpdatableTile*>(iter->second.get());
-        if (!tile->managedTexture()->isValid(m_tiler->tileSize(), m_textureFormat))
+        if (!tile->managedTexture()->isValid(m_tiler->tileSize(), m_textureFormat)) {
+            invalidTiles.append(tile);
             continue;
+        }
         if (tile->isDirty())
             continue;
 
         tiledLayer->pushTileProperties(i, j, tile->managedTexture()->textureId(), tile->m_opaqueRect);
     }
+    for (Vector<UpdatableTile*>::const_iterator iter = invalidTiles.begin(); iter != invalidTiles.end(); ++iter)
+        m_tiler->takeTile((*iter)->i(), (*iter)->j());
 }
 
 TextureManager* TiledLayerChromium::textureManager() const
@@ -310,17 +315,12 @@
     if (m_tiler->isEmpty() || layerRect.isEmpty() || m_skipsDraw)
         return;
 
-    int left, top, right, bottom;
-    m_tiler->layerRectToTileIndices(layerRect, left, top, right, bottom);
-    for (int j = top; j <= bottom; ++j) {
-        for (int i = left; i <= right; ++i) {
-            UpdatableTile* tile = tileAt(i, j);
-            if (!tile)
-                continue;
-            IntRect bound = m_tiler->tileRect(tile);
-            bound.intersect(layerRect);
-            tile->m_dirtyRect.unite(bound);
-        }
+    for (CCLayerTilingData::TileMap::const_iterator iter = m_tiler->tiles().begin(); iter != m_tiler->tiles().end(); ++iter) {
+        UpdatableTile* tile = static_cast<UpdatableTile*>(iter->second.get());
+        ASSERT(tile);
+        IntRect bound = m_tiler->tileRect(tile);
+        bound.intersect(layerRect);
+        tile->m_dirtyRect.unite(bound);
     }
 }
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to