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

Side by Side Diff: cc/delegated_renderer_layer_impl_unittest.cc

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

Powered by Google App Engine
This is Rietveld 408576698