Log Message
[chromium] Move overdraw metrics into a templated class for both paint and draw metrics. https://bugs.webkit.org/show_bug.cgi?id=81156
Patch by Dana Jansens <[email protected]> on 2012-03-15 Reviewed by Adrienne Walker. Source/WebCore: Creates CCOverdrawMetrics which can be called to inform it about draws/paints. At the end of the frame, the CCOverdrawMetrics recordMetrics() method will put its data into histograms, a TRACE_COUNTER for culling information, and a TRACE_EVENT for details about the number of opaque/translucent pixels. Covered by existing tests. * WebCore.gypi: * platform/chromium/TraceEvent.h: (TraceEvent): (WebCore::TraceEvent::addTraceEvent): * platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp: (WebCore::CCLayerTreeHostImpl::calculateRenderPasses): * platform/graphics/chromium/cc/CCOverdrawMetrics.cpp: Added. (WebCore): (WebCore::CCOverdrawMetrics::CCOverdrawMetrics): (WebCore::wedgeProduct): (WebCore::quadArea): (WebCore::CCOverdrawMetrics::didDraw): (WebCore::CCOverdrawMetrics::recordMetrics): (WebCore::CCOverdrawMetrics::recordMetricsInternal): * platform/graphics/chromium/cc/CCOverdrawMetrics.h: Added. (WebCore): (CCOverdrawMetrics): (WebCore::CCOverdrawMetrics::pixelsDrawnOpaque): (WebCore::CCOverdrawMetrics::pixelsDrawnTranslucent): (WebCore::CCOverdrawMetrics::pixelsCulled): * platform/graphics/chromium/cc/CCQuadCuller.cpp: (WebCore::CCQuadCuller::CCQuadCuller): (WebCore::CCQuadCuller::append): * platform/graphics/chromium/cc/CCQuadCuller.h: (WebCore): (CCQuadCuller): * platform/graphics/chromium/cc/CCRenderPass.cpp: (WebCore::CCRenderPass::appendQuadsForLayer): * platform/graphics/chromium/cc/CCRenderPass.h: (WebCore): (CCRenderPass): Source/WebKit/chromium: * tests/CCQuadCullerTest.cpp: (WebCore::appendQuads): (WebCore): (WebCore::TEST):
Modified Paths
- trunk/Source/WebCore/ChangeLog
- trunk/Source/WebCore/WebCore.gypi
- trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp
- trunk/Source/WebCore/platform/graphics/chromium/cc/CCQuadCuller.cpp
- trunk/Source/WebCore/platform/graphics/chromium/cc/CCQuadCuller.h
- trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderPass.cpp
- trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderPass.h
- trunk/Source/WebKit/chromium/ChangeLog
- trunk/Source/WebKit/chromium/tests/CCQuadCullerTest.cpp
Added Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (110920 => 110921)
--- trunk/Source/WebCore/ChangeLog 2012-03-16 00:30:33 UTC (rev 110920)
+++ trunk/Source/WebCore/ChangeLog 2012-03-16 00:45:26 UTC (rev 110921)
@@ -1,3 +1,50 @@
+2012-03-15 Dana Jansens <[email protected]>
+
+ [chromium] Move overdraw metrics into a templated class for both paint and draw metrics.
+ https://bugs.webkit.org/show_bug.cgi?id=81156
+
+ Reviewed by Adrienne Walker.
+
+ Creates CCOverdrawMetrics which can be called to inform it about
+ draws/paints. At the end of the frame, the CCOverdrawMetrics
+ recordMetrics() method will put its data into histograms, a
+ TRACE_COUNTER for culling information, and a TRACE_EVENT for details
+ about the number of opaque/translucent pixels.
+
+ Covered by existing tests.
+
+ * WebCore.gypi:
+ * platform/chromium/TraceEvent.h:
+ (TraceEvent):
+ (WebCore::TraceEvent::addTraceEvent):
+ * platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:
+ (WebCore::CCLayerTreeHostImpl::calculateRenderPasses):
+ * platform/graphics/chromium/cc/CCOverdrawMetrics.cpp: Added.
+ (WebCore):
+ (WebCore::CCOverdrawMetrics::CCOverdrawMetrics):
+ (WebCore::wedgeProduct):
+ (WebCore::quadArea):
+ (WebCore::CCOverdrawMetrics::didDraw):
+ (WebCore::CCOverdrawMetrics::recordMetrics):
+ (WebCore::CCOverdrawMetrics::recordMetricsInternal):
+ * platform/graphics/chromium/cc/CCOverdrawMetrics.h: Added.
+ (WebCore):
+ (CCOverdrawMetrics):
+ (WebCore::CCOverdrawMetrics::pixelsDrawnOpaque):
+ (WebCore::CCOverdrawMetrics::pixelsDrawnTranslucent):
+ (WebCore::CCOverdrawMetrics::pixelsCulled):
+ * platform/graphics/chromium/cc/CCQuadCuller.cpp:
+ (WebCore::CCQuadCuller::CCQuadCuller):
+ (WebCore::CCQuadCuller::append):
+ * platform/graphics/chromium/cc/CCQuadCuller.h:
+ (WebCore):
+ (CCQuadCuller):
+ * platform/graphics/chromium/cc/CCRenderPass.cpp:
+ (WebCore::CCRenderPass::appendQuadsForLayer):
+ * platform/graphics/chromium/cc/CCRenderPass.h:
+ (WebCore):
+ (CCRenderPass):
+
2012-03-15 James Robinson <[email protected]>
[chromium] RateLimiter should hold a reference to its context
Modified: trunk/Source/WebCore/WebCore.gypi (110920 => 110921)
--- trunk/Source/WebCore/WebCore.gypi 2012-03-16 00:30:33 UTC (rev 110920)
+++ trunk/Source/WebCore/WebCore.gypi 2012-03-16 00:45:26 UTC (rev 110921)
@@ -3485,6 +3485,8 @@
'platform/graphics/chromium/cc/CCLayerTreeHostImpl.h',
'platform/graphics/chromium/cc/CCOcclusionTracker.cpp',
'platform/graphics/chromium/cc/CCOcclusionTracker.h',
+ 'platform/graphics/chromium/cc/CCOverdrawMetrics.cpp',
+ 'platform/graphics/chromium/cc/CCOverdrawMetrics.h',
'platform/graphics/chromium/cc/CCPageScaleAnimation.cpp',
'platform/graphics/chromium/cc/CCPageScaleAnimation.h',
'platform/graphics/chromium/cc/CCPluginDrawQuad.cpp',
Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp (110920 => 110921)
--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp 2012-03-16 00:30:33 UTC (rev 110920)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp 2012-03-16 00:45:26 UTC (rev 110921)
@@ -37,6 +37,7 @@
#include "cc/CCLayerIterator.h"
#include "cc/CCLayerTreeHost.h"
#include "cc/CCLayerTreeHostCommon.h"
+#include "cc/CCOverdrawMetrics.h"
#include "cc/CCPageScaleAnimation.h"
#include "cc/CCRenderSurfaceDrawQuad.h"
#include "cc/CCThreadTask.h"
@@ -271,7 +272,7 @@
}
// FIXME: compute overdraw metrics only occasionally, not every frame.
- CCOverdrawCounts overdrawCounts;
+ CCOverdrawMetrics overdrawMetrics;
IntRect scissorRect;
if (layerRendererCapabilities().usingPartialSwap)
@@ -306,14 +307,11 @@
}
it->willDraw(m_layerRenderer.get());
- pass->appendQuadsForLayer(*it, &occlusionTracker, &overdrawCounts);
+ pass->appendQuadsForLayer(*it, &occlusionTracker, &overdrawMetrics);
occlusionTracker.markOccludedBehindLayer(*it);
}
- float normalization = 1000.f / (m_layerRenderer->viewportWidth() * m_layerRenderer->viewportHeight());
- PlatformSupport::histogramCustomCounts("Renderer4.pixelOverdrawOpaque", static_cast<int>(normalization * overdrawCounts.m_pixelsDrawnOpaque), 100, 1000000, 50);
- PlatformSupport::histogramCustomCounts("Renderer4.pixelOverdrawTransparent", static_cast<int>(normalization * overdrawCounts.m_pixelsDrawnTransparent), 100, 1000000, 50);
- PlatformSupport::histogramCustomCounts("Renderer4.pixelOverdrawCulled", static_cast<int>(normalization * overdrawCounts.m_pixelsCulled), 100, 1000000, 50);
+ overdrawMetrics.recordMetrics(this);
}
void CCLayerTreeHostImpl::animateLayersRecursive(CCLayerImpl* current, double monotonicTime, double wallClockTime, CCAnimationEventsVector& events, bool& didAnimate, bool& needsAnimateLayers)
Added: trunk/Source/WebCore/platform/graphics/chromium/cc/CCOverdrawMetrics.cpp (0 => 110921)
--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCOverdrawMetrics.cpp (rev 0)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCOverdrawMetrics.cpp 2012-03-16 00:45:26 UTC (rev 110921)
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#if USE(ACCELERATED_COMPOSITING)
+
+#include "cc/CCOverdrawMetrics.h"
+
+#include "FloatQuad.h"
+#include "IntRect.h"
+#include "TraceEvent.h"
+#include "TransformationMatrix.h"
+#include "cc/CCLayerTreeHost.h"
+#include "cc/CCLayerTreeHostImpl.h"
+
+namespace WebCore {
+
+CCOverdrawMetrics::CCOverdrawMetrics()
+ : m_pixelsDrawnOpaque(0)
+ , m_pixelsDrawnTranslucent(0)
+ , m_pixelsCulled(0)
+{
+}
+
+static inline float wedgeProduct(const FloatPoint& p1, const FloatPoint& p2)
+{
+ return p1.x() * p2.y() - p1.y() * p2.x();
+}
+
+// Computes area of quads that are possibly non-rectangular. Can be easily extended to polygons.
+static inline float quadArea(const FloatQuad& quad)
+{
+ return fabs(0.5 * (wedgeProduct(quad.p1(), quad.p2()) +
+ wedgeProduct(quad.p2(), quad.p3()) +
+ wedgeProduct(quad.p3(), quad.p4()) +
+ wedgeProduct(quad.p4(), quad.p1())));
+}
+
+void CCOverdrawMetrics::didDraw(const TransformationMatrix& transformToTarget, const IntRect& beforeCullRect, const IntRect& afterCullRect, const IntRect& opaqueRect)
+{
+ float beforeCullArea = quadArea(transformToTarget.mapQuad(FloatQuad(beforeCullRect)));
+ float afterCullArea = quadArea(transformToTarget.mapQuad(FloatQuad(afterCullRect)));
+ float afterCullOpaqueArea = quadArea(transformToTarget.mapQuad(FloatQuad(intersection(opaqueRect, afterCullRect))));
+
+ m_pixelsDrawnOpaque += afterCullOpaqueArea;
+ m_pixelsDrawnTranslucent += afterCullArea - afterCullOpaqueArea;
+ m_pixelsCulled += beforeCullArea - afterCullArea;
+}
+
+void CCOverdrawMetrics::recordMetrics(const CCLayerTreeHost* layerTreeHost) const
+{
+ recordMetricsInternal<CCLayerTreeHost>(PAINTING, layerTreeHost);
+}
+
+void CCOverdrawMetrics::recordMetrics(const CCLayerTreeHostImpl* layerTreeHost) const
+{
+ recordMetricsInternal<CCLayerTreeHostImpl>(DRAWING, layerTreeHost);
+}
+
+template<typename LayerTreeHostType>
+void CCOverdrawMetrics::recordMetricsInternal(MetricsType metricsType, const LayerTreeHostType* layerTreeHost) const
+{
+ const char* histogramOpaqueName = 0;
+ const char* histogramTranslucentName = 0;
+ const char* histogramCulledName = 0;
+ const char* cullCounterName = 0;
+ const char* opaqueCounterName = 0;
+ const char* translucentCounterName = 0;
+ switch (metricsType) {
+ case DRAWING:
+ histogramOpaqueName = "Renderer4.drawPixelCountOpaque";
+ histogramTranslucentName = "Renderer4.drawPixelCountTranslucent";
+ histogramCulledName = "Renderer4.drawPixelCountCulled";
+ cullCounterName = "DrawPixelsCulled";
+ opaqueCounterName = "PixelsDrawnOpaque";
+ translucentCounterName = "PixelsDrawnTranslucent";
+ break;
+ case PAINTING:
+ histogramOpaqueName = "Renderer4.paintPixelCountOpaque";
+ histogramTranslucentName = "Renderer4.paintPixelCountTranslucent";
+ histogramCulledName = "Renderer4.paintPixelCountCulled";
+ cullCounterName = "PaintPixelsCulled";
+ opaqueCounterName = "PixelsPaintedOpaque";
+ translucentCounterName = "PixelsPaintedTranslucent";
+ break;
+ }
+ ASSERT(histogramOpaqueName);
+
+ float normalization = 1000.f / (layerTreeHost->viewportSize().width() * layerTreeHost->viewportSize().height());
+ PlatformSupport::histogramCustomCounts(histogramOpaqueName, static_cast<int>(normalization * m_pixelsDrawnOpaque), 100, 1000000, 50);
+ PlatformSupport::histogramCustomCounts(histogramTranslucentName, static_cast<int>(normalization * m_pixelsDrawnTranslucent), 100, 1000000, 50);
+ PlatformSupport::histogramCustomCounts(histogramCulledName, static_cast<int>(normalization * m_pixelsCulled), 100, 1000000, 50);
+
+ TRACE_COUNTER_ID1("webkit", cullCounterName, layerTreeHost, m_pixelsCulled);
+ TRACE_EVENT2("webkit", "CCOverdrawMetrics", opaqueCounterName, m_pixelsDrawnOpaque, translucentCounterName, m_pixelsDrawnTranslucent);
+}
+
+} // namespace WebCore
+
+#endif
Added: trunk/Source/WebCore/platform/graphics/chromium/cc/CCOverdrawMetrics.h (0 => 110921)
--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCOverdrawMetrics.h (rev 0)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCOverdrawMetrics.h 2012-03-16 00:45:26 UTC (rev 110921)
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2012 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef CCOverdrawMetrics_h
+#define CCOverdrawMetrics_h
+
+namespace WebCore {
+class IntRect;
+class TransformationMatrix;
+class CCLayerTreeHost;
+class CCLayerTreeHostImpl;
+
+class CCOverdrawMetrics {
+public:
+ CCOverdrawMetrics();
+
+ void didDraw(const TransformationMatrix& transformToTarget, const IntRect& beforeCullRect, const IntRect& afterCullRect, const IntRect& opaqueRect);
+
+ void recordMetrics(const CCLayerTreeHost*) const;
+ void recordMetrics(const CCLayerTreeHostImpl*) const;
+
+ // Accessors for tests.
+ float pixelsDrawnOpaque() const { return m_pixelsDrawnOpaque; }
+ float pixelsDrawnTranslucent() const { return m_pixelsDrawnTranslucent; }
+ float pixelsCulled() const { return m_pixelsCulled; }
+
+private:
+ enum MetricsType {
+ DRAWING,
+ PAINTING
+ };
+
+ template<typename LayerTreeHostType>
+ void recordMetricsInternal(MetricsType, const LayerTreeHostType*) const;
+
+ // Count of pixels that are opaque (and thus occlude). Ideally this is no more
+ // than wiewport width x height.
+ float m_pixelsDrawnOpaque;
+ // Count of pixels that are possibly translucent, and cannot occlude.
+ float m_pixelsDrawnTranslucent;
+ // Count of pixels not drawn as they are occluded by somthing opaque.
+ float m_pixelsCulled;
+};
+
+} // namespace WebCore
+
+#endif
Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCQuadCuller.cpp (110920 => 110921)
--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCQuadCuller.cpp 2012-03-16 00:30:33 UTC (rev 110920)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCQuadCuller.cpp 2012-03-16 00:45:26 UTC (rev 110921)
@@ -32,6 +32,7 @@
#include "Region.h"
#include "TransformationMatrix.h"
#include "cc/CCLayerImpl.h"
+#include "cc/CCOverdrawMetrics.h"
#include "cc/CCRenderPass.h"
#include "cc/CCRenderSurfaceDrawQuad.h"
@@ -39,29 +40,14 @@
namespace WebCore {
-CCQuadCuller::CCQuadCuller(CCQuadList& quadList, CCLayerImpl* layer, CCOcclusionTrackerImpl* occlusionTracker, CCOverdrawCounts* overdrawCounts)
+CCQuadCuller::CCQuadCuller(CCQuadList& quadList, CCLayerImpl* layer, CCOcclusionTrackerImpl* occlusionTracker, CCOverdrawMetrics* overdrawMetrics)
: m_quadList(quadList)
, m_layer(layer)
, m_occlusionTracker(occlusionTracker)
- , m_overdrawCounts(overdrawCounts)
+ , m_overdrawMetrics(overdrawMetrics)
{
}
-static float wedgeProduct(const FloatPoint& p1, const FloatPoint& p2)
-{
- return p1.x() * p2.y() - p1.y() * p2.x();
-}
-
-// Computes area of quads that are possibly non-rectangular. Can
-// be easily extended to polygons.
-static float quadArea(const FloatQuad& quad)
-{
- return fabs(0.5 * (wedgeProduct(quad.p1(), quad.p2()) +
- wedgeProduct(quad.p2(), quad.p3()) +
- wedgeProduct(quad.p3(), quad.p4()) +
- wedgeProduct(quad.p4(), quad.p1())));
-}
-
void CCQuadCuller::append(PassOwnPtr<CCDrawQuad> passDrawQuad)
{
OwnPtr<CCDrawQuad> drawQuad(passDrawQuad);
@@ -70,30 +56,10 @@
if (keepQuad)
drawQuad->setQuadVisibleRect(culledRect);
- // FIXME: Make a templated metrics class and move the logic out to there.
- // Temporary code anyways, indented to make the diff clear.
- {
- if (m_overdrawCounts) {
- // We compute the area of the transformed quad, as this should be in pixels.
- float area = quadArea(drawQuad->quadTransform().mapQuad(FloatQuad(drawQuad->quadRect())));
- if (keepQuad) {
- bool didReduceQuadSize = culledRect != drawQuad->quadRect();
- if (didReduceQuadSize) {
- float visibleQuadRectArea = quadArea(drawQuad->quadTransform().mapQuad(FloatQuad(drawQuad->quadVisibleRect())));
- m_overdrawCounts->m_pixelsCulled += area - visibleQuadRectArea;
- area = visibleQuadRectArea;
- }
- IntRect visibleOpaqueRect(drawQuad->quadVisibleRect());
- visibleOpaqueRect.intersect(drawQuad->opaqueRect());
- FloatQuad visibleOpaqueQuad = drawQuad->quadTransform().mapQuad(FloatQuad(visibleOpaqueRect));
- float opaqueArea = quadArea(visibleOpaqueQuad);
- m_overdrawCounts->m_pixelsDrawnOpaque += opaqueArea;
- m_overdrawCounts->m_pixelsDrawnTransparent += area - opaqueArea;
- } else
- m_overdrawCounts->m_pixelsCulled += area;
- }
- }
+ if (m_overdrawMetrics)
+ m_overdrawMetrics->didDraw(drawQuad->quadTransform(), drawQuad->quadRect(), culledRect, drawQuad->opaqueRect());
+ // Release the quad after we're done using it.
if (keepQuad)
m_quadList.append(drawQuad.release());
}
Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCQuadCuller.h (110920 => 110921)
--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCQuadCuller.h 2012-03-16 00:30:33 UTC (rev 110920)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCQuadCuller.h 2012-03-16 00:45:26 UTC (rev 110921)
@@ -30,12 +30,13 @@
namespace WebCore {
class CCLayerImpl;
+class CCOverdrawMetrics;
class CCQuadCuller {
public:
// Passing 0 for CCOverdrawCounts* is valid, and disable the extra computation
// done to estimate over draw statistics.
- CCQuadCuller(CCQuadList&, CCLayerImpl*, CCOcclusionTrackerImpl*, CCOverdrawCounts*);
+ CCQuadCuller(CCQuadList&, CCLayerImpl*, CCOcclusionTrackerImpl*, CCOverdrawMetrics*);
virtual void append(PassOwnPtr<CCDrawQuad> passDrawQuad);
@@ -43,7 +44,7 @@
CCQuadList& m_quadList;
CCLayerImpl* m_layer;
CCOcclusionTrackerImpl* m_occlusionTracker;
- CCOverdrawCounts* m_overdrawCounts;
+ CCOverdrawMetrics* m_overdrawMetrics;
};
}
Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderPass.cpp (110920 => 110921)
--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderPass.cpp 2012-03-16 00:30:33 UTC (rev 110920)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderPass.cpp 2012-03-16 00:45:26 UTC (rev 110921)
@@ -46,9 +46,9 @@
ASSERT(m_targetSurface);
}
-void CCRenderPass::appendQuadsForLayer(CCLayerImpl* layer, CCOcclusionTrackerImpl* occlusionTracker, CCOverdrawCounts* overdrawCounts)
+void CCRenderPass::appendQuadsForLayer(CCLayerImpl* layer, CCOcclusionTrackerImpl* occlusionTracker, CCOverdrawMetrics* overdrawMetrics)
{
- CCQuadCuller quadCuller(m_quadList, layer, occlusionTracker, overdrawCounts);
+ CCQuadCuller quadCuller(m_quadList, layer, occlusionTracker, overdrawMetrics);
OwnPtr<CCSharedQuadState> sharedQuadState = layer->createSharedQuadState();
layer->appendQuads(quadCuller, sharedQuadState.get());
Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderPass.h (110920 => 110921)
--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderPass.h 2012-03-16 00:30:33 UTC (rev 110920)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderPass.h 2012-03-16 00:45:26 UTC (rev 110921)
@@ -34,6 +34,7 @@
namespace WebCore {
class CCLayerImpl;
+class CCOverdrawMetrics;
class CCRenderSurface;
class CCSharedQuadState;
@@ -49,28 +50,12 @@
inline constBackToFrontIterator backToFrontEnd() const { return rend(); }
};
-struct CCOverdrawCounts {
- CCOverdrawCounts()
- : m_pixelsDrawnOpaque(0)
- , m_pixelsDrawnTransparent(0)
- , m_pixelsCulled(0)
- {
- }
- // Count of pixels that are opaque (and thus occlude). Ideally this is no more
- // than wiewport width x height.
- float m_pixelsDrawnOpaque;
- // Count of pixels that are possibly transparent, and cannot occlude.
- float m_pixelsDrawnTransparent;
- // Count of pixels not drawn as they are occluded by somthing opaque.
- float m_pixelsCulled;
-};
-
class CCRenderPass {
WTF_MAKE_NONCOPYABLE(CCRenderPass);
public:
static PassOwnPtr<CCRenderPass> create(CCRenderSurface*);
- void appendQuadsForLayer(CCLayerImpl*, CCOcclusionTrackerImpl*, CCOverdrawCounts*);
+ void appendQuadsForLayer(CCLayerImpl*, CCOcclusionTrackerImpl*, CCOverdrawMetrics*);
void appendQuadsForRenderSurfaceLayer(CCLayerImpl*);
const CCQuadList& quadList() const { return m_quadList; }
Modified: trunk/Source/WebKit/chromium/ChangeLog (110920 => 110921)
--- trunk/Source/WebKit/chromium/ChangeLog 2012-03-16 00:30:33 UTC (rev 110920)
+++ trunk/Source/WebKit/chromium/ChangeLog 2012-03-16 00:45:26 UTC (rev 110921)
@@ -1,3 +1,15 @@
+2012-03-15 Dana Jansens <[email protected]>
+
+ [chromium] Move overdraw metrics into a templated class for both paint and draw metrics.
+ https://bugs.webkit.org/show_bug.cgi?id=81156
+
+ Reviewed by Adrienne Walker.
+
+ * tests/CCQuadCullerTest.cpp:
+ (WebCore::appendQuads):
+ (WebCore):
+ (WebCore::TEST):
+
2012-03-07 Jon Lee <[email protected]>
Move NotificationContents into Notification
Modified: trunk/Source/WebKit/chromium/tests/CCQuadCullerTest.cpp (110920 => 110921)
--- trunk/Source/WebKit/chromium/tests/CCQuadCullerTest.cpp 2012-03-16 00:30:33 UTC (rev 110920)
+++ trunk/Source/WebKit/chromium/tests/CCQuadCullerTest.cpp 2012-03-16 00:45:26 UTC (rev 110921)
@@ -27,6 +27,7 @@
#include "cc/CCQuadCuller.h"
#include "cc/CCOcclusionTracker.h"
+#include "cc/CCOverdrawMetrics.h"
#include "cc/CCSingleThreadProxy.h"
#include "cc/CCTiledLayerImpl.h"
#include "cc/CCTileDrawQuad.h"
@@ -77,7 +78,7 @@
return layer.release();
}
-static void appendQuads(CCQuadList& quadList, CCTiledLayerImpl* layer, CCOcclusionTrackerImpl& occlusionTracker, CCOverdrawCounts& overdraw)
+static void appendQuads(CCQuadList& quadList, CCTiledLayerImpl* layer, CCOcclusionTrackerImpl& occlusionTracker, CCOverdrawMetrics& overdraw)
{
CCQuadCuller quadCuller(quadList, layer, &occlusionTracker, &overdraw);
OwnPtr<CCSharedQuadState> sharedQuadState = layer->createSharedQuadState();
@@ -87,7 +88,7 @@
#define DECLARE_AND_INITIALIZE_TEST_QUADS \
DebugScopedSetImplThread impl; \
CCQuadList quadList; \
- CCOverdrawCounts overdraw; \
+ CCOverdrawMetrics overdraw; \
TransformationMatrix childTransform; \
IntSize rootSize = IntSize(300, 300); \
IntRect rootRect = IntRect(IntPoint(), rootSize); \
@@ -105,9 +106,9 @@
appendQuads(quadList, childLayer.get(), occlusionTracker, overdraw);
appendQuads(quadList, rootLayer.get(), occlusionTracker, overdraw);
EXPECT_EQ(quadList.size(), 13u);
- EXPECT_NEAR(overdraw.m_pixelsDrawnOpaque, 130000, 1);
- EXPECT_NEAR(overdraw.m_pixelsDrawnTransparent, 0, 1);
- EXPECT_NEAR(overdraw.m_pixelsCulled, 0, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnOpaque(), 130000, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnTranslucent(), 0, 1);
+ EXPECT_NEAR(overdraw.pixelsCulled(), 0, 1);
}
TEST(CCQuadCullerTest, verifyCullChildLinesUpTopLeft)
@@ -122,9 +123,9 @@
occlusionTracker.markOccludedBehindLayer(childLayer.get());
appendQuads(quadList, rootLayer.get(), occlusionTracker, overdraw);
EXPECT_EQ(quadList.size(), 9u);
- EXPECT_NEAR(overdraw.m_pixelsDrawnOpaque, 90000, 1);
- EXPECT_NEAR(overdraw.m_pixelsDrawnTransparent, 0, 1);
- EXPECT_NEAR(overdraw.m_pixelsCulled, 40000, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnOpaque(), 90000, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnTranslucent(), 0, 1);
+ EXPECT_NEAR(overdraw.pixelsCulled(), 40000, 1);
}
TEST(CCQuadCullerTest, verifyCullWhenChildOpacityNotOne)
@@ -139,9 +140,9 @@
occlusionTracker.markOccludedBehindLayer(childLayer.get());
appendQuads(quadList, rootLayer.get(), occlusionTracker, overdraw);
EXPECT_EQ(quadList.size(), 13u);
- EXPECT_NEAR(overdraw.m_pixelsDrawnOpaque, 90000, 1);
- EXPECT_NEAR(overdraw.m_pixelsDrawnTransparent, 40000, 1);
- EXPECT_NEAR(overdraw.m_pixelsCulled, 0, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnOpaque(), 90000, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnTranslucent(), 40000, 1);
+ EXPECT_NEAR(overdraw.pixelsCulled(), 0, 1);
}
TEST(CCQuadCullerTest, verifyCullWhenChildOpaqueFlagFalse)
@@ -156,9 +157,9 @@
occlusionTracker.markOccludedBehindLayer(childLayer.get());
appendQuads(quadList, rootLayer.get(), occlusionTracker, overdraw);
EXPECT_EQ(quadList.size(), 13u);
- EXPECT_NEAR(overdraw.m_pixelsDrawnOpaque, 90000, 1);
- EXPECT_NEAR(overdraw.m_pixelsDrawnTransparent, 40000, 1);
- EXPECT_NEAR(overdraw.m_pixelsCulled, 0, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnOpaque(), 90000, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnTranslucent(), 40000, 1);
+ EXPECT_NEAR(overdraw.pixelsCulled(), 0, 1);
}
TEST(CCQuadCullerTest, verifyCullCenterTileOnly)
@@ -191,9 +192,9 @@
EXPECT_EQ(quadVisibleRect6.height(), 50);
EXPECT_EQ(quadVisibleRect6.y(), 250);
- EXPECT_NEAR(overdraw.m_pixelsDrawnOpaque, 100000, 1);
- EXPECT_NEAR(overdraw.m_pixelsDrawnTransparent, 0, 1);
- EXPECT_NEAR(overdraw.m_pixelsCulled, 30000, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnOpaque(), 100000, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnTranslucent(), 0, 1);
+ EXPECT_NEAR(overdraw.pixelsCulled(), 30000, 1);
}
TEST(CCQuadCullerTest, verifyCullCenterTileNonIntegralSize1)
@@ -219,9 +220,9 @@
appendQuads(quadList, rootLayer.get(), occlusionTracker, overdraw);
EXPECT_EQ(quadList.size(), 2u);
- EXPECT_NEAR(overdraw.m_pixelsDrawnOpaque, 20363, 1);
- EXPECT_NEAR(overdraw.m_pixelsDrawnTransparent, 0, 1);
- EXPECT_NEAR(overdraw.m_pixelsCulled, 0, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnOpaque(), 20363, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnTranslucent(), 0, 1);
+ EXPECT_NEAR(overdraw.pixelsCulled(), 0, 1);
}
TEST(CCQuadCullerTest, verifyCullCenterTileNonIntegralSize2)
@@ -247,9 +248,9 @@
appendQuads(quadList, rootLayer.get(), occlusionTracker, overdraw);
EXPECT_EQ(quadList.size(), 2u);
- EXPECT_NEAR(overdraw.m_pixelsDrawnOpaque, 19643, 1);
- EXPECT_NEAR(overdraw.m_pixelsDrawnTransparent, 0, 1);
- EXPECT_NEAR(overdraw.m_pixelsCulled, 0, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnOpaque(), 19643, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnTranslucent(), 0, 1);
+ EXPECT_NEAR(overdraw.pixelsCulled(), 0, 1);
}
TEST(CCQuadCullerTest, verifyCullChildLinesUpBottomRight)
@@ -266,9 +267,9 @@
occlusionTracker.markOccludedBehindLayer(childLayer.get());
appendQuads(quadList, rootLayer.get(), occlusionTracker, overdraw);
EXPECT_EQ(quadList.size(), 9u);
- EXPECT_NEAR(overdraw.m_pixelsDrawnOpaque, 90000, 1);
- EXPECT_NEAR(overdraw.m_pixelsDrawnTransparent, 0, 1);
- EXPECT_NEAR(overdraw.m_pixelsCulled, 40000, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnOpaque(), 90000, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnTranslucent(), 0, 1);
+ EXPECT_NEAR(overdraw.pixelsCulled(), 40000, 1);
}
TEST(CCQuadCullerTest, verifyCullSubRegion)
@@ -286,9 +287,9 @@
occlusionTracker.markOccludedBehindLayer(childLayer.get());
appendQuads(quadList, rootLayer.get(), occlusionTracker, overdraw);
EXPECT_EQ(quadList.size(), 12u);
- EXPECT_NEAR(overdraw.m_pixelsDrawnOpaque, 90000, 1);
- EXPECT_NEAR(overdraw.m_pixelsDrawnTransparent, 30000, 1);
- EXPECT_NEAR(overdraw.m_pixelsCulled, 10000, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnOpaque(), 90000, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnTranslucent(), 30000, 1);
+ EXPECT_NEAR(overdraw.pixelsCulled(), 10000, 1);
}
TEST(CCQuadCullerTest, verifyCullSubRegion2)
@@ -306,9 +307,9 @@
occlusionTracker.markOccludedBehindLayer(childLayer.get());
appendQuads(quadList, rootLayer.get(), occlusionTracker, overdraw);
EXPECT_EQ(quadList.size(), 12u);
- EXPECT_NEAR(overdraw.m_pixelsDrawnOpaque, 90000, 1);
- EXPECT_NEAR(overdraw.m_pixelsDrawnTransparent, 25000, 1);
- EXPECT_NEAR(overdraw.m_pixelsCulled, 15000, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnOpaque(), 90000, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnTranslucent(), 25000, 1);
+ EXPECT_NEAR(overdraw.pixelsCulled(), 15000, 1);
}
TEST(CCQuadCullerTest, verifyCullSubRegionCheckOvercull)
@@ -326,9 +327,9 @@
occlusionTracker.markOccludedBehindLayer(childLayer.get());
appendQuads(quadList, rootLayer.get(), occlusionTracker, overdraw);
EXPECT_EQ(quadList.size(), 13u);
- EXPECT_NEAR(overdraw.m_pixelsDrawnOpaque, 90000, 1);
- EXPECT_NEAR(overdraw.m_pixelsDrawnTransparent, 30000, 1);
- EXPECT_NEAR(overdraw.m_pixelsCulled, 10000, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnOpaque(), 90000, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnTranslucent(), 30000, 1);
+ EXPECT_NEAR(overdraw.pixelsCulled(), 10000, 1);
}
TEST(CCQuadCullerTest, verifyNonAxisAlignedQuadsDontOcclude)
@@ -346,9 +347,9 @@
occlusionTracker.markOccludedBehindLayer(childLayer.get());
appendQuads(quadList, rootLayer.get(), occlusionTracker, overdraw);
EXPECT_EQ(quadList.size(), 13u);
- EXPECT_NEAR(overdraw.m_pixelsDrawnOpaque, 130000, 1);
- EXPECT_NEAR(overdraw.m_pixelsDrawnTransparent, 0, 1);
- EXPECT_NEAR(overdraw.m_pixelsCulled, 0, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnOpaque(), 130000, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnTranslucent(), 0, 1);
+ EXPECT_NEAR(overdraw.pixelsCulled(), 0, 1);
}
// This test requires some explanation: here we are rotating the quads to be culled.
@@ -372,9 +373,9 @@
occlusionTracker.markOccludedBehindLayer(childLayer.get());
appendQuads(quadList, rootLayer.get(), occlusionTracker, overdraw);
EXPECT_EQ(quadList.size(), 12u);
- EXPECT_NEAR(overdraw.m_pixelsDrawnOpaque, 100600, 1);
- EXPECT_NEAR(overdraw.m_pixelsDrawnTransparent, 0, 1);
- EXPECT_NEAR(overdraw.m_pixelsCulled, 29400, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnOpaque(), 100600, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnTranslucent(), 0, 1);
+ EXPECT_NEAR(overdraw.pixelsCulled(), 29400, 1);
}
TEST(CCQuadCullerTest, verifyCullOutsideScissorOverTile)
@@ -389,9 +390,9 @@
occlusionTracker.markOccludedBehindLayer(childLayer.get());
appendQuads(quadList, rootLayer.get(), occlusionTracker, overdraw);
EXPECT_EQ(quadList.size(), 1u);
- EXPECT_NEAR(overdraw.m_pixelsDrawnOpaque, 10000, 1);
- EXPECT_NEAR(overdraw.m_pixelsDrawnTransparent, 0, 1);
- EXPECT_NEAR(overdraw.m_pixelsCulled, 120000, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnOpaque(), 10000, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnTranslucent(), 0, 1);
+ EXPECT_NEAR(overdraw.pixelsCulled(), 120000, 1);
}
TEST(CCQuadCullerTest, verifyCullOutsideScissorOverCulledTile)
@@ -406,9 +407,9 @@
occlusionTracker.markOccludedBehindLayer(childLayer.get());
appendQuads(quadList, rootLayer.get(), occlusionTracker, overdraw);
EXPECT_EQ(quadList.size(), 1u);
- EXPECT_NEAR(overdraw.m_pixelsDrawnOpaque, 10000, 1);
- EXPECT_NEAR(overdraw.m_pixelsDrawnTransparent, 0, 1);
- EXPECT_NEAR(overdraw.m_pixelsCulled, 120000, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnOpaque(), 10000, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnTranslucent(), 0, 1);
+ EXPECT_NEAR(overdraw.pixelsCulled(), 120000, 1);
}
TEST(CCQuadCullerTest, verifyCullOutsideScissorOverPartialTiles)
@@ -423,9 +424,9 @@
occlusionTracker.markOccludedBehindLayer(childLayer.get());
appendQuads(quadList, rootLayer.get(), occlusionTracker, overdraw);
EXPECT_EQ(quadList.size(), 9u);
- EXPECT_NEAR(overdraw.m_pixelsDrawnOpaque, 40000, 1);
- EXPECT_NEAR(overdraw.m_pixelsDrawnTransparent, 0, 1);
- EXPECT_NEAR(overdraw.m_pixelsCulled, 90000, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnOpaque(), 40000, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnTranslucent(), 0, 1);
+ EXPECT_NEAR(overdraw.pixelsCulled(), 90000, 1);
}
TEST(CCQuadCullerTest, verifyCullOutsideScissorOverNoTiles)
@@ -440,9 +441,9 @@
occlusionTracker.markOccludedBehindLayer(childLayer.get());
appendQuads(quadList, rootLayer.get(), occlusionTracker, overdraw);
EXPECT_EQ(quadList.size(), 0u);
- EXPECT_NEAR(overdraw.m_pixelsDrawnOpaque, 0, 1);
- EXPECT_NEAR(overdraw.m_pixelsDrawnTransparent, 0, 1);
- EXPECT_NEAR(overdraw.m_pixelsCulled, 130000, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnOpaque(), 0, 1);
+ EXPECT_NEAR(overdraw.pixelsDrawnTranslucent(), 0, 1);
+ EXPECT_NEAR(overdraw.pixelsCulled(), 130000, 1);
}
} // namespace
_______________________________________________ webkit-changes mailing list [email protected] http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes
