Changeset 149369 in webkit


Ignore:
Timestamp:
Apr 30, 2013 7:39:56 AM (11 years ago)
Author:
commit-queue@webkit.org
Message:

[Texmap] Avoid using overlap/non-overlap region in cases where the overhead is bigger than the gain
https://bugs.webkit.org/show_bug.cgi?id=115226

Patch by Noam Rosenthal <Noam Rosenthal> on 2013-04-30
Reviewed by Allan Sandfeld Jensen.

When there are several fragmeneted overlap regions, or when the overlap region is bigger than the
non-overlap region, it's more efficient to have a single intermediate surface rather than split
the rendering to overlap/non-overlap.

Covered by tests in compositing/overlap-blending.

  • platform/graphics/texmap/TextureMapperLayer.cpp:

(WebCore::TextureMapperLayer::shouldBlend):

Readability fix.

(WebCore::TextureMapperLayer::paintUsingOverlapRegions):

Consolidate to one overlap rect when one of the following occurs:

  • The overlap region's area is larger than the non-overlap region area.
  • There are many fragmented overlap regions and no non-overlap regions.
Location:
trunk/Source/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r149368 r149369  
     12013-04-30  Noam Rosenthal  <noam@webkit.org>
     2
     3        [Texmap] Avoid using overlap/non-overlap region in cases where the overhead is bigger than the gain
     4        https://bugs.webkit.org/show_bug.cgi?id=115226
     5
     6        Reviewed by Allan Sandfeld Jensen.
     7
     8        When there are several fragmeneted overlap regions, or when the overlap region is bigger than the
     9        non-overlap region, it's more efficient to have a single intermediate surface rather than split
     10        the rendering to overlap/non-overlap.
     11
     12        Covered by tests in compositing/overlap-blending.
     13
     14        * platform/graphics/texmap/TextureMapperLayer.cpp:
     15        (WebCore::TextureMapperLayer::shouldBlend):
     16            Readability fix.
     17
     18        (WebCore::TextureMapperLayer::paintUsingOverlapRegions):
     19            Consolidate to one overlap rect when one of the following occurs:
     20            - The overlap region's area is larger than the non-overlap region area.
     21            - There are many fragmented overlap regions and no non-overlap regions.
     22
    1232013-04-30  Christophe Dumez  <ch.dumez@sisa.samsung.com>
    224
  • trunk/Source/WebCore/platform/graphics/texmap/TextureMapperLayer.cpp

    r149365 r149369  
    198198        return false;
    199199
    200 #if ENABLE(CSS_FILTERS)
    201     if (m_currentFilters.size())
    202         return true;
    203 #endif
    204     return m_currentOpacity < 1 || m_state.maskLayer || (m_state.replicaLayer && m_state.replicaLayer->m_state.maskLayer);
     200    return m_currentOpacity < 1
     201        || hasFilters()
     202        || m_state.maskLayer
     203        || (m_state.replicaLayer && m_state.replicaLayer->m_state.maskLayer);
    205204}
    206205
     
    335334    }
    336335
     336    // Having both overlap and non-overlap regions carries some overhead. Avoid it if the overlap area
     337    // is big anyway.
     338    if (overlapRegion.bounds().size().area() > nonOverlapRegion.bounds().size().area()) {
     339        overlapRegion.unite(nonOverlapRegion);
     340        nonOverlapRegion = Region();
     341    }
     342
    337343    nonOverlapRegion.translate(options.offset);
    338344    Vector<IntRect> rects = nonOverlapRegion.rects();
     345
    339346    for (size_t i = 0; i < rects.size(); ++i) {
    340347        IntRect rect = rects[i];
     
    348355
    349356    rects = overlapRegion.rects();
     357    static const size_t OverlapRegionConsolidationThreshold = 4;
     358    if (nonOverlapRegion.isEmpty() && rects.size() > OverlapRegionConsolidationThreshold) {
     359        rects.clear();
     360        rects.append(overlapRegion.bounds());
     361    }
     362
    350363    IntSize maxTextureSize = options.textureMapper->maxTextureSize();
    351364    IntRect adjustedClipBounds(options.textureMapper->clipBounds());
Note: See TracChangeset for help on using the changeset viewer.