Title: [110921] trunk/Source
Revision
110921
Author
[email protected]
Date
2012-03-15 17:45:26 -0700 (Thu, 15 Mar 2012)

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

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

Reply via email to