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 |