Title: [149369] trunk/Source/WebCore
Revision
149369
Author
[email protected]
Date
2013-04-30 07:39:56 -0700 (Tue, 30 Apr 2013)

Log 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 <[email protected]> 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.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (149368 => 149369)


--- trunk/Source/WebCore/ChangeLog	2013-04-30 14:37:25 UTC (rev 149368)
+++ trunk/Source/WebCore/ChangeLog	2013-04-30 14:39:56 UTC (rev 149369)
@@ -1,3 +1,25 @@
+2013-04-30  Noam Rosenthal  <[email protected]>
+
+        [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
+
+        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.
+
 2013-04-30  Christophe Dumez  <[email protected]>
 
         Stop using "in" keyword in IDL files

Modified: trunk/Source/WebCore/platform/graphics/texmap/TextureMapperLayer.cpp (149368 => 149369)


--- trunk/Source/WebCore/platform/graphics/texmap/TextureMapperLayer.cpp	2013-04-30 14:37:25 UTC (rev 149368)
+++ trunk/Source/WebCore/platform/graphics/texmap/TextureMapperLayer.cpp	2013-04-30 14:39:56 UTC (rev 149369)
@@ -197,11 +197,10 @@
     if (m_state.preserves3D)
         return false;
 
-#if ENABLE(CSS_FILTERS)
-    if (m_currentFilters.size())
-        return true;
-#endif
-    return m_currentOpacity < 1 || m_state.maskLayer || (m_state.replicaLayer && m_state.replicaLayer->m_state.maskLayer);
+    return m_currentOpacity < 1
+        || hasFilters()
+        || m_state.maskLayer
+        || (m_state.replicaLayer && m_state.replicaLayer->m_state.maskLayer);
 }
 
 bool TextureMapperLayer::isVisible() const
@@ -334,8 +333,16 @@
         return;
     }
 
+    // Having both overlap and non-overlap regions carries some overhead. Avoid it if the overlap area
+    // is big anyway.
+    if (overlapRegion.bounds().size().area() > nonOverlapRegion.bounds().size().area()) {
+        overlapRegion.unite(nonOverlapRegion);
+        nonOverlapRegion = Region();
+    }
+
     nonOverlapRegion.translate(options.offset);
     Vector<IntRect> rects = nonOverlapRegion.rects();
+
     for (size_t i = 0; i < rects.size(); ++i) {
         IntRect rect = rects[i];
         if (!rect.intersects(options.textureMapper->clipBounds()))
@@ -347,6 +354,12 @@
     }
 
     rects = overlapRegion.rects();
+    static const size_t OverlapRegionConsolidationThreshold = 4;
+    if (nonOverlapRegion.isEmpty() && rects.size() > OverlapRegionConsolidationThreshold) {
+        rects.clear();
+        rects.append(overlapRegion.bounds());
+    }
+
     IntSize maxTextureSize = options.textureMapper->maxTextureSize();
     IntRect adjustedClipBounds(options.textureMapper->clipBounds());
     adjustedClipBounds.move(-options.offset);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to