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 "CCDelegatedRendererLayerImpl.h" | |
8 | |
9 #include "CCAppendQuadsData.h" | |
10 #include "CCGeometryTestUtils.h" | |
11 #include "CCLayerTreeHostImpl.h" | |
12 #include "CCQuadSink.h" | |
13 #include "CCRenderPassDrawQuad.h" | |
14 #include "CCRenderPassTestCommon.h" | |
15 #include "CCSingleThreadProxy.h" | |
16 #include "CCSolidColorDrawQuad.h" | |
17 #include "CCSolidColorLayerImpl.h" | |
18 #include "FakeWebCompositorOutputSurface.h" | |
19 #include "FakeWebGraphicsContext3D.h" | |
20 #include "MockCCQuadCuller.h" | |
21 #include "cc/scoped_ptr_vector.h" | |
22 #include "testing/gtest/include/gtest/gtest.h" | |
23 #include <public/WebTransformationMatrix.h> | |
24 | |
25 using WebKit::FakeWebCompositorOutputSurface; | |
26 using WebKit::FakeWebGraphicsContext3D; | |
27 using WebKit::WebTransformationMatrix; | |
28 | |
29 using namespace cc; | |
30 using namespace WebKitTests; | |
31 | |
32 namespace { | |
33 | |
34 class CCDelegatedRendererLayerImplTest : public testing::Test, public CCLayerTre
eHostImplClient { | |
35 public: | |
36 CCDelegatedRendererLayerImplTest() | |
37 { | |
38 CCLayerTreeSettings settings; | |
39 settings.minimumOcclusionTrackingSize = IntSize(); | |
40 | |
41 m_hostImpl = CCLayerTreeHostImpl::create(settings, this); | |
42 m_hostImpl->initializeRenderer(createContext()); | |
43 m_hostImpl->setViewportSize(IntSize(10, 10), IntSize(10, 10)); | |
44 } | |
45 | |
46 // CCLayerTreeHostImplClient implementation. | |
47 virtual void didLoseContextOnImplThread() OVERRIDE { } | |
48 virtual void onSwapBuffersCompleteOnImplThread() OVERRIDE { } | |
49 virtual void onVSyncParametersChanged(double, double) OVERRIDE { } | |
50 virtual void onCanDrawStateChanged(bool) OVERRIDE { } | |
51 virtual void setNeedsRedrawOnImplThread() OVERRIDE { } | |
52 virtual void setNeedsCommitOnImplThread() OVERRIDE { } | |
53 virtual void postAnimationEventsToMainThreadOnImplThread(scoped_ptr<CCAnimat
ionEventsVector>, double wallClockTime) OVERRIDE { } | |
54 virtual void releaseContentsTexturesOnImplThread() OVERRIDE { } | |
55 | |
56 protected: | |
57 scoped_ptr<CCGraphicsContext> createContext() | |
58 { | |
59 return FakeWebCompositorOutputSurface::create(adoptPtr(new FakeWebGraphi
csContext3D)).PassAs<CCGraphicsContext>(); | |
60 } | |
61 | |
62 DebugScopedSetImplThread m_alwaysImplThread; | |
63 DebugScopedSetMainThreadBlocked m_alwaysMainThreadBlocked; | |
64 | |
65 scoped_ptr<CCLayerTreeHostImpl> m_hostImpl; | |
66 }; | |
67 | |
68 static CCTestRenderPass* addRenderPass(ScopedPtrVector<CCRenderPass>& passList,
CCRenderPass::Id id, IntRect outputRect, WebTransformationMatrix rootTransform) | |
69 { | |
70 scoped_ptr<CCRenderPass> pass(CCRenderPass::create(id, outputRect, rootTrans
form)); | |
71 CCTestRenderPass* testPass = static_cast<CCTestRenderPass*>(pass.get()); | |
72 passList.append(pass.Pass()); | |
73 return testPass; | |
74 } | |
75 | |
76 static CCSolidColorDrawQuad* addQuad(CCTestRenderPass* pass, IntRect rect, SkCol
or color) | |
77 { | |
78 MockCCQuadCuller quadSink(pass->quadList(), pass->sharedQuadStateList()); | |
79 CCAppendQuadsData data(pass->id()); | |
80 CCSharedQuadState* sharedState = quadSink.useSharedQuadState(CCSharedQuadSta
te::create(WebTransformationMatrix(), rect, rect, 1, false)); | |
81 scoped_ptr<CCSolidColorDrawQuad> quad = CCSolidColorDrawQuad::create(sharedS
tate, rect, color); | |
82 CCSolidColorDrawQuad* quadPtr = quad.get(); | |
83 quadSink.append(quad.PassAs<CCDrawQuad>(), data); | |
84 return quadPtr; | |
85 } | |
86 | |
87 static void addRenderPassQuad(CCTestRenderPass* toPass, CCTestRenderPass* contri
butingPass) | |
88 { | |
89 MockCCQuadCuller quadSink(toPass->quadList(), toPass->sharedQuadStateList())
; | |
90 CCAppendQuadsData data(toPass->id()); | |
91 IntRect outputRect = contributingPass->outputRect(); | |
92 CCSharedQuadState* sharedState = quadSink.useSharedQuadState(CCSharedQuadSta
te::create(WebTransformationMatrix(), outputRect, outputRect, 1, false)); | |
93 scoped_ptr<CCRenderPassDrawQuad> quad = CCRenderPassDrawQuad::create(sharedS
tate, outputRect, contributingPass->id(), false, 0, outputRect, 0, 0, 0, 0); | |
94 quadSink.append(quad.PassAs<CCDrawQuad>(), data); | |
95 } | |
96 | |
97 class CCDelegatedRendererLayerImplTestSimple : public CCDelegatedRendererLayerIm
plTest { | |
98 public: | |
99 CCDelegatedRendererLayerImplTestSimple() | |
100 : CCDelegatedRendererLayerImplTest() | |
101 { | |
102 scoped_ptr<CCLayerImpl> rootLayer = CCSolidColorLayerImpl::create(1).Pas
sAs<CCLayerImpl>(); | |
103 scoped_ptr<CCLayerImpl> layerBefore = CCSolidColorLayerImpl::create(2).P
assAs<CCLayerImpl>(); | |
104 scoped_ptr<CCLayerImpl> layerAfter = CCSolidColorLayerImpl::create(3).Pa
ssAs<CCLayerImpl>(); | |
105 scoped_ptr<CCDelegatedRendererLayerImpl> delegatedRendererLayer = CCDele
gatedRendererLayerImpl::create(4); | |
106 | |
107 m_hostImpl->setViewportSize(IntSize(100, 100), IntSize(100, 100)); | |
108 rootLayer->setBounds(IntSize(100, 100)); | |
109 | |
110 layerBefore->setPosition(IntPoint(20, 20)); | |
111 layerBefore->setBounds(IntSize(14, 14)); | |
112 layerBefore->setContentBounds(IntSize(14, 14)); | |
113 layerBefore->setDrawsContent(true); | |
114 layerBefore->setForceRenderSurface(true); | |
115 | |
116 layerAfter->setPosition(IntPoint(5, 5)); | |
117 layerAfter->setBounds(IntSize(15, 15)); | |
118 layerAfter->setContentBounds(IntSize(15, 15)); | |
119 layerAfter->setDrawsContent(true); | |
120 layerAfter->setForceRenderSurface(true); | |
121 | |
122 delegatedRendererLayer->setPosition(IntPoint(3, 3)); | |
123 delegatedRendererLayer->setBounds(IntSize(10, 10)); | |
124 delegatedRendererLayer->setContentBounds(IntSize(10, 10)); | |
125 delegatedRendererLayer->setDrawsContent(true); | |
126 WebTransformationMatrix transform; | |
127 transform.translate(1, 1); | |
128 delegatedRendererLayer->setTransform(transform); | |
129 | |
130 ScopedPtrVector<CCRenderPass> delegatedRenderPasses; | |
131 CCTestRenderPass* pass1 = addRenderPass(delegatedRenderPasses, CCRenderP
ass::Id(9, 6), IntRect(6, 6, 6, 6), WebTransformationMatrix()); | |
132 addQuad(pass1, IntRect(0, 0, 6, 6), 33u); | |
133 CCTestRenderPass* pass2 = addRenderPass(delegatedRenderPasses, CCRenderP
ass::Id(9, 7), IntRect(7, 7, 7, 7), WebTransformationMatrix()); | |
134 addQuad(pass2, IntRect(0, 0, 7, 7), 22u); | |
135 addRenderPassQuad(pass2, pass1); | |
136 CCTestRenderPass* pass3 = addRenderPass(delegatedRenderPasses, CCRenderP
ass::Id(9, 8), IntRect(8, 8, 8, 8), WebTransformationMatrix()); | |
137 addRenderPassQuad(pass3, pass2); | |
138 delegatedRendererLayer->setRenderPasses(delegatedRenderPasses); | |
139 | |
140 // The RenderPasses should be taken by the layer. | |
141 EXPECT_EQ(0u, delegatedRenderPasses.size()); | |
142 | |
143 m_rootLayerPtr = rootLayer.get(); | |
144 m_layerBeforePtr = layerBefore.get(); | |
145 m_layerAfterPtr = layerAfter.get(); | |
146 m_delegatedRendererLayerPtr = delegatedRendererLayer.get(); | |
147 | |
148 // Force the delegated RenderPasses to come before the RenderPass from l
ayerAfter. | |
149 layerAfter->addChild(delegatedRendererLayer.PassAs<CCLayerImpl>()); | |
150 rootLayer->addChild(layerAfter.Pass()); | |
151 | |
152 // Get the RenderPass generated by layerBefore to come before the delega
ted RenderPasses. | |
153 rootLayer->addChild(layerBefore.Pass()); | |
154 | |
155 m_hostImpl->setRootLayer(rootLayer.Pass()); | |
156 } | |
157 | |
158 protected: | |
159 CCLayerImpl* m_rootLayerPtr; | |
160 CCLayerImpl* m_layerBeforePtr; | |
161 CCLayerImpl* m_layerAfterPtr; | |
162 CCDelegatedRendererLayerImpl* m_delegatedRendererLayerPtr; | |
163 }; | |
164 | |
165 TEST_F(CCDelegatedRendererLayerImplTestSimple, AddsContributingRenderPasses) | |
166 { | |
167 CCLayerTreeHostImpl::FrameData frame; | |
168 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | |
169 m_hostImpl->drawLayers(frame); | |
170 m_hostImpl->didDrawAllLayers(frame); | |
171 | |
172 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender
erLayer added two contributing passes. | |
173 ASSERT_EQ(5u, frame.renderPasses.size()); | |
174 | |
175 // The DelegatedRendererLayer should have added its contributing RenderPasse
s to the frame. | |
176 EXPECT_EQ(4, frame.renderPasses[1]->id().layerId); | |
177 EXPECT_EQ(1, frame.renderPasses[1]->id().index); | |
178 EXPECT_EQ(4, frame.renderPasses[2]->id().layerId); | |
179 EXPECT_EQ(2, frame.renderPasses[2]->id().index); | |
180 // And all other RenderPasses should be non-delegated. | |
181 EXPECT_NE(4, frame.renderPasses[0]->id().layerId); | |
182 EXPECT_EQ(0, frame.renderPasses[0]->id().index); | |
183 EXPECT_NE(4, frame.renderPasses[3]->id().layerId); | |
184 EXPECT_EQ(0, frame.renderPasses[3]->id().index); | |
185 EXPECT_NE(4, frame.renderPasses[4]->id().layerId); | |
186 EXPECT_EQ(0, frame.renderPasses[4]->id().index); | |
187 | |
188 // The DelegatedRendererLayer should have added its RenderPasses to the fram
e in order. | |
189 EXPECT_RECT_EQ(IntRect(6, 6, 6, 6), frame.renderPasses[1]->outputRect()); | |
190 EXPECT_RECT_EQ(IntRect(7, 7, 7, 7), frame.renderPasses[2]->outputRect()); | |
191 } | |
192 | |
193 TEST_F(CCDelegatedRendererLayerImplTestSimple, AddsQuadsToContributingRenderPass
es) | |
194 { | |
195 CCLayerTreeHostImpl::FrameData frame; | |
196 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | |
197 m_hostImpl->drawLayers(frame); | |
198 m_hostImpl->didDrawAllLayers(frame); | |
199 | |
200 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender
erLayer added two contributing passes. | |
201 ASSERT_EQ(5u, frame.renderPasses.size()); | |
202 | |
203 // The DelegatedRendererLayer should have added its contributing RenderPasse
s to the frame. | |
204 EXPECT_EQ(4, frame.renderPasses[1]->id().layerId); | |
205 EXPECT_EQ(1, frame.renderPasses[1]->id().index); | |
206 EXPECT_EQ(4, frame.renderPasses[2]->id().layerId); | |
207 EXPECT_EQ(2, frame.renderPasses[2]->id().index); | |
208 | |
209 // The DelegatedRendererLayer should have added copies of its quads to contr
ibuting RenderPasses. | |
210 ASSERT_EQ(1u, frame.renderPasses[1]->quadList().size()); | |
211 EXPECT_RECT_EQ(IntRect(0, 0, 6, 6), frame.renderPasses[1]->quadList()[0]->qu
adRect()); | |
212 | |
213 // Verify it added the right quads. | |
214 ASSERT_EQ(2u, frame.renderPasses[2]->quadList().size()); | |
215 EXPECT_RECT_EQ(IntRect(0, 0, 7, 7), frame.renderPasses[2]->quadList()[0]->qu
adRect()); | |
216 EXPECT_RECT_EQ(IntRect(6, 6, 6, 6), frame.renderPasses[2]->quadList()[1]->qu
adRect()); | |
217 ASSERT_EQ(1u, frame.renderPasses[1]->quadList().size()); | |
218 EXPECT_RECT_EQ(IntRect(0, 0, 6, 6), frame.renderPasses[1]->quadList()[0]->qu
adRect()); | |
219 } | |
220 | |
221 TEST_F(CCDelegatedRendererLayerImplTestSimple, AddsQuadsToTargetRenderPass) | |
222 { | |
223 CCLayerTreeHostImpl::FrameData frame; | |
224 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | |
225 m_hostImpl->drawLayers(frame); | |
226 m_hostImpl->didDrawAllLayers(frame); | |
227 | |
228 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender
erLayer added two contributing passes. | |
229 ASSERT_EQ(5u, frame.renderPasses.size()); | |
230 | |
231 // The layer's target is the RenderPass from m_layerAfter. | |
232 EXPECT_EQ(CCRenderPass::Id(3, 0), frame.renderPasses[3]->id()); | |
233 | |
234 // The DelegatedRendererLayer should have added copies of quads in its root
RenderPass to its target RenderPass. | |
235 // The m_layerAfter also adds one quad. | |
236 ASSERT_EQ(2u, frame.renderPasses[3]->quadList().size()); | |
237 | |
238 // Verify it added the right quads. | |
239 EXPECT_RECT_EQ(IntRect(7, 7, 7, 7), frame.renderPasses[3]->quadList()[0]->qu
adRect()); | |
240 | |
241 // Its target layer should have a quad as well. | |
242 EXPECT_RECT_EQ(IntRect(0, 0, 15, 15), frame.renderPasses[3]->quadList()[1]->
quadRect()); | |
243 } | |
244 | |
245 TEST_F(CCDelegatedRendererLayerImplTestSimple, QuadsFromRootRenderPassAreModifie
dForTheTarget) | |
246 { | |
247 CCLayerTreeHostImpl::FrameData frame; | |
248 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | |
249 m_hostImpl->drawLayers(frame); | |
250 m_hostImpl->didDrawAllLayers(frame); | |
251 | |
252 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender
erLayer added two contributing passes. | |
253 ASSERT_EQ(5u, frame.renderPasses.size()); | |
254 | |
255 // The DelegatedRendererLayer is at position 3,3 compared to its target, and
has a translation transform of 1,1. | |
256 // So its root RenderPass' quads should all be transformed by that combined
amount. | |
257 WebTransformationMatrix transform; | |
258 transform.translate(4, 4); | |
259 EXPECT_TRANSFORMATION_MATRIX_EQ(transform, frame.renderPasses[3]->quadList()
[0]->quadTransform()); | |
260 | |
261 // Quads from non-root RenderPasses should not be shifted though. | |
262 ASSERT_EQ(2u, frame.renderPasses[2]->quadList().size()); | |
263 EXPECT_TRANSFORMATION_MATRIX_EQ(WebTransformationMatrix(), frame.renderPasse
s[2]->quadList()[0]->quadTransform()); | |
264 EXPECT_TRANSFORMATION_MATRIX_EQ(WebTransformationMatrix(), frame.renderPasse
s[2]->quadList()[1]->quadTransform()); | |
265 ASSERT_EQ(1u, frame.renderPasses[1]->quadList().size()); | |
266 EXPECT_TRANSFORMATION_MATRIX_EQ(WebTransformationMatrix(), frame.renderPasse
s[1]->quadList()[0]->quadTransform()); | |
267 } | |
268 | |
269 class CCDelegatedRendererLayerImplTestOwnSurface : public CCDelegatedRendererLay
erImplTestSimple { | |
270 public: | |
271 CCDelegatedRendererLayerImplTestOwnSurface() | |
272 : CCDelegatedRendererLayerImplTestSimple() | |
273 { | |
274 m_delegatedRendererLayerPtr->setForceRenderSurface(true); | |
275 } | |
276 }; | |
277 | |
278 TEST_F(CCDelegatedRendererLayerImplTestOwnSurface, AddsRenderPasses) | |
279 { | |
280 CCLayerTreeHostImpl::FrameData frame; | |
281 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | |
282 m_hostImpl->drawLayers(frame); | |
283 m_hostImpl->didDrawAllLayers(frame); | |
284 | |
285 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender
erLayer added two contributing passes and its owned surface added one pass. | |
286 ASSERT_EQ(6u, frame.renderPasses.size()); | |
287 | |
288 // The DelegatedRendererLayer should have added its contributing RenderPasse
s to the frame. | |
289 EXPECT_EQ(4, frame.renderPasses[1]->id().layerId); | |
290 EXPECT_EQ(1, frame.renderPasses[1]->id().index); | |
291 EXPECT_EQ(4, frame.renderPasses[2]->id().layerId); | |
292 EXPECT_EQ(2, frame.renderPasses[2]->id().index); | |
293 // The DelegatedRendererLayer should have added a RenderPass for its surface
to the frame. | |
294 EXPECT_EQ(4, frame.renderPasses[1]->id().layerId); | |
295 EXPECT_EQ(0, frame.renderPasses[3]->id().index); | |
296 // And all other RenderPasses should be non-delegated. | |
297 EXPECT_NE(4, frame.renderPasses[0]->id().layerId); | |
298 EXPECT_EQ(0, frame.renderPasses[0]->id().index); | |
299 EXPECT_NE(4, frame.renderPasses[4]->id().layerId); | |
300 EXPECT_EQ(0, frame.renderPasses[4]->id().index); | |
301 EXPECT_NE(4, frame.renderPasses[5]->id().layerId); | |
302 EXPECT_EQ(0, frame.renderPasses[5]->id().index); | |
303 | |
304 // The DelegatedRendererLayer should have added its RenderPasses to the fram
e in order. | |
305 EXPECT_RECT_EQ(IntRect(6, 6, 6, 6), frame.renderPasses[1]->outputRect()); | |
306 EXPECT_RECT_EQ(IntRect(7, 7, 7, 7), frame.renderPasses[2]->outputRect()); | |
307 } | |
308 | |
309 TEST_F(CCDelegatedRendererLayerImplTestOwnSurface, AddsQuadsToContributingRender
Passes) | |
310 { | |
311 CCLayerTreeHostImpl::FrameData frame; | |
312 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | |
313 m_hostImpl->drawLayers(frame); | |
314 m_hostImpl->didDrawAllLayers(frame); | |
315 | |
316 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender
erLayer added two contributing passes and its owned surface added one pass. | |
317 ASSERT_EQ(6u, frame.renderPasses.size()); | |
318 | |
319 // The DelegatedRendererLayer should have added its contributing RenderPasse
s to the frame. | |
320 EXPECT_EQ(4, frame.renderPasses[1]->id().layerId); | |
321 EXPECT_EQ(1, frame.renderPasses[1]->id().index); | |
322 EXPECT_EQ(4, frame.renderPasses[2]->id().layerId); | |
323 EXPECT_EQ(2, frame.renderPasses[2]->id().index); | |
324 | |
325 // The DelegatedRendererLayer should have added copies of its quads to contr
ibuting RenderPasses. | |
326 ASSERT_EQ(1u, frame.renderPasses[1]->quadList().size()); | |
327 EXPECT_RECT_EQ(IntRect(0, 0, 6, 6), frame.renderPasses[1]->quadList()[0]->qu
adRect()); | |
328 | |
329 // Verify it added the right quads. | |
330 ASSERT_EQ(2u, frame.renderPasses[2]->quadList().size()); | |
331 EXPECT_RECT_EQ(IntRect(0, 0, 7, 7), frame.renderPasses[2]->quadList()[0]->qu
adRect()); | |
332 EXPECT_RECT_EQ(IntRect(6, 6, 6, 6), frame.renderPasses[2]->quadList()[1]->qu
adRect()); | |
333 ASSERT_EQ(1u, frame.renderPasses[1]->quadList().size()); | |
334 EXPECT_RECT_EQ(IntRect(0, 0, 6, 6), frame.renderPasses[1]->quadList()[0]->qu
adRect()); | |
335 } | |
336 | |
337 TEST_F(CCDelegatedRendererLayerImplTestOwnSurface, AddsQuadsToTargetRenderPass) | |
338 { | |
339 CCLayerTreeHostImpl::FrameData frame; | |
340 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | |
341 m_hostImpl->drawLayers(frame); | |
342 m_hostImpl->didDrawAllLayers(frame); | |
343 | |
344 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender
erLayer added two contributing passes and its owned surface added one pass. | |
345 ASSERT_EQ(6u, frame.renderPasses.size()); | |
346 | |
347 // The layer's target is the RenderPass owned by itself. | |
348 EXPECT_EQ(CCRenderPass::Id(4, 0), frame.renderPasses[3]->id()); | |
349 | |
350 // The DelegatedRendererLayer should have added copies of quads in its root
RenderPass to its target RenderPass. | |
351 // The m_layerAfter also adds one quad. | |
352 ASSERT_EQ(1u, frame.renderPasses[3]->quadList().size()); | |
353 | |
354 // Verify it added the right quads. | |
355 EXPECT_RECT_EQ(IntRect(7, 7, 7, 7), frame.renderPasses[3]->quadList()[0]->qu
adRect()); | |
356 } | |
357 | |
358 TEST_F(CCDelegatedRendererLayerImplTestOwnSurface, QuadsFromRootRenderPassAreNot
ModifiedForTheTarget) | |
359 { | |
360 CCLayerTreeHostImpl::FrameData frame; | |
361 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | |
362 m_hostImpl->drawLayers(frame); | |
363 m_hostImpl->didDrawAllLayers(frame); | |
364 | |
365 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender
erLayer added two contributing passes and its owned surface added one pass. | |
366 ASSERT_EQ(6u, frame.renderPasses.size()); | |
367 | |
368 // Because the DelegatedRendererLayer owns a RenderSurface, its root RenderP
ass' quads do not need to be | |
369 // modified at all. | |
370 EXPECT_TRANSFORMATION_MATRIX_EQ(WebTransformationMatrix(), frame.renderPasse
s[3]->quadList()[0]->quadTransform()); | |
371 | |
372 // Quads from non-root RenderPasses should not be shifted though. | |
373 ASSERT_EQ(2u, frame.renderPasses[2]->quadList().size()); | |
374 EXPECT_TRANSFORMATION_MATRIX_EQ(WebTransformationMatrix(), frame.renderPasse
s[2]->quadList()[0]->quadTransform()); | |
375 EXPECT_TRANSFORMATION_MATRIX_EQ(WebTransformationMatrix(), frame.renderPasse
s[2]->quadList()[1]->quadTransform()); | |
376 ASSERT_EQ(1u, frame.renderPasses[1]->quadList().size()); | |
377 EXPECT_TRANSFORMATION_MATRIX_EQ(WebTransformationMatrix(), frame.renderPasse
s[1]->quadList()[0]->quadTransform()); | |
378 } | |
379 | |
380 class CCDelegatedRendererLayerImplTestSharedData : public CCDelegatedRendererLay
erImplTest { | |
381 public: | |
382 CCDelegatedRendererLayerImplTestSharedData() | |
383 : CCDelegatedRendererLayerImplTest() | |
384 { | |
385 scoped_ptr<CCLayerImpl> rootLayer = CCLayerImpl::create(1); | |
386 scoped_ptr<CCDelegatedRendererLayerImpl> delegatedRendererLayer = CCDele
gatedRendererLayerImpl::create(2); | |
387 | |
388 m_hostImpl->setViewportSize(IntSize(100, 100), IntSize(100, 100)); | |
389 rootLayer->setBounds(IntSize(100, 100)); | |
390 | |
391 delegatedRendererLayer->setPosition(IntPoint(20, 20)); | |
392 delegatedRendererLayer->setBounds(IntSize(20, 20)); | |
393 delegatedRendererLayer->setContentBounds(IntSize(20, 20)); | |
394 delegatedRendererLayer->setDrawsContent(true); | |
395 WebTransformationMatrix transform; | |
396 transform.translate(10, 10); | |
397 delegatedRendererLayer->setTransform(transform); | |
398 | |
399 ScopedPtrVector<CCRenderPass> delegatedRenderPasses; | |
400 IntRect passRect(0, 0, 50, 50); | |
401 CCTestRenderPass* pass = addRenderPass(delegatedRenderPasses, CCRenderPa
ss::Id(9, 6), passRect, WebTransformationMatrix()); | |
402 MockCCQuadCuller quadSink(pass->quadList(), pass->sharedQuadStateList())
; | |
403 CCAppendQuadsData data(pass->id()); | |
404 CCSharedQuadState* sharedState = quadSink.useSharedQuadState(CCSharedQua
dState::create(WebTransformationMatrix(), passRect, passRect, 1, false)); | |
405 quadSink.append(CCSolidColorDrawQuad::create(sharedState, IntRect(0, 0,
10, 10), 1u).PassAs<CCDrawQuad>(), data); | |
406 quadSink.append(CCSolidColorDrawQuad::create(sharedState, IntRect(0, 10,
10, 10), 2u).PassAs<CCDrawQuad>(), data); | |
407 quadSink.append(CCSolidColorDrawQuad::create(sharedState, IntRect(10, 0,
10, 10), 3u).PassAs<CCDrawQuad>(), data); | |
408 quadSink.append(CCSolidColorDrawQuad::create(sharedState, IntRect(10, 10
, 10, 10), 4u).PassAs<CCDrawQuad>(), data); | |
409 delegatedRendererLayer->setRenderPasses(delegatedRenderPasses); | |
410 | |
411 // The RenderPasses should be taken by the layer. | |
412 EXPECT_EQ(0u, delegatedRenderPasses.size()); | |
413 | |
414 m_rootLayerPtr = rootLayer.get(); | |
415 m_delegatedRendererLayerPtr = delegatedRendererLayer.get(); | |
416 | |
417 rootLayer->addChild(delegatedRendererLayer.PassAs<CCLayerImpl>()); | |
418 | |
419 m_hostImpl->setRootLayer(rootLayer.Pass()); | |
420 } | |
421 | |
422 protected: | |
423 CCLayerImpl* m_rootLayerPtr; | |
424 CCDelegatedRendererLayerImpl* m_delegatedRendererLayerPtr; | |
425 }; | |
426 | |
427 TEST_F(CCDelegatedRendererLayerImplTestSharedData, SharedData) | |
428 { | |
429 CCLayerTreeHostImpl::FrameData frame; | |
430 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); | |
431 m_hostImpl->drawLayers(frame); | |
432 m_hostImpl->didDrawAllLayers(frame); | |
433 | |
434 ASSERT_EQ(1u, frame.renderPasses.size()); | |
435 EXPECT_EQ(1, frame.renderPasses[0]->id().layerId); | |
436 EXPECT_EQ(0, frame.renderPasses[0]->id().index); | |
437 | |
438 const CCQuadList& quadList = frame.renderPasses[0]->quadList(); | |
439 ASSERT_EQ(4u, quadList.size()); | |
440 | |
441 // All quads should share the same state. | |
442 const CCSharedQuadState* sharedState = quadList[0]->sharedQuadState(); | |
443 EXPECT_EQ(sharedState, quadList[1]->sharedQuadState()); | |
444 EXPECT_EQ(sharedState, quadList[2]->sharedQuadState()); | |
445 EXPECT_EQ(sharedState, quadList[3]->sharedQuadState()); | |
446 | |
447 // The state should be transformed only once. | |
448 EXPECT_RECT_EQ(IntRect(30, 30, 50, 50), sharedState->clippedRectInTarget); | |
449 WebTransformationMatrix expected; | |
450 expected.translate(30, 30); | |
451 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, sharedState->quadTransform); | |
452 } | |
453 | |
454 } // namespace | |
OLD | NEW |