OLD | NEW |
| (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 | |
OLD | NEW |