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/transform.h"
32 class DelegatedRendererLayerImplTest
: public testing::Test
{
34 DelegatedRendererLayerImplTest()
36 always_impl_thread_and_main_thread_blocked_(&proxy_
) {
37 LayerTreeSettings settings
;
38 settings
.minimum_occlusion_tracking_size
= gfx::Size();
40 host_impl_
.reset(new FakeLayerTreeHostImpl(
41 settings
, &proxy_
, &shared_bitmap_manager_
, &task_graph_runner_
));
42 host_impl_
->InitializeRenderer(FakeOutputSurface::Create3d());
43 host_impl_
->SetViewportSize(gfx::Size(10, 10));
48 DebugScopedSetImplThreadAndMainThreadBlocked
49 always_impl_thread_and_main_thread_blocked_
;
50 TestSharedBitmapManager shared_bitmap_manager_
;
51 TestTaskGraphRunner task_graph_runner_
;
52 scoped_ptr
<LayerTreeHostImpl
> host_impl_
;
55 class DelegatedRendererLayerImplTestSimple
56 : public DelegatedRendererLayerImplTest
{
58 DelegatedRendererLayerImplTestSimple()
59 : DelegatedRendererLayerImplTest() {
60 scoped_ptr
<LayerImpl
> root_layer
=
61 SolidColorLayerImpl::Create(host_impl_
->active_tree(), 1);
62 scoped_ptr
<LayerImpl
> layer_before
=
63 SolidColorLayerImpl::Create(host_impl_
->active_tree(), 2);
64 scoped_ptr
<LayerImpl
> layer_after
=
65 SolidColorLayerImpl::Create(host_impl_
->active_tree(), 3);
66 scoped_ptr
<FakeDelegatedRendererLayerImpl
> delegated_renderer_layer
=
67 FakeDelegatedRendererLayerImpl::Create(host_impl_
->active_tree(), 4);
69 host_impl_
->SetViewportSize(gfx::Size(100, 100));
70 root_layer
->SetBounds(gfx::Size(100, 100));
71 root_layer
->SetHasRenderSurface(true);
73 layer_before
->SetPosition(gfx::Point(20, 20));
74 layer_before
->SetBounds(gfx::Size(14, 14));
75 layer_before
->SetContentBounds(gfx::Size(14, 14));
76 layer_before
->SetDrawsContent(true);
77 layer_before
->SetHasRenderSurface(true);
79 layer_after
->SetPosition(gfx::Point(5, 5));
80 layer_after
->SetBounds(gfx::Size(15, 15));
81 layer_after
->SetContentBounds(gfx::Size(15, 15));
82 layer_after
->SetDrawsContent(true);
83 layer_after
->SetHasRenderSurface(true);
85 delegated_renderer_layer
->SetPosition(gfx::Point(3, 3));
86 delegated_renderer_layer
->SetBounds(gfx::Size(10, 10));
87 delegated_renderer_layer
->SetContentBounds(gfx::Size(10, 10));
88 delegated_renderer_layer
->SetDrawsContent(true);
89 gfx::Transform transform
;
90 transform
.Translate(1.0, 1.0);
91 delegated_renderer_layer
->SetTransform(transform
);
93 RenderPassList delegated_render_passes
;
94 TestRenderPass
* pass1
= AddRenderPass(&delegated_render_passes
,
96 gfx::Rect(6, 6, 6, 6),
97 gfx::Transform(1, 0, 0, 1, 5, 6));
98 AddQuad(pass1
, gfx::Rect(0, 0, 6, 6), 33u);
99 TestRenderPass
* pass2
= AddRenderPass(&delegated_render_passes
,
101 gfx::Rect(7, 7, 7, 7),
102 gfx::Transform(1, 0, 0, 1, 7, 8));
103 AddQuad(pass2
, gfx::Rect(0, 0, 7, 7), 22u);
104 AddRenderPassQuad(pass2
, pass1
);
105 TestRenderPass
* pass3
= AddRenderPass(&delegated_render_passes
,
107 gfx::Rect(0, 0, 8, 8),
108 gfx::Transform(1, 0, 0, 1, 9, 10));
109 AddRenderPassQuad(pass3
, pass2
);
110 delegated_renderer_layer
->SetFrameDataForRenderPasses(
111 1.f
, delegated_render_passes
);
113 root_layer_
= root_layer
.get();
114 layer_before_
= layer_before
.get();
115 layer_after_
= layer_after
.get();
116 delegated_renderer_layer_
= delegated_renderer_layer
.get();
118 // Force the delegated RenderPasses to come before the RenderPass from
120 layer_after
->AddChild(delegated_renderer_layer
.Pass());
121 root_layer
->AddChild(layer_after
.Pass());
123 // Get the RenderPass generated by layer_before to come before the delegated
125 root_layer
->AddChild(layer_before
.Pass());
126 host_impl_
->active_tree()->SetRootLayer(root_layer
.Pass());
130 LayerImpl
* root_layer_
;
131 LayerImpl
* layer_before_
;
132 LayerImpl
* layer_after_
;
133 DelegatedRendererLayerImpl
* delegated_renderer_layer_
;
136 TEST_F(DelegatedRendererLayerImplTest
,
137 ChangeContributingRenderPassForNewFrame
) {
138 FakeDelegatedRendererLayerImpl
* fake_delegated_renderer_layer_impl
;
140 scoped_ptr
<LayerImpl
> root_layer
=
141 SolidColorLayerImpl::Create(host_impl_
->active_tree(), 1);
142 scoped_ptr
<FakeDelegatedRendererLayerImpl
> delegated_renderer_layer
=
143 FakeDelegatedRendererLayerImpl::Create(host_impl_
->active_tree(), 2);
145 host_impl_
->SetViewportSize(gfx::Size(100, 100));
146 root_layer
->SetBounds(gfx::Size(100, 100));
147 root_layer
->SetHasRenderSurface(true);
149 delegated_renderer_layer
->SetPosition(gfx::Point(3, 3));
150 delegated_renderer_layer
->SetBounds(gfx::Size(10, 10));
151 delegated_renderer_layer
->SetContentBounds(gfx::Size(10, 10));
152 delegated_renderer_layer
->SetDrawsContent(true);
153 delegated_renderer_layer
->SetHasRenderSurface(true);
154 gfx::Transform transform
;
155 transform
.Translate(1.0, 1.0);
156 delegated_renderer_layer
->SetTransform(transform
);
158 RenderPassList delegated_render_passes
;
159 TestRenderPass
* pass1
=
160 AddRenderPass(&delegated_render_passes
, RenderPassId(9, 6),
161 gfx::Rect(6, 6, 6, 6), gfx::Transform(1, 0, 0, 1, 5, 6));
162 AddQuad(pass1
, gfx::Rect(0, 0, 6, 6), 33u);
163 TestRenderPass
* pass2
=
164 AddRenderPass(&delegated_render_passes
, RenderPassId(9, 7),
165 gfx::Rect(7, 7, 7, 7), gfx::Transform(1, 0, 0, 1, 7, 8));
166 AddQuad(pass2
, gfx::Rect(0, 0, 7, 7), 22u);
167 AddRenderPassQuad(pass2
, pass1
);
168 TestRenderPass
* pass3
=
169 AddRenderPass(&delegated_render_passes
, RenderPassId(9, 8),
170 gfx::Rect(0, 0, 8, 8), gfx::Transform(1, 0, 0, 1, 9, 10));
171 AddRenderPassQuad(pass3
, pass2
);
172 delegated_renderer_layer
->SetFrameDataForRenderPasses(
173 1.f
, delegated_render_passes
);
175 fake_delegated_renderer_layer_impl
= delegated_renderer_layer
.get();
177 root_layer
->AddChild(delegated_renderer_layer
.Pass());
179 host_impl_
->active_tree()->SetRootLayer(root_layer
.Pass());
181 LayerTreeHostImpl::FrameData frame
;
182 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
184 // Root layer has one render pass, and delegated renderer layer has two
185 // contributing render passes and its own render pass.
186 ASSERT_EQ(4u, frame
.render_passes
.size());
188 host_impl_
->DrawLayers(&frame
);
189 host_impl_
->DidDrawAllLayers(frame
);
192 // New frame makes delegated renderer layer loses its contributing render
194 RenderPassList delegated_render_passes
;
195 AddRenderPass(&delegated_render_passes
, RenderPassId(9, 8),
196 gfx::Rect(0, 0, 8, 8), gfx::Transform(1, 0, 0, 1, 9, 10));
197 fake_delegated_renderer_layer_impl
->SetFrameDataForRenderPasses(
198 1.f
, delegated_render_passes
);
200 // Force damage to redraw a new frame.
201 host_impl_
->SetViewportDamage(gfx::Rect(10, 10));
203 LayerTreeHostImpl::FrameData frame
;
204 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
206 // Each non-DelegatedRendererLayer added one RenderPass. The
207 // DelegatedRendererLayer added two contributing passes.
208 ASSERT_EQ(1u, frame
.render_passes
.size());
210 host_impl_
->DrawLayers(&frame
);
211 host_impl_
->DidDrawAllLayers(frame
);
215 TEST_F(DelegatedRendererLayerImplTest
,
216 ChangeContributingRenderPassNonFullTreeSync
) {
217 FakeDelegatedRendererLayerImpl
* fake_delegated_renderer_layer_impl
;
219 host_impl_
->CreatePendingTree();
220 scoped_ptr
<LayerImpl
> root_layer
=
221 SolidColorLayerImpl::Create(host_impl_
->pending_tree(), 1);
222 scoped_ptr
<FakeDelegatedRendererLayerImpl
> delegated_renderer_layer
=
223 FakeDelegatedRendererLayerImpl::Create(host_impl_
->pending_tree(), 2);
225 host_impl_
->SetViewportSize(gfx::Size(100, 100));
226 root_layer
->SetBounds(gfx::Size(100, 100));
227 root_layer
->SetHasRenderSurface(true);
229 delegated_renderer_layer
->SetPosition(gfx::Point(3, 3));
230 delegated_renderer_layer
->SetBounds(gfx::Size(10, 10));
231 delegated_renderer_layer
->SetContentBounds(gfx::Size(10, 10));
232 delegated_renderer_layer
->SetDrawsContent(true);
233 delegated_renderer_layer
->SetHasRenderSurface(true);
234 gfx::Transform transform
;
235 transform
.Translate(1.0, 1.0);
236 delegated_renderer_layer
->SetTransform(transform
);
238 RenderPassList delegated_render_passes
;
239 TestRenderPass
* pass1
=
240 AddRenderPass(&delegated_render_passes
, RenderPassId(9, 6),
241 gfx::Rect(6, 6, 6, 6), gfx::Transform(1, 0, 0, 1, 5, 6));
242 AddQuad(pass1
, gfx::Rect(0, 0, 6, 6), 33u);
243 TestRenderPass
* pass2
=
244 AddRenderPass(&delegated_render_passes
, RenderPassId(9, 7),
245 gfx::Rect(7, 7, 7, 7), gfx::Transform(1, 0, 0, 1, 7, 8));
246 AddQuad(pass2
, gfx::Rect(0, 0, 7, 7), 22u);
247 AddRenderPassQuad(pass2
, pass1
);
248 TestRenderPass
* pass3
=
249 AddRenderPass(&delegated_render_passes
, RenderPassId(9, 8),
250 gfx::Rect(0, 0, 8, 8), gfx::Transform(1, 0, 0, 1, 9, 10));
251 AddRenderPassQuad(pass3
, pass2
);
252 delegated_renderer_layer
->SetFrameDataForRenderPasses(
253 1.f
, delegated_render_passes
);
255 fake_delegated_renderer_layer_impl
= delegated_renderer_layer
.get();
257 root_layer
->AddChild(delegated_renderer_layer
.Pass());
259 host_impl_
->pending_tree()->SetRootLayer(root_layer
.Pass());
260 host_impl_
->ActivateSyncTree();
262 LayerTreeHostImpl::FrameData frame
;
263 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
265 // Root layer has one render pass, and delegated renderer layer has two
266 // contributing render passes and its own render pass.
267 ASSERT_EQ(4u, frame
.render_passes
.size());
269 host_impl_
->DrawLayers(&frame
);
270 host_impl_
->DidDrawAllLayers(frame
);
273 // Remove contributing render passes from the delegated renderer layer.
274 host_impl_
->CreatePendingTree();
275 host_impl_
->pending_tree()->set_needs_full_tree_sync(false);
276 RenderPassList delegated_render_passes
;
277 AddRenderPass(&delegated_render_passes
, RenderPassId(9, 8),
278 gfx::Rect(0, 0, 8, 8), gfx::Transform(1, 0, 0, 1, 9, 10));
280 fake_delegated_renderer_layer_impl
->SetFrameDataForRenderPasses(
281 1.f
, delegated_render_passes
);
283 // Force damage to redraw a new frame.
285 host_impl_
->ActivateSyncTree();
286 host_impl_
->SetViewportDamage(gfx::Rect(100, 100));
287 LayerTreeHostImpl::FrameData frame
;
288 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
290 // Root layer has one render pass, and delegated renderer layer no longer
291 // has contributing render passes.
292 ASSERT_EQ(1u, frame
.render_passes
.size());
294 host_impl_
->DrawLayers(&frame
);
295 host_impl_
->DidDrawAllLayers(frame
);
299 TEST_F(DelegatedRendererLayerImplTestSimple
, AddsContributingRenderPasses
) {
300 LayerTreeHostImpl::FrameData frame
;
301 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
303 // Each non-DelegatedRendererLayer added one RenderPass. The
304 // DelegatedRendererLayer added two contributing passes.
305 ASSERT_EQ(5u, frame
.render_passes
.size());
307 // The DelegatedRendererLayer should have added its contributing RenderPasses
309 EXPECT_EQ(4, frame
.render_passes
[1]->id
.layer_id
);
310 EXPECT_EQ(1, frame
.render_passes
[1]->id
.index
);
311 EXPECT_EQ(4, frame
.render_passes
[2]->id
.layer_id
);
312 EXPECT_EQ(2, frame
.render_passes
[2]->id
.index
);
313 // And all other RenderPasses should be non-delegated.
314 EXPECT_NE(4, frame
.render_passes
[0]->id
.layer_id
);
315 EXPECT_EQ(0, frame
.render_passes
[0]->id
.index
);
316 EXPECT_NE(4, frame
.render_passes
[3]->id
.layer_id
);
317 EXPECT_EQ(0, frame
.render_passes
[3]->id
.index
);
318 EXPECT_NE(4, frame
.render_passes
[4]->id
.layer_id
);
319 EXPECT_EQ(0, frame
.render_passes
[4]->id
.index
);
321 // The DelegatedRendererLayer should have added its RenderPasses to the frame
323 EXPECT_EQ(gfx::Rect(6, 6, 6, 6).ToString(),
324 frame
.render_passes
[1]->output_rect
.ToString());
325 EXPECT_EQ(gfx::Rect(7, 7, 7, 7).ToString(),
326 frame
.render_passes
[2]->output_rect
.ToString());
328 host_impl_
->DrawLayers(&frame
);
329 host_impl_
->DidDrawAllLayers(frame
);
332 TEST_F(DelegatedRendererLayerImplTestSimple
,
333 AddsQuadsToContributingRenderPasses
) {
334 LayerTreeHostImpl::FrameData frame
;
335 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
337 // Each non-DelegatedRendererLayer added one RenderPass. The
338 // DelegatedRendererLayer added two contributing passes.
339 ASSERT_EQ(5u, frame
.render_passes
.size());
341 // The DelegatedRendererLayer should have added its contributing RenderPasses
343 EXPECT_EQ(4, frame
.render_passes
[1]->id
.layer_id
);
344 EXPECT_EQ(1, frame
.render_passes
[1]->id
.index
);
345 EXPECT_EQ(4, frame
.render_passes
[2]->id
.layer_id
);
346 EXPECT_EQ(2, frame
.render_passes
[2]->id
.index
);
348 // The DelegatedRendererLayer should have added copies of its quads to
349 // contributing RenderPasses.
350 ASSERT_EQ(1u, frame
.render_passes
[1]->quad_list
.size());
351 EXPECT_EQ(gfx::Rect(0, 0, 6, 6).ToString(),
352 frame
.render_passes
[1]->quad_list
.front()->rect
.ToString());
354 // Verify it added the right quads.
355 ASSERT_EQ(2u, frame
.render_passes
[2]->quad_list
.size());
356 EXPECT_EQ(gfx::Rect(0, 0, 7, 7).ToString(),
357 frame
.render_passes
[2]->quad_list
.front()->rect
.ToString());
358 EXPECT_EQ(gfx::Rect(6, 6, 6, 6).ToString(),
359 frame
.render_passes
[2]->quad_list
.ElementAt(1)->rect
.ToString());
360 ASSERT_EQ(1u, frame
.render_passes
[1]->quad_list
.size());
361 EXPECT_EQ(gfx::Rect(0, 0, 6, 6).ToString(),
362 frame
.render_passes
[1]->quad_list
.front()->rect
.ToString());
364 host_impl_
->DrawLayers(&frame
);
365 host_impl_
->DidDrawAllLayers(frame
);
368 TEST_F(DelegatedRendererLayerImplTestSimple
, AddsQuadsToTargetRenderPass
) {
369 LayerTreeHostImpl::FrameData frame
;
370 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
372 // Each non-DelegatedRendererLayer added one RenderPass. The
373 // DelegatedRendererLayer added two contributing passes.
374 ASSERT_EQ(5u, frame
.render_passes
.size());
376 // The layer's target is the RenderPass from layer_after_.
377 EXPECT_EQ(RenderPassId(3, 0), frame
.render_passes
[3]->id
);
379 // The DelegatedRendererLayer should have added copies of quads in its root
380 // RenderPass to its target RenderPass. The layer_after_ also adds one quad.
381 ASSERT_EQ(2u, frame
.render_passes
[3]->quad_list
.size());
383 // Verify it added the right quads.
384 EXPECT_EQ(gfx::Rect(7, 7, 7, 7).ToString(),
385 frame
.render_passes
[3]->quad_list
.front()->rect
.ToString());
387 // Its target layer should have a quad as well.
388 EXPECT_EQ(gfx::Rect(0, 0, 15, 15).ToString(),
389 frame
.render_passes
[3]->quad_list
.ElementAt(1)->rect
.ToString());
391 host_impl_
->DrawLayers(&frame
);
392 host_impl_
->DidDrawAllLayers(frame
);
395 TEST_F(DelegatedRendererLayerImplTestSimple
,
396 QuadsFromRootRenderPassAreModifiedForTheTarget
) {
397 LayerTreeHostImpl::FrameData frame
;
398 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
400 // Each non-DelegatedRendererLayer added one RenderPass. The
401 // DelegatedRendererLayer added two contributing passes.
402 ASSERT_EQ(5u, frame
.render_passes
.size());
404 // The DelegatedRendererLayer is at position 3,3 compared to its target, and
405 // has a translation transform of 1,1. So its root RenderPass' quads should
406 // all be transformed by that combined amount.
407 gfx::Transform transform
;
408 transform
.Translate(4.0, 4.0);
409 EXPECT_TRANSFORMATION_MATRIX_EQ(
410 transform
, frame
.render_passes
[3]->quad_list
.front()->quadTransform());
412 // Quads from non-root RenderPasses should not be shifted though.
413 ASSERT_EQ(2u, frame
.render_passes
[2]->quad_list
.size());
415 EXPECT_TRANSFORMATION_MATRIX_EQ(
417 frame
.render_passes
[2]->quad_list
.front()->quadTransform());
418 EXPECT_TRANSFORMATION_MATRIX_EQ(
420 frame
.render_passes
[2]->quad_list
.ElementAt(1)->quadTransform());
421 ASSERT_EQ(1u, frame
.render_passes
[1]->quad_list
.size());
422 EXPECT_TRANSFORMATION_MATRIX_EQ(
424 frame
.render_passes
[1]->quad_list
.front()->quadTransform());
426 host_impl_
->DrawLayers(&frame
);
427 host_impl_
->DidDrawAllLayers(frame
);
430 TEST_F(DelegatedRendererLayerImplTestSimple
, RenderPassTransformIsModified
) {
431 LayerTreeHostImpl::FrameData frame
;
432 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
434 // The delegated layer has a surface between it and the root.
435 EXPECT_TRUE(delegated_renderer_layer_
->render_target()->parent());
437 // Each non-DelegatedRendererLayer added one RenderPass. The
438 // DelegatedRendererLayer added two contributing passes.
439 ASSERT_EQ(5u, frame
.render_passes
.size());
441 // The DelegatedRendererLayer is at position 9,9 compared to the root, so all
442 // render pass' transforms to the root should be shifted by this amount.
443 gfx::Transform transform
;
444 transform
.Translate(9.0, 9.0);
446 // The first contributing surface has a translation of 5, 6.
447 gfx::Transform
five_six(1, 0, 0, 1, 5, 6);
449 // The second contributing surface has a translation of 7, 8.
450 gfx::Transform
seven_eight(1, 0, 0, 1, 7, 8);
452 EXPECT_TRANSFORMATION_MATRIX_EQ(
453 transform
* five_six
, frame
.render_passes
[1]->transform_to_root_target
);
454 EXPECT_TRANSFORMATION_MATRIX_EQ(
455 transform
* seven_eight
,
456 frame
.render_passes
[2]->transform_to_root_target
);
458 host_impl_
->DrawLayers(&frame
);
459 host_impl_
->DidDrawAllLayers(frame
);
462 class DelegatedRendererLayerImplTestOwnSurface
463 : public DelegatedRendererLayerImplTestSimple
{
465 DelegatedRendererLayerImplTestOwnSurface()
466 : DelegatedRendererLayerImplTestSimple() {
467 delegated_renderer_layer_
->SetHasRenderSurface(true);
471 TEST_F(DelegatedRendererLayerImplTestOwnSurface
, AddsRenderPasses
) {
472 LayerTreeHostImpl::FrameData frame
;
473 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
475 // Each non-DelegatedRendererLayer added one RenderPass. The
476 // DelegatedRendererLayer added two contributing passes and its owned surface
478 ASSERT_EQ(6u, frame
.render_passes
.size());
480 // The DelegatedRendererLayer should have added its contributing RenderPasses
482 EXPECT_EQ(4, frame
.render_passes
[1]->id
.layer_id
);
483 EXPECT_EQ(1, frame
.render_passes
[1]->id
.index
);
484 EXPECT_EQ(4, frame
.render_passes
[2]->id
.layer_id
);
485 EXPECT_EQ(2, frame
.render_passes
[2]->id
.index
);
486 // The DelegatedRendererLayer should have added a RenderPass for its surface
488 EXPECT_EQ(4, frame
.render_passes
[1]->id
.layer_id
);
489 EXPECT_EQ(0, frame
.render_passes
[3]->id
.index
);
490 // And all other RenderPasses should be non-delegated.
491 EXPECT_NE(4, frame
.render_passes
[0]->id
.layer_id
);
492 EXPECT_EQ(0, frame
.render_passes
[0]->id
.index
);
493 EXPECT_NE(4, frame
.render_passes
[4]->id
.layer_id
);
494 EXPECT_EQ(0, frame
.render_passes
[4]->id
.index
);
495 EXPECT_NE(4, frame
.render_passes
[5]->id
.layer_id
);
496 EXPECT_EQ(0, frame
.render_passes
[5]->id
.index
);
498 // The DelegatedRendererLayer should have added its RenderPasses to the frame
500 EXPECT_EQ(gfx::Rect(6, 6, 6, 6).ToString(),
501 frame
.render_passes
[1]->output_rect
.ToString());
502 EXPECT_EQ(gfx::Rect(7, 7, 7, 7).ToString(),
503 frame
.render_passes
[2]->output_rect
.ToString());
505 host_impl_
->DrawLayers(&frame
);
506 host_impl_
->DidDrawAllLayers(frame
);
509 TEST_F(DelegatedRendererLayerImplTestOwnSurface
,
510 AddsQuadsToContributingRenderPasses
) {
511 LayerTreeHostImpl::FrameData frame
;
512 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
514 // Each non-DelegatedRendererLayer added one RenderPass. The
515 // DelegatedRendererLayer added two contributing passes and its owned surface
517 ASSERT_EQ(6u, frame
.render_passes
.size());
519 // The DelegatedRendererLayer should have added its contributing RenderPasses
521 EXPECT_EQ(4, frame
.render_passes
[1]->id
.layer_id
);
522 EXPECT_EQ(1, frame
.render_passes
[1]->id
.index
);
523 EXPECT_EQ(4, frame
.render_passes
[2]->id
.layer_id
);
524 EXPECT_EQ(2, frame
.render_passes
[2]->id
.index
);
526 // The DelegatedRendererLayer should have added copies of its quads to
527 // contributing RenderPasses.
528 ASSERT_EQ(1u, frame
.render_passes
[1]->quad_list
.size());
529 EXPECT_EQ(gfx::Rect(0, 0, 6, 6).ToString(),
530 frame
.render_passes
[1]->quad_list
.front()->rect
.ToString());
532 // Verify it added the right quads.
533 ASSERT_EQ(2u, frame
.render_passes
[2]->quad_list
.size());
535 EXPECT_EQ(gfx::Rect(0, 0, 7, 7).ToString(),
536 frame
.render_passes
[2]->quad_list
.front()->rect
.ToString());
537 EXPECT_EQ(gfx::Rect(6, 6, 6, 6).ToString(),
538 frame
.render_passes
[2]->quad_list
.ElementAt(1)->rect
.ToString());
539 ASSERT_EQ(1u, frame
.render_passes
[1]->quad_list
.size());
540 EXPECT_EQ(gfx::Rect(0, 0, 6, 6).ToString(),
541 frame
.render_passes
[1]->quad_list
.front()->rect
.ToString());
543 host_impl_
->DrawLayers(&frame
);
544 host_impl_
->DidDrawAllLayers(frame
);
547 TEST_F(DelegatedRendererLayerImplTestOwnSurface
, AddsQuadsToTargetRenderPass
) {
548 LayerTreeHostImpl::FrameData frame
;
549 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
551 // Each non-DelegatedRendererLayer added one RenderPass. The
552 // DelegatedRendererLayer added two contributing passes and its owned surface
554 ASSERT_EQ(6u, frame
.render_passes
.size());
556 // The layer's target is the RenderPass owned by itself.
557 EXPECT_EQ(RenderPassId(4, 0), frame
.render_passes
[3]->id
);
559 // The DelegatedRendererLayer should have added copies of quads in its root
560 // RenderPass to its target RenderPass.
561 // The layer_after also adds one quad.
562 ASSERT_EQ(1u, frame
.render_passes
[3]->quad_list
.size());
564 // Verify it added the right quads.
565 EXPECT_EQ(gfx::Rect(7, 7, 7, 7).ToString(),
566 frame
.render_passes
[3]->quad_list
.front()->rect
.ToString());
568 host_impl_
->DrawLayers(&frame
);
569 host_impl_
->DidDrawAllLayers(frame
);
572 TEST_F(DelegatedRendererLayerImplTestOwnSurface
,
573 QuadsFromRootRenderPassAreNotModifiedForTheTarget
) {
574 LayerTreeHostImpl::FrameData frame
;
575 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
577 // Each non-DelegatedRendererLayer added one RenderPass. The
578 // DelegatedRendererLayer added two contributing passes and its owned surface
580 ASSERT_EQ(6u, frame
.render_passes
.size());
582 // Because the DelegatedRendererLayer owns a RenderSurfaceImpl, its root
583 // RenderPass' quads do not need to be translated at all.
584 EXPECT_TRANSFORMATION_MATRIX_EQ(
586 frame
.render_passes
[3]->quad_list
.front()->quadTransform());
588 // Quads from non-root RenderPasses should not be shifted either.
589 ASSERT_EQ(2u, frame
.render_passes
[2]->quad_list
.size());
591 EXPECT_TRANSFORMATION_MATRIX_EQ(
593 frame
.render_passes
[2]->quad_list
.front()->quadTransform());
594 EXPECT_TRANSFORMATION_MATRIX_EQ(
596 frame
.render_passes
[2]->quad_list
.ElementAt(1)->quadTransform());
597 ASSERT_EQ(1u, frame
.render_passes
[1]->quad_list
.size());
598 EXPECT_TRANSFORMATION_MATRIX_EQ(
600 frame
.render_passes
[1]->quad_list
.front()->quadTransform());
602 host_impl_
->DrawLayers(&frame
);
603 host_impl_
->DidDrawAllLayers(frame
);
606 class DelegatedRendererLayerImplTestTransform
607 : public DelegatedRendererLayerImplTest
{
609 DelegatedRendererLayerImplTestTransform()
610 : root_delegated_render_pass_is_clipped_(false),
611 delegated_device_scale_factor_(2.f
) {}
614 host_impl_
->SetDeviceScaleFactor(2.f
);
616 scoped_ptr
<LayerImpl
> root_layer
= LayerImpl::Create(
617 host_impl_
->active_tree(), 1);
618 scoped_ptr
<FakeDelegatedRendererLayerImpl
> delegated_renderer_layer
=
619 FakeDelegatedRendererLayerImpl::Create(host_impl_
->active_tree(), 2);
621 host_impl_
->SetViewportSize(gfx::Size(200, 200));
622 root_layer
->SetBounds(gfx::Size(100, 100));
623 root_layer
->SetHasRenderSurface(true);
625 delegated_renderer_layer
->SetPosition(gfx::Point(20, 20));
626 delegated_renderer_layer
->SetBounds(gfx::Size(75, 75));
627 delegated_renderer_layer
->SetContentBounds(gfx::Size(75, 75));
628 delegated_renderer_layer
->SetDrawsContent(true);
629 gfx::Transform transform
;
630 transform
.Scale(2.0, 2.0);
631 transform
.Translate(8.0, 8.0);
632 delegated_renderer_layer
->SetTransform(transform
);
634 RenderPassList delegated_render_passes
;
636 gfx::Size
child_pass_content_bounds(7, 7);
637 gfx::Rect
child_pass_rect(20, 20, 7, 7);
638 gfx::Transform child_pass_transform
;
639 child_pass_transform
.Scale(0.8f
, 0.8f
);
640 child_pass_transform
.Translate(9.0, 9.0);
641 gfx::Rect
child_pass_clip_rect(21, 21, 3, 3);
642 bool child_pass_clipped
= false;
645 TestRenderPass
* pass
= AddRenderPass(&delegated_render_passes
,
649 SharedQuadState
* shared_quad_state
=
650 pass
->CreateAndAppendSharedQuadState();
651 shared_quad_state
->SetAll(child_pass_transform
,
652 child_pass_content_bounds
,
654 child_pass_clip_rect
,
657 SkXfermode::kSrcOver_Mode
,
660 SolidColorDrawQuad
* color_quad
;
661 color_quad
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
662 color_quad
->SetNew(shared_quad_state
,
663 gfx::Rect(20, 20, 3, 7),
664 gfx::Rect(20, 20, 3, 7),
668 color_quad
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
669 color_quad
->SetNew(shared_quad_state
,
670 gfx::Rect(23, 20, 4, 7),
671 gfx::Rect(23, 20, 4, 7),
676 gfx::Size
root_pass_content_bounds(100, 100);
677 gfx::Rect
root_pass_rect(0, 0, 100, 100);
678 gfx::Transform root_pass_transform
;
679 root_pass_transform
.Scale(1.5, 1.5);
680 root_pass_transform
.Translate(7.0, 7.0);
681 gfx::Rect
root_pass_clip_rect(10, 10, 35, 35);
682 bool root_pass_clipped
= root_delegated_render_pass_is_clipped_
;
684 TestRenderPass
* pass
= AddRenderPass(&delegated_render_passes
,
688 SharedQuadState
* shared_quad_state
= pass
->CreateAndAppendSharedQuadState();
689 shared_quad_state
->SetAll(root_pass_transform
,
690 root_pass_content_bounds
,
695 SkXfermode::kSrcOver_Mode
,
698 RenderPassDrawQuad
* render_pass_quad
=
699 pass
->CreateAndAppendDrawQuad
<RenderPassDrawQuad
>();
700 render_pass_quad
->SetNew(shared_quad_state
,
701 gfx::Rect(5, 5, 7, 7), // quad_rect
702 gfx::Rect(5, 5, 7, 7), // visible_rect
703 RenderPassId(10, 7), // render_pass_id
704 0, // mask_resource_id
705 gfx::Vector2dF(), // mask_uv_scale
706 gfx::Size(), // mask_texture_size
707 FilterOperations(), // filters
708 gfx::Vector2dF(), // filters_scale
709 FilterOperations()); // background_filters
711 SolidColorDrawQuad
* color_quad
;
712 color_quad
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
713 color_quad
->SetNew(shared_quad_state
,
714 gfx::Rect(0, 0, 10, 10),
715 gfx::Rect(0, 0, 10, 10),
719 color_quad
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
720 color_quad
->SetNew(shared_quad_state
,
721 gfx::Rect(0, 10, 10, 10),
722 gfx::Rect(0, 10, 10, 10),
726 color_quad
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
727 color_quad
->SetNew(shared_quad_state
,
728 gfx::Rect(10, 0, 10, 10),
729 gfx::Rect(10, 0, 10, 10),
733 color_quad
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
734 color_quad
->SetNew(shared_quad_state
,
735 gfx::Rect(10, 10, 10, 10),
736 gfx::Rect(10, 10, 10, 10),
740 delegated_renderer_layer
->SetFrameDataForRenderPasses(
741 delegated_device_scale_factor_
, delegated_render_passes
);
743 root_layer_
= root_layer
.get();
744 delegated_renderer_layer_
= delegated_renderer_layer
.get();
746 root_layer
->AddChild(delegated_renderer_layer
.Pass());
747 host_impl_
->active_tree()->SetRootLayer(root_layer
.Pass());
750 void VerifyRenderPasses(
751 const LayerTreeHostImpl::FrameData
& frame
,
752 size_t num_render_passes
,
753 const SharedQuadState
** root_delegated_shared_quad_state
,
754 const SharedQuadState
** contrib_delegated_shared_quad_state
) {
755 ASSERT_EQ(num_render_passes
, frame
.render_passes
.size());
756 // The contributing render pass in the DelegatedRendererLayer.
757 EXPECT_EQ(2, frame
.render_passes
[0]->id
.layer_id
);
758 EXPECT_EQ(1, frame
.render_passes
[0]->id
.index
);
759 // The root render pass.
760 EXPECT_EQ(1, frame
.render_passes
.back()->id
.layer_id
);
761 EXPECT_EQ(0, frame
.render_passes
.back()->id
.index
);
763 const QuadList
& contrib_delegated_quad_list
=
764 frame
.render_passes
[0]->quad_list
;
765 ASSERT_EQ(2u, contrib_delegated_quad_list
.size());
767 const QuadList
& root_delegated_quad_list
=
768 frame
.render_passes
[1]->quad_list
;
769 ASSERT_EQ(5u, root_delegated_quad_list
.size());
771 // All quads in a render pass should share the same state.
772 *contrib_delegated_shared_quad_state
=
773 contrib_delegated_quad_list
.front()->shared_quad_state
;
774 EXPECT_EQ(*contrib_delegated_shared_quad_state
,
775 contrib_delegated_quad_list
.ElementAt(1)->shared_quad_state
);
777 *root_delegated_shared_quad_state
=
778 root_delegated_quad_list
.front()->shared_quad_state
;
779 EXPECT_EQ(*root_delegated_shared_quad_state
,
780 root_delegated_quad_list
.ElementAt(1)->shared_quad_state
);
781 EXPECT_EQ(*root_delegated_shared_quad_state
,
782 root_delegated_quad_list
.ElementAt(2)->shared_quad_state
);
783 EXPECT_EQ(*root_delegated_shared_quad_state
,
784 root_delegated_quad_list
.ElementAt(3)->shared_quad_state
);
785 EXPECT_EQ(*root_delegated_shared_quad_state
,
786 root_delegated_quad_list
.ElementAt(4)->shared_quad_state
);
788 EXPECT_NE(*contrib_delegated_shared_quad_state
,
789 *root_delegated_shared_quad_state
);
793 LayerImpl
* root_layer_
;
794 DelegatedRendererLayerImpl
* delegated_renderer_layer_
;
795 bool root_delegated_render_pass_is_clipped_
;
796 float delegated_device_scale_factor_
;
799 TEST_F(DelegatedRendererLayerImplTestTransform
, QuadsUnclipped_NoSurface
) {
800 root_delegated_render_pass_is_clipped_
= false;
803 LayerTreeHostImpl::FrameData frame
;
804 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
806 const SharedQuadState
* root_delegated_shared_quad_state
= nullptr;
807 const SharedQuadState
* contrib_delegated_shared_quad_state
= nullptr;
811 &root_delegated_shared_quad_state
,
812 &contrib_delegated_shared_quad_state
);
814 // When the quads don't have a clip of their own, the clip rect is set to
815 // the drawable_content_rect of the delegated renderer layer.
816 EXPECT_EQ(delegated_renderer_layer_
->drawable_content_rect().ToString(),
817 root_delegated_shared_quad_state
->clip_rect
.ToString());
819 // Even though the quads in the root pass have no clip of their own, they
820 // inherit the clip rect from the delegated renderer layer if it does not
822 EXPECT_TRUE(root_delegated_shared_quad_state
->is_clipped
);
824 gfx::Transform expected
;
825 // Device scale factor.
826 expected
.Scale(2.0, 2.0);
827 // This is the transform from the layer's space to its target.
828 expected
.Translate(20, 20);
829 expected
.Scale(2.0, 2.0);
830 expected
.Translate(8.0, 8.0);
831 // This is the transform within the source frame.
832 // Inverse device scale factor to go from physical space to layer space.
833 expected
.Scale(0.5, 0.5);
834 expected
.Scale(1.5, 1.5);
835 expected
.Translate(7.0, 7.0);
836 EXPECT_TRANSFORMATION_MATRIX_EQ(
837 expected
, root_delegated_shared_quad_state
->content_to_target_transform
);
839 // The contributing render pass should not be transformed from its input.
840 EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(),
841 contrib_delegated_shared_quad_state
->clip_rect
.ToString());
842 EXPECT_FALSE(contrib_delegated_shared_quad_state
->is_clipped
);
843 expected
.MakeIdentity();
844 expected
.Scale(0.8f
, 0.8f
);
845 expected
.Translate(9.0, 9.0);
846 EXPECT_TRANSFORMATION_MATRIX_EQ(
848 contrib_delegated_shared_quad_state
->content_to_target_transform
);
850 host_impl_
->DrawLayers(&frame
);
851 host_impl_
->DidDrawAllLayers(frame
);
854 TEST_F(DelegatedRendererLayerImplTestTransform
, QuadsClipped_NoSurface
) {
855 root_delegated_render_pass_is_clipped_
= true;
858 LayerTreeHostImpl::FrameData frame
;
859 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
861 const SharedQuadState
* root_delegated_shared_quad_state
= nullptr;
862 const SharedQuadState
* contrib_delegated_shared_quad_state
= nullptr;
866 &root_delegated_shared_quad_state
,
867 &contrib_delegated_shared_quad_state
);
869 // Since the quads have a clip_rect it should be modified by delegated
870 // renderer layer's draw_transform.
871 // The position of the resulting clip_rect is:
872 // (clip rect position (10) * inverse dsf (1/2) + translate (8)) *
873 // layer scale (2) + layer position (20) = 46
874 // The device scale is 2, so everything gets doubled, giving 92.
876 // The size is 35x35 scaled by the device scale.
877 EXPECT_EQ(gfx::Rect(92, 92, 70, 70).ToString(),
878 root_delegated_shared_quad_state
->clip_rect
.ToString());
880 // The quads had a clip and it should be preserved.
881 EXPECT_TRUE(root_delegated_shared_quad_state
->is_clipped
);
883 gfx::Transform expected
;
884 // Device scale factor.
885 expected
.Scale(2.0, 2.0);
886 // This is the transform from the layer's space to its target.
887 expected
.Translate(20, 20);
888 expected
.Scale(2.0, 2.0);
889 expected
.Translate(8.0, 8.0);
890 // This is the transform within the source frame.
891 // Inverse device scale factor to go from physical space to layer space.
892 expected
.Scale(0.5, 0.5);
893 expected
.Scale(1.5, 1.5);
894 expected
.Translate(7.0, 7.0);
895 EXPECT_TRANSFORMATION_MATRIX_EQ(
896 expected
, root_delegated_shared_quad_state
->content_to_target_transform
);
898 // The contributing render pass should not be transformed from its input.
899 EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(),
900 contrib_delegated_shared_quad_state
->clip_rect
.ToString());
901 EXPECT_FALSE(contrib_delegated_shared_quad_state
->is_clipped
);
902 expected
.MakeIdentity();
903 expected
.Scale(0.8f
, 0.8f
);
904 expected
.Translate(9.0, 9.0);
905 EXPECT_TRANSFORMATION_MATRIX_EQ(
907 contrib_delegated_shared_quad_state
->content_to_target_transform
);
909 host_impl_
->DrawLayers(&frame
);
910 host_impl_
->DidDrawAllLayers(frame
);
913 TEST_F(DelegatedRendererLayerImplTestTransform
, QuadsUnclipped_Surface
) {
914 root_delegated_render_pass_is_clipped_
= false;
917 delegated_renderer_layer_
->SetHasRenderSurface(true);
919 LayerTreeHostImpl::FrameData frame
;
920 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
922 const SharedQuadState
* root_delegated_shared_quad_state
= nullptr;
923 const SharedQuadState
* contrib_delegated_shared_quad_state
= nullptr;
927 &root_delegated_shared_quad_state
,
928 &contrib_delegated_shared_quad_state
);
930 // When the layer owns a surface, then its translation is not part of its
931 // draw transform, but its scale is.
932 EXPECT_EQ(gfx::Rect(20, 20, 70, 70).ToString(),
933 root_delegated_shared_quad_state
->clip_rect
.ToString());
935 // Since the layer owns a surface it doesn't need to clip its quads, so
936 // unclipped quads remain unclipped.
937 EXPECT_FALSE(root_delegated_shared_quad_state
->is_clipped
);
939 gfx::Transform expected
;
940 // This is the transform within the source frame scaled by the delegated
941 // render layer transform.
942 expected
.Scale(3.0, 3.0);
943 expected
.Translate(7.0, 7.0);
944 EXPECT_TRANSFORMATION_MATRIX_EQ(
945 expected
, root_delegated_shared_quad_state
->content_to_target_transform
);
947 // The contributing render pass should not be transformed from its input.
948 EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(),
949 contrib_delegated_shared_quad_state
->clip_rect
.ToString());
950 EXPECT_FALSE(contrib_delegated_shared_quad_state
->is_clipped
);
951 expected
.MakeIdentity();
952 expected
.Scale(0.8f
, 0.8f
);
953 expected
.Translate(9.0, 9.0);
954 EXPECT_TRANSFORMATION_MATRIX_EQ(
956 contrib_delegated_shared_quad_state
->content_to_target_transform
);
958 host_impl_
->DrawLayers(&frame
);
959 host_impl_
->DidDrawAllLayers(frame
);
962 TEST_F(DelegatedRendererLayerImplTestTransform
, QuadsClipped_Surface
) {
963 root_delegated_render_pass_is_clipped_
= true;
966 delegated_renderer_layer_
->SetHasRenderSurface(true);
968 LayerTreeHostImpl::FrameData frame
;
969 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
971 const SharedQuadState
* root_delegated_shared_quad_state
= nullptr;
972 const SharedQuadState
* contrib_delegated_shared_quad_state
= nullptr;
976 &root_delegated_shared_quad_state
,
977 &contrib_delegated_shared_quad_state
);
979 // When the layer owns a surface, then its translation is not part of its
980 // draw transform, but its scale is.
981 EXPECT_EQ(gfx::Rect(20, 20, 70, 70).ToString(),
982 root_delegated_shared_quad_state
->clip_rect
.ToString());
984 // The quads had a clip and it should be preserved.
985 EXPECT_TRUE(root_delegated_shared_quad_state
->is_clipped
);
987 gfx::Transform expected
;
988 // This is the transform within the source frame scaled by the delegated
989 // render layer transform.
990 expected
.Scale(3.0, 3.0);
991 expected
.Translate(7.0, 7.0);
992 EXPECT_TRANSFORMATION_MATRIX_EQ(
993 expected
, root_delegated_shared_quad_state
->content_to_target_transform
);
995 // The contributing render pass should not be transformed from its input.
996 EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(),
997 contrib_delegated_shared_quad_state
->clip_rect
.ToString());
998 EXPECT_FALSE(contrib_delegated_shared_quad_state
->is_clipped
);
999 expected
.MakeIdentity();
1000 expected
.Scale(0.8f
, 0.8f
);
1001 expected
.Translate(9.0, 9.0);
1002 EXPECT_TRANSFORMATION_MATRIX_EQ(
1004 contrib_delegated_shared_quad_state
->content_to_target_transform
);
1006 host_impl_
->DrawLayers(&frame
);
1007 host_impl_
->DidDrawAllLayers(frame
);
1010 TEST_F(DelegatedRendererLayerImplTestTransform
, MismatchedDeviceScaleFactor
) {
1011 root_delegated_render_pass_is_clipped_
= true;
1012 delegated_device_scale_factor_
= 1.3f
;
1016 LayerTreeHostImpl::FrameData frame
;
1017 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
1019 const SharedQuadState
* root_delegated_shared_quad_state
= nullptr;
1020 const SharedQuadState
* contrib_delegated_shared_quad_state
= nullptr;
1021 VerifyRenderPasses(frame
,
1023 &root_delegated_shared_quad_state
,
1024 &contrib_delegated_shared_quad_state
);
1026 // The parent tree's device scale factor is 2.0, but the child has submitted a
1027 // frame with a device scale factor of 1.3. Absent any better option, the
1028 // only thing we can do is scale from 1.3 -> 2.0.
1030 gfx::Transform expected
;
1031 // Device scale factor (from parent).
1032 expected
.Scale(2.0, 2.0);
1033 // This is the transform from the layer's space to its target.
1034 expected
.Translate(20, 20);
1035 expected
.Scale(2.0, 2.0);
1036 expected
.Translate(8.0, 8.0);
1037 // This is the transform within the source frame.
1038 // Inverse device scale factor (from child).
1039 expected
.Scale(1.0f
/ 1.3f
, 1.0f
/ 1.3f
);
1040 expected
.Scale(1.5, 1.5);
1041 expected
.Translate(7.0, 7.0);
1042 EXPECT_TRANSFORMATION_MATRIX_EQ(
1043 expected
, root_delegated_shared_quad_state
->content_to_target_transform
);
1045 host_impl_
->DrawLayers(&frame
);
1046 host_impl_
->DidDrawAllLayers(frame
);
1049 class DelegatedRendererLayerImplTestClip
1050 : public DelegatedRendererLayerImplTest
{
1053 scoped_ptr
<LayerImpl
> root_layer
=
1054 LayerImpl::Create(host_impl_
->active_tree(), 1);
1055 scoped_ptr
<FakeDelegatedRendererLayerImpl
> delegated_renderer_layer
=
1056 FakeDelegatedRendererLayerImpl::Create(host_impl_
->active_tree(), 2);
1057 scoped_ptr
<LayerImpl
> clip_layer
=
1058 LayerImpl::Create(host_impl_
->active_tree(), 3);
1059 scoped_ptr
<LayerImpl
> origin_layer
=
1060 LayerImpl::Create(host_impl_
->active_tree(), 4);
1062 host_impl_
->SetViewportSize(gfx::Size(100, 100));
1063 root_layer
->SetBounds(gfx::Size(100, 100));
1064 root_layer
->SetHasRenderSurface(true);
1066 delegated_renderer_layer
->SetPosition(gfx::Point(20, 20));
1067 delegated_renderer_layer
->SetBounds(gfx::Size(50, 50));
1068 delegated_renderer_layer
->SetContentBounds(gfx::Size(50, 50));
1069 delegated_renderer_layer
->SetDrawsContent(true);
1071 RenderPassList delegated_render_passes
;
1073 gfx::Size
child_pass_content_bounds(7, 7);
1074 gfx::Rect
child_pass_rect(20, 20, 7, 7);
1075 gfx::Transform child_pass_transform
;
1076 gfx::Rect
child_pass_clip_rect(21, 21, 3, 3);
1077 bool child_pass_clipped
= false;
1080 TestRenderPass
* pass
= AddRenderPass(&delegated_render_passes
,
1081 RenderPassId(10, 7),
1084 SharedQuadState
* shared_quad_state
=
1085 pass
->CreateAndAppendSharedQuadState();
1086 shared_quad_state
->SetAll(child_pass_transform
,
1087 child_pass_content_bounds
,
1089 child_pass_clip_rect
,
1092 SkXfermode::kSrcOver_Mode
,
1095 SolidColorDrawQuad
* color_quad
;
1096 color_quad
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1097 color_quad
->SetNew(shared_quad_state
,
1098 gfx::Rect(20, 20, 3, 7),
1099 gfx::Rect(20, 20, 3, 7),
1103 color_quad
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1104 color_quad
->SetNew(shared_quad_state
,
1105 gfx::Rect(23, 20, 4, 7),
1106 gfx::Rect(23, 20, 4, 7),
1111 gfx::Size
root_pass_content_bounds(50, 50);
1112 gfx::Rect
root_pass_rect(0, 0, 50, 50);
1113 gfx::Transform root_pass_transform
;
1114 gfx::Rect
root_pass_clip_rect(5, 5, 40, 40);
1115 bool root_pass_clipped
= root_delegated_render_pass_is_clipped_
;
1117 TestRenderPass
* pass
= AddRenderPass(&delegated_render_passes
,
1121 SharedQuadState
* shared_quad_state
= pass
->CreateAndAppendSharedQuadState();
1122 shared_quad_state
->SetAll(root_pass_transform
,
1123 root_pass_content_bounds
,
1125 root_pass_clip_rect
,
1128 SkXfermode::kSrcOver_Mode
,
1131 RenderPassDrawQuad
* render_pass_quad
=
1132 pass
->CreateAndAppendDrawQuad
<RenderPassDrawQuad
>();
1133 render_pass_quad
->SetNew(shared_quad_state
,
1134 gfx::Rect(5, 5, 7, 7), // quad_rect
1135 gfx::Rect(5, 5, 7, 7), // visible_quad_rect
1136 RenderPassId(10, 7), // render_pass_id
1137 0, // mask_resource_id
1138 gfx::Vector2dF(), // mask_uv_scale
1139 gfx::Size(), // mask_texture_size,
1140 FilterOperations(), // filters
1141 gfx::Vector2dF(), // filters_scale
1142 FilterOperations()); // background_filters
1144 SolidColorDrawQuad
* color_quad
;
1145 color_quad
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1146 color_quad
->SetNew(shared_quad_state
,
1147 gfx::Rect(0, 0, 10, 10),
1148 gfx::Rect(0, 0, 10, 10),
1152 color_quad
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1153 color_quad
->SetNew(shared_quad_state
,
1154 gfx::Rect(0, 10, 10, 10),
1155 gfx::Rect(0, 10, 10, 10),
1159 color_quad
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1160 color_quad
->SetNew(shared_quad_state
,
1161 gfx::Rect(10, 0, 10, 10),
1162 gfx::Rect(10, 0, 10, 10),
1166 color_quad
= pass
->CreateAndAppendDrawQuad
<SolidColorDrawQuad
>();
1167 color_quad
->SetNew(shared_quad_state
,
1168 gfx::Rect(10, 10, 10, 10),
1169 gfx::Rect(10, 10, 10, 10),
1173 delegated_renderer_layer
->SetFrameDataForRenderPasses(
1174 1.f
, delegated_render_passes
);
1176 root_layer_
= root_layer
.get();
1177 delegated_renderer_layer_
= delegated_renderer_layer
.get();
1179 if (clip_delegated_renderer_layer_
) {
1180 gfx::Rect
clip_rect(21, 27, 23, 21);
1182 clip_layer
->SetPosition(clip_rect
.origin());
1183 clip_layer
->SetBounds(clip_rect
.size());
1184 clip_layer
->SetContentBounds(clip_rect
.size());
1185 clip_layer
->SetMasksToBounds(true);
1187 origin_layer
->SetPosition(
1188 gfx::PointAtOffsetFromOrigin(-clip_rect
.OffsetFromOrigin()));
1190 origin_layer
->AddChild(delegated_renderer_layer
.Pass());
1191 clip_layer
->AddChild(origin_layer
.Pass());
1192 root_layer
->AddChild(clip_layer
.Pass());
1194 root_layer
->AddChild(delegated_renderer_layer
.Pass());
1197 host_impl_
->active_tree()->SetRootLayer(root_layer
.Pass());
1201 LayerImpl
* root_layer_
;
1202 DelegatedRendererLayerImpl
* delegated_renderer_layer_
;
1203 bool root_delegated_render_pass_is_clipped_
;
1204 bool clip_delegated_renderer_layer_
;
1207 TEST_F(DelegatedRendererLayerImplTestClip
,
1208 QuadsUnclipped_LayerUnclipped_NoSurface
) {
1209 root_delegated_render_pass_is_clipped_
= false;
1210 clip_delegated_renderer_layer_
= false;
1213 LayerTreeHostImpl::FrameData frame
;
1214 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
1216 ASSERT_EQ(2u, frame
.render_passes
.size());
1217 const QuadList
& contrib_delegated_quad_list
=
1218 frame
.render_passes
[0]->quad_list
;
1219 ASSERT_EQ(2u, contrib_delegated_quad_list
.size());
1220 const QuadList
& root_delegated_quad_list
= frame
.render_passes
[1]->quad_list
;
1221 ASSERT_EQ(5u, root_delegated_quad_list
.size());
1222 const SharedQuadState
* root_delegated_shared_quad_state
=
1223 root_delegated_quad_list
.front()->shared_quad_state
;
1225 // When the quads don't have a clip of their own, the clip rect is set to
1226 // the drawable_content_rect of the delegated renderer layer.
1227 EXPECT_EQ(gfx::Rect(20, 20, 50, 50).ToString(),
1228 root_delegated_shared_quad_state
->clip_rect
.ToString());
1229 // Quads are clipped to the delegated renderer layer.
1230 EXPECT_TRUE(root_delegated_shared_quad_state
->is_clipped
);
1232 host_impl_
->DrawLayers(&frame
);
1233 host_impl_
->DidDrawAllLayers(frame
);
1236 TEST_F(DelegatedRendererLayerImplTestClip
,
1237 QuadsClipped_LayerUnclipped_NoSurface
) {
1238 root_delegated_render_pass_is_clipped_
= true;
1239 clip_delegated_renderer_layer_
= false;
1242 LayerTreeHostImpl::FrameData frame
;
1243 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
1245 ASSERT_EQ(2u, frame
.render_passes
.size());
1246 const QuadList
& contrib_delegated_quad_list
=
1247 frame
.render_passes
[0]->quad_list
;
1248 ASSERT_EQ(2u, contrib_delegated_quad_list
.size());
1249 const QuadList
& root_delegated_quad_list
=
1250 frame
.render_passes
[1]->quad_list
;
1251 ASSERT_EQ(5u, root_delegated_quad_list
.size());
1252 const SharedQuadState
* root_delegated_shared_quad_state
=
1253 root_delegated_quad_list
.front()->shared_quad_state
;
1255 // When the quads have a clip of their own, it is used.
1256 EXPECT_EQ(gfx::Rect(25, 25, 40, 40).ToString(),
1257 root_delegated_shared_quad_state
->clip_rect
.ToString());
1258 // Quads came with a clip rect.
1259 EXPECT_TRUE(root_delegated_shared_quad_state
->is_clipped
);
1261 host_impl_
->DrawLayers(&frame
);
1262 host_impl_
->DidDrawAllLayers(frame
);
1265 TEST_F(DelegatedRendererLayerImplTestClip
,
1266 QuadsUnclipped_LayerClipped_NoSurface
) {
1267 root_delegated_render_pass_is_clipped_
= false;
1268 clip_delegated_renderer_layer_
= true;
1271 LayerTreeHostImpl::FrameData frame
;
1272 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
1274 ASSERT_EQ(2u, frame
.render_passes
.size());
1275 const QuadList
& contrib_delegated_quad_list
=
1276 frame
.render_passes
[0]->quad_list
;
1277 ASSERT_EQ(2u, contrib_delegated_quad_list
.size());
1278 const QuadList
& root_delegated_quad_list
= frame
.render_passes
[1]->quad_list
;
1279 ASSERT_EQ(5u, root_delegated_quad_list
.size());
1280 const SharedQuadState
* root_delegated_shared_quad_state
=
1281 root_delegated_quad_list
.front()->shared_quad_state
;
1283 // When the quads don't have a clip of their own, the clip rect is set to
1284 // the drawable_content_rect of the delegated renderer layer. When the layer
1285 // is clipped, that should be seen in the quads' clip_rect.
1286 EXPECT_EQ(gfx::Rect(21, 27, 23, 21).ToString(),
1287 root_delegated_shared_quad_state
->clip_rect
.ToString());
1288 // Quads are clipped to the delegated renderer layer.
1289 EXPECT_TRUE(root_delegated_shared_quad_state
->is_clipped
);
1291 host_impl_
->DrawLayers(&frame
);
1292 host_impl_
->DidDrawAllLayers(frame
);
1295 TEST_F(DelegatedRendererLayerImplTestClip
,
1296 QuadsClipped_LayerClipped_NoSurface
) {
1297 root_delegated_render_pass_is_clipped_
= true;
1298 clip_delegated_renderer_layer_
= true;
1301 LayerTreeHostImpl::FrameData frame
;
1302 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
1304 ASSERT_EQ(2u, frame
.render_passes
.size());
1305 const QuadList
& contrib_delegated_quad_list
=
1306 frame
.render_passes
[0]->quad_list
;
1307 ASSERT_EQ(2u, contrib_delegated_quad_list
.size());
1308 const QuadList
& root_delegated_quad_list
= frame
.render_passes
[1]->quad_list
;
1309 ASSERT_EQ(5u, root_delegated_quad_list
.size());
1310 const SharedQuadState
* root_delegated_shared_quad_state
=
1311 root_delegated_quad_list
.front()->shared_quad_state
;
1313 // When the quads have a clip of their own, it is used, but it is
1314 // combined with the clip rect of the delegated renderer layer.
1315 EXPECT_EQ(gfx::Rect(25, 27, 19, 21).ToString(),
1316 root_delegated_shared_quad_state
->clip_rect
.ToString());
1317 // Quads came with a clip rect.
1318 EXPECT_TRUE(root_delegated_shared_quad_state
->is_clipped
);
1320 host_impl_
->DrawLayers(&frame
);
1321 host_impl_
->DidDrawAllLayers(frame
);
1324 TEST_F(DelegatedRendererLayerImplTestClip
,
1325 QuadsUnclipped_LayerUnclipped_Surface
) {
1326 root_delegated_render_pass_is_clipped_
= false;
1327 clip_delegated_renderer_layer_
= false;
1330 delegated_renderer_layer_
->SetHasRenderSurface(true);
1332 LayerTreeHostImpl::FrameData frame
;
1333 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
1335 ASSERT_EQ(3u, frame
.render_passes
.size());
1336 const QuadList
& contrib_delegated_quad_list
=
1337 frame
.render_passes
[0]->quad_list
;
1338 ASSERT_EQ(2u, contrib_delegated_quad_list
.size());
1339 const QuadList
& root_delegated_quad_list
= frame
.render_passes
[1]->quad_list
;
1340 ASSERT_EQ(5u, root_delegated_quad_list
.size());
1341 const SharedQuadState
* root_delegated_shared_quad_state
=
1342 root_delegated_quad_list
.front()->shared_quad_state
;
1344 // When the layer owns a surface, the quads don't need to be clipped
1345 // further than they already specify. If they aren't clipped, then their
1346 // clip rect is ignored, and they are not set as clipped.
1347 EXPECT_FALSE(root_delegated_shared_quad_state
->is_clipped
);
1349 host_impl_
->DrawLayers(&frame
);
1350 host_impl_
->DidDrawAllLayers(frame
);
1353 TEST_F(DelegatedRendererLayerImplTestClip
,
1354 QuadsClipped_LayerUnclipped_Surface
) {
1355 root_delegated_render_pass_is_clipped_
= true;
1356 clip_delegated_renderer_layer_
= false;
1359 delegated_renderer_layer_
->SetHasRenderSurface(true);
1361 LayerTreeHostImpl::FrameData frame
;
1362 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
1364 ASSERT_EQ(3u, frame
.render_passes
.size());
1365 const QuadList
& contrib_delegated_quad_list
=
1366 frame
.render_passes
[0]->quad_list
;
1367 ASSERT_EQ(2u, contrib_delegated_quad_list
.size());
1368 const QuadList
& root_delegated_quad_list
= frame
.render_passes
[1]->quad_list
;
1369 ASSERT_EQ(5u, root_delegated_quad_list
.size());
1370 const SharedQuadState
* root_delegated_shared_quad_state
=
1371 root_delegated_quad_list
.front()->shared_quad_state
;
1373 // When the quads have a clip of their own, it is used.
1374 EXPECT_EQ(gfx::Rect(5, 5, 40, 40).ToString(),
1375 root_delegated_shared_quad_state
->clip_rect
.ToString());
1376 // Quads came with a clip rect.
1377 EXPECT_TRUE(root_delegated_shared_quad_state
->is_clipped
);
1379 host_impl_
->DrawLayers(&frame
);
1380 host_impl_
->DidDrawAllLayers(frame
);
1383 TEST_F(DelegatedRendererLayerImplTestClip
,
1384 QuadsUnclipped_LayerClipped_Surface
) {
1385 root_delegated_render_pass_is_clipped_
= false;
1386 clip_delegated_renderer_layer_
= true;
1389 delegated_renderer_layer_
->SetHasRenderSurface(true);
1391 LayerTreeHostImpl::FrameData frame
;
1392 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
1394 ASSERT_EQ(3u, frame
.render_passes
.size());
1395 const QuadList
& contrib_delegated_quad_list
=
1396 frame
.render_passes
[0]->quad_list
;
1397 ASSERT_EQ(2u, contrib_delegated_quad_list
.size());
1398 const QuadList
& root_delegated_quad_list
= frame
.render_passes
[1]->quad_list
;
1399 ASSERT_EQ(5u, root_delegated_quad_list
.size());
1400 const SharedQuadState
* root_delegated_shared_quad_state
=
1401 root_delegated_quad_list
.front()->shared_quad_state
;
1403 // When the layer owns a surface, the quads don't need to be clipped
1404 // further than they already specify. If they aren't clipped, then their
1405 // clip rect is ignored, and they are not set as clipped.
1406 EXPECT_FALSE(root_delegated_shared_quad_state
->is_clipped
);
1408 host_impl_
->DrawLayers(&frame
);
1409 host_impl_
->DidDrawAllLayers(frame
);
1412 TEST_F(DelegatedRendererLayerImplTestClip
, QuadsClipped_LayerClipped_Surface
) {
1413 root_delegated_render_pass_is_clipped_
= true;
1414 clip_delegated_renderer_layer_
= true;
1417 delegated_renderer_layer_
->SetHasRenderSurface(true);
1419 LayerTreeHostImpl::FrameData frame
;
1420 EXPECT_EQ(DRAW_SUCCESS
, host_impl_
->PrepareToDraw(&frame
));
1422 ASSERT_EQ(3u, frame
.render_passes
.size());
1423 const QuadList
& contrib_delegated_quad_list
=
1424 frame
.render_passes
[0]->quad_list
;
1425 ASSERT_EQ(2u, contrib_delegated_quad_list
.size());
1426 const QuadList
& root_delegated_quad_list
= frame
.render_passes
[1]->quad_list
;
1427 ASSERT_EQ(5u, root_delegated_quad_list
.size());
1428 const SharedQuadState
* root_delegated_shared_quad_state
=
1429 root_delegated_quad_list
.front()->shared_quad_state
;
1431 // When the quads have a clip of their own, it is used, but it is
1432 // combined with the clip rect of the delegated renderer layer. If the
1433 // layer owns a surface, then it does not have a clip rect of its own.
1434 EXPECT_EQ(gfx::Rect(5, 5, 40, 40).ToString(),
1435 root_delegated_shared_quad_state
->clip_rect
.ToString());
1436 // Quads came with a clip rect.
1437 EXPECT_TRUE(root_delegated_shared_quad_state
->is_clipped
);
1439 host_impl_
->DrawLayers(&frame
);
1440 host_impl_
->DidDrawAllLayers(frame
);
1443 TEST_F(DelegatedRendererLayerImplTest
, Occlusion
) {
1444 gfx::Size
layer_size(1000, 1000);
1445 gfx::Size
viewport_size(1000, 1000);
1446 gfx::Rect
quad_screen_rect(211, 300, 400, 500);
1448 gfx::Transform transform
;
1449 transform
.Translate(211.0, 300.0);
1451 LayerTestCommon::LayerImplTest impl
;
1453 FakeDelegatedRendererLayerImpl
* delegated_renderer_layer_impl
=
1454 impl
.AddChildToRoot
<FakeDelegatedRendererLayerImpl
>();
1455 delegated_renderer_layer_impl
->SetBounds(layer_size
);
1456 delegated_renderer_layer_impl
->SetContentBounds(layer_size
);
1457 delegated_renderer_layer_impl
->SetDrawsContent(true);
1459 // Contributing render pass is offset by a transform and holds a quad that
1460 // covers it entirely.
1461 RenderPassList delegated_render_passes
;
1462 // pass2 is just the size of the quad. It contributes to |pass1| with a
1463 // translation of (211,300).
1464 RenderPassId pass2_id
=
1465 delegated_renderer_layer_impl
->FirstContributingRenderPassId();
1466 TestRenderPass
* pass2
= AddRenderPass(&delegated_render_passes
,
1468 gfx::Rect(quad_screen_rect
.size()),
1470 AddQuad(pass2
, gfx::Rect(quad_screen_rect
.size()), SK_ColorRED
);
1471 // |pass1| covers the whole layer.
1472 RenderPassId pass1_id
= RenderPassId(impl
.root_layer()->id(), 0);
1473 TestRenderPass
* pass1
= AddRenderPass(&delegated_render_passes
,
1475 gfx::Rect(layer_size
),
1477 AddRenderPassQuad(pass1
,
1482 SkXfermode::kSrcOver_Mode
);
1483 delegated_renderer_layer_impl
->SetFrameDataForRenderPasses(
1484 1.f
, delegated_render_passes
);
1486 impl
.CalcDrawProps(viewport_size
);
1489 SCOPED_TRACE("No occlusion");
1493 SCOPED_TRACE("Root render pass");
1494 impl
.AppendQuadsForPassWithOcclusion(delegated_renderer_layer_impl
, pass1
,
1496 LayerTestCommon::VerifyQuadsExactlyCoverRect(pass1
->quad_list
,
1498 ASSERT_EQ(1u, pass1
->quad_list
.size());
1499 EXPECT_EQ(DrawQuad::RENDER_PASS
, pass1
->quad_list
.front()->material
);
1502 SCOPED_TRACE("Contributing render pass");
1503 impl
.AppendQuadsForPassWithOcclusion(delegated_renderer_layer_impl
, pass2
,
1505 LayerTestCommon::VerifyQuadsExactlyCoverRect(
1506 pass2
->quad_list
, gfx::Rect(quad_screen_rect
.size()));
1507 ASSERT_EQ(1u, pass2
->quad_list
.size());
1508 EXPECT_EQ(DrawQuad::SOLID_COLOR
, pass2
->quad_list
.front()->material
);
1513 SCOPED_TRACE("Full occlusion");
1515 gfx::Rect
occluded(delegated_renderer_layer_impl
->visible_content_rect());
1517 SCOPED_TRACE("Root render pass");
1518 impl
.AppendQuadsForPassWithOcclusion(delegated_renderer_layer_impl
, pass1
,
1520 LayerTestCommon::VerifyQuadsExactlyCoverRect(pass1
->quad_list
,
1522 EXPECT_EQ(pass1
->quad_list
.size(), 0u);
1525 gfx::Rect
occluded(delegated_renderer_layer_impl
->visible_content_rect());
1527 SCOPED_TRACE("Contributing render pass");
1528 impl
.AppendQuadsForPassWithOcclusion(delegated_renderer_layer_impl
, pass2
,
1530 LayerTestCommon::VerifyQuadsExactlyCoverRect(pass2
->quad_list
,
1532 EXPECT_EQ(pass2
->quad_list
.size(), 0u);
1537 SCOPED_TRACE("Partial occlusion");
1539 gfx::Rect
occlusion_in_root_target(0, 0, 500, 1000);
1541 SCOPED_TRACE("Root render pass");
1542 impl
.AppendQuadsForPassWithOcclusion(delegated_renderer_layer_impl
, pass1
,
1543 occlusion_in_root_target
);
1544 size_t partially_occluded_count
= 0;
1545 LayerTestCommon::VerifyQuadsAreOccluded(pass1
->quad_list
,
1546 occlusion_in_root_target
,
1547 &partially_occluded_count
);
1548 // The layer outputs one quad, which is partially occluded.
1549 EXPECT_EQ(1u, pass1
->quad_list
.size());
1550 EXPECT_EQ(1u, partially_occluded_count
);
1553 gfx::Rect
occlusion_in_root_target(0, 0, 500, 1000);
1554 // Move the occlusion to where it is in the contributing surface.
1555 gfx::Rect occlusion_in_target_of_delegated_quad
=
1556 occlusion_in_root_target
- quad_screen_rect
.OffsetFromOrigin();
1558 SCOPED_TRACE("Contributing render pass");
1559 impl
.AppendQuadsForPassWithOcclusion(delegated_renderer_layer_impl
, pass2
,
1560 occlusion_in_root_target
);
1561 size_t partially_occluded_count
= 0;
1562 LayerTestCommon::VerifyQuadsAreOccluded(
1563 pass2
->quad_list
, occlusion_in_target_of_delegated_quad
,
1564 &partially_occluded_count
);
1565 // The layer outputs one quad, which is partially occluded.
1566 EXPECT_EQ(1u, pass2
->quad_list
.size());
1567 EXPECT_EQ(1u, partially_occluded_count
);
1568 // The quad in the contributing surface is at (211,300) in the root.
1569 // The occlusion extends to 500 in the x-axis, pushing the left of the
1570 // visible part of the quad to 500 - 211 = 300 - 11 inside the quad.
1571 EXPECT_EQ(gfx::Rect(300 - 11, 0, 100 + 11, 500).ToString(),
1572 pass2
->quad_list
.front()->visible_rect
.ToString());
1575 gfx::Rect
occlusion_in_root_target(0, 0, 500, 1000);
1576 // Move the occlusion to where it is in the contributing surface.
1577 gfx::Rect occlusion_in_target_of_delegated_quad
=
1578 occlusion_in_root_target
- quad_screen_rect
.OffsetFromOrigin();
1580 SCOPED_TRACE("Contributing render pass with transformed root");
1582 gfx::Transform layer_transform
;
1583 layer_transform
.Translate(11.0, 0.0);
1584 delegated_renderer_layer_impl
->SetTransform(layer_transform
);
1586 occlusion_in_target_of_delegated_quad
+= gfx::Vector2d(11, 0);
1588 impl
.CalcDrawProps(viewport_size
);
1590 impl
.AppendQuadsForPassWithOcclusion(delegated_renderer_layer_impl
, pass2
,
1591 occlusion_in_root_target
);
1592 size_t partially_occluded_count
= 0;
1593 LayerTestCommon::VerifyQuadsAreOccluded(
1594 pass2
->quad_list
, occlusion_in_target_of_delegated_quad
,
1595 &partially_occluded_count
);
1596 // The layer outputs one quad, which is partially occluded.
1597 EXPECT_EQ(1u, pass2
->quad_list
.size());
1598 EXPECT_EQ(1u, partially_occluded_count
);
1599 // The quad in the contributing surface is at (222,300) in the transformed
1600 // root. The occlusion extends to 500 in the x-axis, pushing the left of
1601 // the visible part of the quad to 500 - 222 = 300 - 22 inside the quad.
1602 EXPECT_EQ(gfx::Rect(300 - 22, 0, 100 + 22, 500).ToString(),
1603 pass2
->quad_list
.front()->visible_rect
.ToString());
1608 TEST_F(DelegatedRendererLayerImplTest
, DeviceScaleFactorOcclusion
) {
1609 gfx::Size
layer_size(1000, 1000);
1610 gfx::Size
viewport_size(1000, 1000);
1611 gfx::Rect
quad_screen_rect(211, 300, 400, 500);
1613 gfx::Transform transform
;
1614 transform
.Translate(211.f
, 300.f
);
1616 LayerTestCommon::LayerImplTest impl
;
1618 FakeDelegatedRendererLayerImpl
* delegated_renderer_layer_impl
=
1619 impl
.AddChildToRoot
<FakeDelegatedRendererLayerImpl
>();
1620 delegated_renderer_layer_impl
->SetBounds(layer_size
);
1621 delegated_renderer_layer_impl
->SetContentBounds(layer_size
);
1622 delegated_renderer_layer_impl
->SetDrawsContent(true);
1624 // Contributing render pass is offset by a transform and holds a quad that
1625 // covers it entirely.
1626 RenderPassList delegated_render_passes
;
1627 // pass2 is just the size of the quad. It contributes to |pass1| with a
1628 // translation of (211,300).
1629 RenderPassId pass2_id
=
1630 delegated_renderer_layer_impl
->FirstContributingRenderPassId();
1631 TestRenderPass
* pass2
=
1632 AddRenderPass(&delegated_render_passes
, pass2_id
,
1633 gfx::Rect(quad_screen_rect
.size()), transform
);
1634 AddQuad(pass2
, gfx::Rect(quad_screen_rect
.size()), SK_ColorRED
);
1635 // |pass1| covers the whole layer.
1636 RenderPassId pass1_id
= RenderPassId(impl
.root_layer()->id(), 0);
1637 TestRenderPass
* pass1
=
1638 AddRenderPass(&delegated_render_passes
, pass1_id
, gfx::Rect(layer_size
),
1640 AddRenderPassQuad(pass1
, pass2
, 0, FilterOperations(), transform
,
1641 SkXfermode::kSrcOver_Mode
);
1642 delegated_renderer_layer_impl
->SetFrameDataForRenderPasses(
1643 1.2f
, delegated_render_passes
);
1646 SCOPED_TRACE("Partial occlusion");
1648 gfx::Rect
occlusion_in_root_target(0, 0, 500, 1000);
1649 // Move the occlusion to where it is in the contributing surface.
1650 gfx::Rect occlusion_in_target_of_delegated_quad
=
1651 occlusion_in_root_target
- quad_screen_rect
.OffsetFromOrigin();
1653 SCOPED_TRACE("Contributing render pass");
1654 impl
.AppendQuadsForPassWithOcclusion(delegated_renderer_layer_impl
, pass2
,
1655 occlusion_in_root_target
);
1656 size_t partially_occluded_count
= 0;
1657 LayerTestCommon::VerifyQuadsAreOccluded(
1658 pass2
->quad_list
, occlusion_in_target_of_delegated_quad
,
1659 &partially_occluded_count
);
1660 // The layer outputs one quad, which is partially occluded.
1661 EXPECT_EQ(1u, pass2
->quad_list
.size());
1662 EXPECT_EQ(1u, partially_occluded_count
);
1663 // The quad in the contributing surface is at (211,300) in the root.
1664 // The occlusion extends to 500 * 1.2 (dsf) = 600 in the x-axis, pushing
1665 // the left of the visible part of the quad to 600 - 211 = 400 - 11 inside
1667 EXPECT_EQ(gfx::Rect(400 - 11, 0, 11, 500).ToString(),
1668 pass2
->quad_list
.front()->visible_rect
.ToString());
1673 TEST_F(DelegatedRendererLayerImplTest
, PushPropertiesTo
) {
1674 gfx::Size
layer_size(1000, 1000);
1676 scoped_ptr
<FakeDelegatedRendererLayerImpl
> delegated_renderer_layer_impl
=
1677 FakeDelegatedRendererLayerImpl::Create(host_impl_
->active_tree(), 5);
1678 delegated_renderer_layer_impl
->SetBounds(layer_size
);
1679 delegated_renderer_layer_impl
->SetContentBounds(layer_size
);
1680 delegated_renderer_layer_impl
->SetDrawsContent(true);
1682 RenderPassList delegated_render_passes
;
1683 // |pass1| covers the whole layer.
1684 RenderPassId pass1_id
= RenderPassId(5, 0);
1685 AddRenderPass(&delegated_render_passes
,
1687 gfx::Rect(layer_size
),
1689 delegated_renderer_layer_impl
->SetFrameDataForRenderPasses(
1690 2.f
, delegated_render_passes
);
1691 EXPECT_EQ(0.5f
, delegated_renderer_layer_impl
->inverse_device_scale_factor());
1693 scoped_ptr
<DelegatedRendererLayerImpl
> other_layer
=
1694 DelegatedRendererLayerImpl::Create(host_impl_
->active_tree(), 6);
1696 delegated_renderer_layer_impl
->PushPropertiesTo(other_layer
.get());
1698 EXPECT_EQ(0.5f
, other_layer
->inverse_device_scale_factor());