Changeset 106732 in webkit
- Timestamp:
- Feb 4, 2012 1:26:17 AM (12 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r106730 r106732 1 2012-02-04 Stephen White <senorblanco@chromium.org> 2 3 [chromium] Fix multi-second hangs in compositor invalidating large layers 4 https://bugs.webkit.org/show_bug.cgi?id=77774 5 6 Reviewed by James Robinson. 7 8 Correctness covered by existing tests. 9 10 * platform/graphics/chromium/TiledLayerChromium.cpp: 11 (WebCore::TiledLayerChromium::pushPropertiesTo): 12 Remove tiles from the tiler when they are invalid (ie., no longer have 13 texture backing). 14 (WebCore::TiledLayerChromium::invalidateRect): 15 Instead of iterating over the tile indices (which may be very large), 16 iterate over the tile hash map instead. 17 1 18 2012-02-04 Swapna P <spottabathini@innominds.com> 2 19 -
trunk/Source/WebCore/platform/graphics/chromium/TiledLayerChromium.cpp
r106700 r106732 250 250 tiledLayer->setContentsSwizzled(m_sampledTexelFormat != LayerTextureUpdater::SampledTexelFormatRGBA); 251 251 tiledLayer->setTilingData(*m_tiler); 252 Vector<UpdatableTile*> invalidTiles; 252 253 253 254 for (CCLayerTilingData::TileMap::const_iterator iter = m_tiler->tiles().begin(); iter != m_tiler->tiles().end(); ++iter) { … … 255 256 int j = iter->first.second; 256 257 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->second.get()); 257 if (!tile->managedTexture()->isValid(m_tiler->tileSize(), m_textureFormat)) 258 if (!tile->managedTexture()->isValid(m_tiler->tileSize(), m_textureFormat)) { 259 invalidTiles.append(tile); 258 260 continue; 261 } 259 262 if (tile->isDirty()) 260 263 continue; … … 262 265 tiledLayer->pushTileProperties(i, j, tile->managedTexture()->textureId(), tile->m_opaqueRect); 263 266 } 267 for (Vector<UpdatableTile*>::const_iterator iter = invalidTiles.begin(); iter != invalidTiles.end(); ++iter) 268 m_tiler->takeTile((*iter)->i(), (*iter)->j()); 264 269 } 265 270 … … 311 316 return; 312 317 313 int left, top, right, bottom; 314 m_tiler->layerRectToTileIndices(layerRect, left, top, right, bottom); 315 for (int j = top; j <= bottom; ++j) { 316 for (int i = left; i <= right; ++i) { 317 UpdatableTile* tile = tileAt(i, j); 318 if (!tile) 319 continue; 320 IntRect bound = m_tiler->tileRect(tile); 321 bound.intersect(layerRect); 322 tile->m_dirtyRect.unite(bound); 323 } 318 for (CCLayerTilingData::TileMap::const_iterator iter = m_tiler->tiles().begin(); iter != m_tiler->tiles().end(); ++iter) { 319 UpdatableTile* tile = static_cast<UpdatableTile*>(iter->second.get()); 320 ASSERT(tile); 321 IntRect bound = m_tiler->tileRect(tile); 322 bound.intersect(layerRect); 323 tile->m_dirtyRect.unite(bound); 324 324 } 325 325 }
Note: See TracChangeset
for help on using the changeset viewer.