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/layers/delegated_renderer_layer_impl.h"
7 #include "cc/base/scoped_ptr_vector.h"
8 #include "cc/layers/solid_color_layer_impl.h"
9 #include "cc/quads/render_pass_draw_quad.h"
10 #include "cc/quads/solid_color_draw_quad.h"
11 #include "cc/test/fake_delegated_renderer_layer_impl.h"
12 #include "cc/test/fake_impl_proxy.h"
13 #include "cc/test/fake_layer_tree_host_impl.h"
14 #include "cc/test/fake_layer_tree_host_impl_client.h"
15 #include "cc/test/fake_output_surface.h"
16 #include "cc/test/geometry_test_utils.h"
17 #include "cc/test/layer_test_common.h"
18 #include "cc/test/render_pass_test_common.h"
19 #include "cc/test/render_pass_test_utils.h"
20 #include "cc/test/test_shared_bitmap_manager.h"
21 #include "cc/test/test_task_graph_runner.h"
22 #include "cc/test/test_web_graphics_context_3d.h"
23 #include "cc/trees/layer_tree_host_impl.h"
24 #include "cc/trees/layer_tree_impl.h"
25 #include "cc/trees/single_thread_proxy.h"
26 #include "testing/gtest/include/gtest/gtest.h"
27 #include "ui/gfx/frame_time.h"
28 #include "ui/gfx/transform.h"
33 class DelegatedRendererLayerImplTest
: public testing::Test
{
35 DelegatedRendererLayerImplTest()
37 always_impl_thread_and_main_thread_blocked_(&proxy_
) {
38 LayerTreeSettings settings
;
39 settings
.minimum_occlusion_tracking_size
= gfx::Size();
41 host_impl_
.reset(new FakeLayerTreeHostImpl(
42 settings
, &proxy_
, &shared_bitmap_manager_
, &task_graph_runner_
));
43 host_impl_
->InitializeRenderer(FakeOutputSurface::Create3d());
44 host_impl_
->SetViewportSize(gfx::Size(10, 10));
49 DebugScopedSetImplThreadAndMainThreadBlocked
50 always_impl_thread_and_main_thread_blocked_
;
51 TestSharedBitmapManager shared_bitmap_manager_
;
52 TestTaskGraphRunner task_graph_runner_
;
53 scoped_ptr
<LayerTreeHostImpl
> host_impl_
;
56 class DelegatedRendererLayerImplTestSimple
57 : public DelegatedRendererLayerImplTest
{
59 DelegatedRendererLayerImplTestSimple()
60 : DelegatedRendererLayerImplTest() {
61 scoped_ptr
<LayerImpl
> root_layer
=
62 SolidColorLayerImpl::Create(host_impl_
->active_tree(), 1);
63 scoped_ptr
<LayerImpl
> layer_before
=
64 SolidColorLayerImpl::Create(host_impl_
->active_tree(), 2);
65 scoped_ptr
<LayerImpl
> layer_after
=
66 SolidColorLayerImpl::Create(host_impl_
->active_tree(), 3);
67 scoped_ptr
<FakeDelegatedRendererLayerImpl
> delegated_renderer_layer
=
68 FakeDelegatedRendererLayerImpl::Create(host_impl_
->active_tree(), 4);
70 host_impl_
->SetViewportSize(gfx::Size(100, 100));
71 root_layer
->SetBounds(gfx::Size(100, 100));
72 root_layer
->SetHasRenderSurface(true);
74 layer_before
->SetPosition(gfx::Point(20, 20));
75 layer_before
->SetBounds(gfx::Size(14, 14));
76 layer_before
->SetContentBounds(gfx::Size(14, 14));
77 layer_before
->SetDrawsContent(true);
78 layer_before
->SetHasRenderSurface(true);
80 layer_after
->SetPosition(gfx::Point(5, 5));
81 layer_after
->SetBounds(gfx::Size(15, 15));
82 layer_after
->SetContentBounds(gfx::Size(15, 15));
83 layer_after
->SetDrawsContent(true);
84 layer_after
->SetHasRenderSurface(true);
86 delegated_renderer_layer
->SetPosition(gfx::Point(3, 3));
87 delegated_renderer_layer
->SetBounds(gfx::Size(10, 10));
88 delegated_renderer_layer
->SetContentBounds(gfx::Size(10, 10));
89 delegated_renderer_layer
->SetDrawsContent(true);
90 gfx::Transform transform
;
91 transform
.Translate(1.0, 1.0);
92 delegated_renderer_layer
->SetTransform(transform
);
94 RenderPassList delegated_render_passes
;
95 TestRenderPass
* pass1
= AddRenderPass(&delegated_render_passes
,
97 gfx::Rect(6, 6, 6, 6),
98 gfx::Transform(1, 0, 0, 1, 5, 6));
99 AddQuad(pass1
, gfx::Rect(0, 0, 6, 6), 33u);
100 TestRenderPass
* pass2
= AddRenderPass(&delegated_render_passes
,
102 gfx::Rect(7, 7, 7, 7),
103 gfx::Transform(1, 0, 0, 1, 7, 8));
104 AddQuad(pass2
, gfx::Rect(0, 0, 7, 7), 22u);
105 AddRenderPassQuad(pass2
, pass1
);
106 TestRenderPass
* pass3
= AddRenderPass(&delegated_render_passes
,
108 gfx::Rect(0, 0, 8, 8),
109 gfx::Transform(1, 0, 0, 1, 9, 10));
110 AddRenderPassQuad(pass3
, pass2
);
111 delegated_renderer_layer
->SetFrameDataForRenderPasses(
112 1.f
, delegated_render_passes
);
114 root_layer_
= root_layer
.get();
115 layer_before_
= layer_before
.get();
116 layer_after_
= layer_after
.get();
117 delegated_renderer_layer_
= delegated_renderer_layer
.get();
119 // Force the delegated RenderPasses to come before the RenderPass from
121 layer_after
->AddChild(delegated_renderer_layer
.Pass());
122 root_layer
->AddChild(layer_after
.Pass());
124 // Get the RenderPass generated by layer_before to come before the delegated
126 root_layer
->AddChild(layer_before
.Pass());
127 host_impl_
->active_tree()->SetRootLayer(root_layer
.Pass());
131 LayerImpl
* root_layer_
;
132 LayerImpl
* layer_before_
;
133 LayerImpl
* layer_after_
;
134 DelegatedRendererLayerImpl
* delegated_renderer_layer_
;
137 TEST_F(DelegatedRendererLayerImplTest
,
138 ChangeContributingRenderPassForNewFrame
) {
139 FakeDelegatedRendererLayerImpl
* fake_delegated_renderer_layer_impl
;
141 scoped_ptr
<LayerImpl
> root_layer
=
142 SolidColorLayerImpl::Create(host_impl_
->active_tree(), 1);
143 scoped_ptr
<FakeDelegatedRendererLayerImpl
> delegated_renderer_layer
=
144 FakeDelegatedRendererLayerImpl::Create(host_impl_
->active_tree(), 2);
146 host_impl_
->SetViewportSize(gfx::Size(100, 100));
147 root_layer
->SetBounds(gfx::Size(100, 100));
148 root_layer
->SetHasRenderSurface(true);
150 delegated_renderer_layer
->SetPosition(gfx::Point(3, 3));
151 delegated_renderer_layer
->SetBounds(gfx::Size(10, 10));
152 delegated_renderer_layer
->SetContentBounds(gfx::Size(10, 10));
153 delegated_renderer_layer
->SetDrawsContent(true);
154 delegated_renderer_layer
->SetHasRenderSurface(true);
155 gfx::Transform transform
;
156 transform
.Translate(1.0, 1.0);
157 delegated_renderer_layer
->SetTransform(transform
);
159 RenderPassList delegated_render_passes
;
160 TestRenderPass
* pass1
=
161 AddRenderPass(&delegated_render_passes
, RenderPassId(9, 6),
162 gfx::Rect(6, 6, 6, 6), gfx::Transform(1, 0, 0, 1, 5, 6));
163 AddQuad(pass1
, gfx::Rect(0, 0, 6, 6), 33u);
164 TestRenderPass
* pass2
=
165 AddRenderPass(&delegated_render_passes
, RenderPassId(9, 7),
166 gfx::Rect(7, 7, 7, 7), gfx::Transform(1, 0, 0, 1, 7, 8));
167 AddQuad(pass2
, gfx::Rect(0, 0, 7, 7), 22u);
168 AddRenderPassQuad(pass2
, pass1
);
169 TestRenderPass
* pass3
=
170 AddRenderPass(&delegated_render_passes
, RenderPassId(9, 8),
171 gfx::Rect(0, 0, 8, 8), gfx::Transform(1, 0, 0, 1, 9, 10));
172 AddRenderPassQuad(pass3
, pass2
);
173 delegated_renderer_layer
->SetFrameDataForRenderPasses(
174 1.f
, delegated_render_passes
);
176 fake_delegated_renderer_layer_impl
= delegated_renderer_layer
.get();
178 root_layer
->AddChild(delegated_renderer_layer
.Pass());
180 host_impl_
->active_tree()->SetRootLayer(root_layer
.Pass());
182 LayerTreeHostImpl::FrameData frame
;
183 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
185 // Root layer has one render pass, and delegated renderer layer has two
186 // contributing render passes and its own render pass.
187 ASSERT_EQ(4u, frame
.render_passes
.size());
189 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
190 host_impl_
->DidDrawAllLayers(frame
);
193 // New frame makes delegated renderer layer loses its contributing render
195 RenderPassList delegated_render_passes
;
196 AddRenderPass(&delegated_render_passes
, RenderPassId(9, 8),
197 gfx::Rect(0, 0, 8, 8), gfx::Transform(1, 0, 0, 1, 9, 10));
198 fake_delegated_renderer_layer_impl
->SetFrameDataForRenderPasses(
199 1.f
, delegated_render_passes
);
201 // Force damage to redraw a new frame.
202 host_impl_
->SetViewportDamage(gfx::Rect(10, 10));
204 LayerTreeHostImpl::FrameData frame
;
205 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
207 // Each non-DelegatedRendererLayer added one RenderPass. The
208 // DelegatedRendererLayer added two contributing passes.
209 ASSERT_EQ(1u, frame
.render_passes
.size());
211 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
212 host_impl_
->DidDrawAllLayers(frame
);
216 TEST_F(DelegatedRendererLayerImplTest
,
217 ChangeContributingRenderPassNonFullTreeSync
) {
218 FakeDelegatedRendererLayerImpl
* fake_delegated_renderer_layer_impl
;
220 host_impl_
->CreatePendingTree();
221 scoped_ptr
<LayerImpl
> root_layer
=
222 SolidColorLayerImpl::Create(host_impl_
->pending_tree(), 1);
223 scoped_ptr
<FakeDelegatedRendererLayerImpl
> delegated_renderer_layer
=
224 FakeDelegatedRendererLayerImpl::Create(host_impl_
->pending_tree(), 2);
226 host_impl_
->SetViewportSize(gfx::Size(100, 100));
227 root_layer
->SetBounds(gfx::Size(100, 100));
228 root_layer
->SetHasRenderSurface(true);
230 delegated_renderer_layer
->SetPosition(gfx::Point(3, 3));
231 delegated_renderer_layer
->SetBounds(gfx::Size(10, 10));
232 delegated_renderer_layer
->SetContentBounds(gfx::Size(10, 10));
233 delegated_renderer_layer
->SetDrawsContent(true);
234 delegated_renderer_layer
->SetHasRenderSurface(true);
235 gfx::Transform transform
;
236 transform
.Translate(1.0, 1.0);
237 delegated_renderer_layer
->SetTransform(transform
);
239 RenderPassList delegated_render_passes
;
240 TestRenderPass
* pass1
=
241 AddRenderPass(&delegated_render_passes
, RenderPassId(9, 6),
242 gfx::Rect(6, 6, 6, 6), gfx::Transform(1, 0, 0, 1, 5, 6));
243 AddQuad(pass1
, gfx::Rect(0, 0, 6, 6), 33u);
244 TestRenderPass
* pass2
=
245 AddRenderPass(&delegated_render_passes
, RenderPassId(9, 7),
246 gfx::Rect(7, 7, 7, 7), gfx::Transform(1, 0, 0, 1, 7, 8));
247 AddQuad(pass2
, gfx::Rect(0, 0, 7, 7), 22u);
248 AddRenderPassQuad(pass2
, pass1
);
249 TestRenderPass
* pass3
=
250 AddRenderPass(&delegated_render_passes
, RenderPassId(9, 8),
251 gfx::Rect(0, 0, 8, 8), gfx::Transform(1, 0, 0, 1, 9, 10));
252 AddRenderPassQuad(pass3
, pass2
);
253 delegated_renderer_layer
->SetFrameDataForRenderPasses(
254 1.f
, delegated_render_passes
);
256 fake_delegated_renderer_layer_impl
= delegated_renderer_layer
.get();
258 root_layer
->AddChild(delegated_renderer_layer
.Pass());
260 host_impl_
->pending_tree()->SetRootLayer(root_layer
.Pass());
261 host_impl_
->ActivateSyncTree();
263 LayerTreeHostImpl::FrameData frame
;
264 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
266 // Root layer has one render pass, and delegated renderer layer has two
267 // contributing render passes and its own render pass.
268 ASSERT_EQ(4u, frame
.render_passes
.size());
270 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
271 host_impl_
->DidDrawAllLayers(frame
);
274 // Remove contributing render passes from the delegated renderer layer.
275 host_impl_
->CreatePendingTree();
276 host_impl_
->pending_tree()->set_needs_full_tree_sync(false);
277 RenderPassList delegated_render_passes
;
278 AddRenderPass(&delegated_render_passes
, RenderPassId(9, 8),
279 gfx::Rect(0, 0, 8, 8), gfx::Transform(1, 0, 0, 1, 9, 10));
281 fake_delegated_renderer_layer_impl
->SetFrameDataForRenderPasses(
282 1.f
, delegated_render_passes
);
284 // Force damage to redraw a new frame.
286 host_impl_
->ActivateSyncTree();
287 host_impl_
->SetViewportDamage(gfx::Rect(100, 100));
288 LayerTreeHostImpl::FrameData frame
;
289 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
291 // Root layer has one render pass, and delegated renderer layer no longer
292 // has contributing render passes.
293 ASSERT_EQ(1u, frame
.render_passes
.size());
295 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
296 host_impl_
->DidDrawAllLayers(frame
);
300 TEST_F(DelegatedRendererLayerImplTestSimple
, AddsContributingRenderPasses
) {
301 LayerTreeHostImpl::FrameData frame
;
302 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
304 // Each non-DelegatedRendererLayer added one RenderPass. The
305 // DelegatedRendererLayer added two contributing passes.
306 ASSERT_EQ(5u, frame
.render_passes
.size());
308 // The DelegatedRendererLayer should have added its contributing RenderPasses
310 EXPECT_EQ(4, frame
.render_passes
[1]->id
.layer_id
);
311 EXPECT_EQ(1, frame
.render_passes
[1]->id
.index
);
312 EXPECT_EQ(4, frame
.render_passes
[2]->id
.layer_id
);
313 EXPECT_EQ(2, frame
.render_passes
[2]->id
.index
);
314 // And all other RenderPasses should be non-delegated.
315 EXPECT_NE(4, frame
.render_passes
[0]->id
.layer_id
);
316 EXPECT_EQ(0, frame
.render_passes
[0]->id
.index
);
317 EXPECT_NE(4, frame
.render_passes
[3]->id
.layer_id
);
318 EXPECT_EQ(0, frame
.render_passes
[3]->id
.index
);
319 EXPECT_NE(4, frame
.render_passes
[4]->id
.layer_id
);
320 EXPECT_EQ(0, frame
.render_passes
[4]->id
.index
);
322 // The DelegatedRendererLayer should have added its RenderPasses to the frame
324 EXPECT_EQ(gfx::Rect(6, 6, 6, 6).ToString(),
325 frame
.render_passes
[1]->output_rect
.ToString());
326 EXPECT_EQ(gfx::Rect(7, 7, 7, 7).ToString(),
327 frame
.render_passes
[2]->output_rect
.ToString());
329 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
330 host_impl_
->DidDrawAllLayers(frame
);
333 TEST_F(DelegatedRendererLayerImplTestSimple
,
334 AddsQuadsToContributingRenderPasses
) {
335 LayerTreeHostImpl::FrameData frame
;
336 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
338 // Each non-DelegatedRendererLayer added one RenderPass. The
339 // DelegatedRendererLayer added two contributing passes.
340 ASSERT_EQ(5u, frame
.render_passes
.size());
342 // The DelegatedRendererLayer should have added its contributing RenderPasses
344 EXPECT_EQ(4, frame
.render_passes
[1]->id
.layer_id
);
345 EXPECT_EQ(1, frame
.render_passes
[1]->id
.index
);
346 EXPECT_EQ(4, frame
.render_passes
[2]->id
.layer_id
);
347 EXPECT_EQ(2, frame
.render_passes
[2]->id
.index
);
349 // The DelegatedRendererLayer should have added copies of its quads to
350 // contributing RenderPasses.
351 ASSERT_EQ(1u, frame
.render_passes
[1]->quad_list
.size());
352 EXPECT_EQ(gfx::Rect(0, 0, 6, 6).ToString(),
353 frame
.render_passes
[1]->quad_list
.front()->rect
.ToString());
355 // Verify it added the right quads.
356 ASSERT_EQ(2u, frame
.render_passes
[2]->quad_list
.size());
357 EXPECT_EQ(gfx::Rect(0, 0, 7, 7).ToString(),
358 frame
.render_passes
[2]->quad_list
.front()->rect
.ToString());
359 EXPECT_EQ(gfx::Rect(6, 6, 6, 6).ToString(),
360 frame
.render_passes
[2]->quad_list
.ElementAt(1)->rect
.ToString());
361 ASSERT_EQ(1u, frame
.render_passes
[1]->quad_list
.size());
362 EXPECT_EQ(gfx::Rect(0, 0, 6, 6).ToString(),
363 frame
.render_passes
[1]->quad_list
.front()->rect
.ToString());
365 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
366 host_impl_
->DidDrawAllLayers(frame
);
369 TEST_F(DelegatedRendererLayerImplTestSimple
, AddsQuadsToTargetRenderPass
) {
370 LayerTreeHostImpl::FrameData frame
;
371 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
373 // Each non-DelegatedRendererLayer added one RenderPass. The
374 // DelegatedRendererLayer added two contributing passes.
375 ASSERT_EQ(5u, frame
.render_passes
.size());
377 // The layer's target is the RenderPass from layer_after_.
378 EXPECT_EQ(RenderPassId(3, 0), frame
.render_passes
[3]->id
);
380 // The DelegatedRendererLayer should have added copies of quads in its root
381 // RenderPass to its target RenderPass. The layer_after_ also adds one quad.
382 ASSERT_EQ(2u, frame
.render_passes
[3]->quad_list
.size());
384 // Verify it added the right quads.
385 EXPECT_EQ(gfx::Rect(7, 7, 7, 7).ToString(),
386 frame
.render_passes
[3]->quad_list
.front()->rect
.ToString());
388 // Its target layer should have a quad as well.
389 EXPECT_EQ(gfx::Rect(0, 0, 15, 15).ToString(),
390 frame
.render_passes
[3]->quad_list
.ElementAt(1)->rect
.ToString());
392 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
393 host_impl_
->DidDrawAllLayers(frame
);
396 TEST_F(DelegatedRendererLayerImplTestSimple
,
397 QuadsFromRootRenderPassAreModifiedForTheTarget
) {
398 LayerTreeHostImpl::FrameData frame
;
399 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
401 // Each non-DelegatedRendererLayer added one RenderPass. The
402 // DelegatedRendererLayer added two contributing passes.
403 ASSERT_EQ(5u, frame
.render_passes
.size());
405 // The DelegatedRendererLayer is at position 3,3 compared to its target, and
406 // has a translation transform of 1,1. So its root RenderPass' quads should
407 // all be transformed by that combined amount.
408 gfx::Transform transform
;
409 transform
.Translate(4.0, 4.0);
410 EXPECT_TRANSFORMATION_MATRIX_EQ(
411 transform
, frame
.render_passes
[3]->quad_list
.front()->quadTransform());
413 // Quads from non-root RenderPasses should not be shifted though.
414 ASSERT_EQ(2u, frame
.render_passes
[2]->quad_list
.size());
416 EXPECT_TRANSFORMATION_MATRIX_EQ(
418 frame
.render_passes
[2]->quad_list
.front()->quadTransform());
419 EXPECT_TRANSFORMATION_MATRIX_EQ(
421 frame
.render_passes
[2]->quad_list
.ElementAt(1)->quadTransform());
422 ASSERT_EQ(1u, frame
.render_passes
[1]->quad_list
.size());
423 EXPECT_TRANSFORMATION_MATRIX_EQ(
425 frame
.render_passes
[1]->quad_list
.front()->quadTransform());
427 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
428 host_impl_
->DidDrawAllLayers(frame
);
431 TEST_F(DelegatedRendererLayerImplTestSimple
, RenderPassTransformIsModified
) {
432 LayerTreeHostImpl::FrameData frame
;
433 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
435 // The delegated layer has a surface between it and the root.
436 EXPECT_TRUE(delegated_renderer_layer_
->render_target()->parent());
438 // Each non-DelegatedRendererLayer added one RenderPass. The
439 // DelegatedRendererLayer added two contributing passes.
440 ASSERT_EQ(5u, frame
.render_passes
.size());
442 // The DelegatedRendererLayer is at position 9,9 compared to the root, so all
443 // render pass' transforms to the root should be shifted by this amount.
444 gfx::Transform transform
;
445 transform
.Translate(9.0, 9.0);
447 // The first contributing surface has a translation of 5, 6.
448 gfx::Transform
five_six(1, 0, 0, 1, 5, 6);
450 // The second contributing surface has a translation of 7, 8.
451 gfx::Transform
seven_eight(1, 0, 0, 1, 7, 8);
453 EXPECT_TRANSFORMATION_MATRIX_EQ(
454 transform
* five_six
, frame
.render_passes
[1]->transform_to_root_target
);
455 EXPECT_TRANSFORMATION_MATRIX_EQ(
456 transform
* seven_eight
,
457 frame
.render_passes
[2]->transform_to_root_target
);
459 host_impl_
->DrawLayers(&frame
, base::TimeTicks::Now());
460 host_impl_
->DidDrawAllLayers(frame
);
463 class DelegatedRendererLayerImplTestOwnSurface
464 : public DelegatedRendererLayerImplTestSimple
{
466 DelegatedRendererLayerImplTestOwnSurface()
467 : DelegatedRendererLayerImplTestSimple() {
468 delegated_renderer_layer_
->SetHasRenderSurface(true);
472 TEST_F(DelegatedRendererLayerImplTestOwnSurface
, AddsRenderPasses
) {
473 LayerTreeHostImpl::FrameData frame
;
474 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
476 // Each non-DelegatedRendererLayer added one RenderPass. The
477 // DelegatedRendererLayer added two contributing passes and its owned surface
479 ASSERT_EQ(6u, frame
.render_passes
.size());
481 // The DelegatedRendererLayer should have added its contributing RenderPasses
483 EXPECT_EQ(4, frame
.render_passes
[1]->id
.layer_id
);
484 EXPECT_EQ(1, frame
.render_passes
[1]->id
.index
);
485 EXPECT_EQ(4, frame
.render_passes
[2]->id
.layer_id
);
486 EXPECT_EQ(2, frame
.render_passes
[2]->id
.index
);
487 // The DelegatedRendererLayer should have added a RenderPass for its surface
489 EXPECT_EQ(4, frame
.render_passes
[1]->id
.layer_id
);
490 EXPECT_EQ(0, frame
.render_passes
[3]->id
.index
);
491 // And all other RenderPasses should be non-delegated.
492 EXPECT_NE(4, frame
.render_passes
[0]->id
.layer_id
);
493 EXPECT_EQ(0, frame
.render_passes
[0]->id
.index
);
494 EXPECT_NE(4, frame
.render_passes
[4]->id
.layer_id
);
495 EXPECT_EQ(0, frame
.render_passes
[4]->id
.index
);
496 EXPECT_NE(4, frame
.render_passes
[5]->id
.layer_id
);
497 EXPECT_EQ(0, frame
.render_passes
[5]->id
.index
);
499 // The DelegatedRendererLayer should have added its RenderPasses to the frame
501 EXPECT_EQ(gfx::Rect(6, 6, 6, 6).ToString(),
502 frame
.render_passes
[1]->output_rect
.ToString());
503 EXPECT_EQ(gfx::Rect(7, 7, 7, 7).ToString(),
504 frame
.render_passes
[2]->output_rect
.ToString());
506 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
507 host_impl_
->DidDrawAllLayers(frame
);
510 TEST_F(DelegatedRendererLayerImplTestOwnSurface
,
511 AddsQuadsToContributingRenderPasses
) {
512 LayerTreeHostImpl::FrameData frame
;
513 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
515 // Each non-DelegatedRendererLayer added one RenderPass. The
516 // DelegatedRendererLayer added two contributing passes and its owned surface
518 ASSERT_EQ(6u, frame
.render_passes
.size());
520 // The DelegatedRendererLayer should have added its contributing RenderPasses
522 EXPECT_EQ(4, frame
.render_passes
[1]->id
.layer_id
);
523 EXPECT_EQ(1, frame
.render_passes
[1]->id
.index
);
524 EXPECT_EQ(4, frame
.render_passes
[2]->id
.layer_id
);
525 EXPECT_EQ(2, frame
.render_passes
[2]->id
.index
);
527 // The DelegatedRendererLayer should have added copies of its quads to
528 // contributing RenderPasses.
529 ASSERT_EQ(1u, frame
.render_passes
[1]->quad_list
.size());
530 EXPECT_EQ(gfx::Rect(0, 0, 6, 6).ToString(),
531 frame
.render_passes
[1]->quad_list
.front()->rect
.ToString());
533 // Verify it added the right quads.
534 ASSERT_EQ(2u, frame
.render_passes
[2]->quad_list
.size());
536 EXPECT_EQ(gfx::Rect(0, 0, 7, 7).ToString(),
537 frame
.render_passes
[2]->quad_list
.front()->rect
.ToString());
538 EXPECT_EQ(gfx::Rect(6, 6, 6, 6).ToString(),
539 frame
.render_passes
[2]->quad_list
.ElementAt(1)->rect
.ToString());
540 ASSERT_EQ(1u, frame
.render_passes
[1]->quad_list
.size());
541 EXPECT_EQ(gfx::Rect(0, 0, 6, 6).ToString(),
542 frame
.render_passes
[1]->quad_list
.front()->rect
.ToString());
544 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
545 host_impl_
->DidDrawAllLayers(frame
);
548 TEST_F(DelegatedRendererLayerImplTestOwnSurface
, AddsQuadsToTargetRenderPass
) {
549 LayerTreeHostImpl::FrameData frame
;
550 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
552 // Each non-DelegatedRendererLayer added one RenderPass. The
553 // DelegatedRendererLayer added two contributing passes and its owned surface
555 ASSERT_EQ(6u, frame
.render_passes
.size());
557 // The layer's target is the RenderPass owned by itself.
558 EXPECT_EQ(RenderPassId(4, 0), frame
.render_passes
[3]->id
);
560 // The DelegatedRendererLayer should have added copies of quads in its root
561 // RenderPass to its target RenderPass.
562 // The layer_after also adds one quad.
563 ASSERT_EQ(1u, frame
.render_passes
[3]->quad_list
.size());
565 // Verify it added the right quads.
566 EXPECT_EQ(gfx::Rect(7, 7, 7, 7).ToString(),
567 frame
.render_passes
[3]->quad_list
.front()->rect
.ToString());
569 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
570 host_impl_
->DidDrawAllLayers(frame
);
573 TEST_F(DelegatedRendererLayerImplTestOwnSurface
,
574 QuadsFromRootRenderPassAreNotModifiedForTheTarget
) {
575 LayerTreeHostImpl::FrameData frame
;
576 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
578 // Each non-DelegatedRendererLayer added one RenderPass. The
579 // DelegatedRendererLayer added two contributing passes and its owned surface
581 ASSERT_EQ(6u, frame
.render_passes
.size());
583 // Because the DelegatedRendererLayer owns a RenderSurfaceImpl, its root
584 // RenderPass' quads do not need to be translated at all.
585 EXPECT_TRANSFORMATION_MATRIX_EQ(
587 frame
.render_passes
[3]->quad_list
.front()->quadTransform());
589 // Quads from non-root RenderPasses should not be shifted either.
590 ASSERT_EQ(2u, frame
.render_passes
[2]->quad_list
.size());
592 EXPECT_TRANSFORMATION_MATRIX_EQ(
594 frame
.render_passes
[2]->quad_list
.front()->quadTransform());
595 EXPECT_TRANSFORMATION_MATRIX_EQ(
597 frame
.render_passes
[2]->quad_list
.ElementAt(1)->quadTransform());
598 ASSERT_EQ(1u, frame
.render_passes
[1]->quad_list
.size());
599 EXPECT_TRANSFORMATION_MATRIX_EQ(
601 frame
.render_passes
[1]->quad_list
.front()->quadTransform());
603 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
604 host_impl_
->DidDrawAllLayers(frame
);
607 class DelegatedRendererLayerImplTestTransform
608 : public DelegatedRendererLayerImplTest
{
610 DelegatedRendererLayerImplTestTransform()
611 : root_delegated_render_pass_is_clipped_(false),
612 delegated_device_scale_factor_(2.f
) {}
615 host_impl_
->SetDeviceScaleFactor(2.f
);
617 scoped_ptr
<LayerImpl
> root_layer
= LayerImpl::Create(
618 host_impl_
->active_tree(), 1);
619 scoped_ptr
<FakeDelegatedRendererLayerImpl
> delegated_renderer_layer
=
620 FakeDelegatedRendererLayerImpl::Create(host_impl_
->active_tree(), 2);
622 host_impl_
->SetViewportSize(gfx::Size(200, 200));
623 root_layer
->SetBounds(gfx::Size(100, 100));
624 root_layer
->SetHasRenderSurface(true);
626 delegated_renderer_layer
->SetPosition(gfx::Point(20, 20));
627 delegated_renderer_layer
->SetBounds(gfx::Size(75, 75));
628 delegated_renderer_layer
->SetContentBounds(gfx::Size(75, 75));
629 delegated_renderer_layer
->SetDrawsContent(true);
630 gfx::Transform transform
;
631 transform
.Scale(2.0, 2.0);
632 transform
.Translate(8.0, 8.0);
633 delegated_renderer_layer
->SetTransform(transform
);
635 RenderPassList delegated_render_passes
;
637 gfx::Size
child_pass_content_bounds(7, 7);
638 gfx::Rect
child_pass_rect(20, 20, 7, 7);
639 gfx::Transform child_pass_transform
;
640 child_pass_transform
.Scale(0.8f
, 0.8f
);
641 child_pass_transform
.Translate(9.0, 9.0);
642 gfx::Rect
child_pass_clip_rect(21, 21, 3, 3);
643 bool child_pass_clipped
= false;
646 TestRenderPass
* pass
= AddRenderPass(&delegated_render_passes
,
650 SharedQuadState
* shared_quad_state
=
651 pass
->CreateAndAppendSharedQuadState();
652 shared_quad_state
->SetAll(child_pass_transform
,
653 child_pass_content_bounds
,
655 child_pass_clip_rect
,
658 SkXfermode::kSrcOver_Mode
,
661 SolidColorDrawQuad
* color_quad
;
662 color_quad
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
663 color_quad
->SetNew(shared_quad_state
,
664 gfx::Rect(20, 20, 3, 7),
665 gfx::Rect(20, 20, 3, 7),
669 color_quad
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
670 color_quad
->SetNew(shared_quad_state
,
671 gfx::Rect(23, 20, 4, 7),
672 gfx::Rect(23, 20, 4, 7),
677 gfx::Size
root_pass_content_bounds(100, 100);
678 gfx::Rect
root_pass_rect(0, 0, 100, 100);
679 gfx::Transform root_pass_transform
;
680 root_pass_transform
.Scale(1.5, 1.5);
681 root_pass_transform
.Translate(7.0, 7.0);
682 gfx::Rect
root_pass_clip_rect(10, 10, 35, 35);
683 bool root_pass_clipped
= root_delegated_render_pass_is_clipped_
;
685 TestRenderPass
* pass
= AddRenderPass(&delegated_render_passes
,
689 SharedQuadState
* shared_quad_state
= pass
->CreateAndAppendSharedQuadState();
690 shared_quad_state
->SetAll(root_pass_transform
,
691 root_pass_content_bounds
,
696 SkXfermode::kSrcOver_Mode
,
699 RenderPassDrawQuad
* render_pass_quad
=
700 pass
->CreateAndAppendDrawQuad
<RenderPassDrawQuad
>();
701 render_pass_quad
->SetNew(shared_quad_state
,
702 gfx::Rect(5, 5, 7, 7), // quad_rect
703 gfx::Rect(5, 5, 7, 7), // visible_rect
704 RenderPassId(10, 7), // render_pass_id
705 0, // mask_resource_id
706 gfx::Vector2dF(), // mask_uv_scale
707 gfx::Size(), // mask_texture_size
708 FilterOperations(), // filters
709 gfx::Vector2dF(), // filters_scale
710 FilterOperations()); // background_filters
712 SolidColorDrawQuad
* color_quad
;
713 color_quad
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
714 color_quad
->SetNew(shared_quad_state
,
715 gfx::Rect(0, 0, 10, 10),
716 gfx::Rect(0, 0, 10, 10),
720 color_quad
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
721 color_quad
->SetNew(shared_quad_state
,
722 gfx::Rect(0, 10, 10, 10),
723 gfx::Rect(0, 10, 10, 10),
727 color_quad
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
728 color_quad
->SetNew(shared_quad_state
,
729 gfx::Rect(10, 0, 10, 10),
730 gfx::Rect(10, 0, 10, 10),
734 color_quad
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
735 color_quad
->SetNew(shared_quad_state
,
736 gfx::Rect(10, 10, 10, 10),
737 gfx::Rect(10, 10, 10, 10),
741 delegated_renderer_layer
->SetFrameDataForRenderPasses(
742 delegated_device_scale_factor_
, delegated_render_passes
);
744 root_layer_
= root_layer
.get();
745 delegated_renderer_layer_
= delegated_renderer_layer
.get();
747 root_layer
->AddChild(delegated_renderer_layer
.Pass());
748 host_impl_
->active_tree()->SetRootLayer(root_layer
.Pass());
751 void VerifyRenderPasses(
752 const LayerTreeHostImpl::FrameData
& frame
,
753 size_t num_render_passes
,
754 const SharedQuadState
** root_delegated_shared_quad_state
,
755 const SharedQuadState
** contrib_delegated_shared_quad_state
) {
756 ASSERT_EQ(num_render_passes
, frame
.render_passes
.size());
757 // The contributing render pass in the DelegatedRendererLayer.
758 EXPECT_EQ(2, frame
.render_passes
[0]->id
.layer_id
);
759 EXPECT_EQ(1, frame
.render_passes
[0]->id
.index
);
760 // The root render pass.
761 EXPECT_EQ(1, frame
.render_passes
.back()->id
.layer_id
);
762 EXPECT_EQ(0, frame
.render_passes
.back()->id
.index
);
764 const QuadList
& contrib_delegated_quad_list
=
765 frame
.render_passes
[0]->quad_list
;
766 ASSERT_EQ(2u, contrib_delegated_quad_list
.size());
768 const QuadList
& root_delegated_quad_list
=
769 frame
.render_passes
[1]->quad_list
;
770 ASSERT_EQ(5u, root_delegated_quad_list
.size());
772 // All quads in a render pass should share the same state.
773 *contrib_delegated_shared_quad_state
=
774 contrib_delegated_quad_list
.front()->shared_quad_state
;
775 EXPECT_EQ(*contrib_delegated_shared_quad_state
,
776 contrib_delegated_quad_list
.ElementAt(1)->shared_quad_state
);
778 *root_delegated_shared_quad_state
=
779 root_delegated_quad_list
.front()->shared_quad_state
;
780 EXPECT_EQ(*root_delegated_shared_quad_state
,
781 root_delegated_quad_list
.ElementAt(1)->shared_quad_state
);
782 EXPECT_EQ(*root_delegated_shared_quad_state
,
783 root_delegated_quad_list
.ElementAt(2)->shared_quad_state
);
784 EXPECT_EQ(*root_delegated_shared_quad_state
,
785 root_delegated_quad_list
.ElementAt(3)->shared_quad_state
);
786 EXPECT_EQ(*root_delegated_shared_quad_state
,
787 root_delegated_quad_list
.ElementAt(4)->shared_quad_state
);
789 EXPECT_NE(*contrib_delegated_shared_quad_state
,
790 *root_delegated_shared_quad_state
);
794 LayerImpl
* root_layer_
;
795 DelegatedRendererLayerImpl
* delegated_renderer_layer_
;
796 bool root_delegated_render_pass_is_clipped_
;
797 float delegated_device_scale_factor_
;
800 TEST_F(DelegatedRendererLayerImplTestTransform
, QuadsUnclipped_NoSurface
) {
801 root_delegated_render_pass_is_clipped_
= false;
804 LayerTreeHostImpl::FrameData frame
;
805 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
807 const SharedQuadState
* root_delegated_shared_quad_state
= nullptr;
808 const SharedQuadState
* contrib_delegated_shared_quad_state
= nullptr;
812 &root_delegated_shared_quad_state
,
813 &contrib_delegated_shared_quad_state
);
815 // When the quads don't have a clip of their own, the clip rect is set to
816 // the drawable_content_rect of the delegated renderer layer.
817 EXPECT_EQ(delegated_renderer_layer_
->drawable_content_rect().ToString(),
818 root_delegated_shared_quad_state
->clip_rect
.ToString());
820 // Even though the quads in the root pass have no clip of their own, they
821 // inherit the clip rect from the delegated renderer layer if it does not
823 EXPECT_TRUE(root_delegated_shared_quad_state
->is_clipped
);
825 gfx::Transform expected
;
826 // Device scale factor.
827 expected
.Scale(2.0, 2.0);
828 // This is the transform from the layer's space to its target.
829 expected
.Translate(20, 20);
830 expected
.Scale(2.0, 2.0);
831 expected
.Translate(8.0, 8.0);
832 // This is the transform within the source frame.
833 // Inverse device scale factor to go from physical space to layer space.
834 expected
.Scale(0.5, 0.5);
835 expected
.Scale(1.5, 1.5);
836 expected
.Translate(7.0, 7.0);
837 EXPECT_TRANSFORMATION_MATRIX_EQ(
838 expected
, root_delegated_shared_quad_state
->content_to_target_transform
);
840 // The contributing render pass should not be transformed from its input.
841 EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(),
842 contrib_delegated_shared_quad_state
->clip_rect
.ToString());
843 EXPECT_FALSE(contrib_delegated_shared_quad_state
->is_clipped
);
844 expected
.MakeIdentity();
845 expected
.Scale(0.8f
, 0.8f
);
846 expected
.Translate(9.0, 9.0);
847 EXPECT_TRANSFORMATION_MATRIX_EQ(
849 contrib_delegated_shared_quad_state
->content_to_target_transform
);
851 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
852 host_impl_
->DidDrawAllLayers(frame
);
855 TEST_F(DelegatedRendererLayerImplTestTransform
, QuadsClipped_NoSurface
) {
856 root_delegated_render_pass_is_clipped_
= true;
859 LayerTreeHostImpl::FrameData frame
;
860 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
862 const SharedQuadState
* root_delegated_shared_quad_state
= nullptr;
863 const SharedQuadState
* contrib_delegated_shared_quad_state
= nullptr;
867 &root_delegated_shared_quad_state
,
868 &contrib_delegated_shared_quad_state
);
870 // Since the quads have a clip_rect it should be modified by delegated
871 // renderer layer's draw_transform.
872 // The position of the resulting clip_rect is:
873 // (clip rect position (10) * inverse dsf (1/2) + translate (8)) *
874 // layer scale (2) + layer position (20) = 46
875 // The device scale is 2, so everything gets doubled, giving 92.
877 // The size is 35x35 scaled by the device scale.
878 EXPECT_EQ(gfx::Rect(92, 92, 70, 70).ToString(),
879 root_delegated_shared_quad_state
->clip_rect
.ToString());
881 // The quads had a clip and it should be preserved.
882 EXPECT_TRUE(root_delegated_shared_quad_state
->is_clipped
);
884 gfx::Transform expected
;
885 // Device scale factor.
886 expected
.Scale(2.0, 2.0);
887 // This is the transform from the layer's space to its target.
888 expected
.Translate(20, 20);
889 expected
.Scale(2.0, 2.0);
890 expected
.Translate(8.0, 8.0);
891 // This is the transform within the source frame.
892 // Inverse device scale factor to go from physical space to layer space.
893 expected
.Scale(0.5, 0.5);
894 expected
.Scale(1.5, 1.5);
895 expected
.Translate(7.0, 7.0);
896 EXPECT_TRANSFORMATION_MATRIX_EQ(
897 expected
, root_delegated_shared_quad_state
->content_to_target_transform
);
899 // The contributing render pass should not be transformed from its input.
900 EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(),
901 contrib_delegated_shared_quad_state
->clip_rect
.ToString());
902 EXPECT_FALSE(contrib_delegated_shared_quad_state
->is_clipped
);
903 expected
.MakeIdentity();
904 expected
.Scale(0.8f
, 0.8f
);
905 expected
.Translate(9.0, 9.0);
906 EXPECT_TRANSFORMATION_MATRIX_EQ(
908 contrib_delegated_shared_quad_state
->content_to_target_transform
);
910 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
911 host_impl_
->DidDrawAllLayers(frame
);
914 TEST_F(DelegatedRendererLayerImplTestTransform
, QuadsUnclipped_Surface
) {
915 root_delegated_render_pass_is_clipped_
= false;
918 delegated_renderer_layer_
->SetHasRenderSurface(true);
920 LayerTreeHostImpl::FrameData frame
;
921 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
923 const SharedQuadState
* root_delegated_shared_quad_state
= nullptr;
924 const SharedQuadState
* contrib_delegated_shared_quad_state
= nullptr;
928 &root_delegated_shared_quad_state
,
929 &contrib_delegated_shared_quad_state
);
931 // When the layer owns a surface, then its translation is not part of its
932 // draw transform, but its scale is.
933 EXPECT_EQ(gfx::Rect(20, 20, 70, 70).ToString(),
934 root_delegated_shared_quad_state
->clip_rect
.ToString());
936 // Since the layer owns a surface it doesn't need to clip its quads, so
937 // unclipped quads remain unclipped.
938 EXPECT_FALSE(root_delegated_shared_quad_state
->is_clipped
);
940 gfx::Transform expected
;
941 // This is the transform within the source frame scaled by the delegated
942 // render layer transform.
943 expected
.Scale(3.0, 3.0);
944 expected
.Translate(7.0, 7.0);
945 EXPECT_TRANSFORMATION_MATRIX_EQ(
946 expected
, root_delegated_shared_quad_state
->content_to_target_transform
);
948 // The contributing render pass should not be transformed from its input.
949 EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(),
950 contrib_delegated_shared_quad_state
->clip_rect
.ToString());
951 EXPECT_FALSE(contrib_delegated_shared_quad_state
->is_clipped
);
952 expected
.MakeIdentity();
953 expected
.Scale(0.8f
, 0.8f
);
954 expected
.Translate(9.0, 9.0);
955 EXPECT_TRANSFORMATION_MATRIX_EQ(
957 contrib_delegated_shared_quad_state
->content_to_target_transform
);
959 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
960 host_impl_
->DidDrawAllLayers(frame
);
963 TEST_F(DelegatedRendererLayerImplTestTransform
, QuadsClipped_Surface
) {
964 root_delegated_render_pass_is_clipped_
= true;
967 delegated_renderer_layer_
->SetHasRenderSurface(true);
969 LayerTreeHostImpl::FrameData frame
;
970 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
972 const SharedQuadState
* root_delegated_shared_quad_state
= nullptr;
973 const SharedQuadState
* contrib_delegated_shared_quad_state
= nullptr;
977 &root_delegated_shared_quad_state
,
978 &contrib_delegated_shared_quad_state
);
980 // When the layer owns a surface, then its translation is not part of its
981 // draw transform, but its scale is.
982 EXPECT_EQ(gfx::Rect(20, 20, 70, 70).ToString(),
983 root_delegated_shared_quad_state
->clip_rect
.ToString());
985 // The quads had a clip and it should be preserved.
986 EXPECT_TRUE(root_delegated_shared_quad_state
->is_clipped
);
988 gfx::Transform expected
;
989 // This is the transform within the source frame scaled by the delegated
990 // render layer transform.
991 expected
.Scale(3.0, 3.0);
992 expected
.Translate(7.0, 7.0);
993 EXPECT_TRANSFORMATION_MATRIX_EQ(
994 expected
, root_delegated_shared_quad_state
->content_to_target_transform
);
996 // The contributing render pass should not be transformed from its input.
997 EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(),
998 contrib_delegated_shared_quad_state
->clip_rect
.ToString());
999 EXPECT_FALSE(contrib_delegated_shared_quad_state
->is_clipped
);
1000 expected
.MakeIdentity();
1001 expected
.Scale(0.8f
, 0.8f
);
1002 expected
.Translate(9.0, 9.0);
1003 EXPECT_TRANSFORMATION_MATRIX_EQ(
1005 contrib_delegated_shared_quad_state
->content_to_target_transform
);
1007 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
1008 host_impl_
->DidDrawAllLayers(frame
);
1011 TEST_F(DelegatedRendererLayerImplTestTransform
, MismatchedDeviceScaleFactor
) {
1012 root_delegated_render_pass_is_clipped_
= true;
1013 delegated_device_scale_factor_
= 1.3f
;
1017 LayerTreeHostImpl::FrameData frame
;
1018 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
1020 const SharedQuadState
* root_delegated_shared_quad_state
= nullptr;
1021 const SharedQuadState
* contrib_delegated_shared_quad_state
= nullptr;
1022 VerifyRenderPasses(frame
,
1024 &root_delegated_shared_quad_state
,
1025 &contrib_delegated_shared_quad_state
);
1027 // The parent tree's device scale factor is 2.0, but the child has submitted a
1028 // frame with a device scale factor of 1.3. Absent any better option, the
1029 // only thing we can do is scale from 1.3 -> 2.0.
1031 gfx::Transform expected
;
1032 // Device scale factor (from parent).
1033 expected
.Scale(2.0, 2.0);
1034 // This is the transform from the layer's space to its target.
1035 expected
.Translate(20, 20);
1036 expected
.Scale(2.0, 2.0);
1037 expected
.Translate(8.0, 8.0);
1038 // This is the transform within the source frame.
1039 // Inverse device scale factor (from child).
1040 expected
.Scale(1.0f
/ 1.3f
, 1.0f
/ 1.3f
);
1041 expected
.Scale(1.5, 1.5);
1042 expected
.Translate(7.0, 7.0);
1043 EXPECT_TRANSFORMATION_MATRIX_EQ(
1044 expected
, root_delegated_shared_quad_state
->content_to_target_transform
);
1046 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
1047 host_impl_
->DidDrawAllLayers(frame
);
1050 class DelegatedRendererLayerImplTestClip
1051 : public DelegatedRendererLayerImplTest
{
1054 scoped_ptr
<LayerImpl
> root_layer
=
1055 LayerImpl::Create(host_impl_
->active_tree(), 1);
1056 scoped_ptr
<FakeDelegatedRendererLayerImpl
> delegated_renderer_layer
=
1057 FakeDelegatedRendererLayerImpl::Create(host_impl_
->active_tree(), 2);
1058 scoped_ptr
<LayerImpl
> clip_layer
=
1059 LayerImpl::Create(host_impl_
->active_tree(), 3);
1060 scoped_ptr
<LayerImpl
> origin_layer
=
1061 LayerImpl::Create(host_impl_
->active_tree(), 4);
1063 host_impl_
->SetViewportSize(gfx::Size(100, 100));
1064 root_layer
->SetBounds(gfx::Size(100, 100));
1065 root_layer
->SetHasRenderSurface(true);
1067 delegated_renderer_layer
->SetPosition(gfx::Point(20, 20));
1068 delegated_renderer_layer
->SetBounds(gfx::Size(50, 50));
1069 delegated_renderer_layer
->SetContentBounds(gfx::Size(50, 50));
1070 delegated_renderer_layer
->SetDrawsContent(true);
1072 RenderPassList delegated_render_passes
;
1074 gfx::Size
child_pass_content_bounds(7, 7);
1075 gfx::Rect
child_pass_rect(20, 20, 7, 7);
1076 gfx::Transform child_pass_transform
;
1077 gfx::Rect
child_pass_clip_rect(21, 21, 3, 3);
1078 bool child_pass_clipped
= false;
1081 TestRenderPass
* pass
= AddRenderPass(&delegated_render_passes
,
1082 RenderPassId(10, 7),
1085 SharedQuadState
* shared_quad_state
=
1086 pass
->CreateAndAppendSharedQuadState();
1087 shared_quad_state
->SetAll(child_pass_transform
,
1088 child_pass_content_bounds
,
1090 child_pass_clip_rect
,
1093 SkXfermode::kSrcOver_Mode
,
1096 SolidColorDrawQuad
* color_quad
;
1097 color_quad
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1098 color_quad
->SetNew(shared_quad_state
,
1099 gfx::Rect(20, 20, 3, 7),
1100 gfx::Rect(20, 20, 3, 7),
1104 color_quad
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1105 color_quad
->SetNew(shared_quad_state
,
1106 gfx::Rect(23, 20, 4, 7),
1107 gfx::Rect(23, 20, 4, 7),
1112 gfx::Size
root_pass_content_bounds(50, 50);
1113 gfx::Rect
root_pass_rect(0, 0, 50, 50);
1114 gfx::Transform root_pass_transform
;
1115 gfx::Rect
root_pass_clip_rect(5, 5, 40, 40);
1116 bool root_pass_clipped
= root_delegated_render_pass_is_clipped_
;
1118 TestRenderPass
* pass
= AddRenderPass(&delegated_render_passes
,
1122 SharedQuadState
* shared_quad_state
= pass
->CreateAndAppendSharedQuadState();
1123 shared_quad_state
->SetAll(root_pass_transform
,
1124 root_pass_content_bounds
,
1126 root_pass_clip_rect
,
1129 SkXfermode::kSrcOver_Mode
,
1132 RenderPassDrawQuad
* render_pass_quad
=
1133 pass
->CreateAndAppendDrawQuad
<RenderPassDrawQuad
>();
1134 render_pass_quad
->SetNew(shared_quad_state
,
1135 gfx::Rect(5, 5, 7, 7), // quad_rect
1136 gfx::Rect(5, 5, 7, 7), // visible_quad_rect
1137 RenderPassId(10, 7), // render_pass_id
1138 0, // mask_resource_id
1139 gfx::Vector2dF(), // mask_uv_scale
1140 gfx::Size(), // mask_texture_size,
1141 FilterOperations(), // filters
1142 gfx::Vector2dF(), // filters_scale
1143 FilterOperations()); // background_filters
1145 SolidColorDrawQuad
* color_quad
;
1146 color_quad
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1147 color_quad
->SetNew(shared_quad_state
,
1148 gfx::Rect(0, 0, 10, 10),
1149 gfx::Rect(0, 0, 10, 10),
1153 color_quad
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1154 color_quad
->SetNew(shared_quad_state
,
1155 gfx::Rect(0, 10, 10, 10),
1156 gfx::Rect(0, 10, 10, 10),
1160 color_quad
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1161 color_quad
->SetNew(shared_quad_state
,
1162 gfx::Rect(10, 0, 10, 10),
1163 gfx::Rect(10, 0, 10, 10),
1167 color_quad
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1168 color_quad
->SetNew(shared_quad_state
,
1169 gfx::Rect(10, 10, 10, 10),
1170 gfx::Rect(10, 10, 10, 10),
1174 delegated_renderer_layer
->SetFrameDataForRenderPasses(
1175 1.f
, delegated_render_passes
);
1177 root_layer_
= root_layer
.get();
1178 delegated_renderer_layer_
= delegated_renderer_layer
.get();
1180 if (clip_delegated_renderer_layer_
) {
1181 gfx::Rect
clip_rect(21, 27, 23, 21);
1183 clip_layer
->SetPosition(clip_rect
.origin());
1184 clip_layer
->SetBounds(clip_rect
.size());
1185 clip_layer
->SetContentBounds(clip_rect
.size());
1186 clip_layer
->SetMasksToBounds(true);
1188 origin_layer
->SetPosition(
1189 gfx::PointAtOffsetFromOrigin(-clip_rect
.OffsetFromOrigin()));
1191 origin_layer
->AddChild(delegated_renderer_layer
.Pass());
1192 clip_layer
->AddChild(origin_layer
.Pass());
1193 root_layer
->AddChild(clip_layer
.Pass());
1195 root_layer
->AddChild(delegated_renderer_layer
.Pass());
1198 host_impl_
->active_tree()->SetRootLayer(root_layer
.Pass());
1202 LayerImpl
* root_layer_
;
1203 DelegatedRendererLayerImpl
* delegated_renderer_layer_
;
1204 bool root_delegated_render_pass_is_clipped_
;
1205 bool clip_delegated_renderer_layer_
;
1208 TEST_F(DelegatedRendererLayerImplTestClip
,
1209 QuadsUnclipped_LayerUnclipped_NoSurface
) {
1210 root_delegated_render_pass_is_clipped_
= false;
1211 clip_delegated_renderer_layer_
= false;
1214 LayerTreeHostImpl::FrameData frame
;
1215 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
1217 ASSERT_EQ(2u, frame
.render_passes
.size());
1218 const QuadList
& contrib_delegated_quad_list
=
1219 frame
.render_passes
[0]->quad_list
;
1220 ASSERT_EQ(2u, contrib_delegated_quad_list
.size());
1221 const QuadList
& root_delegated_quad_list
= frame
.render_passes
[1]->quad_list
;
1222 ASSERT_EQ(5u, root_delegated_quad_list
.size());
1223 const SharedQuadState
* root_delegated_shared_quad_state
=
1224 root_delegated_quad_list
.front()->shared_quad_state
;
1226 // When the quads don't have a clip of their own, the clip rect is set to
1227 // the drawable_content_rect of the delegated renderer layer.
1228 EXPECT_EQ(gfx::Rect(20, 20, 50, 50).ToString(),
1229 root_delegated_shared_quad_state
->clip_rect
.ToString());
1230 // Quads are clipped to the delegated renderer layer.
1231 EXPECT_TRUE(root_delegated_shared_quad_state
->is_clipped
);
1233 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
1234 host_impl_
->DidDrawAllLayers(frame
);
1237 TEST_F(DelegatedRendererLayerImplTestClip
,
1238 QuadsClipped_LayerUnclipped_NoSurface
) {
1239 root_delegated_render_pass_is_clipped_
= true;
1240 clip_delegated_renderer_layer_
= false;
1243 LayerTreeHostImpl::FrameData frame
;
1244 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
1246 ASSERT_EQ(2u, frame
.render_passes
.size());
1247 const QuadList
& contrib_delegated_quad_list
=
1248 frame
.render_passes
[0]->quad_list
;
1249 ASSERT_EQ(2u, contrib_delegated_quad_list
.size());
1250 const QuadList
& root_delegated_quad_list
=
1251 frame
.render_passes
[1]->quad_list
;
1252 ASSERT_EQ(5u, root_delegated_quad_list
.size());
1253 const SharedQuadState
* root_delegated_shared_quad_state
=
1254 root_delegated_quad_list
.front()->shared_quad_state
;
1256 // When the quads have a clip of their own, it is used.
1257 EXPECT_EQ(gfx::Rect(25, 25, 40, 40).ToString(),
1258 root_delegated_shared_quad_state
->clip_rect
.ToString());
1259 // Quads came with a clip rect.
1260 EXPECT_TRUE(root_delegated_shared_quad_state
->is_clipped
);
1262 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
1263 host_impl_
->DidDrawAllLayers(frame
);
1266 TEST_F(DelegatedRendererLayerImplTestClip
,
1267 QuadsUnclipped_LayerClipped_NoSurface
) {
1268 root_delegated_render_pass_is_clipped_
= false;
1269 clip_delegated_renderer_layer_
= true;
1272 LayerTreeHostImpl::FrameData frame
;
1273 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
1275 ASSERT_EQ(2u, frame
.render_passes
.size());
1276 const QuadList
& contrib_delegated_quad_list
=
1277 frame
.render_passes
[0]->quad_list
;
1278 ASSERT_EQ(2u, contrib_delegated_quad_list
.size());
1279 const QuadList
& root_delegated_quad_list
= frame
.render_passes
[1]->quad_list
;
1280 ASSERT_EQ(5u, root_delegated_quad_list
.size());
1281 const SharedQuadState
* root_delegated_shared_quad_state
=
1282 root_delegated_quad_list
.front()->shared_quad_state
;
1284 // When the quads don't have a clip of their own, the clip rect is set to
1285 // the drawable_content_rect of the delegated renderer layer. When the layer
1286 // is clipped, that should be seen in the quads' clip_rect.
1287 EXPECT_EQ(gfx::Rect(21, 27, 23, 21).ToString(),
1288 root_delegated_shared_quad_state
->clip_rect
.ToString());
1289 // Quads are clipped to the delegated renderer layer.
1290 EXPECT_TRUE(root_delegated_shared_quad_state
->is_clipped
);
1292 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
1293 host_impl_
->DidDrawAllLayers(frame
);
1296 TEST_F(DelegatedRendererLayerImplTestClip
,
1297 QuadsClipped_LayerClipped_NoSurface
) {
1298 root_delegated_render_pass_is_clipped_
= true;
1299 clip_delegated_renderer_layer_
= true;
1302 LayerTreeHostImpl::FrameData frame
;
1303 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
1305 ASSERT_EQ(2u, frame
.render_passes
.size());
1306 const QuadList
& contrib_delegated_quad_list
=
1307 frame
.render_passes
[0]->quad_list
;
1308 ASSERT_EQ(2u, contrib_delegated_quad_list
.size());
1309 const QuadList
& root_delegated_quad_list
= frame
.render_passes
[1]->quad_list
;
1310 ASSERT_EQ(5u, root_delegated_quad_list
.size());
1311 const SharedQuadState
* root_delegated_shared_quad_state
=
1312 root_delegated_quad_list
.front()->shared_quad_state
;
1314 // When the quads have a clip of their own, it is used, but it is
1315 // combined with the clip rect of the delegated renderer layer.
1316 EXPECT_EQ(gfx::Rect(25, 27, 19, 21).ToString(),
1317 root_delegated_shared_quad_state
->clip_rect
.ToString());
1318 // Quads came with a clip rect.
1319 EXPECT_TRUE(root_delegated_shared_quad_state
->is_clipped
);
1321 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
1322 host_impl_
->DidDrawAllLayers(frame
);
1325 TEST_F(DelegatedRendererLayerImplTestClip
,
1326 QuadsUnclipped_LayerUnclipped_Surface
) {
1327 root_delegated_render_pass_is_clipped_
= false;
1328 clip_delegated_renderer_layer_
= false;
1331 delegated_renderer_layer_
->SetHasRenderSurface(true);
1333 LayerTreeHostImpl::FrameData frame
;
1334 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
1336 ASSERT_EQ(3u, frame
.render_passes
.size());
1337 const QuadList
& contrib_delegated_quad_list
=
1338 frame
.render_passes
[0]->quad_list
;
1339 ASSERT_EQ(2u, contrib_delegated_quad_list
.size());
1340 const QuadList
& root_delegated_quad_list
= frame
.render_passes
[1]->quad_list
;
1341 ASSERT_EQ(5u, root_delegated_quad_list
.size());
1342 const SharedQuadState
* root_delegated_shared_quad_state
=
1343 root_delegated_quad_list
.front()->shared_quad_state
;
1345 // When the layer owns a surface, the quads don't need to be clipped
1346 // further than they already specify. If they aren't clipped, then their
1347 // clip rect is ignored, and they are not set as clipped.
1348 EXPECT_FALSE(root_delegated_shared_quad_state
->is_clipped
);
1350 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
1351 host_impl_
->DidDrawAllLayers(frame
);
1354 TEST_F(DelegatedRendererLayerImplTestClip
,
1355 QuadsClipped_LayerUnclipped_Surface
) {
1356 root_delegated_render_pass_is_clipped_
= true;
1357 clip_delegated_renderer_layer_
= false;
1360 delegated_renderer_layer_
->SetHasRenderSurface(true);
1362 LayerTreeHostImpl::FrameData frame
;
1363 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
1365 ASSERT_EQ(3u, frame
.render_passes
.size());
1366 const QuadList
& contrib_delegated_quad_list
=
1367 frame
.render_passes
[0]->quad_list
;
1368 ASSERT_EQ(2u, contrib_delegated_quad_list
.size());
1369 const QuadList
& root_delegated_quad_list
= frame
.render_passes
[1]->quad_list
;
1370 ASSERT_EQ(5u, root_delegated_quad_list
.size());
1371 const SharedQuadState
* root_delegated_shared_quad_state
=
1372 root_delegated_quad_list
.front()->shared_quad_state
;
1374 // When the quads have a clip of their own, it is used.
1375 EXPECT_EQ(gfx::Rect(5, 5, 40, 40).ToString(),
1376 root_delegated_shared_quad_state
->clip_rect
.ToString());
1377 // Quads came with a clip rect.
1378 EXPECT_TRUE(root_delegated_shared_quad_state
->is_clipped
);
1380 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
1381 host_impl_
->DidDrawAllLayers(frame
);
1384 TEST_F(DelegatedRendererLayerImplTestClip
,
1385 QuadsUnclipped_LayerClipped_Surface
) {
1386 root_delegated_render_pass_is_clipped_
= false;
1387 clip_delegated_renderer_layer_
= true;
1390 delegated_renderer_layer_
->SetHasRenderSurface(true);
1392 LayerTreeHostImpl::FrameData frame
;
1393 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
1395 ASSERT_EQ(3u, frame
.render_passes
.size());
1396 const QuadList
& contrib_delegated_quad_list
=
1397 frame
.render_passes
[0]->quad_list
;
1398 ASSERT_EQ(2u, contrib_delegated_quad_list
.size());
1399 const QuadList
& root_delegated_quad_list
= frame
.render_passes
[1]->quad_list
;
1400 ASSERT_EQ(5u, root_delegated_quad_list
.size());
1401 const SharedQuadState
* root_delegated_shared_quad_state
=
1402 root_delegated_quad_list
.front()->shared_quad_state
;
1404 // When the layer owns a surface, the quads don't need to be clipped
1405 // further than they already specify. If they aren't clipped, then their
1406 // clip rect is ignored, and they are not set as clipped.
1407 EXPECT_FALSE(root_delegated_shared_quad_state
->is_clipped
);
1409 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
1410 host_impl_
->DidDrawAllLayers(frame
);
1413 TEST_F(DelegatedRendererLayerImplTestClip
, QuadsClipped_LayerClipped_Surface
) {
1414 root_delegated_render_pass_is_clipped_
= true;
1415 clip_delegated_renderer_layer_
= true;
1418 delegated_renderer_layer_
->SetHasRenderSurface(true);
1420 LayerTreeHostImpl::FrameData frame
;
1421 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
1423 ASSERT_EQ(3u, frame
.render_passes
.size());
1424 const QuadList
& contrib_delegated_quad_list
=
1425 frame
.render_passes
[0]->quad_list
;
1426 ASSERT_EQ(2u, contrib_delegated_quad_list
.size());
1427 const QuadList
& root_delegated_quad_list
= frame
.render_passes
[1]->quad_list
;
1428 ASSERT_EQ(5u, root_delegated_quad_list
.size());
1429 const SharedQuadState
* root_delegated_shared_quad_state
=
1430 root_delegated_quad_list
.front()->shared_quad_state
;
1432 // When the quads have a clip of their own, it is used, but it is
1433 // combined with the clip rect of the delegated renderer layer. If the
1434 // layer owns a surface, then it does not have a clip rect of its own.
1435 EXPECT_EQ(gfx::Rect(5, 5, 40, 40).ToString(),
1436 root_delegated_shared_quad_state
->clip_rect
.ToString());
1437 // Quads came with a clip rect.
1438 EXPECT_TRUE(root_delegated_shared_quad_state
->is_clipped
);
1440 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
1441 host_impl_
->DidDrawAllLayers(frame
);
1444 TEST_F(DelegatedRendererLayerImplTest
, InvalidRenderPassDrawQuad
) {
1445 scoped_ptr
<LayerImpl
> root_layer
=
1446 LayerImpl::Create(host_impl_
->active_tree(), 1);
1447 scoped_ptr
<FakeDelegatedRendererLayerImpl
> delegated_renderer_layer
=
1448 FakeDelegatedRendererLayerImpl::Create(host_impl_
->active_tree(), 4);
1450 host_impl_
->SetViewportSize(gfx::Size(100, 100));
1451 root_layer
->SetHasRenderSurface(true);
1453 delegated_renderer_layer
->SetPosition(gfx::Point(3, 3));
1454 delegated_renderer_layer
->SetBounds(gfx::Size(10, 10));
1455 delegated_renderer_layer
->SetContentBounds(gfx::Size(10, 10));
1456 delegated_renderer_layer
->SetDrawsContent(true);
1458 RenderPassList delegated_render_passes
;
1459 TestRenderPass
* pass1
= AddRenderPass(&delegated_render_passes
,
1461 gfx::Rect(0, 0, 10, 10),
1463 AddQuad(pass1
, gfx::Rect(0, 0, 6, 6), 33u);
1465 // This render pass isn't part of the frame.
1466 scoped_ptr
<TestRenderPass
> missing_pass(TestRenderPass::Create());
1467 missing_pass
->SetNew(RenderPassId(9, 7),
1468 gfx::Rect(7, 7, 7, 7),
1469 gfx::Rect(7, 7, 7, 7),
1472 // But a render pass quad refers to it.
1473 AddRenderPassQuad(pass1
, missing_pass
.get());
1475 delegated_renderer_layer
->SetFrameDataForRenderPasses(
1476 1.f
, delegated_render_passes
);
1478 root_layer
->AddChild(delegated_renderer_layer
.Pass());
1479 host_impl_
->active_tree()->SetRootLayer(root_layer
.Pass());
1481 LayerTreeHostImpl::FrameData frame
;
1482 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
1484 // The DelegatedRendererLayerImpl should drop the bad RenderPassDrawQuad.
1485 ASSERT_EQ(1u, frame
.render_passes
.size());
1486 ASSERT_EQ(1u, frame
.render_passes
[0]->quad_list
.size());
1487 EXPECT_EQ(DrawQuad::SOLID_COLOR
,
1488 frame
.render_passes
[0]->quad_list
.front()->material
);
1490 host_impl_
->DrawLayers(&frame
, gfx::FrameTime::Now());
1491 host_impl_
->DidDrawAllLayers(frame
);
1494 TEST_F(DelegatedRendererLayerImplTest
, Occlusion
) {
1495 gfx::Size
layer_size(1000, 1000);
1496 gfx::Size
viewport_size(1000, 1000);
1497 gfx::Rect
quad_screen_rect(211, 300, 400, 500);
1499 gfx::Transform transform
;
1500 transform
.Translate(211.0, 300.0);
1502 LayerTestCommon::LayerImplTest impl
;
1504 FakeDelegatedRendererLayerImpl
* delegated_renderer_layer_impl
=
1505 impl
.AddChildToRoot
<FakeDelegatedRendererLayerImpl
>();
1506 delegated_renderer_layer_impl
->SetBounds(layer_size
);
1507 delegated_renderer_layer_impl
->SetContentBounds(layer_size
);
1508 delegated_renderer_layer_impl
->SetDrawsContent(true);
1510 // Contributing render pass is offset by a transform and holds a quad that
1511 // covers it entirely.
1512 RenderPassList delegated_render_passes
;
1513 // pass2 is just the size of the quad. It contributes to |pass1| with a
1514 // translation of (211,300).
1515 RenderPassId pass2_id
=
1516 delegated_renderer_layer_impl
->FirstContributingRenderPassId();
1517 TestRenderPass
* pass2
= AddRenderPass(&delegated_render_passes
,
1519 gfx::Rect(quad_screen_rect
.size()),
1521 AddQuad(pass2
, gfx::Rect(quad_screen_rect
.size()), SK_ColorRED
);
1522 // |pass1| covers the whole layer.
1523 RenderPassId pass1_id
= RenderPassId(impl
.root_layer()->id(), 0);
1524 TestRenderPass
* pass1
= AddRenderPass(&delegated_render_passes
,
1526 gfx::Rect(layer_size
),
1528 AddRenderPassQuad(pass1
,
1533 SkXfermode::kSrcOver_Mode
);
1534 delegated_renderer_layer_impl
->SetFrameDataForRenderPasses(
1535 1.f
, delegated_render_passes
);
1537 impl
.CalcDrawProps(viewport_size
);
1540 SCOPED_TRACE("No occlusion");
1544 SCOPED_TRACE("Root render pass");
1545 impl
.AppendQuadsForPassWithOcclusion(delegated_renderer_layer_impl
, pass1
,
1547 LayerTestCommon::VerifyQuadsExactlyCoverRect(pass1
->quad_list
,
1549 ASSERT_EQ(1u, pass1
->quad_list
.size());
1550 EXPECT_EQ(DrawQuad::RENDER_PASS
, pass1
->quad_list
.front()->material
);
1553 SCOPED_TRACE("Contributing render pass");
1554 impl
.AppendQuadsForPassWithOcclusion(delegated_renderer_layer_impl
, pass2
,
1556 LayerTestCommon::VerifyQuadsExactlyCoverRect(
1557 pass2
->quad_list
, gfx::Rect(quad_screen_rect
.size()));
1558 ASSERT_EQ(1u, pass2
->quad_list
.size());
1559 EXPECT_EQ(DrawQuad::SOLID_COLOR
, pass2
->quad_list
.front()->material
);
1564 SCOPED_TRACE("Full occlusion");
1566 gfx::Rect
occluded(delegated_renderer_layer_impl
->visible_content_rect());
1568 SCOPED_TRACE("Root render pass");
1569 impl
.AppendQuadsForPassWithOcclusion(delegated_renderer_layer_impl
, pass1
,
1571 LayerTestCommon::VerifyQuadsExactlyCoverRect(pass1
->quad_list
,
1573 EXPECT_EQ(pass1
->quad_list
.size(), 0u);
1576 gfx::Rect
occluded(delegated_renderer_layer_impl
->visible_content_rect());
1578 SCOPED_TRACE("Contributing render pass");
1579 impl
.AppendQuadsForPassWithOcclusion(delegated_renderer_layer_impl
, pass2
,
1581 LayerTestCommon::VerifyQuadsExactlyCoverRect(pass2
->quad_list
,
1583 EXPECT_EQ(pass2
->quad_list
.size(), 0u);
1588 SCOPED_TRACE("Partial occlusion");
1590 gfx::Rect
occlusion_in_root_target(0, 0, 500, 1000);
1592 SCOPED_TRACE("Root render pass");
1593 impl
.AppendQuadsForPassWithOcclusion(delegated_renderer_layer_impl
, pass1
,
1594 occlusion_in_root_target
);
1595 size_t partially_occluded_count
= 0;
1596 LayerTestCommon::VerifyQuadsAreOccluded(pass1
->quad_list
,
1597 occlusion_in_root_target
,
1598 &partially_occluded_count
);
1599 // The layer outputs one quad, which is partially occluded.
1600 EXPECT_EQ(1u, pass1
->quad_list
.size());
1601 EXPECT_EQ(1u, partially_occluded_count
);
1604 gfx::Rect
occlusion_in_root_target(0, 0, 500, 1000);
1605 // Move the occlusion to where it is in the contributing surface.
1606 gfx::Rect occlusion_in_target_of_delegated_quad
=
1607 occlusion_in_root_target
- quad_screen_rect
.OffsetFromOrigin();
1609 SCOPED_TRACE("Contributing render pass");
1610 impl
.AppendQuadsForPassWithOcclusion(delegated_renderer_layer_impl
, pass2
,
1611 occlusion_in_root_target
);
1612 size_t partially_occluded_count
= 0;
1613 LayerTestCommon::VerifyQuadsAreOccluded(
1614 pass2
->quad_list
, occlusion_in_target_of_delegated_quad
,
1615 &partially_occluded_count
);
1616 // The layer outputs one quad, which is partially occluded.
1617 EXPECT_EQ(1u, pass2
->quad_list
.size());
1618 EXPECT_EQ(1u, partially_occluded_count
);
1619 // The quad in the contributing surface is at (211,300) in the root.
1620 // The occlusion extends to 500 in the x-axis, pushing the left of the
1621 // visible part of the quad to 500 - 211 = 300 - 11 inside the quad.
1622 EXPECT_EQ(gfx::Rect(300 - 11, 0, 100 + 11, 500).ToString(),
1623 pass2
->quad_list
.front()->visible_rect
.ToString());
1626 gfx::Rect
occlusion_in_root_target(0, 0, 500, 1000);
1627 // Move the occlusion to where it is in the contributing surface.
1628 gfx::Rect occlusion_in_target_of_delegated_quad
=
1629 occlusion_in_root_target
- quad_screen_rect
.OffsetFromOrigin();
1631 SCOPED_TRACE("Contributing render pass with transformed root");
1633 gfx::Transform layer_transform
;
1634 layer_transform
.Translate(11.0, 0.0);
1635 delegated_renderer_layer_impl
->SetTransform(layer_transform
);
1637 occlusion_in_target_of_delegated_quad
+= gfx::Vector2d(11, 0);
1639 impl
.CalcDrawProps(viewport_size
);
1641 impl
.AppendQuadsForPassWithOcclusion(delegated_renderer_layer_impl
, pass2
,
1642 occlusion_in_root_target
);
1643 size_t partially_occluded_count
= 0;
1644 LayerTestCommon::VerifyQuadsAreOccluded(
1645 pass2
->quad_list
, occlusion_in_target_of_delegated_quad
,
1646 &partially_occluded_count
);
1647 // The layer outputs one quad, which is partially occluded.
1648 EXPECT_EQ(1u, pass2
->quad_list
.size());
1649 EXPECT_EQ(1u, partially_occluded_count
);
1650 // The quad in the contributing surface is at (222,300) in the transformed
1651 // root. The occlusion extends to 500 in the x-axis, pushing the left of
1652 // the visible part of the quad to 500 - 222 = 300 - 22 inside the quad.
1653 EXPECT_EQ(gfx::Rect(300 - 22, 0, 100 + 22, 500).ToString(),
1654 pass2
->quad_list
.front()->visible_rect
.ToString());
1659 TEST_F(DelegatedRendererLayerImplTest
, PushPropertiesTo
) {
1660 gfx::Size
layer_size(1000, 1000);
1662 scoped_ptr
<FakeDelegatedRendererLayerImpl
> delegated_renderer_layer_impl
=
1663 FakeDelegatedRendererLayerImpl::Create(host_impl_
->active_tree(), 5);
1664 delegated_renderer_layer_impl
->SetBounds(layer_size
);
1665 delegated_renderer_layer_impl
->SetContentBounds(layer_size
);
1666 delegated_renderer_layer_impl
->SetDrawsContent(true);
1668 RenderPassList delegated_render_passes
;
1669 // |pass1| covers the whole layer.
1670 RenderPassId pass1_id
= RenderPassId(5, 0);
1671 AddRenderPass(&delegated_render_passes
,
1673 gfx::Rect(layer_size
),
1675 delegated_renderer_layer_impl
->SetFrameDataForRenderPasses(
1676 2.f
, delegated_render_passes
);
1677 EXPECT_EQ(0.5f
, delegated_renderer_layer_impl
->inverse_device_scale_factor());
1679 scoped_ptr
<DelegatedRendererLayerImpl
> other_layer
=
1680 DelegatedRendererLayerImpl::Create(host_impl_
->active_tree(), 6);
1682 delegated_renderer_layer_impl
->PushPropertiesTo(other_layer
.get());
1684 EXPECT_EQ(0.5f
, other_layer
->inverse_device_scale_factor());