Title: [109304] trunk/Source
Revision
109304
Author
wjmacl...@chromium.org
Date
2012-02-29 20:33:03 -0800 (Wed, 29 Feb 2012)

Log Message

[chromium] Estimate pixel count for frame rate control
https://bugs.webkit.org/show_bug.cgi?id=74982

Reviewed by James Robinson.

Source/WebCore:

Value checks added to unit tests.

Adds mechanism to compute and collect statistics on pixel overdraw for selected frames.

* platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:
(WebCore::CCLayerTreeHostImpl::optimizeRenderPasses):
* platform/graphics/chromium/cc/CCQuadCuller.cpp:
(WebCore::wedgeProduct):
(WebCore):
(WebCore::quadArea):
(WebCore::CCQuadCuller::cullOccludedQuads):
* platform/graphics/chromium/cc/CCQuadCuller.h:
(CCQuadCuller):
* platform/graphics/chromium/cc/CCRenderPass.cpp:
(WebCore::CCRenderPass::optimizeQuads):
* platform/graphics/chromium/cc/CCRenderPass.h:
(CCOverdrawCounts):
(WebCore):
(CCRenderPass):

Source/WebKit/chromium:

Adds mechanism to compute and collect statistics on pixel overdraw for selected frames.

* tests/CCQuadCullerTest.cpp:
(WebCore):
(WebCore::TEST):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (109303 => 109304)


--- trunk/Source/WebCore/ChangeLog	2012-03-01 04:26:39 UTC (rev 109303)
+++ trunk/Source/WebCore/ChangeLog	2012-03-01 04:33:03 UTC (rev 109304)
@@ -1,3 +1,30 @@
+2012-02-29  W. James MacLean  <wjmacl...@chromium.org>
+
+        [chromium] Estimate pixel count for frame rate control
+        https://bugs.webkit.org/show_bug.cgi?id=74982
+
+        Reviewed by James Robinson.
+
+        Value checks added to unit tests.
+
+        Adds mechanism to compute and collect statistics on pixel overdraw for selected frames.
+
+        * platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:
+        (WebCore::CCLayerTreeHostImpl::optimizeRenderPasses):
+        * platform/graphics/chromium/cc/CCQuadCuller.cpp:
+        (WebCore::wedgeProduct):
+        (WebCore):
+        (WebCore::quadArea):
+        (WebCore::CCQuadCuller::cullOccludedQuads):
+        * platform/graphics/chromium/cc/CCQuadCuller.h:
+        (CCQuadCuller):
+        * platform/graphics/chromium/cc/CCRenderPass.cpp:
+        (WebCore::CCRenderPass::optimizeQuads):
+        * platform/graphics/chromium/cc/CCRenderPass.h:
+        (CCOverdrawCounts):
+        (WebCore):
+        (CCRenderPass):
+
 2012-02-29  Jason Liu  <jason....@torchmobile.com.cn>
 
         [BlackBerry]Make about:cache feature available in release version.

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp (109303 => 109304)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp	2012-03-01 04:26:39 UTC (rev 109303)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp	2012-03-01 04:33:03 UTC (rev 109304)
@@ -234,10 +234,17 @@
 
     bool haveDamageRect = layerRendererCapabilities().usingPartialSwap;
 
+    // FIXME: compute overdraw metrics only occasionally, not every frame.
+    CCOverdrawCounts overdrawCounts;
     for (unsigned i = 0; i < passes.size(); ++i) {
         FloatRect damageRect = passes[i]->targetSurface()->damageTracker()->currentDamageRect();
-        passes[i]->optimizeQuads(haveDamageRect, damageRect);
+        passes[i]->optimizeQuads(haveDamageRect, damageRect, &overdrawCounts);
     }
+
+    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);
 }
 
 void CCLayerTreeHostImpl::animateLayersRecursive(CCLayerImpl* current, double frameBeginTimeSecs, CCAnimationEventsVector& events, bool& didAnimate, bool& needsAnimateLayers)

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCQuadCuller.cpp (109303 => 109304)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCQuadCuller.cpp	2012-03-01 04:26:39 UTC (rev 109303)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCQuadCuller.cpp	2012-03-01 04:33:03 UTC (rev 109304)
@@ -75,8 +75,23 @@
     return rect;
 }
 
-void CCQuadCuller::cullOccludedQuads(CCQuadList& quadList, bool haveDamageRect, const FloatRect& damageRect)
+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::cullOccludedQuads(CCQuadList& quadList, bool haveDamageRect, const FloatRect& damageRect, CCOverdrawCounts* overdrawMetrics)
+{
     if (!quadList.size())
         return;
 
@@ -96,21 +111,44 @@
 
         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 (transformedVisibleQuadRect != transformedQuadRect && drawQuad->isLayerAxisAlignedIntRect())
-            drawQuad->setQuadVisibleRect(drawQuad->quadTransform().inverse().mapRect(transformedVisibleQuadRect));
+        bool didReduceQuadSize = false;
+        if (keepQuad) {
+            if (transformedVisibleQuadRect != transformedQuadRect && drawQuad->isLayerAxisAlignedIntRect()) {
+                drawQuad->setQuadVisibleRect(drawQuad->quadTransform().inverse().mapRect(transformedVisibleQuadRect));
+                didReduceQuadSize = true;
+            }
 
-        // When adding rect to opaque region, deflate it to stay conservative.
-        if (drawQuad->isLayerAxisAlignedIntRect() && !drawQuad->opaqueRect().isEmpty()) {
-            FloatRect floatOpaqueRect = drawQuad->quadTransform().mapRect(FloatRect(drawQuad->opaqueRect()));
-            opaqueCoverageThusFar.unite(Region(enclosedIntRect(floatOpaqueRect)));
+            // When adding rect to opaque region, deflate it to stay conservative.
+            if (drawQuad->isLayerAxisAlignedIntRect() && !drawQuad->opaqueRect().isEmpty()) {
+                FloatRect floatOpaqueRect = drawQuad->quadTransform().mapRect(FloatRect(drawQuad->opaqueRect()));
+                opaqueCoverageThusFar.unite(Region(enclosedIntRect(floatOpaqueRect)));
+            }
+
+            culledList.append(quadList[i].release());
         }
 
-        culledList.append(quadList[i].release());
+        if (overdrawMetrics) {
+            TRACE_EVENT("CCQuadCuller::cullOccludedQuads_OverdrawMetrics", 0, 0);
+            // 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) {
+                if (didReduceQuadSize) {
+                    float visibleQuadRectArea = quadArea(drawQuad->quadTransform().mapQuad(FloatQuad(drawQuad->quadVisibleRect())));
+                    overdrawMetrics->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);
+                overdrawMetrics->m_pixelsDrawnOpaque += opaqueArea;
+                overdrawMetrics->m_pixelsDrawnTransparent += area - opaqueArea;
+            } else
+                overdrawMetrics->m_pixelsCulled += area;
+        }
     }
     quadList.clear(); // Release anything that remains.
 

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCQuadCuller.h (109303 => 109304)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCQuadCuller.h	2012-03-01 04:26:39 UTC (rev 109303)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCQuadCuller.h	2012-03-01 04:33:03 UTC (rev 109304)
@@ -32,7 +32,9 @@
 
 class CCQuadCuller {
 public:
-    static void cullOccludedQuads(CCQuadList&, bool haveDamageRect, const FloatRect& damageRect);
+    // Passing 0 for CCOverdrawCounts* is valid, and disable the extra computation
+    // done to estimate over draw statistics.
+    static void cullOccludedQuads(CCQuadList&, bool haveDamageRect, const FloatRect& damageRect, CCOverdrawCounts*);
 
 private:
     // Make non-instantiable.

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderPass.cpp (109303 => 109304)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderPass.cpp	2012-03-01 04:26:39 UTC (rev 109303)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderPass.cpp	2012-03-01 04:33:03 UTC (rev 109304)
@@ -65,9 +65,9 @@
     m_sharedQuadStateList.append(sharedQuadState.release());
 }
 
-void CCRenderPass::optimizeQuads(bool haveDamageRect, const FloatRect& damageRect)
+void CCRenderPass::optimizeQuads(bool haveDamageRect, const FloatRect& damageRect, CCOverdrawCounts* overdraw)
 {
-    CCQuadCuller::cullOccludedQuads(m_quadList, haveDamageRect, damageRect);
+    CCQuadCuller::cullOccludedQuads(m_quadList, haveDamageRect, damageRect, overdraw);
 }
 
 }

Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderPass.h (109303 => 109304)


--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderPass.h	2012-03-01 04:26:39 UTC (rev 109303)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCRenderPass.h	2012-03-01 04:33:03 UTC (rev 109304)
@@ -38,6 +38,16 @@
 
 typedef Vector<OwnPtr<CCDrawQuad> > CCQuadList;
 
+struct CCOverdrawCounts {
+    // 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:
@@ -46,7 +56,8 @@
     void appendQuadsForLayer(CCLayerImpl*);
     void appendQuadsForRenderSurfaceLayer(CCLayerImpl*);
 
-    void optimizeQuads(bool haveDamageRect, const FloatRect& damageRect);
+    // Passing in 0 for CCOverdrawCounts is valid, and disables performing overdraw calculations.
+    void optimizeQuads(bool haveDamageRect, const FloatRect& damageRect, CCOverdrawCounts*);
 
     const CCQuadList& quadList() const { return m_quadList; }
     CCRenderSurface* targetSurface() const { return m_targetSurface; }

Modified: trunk/Source/WebKit/chromium/ChangeLog (109303 => 109304)


--- trunk/Source/WebKit/chromium/ChangeLog	2012-03-01 04:26:39 UTC (rev 109303)
+++ trunk/Source/WebKit/chromium/ChangeLog	2012-03-01 04:33:03 UTC (rev 109304)
@@ -1,3 +1,16 @@
+2012-02-29  W. James MacLean  <wjmacl...@chromium.org>
+
+        [chromium] Estimate pixel count for frame rate control
+        https://bugs.webkit.org/show_bug.cgi?id=74982
+
+        Reviewed by James Robinson.
+
+        Adds mechanism to compute and collect statistics on pixel overdraw for selected frames.
+
+        * tests/CCQuadCullerTest.cpp:
+        (WebCore):
+        (WebCore::TEST):
+
 2012-02-29  James Simonsen  <simon...@chromium.org>
 
         [chromium] Fix navigation start time on cross-renderer navigation

Modified: trunk/Source/WebKit/chromium/tests/CCQuadCullerTest.cpp (109303 => 109304)


--- trunk/Source/WebKit/chromium/tests/CCQuadCullerTest.cpp	2012-03-01 04:26:39 UTC (rev 109303)
+++ trunk/Source/WebKit/chromium/tests/CCQuadCullerTest.cpp	2012-03-01 04:33:03 UTC (rev 109304)
@@ -64,6 +64,7 @@
 
 #define DECLARE_AND_INITIALIZE_TEST_QUADS               \
     CCQuadList quadList;                                \
+    CCOverdrawCounts overdraw = {0, 0, 0};              \
     TransformationMatrix childTransform;                \
     IntSize rootSize = IntSize(300, 300);               \
     IntRect rootRect = IntRect(IntPoint(), rootSize);   \
@@ -79,8 +80,11 @@
 
     setQuads(rootState.get(), childState.get(), quadList);
     EXPECT_EQ(quadList.size(), 13u);
-    CCQuadCuller::cullOccludedQuads(quadList, false, IntRect());
+    CCQuadCuller::cullOccludedQuads(quadList, false, IntRect(), &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);
 }
 
 TEST(CCQuadCullerTest, verifyCullWhenChildOpacityNotOne)
@@ -92,8 +96,11 @@
 
     setQuads(rootState.get(), childState.get(), quadList);
     EXPECT_EQ(quadList.size(), 13u);
-    CCQuadCuller::cullOccludedQuads(quadList, false, IntRect());
+    CCQuadCuller::cullOccludedQuads(quadList, false, IntRect(), &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);
 }
 
 TEST(CCQuadCullerTest, verifyCullWhenChildOpaqueFlagFalse)
@@ -105,8 +112,11 @@
 
     setQuads(rootState.get(), childState.get(), quadList);
     EXPECT_EQ(quadList.size(), 13u);
-    CCQuadCuller::cullOccludedQuads(quadList, false, IntRect());
+    CCQuadCuller::cullOccludedQuads(quadList, false, IntRect(), &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);
 }
 
 TEST(CCQuadCullerTest, verifyCullCenterTileOnly)
@@ -120,7 +130,7 @@
 
     setQuads(rootState.get(), childState.get(), quadList);
     EXPECT_EQ(quadList.size(), 13u);
-    CCQuadCuller::cullOccludedQuads(quadList, false, IntRect());
+    CCQuadCuller::cullOccludedQuads(quadList, false, IntRect(), &overdraw);
     EXPECT_EQ(quadList.size(), 12u);
 
     IntRect quadVisibleRect1 = quadList[1].get()->quadVisibleRect();
@@ -137,6 +147,10 @@
     IntRect quadVisibleRect6 = quadList[6].get()->quadVisibleRect();
     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);
 }
 
 TEST(CCQuadCullerTest, verifyCullCenterTileNonIntegralSize1)
@@ -158,8 +172,12 @@
     quadList.append(MakeTileQuad(childState.get(), IntRect(IntPoint(), IntSize(100, 100))));
 
     EXPECT_EQ(quadList.size(), 2u);
-    CCQuadCuller::cullOccludedQuads(quadList, false, IntRect());
+    CCQuadCuller::cullOccludedQuads(quadList, false, IntRect(), &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);
 }
 
 TEST(CCQuadCullerTest, verifyCullCenterTileNonIntegralSize2)
@@ -181,8 +199,12 @@
     quadList.append(MakeTileQuad(childState.get(), IntRect(IntPoint(), IntSize(100, 100))));
 
     EXPECT_EQ(quadList.size(), 2u);
-    CCQuadCuller::cullOccludedQuads(quadList, false, IntRect());
+    CCQuadCuller::cullOccludedQuads(quadList, false, IntRect(), &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);
 }
 
 TEST(CCQuadCullerTest, verifyCullChildLinesUpBottomRight)
@@ -196,8 +218,11 @@
 
     setQuads(rootState.get(), childState.get(), quadList);
     EXPECT_EQ(quadList.size(), 13u);
-    CCQuadCuller::cullOccludedQuads(quadList, false, IntRect());
+    CCQuadCuller::cullOccludedQuads(quadList, false, IntRect(), &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);
 }
 
 TEST(CCQuadCullerTest, verifyCullSubRegion)
@@ -212,8 +237,11 @@
 
     setQuads(rootState.get(), childState.get(), quadList, childOpaqueRect);
     EXPECT_EQ(quadList.size(), 13u);
-    CCQuadCuller::cullOccludedQuads(quadList, false, IntRect());
+    CCQuadCuller::cullOccludedQuads(quadList, false, IntRect(), &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);
 }
 
 TEST(CCQuadCullerTest, verifyCullSubRegion2)
@@ -228,8 +256,11 @@
 
     setQuads(rootState.get(), childState.get(), quadList, childOpaqueRect);
     EXPECT_EQ(quadList.size(), 13u);
-    CCQuadCuller::cullOccludedQuads(quadList, false, IntRect());
+    CCQuadCuller::cullOccludedQuads(quadList, false, IntRect(), &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);
 }
 
 TEST(CCQuadCullerTest, verifyCullSubRegionCheckOvercull)
@@ -244,7 +275,7 @@
 
     setQuads(rootState.get(), childState.get(), quadList, childOpaqueRect);
     EXPECT_EQ(quadList.size(), 13u);
-    CCQuadCuller::cullOccludedQuads(quadList, false, IntRect());
+    CCQuadCuller::cullOccludedQuads(quadList, false, IntRect(), &overdraw);
     EXPECT_EQ(quadList.size(), 13u);
 }
 
@@ -260,8 +291,11 @@
 
     setQuads(rootState.get(), childState.get(), quadList);
     EXPECT_EQ(quadList.size(), 13u);
-    CCQuadCuller::cullOccludedQuads(quadList, false, IntRect());
+    CCQuadCuller::cullOccludedQuads(quadList, false, IntRect(), &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);
 }
 
 // This test requires some explanation: here we are rotating the quads to be culled.
@@ -282,11 +316,14 @@
 
     setQuads(rootState.get(), childState.get(), quadList);
     EXPECT_EQ(quadList.size(), 13u);
-    CCQuadCuller::cullOccludedQuads(quadList, false, IntRect());
+    CCQuadCuller::cullOccludedQuads(quadList, false, IntRect(), &overdraw);
     EXPECT_EQ(quadList.size(), 12u);
+    EXPECT_NEAR(overdraw.m_pixelsDrawnOpaque, 120000, 1);
+    EXPECT_NEAR(overdraw.m_pixelsDrawnTransparent, 0, 1);
+    EXPECT_NEAR(overdraw.m_pixelsCulled, 10000, 1);
 }
 
-TEST(CCQuadCullerTest, veriftyCullOutsideScissorOverTile)
+TEST(CCQuadCullerTest, verifyCullOutsideScissorOverTile)
 {
     DECLARE_AND_INITIALIZE_TEST_QUADS
 
@@ -295,11 +332,14 @@
 
     setQuads(rootState.get(), childState.get(), quadList);
     EXPECT_EQ(quadList.size(), 13u);
-    CCQuadCuller::cullOccludedQuads(quadList, true, IntRect(200, 100, 100, 100));
+    CCQuadCuller::cullOccludedQuads(quadList, true, IntRect(200, 100, 100, 100), &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);
 }
 
-TEST(CCQuadCullerTest, veriftyCullOutsideScissorOverCulledTile)
+TEST(CCQuadCullerTest, verifyCullOutsideScissorOverCulledTile)
 {
     DECLARE_AND_INITIALIZE_TEST_QUADS
 
@@ -308,11 +348,11 @@
 
     setQuads(rootState.get(), childState.get(), quadList);
     EXPECT_EQ(quadList.size(), 13u);
-    CCQuadCuller::cullOccludedQuads(quadList, true, IntRect(100, 100, 100, 100));
+    CCQuadCuller::cullOccludedQuads(quadList, true, IntRect(100, 100, 100, 100), &overdraw);
     EXPECT_EQ(quadList.size(), 1u);
 }
 
-TEST(CCQuadCullerTest, veriftyCullOutsideScissorOverPartialTiles)
+TEST(CCQuadCullerTest, verifyCullOutsideScissorOverPartialTiles)
 {
     DECLARE_AND_INITIALIZE_TEST_QUADS
 
@@ -321,11 +361,11 @@
 
     setQuads(rootState.get(), childState.get(), quadList);
     EXPECT_EQ(quadList.size(), 13u);
-    CCQuadCuller::cullOccludedQuads(quadList, true, IntRect(50, 50, 200, 200));
+    CCQuadCuller::cullOccludedQuads(quadList, true, IntRect(50, 50, 200, 200), &overdraw);
     EXPECT_EQ(quadList.size(), 9u);
 }
 
-TEST(CCQuadCullerTest, veriftyCullOutsideScissorOverNoTiles)
+TEST(CCQuadCullerTest, verifyCullOutsideScissorOverNoTiles)
 {
     DECLARE_AND_INITIALIZE_TEST_QUADS
 
@@ -334,8 +374,11 @@
 
     setQuads(rootState.get(), childState.get(), quadList);
     EXPECT_EQ(quadList.size(), 13u);
-    CCQuadCuller::cullOccludedQuads(quadList, true, IntRect(500, 500, 100, 100));
+    CCQuadCuller::cullOccludedQuads(quadList, true, IntRect(500, 500, 100, 100), &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);
 }
 
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to