From d28605c9ac1b09790aacaed336863cad44c318d9 Mon Sep 17 00:00:00 2001 From: "commit-queue@webkit.org" Date: Fri, 24 Feb 2012 11:01:28 +0000 Subject: [PATCH] [chromium] Avoid culling work for fully-non-opaque tiles, and add tracing for draw culling https://bugs.webkit.org/show_bug.cgi?id=79183 Patch by Dana Jansens 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 | 16 ++++++++++++++++ .../graphics/chromium/cc/CCLayerTreeHostImpl.cpp | 2 ++ .../platform/graphics/chromium/cc/CCQuadCuller.cpp | 9 +++++---- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog index 5e6417e..61ecc24 100644 --- a/Source/WebCore/ChangeLog +++ b/Source/WebCore/ChangeLog @@ -1,3 +1,19 @@ +2012-02-24 Dana Jansens + + [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 Web Inspector: Scripts panel navigator overlay should be shown automatically only one time. diff --git a/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp b/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp index 4b3242d..d30c68c 100644 --- a/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp +++ b/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp @@ -229,6 +229,8 @@ void CCLayerTreeHostImpl::calculateRenderPasses(CCRenderPassList& passes, CCLaye void CCLayerTreeHostImpl::optimizeRenderPasses(CCRenderPassList& passes) { + TRACE_EVENT1("webkit", "CCLayerTreeHostImpl::optimizeRenderPasses", "passes.size()", static_cast(passes.size())); + bool haveDamageRect = layerRendererCapabilities().usingPartialSwap; for (unsigned i = 0; i < passes.size(); ++i) { diff --git a/Source/WebCore/platform/graphics/chromium/cc/CCQuadCuller.cpp b/Source/WebCore/platform/graphics/chromium/cc/CCQuadCuller.cpp index 212114f..4f6435d 100644 --- a/Source/WebCore/platform/graphics/chromium/cc/CCQuadCuller.cpp +++ b/Source/WebCore/platform/graphics/chromium/cc/CCQuadCuller.cpp @@ -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. -- 2.7.4