Source/WebCore/ChangeLog

 12012-01-05 W. James MacLean <wjmaclean@chromium.org>
 2
 3 [Chromium] Cull occluded tiles in tiled layers
 4 https://bugs.webkit.org/show_bug.cgi?id=70533
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 Unit test provided, must pass all existing GPU layout tests.
 9
 10 * WebCore.gypi:
 11 * platform/graphics/chromium/cc/CCLayerImpl.cpp:
 12 (WebCore::CCLayerImpl::appendQuads):
 13 (WebCore::CCLayerImpl::quadTransform):
 14 * platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:
 15 (WebCore::CCLayerTreeHostImpl::calculateRenderPasses):
 16 (WebCore::CCLayerTreeHostImpl::optimizeRenderPasses):
 17 (WebCore::CCLayerTreeHostImpl::drawLayers):
 18 * platform/graphics/chromium/cc/CCLayerTreeHostImpl.h:
 19 * platform/graphics/chromium/cc/CCQuadCuller.cpp: Added.
 20 (std::swap):
 21 (WebCore::regionContainsRect):
 22 (WebCore::CCQuadCuller::cullOccludedQuads):
 23 * platform/graphics/chromium/cc/CCQuadCuller.h: Copied from Source/WebCore/platform/graphics/chromium/cc/CCRenderPass.h.
 24 (WebCore::CCQuadCuller::CCQuadCuller):
 25 * platform/graphics/chromium/cc/CCRenderPass.cpp:
 26 (WebCore::CCRenderPass::optimizeQuads):
 27 * platform/graphics/chromium/cc/CCRenderPass.h:
 28
1292012-01-05 Ryosuke Niwa <rniwa@webkit.org>
230
331 DOM Attribute tests on Dromaeo spends 2.7% of time in hasSelectorForAttribute

Source/WebKit/chromium/ChangeLog

 12012-01-05 W. James MacLean <wjmaclean@chromium.org>
 2
 3 [Chromium] Cull occluded tiles in tiled layers
 4 https://bugs.webkit.org/show_bug.cgi?id=70533
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 * WebKit.gypi:
 9 * tests/CCQuadCullerTest.cpp: Added.
 10 (WebCore::TestDrawQuad::TestDrawQuad):
 11 (WebCore::TestDrawQuad::create):
 12 (WebCore::setQuads):
 13 (WebCore::TEST):
 14
1152012-01-05 David Reveman <reveman@chromium.org>
216
317 [Chromium] Remove WebSettings::setAcceleratedDrawingEnabled from public API.

Source/WebCore/WebCore.gypi

36313631 'platform/graphics/chromium/cc/CCPluginLayerImpl.h',
36323632 'platform/graphics/chromium/cc/CCProxy.cpp',
36333633 'platform/graphics/chromium/cc/CCProxy.h',
 3634 'platform/graphics/chromium/cc/CCQuadCuller.cpp',
 3635 'platform/graphics/chromium/cc/CCQuadCuller.h',
36343636 'platform/graphics/chromium/cc/CCRenderPass.cpp',
36353637 'platform/graphics/chromium/cc/CCRenderPass.h',
36363638 'platform/graphics/chromium/cc/CCRenderSurface.cpp',

Source/WebCore/platform/graphics/chromium/cc/CCLayerImpl.cpp

@@PassOwnPtr<CCSharedQuadState> CCLayerImpl::createSharedQuadState() const
129129
130130void CCLayerImpl::appendQuads(CCQuadList& quadList, const CCSharedQuadState* sharedQuadState)
131131{
132  IntRect layerRect(IntPoint(), bounds());
133  quadList.append(CCCustomLayerDrawQuad::create(sharedQuadState, layerRect, this));
 132 IntRect quadRect(IntPoint(), bounds());
 133 quadList.append(CCCustomLayerDrawQuad::create(sharedQuadState, quadRect, this));
134134}
135135
136136void CCLayerImpl::appendDebugBorderQuad(CCQuadList& quadList, const CCSharedQuadState* sharedQuadState) const

@@const IntRect CCLayerImpl::getDrawRect() const
176176
177177TransformationMatrix CCLayerImpl::quadTransform() const
178178{
179  return drawTransform();
 179 TransformationMatrix quadTransformation = drawTransform();
 180
 181 float offsetX = -0.5 * bounds().width();
 182 float offsetY = -0.5 * bounds().height();
 183 quadTransformation.translate(offsetX, offsetY);
 184
 185 return quadTransformation;
180186}
181187
182188void CCLayerImpl::writeIndent(TextStream& ts, int indent)

Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp

@@static FloatRect damageInSurfaceSpace(CCLayerImpl* renderSurfaceLayer, const Flo
187187 return surfaceDamageRect;
188188}
189189
190 void CCLayerTreeHostImpl::calculateRenderPasses(Vector<OwnPtr<CCRenderPass> >& passes)
 190void CCLayerTreeHostImpl::calculateRenderPasses(CCRenderPassList& passes)
191191{
192192 CCLayerList renderSurfaceLayerList;
193193 renderSurfaceLayerList.append(rootLayer());

@@void CCLayerTreeHostImpl::calculateRenderPasses(Vector<OwnPtr<CCRenderPass> >& p
238238 }
239239}
240240
 241void CCLayerTreeHostImpl::optimizeRenderPasses(CCRenderPassList& passes)
 242{
 243 for (unsigned i = 0; i < passes.size(); ++i)
 244 passes[i]->optimizeQuads();
 245}
 246
241247void CCLayerTreeHostImpl::drawLayers()
242248{
243249 TRACE_EVENT("CCLayerTreeHostImpl::drawLayers", this, 0);

@@void CCLayerTreeHostImpl::drawLayers()
246252 if (!rootLayer())
247253 return;
248254
249  Vector<OwnPtr<CCRenderPass> > passes;
 255 CCRenderPassList passes;
250256 calculateRenderPasses(passes);
251257
 258 optimizeRenderPasses(passes);
 259
252260 m_layerRenderer->beginDrawingFrame();
253261 for (size_t i = 0; i < passes.size(); ++i)
254262 m_layerRenderer->drawRenderPass(passes[i].get());

Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.h

@@private:
133133 void adjustScrollsForPageScaleChange(float);
134134 void updateMaxScrollPosition();
135135 void trackDamageForAllSurfaces(CCLayerImpl* rootDrawLayer, const CCLayerList& renderSurfaceLayerList);
136  void calculateRenderPasses(Vector<OwnPtr<CCRenderPass> >&);
 136 void calculateRenderPasses(CCRenderPassList&);
 137 void optimizeRenderPasses(CCRenderPassList&);
137138
138139 OwnPtr<LayerRendererChromium> m_layerRenderer;
139140 RefPtr<CCLayerImpl> m_rootLayerImpl;

Source/WebCore/platform/graphics/chromium/cc/CCQuadCuller.cpp

 1/*
 2 * Copyright (C) 2012 Google Inc. All rights reserved.
 3 *
 4 * Redistribution and use in source and binary forms, with or without
 5 * modification, are permitted provided that the following conditions
 6 * are met:
 7 *
 8 * 1. Redistributions of source code must retain the above copyright
 9 * notice, this list of conditions and the following disclaimer.
 10 * 2. Redistributions in binary form must reproduce the above copyright
 11 * notice, this list of conditions and the following disclaimer in the
 12 * documentation and/or other materials provided with the distribution.
 13 *
 14 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 16 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 17 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
 18 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 19 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 20 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 21 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 24 */
 25
 26#include "config.h"
 27
 28#if USE(ACCELERATED_COMPOSITING)
 29
 30#include "cc/CCQuadCuller.h"
 31
 32#include "Region.h"
 33#include "TransformationMatrix.h"
 34#include "cc/CCCustomLayerDrawQuad.h"
 35#include "cc/CCLayerImpl.h"
 36#include "cc/CCRenderPass.h"
 37#include "cc/CCRenderSurfaceDrawQuad.h"
 38
 39namespace std {
 40
 41// Specialize for OwnPtr<CCDrawQuad> since Vector doesn't know how to reverse a Vector of OwnPtr<T> in general.
 42template<>
 43void swap(OwnPtr<WebCore::CCDrawQuad>& a, OwnPtr<WebCore::CCDrawQuad>& b)
 44{
 45 a.swap(b);
 46}
 47
 48}
 49
 50namespace WebCore {
 51
 52static bool regionContainsRect(const Region& region, const IntRect& rect)
 53{
 54 Region rectRegion(rect);
 55 Region intersectRegion(intersect(region, rectRegion));
 56
 57 if (intersectRegion.isEmpty())
 58 return false;
 59
 60 rectRegion.subtract(intersectRegion);
 61 return rectRegion.isEmpty();
 62}
 63
 64void CCQuadCuller::cullOccludedQuads(CCQuadList& quadList)
 65{
 66 if (!quadList.size())
 67 return;
 68
 69 CCQuadList culledList;
 70 culledList.reserveCapacity(quadList.size());
 71
 72 Region opaqueCoverageThusFar;
 73
 74 for (int i = quadList.size() - 1; i >= 0; --i) {
 75 CCDrawQuad* drawQuad = quadList[i].get();
 76
 77 IntRect quadRect(drawQuad->quadTransform().mapRect(drawQuad->quadRect()));
 78
 79 bool keepQuad = !regionContainsRect(opaqueCoverageThusFar, quadRect);
 80
 81 if (keepQuad && drawQuad->drawsOpaque() && drawQuad->isLayerAxisAlignedIntRect())
 82 opaqueCoverageThusFar.unite(Region(quadRect));
 83
 84 if (keepQuad)
 85 culledList.append(quadList[i].release());
 86 }
 87 quadList.clear(); // Release anything that remains.
 88
 89 culledList.reverse();
 90 quadList.swap(culledList);
 91}
 92
 93} // namespace WebCore
 94#endif // USE(ACCELERATED_COMPOSITING)

Source/WebCore/platform/graphics/chromium/cc/CCQuadCuller.h

 1/*
 2 * Copyright (C) 2012 Google Inc. All rights reserved.
 3 *
 4 * Redistribution and use in source and binary forms, with or without
 5 * modification, are permitted provided that the following conditions
 6 * are met:
 7 *
 8 * 1. Redistributions of source code must retain the above copyright
 9 * notice, this list of conditions and the following disclaimer.
 10 * 2. Redistributions in binary form must reproduce the above copyright
 11 * notice, this list of conditions and the following disclaimer in the
 12 * documentation and/or other materials provided with the distribution.
 13 *
 14 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 16 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 17 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
 18 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 19 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 20 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 21 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 24 */
 25
 26#ifndef CCQuadCuller_h
 27#define CCQuadCuller_h
 28
 29#include "cc/CCRenderPass.h"
 30
 31namespace WebCore {
 32
 33class CCQuadCuller {
 34public:
 35 static void cullOccludedQuads(CCQuadList&);
 36
 37private:
 38 // Make non-instantiable.
 39 CCQuadCuller() { }
 40};
 41
 42}
 43#endif // CCQuadCuller_h

Source/WebCore/platform/graphics/chromium/cc/CCRenderPass.cpp

2828#include "cc/CCRenderPass.h"
2929
3030#include "cc/CCLayerImpl.h"
 31#include "cc/CCQuadCuller.h"
3132#include "cc/CCRenderSurfaceDrawQuad.h"
3233#include "cc/CCSharedQuadState.h"
3334

@@void CCRenderPass::appendQuadsForRenderSurfaceLayer(CCLayerImpl* layer)
6364 m_sharedQuadStateList.append(sharedQuadState.release());
6465}
6566
 67void CCRenderPass::optimizeQuads()
 68{
 69 CCQuadCuller::cullOccludedQuads(m_quadList);
 70}
 71
6672}

Source/WebCore/platform/graphics/chromium/cc/CCRenderPass.h

@@public:
4646 void appendQuadsForLayer(CCLayerImpl*);
4747 void appendQuadsForRenderSurfaceLayer(CCLayerImpl*);
4848
 49 void optimizeQuads();
 50
4951 const CCQuadList& quadList() const { return m_quadList; }
5052 CCRenderSurface* targetSurface() const { return m_targetSurface; }
5153

@@private:
6163 FloatRect m_surfaceDamageRect;
6264};
6365
 66typedef Vector<OwnPtr<CCRenderPass> > CCRenderPassList;
 67
6468}
6569
6670#endif

Source/WebKit/chromium/WebKit.gypi

7070 'tests/CCLayerTreeHostImplTest.cpp',
7171 'tests/CCLayerTreeHostTest.cpp',
7272 'tests/CCLayerTreeTestCommon.h',
 73 'tests/CCQuadCullerTest.cpp',
7374 'tests/CCRenderSurfaceTest.cpp',
7475 'tests/CCSchedulerStateMachineTest.cpp',
7576 'tests/CCSchedulerTestCommon.h',

Source/WebKit/chromium/tests/CCQuadCullerTest.cpp

 1/*
 2 * Copyright (C) 2011 Google Inc. All rights reserved.
 3 *
 4 * Redistribution and use in source and binary forms, with or without
 5 * modification, are permitted provided that the following conditions
 6 * are met:
 7 * 1. Redistributions of source code must retain the above copyright
 8 * notice, this list of conditions and the following disclaimer.
 9 * 2. Redistributions in binary form must reproduce the above copyright
 10 * notice, this list of conditions and the following disclaimer in the
 11 * documentation and/or other materials provided with the distribution.
 12 *
 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 16 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
 17 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 18 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 19 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 23 */
 24
 25#include "config.h"
 26
 27#include "cc/CCQuadCuller.h"
 28
 29#include <gmock/gmock.h>
 30#include <gtest/gtest.h>
 31
 32using namespace WebCore;
 33
 34namespace {
 35
 36class CCQuadCullerTest : public testing::Test {
 37};
 38
 39class TestDrawQuad : public CCDrawQuad {
 40public:
 41 TestDrawQuad(const CCSharedQuadState* state, Material m, const IntRect& rect)
 42 : CCDrawQuad(state, m, rect)
 43 {
 44 }
 45
 46 static PassOwnPtr<TestDrawQuad> create(const CCSharedQuadState* state, Material m, const IntRect& rect)
 47 {
 48 return adoptPtr(new TestDrawQuad(state, m, rect));
 49 }
 50};
 51
 52void setQuads(CCSharedQuadState* rootState, CCSharedQuadState* childState, CCQuadList& quadList)
 53{
 54 quadList.clear();
 55
 56 quadList.append(TestDrawQuad::create(rootState, CCDrawQuad::TiledContent, IntRect(IntPoint(), IntSize(100, 100))));
 57 quadList.append(TestDrawQuad::create(rootState, CCDrawQuad::TiledContent, IntRect(IntPoint(100, 0), IntSize(100, 100))));
 58 quadList.append(TestDrawQuad::create(rootState, CCDrawQuad::TiledContent, IntRect(IntPoint(200, 0), IntSize(100, 100))));
 59 quadList.append(TestDrawQuad::create(rootState, CCDrawQuad::TiledContent, IntRect(IntPoint(0, 100), IntSize(100, 100))));
 60 quadList.append(TestDrawQuad::create(rootState, CCDrawQuad::TiledContent, IntRect(IntPoint(100, 100), IntSize(100, 100))));
 61 quadList.append(TestDrawQuad::create(rootState, CCDrawQuad::TiledContent, IntRect(IntPoint(200, 100), IntSize(100, 100))));
 62 quadList.append(TestDrawQuad::create(rootState, CCDrawQuad::TiledContent, IntRect(IntPoint(0, 200), IntSize(100, 100))));
 63 quadList.append(TestDrawQuad::create(rootState, CCDrawQuad::TiledContent, IntRect(IntPoint(100, 200), IntSize(100, 100))));
 64 quadList.append(TestDrawQuad::create(rootState, CCDrawQuad::TiledContent, IntRect(IntPoint(200, 200), IntSize(100, 100))));
 65
 66 quadList.append(TestDrawQuad::create(childState, CCDrawQuad::TiledContent, IntRect(IntPoint(), IntSize(100, 100))));
 67 quadList.append(TestDrawQuad::create(childState, CCDrawQuad::TiledContent, IntRect(IntPoint(100, 0), IntSize(100, 100))));
 68 quadList.append(TestDrawQuad::create(childState, CCDrawQuad::TiledContent, IntRect(IntPoint(0, 100), IntSize(100, 100))));
 69 quadList.append(TestDrawQuad::create(childState, CCDrawQuad::TiledContent, IntRect(IntPoint(100, 100), IntSize(100, 100))));
 70}
 71
 72#define DECLARE_AND_INITIALIZE_TEST_QUADS \
 73 CCQuadList quadList; \
 74 TransformationMatrix childTransform; \
 75 IntSize rootSize = IntSize(300, 300); \
 76 IntRect rootRect = IntRect(IntPoint(), rootSize); \
 77 IntSize childSize = IntSize(200, 200); \
 78 IntRect childRect = IntRect(IntPoint(), childSize);
 79
 80TEST(CCQuadCullerTest, verifyCullChildLinesUpTopLeft)
 81{
 82 DECLARE_AND_INITIALIZE_TEST_QUADS
 83
 84 OwnPtr<CCSharedQuadState> rootState = CCSharedQuadState::create(TransformationMatrix(), TransformationMatrix(), rootRect, IntRect(), 1.0, true);
 85 OwnPtr<CCSharedQuadState> childState = CCSharedQuadState::create(childTransform, TransformationMatrix(), childRect, IntRect(), 1.0, true);
 86
 87 setQuads(rootState.get(), childState.get(), quadList);
 88 EXPECT_EQ(quadList.size(), 13u);
 89 CCQuadCuller::cullOccludedQuads(quadList);
 90 EXPECT_EQ(quadList.size(), 9u);
 91}
 92
 93TEST(CCQuadCullerTest, verifyCullWhenChildOpacityNotOne)
 94{
 95 DECLARE_AND_INITIALIZE_TEST_QUADS
 96
 97 OwnPtr<CCSharedQuadState> rootState = CCSharedQuadState::create(TransformationMatrix(), TransformationMatrix(), rootRect, IntRect(), 1.0, true);
 98 OwnPtr<CCSharedQuadState> childState = CCSharedQuadState::create(childTransform, TransformationMatrix(), childRect, IntRect(), 0.9, true);
 99
 100 setQuads(rootState.get(), childState.get(), quadList);
 101 EXPECT_EQ(quadList.size(), 13u);
 102 CCQuadCuller::cullOccludedQuads(quadList);
 103 EXPECT_EQ(quadList.size(), 13u);
 104}
 105
 106TEST(CCQuadCullerTest, verifyCullWhenChildOpaqueFlagFalse)
 107{
 108 DECLARE_AND_INITIALIZE_TEST_QUADS
 109
 110 OwnPtr<CCSharedQuadState> rootState = CCSharedQuadState::create(TransformationMatrix(), TransformationMatrix(), rootRect, IntRect(), 1.0, true);
 111 OwnPtr<CCSharedQuadState> childState = CCSharedQuadState::create(childTransform, TransformationMatrix(), childRect, IntRect(), 1.0, false);
 112
 113 setQuads(rootState.get(), childState.get(), quadList);
 114 EXPECT_EQ(quadList.size(), 13u);
 115 CCQuadCuller::cullOccludedQuads(quadList);
 116 EXPECT_EQ(quadList.size(), 13u);
 117}
 118
 119TEST(CCQuadCullerTest, verifyCullCenterTileOnly)
 120{
 121 DECLARE_AND_INITIALIZE_TEST_QUADS
 122
 123 childTransform.translate(50, 50);
 124
 125 OwnPtr<CCSharedQuadState> rootState = CCSharedQuadState::create(TransformationMatrix(), TransformationMatrix(), rootRect, IntRect(), 1.0, true);
 126 OwnPtr<CCSharedQuadState> childState = CCSharedQuadState::create(childTransform, TransformationMatrix(), childRect, IntRect(), 1.0, true);
 127
 128 setQuads(rootState.get(), childState.get(), quadList);
 129 EXPECT_EQ(quadList.size(), 13u);
 130 CCQuadCuller::cullOccludedQuads(quadList);
 131 EXPECT_EQ(quadList.size(), 12u);
 132}
 133
 134TEST(CCQuadCullerTest, verifyCullChildLinesUpBottomRight)
 135{
 136 DECLARE_AND_INITIALIZE_TEST_QUADS
 137
 138 childTransform.translate(100, 100);
 139
 140 OwnPtr<CCSharedQuadState> rootState = CCSharedQuadState::create(TransformationMatrix(), TransformationMatrix(), rootRect, IntRect(), 1.0, true);
 141 OwnPtr<CCSharedQuadState> childState = CCSharedQuadState::create(childTransform, TransformationMatrix(), childRect, IntRect(), 1.0, true);
 142
 143 setQuads(rootState.get(), childState.get(), quadList);
 144 EXPECT_EQ(quadList.size(), 13u);
 145 CCQuadCuller::cullOccludedQuads(quadList);
 146 EXPECT_EQ(quadList.size(), 9u);
 147}
 148
 149} // namespace