cc: Make a FakeResourceProvider and use it in tests to construct.
[chromium-blink-merge.git] / cc / layers / delegated_renderer_layer_impl_unittest.cc
blobd5ab06b7122b2590c358b929a9be8c3fb122043d
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"
29 namespace cc {
30 namespace {
32 class DelegatedRendererLayerImplTest : public testing::Test {
33 public:
34 DelegatedRendererLayerImplTest()
35 : proxy_(),
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));
46 protected:
47 FakeImplProxy proxy_;
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 {
57 public:
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,
95 RenderPassId(9, 6),
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,
100 RenderPassId(9, 7),
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,
106 RenderPassId(9, 8),
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
119 // layer_after.
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
124 // RenderPasses.
125 root_layer->AddChild(layer_before.Pass());
126 host_impl_->active_tree()->SetRootLayer(root_layer.Pass());
129 protected:
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
193 // passes.
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
308 // to the frame.
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
322 // in order.
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
342 // to the frame.
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(
416 gfx::Transform(),
417 frame.render_passes[2]->quad_list.front()->quadTransform());
418 EXPECT_TRANSFORMATION_MATRIX_EQ(
419 gfx::Transform(),
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(
423 gfx::Transform(),
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 {
464 public:
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
477 // added one pass.
478 ASSERT_EQ(6u, frame.render_passes.size());
480 // The DelegatedRendererLayer should have added its contributing RenderPasses
481 // to the frame.
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
487 // to the frame.
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
499 // in order.
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
516 // added one pass.
517 ASSERT_EQ(6u, frame.render_passes.size());
519 // The DelegatedRendererLayer should have added its contributing RenderPasses
520 // to the frame.
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
553 // added one pass.
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
579 // added one pass.
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(
585 gfx::Transform(),
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(
592 gfx::Transform(),
593 frame.render_passes[2]->quad_list.front()->quadTransform());
594 EXPECT_TRANSFORMATION_MATRIX_EQ(
595 gfx::Transform(),
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(
599 gfx::Transform(),
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 {
608 public:
609 DelegatedRendererLayerImplTestTransform()
610 : root_delegated_render_pass_is_clipped_(false),
611 delegated_device_scale_factor_(2.f) {}
613 void SetUpTest() {
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,
646 RenderPassId(10, 7),
647 child_pass_rect,
648 gfx::Transform());
649 SharedQuadState* shared_quad_state =
650 pass->CreateAndAppendSharedQuadState();
651 shared_quad_state->SetAll(child_pass_transform,
652 child_pass_content_bounds,
653 child_pass_rect,
654 child_pass_clip_rect,
655 child_pass_clipped,
656 1.f,
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),
666 false);
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),
673 false);
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,
685 RenderPassId(9, 6),
686 root_pass_rect,
687 gfx::Transform());
688 SharedQuadState* shared_quad_state = pass->CreateAndAppendSharedQuadState();
689 shared_quad_state->SetAll(root_pass_transform,
690 root_pass_content_bounds,
691 root_pass_rect,
692 root_pass_clip_rect,
693 root_pass_clipped,
694 1.f,
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),
717 false);
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),
724 false);
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),
731 false);
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),
738 false);
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);
792 protected:
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;
801 SetUpTest();
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;
808 VerifyRenderPasses(
809 frame,
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
821 // own a surface.
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(
847 expected,
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;
856 SetUpTest();
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;
863 VerifyRenderPasses(
864 frame,
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(
906 expected,
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;
915 SetUpTest();
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;
924 VerifyRenderPasses(
925 frame,
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(
955 expected,
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;
964 SetUpTest();
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;
973 VerifyRenderPasses(
974 frame,
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(
1003 expected,
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;
1014 SetUpTest();
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 {
1051 public:
1052 void SetUpTest() {
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),
1082 child_pass_rect,
1083 gfx::Transform());
1084 SharedQuadState* shared_quad_state =
1085 pass->CreateAndAppendSharedQuadState();
1086 shared_quad_state->SetAll(child_pass_transform,
1087 child_pass_content_bounds,
1088 child_pass_rect,
1089 child_pass_clip_rect,
1090 child_pass_clipped,
1091 1.f,
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),
1101 false);
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),
1108 false);
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,
1118 RenderPassId(9, 6),
1119 root_pass_rect,
1120 gfx::Transform());
1121 SharedQuadState* shared_quad_state = pass->CreateAndAppendSharedQuadState();
1122 shared_quad_state->SetAll(root_pass_transform,
1123 root_pass_content_bounds,
1124 root_pass_rect,
1125 root_pass_clip_rect,
1126 root_pass_clipped,
1127 1.f,
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),
1150 false);
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),
1157 false);
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),
1164 false);
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),
1171 false);
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());
1193 } else {
1194 root_layer->AddChild(delegated_renderer_layer.Pass());
1197 host_impl_->active_tree()->SetRootLayer(root_layer.Pass());
1200 protected:
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;
1211 SetUpTest();
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;
1240 SetUpTest();
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;
1269 SetUpTest();
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;
1299 SetUpTest();
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;
1328 SetUpTest();
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;
1357 SetUpTest();
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;
1387 SetUpTest();
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;
1415 SetUpTest();
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,
1467 pass2_id,
1468 gfx::Rect(quad_screen_rect.size()),
1469 transform);
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,
1474 pass1_id,
1475 gfx::Rect(layer_size),
1476 gfx::Transform());
1477 AddRenderPassQuad(pass1,
1478 pass2,
1480 FilterOperations(),
1481 transform,
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");
1490 gfx::Rect occluded;
1493 SCOPED_TRACE("Root render pass");
1494 impl.AppendQuadsForPassWithOcclusion(delegated_renderer_layer_impl, pass1,
1495 occluded);
1496 LayerTestCommon::VerifyQuadsExactlyCoverRect(pass1->quad_list,
1497 quad_screen_rect);
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,
1504 occluded);
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,
1519 occluded);
1520 LayerTestCommon::VerifyQuadsExactlyCoverRect(pass1->quad_list,
1521 gfx::Rect());
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,
1529 occluded);
1530 LayerTestCommon::VerifyQuadsExactlyCoverRect(pass2->quad_list,
1531 gfx::Rect());
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),
1639 gfx::Transform());
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
1666 // the quad.
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,
1686 pass1_id,
1687 gfx::Rect(layer_size),
1688 gfx::Transform());
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());
1701 } // namespace
1702 } // namespace cc