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