Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(276)

Side by Side Diff: cc/delegated_renderer_layer_impl_unittest.cc

Issue 12041012: cc: Chromium-stylify the DelegatedRendererLayer classes and tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cc/delegated_renderer_layer_impl.cc ('k') | cc/layer_tree_host_unittest_context.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/delegated_renderer_layer_impl.h" 5 #include "cc/delegated_renderer_layer_impl.h"
6 6
7 #include "cc/append_quads_data.h" 7 #include "cc/append_quads_data.h"
8 #include "cc/layer_tree_host_impl.h" 8 #include "cc/layer_tree_host_impl.h"
9 #include "cc/layer_tree_impl.h" 9 #include "cc/layer_tree_impl.h"
10 #include "cc/quad_sink.h" 10 #include "cc/quad_sink.h"
(...skipping 11 matching lines...) Expand all
22 #include "cc/test/mock_quad_culler.h" 22 #include "cc/test/mock_quad_culler.h"
23 #include "cc/test/render_pass_test_common.h" 23 #include "cc/test/render_pass_test_common.h"
24 #include "cc/test/render_pass_test_utils.h" 24 #include "cc/test/render_pass_test_utils.h"
25 #include "testing/gtest/include/gtest/gtest.h" 25 #include "testing/gtest/include/gtest/gtest.h"
26 #include "ui/gfx/transform.h" 26 #include "ui/gfx/transform.h"
27 27
28 namespace cc { 28 namespace cc {
29 namespace { 29 namespace {
30 30
31 class DelegatedRendererLayerImplTest : public testing::Test { 31 class DelegatedRendererLayerImplTest : public testing::Test {
32 public: 32 public:
33 DelegatedRendererLayerImplTest() 33 DelegatedRendererLayerImplTest()
34 : m_proxy(scoped_ptr<Thread>(NULL)) 34 : proxy_(scoped_ptr<Thread>(NULL))
35 , m_alwaysImplThreadAndMainThreadBlocked(&m_proxy) 35 , always_impl_thread_and_main_thread_blocked_(&proxy_) {
36 LayerTreeSettings settings;
37 settings.minimumOcclusionTrackingSize = gfx::Size();
38
39 host_impl_ = LayerTreeHostImpl::create(settings, &client_, &proxy_);
40 host_impl_->initializeRenderer(createFakeOutputSurface());
41 host_impl_->setViewportSize(gfx::Size(10, 10), gfx::Size(10, 10));
42 }
43
44 protected:
45 FakeProxy proxy_;
46 FakeLayerTreeHostImplClient client_;
47 DebugScopedSetImplThreadAndMainThreadBlocked
48 always_impl_thread_and_main_thread_blocked_;
49 scoped_ptr<LayerTreeHostImpl> host_impl_;
50 };
51
52 class DelegatedRendererLayerImplTestSimple
53 : public DelegatedRendererLayerImplTest {
54 public:
55 DelegatedRendererLayerImplTestSimple()
56 : DelegatedRendererLayerImplTest() {
57 scoped_ptr<LayerImpl> root_layer = SolidColorLayerImpl::create(
58 host_impl_->activeTree(), 1).PassAs<LayerImpl>();
59 scoped_ptr<LayerImpl> layer_before = SolidColorLayerImpl::create(
60 host_impl_->activeTree(), 2).PassAs<LayerImpl>();
61 scoped_ptr<LayerImpl> layer_after = SolidColorLayerImpl::create(
62 host_impl_->activeTree(), 3).PassAs<LayerImpl>();
63 scoped_ptr<DelegatedRendererLayerImpl> delegated_renderer_layer =
64 DelegatedRendererLayerImpl::Create(host_impl_->activeTree(), 4);
65
66 host_impl_->setViewportSize(gfx::Size(100, 100), gfx::Size(100, 100));
67 root_layer->setBounds(gfx::Size(100, 100));
68
69 layer_before->setPosition(gfx::Point(20, 20));
70 layer_before->setBounds(gfx::Size(14, 14));
71 layer_before->setContentBounds(gfx::Size(14, 14));
72 layer_before->setDrawsContent(true);
73 layer_before->setForceRenderSurface(true);
74
75 layer_after->setPosition(gfx::Point(5, 5));
76 layer_after->setBounds(gfx::Size(15, 15));
77 layer_after->setContentBounds(gfx::Size(15, 15));
78 layer_after->setDrawsContent(true);
79 layer_after->setForceRenderSurface(true);
80
81 delegated_renderer_layer->setPosition(gfx::Point(3, 3));
82 delegated_renderer_layer->setBounds(gfx::Size(10, 10));
83 delegated_renderer_layer->setContentBounds(gfx::Size(10, 10));
84 delegated_renderer_layer->setDrawsContent(true);
85 gfx::Transform transform;
86 transform.Translate(1.0, 1.0);
87 delegated_renderer_layer->setTransform(transform);
88
89 ScopedPtrVector<RenderPass> delegated_render_passes;
90 TestRenderPass* pass1 = addRenderPass(
91 delegated_render_passes,
92 RenderPass::Id(9, 6),
93 gfx::Rect(6, 6, 6, 6),
94 gfx::Transform());
95 addQuad(pass1, gfx::Rect(0, 0, 6, 6), 33u);
96 TestRenderPass* pass2 = addRenderPass(
97 delegated_render_passes,
98 RenderPass::Id(9, 7),
99 gfx::Rect(7, 7, 7, 7),
100 gfx::Transform());
101 addQuad(pass2, gfx::Rect(0, 0, 7, 7), 22u);
102 addRenderPassQuad(pass2, pass1);
103 TestRenderPass* pass3 = addRenderPass(
104 delegated_render_passes,
105 RenderPass::Id(9, 8),
106 gfx::Rect(0, 0, 8, 8),
107 gfx::Transform());
108 addRenderPassQuad(pass3, pass2);
109 delegated_renderer_layer->SetRenderPasses(delegated_render_passes);
110
111 // The RenderPasses should be taken by the layer.
112 EXPECT_EQ(0u, delegated_render_passes.size());
113
114 root_layer_ = root_layer.get();
115 layer_before_ = layer_before.get();
116 layer_after_ = layer_after.get();
117 delegated_renderer_layer_ = delegated_renderer_layer.get();
118
119 // Force the delegated RenderPasses to come before the RenderPass from
120 // layer_after.
121 layer_after->addChild(delegated_renderer_layer.PassAs<LayerImpl>());
122 root_layer->addChild(layer_after.Pass());
123
124 // Get the RenderPass generated by layer_before to come before the delegated
125 // RenderPasses.
126 root_layer->addChild(layer_before.Pass());
127 host_impl_->activeTree()->SetRootLayer(root_layer.Pass());
128 }
129
130 protected:
131 LayerImpl* root_layer_;
132 LayerImpl* layer_before_;
133 LayerImpl* layer_after_;
134 DelegatedRendererLayerImpl* delegated_renderer_layer_;
135 };
136
137 TEST_F(DelegatedRendererLayerImplTestSimple, AddsContributingRenderPasses) {
138 LayerTreeHostImpl::FrameData frame;
139 EXPECT_TRUE(host_impl_->prepareToDraw(frame));
140
141 // Each non-DelegatedRendererLayer added one RenderPass. The
142 // DelegatedRendererLayer added two contributing passes.
143 ASSERT_EQ(5u, frame.renderPasses.size());
144
145 // The DelegatedRendererLayer should have added its contributing RenderPasses
146 // to the frame.
147 EXPECT_EQ(4, frame.renderPasses[1]->id.layer_id);
148 EXPECT_EQ(1, frame.renderPasses[1]->id.index);
149 EXPECT_EQ(4, frame.renderPasses[2]->id.layer_id);
150 EXPECT_EQ(2, frame.renderPasses[2]->id.index);
151 // And all other RenderPasses should be non-delegated.
152 EXPECT_NE(4, frame.renderPasses[0]->id.layer_id);
153 EXPECT_EQ(0, frame.renderPasses[0]->id.index);
154 EXPECT_NE(4, frame.renderPasses[3]->id.layer_id);
155 EXPECT_EQ(0, frame.renderPasses[3]->id.index);
156 EXPECT_NE(4, frame.renderPasses[4]->id.layer_id);
157 EXPECT_EQ(0, frame.renderPasses[4]->id.index);
158
159 // The DelegatedRendererLayer should have added its RenderPasses to the frame
160 // in order.
161 EXPECT_EQ(gfx::Rect(6, 6, 6, 6).ToString(),
162 frame.renderPasses[1]->output_rect.ToString());
163 EXPECT_EQ(gfx::Rect(7, 7, 7, 7).ToString(),
164 frame.renderPasses[2]->output_rect.ToString());
165
166 host_impl_->drawLayers(frame);
167 host_impl_->didDrawAllLayers(frame);
168 }
169
170 TEST_F(DelegatedRendererLayerImplTestSimple,
171 AddsQuadsToContributingRenderPasses) {
172 LayerTreeHostImpl::FrameData frame;
173 EXPECT_TRUE(host_impl_->prepareToDraw(frame));
174
175 // Each non-DelegatedRendererLayer added one RenderPass. The
176 // DelegatedRendererLayer added two contributing passes.
177 ASSERT_EQ(5u, frame.renderPasses.size());
178
179 // The DelegatedRendererLayer should have added its contributing RenderPasses
180 // to the frame.
181 EXPECT_EQ(4, frame.renderPasses[1]->id.layer_id);
182 EXPECT_EQ(1, frame.renderPasses[1]->id.index);
183 EXPECT_EQ(4, frame.renderPasses[2]->id.layer_id);
184 EXPECT_EQ(2, frame.renderPasses[2]->id.index);
185
186 // The DelegatedRendererLayer should have added copies of its quads to
187 // contributing RenderPasses.
188 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size());
189 EXPECT_EQ(gfx::Rect(0, 0, 6, 6).ToString(),
190 frame.renderPasses[1]->quad_list[0]->rect.ToString());
191
192 // Verify it added the right quads.
193 ASSERT_EQ(2u, frame.renderPasses[2]->quad_list.size());
194 EXPECT_EQ(gfx::Rect(0, 0, 7, 7).ToString(),
195 frame.renderPasses[2]->quad_list[0]->rect.ToString());
196 EXPECT_EQ(gfx::Rect(6, 6, 6, 6).ToString(),
197 frame.renderPasses[2]->quad_list[1]->rect.ToString());
198 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size());
199 EXPECT_EQ(gfx::Rect(0, 0, 6, 6).ToString(),
200 frame.renderPasses[1]->quad_list[0]->rect.ToString());
201
202 host_impl_->drawLayers(frame);
203 host_impl_->didDrawAllLayers(frame);
204 }
205
206 TEST_F(DelegatedRendererLayerImplTestSimple, AddsQuadsToTargetRenderPass) {
207 LayerTreeHostImpl::FrameData frame;
208 EXPECT_TRUE(host_impl_->prepareToDraw(frame));
209
210 // Each non-DelegatedRendererLayer added one RenderPass. The
211 // DelegatedRendererLayer added two contributing passes.
212 ASSERT_EQ(5u, frame.renderPasses.size());
213
214 // The layer's target is the RenderPass from m_layer_after.
215 EXPECT_EQ(RenderPass::Id(3, 0), frame.renderPasses[3]->id);
216
217 // The DelegatedRendererLayer should have added copies of quads in its root
218 // RenderPass to its target RenderPass. The m_layer_after also adds one quad.
219 ASSERT_EQ(2u, frame.renderPasses[3]->quad_list.size());
220
221 // Verify it added the right quads.
222 EXPECT_EQ(gfx::Rect(7, 7, 7, 7).ToString(),
223 frame.renderPasses[3]->quad_list[0]->rect.ToString());
224
225 // Its target layer should have a quad as well.
226 EXPECT_EQ(gfx::Rect(0, 0, 15, 15).ToString(),
227 frame.renderPasses[3]->quad_list[1]->rect.ToString());
228
229 host_impl_->drawLayers(frame);
230 host_impl_->didDrawAllLayers(frame);
231 }
232
233 TEST_F(DelegatedRendererLayerImplTestSimple,
234 QuadsFromRootRenderPassAreModifiedForTheTarget) {
235 LayerTreeHostImpl::FrameData frame;
236 EXPECT_TRUE(host_impl_->prepareToDraw(frame));
237
238 // Each non-DelegatedRendererLayer added one RenderPass. The
239 // DelegatedRendererLayer added two contributing passes.
240 ASSERT_EQ(5u, frame.renderPasses.size());
241
242 // The DelegatedRendererLayer is at position 3,3 compared to its target, and
243 // has a translation transform of 1,1. So its root RenderPass' quads should
244 // all be transformed by that combined amount.
245 // The DelegatedRendererLayer has a size of 10x10, but the root delegated
246 // RenderPass has a size of 8x8, so any quads should be scaled by 10/8.
247 gfx::Transform transform;
248 transform.Translate(4.0, 4.0);
249 transform.Scale(10.0 / 8.0, 10.0 / 8.0);
250 EXPECT_TRANSFORMATION_MATRIX_EQ(
251 transform, frame.renderPasses[3]->quad_list[0]->quadTransform());
252
253 // Quads from non-root RenderPasses should not be shifted though.
254 ASSERT_EQ(2u, frame.renderPasses[2]->quad_list.size());
255 EXPECT_TRANSFORMATION_MATRIX_EQ(
256 gfx::Transform(), frame.renderPasses[2]->quad_list[0]->quadTransform());
257 EXPECT_TRANSFORMATION_MATRIX_EQ(
258 gfx::Transform(), frame.renderPasses[2]->quad_list[1]->quadTransform());
259 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size());
260 EXPECT_TRANSFORMATION_MATRIX_EQ(
261 gfx::Transform(), frame.renderPasses[1]->quad_list[0]->quadTransform());
262
263 host_impl_->drawLayers(frame);
264 host_impl_->didDrawAllLayers(frame);
265 }
266
267 TEST_F(DelegatedRendererLayerImplTestSimple, DoesNotOwnARenderSurface) {
268 LayerTreeHostImpl::FrameData frame;
269 EXPECT_TRUE(host_impl_->prepareToDraw(frame));
270
271 // If the DelegatedRendererLayer is axis aligned and has opacity 1, then it
272 // has no need to be a renderSurface for the quads it carries.
273 EXPECT_FALSE(delegated_renderer_layer_->renderSurface());
274
275 host_impl_->drawLayers(frame);
276 host_impl_->didDrawAllLayers(frame);
277 }
278
279 TEST_F(DelegatedRendererLayerImplTestSimple, DoesOwnARenderSurfaceForOpacity) {
280 delegated_renderer_layer_->setOpacity(0.5f);
281
282 LayerTreeHostImpl::FrameData frame;
283 EXPECT_TRUE(host_impl_->prepareToDraw(frame));
284
285 // This test case has quads from multiple layers in the delegated renderer, so
286 // if the DelegatedRendererLayer has opacity < 1, it should end up with a
287 // render surface.
288 EXPECT_TRUE(delegated_renderer_layer_->renderSurface());
289
290 host_impl_->drawLayers(frame);
291 host_impl_->didDrawAllLayers(frame);
292 }
293
294 TEST_F(DelegatedRendererLayerImplTestSimple,
295 DoesOwnARenderSurfaceForTransform) {
296 gfx::Transform rotation;
297 rotation.RotateAboutZAxis(30.0);
298 delegated_renderer_layer_->setTransform(rotation);
299
300 LayerTreeHostImpl::FrameData frame;
301 EXPECT_TRUE(host_impl_->prepareToDraw(frame));
302
303 // This test case has quads from multiple layers in the delegated renderer, so
304 // if the DelegatedRendererLayer has opacity < 1, it should end up with a
305 // render surface.
306 EXPECT_TRUE(delegated_renderer_layer_->renderSurface());
307
308 host_impl_->drawLayers(frame);
309 host_impl_->didDrawAllLayers(frame);
310 }
311
312 class DelegatedRendererLayerImplTestOwnSurface
313 : public DelegatedRendererLayerImplTestSimple {
314 public:
315 DelegatedRendererLayerImplTestOwnSurface()
316 : DelegatedRendererLayerImplTestSimple() {
317 delegated_renderer_layer_->setForceRenderSurface(true);
318 }
319 };
320
321 TEST_F(DelegatedRendererLayerImplTestOwnSurface, AddsRenderPasses) {
322 LayerTreeHostImpl::FrameData frame;
323 EXPECT_TRUE(host_impl_->prepareToDraw(frame));
324
325 // Each non-DelegatedRendererLayer added one RenderPass. The
326 // DelegatedRendererLayer added two contributing passes and its owned surface
327 // added one pass.
328 ASSERT_EQ(6u, frame.renderPasses.size());
329
330 // The DelegatedRendererLayer should have added its contributing RenderPasses
331 // to the frame.
332 EXPECT_EQ(4, frame.renderPasses[1]->id.layer_id);
333 EXPECT_EQ(1, frame.renderPasses[1]->id.index);
334 EXPECT_EQ(4, frame.renderPasses[2]->id.layer_id);
335 EXPECT_EQ(2, frame.renderPasses[2]->id.index);
336 // The DelegatedRendererLayer should have added a RenderPass for its surface
337 // to the frame.
338 EXPECT_EQ(4, frame.renderPasses[1]->id.layer_id);
339 EXPECT_EQ(0, frame.renderPasses[3]->id.index);
340 // And all other RenderPasses should be non-delegated.
341 EXPECT_NE(4, frame.renderPasses[0]->id.layer_id);
342 EXPECT_EQ(0, frame.renderPasses[0]->id.index);
343 EXPECT_NE(4, frame.renderPasses[4]->id.layer_id);
344 EXPECT_EQ(0, frame.renderPasses[4]->id.index);
345 EXPECT_NE(4, frame.renderPasses[5]->id.layer_id);
346 EXPECT_EQ(0, frame.renderPasses[5]->id.index);
347
348 // The DelegatedRendererLayer should have added its RenderPasses to the frame
349 // in order.
350 EXPECT_EQ(gfx::Rect(6, 6, 6, 6).ToString(),
351 frame.renderPasses[1]->output_rect.ToString());
352 EXPECT_EQ(gfx::Rect(7, 7, 7, 7).ToString(),
353 frame.renderPasses[2]->output_rect.ToString());
354
355 host_impl_->drawLayers(frame);
356 host_impl_->didDrawAllLayers(frame);
357 }
358
359 TEST_F(DelegatedRendererLayerImplTestOwnSurface,
360 AddsQuadsToContributingRenderPasses) {
361 LayerTreeHostImpl::FrameData frame;
362 EXPECT_TRUE(host_impl_->prepareToDraw(frame));
363
364 // Each non-DelegatedRendererLayer added one RenderPass. The
365 // DelegatedRendererLayer added two contributing passes and its owned surface
366 // added one pass.
367 ASSERT_EQ(6u, frame.renderPasses.size());
368
369 // The DelegatedRendererLayer should have added its contributing RenderPasses
370 // to the frame.
371 EXPECT_EQ(4, frame.renderPasses[1]->id.layer_id);
372 EXPECT_EQ(1, frame.renderPasses[1]->id.index);
373 EXPECT_EQ(4, frame.renderPasses[2]->id.layer_id);
374 EXPECT_EQ(2, frame.renderPasses[2]->id.index);
375
376 // The DelegatedRendererLayer should have added copies of its quads to
377 // contributing RenderPasses.
378 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size());
379 EXPECT_EQ(gfx::Rect(0, 0, 6, 6).ToString(),
380 frame.renderPasses[1]->quad_list[0]->rect.ToString());
381
382 // Verify it added the right quads.
383 ASSERT_EQ(2u, frame.renderPasses[2]->quad_list.size());
384 EXPECT_EQ(gfx::Rect(0, 0, 7, 7).ToString(),
385 frame.renderPasses[2]->quad_list[0]->rect.ToString());
386 EXPECT_EQ(gfx::Rect(6, 6, 6, 6).ToString(),
387 frame.renderPasses[2]->quad_list[1]->rect.ToString());
388 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size());
389 EXPECT_EQ(gfx::Rect(0, 0, 6, 6).ToString(),
390 frame.renderPasses[1]->quad_list[0]->rect.ToString());
391
392 host_impl_->drawLayers(frame);
393 host_impl_->didDrawAllLayers(frame);
394 }
395
396 TEST_F(DelegatedRendererLayerImplTestOwnSurface, AddsQuadsToTargetRenderPass) {
397 LayerTreeHostImpl::FrameData frame;
398 EXPECT_TRUE(host_impl_->prepareToDraw(frame));
399
400 // Each non-DelegatedRendererLayer added one RenderPass. The
401 // DelegatedRendererLayer added two contributing passes and its owned surface
402 // added one pass.
403 ASSERT_EQ(6u, frame.renderPasses.size());
404
405 // The layer's target is the RenderPass owned by itself.
406 EXPECT_EQ(RenderPass::Id(4, 0), frame.renderPasses[3]->id);
407
408 // The DelegatedRendererLayer should have added copies of quads in its root
409 // RenderPass to its target RenderPass.
410 // The m_layer_after also adds one quad.
411 ASSERT_EQ(1u, frame.renderPasses[3]->quad_list.size());
412
413 // Verify it added the right quads.
414 EXPECT_EQ(gfx::Rect(7, 7, 7, 7).ToString(),
415 frame.renderPasses[3]->quad_list[0]->rect.ToString());
416
417 host_impl_->drawLayers(frame);
418 host_impl_->didDrawAllLayers(frame);
419 }
420
421 TEST_F(DelegatedRendererLayerImplTestOwnSurface,
422 QuadsFromRootRenderPassAreNotModifiedForTheTarget) {
423 LayerTreeHostImpl::FrameData frame;
424 EXPECT_TRUE(host_impl_->prepareToDraw(frame));
425
426 // Each non-DelegatedRendererLayer added one RenderPass. The
427 // DelegatedRendererLayer added two contributing passes and its owned surface
428 // added one pass.
429 ASSERT_EQ(6u, frame.renderPasses.size());
430
431 // Because the DelegatedRendererLayer owns a RenderSurfaceImpl, its root
432 // RenderPass' quads do not need to be translated at all. However, they are
433 // scaled from the frame's size (8x8) to the layer's bounds (10x10).
434 gfx::Transform transform;
435 transform.Scale(10.0 / 8.0, 10.0 / 8.0);
436 EXPECT_TRANSFORMATION_MATRIX_EQ(
437 transform, frame.renderPasses[3]->quad_list[0]->quadTransform());
438
439 // Quads from non-root RenderPasses should not be shifted either.
440 ASSERT_EQ(2u, frame.renderPasses[2]->quad_list.size());
441 EXPECT_TRANSFORMATION_MATRIX_EQ(
442 gfx::Transform(), frame.renderPasses[2]->quad_list[0]->quadTransform());
443 EXPECT_TRANSFORMATION_MATRIX_EQ(
444 gfx::Transform(), frame.renderPasses[2]->quad_list[1]->quadTransform());
445 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size());
446 EXPECT_TRANSFORMATION_MATRIX_EQ(
447 gfx::Transform(), frame.renderPasses[1]->quad_list[0]->quadTransform());
448
449 host_impl_->drawLayers(frame);
450 host_impl_->didDrawAllLayers(frame);
451 }
452
453 class DelegatedRendererLayerImplTestTransform
454 : public DelegatedRendererLayerImplTest {
455 public:
456 void SetUpTest() {
457 scoped_ptr<LayerImpl> root_layer = LayerImpl::create(
458 host_impl_->activeTree(), 1);
459 scoped_ptr<DelegatedRendererLayerImpl> delegated_renderer_layer =
460 DelegatedRendererLayerImpl::Create(host_impl_->activeTree(), 2);
461
462 host_impl_->setViewportSize(gfx::Size(100, 100), gfx::Size(100, 100));
463 root_layer->setBounds(gfx::Size(100, 100));
464
465 delegated_renderer_layer->setPosition(gfx::Point(20, 20));
466 delegated_renderer_layer->setBounds(gfx::Size(30, 30));
467 delegated_renderer_layer->setContentBounds(gfx::Size(30, 30));
468 delegated_renderer_layer->setDrawsContent(true);
469 gfx::Transform transform;
470 transform.Scale(2.0, 2.0);
471 transform.Translate(8.0, 8.0);
472 delegated_renderer_layer->setTransform(transform);
473
474 ScopedPtrVector<RenderPass> delegated_render_passes;
475
476 gfx::Rect child_pass_rect(20, 20, 7, 7);
477 gfx::Transform child_pass_transform;
478 child_pass_transform.Scale(0.8, 0.8);
479 child_pass_transform.Translate(9.0, 9.0);
480 gfx::Rect child_pass_clip_rect(21, 21, 3, 3);
481 bool child_pass_clipped = false;
482
36 { 483 {
37 LayerTreeSettings settings; 484 TestRenderPass* pass = addRenderPass(
38 settings.minimumOcclusionTrackingSize = gfx::Size(); 485 delegated_render_passes,
39 486 RenderPass::Id(10, 7),
40 m_hostImpl = LayerTreeHostImpl::create(settings, &m_client, &m_proxy); 487 child_pass_rect,
41 m_hostImpl->initializeRenderer(createFakeOutputSurface()); 488 gfx::Transform());
42 m_hostImpl->setViewportSize(gfx::Size(10, 10), gfx::Size(10, 10)); 489 MockQuadCuller quad_sink(pass->quad_list, pass->shared_quad_state_list);
490 AppendQuadsData data(pass->id);
491 SharedQuadState* shared_quad_state = quad_sink.useSharedQuadState(
492 SharedQuadState::Create());
493 shared_quad_state->SetAll(
494 child_pass_transform,
495 child_pass_rect,
496 child_pass_clip_rect,
497 child_pass_clipped,
498 1.f);
499
500 scoped_ptr<SolidColorDrawQuad> color_quad;
501 color_quad = SolidColorDrawQuad::Create();
502 color_quad->SetNew(shared_quad_state, gfx::Rect(20, 20, 3, 7), 1u);
503 quad_sink.append(color_quad.PassAs<DrawQuad>(), data);
504
505 color_quad = SolidColorDrawQuad::Create();
506 color_quad->SetNew(shared_quad_state, gfx::Rect(23, 20, 4, 7), 1u);
507 quad_sink.append(color_quad.PassAs<DrawQuad>(), data);
43 } 508 }
44 509
45 protected: 510 gfx::Rect root_pass_rect(0, 0, 50, 50);
46 FakeProxy m_proxy; 511 gfx::Transform root_pass_transform;
47 FakeLayerTreeHostImplClient m_client; 512 root_pass_transform.Scale(1.5, 1.5);
48 DebugScopedSetImplThreadAndMainThreadBlocked m_alwaysImplThreadAndMainThread Blocked; 513 root_pass_transform.Translate(7.0, 7.0);
49 scoped_ptr<LayerTreeHostImpl> m_hostImpl; 514 gfx::Rect root_pass_clip_rect(10, 10, 35, 35);
515 bool root_pass_clipped = root_delegated_render_pass_is_clipped_;
516
517 TestRenderPass* pass = addRenderPass(
518 delegated_render_passes,
519 RenderPass::Id(9, 6),
520 root_pass_rect,
521 gfx::Transform());
522 MockQuadCuller quad_sink(pass->quad_list, pass->shared_quad_state_list);
523 AppendQuadsData data(pass->id);
524 SharedQuadState* shared_quad_state = quad_sink.useSharedQuadState(SharedQuad State::Create());
525 shared_quad_state->SetAll(
526 root_pass_transform,
527 root_pass_rect,
528 root_pass_clip_rect,
529 root_pass_clipped,
530 1.f);
531
532 scoped_ptr<RenderPassDrawQuad> render_pass_quad =
533 RenderPassDrawQuad::Create();
534 render_pass_quad->SetNew(
535 shared_quad_state,
536 gfx::Rect(5, 5, 7, 7), // rect
537 RenderPass::Id(10, 7), // render_pass_id
538 false, // is_replica
539 0, // mask_resource_id
540 child_pass_rect, // contents_changed_since_last_frame
541 gfx::RectF(), // mask_uv_rect
542 WebKit::WebFilterOperations(), // filters
543 skia::RefPtr<SkImageFilter>(), // filter
544 WebKit::WebFilterOperations()); // background_filters
545 quad_sink.append(render_pass_quad.PassAs<DrawQuad>(), data);
546
547 scoped_ptr<SolidColorDrawQuad> color_quad;
548 color_quad = SolidColorDrawQuad::Create();
549 color_quad->SetNew(shared_quad_state, gfx::Rect(0, 0, 10, 10), 1u);
550 quad_sink.append(color_quad.PassAs<DrawQuad>(), data);
551
552 color_quad = SolidColorDrawQuad::Create();
553 color_quad->SetNew(shared_quad_state, gfx::Rect(0, 10, 10, 10), 2u);
554 quad_sink.append(color_quad.PassAs<DrawQuad>(), data);
555
556 color_quad = SolidColorDrawQuad::Create();
557 color_quad->SetNew(shared_quad_state, gfx::Rect(10, 0, 10, 10), 3u);
558 quad_sink.append(color_quad.PassAs<DrawQuad>(), data);
559
560 color_quad = SolidColorDrawQuad::Create();
561 color_quad->SetNew(shared_quad_state, gfx::Rect(10, 10, 10, 10), 4u);
562 quad_sink.append(color_quad.PassAs<DrawQuad>(), data);
563
564 delegated_renderer_layer->SetRenderPasses(delegated_render_passes);
565
566 // The RenderPasses should be taken by the layer.
567 EXPECT_EQ(0u, delegated_render_passes.size());
568
569 root_layer_ = root_layer.get();
570 delegated_renderer_layer_ = delegated_renderer_layer.get();
571
572 root_layer->addChild(delegated_renderer_layer.PassAs<LayerImpl>());
573 host_impl_->activeTree()->SetRootLayer(root_layer.Pass());
574 }
575
576 void VerifyRenderPasses(
577 const LayerTreeHostImpl::FrameData& frame,
578 size_t num_render_passes,
579 const SharedQuadState** root_delegated_shared_quad_state,
580 const SharedQuadState** contrib_delegated_shared_quad_state) {
581 ASSERT_EQ(num_render_passes, frame.renderPasses.size());
582 // The contributing render pass in the DelegatedRendererLayer.
583 EXPECT_EQ(2, frame.renderPasses[0]->id.layer_id);
584 EXPECT_EQ(1, frame.renderPasses[0]->id.index);
585 // The root render pass.
586 EXPECT_EQ(1, frame.renderPasses.back()->id.layer_id);
587 EXPECT_EQ(0, frame.renderPasses.back()->id.index);
588
589 const QuadList& contrib_delegated_quad_list =
590 frame.renderPasses[0]->quad_list;
591 ASSERT_EQ(2u, contrib_delegated_quad_list.size());
592
593 const QuadList& root_delegated_quad_list = frame.renderPasses[1]->quad_list;
594 ASSERT_EQ(5u, root_delegated_quad_list.size());
595
596 // All quads in a render pass should share the same state.
597 *contrib_delegated_shared_quad_state =
598 contrib_delegated_quad_list[0]->shared_quad_state;
599 EXPECT_EQ(*contrib_delegated_shared_quad_state,
600 contrib_delegated_quad_list[1]->shared_quad_state);
601
602 *root_delegated_shared_quad_state =
603 root_delegated_quad_list[0]->shared_quad_state;
604 EXPECT_EQ(*root_delegated_shared_quad_state,
605 root_delegated_quad_list[1]->shared_quad_state);
606 EXPECT_EQ(*root_delegated_shared_quad_state,
607 root_delegated_quad_list[2]->shared_quad_state);
608 EXPECT_EQ(*root_delegated_shared_quad_state,
609 root_delegated_quad_list[3]->shared_quad_state);
610 EXPECT_EQ(*root_delegated_shared_quad_state,
611 root_delegated_quad_list[4]->shared_quad_state);
612
613 EXPECT_NE(*contrib_delegated_shared_quad_state,
614 *root_delegated_shared_quad_state);
615 }
616
617 protected:
618 LayerImpl* root_layer_;
619 DelegatedRendererLayerImpl* delegated_renderer_layer_;
620 bool root_delegated_render_pass_is_clipped_;
50 }; 621 };
51 622
52 class DelegatedRendererLayerImplTestSimple : public DelegatedRendererLayerImplTe st { 623 TEST_F(DelegatedRendererLayerImplTestTransform, QuadsUnclipped_NoSurface) {
53 public: 624 root_delegated_render_pass_is_clipped_ = false;
54 DelegatedRendererLayerImplTestSimple() 625 SetUpTest();
55 : DelegatedRendererLayerImplTest() 626
627 LayerTreeHostImpl::FrameData frame;
628 EXPECT_TRUE(host_impl_->prepareToDraw(frame));
629
630 const SharedQuadState* root_delegated_shared_quad_state = NULL;
631 const SharedQuadState* contrib_delegated_shared_quad_state = NULL;
632 VerifyRenderPasses(
633 frame,
634 2,
635 &root_delegated_shared_quad_state,
636 &contrib_delegated_shared_quad_state);
637
638 // When the quads don't have a clip of their own, the clip rect is set to
639 // the drawableContentRect of the delegated renderer layer.
640 EXPECT_EQ(gfx::Rect(21, 21, 60, 60).ToString(),
641 root_delegated_shared_quad_state->clip_rect.ToString());
642
643 // Even though the quads in the root pass have no clip of their own, they
644 // inherit the clip rect from the delegated renderer layer if it does not
645 // own a surface.
646 EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped);
647
648 gfx::Transform expected;
649 // This is the transform from the layer's space to its target.
650 // The position (20) - the width / scale (30 / 2) = 20 - 15 = 5
651 expected.Translate(5.0, 5.0);
652 expected.Scale(2.0, 2.0);
653 expected.Translate(8.0, 8.0);
654 // The frame has size 50x50 but the layer's bounds are 30x30.
655 expected.Scale(30.0 / 50.0, 30.0 / 50.0);
656 // This is the transform within the source frame.
657 expected.Scale(1.5, 1.5);
658 expected.Translate(7.0, 7.0);
659 EXPECT_TRANSFORMATION_MATRIX_EQ(
660 expected, root_delegated_shared_quad_state->content_to_target_transform);
661
662 // The contributing render pass should not be transformed from its input.
663 EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(),
664 contrib_delegated_shared_quad_state->clip_rect.ToString());
665 EXPECT_FALSE(contrib_delegated_shared_quad_state->is_clipped);
666 expected.MakeIdentity();
667 expected.Scale(0.8, 0.8);
668 expected.Translate(9.0, 9.0);
669 EXPECT_TRANSFORMATION_MATRIX_EQ(
670 expected,
671 contrib_delegated_shared_quad_state->content_to_target_transform);
672
673 host_impl_->drawLayers(frame);
674 host_impl_->didDrawAllLayers(frame);
675 }
676
677 TEST_F(DelegatedRendererLayerImplTestTransform, QuadsClipped_NoSurface) {
678 root_delegated_render_pass_is_clipped_ = true;
679 SetUpTest();
680
681 LayerTreeHostImpl::FrameData frame;
682 EXPECT_TRUE(host_impl_->prepareToDraw(frame));
683
684 const SharedQuadState* root_delegated_shared_quad_state = NULL;
685 const SharedQuadState* contrib_delegated_shared_quad_state = NULL;
686 VerifyRenderPasses(
687 frame,
688 2,
689 &root_delegated_shared_quad_state,
690 &contrib_delegated_shared_quad_state);
691
692 // Since the quads have a clip_rect it should be modified by delegated
693 // renderer layer's drawTransform.
694 // The position of the resulting clip_rect is:
695 // (clip rect position (10) * scale to layer (30/50) + translate (8)) *
696 // layer scale (2) + layer position (20) = 48
697 // But the layer is centered, so: 48 - (width / 2) = 48 - 30 / 2 = 33
698 //
699 // The size is 35x35 scaled to fit inside the layer's bounds at 30x30 from
700 // a frame at 50x50: 35 * 2 (layer's scale) * 30 / 50 = 42.
701 EXPECT_EQ(gfx::Rect(33, 33, 42, 42).ToString(),
702 root_delegated_shared_quad_state->clip_rect.ToString());
703
704 // The quads had a clip and it should be preserved.
705 EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped);
706
707 gfx::Transform expected;
708 // This is the transform from the layer's space to its target.
709 // The position (20) - the width / scale (30 / 2) = 20 - 15 = 5
710 expected.Translate(5.0, 5.0);
711 expected.Scale(2.0, 2.0);
712 expected.Translate(8.0, 8.0);
713 // The frame has size 50x50 but the layer's bounds are 30x30.
714 expected.Scale(30.0 / 50.0, 30.0 / 50.0);
715 // This is the transform within the source frame.
716 expected.Scale(1.5, 1.5);
717 expected.Translate(7.0, 7.0);
718 EXPECT_TRANSFORMATION_MATRIX_EQ(
719 expected, root_delegated_shared_quad_state->content_to_target_transform);
720
721 // The contributing render pass should not be transformed from its input.
722 EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(),
723 contrib_delegated_shared_quad_state->clip_rect.ToString());
724 EXPECT_FALSE(contrib_delegated_shared_quad_state->is_clipped);
725 expected.MakeIdentity();
726 expected.Scale(0.8, 0.8);
727 expected.Translate(9.0, 9.0);
728 EXPECT_TRANSFORMATION_MATRIX_EQ(
729 expected,
730 contrib_delegated_shared_quad_state->content_to_target_transform);
731
732 host_impl_->drawLayers(frame);
733 host_impl_->didDrawAllLayers(frame);
734 }
735
736 TEST_F(DelegatedRendererLayerImplTestTransform, QuadsUnclipped_Surface) {
737 root_delegated_render_pass_is_clipped_ = false;
738 SetUpTest();
739
740 delegated_renderer_layer_->setForceRenderSurface(true);
741
742 LayerTreeHostImpl::FrameData frame;
743 EXPECT_TRUE(host_impl_->prepareToDraw(frame));
744
745 const SharedQuadState* root_delegated_shared_quad_state = NULL;
746 const SharedQuadState* contrib_delegated_shared_quad_state = NULL;
747 VerifyRenderPasses(
748 frame,
749 3,
750 &root_delegated_shared_quad_state,
751 &contrib_delegated_shared_quad_state);
752
753 // When the layer owns a surface, then its position and translation are not
754 // a part of its draw transform.
755 // The position of the resulting clip_rect is:
756 // (clip rect position (10) * scale to layer (30/50)) * layer scale (2) = 12
757 // The size is 35x35 scaled to fit inside the layer's bounds at 30x30 from
758 // a frame at 50x50: 35 * 2 (layer's scale) * 30 / 50 = 42.
759 EXPECT_EQ(gfx::Rect(12, 12, 42, 42).ToString(),
760 root_delegated_shared_quad_state->clip_rect.ToString());
761
762 // Since the layer owns a surface it doesn't need to clip its quads, so
763 // unclipped quads remain unclipped.
764 EXPECT_FALSE(root_delegated_shared_quad_state->is_clipped);
765
766 gfx::Transform expected;
767 expected.Scale(2.0, 2.0);
768 // The frame has size 50x50 but the layer's bounds are 30x30.
769 expected.Scale(30.0 / 50.0, 30.0 / 50.0);
770 // This is the transform within the source frame.
771 expected.Scale(1.5, 1.5);
772 expected.Translate(7.0, 7.0);
773 EXPECT_TRANSFORMATION_MATRIX_EQ(
774 expected, root_delegated_shared_quad_state->content_to_target_transform);
775
776 // The contributing render pass should not be transformed from its input.
777 EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(),
778 contrib_delegated_shared_quad_state->clip_rect.ToString());
779 EXPECT_FALSE(contrib_delegated_shared_quad_state->is_clipped);
780 expected.MakeIdentity();
781 expected.Scale(0.8, 0.8);
782 expected.Translate(9.0, 9.0);
783 EXPECT_TRANSFORMATION_MATRIX_EQ(
784 expected,
785 contrib_delegated_shared_quad_state->content_to_target_transform);
786
787 host_impl_->drawLayers(frame);
788 host_impl_->didDrawAllLayers(frame);
789 }
790
791 TEST_F(DelegatedRendererLayerImplTestTransform, QuadsClipped_Surface) {
792 root_delegated_render_pass_is_clipped_ = true;
793 SetUpTest();
794
795 delegated_renderer_layer_->setForceRenderSurface(true);
796
797 LayerTreeHostImpl::FrameData frame;
798 EXPECT_TRUE(host_impl_->prepareToDraw(frame));
799
800 const SharedQuadState* root_delegated_shared_quad_state = NULL;
801 const SharedQuadState* contrib_delegated_shared_quad_state = NULL;
802 VerifyRenderPasses(
803 frame,
804 3,
805 &root_delegated_shared_quad_state,
806 &contrib_delegated_shared_quad_state);
807
808 // When the layer owns a surface, then its position and translation are not
809 // a part of its draw transform.
810 // The position of the resulting clip_rect is:
811 // (clip rect position (10) * scale to layer (30/50)) * layer scale (2) = 12
812 // The size is 35x35 scaled to fit inside the layer's bounds at 30x30 from
813 // a frame at 50x50: 35 * 2 (layer's scale) * 30 / 50 = 42.
814 EXPECT_EQ(gfx::Rect(12, 12, 42, 42).ToString(),
815 root_delegated_shared_quad_state->clip_rect.ToString());
816
817 // The quads had a clip and it should be preserved.
818 EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped);
819
820 gfx::Transform expected;
821 expected.Scale(2.0, 2.0);
822 // The frame has size 50x50 but the layer's bounds are 30x30.
823 expected.Scale(30.0 / 50.0, 30.0 / 50.0);
824 // This is the transform within the source frame.
825 expected.Scale(1.5, 1.5);
826 expected.Translate(7.0, 7.0);
827 EXPECT_TRANSFORMATION_MATRIX_EQ(
828 expected, root_delegated_shared_quad_state->content_to_target_transform);
829
830 // The contributing render pass should not be transformed from its input.
831 EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(),
832 contrib_delegated_shared_quad_state->clip_rect.ToString());
833 EXPECT_FALSE(contrib_delegated_shared_quad_state->is_clipped);
834 expected.MakeIdentity();
835 expected.Scale(0.8, 0.8);
836 expected.Translate(9.0, 9.0);
837 EXPECT_TRANSFORMATION_MATRIX_EQ(
838 expected,
839 contrib_delegated_shared_quad_state->content_to_target_transform);
840
841 host_impl_->drawLayers(frame);
842 host_impl_->didDrawAllLayers(frame);
843 }
844
845 class DelegatedRendererLayerImplTestClip
846 : public DelegatedRendererLayerImplTest {
847 public:
848 void SetUpTest() {
849 scoped_ptr<LayerImpl> root_layer =
850 LayerImpl::create(host_impl_->activeTree(), 1);
851 scoped_ptr<DelegatedRendererLayerImpl> delegated_renderer_layer =
852 DelegatedRendererLayerImpl::Create(host_impl_->activeTree(), 2);
853 scoped_ptr<LayerImpl> clip_layer =
854 LayerImpl::create(host_impl_->activeTree(), 3);
855 scoped_ptr<LayerImpl> origin_layer =
856 LayerImpl::create(host_impl_->activeTree(), 4);
857
858 host_impl_->setViewportSize(gfx::Size(100, 100), gfx::Size(100, 100));
859 root_layer->setBounds(gfx::Size(100, 100));
860
861 delegated_renderer_layer->setPosition(gfx::Point(20, 20));
862 delegated_renderer_layer->setBounds(gfx::Size(50, 50));
863 delegated_renderer_layer->setContentBounds(gfx::Size(50, 50));
864 delegated_renderer_layer->setDrawsContent(true);
865
866 ScopedPtrVector<RenderPass> delegated_render_passes;
867
868 gfx::Rect child_pass_rect(20, 20, 7, 7);
869 gfx::Transform child_pass_transform;
870 gfx::Rect child_pass_clip_rect(21, 21, 3, 3);
871 bool child_pass_clipped = false;
872
56 { 873 {
57 scoped_ptr<LayerImpl> rootLayer = SolidColorLayerImpl::create(m_hostImpl ->activeTree(), 1).PassAs<LayerImpl>(); 874 TestRenderPass* pass = addRenderPass(
58 scoped_ptr<LayerImpl> layerBefore = SolidColorLayerImpl::create(m_hostIm pl->activeTree(), 2).PassAs<LayerImpl>(); 875 delegated_render_passes,
59 scoped_ptr<LayerImpl> layerAfter = SolidColorLayerImpl::create(m_hostImp l->activeTree(), 3).PassAs<LayerImpl>(); 876 RenderPass::Id(10, 7),
60 scoped_ptr<DelegatedRendererLayerImpl> delegatedRendererLayer = Delegate dRendererLayerImpl::create(m_hostImpl->activeTree(), 4); 877 child_pass_rect,
61 878 gfx::Transform());
62 m_hostImpl->setViewportSize(gfx::Size(100, 100), gfx::Size(100, 100)); 879 MockQuadCuller quad_sink(pass->quad_list, pass->shared_quad_state_list);
63 rootLayer->setBounds(gfx::Size(100, 100)); 880 AppendQuadsData data(pass->id);
64 881 SharedQuadState* shared_quad_state =
65 layerBefore->setPosition(gfx::Point(20, 20)); 882 quad_sink.useSharedQuadState(SharedQuadState::Create());
66 layerBefore->setBounds(gfx::Size(14, 14)); 883 shared_quad_state->SetAll(
67 layerBefore->setContentBounds(gfx::Size(14, 14)); 884 child_pass_transform,
68 layerBefore->setDrawsContent(true); 885 child_pass_rect,
69 layerBefore->setForceRenderSurface(true); 886 child_pass_clip_rect,
70 887 child_pass_clipped,
71 layerAfter->setPosition(gfx::Point(5, 5)); 888 1.f);
72 layerAfter->setBounds(gfx::Size(15, 15)); 889
73 layerAfter->setContentBounds(gfx::Size(15, 15)); 890 scoped_ptr<SolidColorDrawQuad> color_quad;
74 layerAfter->setDrawsContent(true); 891 color_quad = SolidColorDrawQuad::Create();
75 layerAfter->setForceRenderSurface(true); 892 color_quad->SetNew(shared_quad_state, gfx::Rect(20, 20, 3, 7), 1u);
76 893 quad_sink.append(color_quad.PassAs<DrawQuad>(), data);
77 delegatedRendererLayer->setPosition(gfx::Point(3, 3)); 894
78 delegatedRendererLayer->setBounds(gfx::Size(10, 10)); 895 color_quad = SolidColorDrawQuad::Create();
79 delegatedRendererLayer->setContentBounds(gfx::Size(10, 10)); 896 color_quad->SetNew(shared_quad_state, gfx::Rect(23, 20, 4, 7), 1u);
80 delegatedRendererLayer->setDrawsContent(true); 897 quad_sink.append(color_quad.PassAs<DrawQuad>(), data);
81 gfx::Transform transform;
82 transform.Translate(1, 1);
83 delegatedRendererLayer->setTransform(transform);
84
85 ScopedPtrVector<RenderPass> delegatedRenderPasses;
86 TestRenderPass* pass1 = addRenderPass(delegatedRenderPasses, RenderPass: :Id(9, 6), gfx::Rect(6, 6, 6, 6), gfx::Transform());
87 addQuad(pass1, gfx::Rect(0, 0, 6, 6), 33u);
88 TestRenderPass* pass2 = addRenderPass(delegatedRenderPasses, RenderPass: :Id(9, 7), gfx::Rect(7, 7, 7, 7), gfx::Transform());
89 addQuad(pass2, gfx::Rect(0, 0, 7, 7), 22u);
90 addRenderPassQuad(pass2, pass1);
91 TestRenderPass* pass3 = addRenderPass(delegatedRenderPasses, RenderPass: :Id(9, 8), gfx::Rect(0, 0, 8, 8), gfx::Transform());
92 addRenderPassQuad(pass3, pass2);
93 delegatedRendererLayer->setRenderPasses(delegatedRenderPasses);
94
95 // The RenderPasses should be taken by the layer.
96 EXPECT_EQ(0u, delegatedRenderPasses.size());
97
98 m_rootLayerPtr = rootLayer.get();
99 m_layerBeforePtr = layerBefore.get();
100 m_layerAfterPtr = layerAfter.get();
101 m_delegatedRendererLayerPtr = delegatedRendererLayer.get();
102
103 // Force the delegated RenderPasses to come before the RenderPass from l ayerAfter.
104 layerAfter->addChild(delegatedRendererLayer.PassAs<LayerImpl>());
105 rootLayer->addChild(layerAfter.Pass());
106
107 // Get the RenderPass generated by layerBefore to come before the delega ted RenderPasses.
108 rootLayer->addChild(layerBefore.Pass());
109
110 m_hostImpl->activeTree()->SetRootLayer(rootLayer.Pass());
111 } 898 }
112 899
113 protected: 900 gfx::Rect root_pass_rect(0, 0, 50, 50);
114 LayerImpl* m_rootLayerPtr; 901 gfx::Transform root_pass_transform;
115 LayerImpl* m_layerBeforePtr; 902 gfx::Rect root_pass_clip_rect(5, 5, 40, 40);
116 LayerImpl* m_layerAfterPtr; 903 bool root_pass_clipped = root_delegated_render_pass_is_clipped_;
117 DelegatedRendererLayerImpl* m_delegatedRendererLayerPtr; 904
905 TestRenderPass* pass = addRenderPass(
906 delegated_render_passes,
907 RenderPass::Id(9, 6),
908 root_pass_rect,
909 gfx::Transform());
910 MockQuadCuller quad_sink(pass->quad_list, pass->shared_quad_state_list);
911 AppendQuadsData data(pass->id);
912 SharedQuadState* shared_quad_state =
913 quad_sink.useSharedQuadState(SharedQuadState::Create());
914 shared_quad_state->SetAll(root_pass_transform, root_pass_rect, root_pass_cli p_rect, root_pass_clipped, 1);
915
916 scoped_ptr<RenderPassDrawQuad> render_pass_quad =
917 RenderPassDrawQuad::Create();
918 render_pass_quad->SetNew(
919 shared_quad_state,
920 gfx::Rect(5, 5, 7, 7), // rect
921 RenderPass::Id(10, 7), // render_pass_id
922 false, // is_replica
923 0, // mask_resource_id
924 child_pass_rect, // contents_changed_since_last_frame
925 gfx::RectF(), // mask_uv_rect
926 WebKit::WebFilterOperations(), // filters
927 skia::RefPtr<SkImageFilter>(), // filter
928 WebKit::WebFilterOperations()); // background_filters
929 quad_sink.append(render_pass_quad.PassAs<DrawQuad>(), data);
930
931 scoped_ptr<SolidColorDrawQuad> color_quad;
932 color_quad = SolidColorDrawQuad::Create();
933 color_quad->SetNew(shared_quad_state, gfx::Rect(0, 0, 10, 10), 1u);
934 quad_sink.append(color_quad.PassAs<DrawQuad>(), data);
935
936 color_quad = SolidColorDrawQuad::Create();
937 color_quad->SetNew(shared_quad_state, gfx::Rect(0, 10, 10, 10), 2u);
938 quad_sink.append(color_quad.PassAs<DrawQuad>(), data);
939
940 color_quad = SolidColorDrawQuad::Create();
941 color_quad->SetNew(shared_quad_state, gfx::Rect(10, 0, 10, 10), 3u);
942 quad_sink.append(color_quad.PassAs<DrawQuad>(), data);
943
944 color_quad = SolidColorDrawQuad::Create();
945 color_quad->SetNew(shared_quad_state, gfx::Rect(10, 10, 10, 10), 4u);
946 quad_sink.append(color_quad.PassAs<DrawQuad>(), data);
947
948 delegated_renderer_layer->SetRenderPasses(delegated_render_passes);
949
950 // The RenderPasses should be taken by the layer.
951 EXPECT_EQ(0u, delegated_render_passes.size());
952
953 root_layer_ = root_layer.get();
954 delegated_renderer_layer_ = delegated_renderer_layer.get();
955
956 if (clip_delegated_renderer_layer_) {
957 gfx::Rect clip_rect(21, 27, 23, 21);
958
959 clip_layer->setPosition(clip_rect.origin());
960 clip_layer->setBounds(clip_rect.size());
961 clip_layer->setContentBounds(clip_rect.size());
962 clip_layer->setMasksToBounds(true);
963
964 origin_layer->setPosition(
965 gfx::PointAtOffsetFromOrigin(-clip_rect.OffsetFromOrigin()));
966
967 origin_layer->addChild(delegated_renderer_layer.PassAs<LayerImpl>());
968 clip_layer->addChild(origin_layer.Pass());
969 root_layer->addChild(clip_layer.Pass());
970 } else {
971 root_layer->addChild(delegated_renderer_layer.PassAs<LayerImpl>());
972 }
973
974 host_impl_->activeTree()->SetRootLayer(root_layer.Pass());
975 }
976
977 protected:
978 LayerImpl* root_layer_;
979 DelegatedRendererLayerImpl* delegated_renderer_layer_;
980 bool root_delegated_render_pass_is_clipped_;
981 bool clip_delegated_renderer_layer_;
118 }; 982 };
119 983
120 TEST_F(DelegatedRendererLayerImplTestSimple, AddsContributingRenderPasses) 984 TEST_F(DelegatedRendererLayerImplTestClip,
121 { 985 QuadsUnclipped_LayerUnclipped_NoSurface) {
122 LayerTreeHostImpl::FrameData frame; 986 root_delegated_render_pass_is_clipped_ = false;
123 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); 987 clip_delegated_renderer_layer_ = false;
124 988 SetUpTest();
125 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender erLayer added two contributing passes. 989
126 ASSERT_EQ(5u, frame.renderPasses.size()); 990 LayerTreeHostImpl::FrameData frame;
127 991 EXPECT_TRUE(host_impl_->prepareToDraw(frame));
128 // The DelegatedRendererLayer should have added its contributing RenderPasse s to the frame. 992
129 EXPECT_EQ(4, frame.renderPasses[1]->id.layer_id); 993 ASSERT_EQ(2u, frame.renderPasses.size());
130 EXPECT_EQ(1, frame.renderPasses[1]->id.index); 994 const QuadList& contrib_delegated_quad_list =
131 EXPECT_EQ(4, frame.renderPasses[2]->id.layer_id); 995 frame.renderPasses[0]->quad_list;
132 EXPECT_EQ(2, frame.renderPasses[2]->id.index); 996 ASSERT_EQ(2u, contrib_delegated_quad_list.size());
133 // And all other RenderPasses should be non-delegated. 997 const QuadList& root_delegated_quad_list = frame.renderPasses[1]->quad_list;
134 EXPECT_NE(4, frame.renderPasses[0]->id.layer_id); 998 ASSERT_EQ(5u, root_delegated_quad_list.size());
135 EXPECT_EQ(0, frame.renderPasses[0]->id.index); 999 const SharedQuadState* root_delegated_shared_quad_state =
136 EXPECT_NE(4, frame.renderPasses[3]->id.layer_id); 1000 root_delegated_quad_list[0]->shared_quad_state;
137 EXPECT_EQ(0, frame.renderPasses[3]->id.index); 1001 const SharedQuadState* contrib_delegated_shared_quad_state =
138 EXPECT_NE(4, frame.renderPasses[4]->id.layer_id); 1002 contrib_delegated_quad_list[0]->shared_quad_state;
139 EXPECT_EQ(0, frame.renderPasses[4]->id.index); 1003
140 1004 // When the quads don't have a clip of their own, the clip rect is set to
141 // The DelegatedRendererLayer should have added its RenderPasses to the fram e in order. 1005 // the drawableContentRect of the delegated renderer layer.
142 EXPECT_RECT_EQ(gfx::Rect(6, 6, 6, 6), frame.renderPasses[1]->output_rect); 1006 EXPECT_EQ(gfx::Rect(20, 20, 50, 50).ToString(),
143 EXPECT_RECT_EQ(gfx::Rect(7, 7, 7, 7), frame.renderPasses[2]->output_rect); 1007 root_delegated_shared_quad_state->clip_rect.ToString());
144 1008 // Quads are clipped to the delegated renderer layer.
145 m_hostImpl->drawLayers(frame); 1009 EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped);
146 m_hostImpl->didDrawAllLayers(frame); 1010
147 } 1011 host_impl_->drawLayers(frame);
148 1012 host_impl_->didDrawAllLayers(frame);
149 TEST_F(DelegatedRendererLayerImplTestSimple, AddsQuadsToContributingRenderPasses ) 1013 }
150 { 1014
151 LayerTreeHostImpl::FrameData frame; 1015 TEST_F(DelegatedRendererLayerImplTestClip,
152 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); 1016 QuadsClipped_LayerUnclipped_NoSurface) {
153 1017 root_delegated_render_pass_is_clipped_ = true;
154 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender erLayer added two contributing passes. 1018 clip_delegated_renderer_layer_ = false;
155 ASSERT_EQ(5u, frame.renderPasses.size()); 1019 SetUpTest();
156 1020
157 // The DelegatedRendererLayer should have added its contributing RenderPasse s to the frame. 1021 LayerTreeHostImpl::FrameData frame;
158 EXPECT_EQ(4, frame.renderPasses[1]->id.layer_id); 1022 EXPECT_TRUE(host_impl_->prepareToDraw(frame));
159 EXPECT_EQ(1, frame.renderPasses[1]->id.index); 1023
160 EXPECT_EQ(4, frame.renderPasses[2]->id.layer_id); 1024 ASSERT_EQ(2u, frame.renderPasses.size());
161 EXPECT_EQ(2, frame.renderPasses[2]->id.index); 1025 const QuadList& contrib_delegated_quad_list =
162 1026 frame.renderPasses[0]->quad_list;
163 // The DelegatedRendererLayer should have added copies of its quads to contr ibuting RenderPasses. 1027 ASSERT_EQ(2u, contrib_delegated_quad_list.size());
164 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size()); 1028 const QuadList& root_delegated_quad_list =
165 EXPECT_RECT_EQ(gfx::Rect(0, 0, 6, 6), frame.renderPasses[1]->quad_list[0]->r ect); 1029 frame.renderPasses[1]->quad_list;
166 1030 ASSERT_EQ(5u, root_delegated_quad_list.size());
167 // Verify it added the right quads. 1031 const SharedQuadState* root_delegated_shared_quad_state =
168 ASSERT_EQ(2u, frame.renderPasses[2]->quad_list.size()); 1032 root_delegated_quad_list[0]->shared_quad_state;
169 EXPECT_RECT_EQ(gfx::Rect(0, 0, 7, 7), frame.renderPasses[2]->quad_list[0]->r ect); 1033 const SharedQuadState* contrib_delegated_shared_quad_state =
170 EXPECT_RECT_EQ(gfx::Rect(6, 6, 6, 6), frame.renderPasses[2]->quad_list[1]->r ect); 1034 contrib_delegated_quad_list[0]->shared_quad_state;
171 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size()); 1035
172 EXPECT_RECT_EQ(gfx::Rect(0, 0, 6, 6), frame.renderPasses[1]->quad_list[0]->r ect); 1036 // When the quads have a clip of their own, it is used.
173 1037 EXPECT_EQ(gfx::Rect(25, 25, 40, 40).ToString(),
174 m_hostImpl->drawLayers(frame); 1038 root_delegated_shared_quad_state->clip_rect.ToString());
175 m_hostImpl->didDrawAllLayers(frame); 1039 // Quads came with a clip rect.
176 } 1040 EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped);
177 1041
178 TEST_F(DelegatedRendererLayerImplTestSimple, AddsQuadsToTargetRenderPass) 1042 host_impl_->drawLayers(frame);
179 { 1043 host_impl_->didDrawAllLayers(frame);
180 LayerTreeHostImpl::FrameData frame; 1044 }
181 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); 1045
182 1046 TEST_F(DelegatedRendererLayerImplTestClip,
183 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender erLayer added two contributing passes. 1047 QuadsUnclipped_LayerClipped_NoSurface) {
184 ASSERT_EQ(5u, frame.renderPasses.size()); 1048 root_delegated_render_pass_is_clipped_ = false;
185 1049 clip_delegated_renderer_layer_ = true;
186 // The layer's target is the RenderPass from m_layerAfter. 1050 SetUpTest();
187 EXPECT_EQ(RenderPass::Id(3, 0), frame.renderPasses[3]->id); 1051
188 1052 LayerTreeHostImpl::FrameData frame;
189 // The DelegatedRendererLayer should have added copies of quads in its root RenderPass to its target RenderPass. 1053 EXPECT_TRUE(host_impl_->prepareToDraw(frame));
190 // The m_layerAfter also adds one quad. 1054
191 ASSERT_EQ(2u, frame.renderPasses[3]->quad_list.size()); 1055 ASSERT_EQ(2u, frame.renderPasses.size());
192 1056 const QuadList& contrib_delegated_quad_list =
193 // Verify it added the right quads. 1057 frame.renderPasses[0]->quad_list;
194 EXPECT_RECT_EQ(gfx::Rect(7, 7, 7, 7), frame.renderPasses[3]->quad_list[0]->r ect); 1058 ASSERT_EQ(2u, contrib_delegated_quad_list.size());
195 1059 const QuadList& root_delegated_quad_list = frame.renderPasses[1]->quad_list;
196 // Its target layer should have a quad as well. 1060 ASSERT_EQ(5u, root_delegated_quad_list.size());
197 EXPECT_RECT_EQ(gfx::Rect(0, 0, 15, 15), frame.renderPasses[3]->quad_list[1]- >rect); 1061 const SharedQuadState* root_delegated_shared_quad_state =
198 1062 root_delegated_quad_list[0]->shared_quad_state;
199 m_hostImpl->drawLayers(frame); 1063 const SharedQuadState* contrib_delegated_shared_quad_state =
200 m_hostImpl->didDrawAllLayers(frame); 1064 contrib_delegated_quad_list[0]->shared_quad_state;
201 } 1065
202 1066 // When the quads don't have a clip of their own, the clip rect is set to
203 TEST_F(DelegatedRendererLayerImplTestSimple, QuadsFromRootRenderPassAreModifiedF orTheTarget) 1067 // the drawableContentRect of the delegated renderer layer. When the layer
204 { 1068 // is clipped, that should be seen in the quads' clip_rect.
205 LayerTreeHostImpl::FrameData frame; 1069 EXPECT_EQ(gfx::Rect(21, 27, 23, 21).ToString(),
206 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); 1070 root_delegated_shared_quad_state->clip_rect.ToString());
207 1071 // Quads are clipped to the delegated renderer layer.
208 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender erLayer added two contributing passes. 1072 EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped);
209 ASSERT_EQ(5u, frame.renderPasses.size()); 1073
210 1074 host_impl_->drawLayers(frame);
211 // The DelegatedRendererLayer is at position 3,3 compared to its target, and has a translation transform of 1,1. 1075 host_impl_->didDrawAllLayers(frame);
212 // So its root RenderPass' quads should all be transformed by that combined amount. 1076 }
213 // The DelegatedRendererLayer has a size of 10x10, but the root delegated Re nderPass has a size of 8x8, so 1077
214 // any quads should be scaled by 10/8. 1078 TEST_F(DelegatedRendererLayerImplTestClip,
215 gfx::Transform transform; 1079 QuadsClipped_LayerClipped_NoSurface) {
216 transform.Translate(4.0, 4.0); 1080 root_delegated_render_pass_is_clipped_ = true;
217 transform.Scale(10.0 / 8.0, 10.0 / 8.0); 1081 clip_delegated_renderer_layer_ = true;
218 EXPECT_TRANSFORMATION_MATRIX_EQ(transform, frame.renderPasses[3]->quad_list[ 0]->quadTransform()); 1082 SetUpTest();
219 1083
220 // Quads from non-root RenderPasses should not be shifted though. 1084 LayerTreeHostImpl::FrameData frame;
221 ASSERT_EQ(2u, frame.renderPasses[2]->quad_list.size()); 1085 EXPECT_TRUE(host_impl_->prepareToDraw(frame));
222 EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), frame.renderPasses[2]->qua d_list[0]->quadTransform()); 1086
223 EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), frame.renderPasses[2]->qua d_list[1]->quadTransform()); 1087 ASSERT_EQ(2u, frame.renderPasses.size());
224 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size()); 1088 const QuadList& contrib_delegated_quad_list =
225 EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), frame.renderPasses[1]->qua d_list[0]->quadTransform()); 1089 frame.renderPasses[0]->quad_list;
226 1090 ASSERT_EQ(2u, contrib_delegated_quad_list.size());
227 m_hostImpl->drawLayers(frame); 1091 const QuadList& root_delegated_quad_list = frame.renderPasses[1]->quad_list;
228 m_hostImpl->didDrawAllLayers(frame); 1092 ASSERT_EQ(5u, root_delegated_quad_list.size());
229 } 1093 const SharedQuadState* root_delegated_shared_quad_state =
230 1094 root_delegated_quad_list[0]->shared_quad_state;
231 TEST_F(DelegatedRendererLayerImplTestSimple, DoesNotOwnARenderSurface) 1095 const SharedQuadState* contrib_delegated_shared_quad_state =
232 { 1096 contrib_delegated_quad_list[0]->shared_quad_state;
233 LayerTreeHostImpl::FrameData frame; 1097
234 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); 1098 // When the quads have a clip of their own, it is used, but it is
235 1099 // combined with the clip rect of the delegated renderer layer.
236 // If the DelegatedRendererLayer is axis aligned and has opacity 1, then 1100 EXPECT_EQ(gfx::Rect(25, 27, 19, 21).ToString(),
237 // it has no need to be a renderSurface for the quads it carries. 1101 root_delegated_shared_quad_state->clip_rect.ToString());
238 EXPECT_FALSE(m_delegatedRendererLayerPtr->renderSurface()); 1102 // Quads came with a clip rect.
239 1103 EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped);
240 m_hostImpl->drawLayers(frame); 1104
241 m_hostImpl->didDrawAllLayers(frame); 1105 host_impl_->drawLayers(frame);
242 } 1106 host_impl_->didDrawAllLayers(frame);
243 1107 }
244 TEST_F(DelegatedRendererLayerImplTestSimple, DoesOwnARenderSurfaceForOpacity) 1108
245 { 1109 TEST_F(DelegatedRendererLayerImplTestClip,
246 m_delegatedRendererLayerPtr->setOpacity(0.5f); 1110 QuadsUnclipped_LayerUnclipped_Surface) {
247 1111 root_delegated_render_pass_is_clipped_ = false;
248 LayerTreeHostImpl::FrameData frame; 1112 clip_delegated_renderer_layer_ = false;
249 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); 1113 SetUpTest();
250 1114
251 // This test case has quads from multiple layers in the delegated renderer, 1115 delegated_renderer_layer_->setForceRenderSurface(true);
252 // so if the DelegatedRendererLayer has opacity < 1, it should end up with 1116
253 // a render surface. 1117 LayerTreeHostImpl::FrameData frame;
254 EXPECT_TRUE(m_delegatedRendererLayerPtr->renderSurface()); 1118 EXPECT_TRUE(host_impl_->prepareToDraw(frame));
255 1119
256 m_hostImpl->drawLayers(frame); 1120 ASSERT_EQ(3u, frame.renderPasses.size());
257 m_hostImpl->didDrawAllLayers(frame); 1121 const QuadList& contrib_delegated_quad_list =
258 } 1122 frame.renderPasses[0]->quad_list;
259 1123 ASSERT_EQ(2u, contrib_delegated_quad_list.size());
260 TEST_F(DelegatedRendererLayerImplTestSimple, DoesOwnARenderSurfaceForTransform) 1124 const QuadList& root_delegated_quad_list = frame.renderPasses[1]->quad_list;
261 { 1125 ASSERT_EQ(5u, root_delegated_quad_list.size());
262 gfx::Transform rotation; 1126 const SharedQuadState* root_delegated_shared_quad_state =
263 rotation.RotateAboutZAxis(30.0); 1127 root_delegated_quad_list[0]->shared_quad_state;
264 m_delegatedRendererLayerPtr->setTransform(rotation); 1128 const SharedQuadState* contrib_delegated_shared_quad_state =
265 1129 contrib_delegated_quad_list[0]->shared_quad_state;
266 LayerTreeHostImpl::FrameData frame; 1130
267 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); 1131 // When the layer owns a surface, the quads don't need to be clipped
268 1132 // further than they already specify. If they aren't clipped, then their
269 // This test case has quads from multiple layers in the delegated renderer, 1133 // clip rect is ignored, and they are not set as clipped.
270 // so if the DelegatedRendererLayer has opacity < 1, it should end up with 1134 EXPECT_FALSE(root_delegated_shared_quad_state->is_clipped);
271 // a render surface. 1135
272 EXPECT_TRUE(m_delegatedRendererLayerPtr->renderSurface()); 1136 host_impl_->drawLayers(frame);
273 1137 host_impl_->didDrawAllLayers(frame);
274 m_hostImpl->drawLayers(frame); 1138 }
275 m_hostImpl->didDrawAllLayers(frame); 1139
276 } 1140 TEST_F(DelegatedRendererLayerImplTestClip,
277 1141 QuadsClipped_LayerUnclipped_Surface) {
278 class DelegatedRendererLayerImplTestOwnSurface : public DelegatedRendererLayerIm plTestSimple { 1142 root_delegated_render_pass_is_clipped_ = true;
279 public: 1143 clip_delegated_renderer_layer_ = false;
280 DelegatedRendererLayerImplTestOwnSurface() 1144 SetUpTest();
281 : DelegatedRendererLayerImplTestSimple() 1145
282 { 1146 delegated_renderer_layer_->setForceRenderSurface(true);
283 m_delegatedRendererLayerPtr->setForceRenderSurface(true); 1147
284 } 1148 LayerTreeHostImpl::FrameData frame;
285 }; 1149 EXPECT_TRUE(host_impl_->prepareToDraw(frame));
286 1150
287 TEST_F(DelegatedRendererLayerImplTestOwnSurface, AddsRenderPasses) 1151 ASSERT_EQ(3u, frame.renderPasses.size());
288 { 1152 const QuadList& contrib_delegated_quad_list = frame.renderPasses[0]->quad_list ;
289 LayerTreeHostImpl::FrameData frame; 1153 ASSERT_EQ(2u, contrib_delegated_quad_list.size());
290 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); 1154 const QuadList& root_delegated_quad_list = frame.renderPasses[1]->quad_list;
291 1155 ASSERT_EQ(5u, root_delegated_quad_list.size());
292 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender erLayer added two contributing passes and its owned surface added one pass. 1156 const SharedQuadState* root_delegated_shared_quad_state = root_delegated_quad_ list[0]->shared_quad_state;
293 ASSERT_EQ(6u, frame.renderPasses.size()); 1157 const SharedQuadState* contrib_delegated_shared_quad_state =
294 1158 contrib_delegated_quad_list[0]->shared_quad_state;
295 // The DelegatedRendererLayer should have added its contributing RenderPasse s to the frame. 1159
296 EXPECT_EQ(4, frame.renderPasses[1]->id.layer_id); 1160 // When the quads have a clip of their own, it is used.
297 EXPECT_EQ(1, frame.renderPasses[1]->id.index); 1161 EXPECT_EQ(gfx::Rect(5, 5, 40, 40).ToString(),
298 EXPECT_EQ(4, frame.renderPasses[2]->id.layer_id); 1162 root_delegated_shared_quad_state->clip_rect.ToString());
299 EXPECT_EQ(2, frame.renderPasses[2]->id.index); 1163 // Quads came with a clip rect.
300 // The DelegatedRendererLayer should have added a RenderPass for its surface to the frame. 1164 EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped);
301 EXPECT_EQ(4, frame.renderPasses[1]->id.layer_id); 1165
302 EXPECT_EQ(0, frame.renderPasses[3]->id.index); 1166 host_impl_->drawLayers(frame);
303 // And all other RenderPasses should be non-delegated. 1167 host_impl_->didDrawAllLayers(frame);
304 EXPECT_NE(4, frame.renderPasses[0]->id.layer_id); 1168 }
305 EXPECT_EQ(0, frame.renderPasses[0]->id.index); 1169
306 EXPECT_NE(4, frame.renderPasses[4]->id.layer_id); 1170 TEST_F(DelegatedRendererLayerImplTestClip,
307 EXPECT_EQ(0, frame.renderPasses[4]->id.index); 1171 QuadsUnclipped_LayerClipped_Surface) {
308 EXPECT_NE(4, frame.renderPasses[5]->id.layer_id); 1172 root_delegated_render_pass_is_clipped_ = false;
309 EXPECT_EQ(0, frame.renderPasses[5]->id.index); 1173 clip_delegated_renderer_layer_ = true;
310 1174 SetUpTest();
311 // The DelegatedRendererLayer should have added its RenderPasses to the fram e in order. 1175
312 EXPECT_RECT_EQ(gfx::Rect(6, 6, 6, 6), frame.renderPasses[1]->output_rect); 1176 delegated_renderer_layer_->setForceRenderSurface(true);
313 EXPECT_RECT_EQ(gfx::Rect(7, 7, 7, 7), frame.renderPasses[2]->output_rect); 1177
314 1178 LayerTreeHostImpl::FrameData frame;
315 m_hostImpl->drawLayers(frame); 1179 EXPECT_TRUE(host_impl_->prepareToDraw(frame));
316 m_hostImpl->didDrawAllLayers(frame); 1180
317 } 1181 ASSERT_EQ(3u, frame.renderPasses.size());
318 1182 const QuadList& contrib_delegated_quad_list =
319 TEST_F(DelegatedRendererLayerImplTestOwnSurface, AddsQuadsToContributingRenderPa sses) 1183 frame.renderPasses[0]->quad_list;
320 { 1184 ASSERT_EQ(2u, contrib_delegated_quad_list.size());
321 LayerTreeHostImpl::FrameData frame; 1185 const QuadList& root_delegated_quad_list = frame.renderPasses[1]->quad_list;
322 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); 1186 ASSERT_EQ(5u, root_delegated_quad_list.size());
323 1187 const SharedQuadState* root_delegated_shared_quad_state =
324 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender erLayer added two contributing passes and its owned surface added one pass. 1188 root_delegated_quad_list[0]->shared_quad_state;
325 ASSERT_EQ(6u, frame.renderPasses.size()); 1189 const SharedQuadState* contrib_delegated_shared_quad_state =
326 1190 contrib_delegated_quad_list[0]->shared_quad_state;
327 // The DelegatedRendererLayer should have added its contributing RenderPasse s to the frame. 1191
328 EXPECT_EQ(4, frame.renderPasses[1]->id.layer_id); 1192 // When the layer owns a surface, the quads don't need to be clipped
329 EXPECT_EQ(1, frame.renderPasses[1]->id.index); 1193 // further than they already specify. If they aren't clipped, then their
330 EXPECT_EQ(4, frame.renderPasses[2]->id.layer_id); 1194 // clip rect is ignored, and they are not set as clipped.
331 EXPECT_EQ(2, frame.renderPasses[2]->id.index); 1195 EXPECT_FALSE(root_delegated_shared_quad_state->is_clipped);
332 1196
333 // The DelegatedRendererLayer should have added copies of its quads to contr ibuting RenderPasses. 1197 host_impl_->drawLayers(frame);
334 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size()); 1198 host_impl_->didDrawAllLayers(frame);
335 EXPECT_RECT_EQ(gfx::Rect(0, 0, 6, 6), frame.renderPasses[1]->quad_list[0]->r ect); 1199 }
336 1200
337 // Verify it added the right quads. 1201 TEST_F(DelegatedRendererLayerImplTestClip, QuadsClipped_LayerClipped_Surface) {
338 ASSERT_EQ(2u, frame.renderPasses[2]->quad_list.size()); 1202 root_delegated_render_pass_is_clipped_ = true;
339 EXPECT_RECT_EQ(gfx::Rect(0, 0, 7, 7), frame.renderPasses[2]->quad_list[0]->r ect); 1203 clip_delegated_renderer_layer_ = true;
340 EXPECT_RECT_EQ(gfx::Rect(6, 6, 6, 6), frame.renderPasses[2]->quad_list[1]->r ect); 1204 SetUpTest();
341 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size()); 1205
342 EXPECT_RECT_EQ(gfx::Rect(0, 0, 6, 6), frame.renderPasses[1]->quad_list[0]->r ect); 1206 delegated_renderer_layer_->setForceRenderSurface(true);
343 1207
344 m_hostImpl->drawLayers(frame); 1208 LayerTreeHostImpl::FrameData frame;
345 m_hostImpl->didDrawAllLayers(frame); 1209 EXPECT_TRUE(host_impl_->prepareToDraw(frame));
346 } 1210
347 1211 ASSERT_EQ(3u, frame.renderPasses.size());
348 TEST_F(DelegatedRendererLayerImplTestOwnSurface, AddsQuadsToTargetRenderPass) 1212 const QuadList& contrib_delegated_quad_list =
349 { 1213 frame.renderPasses[0]->quad_list;
350 LayerTreeHostImpl::FrameData frame; 1214 ASSERT_EQ(2u, contrib_delegated_quad_list.size());
351 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); 1215 const QuadList& root_delegated_quad_list = frame.renderPasses[1]->quad_list;
352 1216 ASSERT_EQ(5u, root_delegated_quad_list.size());
353 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender erLayer added two contributing passes and its owned surface added one pass. 1217 const SharedQuadState* root_delegated_shared_quad_state =
354 ASSERT_EQ(6u, frame.renderPasses.size()); 1218 root_delegated_quad_list[0]->shared_quad_state;
355 1219 const SharedQuadState* contrib_delegated_shared_quad_state =
356 // The layer's target is the RenderPass owned by itself. 1220 contrib_delegated_quad_list[0]->shared_quad_state;
357 EXPECT_EQ(RenderPass::Id(4, 0), frame.renderPasses[3]->id); 1221
358 1222 // When the quads have a clip of their own, it is used, but it is
359 // The DelegatedRendererLayer should have added copies of quads in its root RenderPass to its target RenderPass. 1223 // combined with the clip rect of the delegated renderer layer. If the
360 // The m_layerAfter also adds one quad. 1224 // layer owns a surface, then it does not have a clip rect of its own.
361 ASSERT_EQ(1u, frame.renderPasses[3]->quad_list.size()); 1225 EXPECT_EQ(gfx::Rect(5, 5, 40, 40).ToString(),
362 1226 root_delegated_shared_quad_state->clip_rect.ToString());
363 // Verify it added the right quads. 1227 // Quads came with a clip rect.
364 EXPECT_RECT_EQ(gfx::Rect(7, 7, 7, 7), frame.renderPasses[3]->quad_list[0]->r ect); 1228 EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped);
365 1229
366 m_hostImpl->drawLayers(frame); 1230 host_impl_->drawLayers(frame);
367 m_hostImpl->didDrawAllLayers(frame); 1231 host_impl_->didDrawAllLayers(frame);
368 }
369
370 TEST_F(DelegatedRendererLayerImplTestOwnSurface, QuadsFromRootRenderPassAreNotMo difiedForTheTarget)
371 {
372 LayerTreeHostImpl::FrameData frame;
373 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame));
374
375 // Each non-DelegatedRendererLayer added one RenderPass. The DelegatedRender erLayer added two contributing passes and its owned surface added one pass.
376 ASSERT_EQ(6u, frame.renderPasses.size());
377
378 // Because the DelegatedRendererLayer owns a RenderSurfaceImpl, its root Ren derPass' quads do not need to be
379 // translated at all. However, they are scaled from the frame's size (8x8) t o the layer's bounds (10x10).
380 gfx::Transform transform;
381 transform.Scale(10.0 / 8.0, 10.0 / 8.0);
382 EXPECT_TRANSFORMATION_MATRIX_EQ(transform, frame.renderPasses[3]->quad_list[ 0]->quadTransform());
383
384 // Quads from non-root RenderPasses should not be shifted either.
385 ASSERT_EQ(2u, frame.renderPasses[2]->quad_list.size());
386 EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), frame.renderPasses[2]->qua d_list[0]->quadTransform());
387 EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), frame.renderPasses[2]->qua d_list[1]->quadTransform());
388 ASSERT_EQ(1u, frame.renderPasses[1]->quad_list.size());
389 EXPECT_TRANSFORMATION_MATRIX_EQ(gfx::Transform(), frame.renderPasses[1]->qua d_list[0]->quadTransform());
390
391 m_hostImpl->drawLayers(frame);
392 m_hostImpl->didDrawAllLayers(frame);
393 }
394
395 class DelegatedRendererLayerImplTestTransform : public DelegatedRendererLayerImp lTest {
396 public:
397 void setUpTest()
398 {
399 scoped_ptr<LayerImpl> rootLayer = LayerImpl::create(m_hostImpl->activeTr ee(), 1);
400 scoped_ptr<DelegatedRendererLayerImpl> delegatedRendererLayer = Delegate dRendererLayerImpl::create(m_hostImpl->activeTree(), 2);
401
402 m_hostImpl->setViewportSize(gfx::Size(100, 100), gfx::Size(100, 100));
403 rootLayer->setBounds(gfx::Size(100, 100));
404
405 delegatedRendererLayer->setPosition(gfx::Point(20, 20));
406 delegatedRendererLayer->setBounds(gfx::Size(30, 30));
407 delegatedRendererLayer->setContentBounds(gfx::Size(30, 30));
408 delegatedRendererLayer->setDrawsContent(true);
409 gfx::Transform transform;
410 transform.Scale(2.0, 2.0);
411 transform.Translate(8.0, 8.0);
412 delegatedRendererLayer->setTransform(transform);
413
414 ScopedPtrVector<RenderPass> delegatedRenderPasses;
415
416 gfx::Rect childPassRect(20, 20, 7, 7);
417 gfx::Transform childPassTransform;
418 childPassTransform.Scale(0.8, 0.8);
419 childPassTransform.Translate(9.0, 9.0);
420 gfx::Rect childPassClipRect(21, 21, 3, 3);
421 bool childPassClipped = false;
422
423 {
424 TestRenderPass* pass = addRenderPass(delegatedRenderPasses, RenderPa ss::Id(10, 7), childPassRect, gfx::Transform());
425 MockQuadCuller quadSink(pass->quad_list, pass->shared_quad_state_lis t);
426 AppendQuadsData data(pass->id);
427 SharedQuadState* sharedState = quadSink.useSharedQuadState(SharedQua dState::Create());
428 sharedState->SetAll(childPassTransform, childPassRect, childPassClip Rect, childPassClipped, 1);
429 scoped_ptr<SolidColorDrawQuad> colorQuad;
430
431 colorQuad = SolidColorDrawQuad::Create();
432 colorQuad->SetNew(sharedState, gfx::Rect(20, 20, 3, 7), 1u);
433 quadSink.append(colorQuad.PassAs<DrawQuad>(), data);
434
435 colorQuad = SolidColorDrawQuad::Create();
436 colorQuad->SetNew(sharedState, gfx::Rect(23, 20, 4, 7), 1u);
437 quadSink.append(colorQuad.PassAs<DrawQuad>(), data);
438 }
439
440 gfx::Rect passRect(0, 0, 50, 50);
441 gfx::Transform passTransform;
442 passTransform.Scale(1.5, 1.5);
443 passTransform.Translate(7.0, 7.0);
444 gfx::Rect passClipRect(10, 10, 35, 35);
445 bool passClipped = m_rootDelegatedRenderPassIsClipped;
446
447 TestRenderPass* pass = addRenderPass(delegatedRenderPasses, RenderPass:: Id(9, 6), passRect, gfx::Transform());
448 MockQuadCuller quadSink(pass->quad_list, pass->shared_quad_state_list);
449 AppendQuadsData data(pass->id);
450 SharedQuadState* sharedState = quadSink.useSharedQuadState(SharedQuadSta te::Create());
451 sharedState->SetAll(passTransform, passRect, passClipRect, passClipped, 1);
452 scoped_ptr<SolidColorDrawQuad> colorQuad;
453
454 scoped_ptr<RenderPassDrawQuad> renderPassQuad = RenderPassDrawQuad::Crea te();
455 renderPassQuad->SetNew(
456 sharedState,
457 gfx::Rect(5, 5, 7, 7),
458 RenderPass::Id(10, 7),
459 false, // is_replica
460 0, // mask_resource_id
461 childPassRect, // contents_changed_since_last_frame
462 gfx::RectF(), // mask_uv_rect
463 WebKit::WebFilterOperations(), // filters
464 skia::RefPtr<SkImageFilter>(), // filter
465 WebKit::WebFilterOperations()); // background_filters
466 quadSink.append(renderPassQuad.PassAs<DrawQuad>(), data);
467
468 colorQuad = SolidColorDrawQuad::Create();
469 colorQuad->SetNew(sharedState, gfx::Rect(0, 0, 10, 10), 1u);
470 quadSink.append(colorQuad.PassAs<DrawQuad>(), data);
471
472 colorQuad = SolidColorDrawQuad::Create();
473 colorQuad->SetNew(sharedState, gfx::Rect(0, 10, 10, 10), 2u);
474 quadSink.append(colorQuad.PassAs<DrawQuad>(), data);
475
476 colorQuad = SolidColorDrawQuad::Create();
477 colorQuad->SetNew(sharedState, gfx::Rect(10, 0, 10, 10), 3u);
478 quadSink.append(colorQuad.PassAs<DrawQuad>(), data);
479
480 colorQuad = SolidColorDrawQuad::Create();
481 colorQuad->SetNew(sharedState, gfx::Rect(10, 10, 10, 10), 4u);
482 quadSink.append(colorQuad.PassAs<DrawQuad>(), data);
483
484 delegatedRendererLayer->setRenderPasses(delegatedRenderPasses);
485
486 // The RenderPasses should be taken by the layer.
487 EXPECT_EQ(0u, delegatedRenderPasses.size());
488
489 m_rootLayerPtr = rootLayer.get();
490 m_delegatedRendererLayerPtr = delegatedRendererLayer.get();
491
492 rootLayer->addChild(delegatedRendererLayer.PassAs<LayerImpl>());
493
494 m_hostImpl->activeTree()->SetRootLayer(rootLayer.Pass());
495 }
496
497 void verifyRenderPasses(
498 const LayerTreeHostImpl::FrameData& frame,
499 size_t numRenderPasses,
500 const SharedQuadState** rootSharedState,
501 const SharedQuadState** contribSharedState)
502 {
503 ASSERT_EQ(numRenderPasses, frame.renderPasses.size());
504 // The contributing render pass in the DelegatedRendererLayer.
505 EXPECT_EQ(2, frame.renderPasses[0]->id.layer_id);
506 EXPECT_EQ(1, frame.renderPasses[0]->id.index);
507 // The root render pass.
508 EXPECT_EQ(1, frame.renderPasses.back()->id.layer_id);
509 EXPECT_EQ(0, frame.renderPasses.back()->id.index);
510
511 const QuadList& contribQuadList = frame.renderPasses[0]->quad_list;
512 ASSERT_EQ(2u, contribQuadList.size());
513
514 const QuadList& rootQuadList = frame.renderPasses[1]->quad_list;
515 ASSERT_EQ(5u, rootQuadList.size());
516
517 // All quads in a render pass should share the same state.
518 *contribSharedState = contribQuadList[0]->shared_quad_state;
519 EXPECT_EQ(*contribSharedState, contribQuadList[1]->shared_quad_state);
520
521 *rootSharedState = rootQuadList[0]->shared_quad_state;
522 EXPECT_EQ(*rootSharedState, rootQuadList[1]->shared_quad_state);
523 EXPECT_EQ(*rootSharedState, rootQuadList[2]->shared_quad_state);
524 EXPECT_EQ(*rootSharedState, rootQuadList[3]->shared_quad_state);
525 EXPECT_EQ(*rootSharedState, rootQuadList[4]->shared_quad_state);
526
527 EXPECT_NE(*contribSharedState, *rootSharedState);
528 }
529
530 protected:
531 LayerImpl* m_rootLayerPtr;
532 DelegatedRendererLayerImpl* m_delegatedRendererLayerPtr;
533 bool m_rootDelegatedRenderPassIsClipped;
534 };
535
536 TEST_F(DelegatedRendererLayerImplTestTransform, QuadsUnclipped_NoSurface)
537 {
538 m_rootDelegatedRenderPassIsClipped = false;
539 setUpTest();
540
541 LayerTreeHostImpl::FrameData frame;
542 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame));
543
544 const SharedQuadState* rootSharedState = NULL;
545 const SharedQuadState* contribSharedState = NULL;
546 verifyRenderPasses(frame, 2, &rootSharedState, &contribSharedState);
547
548 // When the quads don't have a clip of their own, the clip rect is set to
549 // the drawableContentRect of the delegated renderer layer.
550 EXPECT_RECT_EQ(gfx::Rect(21, 21, 60, 60), rootSharedState->clip_rect);
551
552 // Even though the quads in the root pass have no clip of their own, they
553 // inherit the clip rect from the delegated renderer layer if it does not
554 // own a surface.
555 EXPECT_TRUE(rootSharedState->is_clipped);
556
557 gfx::Transform expected;
558 // This is the transform from the layer's space to its target.
559 // The position (20) - the width / scale (30 / 2) = 20 - 15 = 5
560 expected.Translate(5.0, 5.0);
561 expected.Scale(2.0, 2.0);
562 expected.Translate(8.0, 8.0);
563 // The frame has size 50x50 but the layer's bounds are 30x30.
564 expected.Scale(30.0 / 50.0, 30.0 / 50.0);
565 // This is the transform within the source frame.
566 expected.Scale(1.5, 1.5);
567 expected.Translate(7.0, 7.0);
568 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, rootSharedState->content_to_target _transform);
569
570 // The contributing render pass should not be transformed from its input.
571 EXPECT_RECT_EQ(gfx::Rect(21, 21, 3, 3), contribSharedState->clip_rect);
572 EXPECT_FALSE(contribSharedState->is_clipped);
573 expected.MakeIdentity();
574 expected.Scale(0.8, 0.8);
575 expected.Translate(9.0, 9.0);
576 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, contribSharedState->content_to_tar get_transform);
577
578 m_hostImpl->drawLayers(frame);
579 m_hostImpl->didDrawAllLayers(frame);
580 }
581
582 TEST_F(DelegatedRendererLayerImplTestTransform, QuadsClipped_NoSurface)
583 {
584 m_rootDelegatedRenderPassIsClipped = true;
585 setUpTest();
586
587 LayerTreeHostImpl::FrameData frame;
588 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame));
589
590 const SharedQuadState* rootSharedState = NULL;
591 const SharedQuadState* contribSharedState = NULL;
592 verifyRenderPasses(frame, 2, &rootSharedState, &contribSharedState);
593
594 // Since the quads have a clip_rect it should be modified by delegated
595 // renderer layer's drawTransform.
596 // The position of the resulting clip_rect is:
597 // (clip rect position (10) * scale to layer (30/50) + translate (8)) * laye r scale (2) + layer position (20) = 48
598 // 48 - (width / 2) = 48 - 30 / 2 = 33
599 // The size is 35x35 scaled to fit inside the layer's bounds at 30x30 from
600 // a frame at 50x50:
601 // 35 * 2 (layer's scale) * 30 / 50 = 42.
602 EXPECT_RECT_EQ(gfx::Rect(33, 33, 42, 42), rootSharedState->clip_rect);
603
604 // The quads had a clip and it should be preserved.
605 EXPECT_TRUE(rootSharedState->is_clipped);
606
607 gfx::Transform expected;
608 // This is the transform from the layer's space to its target.
609 // The position (20) - the width / scale (30 / 2) = 20 - 15 = 5
610 expected.Translate(5.0, 5.0);
611 expected.Scale(2.0, 2.0);
612 expected.Translate(8.0, 8.0);
613 // The frame has size 50x50 but the layer's bounds are 30x30.
614 expected.Scale(30.0 / 50.0, 30.0 / 50.0);
615 // This is the transform within the source frame.
616 expected.Scale(1.5, 1.5);
617 expected.Translate(7.0, 7.0);
618 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, rootSharedState->content_to_target _transform);
619
620 // The contributing render pass should not be transformed from its input.
621 EXPECT_RECT_EQ(gfx::Rect(21, 21, 3, 3), contribSharedState->clip_rect);
622 EXPECT_FALSE(contribSharedState->is_clipped);
623 expected.MakeIdentity();
624 expected.Scale(0.8, 0.8);
625 expected.Translate(9.0, 9.0);
626 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, contribSharedState->content_to_tar get_transform);
627
628 m_hostImpl->drawLayers(frame);
629 m_hostImpl->didDrawAllLayers(frame);
630 }
631
632 TEST_F(DelegatedRendererLayerImplTestTransform, QuadsUnclipped_Surface)
633 {
634 m_rootDelegatedRenderPassIsClipped = false;
635 setUpTest();
636
637 m_delegatedRendererLayerPtr->setForceRenderSurface(true);
638
639 LayerTreeHostImpl::FrameData frame;
640 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame));
641
642 const SharedQuadState* rootSharedState = NULL;
643 const SharedQuadState* contribSharedState = NULL;
644 verifyRenderPasses(frame, 3, &rootSharedState, &contribSharedState);
645
646 // When the layer owns a surface, then its position and translation are not
647 // a part of its draw transform.
648 // The position of the resulting clip_rect is:
649 // (clip rect position (10) * scale to layer (30/50)) * layer scale (2) = 12
650 // The size is 35x35 scaled to fit inside the layer's bounds at 30x30 from
651 // a frame at 50x50:
652 // 35 * 2 (layer's scale) * 30 / 50 = 42.
653 EXPECT_RECT_EQ(gfx::Rect(12, 12, 42, 42), rootSharedState->clip_rect);
654
655 // Since the layer owns a surface it doesn't need to clip its quads, so
656 // unclipped quads remain unclipped.
657 EXPECT_FALSE(rootSharedState->is_clipped);
658
659 gfx::Transform expected;
660 expected.Scale(2.0, 2.0);
661 // The frame has size 50x50 but the layer's bounds are 30x30.
662 expected.Scale(30.0 / 50.0, 30.0 / 50.0);
663 // This is the transform within the source frame.
664 expected.Scale(1.5, 1.5);
665 expected.Translate(7.0, 7.0);
666 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, rootSharedState->content_to_target _transform);
667
668 // The contributing render pass should not be transformed from its input.
669 EXPECT_RECT_EQ(gfx::Rect(21, 21, 3, 3), contribSharedState->clip_rect);
670 EXPECT_FALSE(contribSharedState->is_clipped);
671 expected.MakeIdentity();
672 expected.Scale(0.8, 0.8);
673 expected.Translate(9.0, 9.0);
674 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, contribSharedState->content_to_tar get_transform);
675
676 m_hostImpl->drawLayers(frame);
677 m_hostImpl->didDrawAllLayers(frame);
678 }
679
680 TEST_F(DelegatedRendererLayerImplTestTransform, QuadsClipped_Surface)
681 {
682 m_rootDelegatedRenderPassIsClipped = true;
683 setUpTest();
684
685 m_delegatedRendererLayerPtr->setForceRenderSurface(true);
686
687 LayerTreeHostImpl::FrameData frame;
688 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame));
689
690 const SharedQuadState* rootSharedState = NULL;
691 const SharedQuadState* contribSharedState = NULL;
692 verifyRenderPasses(frame, 3, &rootSharedState, &contribSharedState);
693
694 // When the layer owns a surface, then its position and translation are not
695 // a part of its draw transform.
696 // The position of the resulting clip_rect is:
697 // (clip rect position (10) * scale to layer (30/50)) * layer scale (2) = 12
698 // The size is 35x35 scaled to fit inside the layer's bounds at 30x30 from
699 // a frame at 50x50:
700 // 35 * 2 (layer's scale) * 30 / 50 = 42.
701 EXPECT_RECT_EQ(gfx::Rect(12, 12, 42, 42), rootSharedState->clip_rect);
702
703 // The quads had a clip and it should be preserved.
704 EXPECT_TRUE(rootSharedState->is_clipped);
705
706 gfx::Transform expected;
707 expected.Scale(2.0, 2.0);
708 // The frame has size 50x50 but the layer's bounds are 30x30.
709 expected.Scale(30.0 / 50.0, 30.0 / 50.0);
710 // This is the transform within the source frame.
711 expected.Scale(1.5, 1.5);
712 expected.Translate(7.0, 7.0);
713 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, rootSharedState->content_to_target _transform);
714
715 // The contributing render pass should not be transformed from its input.
716 EXPECT_RECT_EQ(gfx::Rect(21, 21, 3, 3), contribSharedState->clip_rect);
717 EXPECT_FALSE(contribSharedState->is_clipped);
718 expected.MakeIdentity();
719 expected.Scale(0.8, 0.8);
720 expected.Translate(9.0, 9.0);
721 EXPECT_TRANSFORMATION_MATRIX_EQ(expected, contribSharedState->content_to_tar get_transform);
722
723 m_hostImpl->drawLayers(frame);
724 m_hostImpl->didDrawAllLayers(frame);
725 }
726
727 class DelegatedRendererLayerImplTestClip : public DelegatedRendererLayerImplTest {
728 public:
729 void setUpTest()
730 {
731 scoped_ptr<LayerImpl> rootLayer = LayerImpl::create(m_hostImpl->activeTr ee(), 1);
732 scoped_ptr<DelegatedRendererLayerImpl> delegatedRendererLayer = Delegate dRendererLayerImpl::create(m_hostImpl->activeTree(), 2);
733 scoped_ptr<LayerImpl> clipLayer = LayerImpl::create(m_hostImpl->activeTr ee(), 3);
734 scoped_ptr<LayerImpl> originLayer = LayerImpl::create(m_hostImpl->active Tree(), 4);
735
736 m_hostImpl->setViewportSize(gfx::Size(100, 100), gfx::Size(100, 100));
737 rootLayer->setBounds(gfx::Size(100, 100));
738
739 delegatedRendererLayer->setPosition(gfx::Point(20, 20));
740 delegatedRendererLayer->setBounds(gfx::Size(50, 50));
741 delegatedRendererLayer->setContentBounds(gfx::Size(50, 50));
742 delegatedRendererLayer->setDrawsContent(true);
743
744 ScopedPtrVector<RenderPass> delegatedRenderPasses;
745
746 gfx::Rect childPassRect(20, 20, 7, 7);
747 gfx::Transform childPassTransform;
748 gfx::Rect childPassClipRect(21, 21, 3, 3);
749 bool childPassClipped = false;
750
751 {
752 TestRenderPass* pass = addRenderPass(delegatedRenderPasses, RenderPa ss::Id(10, 7), childPassRect, gfx::Transform());
753 MockQuadCuller quadSink(pass->quad_list, pass->shared_quad_state_lis t);
754 AppendQuadsData data(pass->id);
755 SharedQuadState* sharedState = quadSink.useSharedQuadState(SharedQua dState::Create());
756 sharedState->SetAll(childPassTransform, childPassRect, childPassClip Rect, childPassClipped, 1);
757 scoped_ptr<SolidColorDrawQuad> colorQuad;
758
759 colorQuad = SolidColorDrawQuad::Create();
760 colorQuad->SetNew(sharedState, gfx::Rect(20, 20, 3, 7), 1u);
761 quadSink.append(colorQuad.PassAs<DrawQuad>(), data);
762
763 colorQuad = SolidColorDrawQuad::Create();
764 colorQuad->SetNew(sharedState, gfx::Rect(23, 20, 4, 7), 1u);
765 quadSink.append(colorQuad.PassAs<DrawQuad>(), data);
766 }
767
768 gfx::Rect passRect(0, 0, 50, 50);
769 gfx::Transform passTransform;
770 gfx::Rect passClipRect(5, 5, 40, 40);
771 bool passClipped = m_rootDelegatedRenderPassIsClipped;
772
773 TestRenderPass* pass = addRenderPass(delegatedRenderPasses, RenderPass:: Id(9, 6), passRect, gfx::Transform());
774 MockQuadCuller quadSink(pass->quad_list, pass->shared_quad_state_list);
775 AppendQuadsData data(pass->id);
776 SharedQuadState* sharedState = quadSink.useSharedQuadState(SharedQuadSta te::Create());
777 sharedState->SetAll(passTransform, passRect, passClipRect, passClipped, 1);
778 scoped_ptr<SolidColorDrawQuad> colorQuad;
779
780 scoped_ptr<RenderPassDrawQuad> renderPassQuad = RenderPassDrawQuad::Crea te();
781 renderPassQuad->SetNew(
782 sharedState,
783 gfx::Rect(5, 5, 7, 7),
784 RenderPass::Id(10, 7),
785 false, // is_replica
786 0, // mask_resource_id
787 childPassRect, // contents_changed_since_last_frame
788 gfx::RectF(), // mask_uv_rect
789 WebKit::WebFilterOperations(), // filters
790 skia::RefPtr<SkImageFilter>(), // filter
791 WebKit::WebFilterOperations()); // background_filters
792 quadSink.append(renderPassQuad.PassAs<DrawQuad>(), data);
793
794 colorQuad = SolidColorDrawQuad::Create();
795 colorQuad->SetNew(sharedState, gfx::Rect(0, 0, 10, 10), 1u);
796 quadSink.append(colorQuad.PassAs<DrawQuad>(), data);
797
798 colorQuad = SolidColorDrawQuad::Create();
799 colorQuad->SetNew(sharedState, gfx::Rect(0, 10, 10, 10), 2u);
800 quadSink.append(colorQuad.PassAs<DrawQuad>(), data);
801
802 colorQuad = SolidColorDrawQuad::Create();
803 colorQuad->SetNew(sharedState, gfx::Rect(10, 0, 10, 10), 3u);
804 quadSink.append(colorQuad.PassAs<DrawQuad>(), data);
805
806 colorQuad = SolidColorDrawQuad::Create();
807 colorQuad->SetNew(sharedState, gfx::Rect(10, 10, 10, 10), 4u);
808 quadSink.append(colorQuad.PassAs<DrawQuad>(), data);
809
810 delegatedRendererLayer->setRenderPasses(delegatedRenderPasses);
811
812 // The RenderPasses should be taken by the layer.
813 EXPECT_EQ(0u, delegatedRenderPasses.size());
814
815 m_rootLayerPtr = rootLayer.get();
816 m_delegatedRendererLayerPtr = delegatedRendererLayer.get();
817
818 if (m_clipDelegatedRendererLayer) {
819 gfx::Rect clipRect(21, 27, 23, 21);
820
821 clipLayer->setPosition(clipRect.origin());
822 clipLayer->setBounds(clipRect.size());
823 clipLayer->setContentBounds(clipRect.size());
824 clipLayer->setMasksToBounds(true);
825 clipLayer->setAnchorPoint(gfx::PointF());
826
827 originLayer->setPosition(gfx::PointAtOffsetFromOrigin(-clipRect.Offs etFromOrigin()));
828 originLayer->setAnchorPoint(gfx::PointF());
829
830 originLayer->addChild(delegatedRendererLayer.PassAs<LayerImpl>());
831 clipLayer->addChild(originLayer.Pass());
832 rootLayer->addChild(clipLayer.Pass());
833 } else {
834 rootLayer->addChild(delegatedRendererLayer.PassAs<LayerImpl>());
835 }
836
837 m_hostImpl->activeTree()->SetRootLayer(rootLayer.Pass());
838 }
839
840 protected:
841 LayerImpl* m_rootLayerPtr;
842 DelegatedRendererLayerImpl* m_delegatedRendererLayerPtr;
843 bool m_rootDelegatedRenderPassIsClipped;
844 bool m_clipDelegatedRendererLayer;
845 };
846
847 TEST_F(DelegatedRendererLayerImplTestClip, QuadsUnclipped_LayerUnclipped_NoSurfa ce)
848 {
849 m_rootDelegatedRenderPassIsClipped = false;
850 m_clipDelegatedRendererLayer = false;
851 setUpTest();
852
853 LayerTreeHostImpl::FrameData frame;
854 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame));
855
856 ASSERT_EQ(2u, frame.renderPasses.size());
857 const QuadList& contribQuadList = frame.renderPasses[0]->quad_list;
858 ASSERT_EQ(2u, contribQuadList.size());
859 const QuadList& rootQuadList = frame.renderPasses[1]->quad_list;
860 ASSERT_EQ(5u, rootQuadList.size());
861 const SharedQuadState* rootSharedState = rootQuadList[0]->shared_quad_state;
862 const SharedQuadState* contribSharedState = contribQuadList[0]->shared_quad_ state;
863
864 // When the quads don't have a clip of their own, the clip rect is set to
865 // the drawableContentRect of the delegated renderer layer.
866 EXPECT_RECT_EQ(gfx::Rect(20, 20, 50, 50), rootSharedState->clip_rect);
867 // Quads are clipped to the delegated renderer layer.
868 EXPECT_TRUE(rootSharedState->is_clipped);
869
870 m_hostImpl->drawLayers(frame);
871 m_hostImpl->didDrawAllLayers(frame);
872 }
873
874 TEST_F(DelegatedRendererLayerImplTestClip, QuadsClipped_LayerUnclipped_NoSurface )
875 {
876 m_rootDelegatedRenderPassIsClipped = true;
877 m_clipDelegatedRendererLayer = false;
878 setUpTest();
879
880 LayerTreeHostImpl::FrameData frame;
881 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame));
882
883 ASSERT_EQ(2u, frame.renderPasses.size());
884 const QuadList& contribQuadList = frame.renderPasses[0]->quad_list;
885 ASSERT_EQ(2u, contribQuadList.size());
886 const QuadList& rootQuadList = frame.renderPasses[1]->quad_list;
887 ASSERT_EQ(5u, rootQuadList.size());
888 const SharedQuadState* rootSharedState = rootQuadList[0]->shared_quad_state;
889 const SharedQuadState* contribSharedState = contribQuadList[0]->shared_quad_ state;
890
891 // When the quads have a clip of their own, it is used.
892 EXPECT_RECT_EQ(gfx::Rect(25, 25, 40, 40), rootSharedState->clip_rect);
893 // Quads came with a clip rect.
894 EXPECT_TRUE(rootSharedState->is_clipped);
895
896 m_hostImpl->drawLayers(frame);
897 m_hostImpl->didDrawAllLayers(frame);
898 }
899
900 TEST_F(DelegatedRendererLayerImplTestClip, QuadsUnclipped_LayerClipped_NoSurface )
901 {
902 m_rootDelegatedRenderPassIsClipped = false;
903 m_clipDelegatedRendererLayer = true;
904 setUpTest();
905
906 LayerTreeHostImpl::FrameData frame;
907 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame));
908
909 ASSERT_EQ(2u, frame.renderPasses.size());
910 const QuadList& contribQuadList = frame.renderPasses[0]->quad_list;
911 ASSERT_EQ(2u, contribQuadList.size());
912 const QuadList& rootQuadList = frame.renderPasses[1]->quad_list;
913 ASSERT_EQ(5u, rootQuadList.size());
914 const SharedQuadState* rootSharedState = rootQuadList[0]->shared_quad_state;
915 const SharedQuadState* contribSharedState = contribQuadList[0]->shared_quad_ state;
916
917 // When the quads don't have a clip of their own, the clip rect is set to
918 // the drawableContentRect of the delegated renderer layer. When the layer
919 // is clipped, that should be seen in the quads' clip_rect.
920 EXPECT_RECT_EQ(gfx::Rect(21, 27, 23, 21), rootSharedState->clip_rect);
921 // Quads are clipped to the delegated renderer layer.
922 EXPECT_TRUE(rootSharedState->is_clipped);
923
924 m_hostImpl->drawLayers(frame);
925 m_hostImpl->didDrawAllLayers(frame);
926 }
927
928 TEST_F(DelegatedRendererLayerImplTestClip, QuadsClipped_LayerClipped_NoSurface)
929 {
930 m_rootDelegatedRenderPassIsClipped = true;
931 m_clipDelegatedRendererLayer = true;
932 setUpTest();
933
934 LayerTreeHostImpl::FrameData frame;
935 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame));
936
937 ASSERT_EQ(2u, frame.renderPasses.size());
938 const QuadList& contribQuadList = frame.renderPasses[0]->quad_list;
939 ASSERT_EQ(2u, contribQuadList.size());
940 const QuadList& rootQuadList = frame.renderPasses[1]->quad_list;
941 ASSERT_EQ(5u, rootQuadList.size());
942 const SharedQuadState* rootSharedState = rootQuadList[0]->shared_quad_state;
943 const SharedQuadState* contribSharedState = contribQuadList[0]->shared_quad_ state;
944
945 // When the quads have a clip of their own, it is used, but it is
946 // combined with the clip rect of the delegated renderer layer.
947 EXPECT_RECT_EQ(gfx::Rect(25, 27, 19, 21), rootSharedState->clip_rect);
948 // Quads came with a clip rect.
949 EXPECT_TRUE(rootSharedState->is_clipped);
950
951 m_hostImpl->drawLayers(frame);
952 m_hostImpl->didDrawAllLayers(frame);
953 }
954
955 TEST_F(DelegatedRendererLayerImplTestClip, QuadsUnclipped_LayerUnclipped_Surface )
956 {
957 m_rootDelegatedRenderPassIsClipped = false;
958 m_clipDelegatedRendererLayer = false;
959 setUpTest();
960
961 m_delegatedRendererLayerPtr->setForceRenderSurface(true);
962
963 LayerTreeHostImpl::FrameData frame;
964 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame));
965
966 ASSERT_EQ(3u, frame.renderPasses.size());
967 const QuadList& contribQuadList = frame.renderPasses[0]->quad_list;
968 ASSERT_EQ(2u, contribQuadList.size());
969 const QuadList& rootQuadList = frame.renderPasses[1]->quad_list;
970 ASSERT_EQ(5u, rootQuadList.size());
971 const SharedQuadState* rootSharedState = rootQuadList[0]->shared_quad_state;
972 const SharedQuadState* contribSharedState = contribQuadList[0]->shared_quad_ state;
973
974 // When the layer owns a surface, the quads don't need to be clipped
975 // further than they already specify. If they aren't clipped, then their
976 // clip rect is ignored, and they are not set as clipped.
977 EXPECT_FALSE(rootSharedState->is_clipped);
978
979 m_hostImpl->drawLayers(frame);
980 m_hostImpl->didDrawAllLayers(frame);
981 }
982
983 TEST_F(DelegatedRendererLayerImplTestClip, QuadsClipped_LayerUnclipped_Surface)
984 {
985 m_rootDelegatedRenderPassIsClipped = true;
986 m_clipDelegatedRendererLayer = false;
987 setUpTest();
988
989 m_delegatedRendererLayerPtr->setForceRenderSurface(true);
990
991 LayerTreeHostImpl::FrameData frame;
992 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame));
993
994 ASSERT_EQ(3u, frame.renderPasses.size());
995 const QuadList& contribQuadList = frame.renderPasses[0]->quad_list;
996 ASSERT_EQ(2u, contribQuadList.size());
997 const QuadList& rootQuadList = frame.renderPasses[1]->quad_list;
998 ASSERT_EQ(5u, rootQuadList.size());
999 const SharedQuadState* rootSharedState = rootQuadList[0]->shared_quad_state;
1000 const SharedQuadState* contribSharedState = contribQuadList[0]->shared_quad_ state;
1001
1002 // When the quads have a clip of their own, it is used.
1003 EXPECT_RECT_EQ(gfx::Rect(5, 5, 40, 40), rootSharedState->clip_rect);
1004 // Quads came with a clip rect.
1005 EXPECT_TRUE(rootSharedState->is_clipped);
1006
1007 m_hostImpl->drawLayers(frame);
1008 m_hostImpl->didDrawAllLayers(frame);
1009 }
1010
1011 TEST_F(DelegatedRendererLayerImplTestClip, QuadsUnclipped_LayerClipped_Surface)
1012 {
1013 m_rootDelegatedRenderPassIsClipped = false;
1014 m_clipDelegatedRendererLayer = true;
1015 setUpTest();
1016
1017 m_delegatedRendererLayerPtr->setForceRenderSurface(true);
1018
1019 LayerTreeHostImpl::FrameData frame;
1020 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame));
1021
1022 ASSERT_EQ(3u, frame.renderPasses.size());
1023 const QuadList& contribQuadList = frame.renderPasses[0]->quad_list;
1024 ASSERT_EQ(2u, contribQuadList.size());
1025 const QuadList& rootQuadList = frame.renderPasses[1]->quad_list;
1026 ASSERT_EQ(5u, rootQuadList.size());
1027 const SharedQuadState* rootSharedState = rootQuadList[0]->shared_quad_state;
1028 const SharedQuadState* contribSharedState = contribQuadList[0]->shared_quad_ state;
1029
1030 // When the layer owns a surface, the quads don't need to be clipped
1031 // further than they already specify. If they aren't clipped, then their
1032 // clip rect is ignored, and they are not set as clipped.
1033 EXPECT_FALSE(rootSharedState->is_clipped);
1034
1035 m_hostImpl->drawLayers(frame);
1036 m_hostImpl->didDrawAllLayers(frame);
1037 }
1038
1039 TEST_F(DelegatedRendererLayerImplTestClip, QuadsClipped_LayerClipped_Surface)
1040 {
1041 m_rootDelegatedRenderPassIsClipped = true;
1042 m_clipDelegatedRendererLayer = true;
1043 setUpTest();
1044
1045 m_delegatedRendererLayerPtr->setForceRenderSurface(true);
1046
1047 LayerTreeHostImpl::FrameData frame;
1048 EXPECT_TRUE(m_hostImpl->prepareToDraw(frame));
1049
1050 ASSERT_EQ(3u, frame.renderPasses.size());
1051 const QuadList& contribQuadList = frame.renderPasses[0]->quad_list;
1052 ASSERT_EQ(2u, contribQuadList.size());
1053 const QuadList& rootQuadList = frame.renderPasses[1]->quad_list;
1054 ASSERT_EQ(5u, rootQuadList.size());
1055 const SharedQuadState* rootSharedState = rootQuadList[0]->shared_quad_state;
1056 const SharedQuadState* contribSharedState = contribQuadList[0]->shared_quad_ state;
1057
1058 // When the quads have a clip of their own, it is used, but it is
1059 // combined with the clip rect of the delegated renderer layer. If the
1060 // layer owns a surface, then it does not have a clip rect of its own.
1061 EXPECT_RECT_EQ(gfx::Rect(5, 5, 40, 40), rootSharedState->clip_rect);
1062 // Quads came with a clip rect.
1063 EXPECT_TRUE(rootSharedState->is_clipped);
1064
1065 m_hostImpl->drawLayers(frame);
1066 m_hostImpl->didDrawAllLayers(frame);
1067 } 1232 }
1068 1233
1069 } // namespace 1234 } // namespace
1070 } // namespace cc 1235 } // namespace cc
OLDNEW
« no previous file with comments | « cc/delegated_renderer_layer_impl.cc ('k') | cc/layer_tree_host_unittest_context.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698