blob: 312a3d31f382e03c38c66aeeb8df2171a4437760 [file] [log] [blame]
[email protected]7d929c02012-09-20 17:26:571// 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"
[email protected]87cea5372012-09-26 18:59:5621#include "cc/scoped_ptr_vector.h"
[email protected]7f0c53db2012-10-02 00:23:1822#include "testing/gtest/include/gtest/gtest.h"
[email protected]7d929c02012-09-20 17:26:5723#include <public/WebTransformationMatrix.h>
24
25using WebKit::FakeWebCompositorOutputSurface;
26using WebKit::FakeWebGraphicsContext3D;
27using WebKit::WebTransformationMatrix;
28
29using namespace cc;
30using namespace WebKitTests;
31
32namespace {
33
34class CCDelegatedRendererLayerImplTest : public testing::Test, public CCLayerTreeHostImplClient {
35public:
36 CCDelegatedRendererLayerImplTest()
37 {
38 CCLayerTreeSettings settings;
39 settings.minimumOcclusionTrackingSize = IntSize();
40
41 m_hostImpl = CCLayerTreeHostImpl::create(settings, this);
[email protected]673788a2012-09-22 22:22:1042 m_hostImpl->initializeRenderer(createContext());
[email protected]7d929c02012-09-20 17:26:5743 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 { }
[email protected]ec1d6d52012-10-10 01:28:5753 virtual void postAnimationEventsToMainThreadOnImplThread(scoped_ptr<CCAnimationEventsVector>, double wallClockTime) OVERRIDE { }
[email protected]7d929c02012-09-20 17:26:5754 virtual void releaseContentsTexturesOnImplThread() OVERRIDE { }
55
56protected:
[email protected]e28efacd2012-10-06 17:07:4957 scoped_ptr<CCGraphicsContext> createContext()
[email protected]7d929c02012-09-20 17:26:5758 {
[email protected]e28efacd2012-10-06 17:07:4959 return FakeWebCompositorOutputSurface::create(adoptPtr(new FakeWebGraphicsContext3D)).PassAs<CCGraphicsContext>();
[email protected]7d929c02012-09-20 17:26:5760 }
61
62 DebugScopedSetImplThread m_alwaysImplThread;
63 DebugScopedSetMainThreadBlocked m_alwaysMainThreadBlocked;
64
[email protected]519281762012-10-06 20:06:3965 scoped_ptr<CCLayerTreeHostImpl> m_hostImpl;
[email protected]7d929c02012-09-20 17:26:5766};
67
[email protected]87cea5372012-09-26 18:59:5668static CCTestRenderPass* addRenderPass(ScopedPtrVector<CCRenderPass>& passList, CCRenderPass::Id id, IntRect outputRect, WebTransformationMatrix rootTransform)
[email protected]7d929c02012-09-20 17:26:5769{
[email protected]87cea5372012-09-26 18:59:5670 scoped_ptr<CCRenderPass> pass(CCRenderPass::create(id, outputRect, rootTransform));
[email protected]7d929c02012-09-20 17:26:5771 CCTestRenderPass* testPass = static_cast<CCTestRenderPass*>(pass.get());
[email protected]87cea5372012-09-26 18:59:5672 passList.append(pass.Pass());
[email protected]7d929c02012-09-20 17:26:5773 return testPass;
74}
75
76static CCSolidColorDrawQuad* addQuad(CCTestRenderPass* pass, IntRect rect, SkColor color)
77{
78 MockCCQuadCuller quadSink(pass->quadList(), pass->sharedQuadStateList());
79 CCAppendQuadsData data(pass->id());
80 CCSharedQuadState* sharedState = quadSink.useSharedQuadState(CCSharedQuadState::create(WebTransformationMatrix(), rect, rect, 1, false));
[email protected]8aff9332012-09-26 23:37:4081 scoped_ptr<CCSolidColorDrawQuad> quad = CCSolidColorDrawQuad::create(sharedState, rect, color);
[email protected]7d929c02012-09-20 17:26:5782 CCSolidColorDrawQuad* quadPtr = quad.get();
[email protected]8aff9332012-09-26 23:37:4083 quadSink.append(quad.PassAs<CCDrawQuad>(), data);
[email protected]7d929c02012-09-20 17:26:5784 return quadPtr;
85}
86
87static void addRenderPassQuad(CCTestRenderPass* toPass, CCTestRenderPass* contributingPass)
88{
89 MockCCQuadCuller quadSink(toPass->quadList(), toPass->sharedQuadStateList());
90 CCAppendQuadsData data(toPass->id());
91 IntRect outputRect = contributingPass->outputRect();
92 CCSharedQuadState* sharedState = quadSink.useSharedQuadState(CCSharedQuadState::create(WebTransformationMatrix(), outputRect, outputRect, 1, false));
[email protected]8aff9332012-09-26 23:37:4093 scoped_ptr<CCRenderPassDrawQuad> quad = CCRenderPassDrawQuad::create(sharedState, outputRect, contributingPass->id(), false, 0, outputRect, 0, 0, 0, 0);
94 quadSink.append(quad.PassAs<CCDrawQuad>(), data);
[email protected]7d929c02012-09-20 17:26:5795}
96
97class CCDelegatedRendererLayerImplTestSimple : public CCDelegatedRendererLayerImplTest {
98public:
99 CCDelegatedRendererLayerImplTestSimple()
100 : CCDelegatedRendererLayerImplTest()
101 {
[email protected]a96abc2d2012-10-08 07:12:23102 OwnPtr<CCSolidColorLayerImpl> rootLayer = CCSolidColorLayerImpl::create(1);
103 OwnPtr<CCSolidColorLayerImpl> layerBefore = CCSolidColorLayerImpl::create(2);
104 OwnPtr<CCSolidColorLayerImpl> layerAfter = CCSolidColorLayerImpl::create(3);
105 OwnPtr<CCDelegatedRendererLayerImpl> delegatedRendererLayer = CCDelegatedRendererLayerImpl::create(4);
[email protected]7d929c02012-09-20 17:26:57106
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
[email protected]87cea5372012-09-26 18:59:56130 ScopedPtrVector<CCRenderPass> delegatedRenderPasses;
[email protected]7d929c02012-09-20 17:26:57131 CCTestRenderPass* pass1 = addRenderPass(delegatedRenderPasses, CCRenderPass::Id(9, 6), IntRect(6, 6, 6, 6), WebTransformationMatrix());
132 addQuad(pass1, IntRect(0, 0, 6, 6), 33u);
133 CCTestRenderPass* pass2 = addRenderPass(delegatedRenderPasses, CCRenderPass::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, CCRenderPass::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 layerAfter.
[email protected]a96abc2d2012-10-08 07:12:23149 layerAfter->addChild(delegatedRendererLayer.release());
150 rootLayer->addChild(layerAfter.release());
[email protected]7d929c02012-09-20 17:26:57151
152 // Get the RenderPass generated by layerBefore to come before the delegated RenderPasses.
[email protected]a96abc2d2012-10-08 07:12:23153 rootLayer->addChild(layerBefore.release());
[email protected]7d929c02012-09-20 17:26:57154
[email protected]a96abc2d2012-10-08 07:12:23155 m_hostImpl->setRootLayer(rootLayer.release());
[email protected]7d929c02012-09-20 17:26:57156 }
157
158protected:
[email protected]a96abc2d2012-10-08 07:12:23159 CCSolidColorLayerImpl* m_rootLayerPtr;
160 CCSolidColorLayerImpl* m_layerBeforePtr;
161 CCSolidColorLayerImpl* m_layerAfterPtr;
[email protected]7d929c02012-09-20 17:26:57162 CCDelegatedRendererLayerImpl* m_delegatedRendererLayerPtr;
163};
164
165TEST_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 DelegatedRendererLayer added two contributing passes.
173 ASSERT_EQ(5u, frame.renderPasses.size());
174
175 // The DelegatedRendererLayer should have added its contributing RenderPasses 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 frame 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
193TEST_F(CCDelegatedRendererLayerImplTestSimple, AddsQuadsToContributingRenderPasses)
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 DelegatedRendererLayer added two contributing passes.
201 ASSERT_EQ(5u, frame.renderPasses.size());
202
203 // The DelegatedRendererLayer should have added its contributing RenderPasses 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 contributing RenderPasses.
210 ASSERT_EQ(1u, frame.renderPasses[1]->quadList().size());
211 EXPECT_RECT_EQ(IntRect(0, 0, 6, 6), frame.renderPasses[1]->quadList()[0]->quadRect());
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]->quadRect());
216 EXPECT_RECT_EQ(IntRect(6, 6, 6, 6), frame.renderPasses[2]->quadList()[1]->quadRect());
217 ASSERT_EQ(1u, frame.renderPasses[1]->quadList().size());
218 EXPECT_RECT_EQ(IntRect(0, 0, 6, 6), frame.renderPasses[1]->quadList()[0]->quadRect());
219}
220
221TEST_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 DelegatedRendererLayer 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]->quadRect());
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
245TEST_F(CCDelegatedRendererLayerImplTestSimple, QuadsFromRootRenderPassAreModifiedForTheTarget)
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 DelegatedRendererLayer 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.renderPasses[2]->quadList()[0]->quadTransform());
264 EXPECT_TRANSFORMATION_MATRIX_EQ(WebTransformationMatrix(), frame.renderPasses[2]->quadList()[1]->quadTransform());
265 ASSERT_EQ(1u, frame.renderPasses[1]->quadList().size());
266 EXPECT_TRANSFORMATION_MATRIX_EQ(WebTransformationMatrix(), frame.renderPasses[1]->quadList()[0]->quadTransform());
267}
268
269class CCDelegatedRendererLayerImplTestOwnSurface : public CCDelegatedRendererLayerImplTestSimple {
270public:
271 CCDelegatedRendererLayerImplTestOwnSurface()
272 : CCDelegatedRendererLayerImplTestSimple()
273 {
274 m_delegatedRendererLayerPtr->setForceRenderSurface(true);
275 }
276};
277
278TEST_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 DelegatedRendererLayer 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 RenderPasses 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 frame 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
309TEST_F(CCDelegatedRendererLayerImplTestOwnSurface, AddsQuadsToContributingRenderPasses)
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 DelegatedRendererLayer 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 RenderPasses 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 contributing RenderPasses.
326 ASSERT_EQ(1u, frame.renderPasses[1]->quadList().size());
327 EXPECT_RECT_EQ(IntRect(0, 0, 6, 6), frame.renderPasses[1]->quadList()[0]->quadRect());
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]->quadRect());
332 EXPECT_RECT_EQ(IntRect(6, 6, 6, 6), frame.renderPasses[2]->quadList()[1]->quadRect());
333 ASSERT_EQ(1u, frame.renderPasses[1]->quadList().size());
334 EXPECT_RECT_EQ(IntRect(0, 0, 6, 6), frame.renderPasses[1]->quadList()[0]->quadRect());
335}
336
337TEST_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 DelegatedRendererLayer 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]->quadRect());
356}
357
358TEST_F(CCDelegatedRendererLayerImplTestOwnSurface, QuadsFromRootRenderPassAreNotModifiedForTheTarget)
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 DelegatedRendererLayer 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 RenderPass' quads do not need to be
369 // modified at all.
370 EXPECT_TRANSFORMATION_MATRIX_EQ(WebTransformationMatrix(), frame.renderPasses[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.renderPasses[2]->quadList()[0]->quadTransform());
375 EXPECT_TRANSFORMATION_MATRIX_EQ(WebTransformationMatrix(), frame.renderPasses[2]->quadList()[1]->quadTransform());
376 ASSERT_EQ(1u, frame.renderPasses[1]->quadList().size());
377 EXPECT_TRANSFORMATION_MATRIX_EQ(WebTransformationMatrix(), frame.renderPasses[1]->quadList()[0]->quadTransform());
378}
379
[email protected]eec061182012-10-03 20:57:23380class CCDelegatedRendererLayerImplTestSharedData : public CCDelegatedRendererLayerImplTest {
381public:
382 CCDelegatedRendererLayerImplTestSharedData()
383 : CCDelegatedRendererLayerImplTest()
384 {
[email protected]a96abc2d2012-10-08 07:12:23385 OwnPtr<CCLayerImpl> rootLayer = CCLayerImpl::create(1);
386 OwnPtr<CCDelegatedRendererLayerImpl> delegatedRendererLayer = CCDelegatedRendererLayerImpl::create(2);
[email protected]eec061182012-10-03 20:57:23387
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, CCRenderPass::Id(9, 6), passRect, WebTransformationMatrix());
402 MockCCQuadCuller quadSink(pass->quadList(), pass->sharedQuadStateList());
403 CCAppendQuadsData data(pass->id());
404 CCSharedQuadState* sharedState = quadSink.useSharedQuadState(CCSharedQuadState::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
[email protected]a96abc2d2012-10-08 07:12:23417 rootLayer->addChild(delegatedRendererLayer.release());
[email protected]eec061182012-10-03 20:57:23418
[email protected]a96abc2d2012-10-08 07:12:23419 m_hostImpl->setRootLayer(rootLayer.release());
[email protected]eec061182012-10-03 20:57:23420 }
421
422protected:
423 CCLayerImpl* m_rootLayerPtr;
424 CCDelegatedRendererLayerImpl* m_delegatedRendererLayerPtr;
425};
426
427TEST_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
[email protected]7d929c02012-09-20 17:26:57454} // namespace