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
+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.
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) {
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.