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.
5 #include "cc/delegated_renderer_layer_impl.h"
7 #include "cc/append_quads_data.h"
8 #include "cc/layer_tree_host_impl.h"
9 #include "cc/quad_sink.h"
10 #include "cc/render_pass_draw_quad.h"
11 #include "cc/scoped_ptr_vector.h"
12 #include "cc/single_thread_proxy.h"
13 #include "cc/solid_color_draw_quad.h"
14 #include "cc/solid_color_layer_impl.h"
15 #include "cc/test/fake_layer_tree_host_impl.h"
16 #include "cc/test/fake_layer_tree_host_impl_client.h"
17 #include "cc/test/fake_output_surface.h"
18 #include "cc/test/fake_proxy.h"
19 #include "cc/test/fake_web_graphics_context_3d.h"
20 #include "cc/test/geometry_test_utils.h"
21 #include "cc/test/mock_quad_culler.h"
22 #include "cc/test/render_pass_test_common.h"
23 #include "cc/test/render_pass_test_utils.h"
24 #include "testing/gtest/include/gtest/gtest.h"
25 #include "ui/gfx/transform.h"
30 class DelegatedRendererLayerImplTest
: public testing::Test
{
32 DelegatedRendererLayerImplTest()
33 : m_proxy(scoped_ptr
<Thread
>(NULL
))
34 , m_alwaysImplThreadAndMainThreadBlocked(&m_proxy
)
36 LayerTreeSettings settings
;
37 settings
.minimumOcclusionTrackingSize
= gfx::Size();
39 m_hostImpl
= LayerTreeHostImpl::create(settings
, &m_client
, &m_proxy
);
40 m_hostImpl
->initializeRenderer(createFakeOutputSurface());
41 m_hostImpl
->setViewportSize(gfx::Size(10, 10), gfx::Size(10, 10));
46 FakeLayerTreeHostImplClient m_client
;
47 DebugScopedSetImplThreadAndMainThreadBlocked m_alwaysImplThreadAndMainThreadBlocked
;
48 scoped_ptr
<LayerTreeHostImpl
> m_hostImpl
;
51 class DelegatedRendererLayerImplTestSimple
: public DelegatedRendererLayerImplTest
{
53 DelegatedRendererLayerImplTestSimple()
54 : DelegatedRendererLayerImplTest()
56 scoped_ptr
<LayerImpl
> rootLayer
= SolidColorLayerImpl::create(m_hostImpl
->activeTree(), 1).PassAs
<LayerImpl
>();
57 scoped_ptr
<LayerImpl
> layerBefore
= SolidColorLayerImpl::create(m_hostImpl
->activeTree(), 2).PassAs
<LayerImpl
>();
58 scoped_ptr
<LayerImpl
> layerAfter
= SolidColorLayerImpl::create(m_hostImpl
->activeTree(), 3).PassAs
<LayerImpl
>();
59 scoped_ptr
<DelegatedRendererLayerImpl
> delegatedRendererLayer
= DelegatedRendererLayerImpl::create(m_hostImpl
->activeTree(), 4);
61 m_hostImpl
->setViewportSize(gfx::Size(100, 100), gfx::Size(100, 100));
62 rootLayer
->setBounds(gfx::Size(100, 100));
64 layerBefore
->setPosition(gfx::Point(20, 20));
65 layerBefore
->setBounds(gfx::Size(14, 14));
66 layerBefore
->setContentBounds(gfx::Size(14, 14));
67 layerBefore
->setDrawsContent(true);
68 layerBefore
->setForceRenderSurface(true);
70 layerAfter
->setPosition(gfx::Point(5, 5));
71 layerAfter
->setBounds(gfx::Size(15, 15));
72 layerAfter
->setContentBounds(gfx::Size(15, 15));
73 layerAfter
->setDrawsContent(true);
74 layerAfter
->setForceRenderSurface(true);
76 delegatedRendererLayer
->setPosition(gfx::Point(3, 3));
77 delegatedRendererLayer
->setBounds(gfx::Size(10, 10));
78 delegatedRendererLayer
->setContentBounds(gfx::Size(10, 10));
79 delegatedRendererLayer
->setDrawsContent(true);
80 gfx::Transform transform
;
81 transform
.Translate(1, 1);
82 delegatedRendererLayer
->setTransform(transform
);
84 ScopedPtrVector
<RenderPass
> delegatedRenderPasses
;
85 TestRenderPass
* pass1
= addRenderPass(delegatedRenderPasses
, RenderPass::Id(9, 6), gfx::Rect(6, 6, 6, 6), gfx::Transform());
86 addQuad(pass1
, gfx::Rect(0, 0, 6, 6), 33u);
87 TestRenderPass
* pass2
= addRenderPass(delegatedRenderPasses
, RenderPass::Id(9, 7), gfx::Rect(7, 7, 7, 7), gfx::Transform());
88 addQuad(pass2
, gfx::Rect(0, 0, 7, 7), 22u);
89 addRenderPassQuad(pass2
, pass1
);
90 TestRenderPass
* pass3
= addRenderPass(delegatedRenderPasses
, RenderPass::Id(9, 8), gfx::Rect(8, 8, 8, 8), gfx::Transform());
91 addRenderPassQuad(pass3
, pass2
);
92 delegatedRendererLayer
->setRenderPasses(delegatedRenderPasses
);
94 // The RenderPasses should be taken by the layer.
95 EXPECT_EQ(0u, delegatedRenderPasses
.size());
97 m_rootLayerPtr
= rootLayer
.get();
98 m_layerBeforePtr
= layerBefore
.get();
99 m_layerAfterPtr
= layerAfter
.get();
100 m_delegatedRendererLayerPtr
= delegatedRendererLayer
.get();
102 // Force the delegated RenderPasses to come before the RenderPass from layerAfter.
103 layerAfter
->addChild(delegatedRendererLayer
.PassAs
<LayerImpl
>());
104 rootLayer
->addChild(layerAfter
.Pass());
106 // Get the RenderPass generated by layerBefore to come before the delegated RenderPasses.
107 rootLayer
->addChild(layerBefore
.Pass());
109 m_hostImpl
->setRootLayer(rootLayer
.Pass());
113 LayerImpl
* m_rootLayerPtr
;
114 LayerImpl
* m_layerBeforePtr
;
115 LayerImpl
* m_layerAfterPtr
;
116 DelegatedRendererLayerImpl
* m_delegatedRendererLayerPtr
;
119 TEST_F(DelegatedRendererLayerImplTestSimple
, AddsContributingRenderPasses
)
121 LayerTreeHostImpl::FrameData frame
;
122 EXPECT_TRUE(m_hostImpl
->prepareToDraw(frame
));
124 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRendererLayer added two contributing passes.
125 ASSERT_EQ(5u, frame
.renderPasses
.size());
127 // The DelegatedRendererLayer should have added its contributing RenderPasses to the frame.
128 EXPECT_EQ(4, frame
.renderPasses
[1]->id
.layer_id
);
129 EXPECT_EQ(1, frame
.renderPasses
[1]->id
.index
);
130 EXPECT_EQ(4, frame
.renderPasses
[2]->id
.layer_id
);
131 EXPECT_EQ(2, frame
.renderPasses
[2]->id
.index
);
132 // And all other RenderPasses should be non-delegated.
133 EXPECT_NE(4, frame
.renderPasses
[0]->id
.layer_id
);
134 EXPECT_EQ(0, frame
.renderPasses
[0]->id
.index
);
135 EXPECT_NE(4, frame
.renderPasses
[3]->id
.layer_id
);
136 EXPECT_EQ(0, frame
.renderPasses
[3]->id
.index
);
137 EXPECT_NE(4, frame
.renderPasses
[4]->id
.layer_id
);
138 EXPECT_EQ(0, frame
.renderPasses
[4]->id
.index
);
140 // The DelegatedRendererLayer should have added its RenderPasses to the frame in order.
141 EXPECT_RECT_EQ(gfx::Rect(6, 6, 6, 6), frame
.renderPasses
[1]->output_rect
);
142 EXPECT_RECT_EQ(gfx::Rect(7, 7, 7, 7), frame
.renderPasses
[2]->output_rect
);
144 m_hostImpl
->drawLayers(frame
);
145 m_hostImpl
->didDrawAllLayers(frame
);
148 TEST_F(DelegatedRendererLayerImplTestSimple
, AddsQuadsToContributingRenderPasses
)
150 LayerTreeHostImpl::FrameData frame
;
151 EXPECT_TRUE(m_hostImpl
->prepareToDraw(frame
));
153 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRendererLayer added two contributing passes.
154 ASSERT_EQ(5u, frame
.renderPasses
.size());
156 // The DelegatedRendererLayer should have added its contributing RenderPasses to the frame.
157 EXPECT_EQ(4, frame
.renderPasses
[1]->id
.layer_id
);
158 EXPECT_EQ(1, frame
.renderPasses
[1]->id
.index
);
159 EXPECT_EQ(4, frame
.renderPasses
[2]->id
.layer_id
);
160 EXPECT_EQ(2, frame
.renderPasses
[2]->id
.index
);
162 // The DelegatedRendererLayer should have added copies of its quads to contributing RenderPasses.
163 ASSERT_EQ(1u, frame
.renderPasses
[1]->quad_list
.size());
164 EXPECT_RECT_EQ(gfx::Rect(0, 0, 6, 6), frame
.renderPasses
[1]->quad_list
[0]->rect
);
166 // Verify it added the right quads.
167 ASSERT_EQ(2u, frame
.renderPasses
[2]->quad_list
.size());
168 EXPECT_RECT_EQ(gfx::Rect(0, 0, 7, 7), frame
.renderPasses
[2]->quad_list
[0]->rect
);
169 EXPECT_RECT_EQ(gfx::Rect(6, 6, 6, 6), frame
.renderPasses
[2]->quad_list
[1]->rect
);
170 ASSERT_EQ(1u, frame
.renderPasses
[1]->quad_list
.size());
171 EXPECT_RECT_EQ(gfx::Rect(0, 0, 6, 6), frame
.renderPasses
[1]->quad_list
[0]->rect
);
173 m_hostImpl
->drawLayers(frame
);
174 m_hostImpl
->didDrawAllLayers(frame
);
177 TEST_F(DelegatedRendererLayerImplTestSimple
, AddsQuadsToTargetRenderPass
)
179 LayerTreeHostImpl::FrameData frame
;
180 EXPECT_TRUE(m_hostImpl
->prepareToDraw(frame
));
182 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRendererLayer added two contributing passes.
183 ASSERT_EQ(5u, frame
.renderPasses
.size());
185 // The layer's target is the RenderPass from m_layerAfter.
186 EXPECT_EQ(RenderPass::Id(3, 0), frame
.renderPasses
[3]->id
);
188 // The DelegatedRendererLayer should have added copies of quads in its root RenderPass to its target RenderPass.
189 // The m_layerAfter also adds one quad.
190 ASSERT_EQ(2u, frame
.renderPasses
[3]->quad_list
.size());
192 // Verify it added the right quads.
193 EXPECT_RECT_EQ(gfx::Rect(7, 7, 7, 7), frame
.renderPasses
[3]->quad_list
[0]->rect
);
195 // Its target layer should have a quad as well.
196 EXPECT_RECT_EQ(gfx::Rect(0, 0, 15, 15), frame
.renderPasses
[3]->quad_list
[1]->rect
);
198 m_hostImpl
->drawLayers(frame
);
199 m_hostImpl
->didDrawAllLayers(frame
);
202 TEST_F(DelegatedRendererLayerImplTestSimple
, QuadsFromRootRenderPassAreModifiedForTheTarget
)
204 LayerTreeHostImpl::FrameData frame
;
205 EXPECT_TRUE(m_hostImpl
->prepareToDraw(frame
));
207 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRendererLayer added two contributing passes.
208 ASSERT_EQ(5u, frame
.renderPasses
.size());
210 // The DelegatedRendererLayer is at position 3,3 compared to its target, and has a translation transform of 1,1.
211 // So its root RenderPass' quads should all be transformed by that combined amount.
212 gfx::Transform transform
;
213 transform
.Translate(4, 4);
214 EXPECT_TRANSFORMATION_MATRIX_EQ(transform
, frame
.renderPasses
[3]->quad_list
[0]->quadTransform());
216 // Quads from non-root RenderPasses should not be shifted though.
217 ASSERT_EQ(2u, frame
.renderPasses
[2]->quad_list
.size());
218 EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), frame
.renderPasses
[2]->quad_list
[0]->quadTransform());
219 EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), frame
.renderPasses
[2]->quad_list
[1]->quadTransform());
220 ASSERT_EQ(1u, frame
.renderPasses
[1]->quad_list
.size());
221 EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), frame
.renderPasses
[1]->quad_list
[0]->quadTransform());
223 m_hostImpl
->drawLayers(frame
);
224 m_hostImpl
->didDrawAllLayers(frame
);
227 TEST_F(DelegatedRendererLayerImplTestSimple
, DoesNotOwnARenderSurface
)
229 LayerTreeHostImpl::FrameData frame
;
230 EXPECT_TRUE(m_hostImpl
->prepareToDraw(frame
));
232 // If the DelegatedRendererLayer is axis aligned and has opacity 1, then
233 // it has no need to be a renderSurface for the quads it carries.
234 EXPECT_FALSE(m_delegatedRendererLayerPtr
->renderSurface());
236 m_hostImpl
->drawLayers(frame
);
237 m_hostImpl
->didDrawAllLayers(frame
);
240 TEST_F(DelegatedRendererLayerImplTestSimple
, DoesOwnARenderSurface
)
242 m_delegatedRendererLayerPtr
->setOpacity(0.5f
);
244 LayerTreeHostImpl::FrameData frame
;
245 EXPECT_TRUE(m_hostImpl
->prepareToDraw(frame
));
247 // This test case has quads from multiple layers in the delegated renderer,
248 // so if the DelegatedRendererLayer has opacity < 1, it should end up with
250 EXPECT_TRUE(m_delegatedRendererLayerPtr
->renderSurface());
252 m_hostImpl
->drawLayers(frame
);
253 m_hostImpl
->didDrawAllLayers(frame
);
256 class DelegatedRendererLayerImplTestOwnSurface
: public DelegatedRendererLayerImplTestSimple
{
258 DelegatedRendererLayerImplTestOwnSurface()
259 : DelegatedRendererLayerImplTestSimple()
261 m_delegatedRendererLayerPtr
->setForceRenderSurface(true);
265 TEST_F(DelegatedRendererLayerImplTestOwnSurface
, AddsRenderPasses
)
267 LayerTreeHostImpl::FrameData frame
;
268 EXPECT_TRUE(m_hostImpl
->prepareToDraw(frame
));
270 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRendererLayer added two contributing passes and its owned surface added one pass.
271 ASSERT_EQ(6u, frame
.renderPasses
.size());
273 // The DelegatedRendererLayer should have added its contributing RenderPasses to the frame.
274 EXPECT_EQ(4, frame
.renderPasses
[1]->id
.layer_id
);
275 EXPECT_EQ(1, frame
.renderPasses
[1]->id
.index
);
276 EXPECT_EQ(4, frame
.renderPasses
[2]->id
.layer_id
);
277 EXPECT_EQ(2, frame
.renderPasses
[2]->id
.index
);
278 // The DelegatedRendererLayer should have added a RenderPass for its surface to the frame.
279 EXPECT_EQ(4, frame
.renderPasses
[1]->id
.layer_id
);
280 EXPECT_EQ(0, frame
.renderPasses
[3]->id
.index
);
281 // And all other RenderPasses should be non-delegated.
282 EXPECT_NE(4, frame
.renderPasses
[0]->id
.layer_id
);
283 EXPECT_EQ(0, frame
.renderPasses
[0]->id
.index
);
284 EXPECT_NE(4, frame
.renderPasses
[4]->id
.layer_id
);
285 EXPECT_EQ(0, frame
.renderPasses
[4]->id
.index
);
286 EXPECT_NE(4, frame
.renderPasses
[5]->id
.layer_id
);
287 EXPECT_EQ(0, frame
.renderPasses
[5]->id
.index
);
289 // The DelegatedRendererLayer should have added its RenderPasses to the frame in order.
290 EXPECT_RECT_EQ(gfx::Rect(6, 6, 6, 6), frame
.renderPasses
[1]->output_rect
);
291 EXPECT_RECT_EQ(gfx::Rect(7, 7, 7, 7), frame
.renderPasses
[2]->output_rect
);
293 m_hostImpl
->drawLayers(frame
);
294 m_hostImpl
->didDrawAllLayers(frame
);
297 TEST_F(DelegatedRendererLayerImplTestOwnSurface
, AddsQuadsToContributingRenderPasses
)
299 LayerTreeHostImpl::FrameData frame
;
300 EXPECT_TRUE(m_hostImpl
->prepareToDraw(frame
));
302 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRendererLayer added two contributing passes and its owned surface added one pass.
303 ASSERT_EQ(6u, frame
.renderPasses
.size());
305 // The DelegatedRendererLayer should have added its contributing RenderPasses to the frame.
306 EXPECT_EQ(4, frame
.renderPasses
[1]->id
.layer_id
);
307 EXPECT_EQ(1, frame
.renderPasses
[1]->id
.index
);
308 EXPECT_EQ(4, frame
.renderPasses
[2]->id
.layer_id
);
309 EXPECT_EQ(2, frame
.renderPasses
[2]->id
.index
);
311 // The DelegatedRendererLayer should have added copies of its quads to contributing RenderPasses.
312 ASSERT_EQ(1u, frame
.renderPasses
[1]->quad_list
.size());
313 EXPECT_RECT_EQ(gfx::Rect(0, 0, 6, 6), frame
.renderPasses
[1]->quad_list
[0]->rect
);
315 // Verify it added the right quads.
316 ASSERT_EQ(2u, frame
.renderPasses
[2]->quad_list
.size());
317 EXPECT_RECT_EQ(gfx::Rect(0, 0, 7, 7), frame
.renderPasses
[2]->quad_list
[0]->rect
);
318 EXPECT_RECT_EQ(gfx::Rect(6, 6, 6, 6), frame
.renderPasses
[2]->quad_list
[1]->rect
);
319 ASSERT_EQ(1u, frame
.renderPasses
[1]->quad_list
.size());
320 EXPECT_RECT_EQ(gfx::Rect(0, 0, 6, 6), frame
.renderPasses
[1]->quad_list
[0]->rect
);
322 m_hostImpl
->drawLayers(frame
);
323 m_hostImpl
->didDrawAllLayers(frame
);
326 TEST_F(DelegatedRendererLayerImplTestOwnSurface
, AddsQuadsToTargetRenderPass
)
328 LayerTreeHostImpl::FrameData frame
;
329 EXPECT_TRUE(m_hostImpl
->prepareToDraw(frame
));
331 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRendererLayer added two contributing passes and its owned surface added one pass.
332 ASSERT_EQ(6u, frame
.renderPasses
.size());
334 // The layer's target is the RenderPass owned by itself.
335 EXPECT_EQ(RenderPass::Id(4, 0), frame
.renderPasses
[3]->id
);
337 // The DelegatedRendererLayer should have added copies of quads in its root RenderPass to its target RenderPass.
338 // The m_layerAfter also adds one quad.
339 ASSERT_EQ(1u, frame
.renderPasses
[3]->quad_list
.size());
341 // Verify it added the right quads.
342 EXPECT_RECT_EQ(gfx::Rect(7, 7, 7, 7), frame
.renderPasses
[3]->quad_list
[0]->rect
);
344 m_hostImpl
->drawLayers(frame
);
345 m_hostImpl
->didDrawAllLayers(frame
);
348 TEST_F(DelegatedRendererLayerImplTestOwnSurface
, QuadsFromRootRenderPassAreNotModifiedForTheTarget
)
350 LayerTreeHostImpl::FrameData frame
;
351 EXPECT_TRUE(m_hostImpl
->prepareToDraw(frame
));
353 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRendererLayer added two contributing passes and its owned surface added one pass.
354 ASSERT_EQ(6u, frame
.renderPasses
.size());
356 // Because the DelegatedRendererLayer owns a RenderSurfaceImpl, its root RenderPass' quads do not need to be
358 EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), frame
.renderPasses
[3]->quad_list
[0]->quadTransform());
360 // Quads from non-root RenderPasses should not be shifted though.
361 ASSERT_EQ(2u, frame
.renderPasses
[2]->quad_list
.size());
362 EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), frame
.renderPasses
[2]->quad_list
[0]->quadTransform());
363 EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), frame
.renderPasses
[2]->quad_list
[1]->quadTransform());
364 ASSERT_EQ(1u, frame
.renderPasses
[1]->quad_list
.size());
365 EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), frame
.renderPasses
[1]->quad_list
[0]->quadTransform());
367 m_hostImpl
->drawLayers(frame
);
368 m_hostImpl
->didDrawAllLayers(frame
);
371 class DelegatedRendererLayerImplTestSharedData
: public DelegatedRendererLayerImplTest
{
373 DelegatedRendererLayerImplTestSharedData()
374 : DelegatedRendererLayerImplTest()
376 scoped_ptr
<LayerImpl
> rootLayer
= LayerImpl::create(m_hostImpl
->activeTree(), 1);
377 scoped_ptr
<DelegatedRendererLayerImpl
> delegatedRendererLayer
= DelegatedRendererLayerImpl::create(m_hostImpl
->activeTree(), 2);
379 m_hostImpl
->setViewportSize(gfx::Size(100, 100), gfx::Size(100, 100));
380 rootLayer
->setBounds(gfx::Size(100, 100));
382 delegatedRendererLayer
->setPosition(gfx::Point(20, 20));
383 delegatedRendererLayer
->setBounds(gfx::Size(20, 20));
384 delegatedRendererLayer
->setContentBounds(gfx::Size(20, 20));
385 delegatedRendererLayer
->setDrawsContent(true);
386 gfx::Transform transform
;
387 transform
.Translate(10, 10);
388 delegatedRendererLayer
->setTransform(transform
);
390 ScopedPtrVector
<RenderPass
> delegatedRenderPasses
;
391 gfx::Rect
passRect(0, 0, 50, 50);
392 TestRenderPass
* pass
= addRenderPass(delegatedRenderPasses
, RenderPass::Id(9, 6), passRect
, gfx::Transform());
393 MockQuadCuller
quadSink(pass
->quad_list
, pass
->shared_quad_state_list
);
394 AppendQuadsData
data(pass
->id
);
395 SharedQuadState
* sharedState
= quadSink
.useSharedQuadState(SharedQuadState::Create());
396 sharedState
->SetAll(gfx::Transform(), passRect
, passRect
, passRect
, false, 1);
397 scoped_ptr
<SolidColorDrawQuad
> colorQuad
;
399 colorQuad
= SolidColorDrawQuad::Create();
400 colorQuad
->SetNew(sharedState
, gfx::Rect(0, 0, 10, 10), 1u);
401 quadSink
.append(colorQuad
.PassAs
<DrawQuad
>(), data
);
403 colorQuad
= SolidColorDrawQuad::Create();
404 colorQuad
->SetNew(sharedState
, gfx::Rect(0, 10, 10, 10), 2u);
405 quadSink
.append(colorQuad
.PassAs
<DrawQuad
>(), data
);
407 colorQuad
= SolidColorDrawQuad::Create();
408 colorQuad
->SetNew(sharedState
, gfx::Rect(10, 0, 10, 10), 3u);
409 quadSink
.append(colorQuad
.PassAs
<DrawQuad
>(), data
);
411 colorQuad
= SolidColorDrawQuad::Create();
412 colorQuad
->SetNew(sharedState
, gfx::Rect(10, 10, 10, 10), 4u);
413 quadSink
.append(colorQuad
.PassAs
<DrawQuad
>(), data
);
415 delegatedRendererLayer
->setRenderPasses(delegatedRenderPasses
);
417 // The RenderPasses should be taken by the layer.
418 EXPECT_EQ(0u, delegatedRenderPasses
.size());
420 m_rootLayerPtr
= rootLayer
.get();
421 m_delegatedRendererLayerPtr
= delegatedRendererLayer
.get();
423 rootLayer
->addChild(delegatedRendererLayer
.PassAs
<LayerImpl
>());
425 m_hostImpl
->setRootLayer(rootLayer
.Pass());
429 LayerImpl
* m_rootLayerPtr
;
430 DelegatedRendererLayerImpl
* m_delegatedRendererLayerPtr
;
433 TEST_F(DelegatedRendererLayerImplTestSharedData
, SharedData
)
435 LayerTreeHostImpl::FrameData frame
;
436 EXPECT_TRUE(m_hostImpl
->prepareToDraw(frame
));
438 ASSERT_EQ(1u, frame
.renderPasses
.size());
439 EXPECT_EQ(1, frame
.renderPasses
[0]->id
.layer_id
);
440 EXPECT_EQ(0, frame
.renderPasses
[0]->id
.index
);
442 const QuadList
& quadList
= frame
.renderPasses
[0]->quad_list
;
443 ASSERT_EQ(4u, quadList
.size());
445 // All quads should share the same state.
446 const SharedQuadState
* sharedState
= quadList
[0]->shared_quad_state
;
447 EXPECT_EQ(sharedState
, quadList
[1]->shared_quad_state
);
448 EXPECT_EQ(sharedState
, quadList
[2]->shared_quad_state
);
449 EXPECT_EQ(sharedState
, quadList
[3]->shared_quad_state
);
451 // The state should be transformed only once.
452 EXPECT_RECT_EQ(gfx::Rect(30, 30, 50, 50), sharedState
->clipped_rect_in_target
);
453 gfx::Transform expected
;
454 expected
.Translate(30, 30);
455 EXPECT_TRANSFORMATION_MATRIX_EQ(expected
, sharedState
->content_to_target_transform
);
457 m_hostImpl
->drawLayers(frame
);
458 m_hostImpl
->didDrawAllLayers(frame
);