Changeset 106732 in webkit


Ignore:
Timestamp:
Feb 4, 2012 1:26:17 AM (12 years ago)
Author:
senorblanco@chromium.org
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.

Location:
trunk/Source/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r106730 r106732  
     12012-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
    1182012-02-04  Swapna P  <spottabathini@innominds.com>
    219
  • trunk/Source/WebCore/platform/graphics/chromium/TiledLayerChromium.cpp

    r106700 r106732  
    250250    tiledLayer->setContentsSwizzled(m_sampledTexelFormat != LayerTextureUpdater::SampledTexelFormatRGBA);
    251251    tiledLayer->setTilingData(*m_tiler);
     252    Vector<UpdatableTile*> invalidTiles;
    252253
    253254    for (CCLayerTilingData::TileMap::const_iterator iter = m_tiler->tiles().begin(); iter != m_tiler->tiles().end(); ++iter) {
     
    255256        int j = iter->first.second;
    256257        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);
    258260            continue;
     261        }
    259262        if (tile->isDirty())
    260263            continue;
     
    262265        tiledLayer->pushTileProperties(i, j, tile->managedTexture()->textureId(), tile->m_opaqueRect);
    263266    }
     267    for (Vector<UpdatableTile*>::const_iterator iter = invalidTiles.begin(); iter != invalidTiles.end(); ++iter)
     268        m_tiler->takeTile((*iter)->i(), (*iter)->j());
    264269}
    265270
     
    311316        return;
    312317
    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);
    324324    }
    325325}
Note: See TracChangeset for help on using the changeset viewer.