[chromium] Avoid culling work for fully-non-opaque tiles, and add tracing for draw...
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 24 Feb 2012 11:01:28 +0000 (11:01 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 24 Feb 2012 11:01:28 +0000 (11:01 +0000)
https://bugs.webkit.org/show_bug.cgi?id=79183

Patch by Dana Jansens <danakj@chromium.org> on 2012-02-24
Reviewed by James Robinson.

Addresses performance issues with draw culling by avoiding the work
of mapRect and other function calls when the quad has no opaque area.
And adds a TRACE_EVENT to watch the time spent in draw culling.

* platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:
(WebCore::CCLayerTreeHostImpl::optimizeRenderPasses):
* platform/graphics/chromium/cc/CCQuadCuller.cpp:
(WebCore::CCQuadCuller::cullOccludedQuads):

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@108764 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp
Source/WebCore/platform/graphics/chromium/cc/CCQuadCuller.cpp

index 5e6417e..61ecc24 100644 (file)
@@ -1,3 +1,19 @@
+2012-02-24  Dana Jansens  <danakj@chromium.org>
+
+        [chromium] Avoid culling work for fully-non-opaque tiles, and add tracing for draw culling
+        https://bugs.webkit.org/show_bug.cgi?id=79183
+
+        Reviewed by James Robinson.
+
+        Addresses performance issues with draw culling by avoiding the work
+        of mapRect and other function calls when the quad has no opaque area.
+        And adds a TRACE_EVENT to watch the time spent in draw culling.
+
+        * platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:
+        (WebCore::CCLayerTreeHostImpl::optimizeRenderPasses):
+        * platform/graphics/chromium/cc/CCQuadCuller.cpp:
+        (WebCore::CCQuadCuller::cullOccludedQuads):
+
 2012-02-24  Vsevolod Vlasov  <vsevik@chromium.org>
 
         Web Inspector: Scripts panel navigator overlay should be shown automatically only one time.
index 4b3242d..d30c68c 100644 (file)
@@ -229,6 +229,8 @@ void CCLayerTreeHostImpl::calculateRenderPasses(CCRenderPassList& passes, CCLaye
 
 void CCLayerTreeHostImpl::optimizeRenderPasses(CCRenderPassList& passes)
 {
+    TRACE_EVENT1("webkit", "CCLayerTreeHostImpl::optimizeRenderPasses", "passes.size()", static_cast<long long unsigned>(passes.size()));
+
     bool haveDamageRect = layerRendererCapabilities().usingPartialSwap;
 
     for (unsigned i = 0; i < passes.size(); ++i) {
index 212114f..4f6435d 100644 (file)
@@ -96,20 +96,21 @@ void CCQuadCuller::cullOccludedQuads(CCQuadList& quadList, bool haveDamageRect,
 
         IntRect transformedVisibleQuadRect = rectSubtractRegion(opaqueCoverageThusFar, transformedQuadRect);
         bool keepQuad = !transformedVisibleQuadRect.isEmpty();
+        if (!keepQuad)
+            continue;
 
         // See if we can reduce the number of pixels to draw by reducing the size of the draw
         // quad - we do this by changing its visible rect.
-        if (keepQuad && transformedVisibleQuadRect != transformedQuadRect && drawQuad->isLayerAxisAlignedIntRect())
+        if (transformedVisibleQuadRect != transformedQuadRect && drawQuad->isLayerAxisAlignedIntRect())
             drawQuad->setQuadVisibleRect(drawQuad->quadTransform().inverse().mapRect(transformedVisibleQuadRect));
 
         // When adding rect to opaque region, deflate it to stay conservative.
-        if (keepQuad && drawQuad->isLayerAxisAlignedIntRect()) {
+        if (drawQuad->isLayerAxisAlignedIntRect() && !drawQuad->opaqueRect().isEmpty()) {
             FloatRect floatOpaqueRect = drawQuad->quadTransform().mapRect(FloatRect(drawQuad->opaqueRect()));
             opaqueCoverageThusFar.unite(Region(enclosedIntRect(floatOpaqueRect)));
         }
 
-        if (keepQuad)
-            culledList.append(quadList[i].release());
+        culledList.append(quadList[i].release());
     }
     quadList.clear(); // Release anything that remains.