Changeset 90505 in webkit


Ignore:
Timestamp:
Jul 6, 2011 3:33:24 PM (13 years ago)
Author:
enne@google.com
Message:

2011-07-06 Adrienne Walker <enne@google.com>

[chromium] Add compositor texture manager soft limits and lost focus reclaiming
https://bugs.webkit.org/show_bug.cgi?id=64009

Reviewed by James Robinson.

Add a soft limit for texture memory. Unprotected textures will get
reclaimed when above this limit. Increase the hard limit for maximum
texture memory as well, now that there is a better heuristic and
textures are reclaimed from tabs without focus.

Landing this for vangelis@chromium.org.

  • platform/graphics/chromium/LayerRendererChromium.cpp: (WebCore::LayerRendererChromium::releaseTextures): (WebCore::LayerRendererChromium::initializeSharedObjects):
  • platform/graphics/chromium/LayerRendererChromium.h:
  • platform/graphics/chromium/LayerTilerChromium.cpp: (WebCore::LayerTilerChromium::protectTileTextures):
  • platform/graphics/chromium/LayerTilerChromium.h:
  • platform/graphics/chromium/TextureManager.cpp: (WebCore::TextureManager::TextureManager): (WebCore::TextureManager::requestTexture):
  • platform/graphics/chromium/TextureManager.h: (WebCore::TextureManager::create):

2011-07-06 Adrienne Walker <enne@google.com>

[chromium] Add compositor texture manager soft limits and lost focus reclaiming
https://bugs.webkit.org/show_bug.cgi?id=64009

Reviewed by James Robinson.

Reclaim textures when the tab loses focus.

  • src/WebViewImpl.cpp: (WebKit::WebViewImpl::setVisibilityState):
Location:
trunk/Source
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r90499 r90505  
     12011-07-06  Adrienne Walker  <enne@google.com>
     2
     3        [chromium] Add compositor texture manager soft limits and lost focus reclaiming
     4        https://bugs.webkit.org/show_bug.cgi?id=64009
     5
     6        Reviewed by James Robinson.
     7
     8        Add a soft limit for texture memory. Unprotected textures will get
     9        reclaimed when above this limit. Increase the hard limit for maximum
     10        texture memory as well, now that there is a better heuristic and
     11        textures are reclaimed from tabs without focus.
     12
     13        Landing this for vangelis@chromium.org.
     14
     15        * platform/graphics/chromium/LayerRendererChromium.cpp:
     16        (WebCore::LayerRendererChromium::releaseTextures):
     17        (WebCore::LayerRendererChromium::initializeSharedObjects):
     18        * platform/graphics/chromium/LayerRendererChromium.h:
     19        * platform/graphics/chromium/LayerTilerChromium.cpp:
     20        (WebCore::LayerTilerChromium::protectTileTextures):
     21        * platform/graphics/chromium/LayerTilerChromium.h:
     22        * platform/graphics/chromium/TextureManager.cpp:
     23        (WebCore::TextureManager::TextureManager):
     24        (WebCore::TextureManager::requestTexture):
     25        * platform/graphics/chromium/TextureManager.h:
     26        (WebCore::TextureManager::create):
     27
    1282011-07-06  Pavel Feldman  <pfeldman@chromium.org>
    229
  • trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp

    r90492 r90505  
    6666
    6767// FIXME: Make this limit adjustable and give it a useful value.
    68 static size_t textureMemoryLimitBytes = 64 * 1024 * 1024;
     68
     69// Absolute maximum limit for texture allocations for this instance.
     70static size_t textureMemoryHighLimitBytes = 128 * 1024 * 1024;
     71// Preferred texture size limit. Can be exceeded if needed.
     72static size_t textureMemoryReclaimLimitBytes = 64 * 1024 * 1024;
     73// The maximum texture memory usage when asked to release textures.
     74static size_t textureMemoryLowLimitBytes = 3 * 1024 * 1024;
    6975
    7076#ifndef NDEBUG
     
    200206{
    201207    m_rootLayerContentTiler->invalidateRect(dirtyRect);
     208}
     209
     210void LayerRendererChromium::releaseTextures()
     211{
     212    // Reduces texture memory usage to textureMemoryLowLimitBytes by deleting non root layer
     213    // textures.
     214    m_rootLayerContentTiler->protectTileTextures(m_viewportVisibleRect);
     215    m_textureManager->reduceMemoryToLimit(textureMemoryLowLimitBytes);
     216    m_textureManager->unprotectAllTextures();
    202217}
    203218
     
    11151130    GLC(m_context.get(), m_context->flush());
    11161131
    1117     m_textureManager = TextureManager::create(m_context.get(), textureMemoryLimitBytes, m_maxTextureSize);
     1132    TextureManager::TextureMemoryLimits limits;
     1133    limits.upperLimit = textureMemoryHighLimitBytes;
     1134    limits.reclaimLimit = textureMemoryReclaimLimitBytes;
     1135    m_textureManager = TextureManager::create(m_context.get(), limits, m_maxTextureSize);
    11181136    return true;
    11191137}
  • trunk/Source/WebCore/platform/graphics/chromium/LayerRendererChromium.h

    r89837 r90505  
    157157    bool isCompositorContextLost();
    158158
     159    void releaseTextures();
     160
    159161#ifndef NDEBUG
    160162    static bool s_inPaintLayerContents;
  • trunk/Source/WebCore/platform/graphics/chromium/LayerTilerChromium.cpp

    r90260 r90505  
    227227}
    228228
     229void LayerTilerChromium::protectTileTextures(const IntRect& contentRect)
     230{
     231    if (contentRect.isEmpty())
     232        return;
     233
     234    int left, top, right, bottom;
     235    contentRectToTileIndices(contentRect, left, top, right, bottom);
     236
     237    for (int j = top; j <= bottom; ++j) {
     238        for (int i = left; i <= right; ++i) {
     239            Tile* tile = tileAt(i, j);
     240            if (!tile || !tile->texture()->isValid(m_tileSize, GraphicsContext3D::RGBA))
     241                continue;
     242
     243            tile->texture()->reserve(m_tileSize, GraphicsContext3D::RGBA);
     244        }
     245    }
     246}
     247
    229248void LayerTilerChromium::prepareToUpdate(const IntRect& contentRect, LayerTextureUpdater* textureUpdater)
    230249{
  • trunk/Source/WebCore/platform/graphics/chromium/LayerTilerChromium.h

    r89647 r90505  
    7070
    7171    bool skipsDraw() const { return m_skipsDraw; }
     72
     73    // Reserves all existing and valid tile textures to protect them from being
     74    // recycled by the texture manager.
     75    void protectTileTextures(const IntRect& contentRect);
    7276
    7377    typedef ProgramBinding<VertexShaderPosTexTransform, FragmentShaderRGBATexAlpha> Program;
  • trunk/Source/WebCore/platform/graphics/chromium/TextureManager.cpp

    r90260 r90505  
    3939}
    4040
    41 TextureManager::TextureManager(GraphicsContext3D* context, size_t memoryLimitBytes, int maxTextureSize)
     41TextureManager::TextureManager(GraphicsContext3D* context, const TextureMemoryLimits& memoryLimits, int maxTextureSize)
    4242    : m_context(context)
    43     , m_memoryLimitBytes(memoryLimitBytes)
     43    , m_memoryLimits(memoryLimits)
    4444    , m_memoryUseBytes(0)
    4545    , m_maxTextureSize(maxTextureSize)
     
    9898}
    9999
    100 bool TextureManager::reduceMemoryToLimit(size_t limit)
     100void TextureManager::reduceMemoryToLimit(size_t limit)
    101101{
    102102    while (m_memoryUseBytes > limit) {
     
    113113        }
    114114        if (!foundCandidate)
    115             return false;
     115            return;
    116116    }
    117     return true;
    118117}
    119118
     
    138137}
    139138
    140 unsigned TextureManager::requestTexture(TextureToken token, IntSize size, unsigned format, bool* newTexture)
     139unsigned TextureManager::requestTexture(TextureToken token, IntSize size, unsigned format)
    141140{
    142141    if (size.width() > m_maxTextureSize || size.height() > m_maxTextureSize)
     
    150149
    151150    size_t memoryRequiredBytes = memoryUseBytes(size, format);
    152     if (memoryRequiredBytes > m_memoryLimitBytes || !reduceMemoryToLimit(m_memoryLimitBytes - memoryRequiredBytes))
     151
     152    // Reclaim existing unreserved textures to try to stay below the reclaim limit.
     153    reduceMemoryToLimit(std::max(m_memoryLimits.reclaimLimit - memoryRequiredBytes, static_cast<size_t>(0)));
     154    if (m_memoryUseBytes + memoryRequiredBytes > m_memoryLimits.upperLimit)
    153155        return 0;
    154156
  • trunk/Source/WebCore/platform/graphics/chromium/TextureManager.h

    r90260 r90505  
    4141    WTF_MAKE_NONCOPYABLE(TextureManager);
    4242public:
    43     static PassOwnPtr<TextureManager> create(GraphicsContext3D* context, size_t memoryLimitBytes, int maxTextureSize)
     43    struct TextureMemoryLimits {
     44        // Maximum texture allocation size.
     45        size_t upperLimit;
     46        // Limit over which existing unreserved textures will be reclaimed.
     47        size_t reclaimLimit;
     48    };
     49
     50    static PassOwnPtr<TextureManager> create(GraphicsContext3D* context, const TextureMemoryLimits& memoryLimits, int maxTextureSize)
    4451    {
    45         return adoptPtr(new TextureManager(context, memoryLimitBytes, maxTextureSize));
     52        return adoptPtr(new TextureManager(context, memoryLimits, maxTextureSize));
    4653    }
    4754
     
    5057    bool hasTexture(TextureToken);
    5158
    52     unsigned requestTexture(TextureToken, IntSize, unsigned textureFormat, bool* newTexture = 0);
     59    unsigned requestTexture(TextureToken, IntSize, unsigned textureFormat);
    5360
    5461    void protectTexture(TextureToken);
     
    5764    bool isProtected(TextureToken);
    5865
     66    void reduceMemoryToLimit(size_t);
     67
    5968private:
    60     TextureManager(GraphicsContext3D*, size_t memoryLimitBytes, int maxTextureSize);
     69    TextureManager(GraphicsContext3D*, const TextureMemoryLimits&, int maxTextureSize);
    6170
    6271    struct TextureInfo {
     
    6776    };
    6877
    69     bool reduceMemoryToLimit(size_t);
    7078    void addTexture(TextureToken, TextureInfo);
    7179    void removeTexture(TextureToken, TextureInfo);
     
    7785    ListHashSet<TextureToken> m_textureLRUSet;
    7886
    79     size_t m_memoryLimitBytes;
     87    TextureMemoryLimits m_memoryLimits;
    8088    size_t m_memoryUseBytes;
    8189    int m_maxTextureSize;
  • trunk/Source/WebKit/chromium/ChangeLog

    r90497 r90505  
     12011-07-06  Adrienne Walker  <enne@google.com>
     2
     3        [chromium] Add compositor texture manager soft limits and lost focus reclaiming
     4        https://bugs.webkit.org/show_bug.cgi?id=64009
     5
     6        Reviewed by James Robinson.
     7
     8        Reclaim textures when the tab loses focus.
     9
     10        * src/WebViewImpl.cpp:
     11        (WebKit::WebViewImpl::setVisibilityState):
     12
    1132011-06-30  Cris Neckar  <cdn@chromium.org>
    214
  • trunk/Source/WebKit/chromium/src/WebViewImpl.cpp

    r90185 r90505  
    26522652void WebViewImpl::setVisibilityState(WebPageVisibilityState visibilityState,
    26532653                                     bool isInitialState) {
     2654    if (!page())
     2655        return;
     2656
    26542657#if ENABLE(PAGE_VISIBILITY_API)
    2655     if (!page())
    2656         return;
    2657 
    26582658    ASSERT(visibilityState == WebPageVisibilityStateVisible
    26592659           || visibilityState == WebPageVisibilityStateHidden
     
    26612661    m_page->setVisibilityState(static_cast<PageVisibilityState>(static_cast<int>(visibilityState)), isInitialState);
    26622662#endif
     2663
     2664#if USE(ACCELERATED_COMPOSITING)
     2665    if (isAcceleratedCompositingActive() && visibilityState == WebPageVisibilityStateHidden)
     2666        m_layerRenderer->releaseTextures();
     2667#endif
    26632668}
    26642669
Note: See TracChangeset for help on using the changeset viewer.