delegated_renderer_layer_impl_unittest.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
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.
4
5#include "cc/layers/delegated_renderer_layer_impl.h"
6
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_layer_tree_host_impl.h"
13#include "cc/test/fake_layer_tree_host_impl_client.h"
14#include "cc/test/fake_output_surface.h"
15#include "cc/test/fake_proxy.h"
16#include "cc/test/fake_rendering_stats_instrumentation.h"
17#include "cc/test/geometry_test_utils.h"
18#include "cc/test/layer_test_common.h"
19#include "cc/test/render_pass_test_common.h"
20#include "cc/test/render_pass_test_utils.h"
21#include "cc/test/test_shared_bitmap_manager.h"
22#include "cc/test/test_web_graphics_context_3d.h"
23#include "cc/trees/layer_tree_host_impl.h"
24#include "cc/trees/layer_tree_impl.h"
25#include "cc/trees/single_thread_proxy.h"
26#include "testing/gtest/include/gtest/gtest.h"
27#include "ui/gfx/frame_time.h"
28#include "ui/gfx/transform.h"
29
30namespace cc {
31namespace {
32
33class DelegatedRendererLayerImplTest : public testing::Test {
34 public:
35  DelegatedRendererLayerImplTest()
36      : proxy_(),
37        always_impl_thread_and_main_thread_blocked_(&proxy_) {
38    LayerTreeSettings settings;
39    settings.minimum_occlusion_tracking_size = gfx::Size();
40
41    host_impl_.reset(
42        new FakeLayerTreeHostImpl(settings, &proxy_, &shared_bitmap_manager_));
43    host_impl_->InitializeRenderer(
44        FakeOutputSurface::Create3d().PassAs<OutputSurface>());
45    host_impl_->SetViewportSize(gfx::Size(10, 10));
46  }
47
48 protected:
49  FakeProxy proxy_;
50  DebugScopedSetImplThreadAndMainThreadBlocked
51      always_impl_thread_and_main_thread_blocked_;
52  TestSharedBitmapManager shared_bitmap_manager_;
53  scoped_ptr<LayerTreeHostImpl> host_impl_;
54};
55
56class DelegatedRendererLayerImplTestSimple
57    : public DelegatedRendererLayerImplTest {
58 public:
59  DelegatedRendererLayerImplTestSimple()
60      : DelegatedRendererLayerImplTest() {
61    scoped_ptr<LayerImpl> root_layer = SolidColorLayerImpl::Create(
62        host_impl_->active_tree(), 1).PassAs<LayerImpl>();
63    scoped_ptr<LayerImpl> layer_before = SolidColorLayerImpl::Create(
64        host_impl_->active_tree(), 2).PassAs<LayerImpl>();
65    scoped_ptr<LayerImpl> layer_after = SolidColorLayerImpl::Create(
66        host_impl_->active_tree(), 3).PassAs<LayerImpl>();
67    scoped_ptr<FakeDelegatedRendererLayerImpl> delegated_renderer_layer =
68        FakeDelegatedRendererLayerImpl::Create(host_impl_->active_tree(), 4);
69
70    host_impl_->SetViewportSize(gfx::Size(100, 100));
71    root_layer->SetBounds(gfx::Size(100, 100));
72
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->SetForceRenderSurface(true);
78
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->SetForceRenderSurface(true);
84
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);
92
93    RenderPassList delegated_render_passes;
94    TestRenderPass* pass1 = AddRenderPass(&delegated_render_passes,
95                                          RenderPass::Id(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                                          RenderPass::Id(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                                          RenderPass::Id(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);
112
113    // The RenderPasses should be taken by the layer.
114    EXPECT_EQ(0u, delegated_render_passes.size());
115
116    root_layer_ = root_layer.get();
117    layer_before_ = layer_before.get();
118    layer_after_ = layer_after.get();
119    delegated_renderer_layer_ = delegated_renderer_layer.get();
120
121    // Force the delegated RenderPasses to come before the RenderPass from
122    // layer_after.
123    layer_after->AddChild(delegated_renderer_layer.PassAs<LayerImpl>());
124    root_layer->AddChild(layer_after.Pass());
125
126    // Get the RenderPass generated by layer_before to come before the delegated
127    // RenderPasses.
128    root_layer->AddChild(layer_before.Pass());
129    host_impl_->active_tree()->SetRootLayer(root_layer.Pass());
130  }
131
132 protected:
133  LayerImpl* root_layer_;
134  LayerImpl* layer_before_;
135  LayerImpl* layer_after_;
136  DelegatedRendererLayerImpl* delegated_renderer_layer_;
137};
138
139TEST_F(DelegatedRendererLayerImplTestSimple, AddsContributingRenderPasses) {
140  LayerTreeHostImpl::FrameData frame;
141  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
142
143  // Each non-DelegatedRendererLayer added one RenderPass. The
144  // DelegatedRendererLayer added two contributing passes.
145  ASSERT_EQ(5u, frame.render_passes.size());
146
147  // The DelegatedRendererLayer should have added its contributing RenderPasses
148  // to the frame.
149  EXPECT_EQ(4, frame.render_passes[1]->id.layer_id);
150  EXPECT_EQ(1, frame.render_passes[1]->id.index);
151  EXPECT_EQ(4, frame.render_passes[2]->id.layer_id);
152  EXPECT_EQ(2, frame.render_passes[2]->id.index);
153  // And all other RenderPasses should be non-delegated.
154  EXPECT_NE(4, frame.render_passes[0]->id.layer_id);
155  EXPECT_EQ(0, frame.render_passes[0]->id.index);
156  EXPECT_NE(4, frame.render_passes[3]->id.layer_id);
157  EXPECT_EQ(0, frame.render_passes[3]->id.index);
158  EXPECT_NE(4, frame.render_passes[4]->id.layer_id);
159  EXPECT_EQ(0, frame.render_passes[4]->id.index);
160
161  // The DelegatedRendererLayer should have added its RenderPasses to the frame
162  // in order.
163  EXPECT_EQ(gfx::Rect(6, 6, 6, 6).ToString(),
164            frame.render_passes[1]->output_rect.ToString());
165  EXPECT_EQ(gfx::Rect(7, 7, 7, 7).ToString(),
166            frame.render_passes[2]->output_rect.ToString());
167
168  host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
169  host_impl_->DidDrawAllLayers(frame);
170}
171
172TEST_F(DelegatedRendererLayerImplTestSimple,
173       AddsQuadsToContributingRenderPasses) {
174  LayerTreeHostImpl::FrameData frame;
175  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
176
177  // Each non-DelegatedRendererLayer added one RenderPass. The
178  // DelegatedRendererLayer added two contributing passes.
179  ASSERT_EQ(5u, frame.render_passes.size());
180
181  // The DelegatedRendererLayer should have added its contributing RenderPasses
182  // to the frame.
183  EXPECT_EQ(4, frame.render_passes[1]->id.layer_id);
184  EXPECT_EQ(1, frame.render_passes[1]->id.index);
185  EXPECT_EQ(4, frame.render_passes[2]->id.layer_id);
186  EXPECT_EQ(2, frame.render_passes[2]->id.index);
187
188  // The DelegatedRendererLayer should have added copies of its quads to
189  // contributing RenderPasses.
190  ASSERT_EQ(1u, frame.render_passes[1]->quad_list.size());
191  EXPECT_EQ(gfx::Rect(0, 0, 6, 6).ToString(),
192            frame.render_passes[1]->quad_list[0]->rect.ToString());
193
194  // Verify it added the right quads.
195  ASSERT_EQ(2u, frame.render_passes[2]->quad_list.size());
196  EXPECT_EQ(gfx::Rect(0, 0, 7, 7).ToString(),
197            frame.render_passes[2]->quad_list[0]->rect.ToString());
198  EXPECT_EQ(gfx::Rect(6, 6, 6, 6).ToString(),
199            frame.render_passes[2]->quad_list[1]->rect.ToString());
200  ASSERT_EQ(1u, frame.render_passes[1]->quad_list.size());
201  EXPECT_EQ(gfx::Rect(0, 0, 6, 6).ToString(),
202            frame.render_passes[1]->quad_list[0]->rect.ToString());
203
204  host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
205  host_impl_->DidDrawAllLayers(frame);
206}
207
208TEST_F(DelegatedRendererLayerImplTestSimple, AddsQuadsToTargetRenderPass) {
209  LayerTreeHostImpl::FrameData frame;
210  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
211
212  // Each non-DelegatedRendererLayer added one RenderPass. The
213  // DelegatedRendererLayer added two contributing passes.
214  ASSERT_EQ(5u, frame.render_passes.size());
215
216  // The layer's target is the RenderPass from layer_after_.
217  EXPECT_EQ(RenderPass::Id(3, 0), frame.render_passes[3]->id);
218
219  // The DelegatedRendererLayer should have added copies of quads in its root
220  // RenderPass to its target RenderPass. The layer_after_ also adds one quad.
221  ASSERT_EQ(2u, frame.render_passes[3]->quad_list.size());
222
223  // Verify it added the right quads.
224  EXPECT_EQ(gfx::Rect(7, 7, 7, 7).ToString(),
225            frame.render_passes[3]->quad_list[0]->rect.ToString());
226
227  // Its target layer should have a quad as well.
228  EXPECT_EQ(gfx::Rect(0, 0, 15, 15).ToString(),
229            frame.render_passes[3]->quad_list[1]->rect.ToString());
230
231  host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
232  host_impl_->DidDrawAllLayers(frame);
233}
234
235TEST_F(DelegatedRendererLayerImplTestSimple,
236       QuadsFromRootRenderPassAreModifiedForTheTarget) {
237  LayerTreeHostImpl::FrameData frame;
238  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
239
240  // Each non-DelegatedRendererLayer added one RenderPass. The
241  // DelegatedRendererLayer added two contributing passes.
242  ASSERT_EQ(5u, frame.render_passes.size());
243
244  // The DelegatedRendererLayer is at position 3,3 compared to its target, and
245  // has a translation transform of 1,1. So its root RenderPass' quads should
246  // all be transformed by that combined amount.
247  gfx::Transform transform;
248  transform.Translate(4.0, 4.0);
249  EXPECT_TRANSFORMATION_MATRIX_EQ(
250      transform, frame.render_passes[3]->quad_list[0]->quadTransform());
251
252  // Quads from non-root RenderPasses should not be shifted though.
253  ASSERT_EQ(2u, frame.render_passes[2]->quad_list.size());
254  EXPECT_TRANSFORMATION_MATRIX_EQ(
255      gfx::Transform(), frame.render_passes[2]->quad_list[0]->quadTransform());
256  EXPECT_TRANSFORMATION_MATRIX_EQ(
257      gfx::Transform(), frame.render_passes[2]->quad_list[1]->quadTransform());
258  ASSERT_EQ(1u, frame.render_passes[1]->quad_list.size());
259  EXPECT_TRANSFORMATION_MATRIX_EQ(
260      gfx::Transform(), frame.render_passes[1]->quad_list[0]->quadTransform());
261
262  host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
263  host_impl_->DidDrawAllLayers(frame);
264}
265
266TEST_F(DelegatedRendererLayerImplTestSimple, RenderPassTransformIsModified) {
267  LayerTreeHostImpl::FrameData frame;
268  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
269
270  // The delegated layer has a surface between it and the root.
271  EXPECT_TRUE(delegated_renderer_layer_->render_target()->parent());
272
273  // Each non-DelegatedRendererLayer added one RenderPass. The
274  // DelegatedRendererLayer added two contributing passes.
275  ASSERT_EQ(5u, frame.render_passes.size());
276
277  // The DelegatedRendererLayer is at position 9,9 compared to the root, so all
278  // render pass' transforms to the root should be shifted by this amount.
279  gfx::Transform transform;
280  transform.Translate(9.0, 9.0);
281
282  // The first contributing surface has a translation of 5, 6.
283  gfx::Transform five_six(1, 0, 0, 1, 5, 6);
284
285  // The second contributing surface has a translation of 7, 8.
286  gfx::Transform seven_eight(1, 0, 0, 1, 7, 8);
287
288  EXPECT_TRANSFORMATION_MATRIX_EQ(
289      transform * five_six, frame.render_passes[1]->transform_to_root_target);
290  EXPECT_TRANSFORMATION_MATRIX_EQ(
291      transform * seven_eight,
292      frame.render_passes[2]->transform_to_root_target);
293
294  host_impl_->DrawLayers(&frame, base::TimeTicks::Now());
295  host_impl_->DidDrawAllLayers(frame);
296}
297
298TEST_F(DelegatedRendererLayerImplTestSimple, DoesNotOwnARenderSurface) {
299  LayerTreeHostImpl::FrameData frame;
300  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
301
302  // If the DelegatedRendererLayer is axis aligned and has opacity 1, then it
303  // has no need to be a RenderSurface for the quads it carries.
304  EXPECT_FALSE(delegated_renderer_layer_->render_surface());
305
306  host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
307  host_impl_->DidDrawAllLayers(frame);
308}
309
310TEST_F(DelegatedRendererLayerImplTestSimple, DoesOwnARenderSurfaceForOpacity) {
311  delegated_renderer_layer_->SetOpacity(0.5f);
312
313  LayerTreeHostImpl::FrameData frame;
314  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
315
316  // This test case has quads from multiple layers in the delegated renderer, so
317  // if the DelegatedRendererLayer has opacity < 1, it should end up with a
318  // render surface.
319  EXPECT_TRUE(delegated_renderer_layer_->render_surface());
320
321  host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
322  host_impl_->DidDrawAllLayers(frame);
323}
324
325TEST_F(DelegatedRendererLayerImplTestSimple,
326       DoesOwnARenderSurfaceForTransform) {
327  gfx::Transform rotation;
328  rotation.RotateAboutZAxis(30.0);
329  delegated_renderer_layer_->SetTransform(rotation);
330
331  LayerTreeHostImpl::FrameData frame;
332  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
333
334  // This test case has quads from multiple layers in the delegated renderer, so
335  // if the DelegatedRendererLayer has opacity < 1, it should end up with a
336  // render surface.
337  EXPECT_TRUE(delegated_renderer_layer_->render_surface());
338
339  host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
340  host_impl_->DidDrawAllLayers(frame);
341}
342
343class DelegatedRendererLayerImplTestOwnSurface
344    : public DelegatedRendererLayerImplTestSimple {
345 public:
346  DelegatedRendererLayerImplTestOwnSurface()
347      : DelegatedRendererLayerImplTestSimple() {
348    delegated_renderer_layer_->SetForceRenderSurface(true);
349  }
350};
351
352TEST_F(DelegatedRendererLayerImplTestOwnSurface, AddsRenderPasses) {
353  LayerTreeHostImpl::FrameData frame;
354  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
355
356  // Each non-DelegatedRendererLayer added one RenderPass. The
357  // DelegatedRendererLayer added two contributing passes and its owned surface
358  // added one pass.
359  ASSERT_EQ(6u, frame.render_passes.size());
360
361  // The DelegatedRendererLayer should have added its contributing RenderPasses
362  // to the frame.
363  EXPECT_EQ(4, frame.render_passes[1]->id.layer_id);
364  EXPECT_EQ(1, frame.render_passes[1]->id.index);
365  EXPECT_EQ(4, frame.render_passes[2]->id.layer_id);
366  EXPECT_EQ(2, frame.render_passes[2]->id.index);
367  // The DelegatedRendererLayer should have added a RenderPass for its surface
368  // to the frame.
369  EXPECT_EQ(4, frame.render_passes[1]->id.layer_id);
370  EXPECT_EQ(0, frame.render_passes[3]->id.index);
371  // And all other RenderPasses should be non-delegated.
372  EXPECT_NE(4, frame.render_passes[0]->id.layer_id);
373  EXPECT_EQ(0, frame.render_passes[0]->id.index);
374  EXPECT_NE(4, frame.render_passes[4]->id.layer_id);
375  EXPECT_EQ(0, frame.render_passes[4]->id.index);
376  EXPECT_NE(4, frame.render_passes[5]->id.layer_id);
377  EXPECT_EQ(0, frame.render_passes[5]->id.index);
378
379  // The DelegatedRendererLayer should have added its RenderPasses to the frame
380  // in order.
381  EXPECT_EQ(gfx::Rect(6, 6, 6, 6).ToString(),
382            frame.render_passes[1]->output_rect.ToString());
383  EXPECT_EQ(gfx::Rect(7, 7, 7, 7).ToString(),
384            frame.render_passes[2]->output_rect.ToString());
385
386  host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
387  host_impl_->DidDrawAllLayers(frame);
388}
389
390TEST_F(DelegatedRendererLayerImplTestOwnSurface,
391       AddsQuadsToContributingRenderPasses) {
392  LayerTreeHostImpl::FrameData frame;
393  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
394
395  // Each non-DelegatedRendererLayer added one RenderPass. The
396  // DelegatedRendererLayer added two contributing passes and its owned surface
397  // added one pass.
398  ASSERT_EQ(6u, frame.render_passes.size());
399
400  // The DelegatedRendererLayer should have added its contributing RenderPasses
401  // to the frame.
402  EXPECT_EQ(4, frame.render_passes[1]->id.layer_id);
403  EXPECT_EQ(1, frame.render_passes[1]->id.index);
404  EXPECT_EQ(4, frame.render_passes[2]->id.layer_id);
405  EXPECT_EQ(2, frame.render_passes[2]->id.index);
406
407  // The DelegatedRendererLayer should have added copies of its quads to
408  // contributing RenderPasses.
409  ASSERT_EQ(1u, frame.render_passes[1]->quad_list.size());
410  EXPECT_EQ(gfx::Rect(0, 0, 6, 6).ToString(),
411            frame.render_passes[1]->quad_list[0]->rect.ToString());
412
413  // Verify it added the right quads.
414  ASSERT_EQ(2u, frame.render_passes[2]->quad_list.size());
415  EXPECT_EQ(gfx::Rect(0, 0, 7, 7).ToString(),
416            frame.render_passes[2]->quad_list[0]->rect.ToString());
417  EXPECT_EQ(gfx::Rect(6, 6, 6, 6).ToString(),
418            frame.render_passes[2]->quad_list[1]->rect.ToString());
419  ASSERT_EQ(1u, frame.render_passes[1]->quad_list.size());
420  EXPECT_EQ(gfx::Rect(0, 0, 6, 6).ToString(),
421            frame.render_passes[1]->quad_list[0]->rect.ToString());
422
423  host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
424  host_impl_->DidDrawAllLayers(frame);
425}
426
427TEST_F(DelegatedRendererLayerImplTestOwnSurface, AddsQuadsToTargetRenderPass) {
428  LayerTreeHostImpl::FrameData frame;
429  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
430
431  // Each non-DelegatedRendererLayer added one RenderPass. The
432  // DelegatedRendererLayer added two contributing passes and its owned surface
433  // added one pass.
434  ASSERT_EQ(6u, frame.render_passes.size());
435
436  // The layer's target is the RenderPass owned by itself.
437  EXPECT_EQ(RenderPass::Id(4, 0), frame.render_passes[3]->id);
438
439  // The DelegatedRendererLayer should have added copies of quads in its root
440  // RenderPass to its target RenderPass.
441  // The layer_after also adds one quad.
442  ASSERT_EQ(1u, frame.render_passes[3]->quad_list.size());
443
444  // Verify it added the right quads.
445  EXPECT_EQ(gfx::Rect(7, 7, 7, 7).ToString(),
446            frame.render_passes[3]->quad_list[0]->rect.ToString());
447
448  host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
449  host_impl_->DidDrawAllLayers(frame);
450}
451
452TEST_F(DelegatedRendererLayerImplTestOwnSurface,
453       QuadsFromRootRenderPassAreNotModifiedForTheTarget) {
454  LayerTreeHostImpl::FrameData frame;
455  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
456
457  // Each non-DelegatedRendererLayer added one RenderPass. The
458  // DelegatedRendererLayer added two contributing passes and its owned surface
459  // added one pass.
460  ASSERT_EQ(6u, frame.render_passes.size());
461
462  // Because the DelegatedRendererLayer owns a RenderSurfaceImpl, its root
463  // RenderPass' quads do not need to be translated at all.
464  EXPECT_TRANSFORMATION_MATRIX_EQ(
465      gfx::Transform(), frame.render_passes[3]->quad_list[0]->quadTransform());
466
467  // Quads from non-root RenderPasses should not be shifted either.
468  ASSERT_EQ(2u, frame.render_passes[2]->quad_list.size());
469  EXPECT_TRANSFORMATION_MATRIX_EQ(
470      gfx::Transform(), frame.render_passes[2]->quad_list[0]->quadTransform());
471  EXPECT_TRANSFORMATION_MATRIX_EQ(
472      gfx::Transform(), frame.render_passes[2]->quad_list[1]->quadTransform());
473  ASSERT_EQ(1u, frame.render_passes[1]->quad_list.size());
474  EXPECT_TRANSFORMATION_MATRIX_EQ(
475      gfx::Transform(), frame.render_passes[1]->quad_list[0]->quadTransform());
476
477  host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
478  host_impl_->DidDrawAllLayers(frame);
479}
480
481class DelegatedRendererLayerImplTestTransform
482    : public DelegatedRendererLayerImplTest {
483 public:
484  DelegatedRendererLayerImplTestTransform()
485      : root_delegated_render_pass_is_clipped_(false),
486        delegated_device_scale_factor_(2.f) {}
487
488  void SetUpTest() {
489    host_impl_->SetDeviceScaleFactor(2.f);
490
491    scoped_ptr<LayerImpl> root_layer = LayerImpl::Create(
492        host_impl_->active_tree(), 1);
493    scoped_ptr<FakeDelegatedRendererLayerImpl> delegated_renderer_layer =
494        FakeDelegatedRendererLayerImpl::Create(host_impl_->active_tree(), 2);
495
496    host_impl_->SetViewportSize(gfx::Size(200, 200));
497    root_layer->SetBounds(gfx::Size(100, 100));
498
499    delegated_renderer_layer->SetPosition(gfx::Point(20, 20));
500    delegated_renderer_layer->SetBounds(gfx::Size(75, 75));
501    delegated_renderer_layer->SetContentBounds(gfx::Size(75, 75));
502    delegated_renderer_layer->SetDrawsContent(true);
503    gfx::Transform transform;
504    transform.Scale(2.0, 2.0);
505    transform.Translate(8.0, 8.0);
506    delegated_renderer_layer->SetTransform(transform);
507
508    RenderPassList delegated_render_passes;
509
510    gfx::Size child_pass_content_bounds(7, 7);
511    gfx::Rect child_pass_rect(20, 20, 7, 7);
512    gfx::Transform child_pass_transform;
513    child_pass_transform.Scale(0.8f, 0.8f);
514    child_pass_transform.Translate(9.0, 9.0);
515    gfx::Rect child_pass_clip_rect(21, 21, 3, 3);
516    bool child_pass_clipped = false;
517
518    {
519      TestRenderPass* pass = AddRenderPass(
520          &delegated_render_passes,
521          RenderPass::Id(10, 7),
522          child_pass_rect,
523          gfx::Transform());
524      SharedQuadState* shared_quad_state =
525          pass->CreateAndAppendSharedQuadState();
526      shared_quad_state->SetAll(child_pass_transform,
527                                child_pass_content_bounds,
528                                child_pass_rect,
529                                child_pass_clip_rect,
530                                child_pass_clipped,
531                                1.f,
532                                SkXfermode::kSrcOver_Mode,
533                                0);
534
535      SolidColorDrawQuad* color_quad;
536      color_quad = pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
537      color_quad->SetNew(shared_quad_state,
538                         gfx::Rect(20, 20, 3, 7),
539                         gfx::Rect(20, 20, 3, 7),
540                         1u,
541                         false);
542
543      color_quad = pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
544      color_quad->SetNew(shared_quad_state,
545                         gfx::Rect(23, 20, 4, 7),
546                         gfx::Rect(23, 20, 4, 7),
547                         1u,
548                         false);
549    }
550
551    gfx::Size root_pass_content_bounds(100, 100);
552    gfx::Rect root_pass_rect(0, 0, 100, 100);
553    gfx::Transform root_pass_transform;
554    root_pass_transform.Scale(1.5, 1.5);
555    root_pass_transform.Translate(7.0, 7.0);
556    gfx::Rect root_pass_clip_rect(10, 10, 35, 35);
557    bool root_pass_clipped = root_delegated_render_pass_is_clipped_;
558
559    TestRenderPass* pass = AddRenderPass(
560        &delegated_render_passes,
561        RenderPass::Id(9, 6),
562        root_pass_rect,
563        gfx::Transform());
564    SharedQuadState* shared_quad_state = pass->CreateAndAppendSharedQuadState();
565    shared_quad_state->SetAll(root_pass_transform,
566                              root_pass_content_bounds,
567                              root_pass_rect,
568                              root_pass_clip_rect,
569                              root_pass_clipped,
570                              1.f,
571                              SkXfermode::kSrcOver_Mode,
572                              0);
573
574    RenderPassDrawQuad* render_pass_quad =
575        pass->CreateAndAppendDrawQuad<RenderPassDrawQuad>();
576    render_pass_quad->SetNew(
577        shared_quad_state,
578        gfx::Rect(5, 5, 7, 7),  // quad_rect
579        gfx::Rect(5, 5, 7, 7),  // visible_rect
580        RenderPass::Id(10, 7),  // render_pass_id
581        false,                  // is_replica
582        0,                      // mask_resource_id
583        child_pass_rect,        // contents_changed_since_last_frame
584        gfx::RectF(),           // mask_uv_rect
585        FilterOperations(),     // filters
586        FilterOperations());    // background_filters
587
588    SolidColorDrawQuad* color_quad;
589    color_quad = pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
590    color_quad->SetNew(shared_quad_state,
591                       gfx::Rect(0, 0, 10, 10),
592                       gfx::Rect(0, 0, 10, 10),
593                       1u,
594                       false);
595
596    color_quad = pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
597    color_quad->SetNew(shared_quad_state,
598                       gfx::Rect(0, 10, 10, 10),
599                       gfx::Rect(0, 10, 10, 10),
600                       2u,
601                       false);
602
603    color_quad = pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
604    color_quad->SetNew(shared_quad_state,
605                       gfx::Rect(10, 0, 10, 10),
606                       gfx::Rect(10, 0, 10, 10),
607                       3u,
608                       false);
609
610    color_quad = pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
611    color_quad->SetNew(shared_quad_state,
612                       gfx::Rect(10, 10, 10, 10),
613                       gfx::Rect(10, 10, 10, 10),
614                       4u,
615                       false);
616
617    delegated_renderer_layer->SetFrameDataForRenderPasses(
618        delegated_device_scale_factor_, &delegated_render_passes);
619
620    // The RenderPasses should be taken by the layer.
621    EXPECT_EQ(0u, delegated_render_passes.size());
622
623    root_layer_ = root_layer.get();
624    delegated_renderer_layer_ = delegated_renderer_layer.get();
625
626    root_layer->AddChild(delegated_renderer_layer.PassAs<LayerImpl>());
627    host_impl_->active_tree()->SetRootLayer(root_layer.Pass());
628  }
629
630  void VerifyRenderPasses(
631      const LayerTreeHostImpl::FrameData& frame,
632      size_t num_render_passes,
633      const SharedQuadState** root_delegated_shared_quad_state,
634      const SharedQuadState** contrib_delegated_shared_quad_state) {
635    ASSERT_EQ(num_render_passes, frame.render_passes.size());
636    // The contributing render pass in the DelegatedRendererLayer.
637    EXPECT_EQ(2, frame.render_passes[0]->id.layer_id);
638    EXPECT_EQ(1, frame.render_passes[0]->id.index);
639    // The root render pass.
640    EXPECT_EQ(1, frame.render_passes.back()->id.layer_id);
641    EXPECT_EQ(0, frame.render_passes.back()->id.index);
642
643    const QuadList& contrib_delegated_quad_list =
644        frame.render_passes[0]->quad_list;
645    ASSERT_EQ(2u, contrib_delegated_quad_list.size());
646
647    const QuadList& root_delegated_quad_list =
648        frame.render_passes[1]->quad_list;
649    ASSERT_EQ(5u, root_delegated_quad_list.size());
650
651    // All quads in a render pass should share the same state.
652    *contrib_delegated_shared_quad_state =
653        contrib_delegated_quad_list[0]->shared_quad_state;
654    EXPECT_EQ(*contrib_delegated_shared_quad_state,
655              contrib_delegated_quad_list[1]->shared_quad_state);
656
657    *root_delegated_shared_quad_state =
658        root_delegated_quad_list[0]->shared_quad_state;
659    EXPECT_EQ(*root_delegated_shared_quad_state,
660              root_delegated_quad_list[1]->shared_quad_state);
661    EXPECT_EQ(*root_delegated_shared_quad_state,
662              root_delegated_quad_list[2]->shared_quad_state);
663    EXPECT_EQ(*root_delegated_shared_quad_state,
664              root_delegated_quad_list[3]->shared_quad_state);
665    EXPECT_EQ(*root_delegated_shared_quad_state,
666              root_delegated_quad_list[4]->shared_quad_state);
667
668    EXPECT_NE(*contrib_delegated_shared_quad_state,
669              *root_delegated_shared_quad_state);
670  }
671
672 protected:
673  LayerImpl* root_layer_;
674  DelegatedRendererLayerImpl* delegated_renderer_layer_;
675  bool root_delegated_render_pass_is_clipped_;
676  float delegated_device_scale_factor_;
677};
678
679TEST_F(DelegatedRendererLayerImplTestTransform, QuadsUnclipped_NoSurface) {
680  root_delegated_render_pass_is_clipped_ = false;
681  SetUpTest();
682
683  LayerTreeHostImpl::FrameData frame;
684  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
685
686  const SharedQuadState* root_delegated_shared_quad_state = NULL;
687  const SharedQuadState* contrib_delegated_shared_quad_state = NULL;
688  VerifyRenderPasses(
689      frame,
690      2,
691      &root_delegated_shared_quad_state,
692      &contrib_delegated_shared_quad_state);
693
694  // When the quads don't have a clip of their own, the clip rect is set to
695  // the drawable_content_rect of the delegated renderer layer.
696  EXPECT_EQ(delegated_renderer_layer_->drawable_content_rect().ToString(),
697            root_delegated_shared_quad_state->clip_rect.ToString());
698
699  // Even though the quads in the root pass have no clip of their own, they
700  // inherit the clip rect from the delegated renderer layer if it does not
701  // own a surface.
702  EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped);
703
704  gfx::Transform expected;
705  // Device scale factor.
706  expected.Scale(2.0, 2.0);
707  // This is the transform from the layer's space to its target.
708  expected.Translate(20, 20);
709  expected.Scale(2.0, 2.0);
710  expected.Translate(8.0, 8.0);
711  // This is the transform within the source frame.
712  // Inverse device scale factor to go from physical space to layer space.
713  expected.Scale(0.5, 0.5);
714  expected.Scale(1.5, 1.5);
715  expected.Translate(7.0, 7.0);
716  EXPECT_TRANSFORMATION_MATRIX_EQ(
717      expected, root_delegated_shared_quad_state->content_to_target_transform);
718
719  // The contributing render pass should not be transformed from its input.
720  EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(),
721            contrib_delegated_shared_quad_state->clip_rect.ToString());
722  EXPECT_FALSE(contrib_delegated_shared_quad_state->is_clipped);
723  expected.MakeIdentity();
724  expected.Scale(0.8f, 0.8f);
725  expected.Translate(9.0, 9.0);
726  EXPECT_TRANSFORMATION_MATRIX_EQ(
727      expected,
728      contrib_delegated_shared_quad_state->content_to_target_transform);
729
730  host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
731  host_impl_->DidDrawAllLayers(frame);
732}
733
734TEST_F(DelegatedRendererLayerImplTestTransform, QuadsClipped_NoSurface) {
735  root_delegated_render_pass_is_clipped_ = true;
736  SetUpTest();
737
738  LayerTreeHostImpl::FrameData frame;
739  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
740
741  const SharedQuadState* root_delegated_shared_quad_state = NULL;
742  const SharedQuadState* contrib_delegated_shared_quad_state = NULL;
743  VerifyRenderPasses(
744      frame,
745      2,
746      &root_delegated_shared_quad_state,
747      &contrib_delegated_shared_quad_state);
748
749  // Since the quads have a clip_rect it should be modified by delegated
750  // renderer layer's draw_transform.
751  // The position of the resulting clip_rect is:
752  // (clip rect position (10) * inverse dsf (1/2) + translate (8)) *
753  //     layer scale (2) + layer position (20) = 46
754  // The device scale is 2, so everything gets doubled, giving 92.
755  //
756  // The size is 35x35 scaled by the device scale.
757  EXPECT_EQ(gfx::Rect(92, 92, 70, 70).ToString(),
758            root_delegated_shared_quad_state->clip_rect.ToString());
759
760  // The quads had a clip and it should be preserved.
761  EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped);
762
763  gfx::Transform expected;
764  // Device scale factor.
765  expected.Scale(2.0, 2.0);
766  // This is the transform from the layer's space to its target.
767  expected.Translate(20, 20);
768  expected.Scale(2.0, 2.0);
769  expected.Translate(8.0, 8.0);
770  // This is the transform within the source frame.
771  // Inverse device scale factor to go from physical space to layer space.
772  expected.Scale(0.5, 0.5);
773  expected.Scale(1.5, 1.5);
774  expected.Translate(7.0, 7.0);
775  EXPECT_TRANSFORMATION_MATRIX_EQ(
776      expected, root_delegated_shared_quad_state->content_to_target_transform);
777
778  // The contributing render pass should not be transformed from its input.
779  EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(),
780            contrib_delegated_shared_quad_state->clip_rect.ToString());
781  EXPECT_FALSE(contrib_delegated_shared_quad_state->is_clipped);
782  expected.MakeIdentity();
783  expected.Scale(0.8f, 0.8f);
784  expected.Translate(9.0, 9.0);
785  EXPECT_TRANSFORMATION_MATRIX_EQ(
786      expected,
787      contrib_delegated_shared_quad_state->content_to_target_transform);
788
789  host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
790  host_impl_->DidDrawAllLayers(frame);
791}
792
793TEST_F(DelegatedRendererLayerImplTestTransform, QuadsUnclipped_Surface) {
794  root_delegated_render_pass_is_clipped_ = false;
795  SetUpTest();
796
797  delegated_renderer_layer_->SetForceRenderSurface(true);
798
799  LayerTreeHostImpl::FrameData frame;
800  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
801
802  const SharedQuadState* root_delegated_shared_quad_state = NULL;
803  const SharedQuadState* contrib_delegated_shared_quad_state = NULL;
804  VerifyRenderPasses(
805      frame,
806      3,
807      &root_delegated_shared_quad_state,
808      &contrib_delegated_shared_quad_state);
809
810  // When the layer owns a surface, then its position and translation are not
811  // a part of its draw transform.
812  EXPECT_EQ(gfx::Rect(10, 10, 35, 35).ToString(),
813            root_delegated_shared_quad_state->clip_rect.ToString());
814
815  // Since the layer owns a surface it doesn't need to clip its quads, so
816  // unclipped quads remain unclipped.
817  EXPECT_FALSE(root_delegated_shared_quad_state->is_clipped);
818
819  gfx::Transform expected;
820  // This is the transform within the source frame.
821  expected.Scale(1.5, 1.5);
822  expected.Translate(7.0, 7.0);
823  EXPECT_TRANSFORMATION_MATRIX_EQ(
824      expected, root_delegated_shared_quad_state->content_to_target_transform);
825
826  // The contributing render pass should not be transformed from its input.
827  EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(),
828            contrib_delegated_shared_quad_state->clip_rect.ToString());
829  EXPECT_FALSE(contrib_delegated_shared_quad_state->is_clipped);
830  expected.MakeIdentity();
831  expected.Scale(0.8f, 0.8f);
832  expected.Translate(9.0, 9.0);
833  EXPECT_TRANSFORMATION_MATRIX_EQ(
834      expected,
835      contrib_delegated_shared_quad_state->content_to_target_transform);
836
837  host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
838  host_impl_->DidDrawAllLayers(frame);
839}
840
841TEST_F(DelegatedRendererLayerImplTestTransform, QuadsClipped_Surface) {
842  root_delegated_render_pass_is_clipped_ = true;
843  SetUpTest();
844
845  delegated_renderer_layer_->SetForceRenderSurface(true);
846
847  LayerTreeHostImpl::FrameData frame;
848  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
849
850  const SharedQuadState* root_delegated_shared_quad_state = NULL;
851  const SharedQuadState* contrib_delegated_shared_quad_state = NULL;
852  VerifyRenderPasses(
853      frame,
854      3,
855      &root_delegated_shared_quad_state,
856      &contrib_delegated_shared_quad_state);
857
858  // When the layer owns a surface, then its position and translation are not
859  // a part of its draw transform. The clip_rect should be preserved.
860  EXPECT_EQ(gfx::Rect(10, 10, 35, 35).ToString(),
861            root_delegated_shared_quad_state->clip_rect.ToString());
862
863  // The quads had a clip and it should be preserved.
864  EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped);
865
866  gfx::Transform expected;
867  // This is the transform within the source frame.
868  expected.Scale(1.5, 1.5);
869  expected.Translate(7.0, 7.0);
870  EXPECT_TRANSFORMATION_MATRIX_EQ(
871      expected, root_delegated_shared_quad_state->content_to_target_transform);
872
873  // The contributing render pass should not be transformed from its input.
874  EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(),
875            contrib_delegated_shared_quad_state->clip_rect.ToString());
876  EXPECT_FALSE(contrib_delegated_shared_quad_state->is_clipped);
877  expected.MakeIdentity();
878  expected.Scale(0.8f, 0.8f);
879  expected.Translate(9.0, 9.0);
880  EXPECT_TRANSFORMATION_MATRIX_EQ(
881      expected,
882      contrib_delegated_shared_quad_state->content_to_target_transform);
883
884  host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
885  host_impl_->DidDrawAllLayers(frame);
886}
887
888TEST_F(DelegatedRendererLayerImplTestTransform, MismatchedDeviceScaleFactor) {
889  root_delegated_render_pass_is_clipped_ = true;
890  delegated_device_scale_factor_ = 1.3f;
891
892  SetUpTest();
893
894  LayerTreeHostImpl::FrameData frame;
895  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
896
897  const SharedQuadState* root_delegated_shared_quad_state = NULL;
898  const SharedQuadState* contrib_delegated_shared_quad_state = NULL;
899  VerifyRenderPasses(frame,
900                     2,
901                     &root_delegated_shared_quad_state,
902                     &contrib_delegated_shared_quad_state);
903
904  // The parent tree's device scale factor is 2.0, but the child has submitted a
905  // frame with a device scale factor of 1.3.  Absent any better option, the
906  // only thing we can do is scale from 1.3 -> 2.0.
907
908  gfx::Transform expected;
909  // Device scale factor (from parent).
910  expected.Scale(2.0, 2.0);
911  // This is the transform from the layer's space to its target.
912  expected.Translate(20, 20);
913  expected.Scale(2.0, 2.0);
914  expected.Translate(8.0, 8.0);
915  // This is the transform within the source frame.
916  // Inverse device scale factor (from child).
917  expected.Scale(1.0f / 1.3f, 1.0f / 1.3f);
918  expected.Scale(1.5, 1.5);
919  expected.Translate(7.0, 7.0);
920  EXPECT_TRANSFORMATION_MATRIX_EQ(
921      expected, root_delegated_shared_quad_state->content_to_target_transform);
922
923  host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
924  host_impl_->DidDrawAllLayers(frame);
925}
926
927class DelegatedRendererLayerImplTestClip
928    : public DelegatedRendererLayerImplTest {
929 public:
930  void SetUpTest() {
931    scoped_ptr<LayerImpl> root_layer =
932        LayerImpl::Create(host_impl_->active_tree(), 1);
933    scoped_ptr<FakeDelegatedRendererLayerImpl> delegated_renderer_layer =
934        FakeDelegatedRendererLayerImpl::Create(host_impl_->active_tree(), 2);
935    scoped_ptr<LayerImpl> clip_layer =
936        LayerImpl::Create(host_impl_->active_tree(), 3);
937    scoped_ptr<LayerImpl> origin_layer =
938        LayerImpl::Create(host_impl_->active_tree(), 4);
939
940    host_impl_->SetViewportSize(gfx::Size(100, 100));
941    root_layer->SetBounds(gfx::Size(100, 100));
942
943    delegated_renderer_layer->SetPosition(gfx::Point(20, 20));
944    delegated_renderer_layer->SetBounds(gfx::Size(50, 50));
945    delegated_renderer_layer->SetContentBounds(gfx::Size(50, 50));
946    delegated_renderer_layer->SetDrawsContent(true);
947
948    RenderPassList delegated_render_passes;
949
950    gfx::Size child_pass_content_bounds(7, 7);
951    gfx::Rect child_pass_rect(20, 20, 7, 7);
952    gfx::Transform child_pass_transform;
953    gfx::Rect child_pass_clip_rect(21, 21, 3, 3);
954    bool child_pass_clipped = false;
955
956    {
957      TestRenderPass* pass = AddRenderPass(
958          &delegated_render_passes,
959          RenderPass::Id(10, 7),
960          child_pass_rect,
961          gfx::Transform());
962      SharedQuadState* shared_quad_state =
963          pass->CreateAndAppendSharedQuadState();
964      shared_quad_state->SetAll(child_pass_transform,
965                                child_pass_content_bounds,
966                                child_pass_rect,
967                                child_pass_clip_rect,
968                                child_pass_clipped,
969                                1.f,
970                                SkXfermode::kSrcOver_Mode,
971                                0);
972
973      SolidColorDrawQuad* color_quad;
974      color_quad = pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
975      color_quad->SetNew(shared_quad_state,
976                         gfx::Rect(20, 20, 3, 7),
977                         gfx::Rect(20, 20, 3, 7),
978                         1u,
979                         false);
980
981      color_quad = pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
982      color_quad->SetNew(shared_quad_state,
983                         gfx::Rect(23, 20, 4, 7),
984                         gfx::Rect(23, 20, 4, 7),
985                         1u,
986                         false);
987    }
988
989    gfx::Size root_pass_content_bounds(50, 50);
990    gfx::Rect root_pass_rect(0, 0, 50, 50);
991    gfx::Transform root_pass_transform;
992    gfx::Rect root_pass_clip_rect(5, 5, 40, 40);
993    bool root_pass_clipped = root_delegated_render_pass_is_clipped_;
994
995    TestRenderPass* pass = AddRenderPass(
996        &delegated_render_passes,
997        RenderPass::Id(9, 6),
998        root_pass_rect,
999        gfx::Transform());
1000    SharedQuadState* shared_quad_state = pass->CreateAndAppendSharedQuadState();
1001    shared_quad_state->SetAll(root_pass_transform,
1002                              root_pass_content_bounds,
1003                              root_pass_rect,
1004                              root_pass_clip_rect,
1005                              root_pass_clipped,
1006                              1.f,
1007                              SkXfermode::kSrcOver_Mode,
1008                              0);
1009
1010    RenderPassDrawQuad* render_pass_quad =
1011        pass->CreateAndAppendDrawQuad<RenderPassDrawQuad>();
1012    render_pass_quad->SetNew(
1013        shared_quad_state,
1014        gfx::Rect(5, 5, 7, 7),  // quad_rect
1015        gfx::Rect(5, 5, 7, 7),  // visible_quad_rect
1016        RenderPass::Id(10, 7),  // render_pass_id
1017        false,                  // is_replica
1018        0,                      // mask_resource_id
1019        child_pass_rect,        // contents_changed_since_last_frame
1020        gfx::RectF(),           // mask_uv_rect
1021        FilterOperations(),     // filters
1022        FilterOperations());    // background_filters
1023
1024    SolidColorDrawQuad* color_quad;
1025    color_quad = pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1026    color_quad->SetNew(shared_quad_state,
1027                       gfx::Rect(0, 0, 10, 10),
1028                       gfx::Rect(0, 0, 10, 10),
1029                       1u,
1030                       false);
1031
1032    color_quad = pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1033    color_quad->SetNew(shared_quad_state,
1034                       gfx::Rect(0, 10, 10, 10),
1035                       gfx::Rect(0, 10, 10, 10),
1036                       2u,
1037                       false);
1038
1039    color_quad = pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1040    color_quad->SetNew(shared_quad_state,
1041                       gfx::Rect(10, 0, 10, 10),
1042                       gfx::Rect(10, 0, 10, 10),
1043                       3u,
1044                       false);
1045
1046    color_quad = pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
1047    color_quad->SetNew(shared_quad_state,
1048                       gfx::Rect(10, 10, 10, 10),
1049                       gfx::Rect(10, 10, 10, 10),
1050                       4u,
1051                       false);
1052
1053    delegated_renderer_layer->SetFrameDataForRenderPasses(
1054        1.f, &delegated_render_passes);
1055
1056    // The RenderPasses should be taken by the layer.
1057    EXPECT_EQ(0u, delegated_render_passes.size());
1058
1059    root_layer_ = root_layer.get();
1060    delegated_renderer_layer_ = delegated_renderer_layer.get();
1061
1062    if (clip_delegated_renderer_layer_) {
1063      gfx::Rect clip_rect(21, 27, 23, 21);
1064
1065      clip_layer->SetPosition(clip_rect.origin());
1066      clip_layer->SetBounds(clip_rect.size());
1067      clip_layer->SetContentBounds(clip_rect.size());
1068      clip_layer->SetMasksToBounds(true);
1069
1070      origin_layer->SetPosition(
1071          gfx::PointAtOffsetFromOrigin(-clip_rect.OffsetFromOrigin()));
1072
1073      origin_layer->AddChild(delegated_renderer_layer.PassAs<LayerImpl>());
1074      clip_layer->AddChild(origin_layer.Pass());
1075      root_layer->AddChild(clip_layer.Pass());
1076    } else {
1077      root_layer->AddChild(delegated_renderer_layer.PassAs<LayerImpl>());
1078    }
1079
1080    host_impl_->active_tree()->SetRootLayer(root_layer.Pass());
1081  }
1082
1083 protected:
1084  LayerImpl* root_layer_;
1085  DelegatedRendererLayerImpl* delegated_renderer_layer_;
1086  bool root_delegated_render_pass_is_clipped_;
1087  bool clip_delegated_renderer_layer_;
1088};
1089
1090TEST_F(DelegatedRendererLayerImplTestClip,
1091       QuadsUnclipped_LayerUnclipped_NoSurface) {
1092  root_delegated_render_pass_is_clipped_ = false;
1093  clip_delegated_renderer_layer_ = false;
1094  SetUpTest();
1095
1096  LayerTreeHostImpl::FrameData frame;
1097  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
1098
1099  ASSERT_EQ(2u, frame.render_passes.size());
1100  const QuadList& contrib_delegated_quad_list =
1101      frame.render_passes[0]->quad_list;
1102  ASSERT_EQ(2u, contrib_delegated_quad_list.size());
1103  const QuadList& root_delegated_quad_list = frame.render_passes[1]->quad_list;
1104  ASSERT_EQ(5u, root_delegated_quad_list.size());
1105  const SharedQuadState* root_delegated_shared_quad_state =
1106      root_delegated_quad_list[0]->shared_quad_state;
1107
1108  // When the quads don't have a clip of their own, the clip rect is set to
1109  // the drawable_content_rect of the delegated renderer layer.
1110  EXPECT_EQ(gfx::Rect(20, 20, 50, 50).ToString(),
1111            root_delegated_shared_quad_state->clip_rect.ToString());
1112  // Quads are clipped to the delegated renderer layer.
1113  EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped);
1114
1115  host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
1116  host_impl_->DidDrawAllLayers(frame);
1117}
1118
1119TEST_F(DelegatedRendererLayerImplTestClip,
1120       QuadsClipped_LayerUnclipped_NoSurface) {
1121  root_delegated_render_pass_is_clipped_ = true;
1122  clip_delegated_renderer_layer_ = false;
1123  SetUpTest();
1124
1125  LayerTreeHostImpl::FrameData frame;
1126  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
1127
1128  ASSERT_EQ(2u, frame.render_passes.size());
1129  const QuadList& contrib_delegated_quad_list =
1130      frame.render_passes[0]->quad_list;
1131  ASSERT_EQ(2u, contrib_delegated_quad_list.size());
1132  const QuadList& root_delegated_quad_list =
1133      frame.render_passes[1]->quad_list;
1134  ASSERT_EQ(5u, root_delegated_quad_list.size());
1135  const SharedQuadState* root_delegated_shared_quad_state =
1136      root_delegated_quad_list[0]->shared_quad_state;
1137
1138  // When the quads have a clip of their own, it is used.
1139  EXPECT_EQ(gfx::Rect(25, 25, 40, 40).ToString(),
1140            root_delegated_shared_quad_state->clip_rect.ToString());
1141  // Quads came with a clip rect.
1142  EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped);
1143
1144  host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
1145  host_impl_->DidDrawAllLayers(frame);
1146}
1147
1148TEST_F(DelegatedRendererLayerImplTestClip,
1149       QuadsUnclipped_LayerClipped_NoSurface) {
1150  root_delegated_render_pass_is_clipped_ = false;
1151  clip_delegated_renderer_layer_ = true;
1152  SetUpTest();
1153
1154  LayerTreeHostImpl::FrameData frame;
1155  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
1156
1157  ASSERT_EQ(2u, frame.render_passes.size());
1158  const QuadList& contrib_delegated_quad_list =
1159      frame.render_passes[0]->quad_list;
1160  ASSERT_EQ(2u, contrib_delegated_quad_list.size());
1161  const QuadList& root_delegated_quad_list = frame.render_passes[1]->quad_list;
1162  ASSERT_EQ(5u, root_delegated_quad_list.size());
1163  const SharedQuadState* root_delegated_shared_quad_state =
1164      root_delegated_quad_list[0]->shared_quad_state;
1165
1166  // When the quads don't have a clip of their own, the clip rect is set to
1167  // the drawable_content_rect of the delegated renderer layer. When the layer
1168  // is clipped, that should be seen in the quads' clip_rect.
1169  EXPECT_EQ(gfx::Rect(21, 27, 23, 21).ToString(),
1170            root_delegated_shared_quad_state->clip_rect.ToString());
1171  // Quads are clipped to the delegated renderer layer.
1172  EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped);
1173
1174  host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
1175  host_impl_->DidDrawAllLayers(frame);
1176}
1177
1178TEST_F(DelegatedRendererLayerImplTestClip,
1179       QuadsClipped_LayerClipped_NoSurface) {
1180  root_delegated_render_pass_is_clipped_ = true;
1181  clip_delegated_renderer_layer_ = true;
1182  SetUpTest();
1183
1184  LayerTreeHostImpl::FrameData frame;
1185  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
1186
1187  ASSERT_EQ(2u, frame.render_passes.size());
1188  const QuadList& contrib_delegated_quad_list =
1189      frame.render_passes[0]->quad_list;
1190  ASSERT_EQ(2u, contrib_delegated_quad_list.size());
1191  const QuadList& root_delegated_quad_list = frame.render_passes[1]->quad_list;
1192  ASSERT_EQ(5u, root_delegated_quad_list.size());
1193  const SharedQuadState* root_delegated_shared_quad_state =
1194      root_delegated_quad_list[0]->shared_quad_state;
1195
1196  // When the quads have a clip of their own, it is used, but it is
1197  // combined with the clip rect of the delegated renderer layer.
1198  EXPECT_EQ(gfx::Rect(25, 27, 19, 21).ToString(),
1199            root_delegated_shared_quad_state->clip_rect.ToString());
1200  // Quads came with a clip rect.
1201  EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped);
1202
1203  host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
1204  host_impl_->DidDrawAllLayers(frame);
1205}
1206
1207TEST_F(DelegatedRendererLayerImplTestClip,
1208       QuadsUnclipped_LayerUnclipped_Surface) {
1209  root_delegated_render_pass_is_clipped_ = false;
1210  clip_delegated_renderer_layer_ = false;
1211  SetUpTest();
1212
1213  delegated_renderer_layer_->SetForceRenderSurface(true);
1214
1215  LayerTreeHostImpl::FrameData frame;
1216  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
1217
1218  ASSERT_EQ(3u, frame.render_passes.size());
1219  const QuadList& contrib_delegated_quad_list =
1220      frame.render_passes[0]->quad_list;
1221  ASSERT_EQ(2u, contrib_delegated_quad_list.size());
1222  const QuadList& root_delegated_quad_list = frame.render_passes[1]->quad_list;
1223  ASSERT_EQ(5u, root_delegated_quad_list.size());
1224  const SharedQuadState* root_delegated_shared_quad_state =
1225      root_delegated_quad_list[0]->shared_quad_state;
1226
1227  // When the layer owns a surface, the quads don't need to be clipped
1228  // further than they already specify. If they aren't clipped, then their
1229  // clip rect is ignored, and they are not set as clipped.
1230  EXPECT_FALSE(root_delegated_shared_quad_state->is_clipped);
1231
1232  host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
1233  host_impl_->DidDrawAllLayers(frame);
1234}
1235
1236TEST_F(DelegatedRendererLayerImplTestClip,
1237       QuadsClipped_LayerUnclipped_Surface) {
1238  root_delegated_render_pass_is_clipped_ = true;
1239  clip_delegated_renderer_layer_ = false;
1240  SetUpTest();
1241
1242  delegated_renderer_layer_->SetForceRenderSurface(true);
1243
1244  LayerTreeHostImpl::FrameData frame;
1245  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
1246
1247  ASSERT_EQ(3u, frame.render_passes.size());
1248  const QuadList& contrib_delegated_quad_list =
1249      frame.render_passes[0]->quad_list;
1250  ASSERT_EQ(2u, contrib_delegated_quad_list.size());
1251  const QuadList& root_delegated_quad_list = frame.render_passes[1]->quad_list;
1252  ASSERT_EQ(5u, root_delegated_quad_list.size());
1253  const SharedQuadState* root_delegated_shared_quad_state =
1254      root_delegated_quad_list[0]->shared_quad_state;
1255
1256  // When the quads have a clip of their own, it is used.
1257  EXPECT_EQ(gfx::Rect(5, 5, 40, 40).ToString(),
1258            root_delegated_shared_quad_state->clip_rect.ToString());
1259  // Quads came with a clip rect.
1260  EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped);
1261
1262  host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
1263  host_impl_->DidDrawAllLayers(frame);
1264}
1265
1266TEST_F(DelegatedRendererLayerImplTestClip,
1267       QuadsUnclipped_LayerClipped_Surface) {
1268  root_delegated_render_pass_is_clipped_ = false;
1269  clip_delegated_renderer_layer_ = true;
1270  SetUpTest();
1271
1272  delegated_renderer_layer_->SetForceRenderSurface(true);
1273
1274  LayerTreeHostImpl::FrameData frame;
1275  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
1276
1277  ASSERT_EQ(3u, frame.render_passes.size());
1278  const QuadList& contrib_delegated_quad_list =
1279      frame.render_passes[0]->quad_list;
1280  ASSERT_EQ(2u, contrib_delegated_quad_list.size());
1281  const QuadList& root_delegated_quad_list = frame.render_passes[1]->quad_list;
1282  ASSERT_EQ(5u, root_delegated_quad_list.size());
1283  const SharedQuadState* root_delegated_shared_quad_state =
1284      root_delegated_quad_list[0]->shared_quad_state;
1285
1286  // When the layer owns a surface, the quads don't need to be clipped
1287  // further than they already specify. If they aren't clipped, then their
1288  // clip rect is ignored, and they are not set as clipped.
1289  EXPECT_FALSE(root_delegated_shared_quad_state->is_clipped);
1290
1291  host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
1292  host_impl_->DidDrawAllLayers(frame);
1293}
1294
1295TEST_F(DelegatedRendererLayerImplTestClip, QuadsClipped_LayerClipped_Surface) {
1296  root_delegated_render_pass_is_clipped_ = true;
1297  clip_delegated_renderer_layer_ = true;
1298  SetUpTest();
1299
1300  delegated_renderer_layer_->SetForceRenderSurface(true);
1301
1302  LayerTreeHostImpl::FrameData frame;
1303  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
1304
1305  ASSERT_EQ(3u, frame.render_passes.size());
1306  const QuadList& contrib_delegated_quad_list =
1307      frame.render_passes[0]->quad_list;
1308  ASSERT_EQ(2u, contrib_delegated_quad_list.size());
1309  const QuadList& root_delegated_quad_list = frame.render_passes[1]->quad_list;
1310  ASSERT_EQ(5u, root_delegated_quad_list.size());
1311  const SharedQuadState* root_delegated_shared_quad_state =
1312      root_delegated_quad_list[0]->shared_quad_state;
1313
1314  // When the quads have a clip of their own, it is used, but it is
1315  // combined with the clip rect of the delegated renderer layer. If the
1316  // layer owns a surface, then it does not have a clip rect of its own.
1317  EXPECT_EQ(gfx::Rect(5, 5, 40, 40).ToString(),
1318            root_delegated_shared_quad_state->clip_rect.ToString());
1319  // Quads came with a clip rect.
1320  EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped);
1321
1322  host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
1323  host_impl_->DidDrawAllLayers(frame);
1324}
1325
1326TEST_F(DelegatedRendererLayerImplTest, InvalidRenderPassDrawQuad) {
1327  scoped_ptr<LayerImpl> root_layer = LayerImpl::Create(
1328      host_impl_->active_tree(), 1).PassAs<LayerImpl>();
1329  scoped_ptr<FakeDelegatedRendererLayerImpl> delegated_renderer_layer =
1330      FakeDelegatedRendererLayerImpl::Create(host_impl_->active_tree(), 4);
1331
1332  host_impl_->SetViewportSize(gfx::Size(100, 100));
1333
1334  delegated_renderer_layer->SetPosition(gfx::Point(3, 3));
1335  delegated_renderer_layer->SetBounds(gfx::Size(10, 10));
1336  delegated_renderer_layer->SetContentBounds(gfx::Size(10, 10));
1337  delegated_renderer_layer->SetDrawsContent(true);
1338
1339  RenderPassList delegated_render_passes;
1340  TestRenderPass* pass1 = AddRenderPass(
1341      &delegated_render_passes,
1342      RenderPass::Id(9, 6),
1343      gfx::Rect(0, 0, 10, 10),
1344      gfx::Transform());
1345  AddQuad(pass1, gfx::Rect(0, 0, 6, 6), 33u);
1346
1347  // This render pass isn't part of the frame.
1348  scoped_ptr<TestRenderPass> missing_pass(TestRenderPass::Create());
1349  missing_pass->SetNew(RenderPass::Id(9, 7),
1350                       gfx::Rect(7, 7, 7, 7),
1351                       gfx::Rect(7, 7, 7, 7),
1352                       gfx::Transform());
1353
1354  // But a render pass quad refers to it.
1355  AddRenderPassQuad(pass1, missing_pass.get());
1356
1357  delegated_renderer_layer->SetFrameDataForRenderPasses(
1358      1.f, &delegated_render_passes);
1359
1360  // The RenderPasses should be taken by the layer.
1361  EXPECT_EQ(0u, delegated_render_passes.size());
1362
1363  root_layer->AddChild(delegated_renderer_layer.PassAs<LayerImpl>());
1364  host_impl_->active_tree()->SetRootLayer(root_layer.Pass());
1365
1366  LayerTreeHostImpl::FrameData frame;
1367  EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
1368
1369  // The DelegatedRendererLayerImpl should drop the bad RenderPassDrawQuad.
1370  ASSERT_EQ(1u, frame.render_passes.size());
1371  ASSERT_EQ(1u, frame.render_passes[0]->quad_list.size());
1372  EXPECT_EQ(DrawQuad::SOLID_COLOR,
1373            frame.render_passes[0]->quad_list[0]->material);
1374
1375  host_impl_->DrawLayers(&frame, gfx::FrameTime::Now());
1376  host_impl_->DidDrawAllLayers(frame);
1377}
1378
1379TEST_F(DelegatedRendererLayerImplTest, Occlusion) {
1380  gfx::Size layer_size(1000, 1000);
1381  gfx::Size viewport_size(1000, 1000);
1382  gfx::Rect quad_rect(200, 300, 400, 500);
1383
1384  gfx::Transform transform;
1385  transform.Translate(11.0, 0.0);
1386
1387  LayerTestCommon::LayerImplTest impl;
1388
1389  FakeDelegatedRendererLayerImpl* delegated_renderer_layer_impl =
1390      impl.AddChildToRoot<FakeDelegatedRendererLayerImpl>();
1391  delegated_renderer_layer_impl->SetBounds(layer_size);
1392  delegated_renderer_layer_impl->SetContentBounds(layer_size);
1393  delegated_renderer_layer_impl->SetDrawsContent(true);
1394
1395  RenderPassList delegated_render_passes;
1396  // pass2 is just the size of the quad. It contributes to |pass1| with a
1397  // translation of (11,0).
1398  RenderPass::Id pass2_id =
1399      delegated_renderer_layer_impl->FirstContributingRenderPassId();
1400  TestRenderPass* pass2 =
1401      AddRenderPass(&delegated_render_passes, pass2_id, quad_rect, transform);
1402  AddQuad(pass2, gfx::Rect(quad_rect.size()), SK_ColorRED);
1403  // |pass1| covers the whole layer.
1404  RenderPass::Id pass1_id = RenderPass::Id(impl.root_layer()->id(), 0);
1405  TestRenderPass* pass1 = AddRenderPass(&delegated_render_passes,
1406                                        pass1_id,
1407                                        gfx::Rect(layer_size),
1408                                        gfx::Transform());
1409  AddRenderPassQuad(pass1, pass2, 0, FilterOperations(), transform);
1410  delegated_renderer_layer_impl->SetFrameDataForRenderPasses(
1411      1.f, &delegated_render_passes);
1412
1413  impl.CalcDrawProps(viewport_size);
1414
1415  // The |quad_rect| translated by the |transform|.
1416  gfx::Rect quad_screen_rect = quad_rect + gfx::Vector2d(11, 0);
1417
1418  {
1419    SCOPED_TRACE("No occlusion");
1420    gfx::Rect occluded;
1421
1422    {
1423      SCOPED_TRACE("Root render pass");
1424      impl.AppendQuadsForPassWithOcclusion(
1425          delegated_renderer_layer_impl, pass1_id, occluded);
1426      LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(),
1427                                                   quad_screen_rect);
1428      ASSERT_EQ(1u, impl.quad_list().size());
1429      EXPECT_EQ(DrawQuad::RENDER_PASS, impl.quad_list()[0]->material);
1430    }
1431    {
1432      SCOPED_TRACE("Contributing render pass");
1433      impl.AppendQuadsForPassWithOcclusion(
1434          delegated_renderer_layer_impl, pass2_id, occluded);
1435      LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(),
1436                                                   gfx::Rect(quad_rect.size()));
1437      ASSERT_EQ(1u, impl.quad_list().size());
1438      EXPECT_EQ(DrawQuad::SOLID_COLOR, impl.quad_list()[0]->material);
1439    }
1440  }
1441
1442  {
1443    SCOPED_TRACE("Full occlusion");
1444    {
1445      gfx::Rect occluded(delegated_renderer_layer_impl->visible_content_rect());
1446
1447      SCOPED_TRACE("Root render pass");
1448      impl.AppendQuadsForPassWithOcclusion(
1449          delegated_renderer_layer_impl, pass1_id, occluded);
1450      LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(),
1451                                                   gfx::Rect());
1452      EXPECT_EQ(impl.quad_list().size(), 0u);
1453    }
1454    {
1455      gfx::Rect occluded(delegated_renderer_layer_impl->visible_content_rect());
1456      // Move the occlusion to where it is in the contributing surface.
1457      occluded -= quad_rect.OffsetFromOrigin();
1458
1459      SCOPED_TRACE("Contributing render pass");
1460      impl.AppendQuadsForPassWithOcclusion(
1461          delegated_renderer_layer_impl, pass2_id, occluded);
1462      LayerTestCommon::VerifyQuadsExactlyCoverRect(impl.quad_list(),
1463                                                   gfx::Rect());
1464      EXPECT_EQ(impl.quad_list().size(), 0u);
1465    }
1466  }
1467
1468  {
1469    SCOPED_TRACE("Partial occlusion");
1470    {
1471      gfx::Rect occluded(0, 0, 500, 1000);
1472
1473      SCOPED_TRACE("Root render pass");
1474      impl.AppendQuadsForPassWithOcclusion(
1475          delegated_renderer_layer_impl, pass1_id, occluded);
1476      size_t partially_occluded_count = 0;
1477      LayerTestCommon::VerifyQuadsCoverRectWithOcclusion(
1478          impl.quad_list(),
1479          quad_screen_rect,
1480          occluded,
1481          &partially_occluded_count);
1482      // The layer outputs one quad, which is partially occluded.
1483      EXPECT_EQ(1u, impl.quad_list().size());
1484      EXPECT_EQ(1u, partially_occluded_count);
1485    }
1486    {
1487      gfx::Rect occluded(0, 0, 500, 1000);
1488      // Move the occlusion to where it is in the contributing surface.
1489      occluded -= quad_rect.OffsetFromOrigin() + gfx::Vector2d(11, 0);
1490
1491      SCOPED_TRACE("Contributing render pass");
1492      impl.AppendQuadsForPassWithOcclusion(
1493          delegated_renderer_layer_impl, pass2_id, occluded);
1494      size_t partially_occluded_count = 0;
1495      LayerTestCommon::VerifyQuadsCoverRectWithOcclusion(
1496          impl.quad_list(),
1497          gfx::Rect(quad_rect.size()),
1498          occluded,
1499          &partially_occluded_count);
1500      // The layer outputs one quad, which is partially occluded.
1501      EXPECT_EQ(1u, impl.quad_list().size());
1502      EXPECT_EQ(1u, partially_occluded_count);
1503      // The quad in the contributing surface is at (211,300) in the root.
1504      // The occlusion extends to 500 in the x-axis, pushing the left of the
1505      // visible part of the quad to 500 - 211 = 300 - 11 inside the quad.
1506      EXPECT_EQ(gfx::Rect(300 - 11, 0, 100 + 11, 500).ToString(),
1507                impl.quad_list()[0]->visible_rect.ToString());
1508    }
1509  }
1510}
1511
1512TEST_F(DelegatedRendererLayerImplTest, PushPropertiesTo) {
1513  gfx::Size layer_size(1000, 1000);
1514
1515  scoped_ptr<FakeDelegatedRendererLayerImpl> delegated_renderer_layer_impl =
1516      FakeDelegatedRendererLayerImpl::Create(host_impl_->active_tree(), 5);
1517  delegated_renderer_layer_impl->SetBounds(layer_size);
1518  delegated_renderer_layer_impl->SetContentBounds(layer_size);
1519  delegated_renderer_layer_impl->SetDrawsContent(true);
1520
1521  RenderPassList delegated_render_passes;
1522  // |pass1| covers the whole layer.
1523  RenderPass::Id pass1_id = RenderPass::Id(5, 0);
1524  AddRenderPass(&delegated_render_passes,
1525                pass1_id,
1526                gfx::Rect(layer_size),
1527                gfx::Transform());
1528  delegated_renderer_layer_impl->SetFrameDataForRenderPasses(
1529      2.f, &delegated_render_passes);
1530  EXPECT_EQ(0.5f, delegated_renderer_layer_impl->inverse_device_scale_factor());
1531
1532  scoped_ptr<DelegatedRendererLayerImpl> other_layer =
1533      DelegatedRendererLayerImpl::Create(host_impl_->active_tree(), 6);
1534
1535  delegated_renderer_layer_impl->PushPropertiesTo(other_layer.get());
1536
1537  EXPECT_EQ(0.5f, other_layer->inverse_device_scale_factor());
1538}
1539
1540}  // namespace
1541}  // namespace cc
1542