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