| OLD | NEW |
| (Empty) |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "config.h" | |
| 6 | |
| 7 #include "CCQuadCuller.h" | |
| 8 | |
| 9 #include "CCAppendQuadsData.h" | |
| 10 #include "CCLayerTilingData.h" | |
| 11 #include "CCMathUtil.h" | |
| 12 #include "CCOcclusionTracker.h" | |
| 13 #include "CCOverdrawMetrics.h" | |
| 14 #include "CCSingleThreadProxy.h" | |
| 15 #include "CCTileDrawQuad.h" | |
| 16 #include "CCTiledLayerImpl.h" | |
| 17 #include "testing/gmock/include/gmock/gmock.h" | |
| 18 #include "testing/gtest/include/gtest/gtest.h" | |
| 19 #include <public/WebTransformationMatrix.h> | |
| 20 | |
| 21 using namespace cc; | |
| 22 using WebKit::WebTransformationMatrix; | |
| 23 | |
| 24 namespace { | |
| 25 | |
| 26 class TestCCOcclusionTrackerImpl : public CCOcclusionTrackerImpl { | |
| 27 public: | |
| 28 TestCCOcclusionTrackerImpl(const IntRect& scissorRectInScreen, bool recordMe
tricsForFrame = true) | |
| 29 : CCOcclusionTrackerImpl(scissorRectInScreen, recordMetricsForFrame) | |
| 30 , m_scissorRectInScreen(scissorRectInScreen) | |
| 31 { | |
| 32 } | |
| 33 | |
| 34 protected: | |
| 35 virtual IntRect layerScissorRectInTargetSurface(const CCLayerImpl* layer) co
nst { return m_scissorRectInScreen; } | |
| 36 | |
| 37 private: | |
| 38 IntRect m_scissorRectInScreen; | |
| 39 }; | |
| 40 | |
| 41 typedef CCLayerIterator<CCLayerImpl, std::vector<CCLayerImpl*>, CCRenderSurface,
CCLayerIteratorActions::FrontToBack> CCLayerIteratorType; | |
| 42 | |
| 43 static scoped_ptr<CCTiledLayerImpl> makeLayer(CCTiledLayerImpl* parent, const We
bTransformationMatrix& drawTransform, const IntRect& layerRect, float opacity, b
ool opaque, const IntRect& layerOpaqueRect, std::vector<CCLayerImpl*>& surfaceLa
yerList) | |
| 44 { | |
| 45 scoped_ptr<CCTiledLayerImpl> layer = CCTiledLayerImpl::create(1); | |
| 46 OwnPtr<CCLayerTilingData> tiler = CCLayerTilingData::create(IntSize(100, 100
), CCLayerTilingData::NoBorderTexels); | |
| 47 tiler->setBounds(layerRect.size()); | |
| 48 layer->setTilingData(*tiler); | |
| 49 layer->setSkipsDraw(false); | |
| 50 layer->setDrawTransform(drawTransform); | |
| 51 layer->setScreenSpaceTransform(drawTransform); | |
| 52 layer->setVisibleContentRect(layerRect); | |
| 53 layer->setDrawOpacity(opacity); | |
| 54 layer->setContentsOpaque(opaque); | |
| 55 layer->setBounds(layerRect.size()); | |
| 56 layer->setContentBounds(layerRect.size()); | |
| 57 | |
| 58 CCResourceProvider::ResourceId resourceId = 1; | |
| 59 for (int i = 0; i < tiler->numTilesX(); ++i) | |
| 60 for (int j = 0; j < tiler->numTilesY(); ++j) { | |
| 61 IntRect tileOpaqueRect = opaque ? tiler->tileBounds(i, j) : intersec
tion(tiler->tileBounds(i, j), layerOpaqueRect); | |
| 62 layer->pushTileProperties(i, j, resourceId++, tileOpaqueRect); | |
| 63 } | |
| 64 | |
| 65 IntRect rectInTarget = CCMathUtil::mapClippedRect(layer->drawTransform(), la
yer->visibleContentRect()); | |
| 66 if (!parent) { | |
| 67 layer->createRenderSurface(); | |
| 68 surfaceLayerList.push_back(layer.get()); | |
| 69 layer->renderSurface()->layerList().push_back(layer.get()); | |
| 70 } else { | |
| 71 layer->setRenderTarget(parent->renderTarget()); | |
| 72 parent->renderSurface()->layerList().push_back(layer.get()); | |
| 73 rectInTarget.unite(CCMathUtil::mapClippedRect(parent->drawTransform(), p
arent->visibleContentRect())); | |
| 74 } | |
| 75 layer->setDrawableContentRect(rectInTarget); | |
| 76 | |
| 77 return layer.Pass(); | |
| 78 } | |
| 79 | |
| 80 static void appendQuads(CCQuadList& quadList, CCSharedQuadStateList& sharedState
List, CCTiledLayerImpl* layer, CCLayerIteratorType& it, CCOcclusionTrackerImpl&
occlusionTracker) | |
| 81 { | |
| 82 occlusionTracker.enterLayer(it); | |
| 83 CCQuadCuller quadCuller(quadList, sharedStateList, layer, &occlusionTracker,
false, false); | |
| 84 CCAppendQuadsData data; | |
| 85 layer->appendQuads(quadCuller, data); | |
| 86 occlusionTracker.leaveLayer(it); | |
| 87 ++it; | |
| 88 } | |
| 89 | |
| 90 #define DECLARE_AND_INITIALIZE_TEST_QUADS \ | |
| 91 DebugScopedSetImplThread impl; \ | |
| 92 CCQuadList quadList; \ | |
| 93 CCSharedQuadStateList sharedStateList; \ | |
| 94 std::vector<CCLayerImpl*> renderSurfaceLayerList; \ | |
| 95 WebTransformationMatrix childTransform; \ | |
| 96 IntSize rootSize = IntSize(300, 300); \ | |
| 97 IntRect rootRect = IntRect(IntPoint(), rootSize); \ | |
| 98 IntSize childSize = IntSize(200, 200); \ | |
| 99 IntRect childRect = IntRect(IntPoint(), childSize); | |
| 100 | |
| 101 TEST(CCQuadCullerTest, verifyNoCulling) | |
| 102 { | |
| 103 DECLARE_AND_INITIALIZE_TEST_QUADS | |
| 104 | |
| 105 scoped_ptr<CCTiledLayerImpl> rootLayer = makeLayer(0, WebTransformationMatri
x(), rootRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 106 scoped_ptr<CCTiledLayerImpl> childLayer = makeLayer(rootLayer.get(), WebTran
sformationMatrix(), childRect, 1, false, IntRect(), renderSurfaceLayerList); | |
| 107 TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000))
; | |
| 108 CCLayerIteratorType it = CCLayerIteratorType::begin(&renderSurfaceLayerList)
; | |
| 109 | |
| 110 appendQuads(quadList, sharedStateList, childLayer.get(), it, occlusionTracke
r); | |
| 111 appendQuads(quadList, sharedStateList, rootLayer.get(), it, occlusionTracker
); | |
| 112 EXPECT_EQ(quadList.size(), 13u); | |
| 113 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnOpaque(), 90000, 1
); | |
| 114 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnTranslucent(), 400
00, 1); | |
| 115 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsCulledForDrawing(), 0,
1); | |
| 116 } | |
| 117 | |
| 118 TEST(CCQuadCullerTest, verifyCullChildLinesUpTopLeft) | |
| 119 { | |
| 120 DECLARE_AND_INITIALIZE_TEST_QUADS | |
| 121 | |
| 122 scoped_ptr<CCTiledLayerImpl> rootLayer = makeLayer(0, WebTransformationMatri
x(), rootRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 123 scoped_ptr<CCTiledLayerImpl> childLayer = makeLayer(rootLayer.get(), WebTran
sformationMatrix(), childRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 124 TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000))
; | |
| 125 CCLayerIteratorType it = CCLayerIteratorType::begin(&renderSurfaceLayerList)
; | |
| 126 | |
| 127 appendQuads(quadList, sharedStateList, childLayer.get(), it, occlusionTracke
r); | |
| 128 appendQuads(quadList, sharedStateList, rootLayer.get(), it, occlusionTracker
); | |
| 129 EXPECT_EQ(quadList.size(), 9u); | |
| 130 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnOpaque(), 90000, 1
); | |
| 131 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnTranslucent(), 0,
1); | |
| 132 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsCulledForDrawing(), 400
00, 1); | |
| 133 } | |
| 134 | |
| 135 TEST(CCQuadCullerTest, verifyCullWhenChildOpacityNotOne) | |
| 136 { | |
| 137 DECLARE_AND_INITIALIZE_TEST_QUADS | |
| 138 | |
| 139 scoped_ptr<CCTiledLayerImpl> rootLayer = makeLayer(0, WebTransformationMatri
x(), rootRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 140 scoped_ptr<CCTiledLayerImpl> childLayer = makeLayer(rootLayer.get(), childTr
ansform, childRect, 0.9f, true, IntRect(), renderSurfaceLayerList); | |
| 141 TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000))
; | |
| 142 CCLayerIteratorType it = CCLayerIteratorType::begin(&renderSurfaceLayerList)
; | |
| 143 | |
| 144 appendQuads(quadList, sharedStateList, childLayer.get(), it, occlusionTracke
r); | |
| 145 appendQuads(quadList, sharedStateList, rootLayer.get(), it, occlusionTracker
); | |
| 146 EXPECT_EQ(quadList.size(), 13u); | |
| 147 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnOpaque(), 90000, 1
); | |
| 148 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnTranslucent(), 400
00, 1); | |
| 149 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsCulledForDrawing(), 0,
1); | |
| 150 } | |
| 151 | |
| 152 TEST(CCQuadCullerTest, verifyCullWhenChildOpaqueFlagFalse) | |
| 153 { | |
| 154 DECLARE_AND_INITIALIZE_TEST_QUADS | |
| 155 | |
| 156 scoped_ptr<CCTiledLayerImpl> rootLayer = makeLayer(0, WebTransformationMatri
x(), rootRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 157 scoped_ptr<CCTiledLayerImpl> childLayer = makeLayer(rootLayer.get(), childTr
ansform, childRect, 1, false, IntRect(), renderSurfaceLayerList); | |
| 158 TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000))
; | |
| 159 CCLayerIteratorType it = CCLayerIteratorType::begin(&renderSurfaceLayerList)
; | |
| 160 | |
| 161 appendQuads(quadList, sharedStateList, childLayer.get(), it, occlusionTracke
r); | |
| 162 appendQuads(quadList, sharedStateList, rootLayer.get(), it, occlusionTracker
); | |
| 163 EXPECT_EQ(quadList.size(), 13u); | |
| 164 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnOpaque(), 90000, 1
); | |
| 165 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnTranslucent(), 400
00, 1); | |
| 166 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsCulledForDrawing(), 0,
1); | |
| 167 } | |
| 168 | |
| 169 TEST(CCQuadCullerTest, verifyCullCenterTileOnly) | |
| 170 { | |
| 171 DECLARE_AND_INITIALIZE_TEST_QUADS | |
| 172 | |
| 173 childTransform.translate(50, 50); | |
| 174 | |
| 175 scoped_ptr<CCTiledLayerImpl> rootLayer = makeLayer(0, WebTransformationMatri
x(), rootRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 176 scoped_ptr<CCTiledLayerImpl> childLayer = makeLayer(rootLayer.get(), childTr
ansform, childRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 177 TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000))
; | |
| 178 CCLayerIteratorType it = CCLayerIteratorType::begin(&renderSurfaceLayerList)
; | |
| 179 | |
| 180 appendQuads(quadList, sharedStateList, childLayer.get(), it, occlusionTracke
r); | |
| 181 appendQuads(quadList, sharedStateList, rootLayer.get(), it, occlusionTracker
); | |
| 182 ASSERT_EQ(quadList.size(), 12u); | |
| 183 | |
| 184 IntRect quadVisibleRect1 = quadList[5]->quadVisibleRect(); | |
| 185 EXPECT_EQ(quadVisibleRect1.height(), 50); | |
| 186 | |
| 187 IntRect quadVisibleRect3 = quadList[7]->quadVisibleRect(); | |
| 188 EXPECT_EQ(quadVisibleRect3.width(), 50); | |
| 189 | |
| 190 // Next index is 8, not 9, since centre quad culled. | |
| 191 IntRect quadVisibleRect4 = quadList[8]->quadVisibleRect(); | |
| 192 EXPECT_EQ(quadVisibleRect4.width(), 50); | |
| 193 EXPECT_EQ(quadVisibleRect4.x(), 250); | |
| 194 | |
| 195 IntRect quadVisibleRect6 = quadList[10]->quadVisibleRect(); | |
| 196 EXPECT_EQ(quadVisibleRect6.height(), 50); | |
| 197 EXPECT_EQ(quadVisibleRect6.y(), 250); | |
| 198 | |
| 199 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnOpaque(), 100000,
1); | |
| 200 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnTranslucent(), 0,
1); | |
| 201 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsCulledForDrawing(), 300
00, 1); | |
| 202 } | |
| 203 | |
| 204 TEST(CCQuadCullerTest, verifyCullCenterTileNonIntegralSize1) | |
| 205 { | |
| 206 DECLARE_AND_INITIALIZE_TEST_QUADS | |
| 207 | |
| 208 childTransform.translate(100, 100); | |
| 209 | |
| 210 // Make the root layer's quad have extent (99.1, 99.1) -> (200.9, 200.9) to
make | |
| 211 // sure it doesn't get culled due to transform rounding. | |
| 212 WebTransformationMatrix rootTransform; | |
| 213 rootTransform.translate(99.1, 99.1); | |
| 214 rootTransform.scale(1.018); | |
| 215 | |
| 216 rootRect = childRect = IntRect(0, 0, 100, 100); | |
| 217 | |
| 218 scoped_ptr<CCTiledLayerImpl> rootLayer = makeLayer(0, rootTransform, rootRec
t, 1, true, IntRect(), renderSurfaceLayerList); | |
| 219 scoped_ptr<CCTiledLayerImpl> childLayer = makeLayer(rootLayer.get(), childTr
ansform, childRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 220 TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000))
; | |
| 221 CCLayerIteratorType it = CCLayerIteratorType::begin(&renderSurfaceLayerList)
; | |
| 222 | |
| 223 appendQuads(quadList, sharedStateList, childLayer.get(), it, occlusionTracke
r); | |
| 224 appendQuads(quadList, sharedStateList, rootLayer.get(), it, occlusionTracker
); | |
| 225 EXPECT_EQ(quadList.size(), 2u); | |
| 226 | |
| 227 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnOpaque(), 20363, 1
); | |
| 228 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnTranslucent(), 0,
1); | |
| 229 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsCulledForDrawing(), 0,
1); | |
| 230 } | |
| 231 | |
| 232 TEST(CCQuadCullerTest, verifyCullCenterTileNonIntegralSize2) | |
| 233 { | |
| 234 DECLARE_AND_INITIALIZE_TEST_QUADS | |
| 235 | |
| 236 // Make the child's quad slightly smaller than, and centred over, the root l
ayer tile. | |
| 237 // Verify the child does not cause the quad below to be culled due to roundi
ng. | |
| 238 childTransform.translate(100.1, 100.1); | |
| 239 childTransform.scale(0.982); | |
| 240 | |
| 241 WebTransformationMatrix rootTransform; | |
| 242 rootTransform.translate(100, 100); | |
| 243 | |
| 244 rootRect = childRect = IntRect(0, 0, 100, 100); | |
| 245 | |
| 246 scoped_ptr<CCTiledLayerImpl> rootLayer = makeLayer(0, rootTransform, rootRec
t, 1, true, IntRect(), renderSurfaceLayerList); | |
| 247 scoped_ptr<CCTiledLayerImpl> childLayer = makeLayer(rootLayer.get(), childTr
ansform, childRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 248 TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000))
; | |
| 249 CCLayerIteratorType it = CCLayerIteratorType::begin(&renderSurfaceLayerList)
; | |
| 250 | |
| 251 appendQuads(quadList, sharedStateList, childLayer.get(), it, occlusionTracke
r); | |
| 252 appendQuads(quadList, sharedStateList, rootLayer.get(), it, occlusionTracker
); | |
| 253 EXPECT_EQ(quadList.size(), 2u); | |
| 254 | |
| 255 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnOpaque(), 19643, 1
); | |
| 256 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnTranslucent(), 0,
1); | |
| 257 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsCulledForDrawing(), 0,
1); | |
| 258 } | |
| 259 | |
| 260 TEST(CCQuadCullerTest, verifyCullChildLinesUpBottomRight) | |
| 261 { | |
| 262 DECLARE_AND_INITIALIZE_TEST_QUADS | |
| 263 | |
| 264 childTransform.translate(100, 100); | |
| 265 | |
| 266 scoped_ptr<CCTiledLayerImpl> rootLayer = makeLayer(0, WebTransformationMatri
x(), rootRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 267 scoped_ptr<CCTiledLayerImpl> childLayer = makeLayer(rootLayer.get(), childTr
ansform, childRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 268 TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000))
; | |
| 269 CCLayerIteratorType it = CCLayerIteratorType::begin(&renderSurfaceLayerList)
; | |
| 270 | |
| 271 appendQuads(quadList, sharedStateList, childLayer.get(), it, occlusionTracke
r); | |
| 272 appendQuads(quadList, sharedStateList, rootLayer.get(), it, occlusionTracker
); | |
| 273 EXPECT_EQ(quadList.size(), 9u); | |
| 274 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnOpaque(), 90000, 1
); | |
| 275 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnTranslucent(), 0,
1); | |
| 276 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsCulledForDrawing(), 400
00, 1); | |
| 277 } | |
| 278 | |
| 279 TEST(CCQuadCullerTest, verifyCullSubRegion) | |
| 280 { | |
| 281 DECLARE_AND_INITIALIZE_TEST_QUADS | |
| 282 | |
| 283 childTransform.translate(50, 50); | |
| 284 | |
| 285 scoped_ptr<CCTiledLayerImpl> rootLayer = makeLayer(0, WebTransformationMatri
x(), rootRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 286 IntRect childOpaqueRect(childRect.x() + childRect.width() / 4, childRect.y()
+ childRect.height() / 4, childRect.width() / 2, childRect.height() / 2); | |
| 287 scoped_ptr<CCTiledLayerImpl> childLayer = makeLayer(rootLayer.get(), childTr
ansform, childRect, 1, false, childOpaqueRect, renderSurfaceLayerList); | |
| 288 TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000))
; | |
| 289 CCLayerIteratorType it = CCLayerIteratorType::begin(&renderSurfaceLayerList)
; | |
| 290 | |
| 291 appendQuads(quadList, sharedStateList, childLayer.get(), it, occlusionTracke
r); | |
| 292 appendQuads(quadList, sharedStateList, rootLayer.get(), it, occlusionTracker
); | |
| 293 EXPECT_EQ(quadList.size(), 12u); | |
| 294 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnOpaque(), 90000, 1
); | |
| 295 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnTranslucent(), 300
00, 1); | |
| 296 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsCulledForDrawing(), 100
00, 1); | |
| 297 } | |
| 298 | |
| 299 TEST(CCQuadCullerTest, verifyCullSubRegion2) | |
| 300 { | |
| 301 DECLARE_AND_INITIALIZE_TEST_QUADS | |
| 302 | |
| 303 childTransform.translate(50, 10); | |
| 304 | |
| 305 scoped_ptr<CCTiledLayerImpl> rootLayer = makeLayer(0, WebTransformationMatri
x(), rootRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 306 IntRect childOpaqueRect(childRect.x() + childRect.width() / 4, childRect.y()
+ childRect.height() / 4, childRect.width() / 2, childRect.height() * 3 / 4); | |
| 307 scoped_ptr<CCTiledLayerImpl> childLayer = makeLayer(rootLayer.get(), childTr
ansform, childRect, 1, false, childOpaqueRect, renderSurfaceLayerList); | |
| 308 TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000))
; | |
| 309 CCLayerIteratorType it = CCLayerIteratorType::begin(&renderSurfaceLayerList)
; | |
| 310 | |
| 311 appendQuads(quadList, sharedStateList, childLayer.get(), it, occlusionTracke
r); | |
| 312 appendQuads(quadList, sharedStateList, rootLayer.get(), it, occlusionTracker
); | |
| 313 EXPECT_EQ(quadList.size(), 12u); | |
| 314 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnOpaque(), 90000, 1
); | |
| 315 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnTranslucent(), 250
00, 1); | |
| 316 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsCulledForDrawing(), 150
00, 1); | |
| 317 } | |
| 318 | |
| 319 TEST(CCQuadCullerTest, verifyCullSubRegionCheckOvercull) | |
| 320 { | |
| 321 DECLARE_AND_INITIALIZE_TEST_QUADS | |
| 322 | |
| 323 childTransform.translate(50, 49); | |
| 324 | |
| 325 scoped_ptr<CCTiledLayerImpl> rootLayer = makeLayer(0, WebTransformationMatri
x(), rootRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 326 IntRect childOpaqueRect(childRect.x() + childRect.width() / 4, childRect.y()
+ childRect.height() / 4, childRect.width() / 2, childRect.height() / 2); | |
| 327 scoped_ptr<CCTiledLayerImpl> childLayer = makeLayer(rootLayer.get(), childTr
ansform, childRect, 1, false, childOpaqueRect, renderSurfaceLayerList); | |
| 328 TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000))
; | |
| 329 CCLayerIteratorType it = CCLayerIteratorType::begin(&renderSurfaceLayerList)
; | |
| 330 | |
| 331 appendQuads(quadList, sharedStateList, childLayer.get(), it, occlusionTracke
r); | |
| 332 appendQuads(quadList, sharedStateList, rootLayer.get(), it, occlusionTracker
); | |
| 333 EXPECT_EQ(quadList.size(), 13u); | |
| 334 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnOpaque(), 90000, 1
); | |
| 335 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnTranslucent(), 300
00, 1); | |
| 336 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsCulledForDrawing(), 100
00, 1); | |
| 337 } | |
| 338 | |
| 339 TEST(CCQuadCullerTest, verifyNonAxisAlignedQuadsDontOcclude) | |
| 340 { | |
| 341 DECLARE_AND_INITIALIZE_TEST_QUADS | |
| 342 | |
| 343 // Use a small rotation so as to not disturb the geometry significantly. | |
| 344 childTransform.rotate(1); | |
| 345 | |
| 346 scoped_ptr<CCTiledLayerImpl> rootLayer = makeLayer(0, WebTransformationMatri
x(), rootRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 347 scoped_ptr<CCTiledLayerImpl> childLayer = makeLayer(rootLayer.get(), childTr
ansform, childRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 348 TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000))
; | |
| 349 CCLayerIteratorType it = CCLayerIteratorType::begin(&renderSurfaceLayerList)
; | |
| 350 | |
| 351 appendQuads(quadList, sharedStateList, childLayer.get(), it, occlusionTracke
r); | |
| 352 appendQuads(quadList, sharedStateList, rootLayer.get(), it, occlusionTracker
); | |
| 353 EXPECT_EQ(quadList.size(), 13u); | |
| 354 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnOpaque(), 130000,
1); | |
| 355 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnTranslucent(), 0,
1); | |
| 356 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsCulledForDrawing(), 0,
1); | |
| 357 } | |
| 358 | |
| 359 // This test requires some explanation: here we are rotating the quads to be cul
led. | |
| 360 // The 2x2 tile child layer remains in the top-left corner, unrotated, but the 3
x3 | |
| 361 // tile parent layer is rotated by 1 degree. Of the four tiles the child would | |
| 362 // normally occlude, three will move (slightly) out from under the child layer,
and | |
| 363 // one moves further under the child. Only this last tile should be culled. | |
| 364 TEST(CCQuadCullerTest, verifyNonAxisAlignedQuadsSafelyCulled) | |
| 365 { | |
| 366 DECLARE_AND_INITIALIZE_TEST_QUADS | |
| 367 | |
| 368 // Use a small rotation so as to not disturb the geometry significantly. | |
| 369 WebTransformationMatrix parentTransform; | |
| 370 parentTransform.rotate(1); | |
| 371 | |
| 372 scoped_ptr<CCTiledLayerImpl> rootLayer = makeLayer(0, parentTransform, rootR
ect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 373 scoped_ptr<CCTiledLayerImpl> childLayer = makeLayer(rootLayer.get(), WebTran
sformationMatrix(), childRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 374 TestCCOcclusionTrackerImpl occlusionTracker(IntRect(-100, -100, 1000, 1000))
; | |
| 375 CCLayerIteratorType it = CCLayerIteratorType::begin(&renderSurfaceLayerList)
; | |
| 376 | |
| 377 appendQuads(quadList, sharedStateList, childLayer.get(), it, occlusionTracke
r); | |
| 378 appendQuads(quadList, sharedStateList, rootLayer.get(), it, occlusionTracker
); | |
| 379 EXPECT_EQ(quadList.size(), 12u); | |
| 380 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnOpaque(), 100600,
1); | |
| 381 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnTranslucent(), 0,
1); | |
| 382 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsCulledForDrawing(), 294
00, 1); | |
| 383 } | |
| 384 | |
| 385 TEST(CCQuadCullerTest, verifyCullOutsideScissorOverTile) | |
| 386 { | |
| 387 DECLARE_AND_INITIALIZE_TEST_QUADS | |
| 388 | |
| 389 scoped_ptr<CCTiledLayerImpl> rootLayer = makeLayer(0, WebTransformationMatri
x(), rootRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 390 scoped_ptr<CCTiledLayerImpl> childLayer = makeLayer(rootLayer.get(), WebTran
sformationMatrix(), childRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 391 TestCCOcclusionTrackerImpl occlusionTracker(IntRect(200, 100, 100, 100)); | |
| 392 CCLayerIteratorType it = CCLayerIteratorType::begin(&renderSurfaceLayerList)
; | |
| 393 | |
| 394 appendQuads(quadList, sharedStateList, childLayer.get(), it, occlusionTracke
r); | |
| 395 appendQuads(quadList, sharedStateList, rootLayer.get(), it, occlusionTracker
); | |
| 396 EXPECT_EQ(quadList.size(), 1u); | |
| 397 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnOpaque(), 10000, 1
); | |
| 398 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnTranslucent(), 0,
1); | |
| 399 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsCulledForDrawing(), 120
000, 1); | |
| 400 } | |
| 401 | |
| 402 TEST(CCQuadCullerTest, verifyCullOutsideScissorOverCulledTile) | |
| 403 { | |
| 404 DECLARE_AND_INITIALIZE_TEST_QUADS | |
| 405 | |
| 406 scoped_ptr<CCTiledLayerImpl> rootLayer = makeLayer(0, WebTransformationMatri
x(), rootRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 407 scoped_ptr<CCTiledLayerImpl> childLayer = makeLayer(rootLayer.get(), WebTran
sformationMatrix(), childRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 408 TestCCOcclusionTrackerImpl occlusionTracker(IntRect(100, 100, 100, 100)); | |
| 409 CCLayerIteratorType it = CCLayerIteratorType::begin(&renderSurfaceLayerList)
; | |
| 410 | |
| 411 appendQuads(quadList, sharedStateList, childLayer.get(), it, occlusionTracke
r); | |
| 412 appendQuads(quadList, sharedStateList, rootLayer.get(), it, occlusionTracker
); | |
| 413 EXPECT_EQ(quadList.size(), 1u); | |
| 414 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnOpaque(), 10000, 1
); | |
| 415 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnTranslucent(), 0,
1); | |
| 416 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsCulledForDrawing(), 120
000, 1); | |
| 417 } | |
| 418 | |
| 419 TEST(CCQuadCullerTest, verifyCullOutsideScissorOverPartialTiles) | |
| 420 { | |
| 421 DECLARE_AND_INITIALIZE_TEST_QUADS | |
| 422 | |
| 423 scoped_ptr<CCTiledLayerImpl> rootLayer = makeLayer(0, WebTransformationMatri
x(), rootRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 424 scoped_ptr<CCTiledLayerImpl> childLayer = makeLayer(rootLayer.get(), WebTran
sformationMatrix(), childRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 425 TestCCOcclusionTrackerImpl occlusionTracker(IntRect(50, 50, 200, 200)); | |
| 426 CCLayerIteratorType it = CCLayerIteratorType::begin(&renderSurfaceLayerList)
; | |
| 427 | |
| 428 appendQuads(quadList, sharedStateList, childLayer.get(), it, occlusionTracke
r); | |
| 429 appendQuads(quadList, sharedStateList, rootLayer.get(), it, occlusionTracker
); | |
| 430 EXPECT_EQ(quadList.size(), 9u); | |
| 431 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnOpaque(), 40000, 1
); | |
| 432 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnTranslucent(), 0,
1); | |
| 433 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsCulledForDrawing(), 900
00, 1); | |
| 434 } | |
| 435 | |
| 436 TEST(CCQuadCullerTest, verifyCullOutsideScissorOverNoTiles) | |
| 437 { | |
| 438 DECLARE_AND_INITIALIZE_TEST_QUADS | |
| 439 | |
| 440 scoped_ptr<CCTiledLayerImpl> rootLayer = makeLayer(0, WebTransformationMatri
x(), rootRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 441 scoped_ptr<CCTiledLayerImpl> childLayer = makeLayer(rootLayer.get(), WebTran
sformationMatrix(), childRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 442 TestCCOcclusionTrackerImpl occlusionTracker(IntRect(500, 500, 100, 100)); | |
| 443 CCLayerIteratorType it = CCLayerIteratorType::begin(&renderSurfaceLayerList)
; | |
| 444 | |
| 445 appendQuads(quadList, sharedStateList, childLayer.get(), it, occlusionTracke
r); | |
| 446 appendQuads(quadList, sharedStateList, rootLayer.get(), it, occlusionTracker
); | |
| 447 EXPECT_EQ(quadList.size(), 0u); | |
| 448 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnOpaque(), 0, 1); | |
| 449 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnTranslucent(), 0,
1); | |
| 450 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsCulledForDrawing(), 130
000, 1); | |
| 451 } | |
| 452 | |
| 453 TEST(CCQuadCullerTest, verifyWithoutMetrics) | |
| 454 { | |
| 455 DECLARE_AND_INITIALIZE_TEST_QUADS | |
| 456 | |
| 457 scoped_ptr<CCTiledLayerImpl> rootLayer = makeLayer(0, WebTransformationMatri
x(), rootRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 458 scoped_ptr<CCTiledLayerImpl> childLayer = makeLayer(rootLayer.get(), WebTran
sformationMatrix(), childRect, 1, true, IntRect(), renderSurfaceLayerList); | |
| 459 TestCCOcclusionTrackerImpl occlusionTracker(IntRect(50, 50, 200, 200), false
); | |
| 460 CCLayerIteratorType it = CCLayerIteratorType::begin(&renderSurfaceLayerList)
; | |
| 461 | |
| 462 appendQuads(quadList, sharedStateList, childLayer.get(), it, occlusionTracke
r); | |
| 463 appendQuads(quadList, sharedStateList, rootLayer.get(), it, occlusionTracker
); | |
| 464 EXPECT_EQ(quadList.size(), 9u); | |
| 465 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnOpaque(), 0, 1); | |
| 466 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsDrawnTranslucent(), 0,
1); | |
| 467 EXPECT_NEAR(occlusionTracker.overdrawMetrics().pixelsCulledForDrawing(), 0,
1); | |
| 468 } | |
| 469 | |
| 470 | |
| 471 } // namespace | |
| OLD | NEW |