OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/layers/delegated_renderer_layer_impl.h" | 5 #include "cc/layers/delegated_renderer_layer_impl.h" |
6 | 6 |
7 #include "cc/base/scoped_ptr_vector.h" | 7 #include "cc/base/scoped_ptr_vector.h" |
8 #include "cc/layers/quad_sink.h" | 8 #include "cc/layers/quad_sink.h" |
9 #include "cc/layers/solid_color_layer_impl.h" | 9 #include "cc/layers/solid_color_layer_impl.h" |
10 #include "cc/quads/render_pass_draw_quad.h" | 10 #include "cc/quads/render_pass_draw_quad.h" |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 gfx::Rect(7, 7, 7, 7), | 102 gfx::Rect(7, 7, 7, 7), |
103 gfx::Transform(1, 0, 0, 1, 7, 8)); | 103 gfx::Transform(1, 0, 0, 1, 7, 8)); |
104 AddQuad(pass2, gfx::Rect(0, 0, 7, 7), 22u); | 104 AddQuad(pass2, gfx::Rect(0, 0, 7, 7), 22u); |
105 AddRenderPassQuad(pass2, pass1); | 105 AddRenderPassQuad(pass2, pass1); |
106 TestRenderPass* pass3 = AddRenderPass(&delegated_render_passes, | 106 TestRenderPass* pass3 = AddRenderPass(&delegated_render_passes, |
107 RenderPass::Id(9, 8), | 107 RenderPass::Id(9, 8), |
108 gfx::Rect(0, 0, 8, 8), | 108 gfx::Rect(0, 0, 8, 8), |
109 gfx::Transform(1, 0, 0, 1, 9, 10)); | 109 gfx::Transform(1, 0, 0, 1, 9, 10)); |
110 AddRenderPassQuad(pass3, pass2); | 110 AddRenderPassQuad(pass3, pass2); |
111 delegated_renderer_layer->SetFrameDataForRenderPasses( | 111 delegated_renderer_layer->SetFrameDataForRenderPasses( |
112 1.f, &delegated_render_passes); | 112 &delegated_render_passes); |
113 | 113 |
114 // The RenderPasses should be taken by the layer. | 114 // The RenderPasses should be taken by the layer. |
115 EXPECT_EQ(0u, delegated_render_passes.size()); | 115 EXPECT_EQ(0u, delegated_render_passes.size()); |
116 | 116 |
117 root_layer_ = root_layer.get(); | 117 root_layer_ = root_layer.get(); |
118 layer_before_ = layer_before.get(); | 118 layer_before_ = layer_before.get(); |
119 layer_after_ = layer_after.get(); | 119 layer_after_ = layer_after.get(); |
120 delegated_renderer_layer_ = delegated_renderer_layer.get(); | 120 delegated_renderer_layer_ = delegated_renderer_layer.get(); |
121 | 121 |
122 // Force the delegated RenderPasses to come before the RenderPass from | 122 // Force the delegated RenderPasses to come before the RenderPass from |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
238 LayerTreeHostImpl::FrameData frame; | 238 LayerTreeHostImpl::FrameData frame; |
239 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); | 239 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
240 | 240 |
241 // Each non-DelegatedRendererLayer added one RenderPass. The | 241 // Each non-DelegatedRendererLayer added one RenderPass. The |
242 // DelegatedRendererLayer added two contributing passes. | 242 // DelegatedRendererLayer added two contributing passes. |
243 ASSERT_EQ(5u, frame.render_passes.size()); | 243 ASSERT_EQ(5u, frame.render_passes.size()); |
244 | 244 |
245 // The DelegatedRendererLayer is at position 3,3 compared to its target, and | 245 // The DelegatedRendererLayer is at position 3,3 compared to its target, and |
246 // has a translation transform of 1,1. So its root RenderPass' quads should | 246 // has a translation transform of 1,1. So its root RenderPass' quads should |
247 // all be transformed by that combined amount. | 247 // all be transformed by that combined amount. |
| 248 // The DelegatedRendererLayer has a size of 10x10, but the root delegated |
| 249 // RenderPass has a size of 8x8, so any quads should be scaled by 10/8. |
248 gfx::Transform transform; | 250 gfx::Transform transform; |
249 transform.Translate(4.0, 4.0); | 251 transform.Translate(4.0, 4.0); |
| 252 transform.Scale(10.0 / 8.0, 10.0 / 8.0); |
250 EXPECT_TRANSFORMATION_MATRIX_EQ( | 253 EXPECT_TRANSFORMATION_MATRIX_EQ( |
251 transform, frame.render_passes[3]->quad_list[0]->quadTransform()); | 254 transform, frame.render_passes[3]->quad_list[0]->quadTransform()); |
252 | 255 |
253 // Quads from non-root RenderPasses should not be shifted though. | 256 // Quads from non-root RenderPasses should not be shifted though. |
254 ASSERT_EQ(2u, frame.render_passes[2]->quad_list.size()); | 257 ASSERT_EQ(2u, frame.render_passes[2]->quad_list.size()); |
255 EXPECT_TRANSFORMATION_MATRIX_EQ( | 258 EXPECT_TRANSFORMATION_MATRIX_EQ( |
256 gfx::Transform(), frame.render_passes[2]->quad_list[0]->quadTransform()); | 259 gfx::Transform(), frame.render_passes[2]->quad_list[0]->quadTransform()); |
257 EXPECT_TRANSFORMATION_MATRIX_EQ( | 260 EXPECT_TRANSFORMATION_MATRIX_EQ( |
258 gfx::Transform(), frame.render_passes[2]->quad_list[1]->quadTransform()); | 261 gfx::Transform(), frame.render_passes[2]->quad_list[1]->quadTransform()); |
259 ASSERT_EQ(1u, frame.render_passes[1]->quad_list.size()); | 262 ASSERT_EQ(1u, frame.render_passes[1]->quad_list.size()); |
(...skipping 10 matching lines...) Expand all Loading... |
270 | 273 |
271 // The delegated layer has a surface between it and the root. | 274 // The delegated layer has a surface between it and the root. |
272 EXPECT_TRUE(delegated_renderer_layer_->render_target()->parent()); | 275 EXPECT_TRUE(delegated_renderer_layer_->render_target()->parent()); |
273 | 276 |
274 // Each non-DelegatedRendererLayer added one RenderPass. The | 277 // Each non-DelegatedRendererLayer added one RenderPass. The |
275 // DelegatedRendererLayer added two contributing passes. | 278 // DelegatedRendererLayer added two contributing passes. |
276 ASSERT_EQ(5u, frame.render_passes.size()); | 279 ASSERT_EQ(5u, frame.render_passes.size()); |
277 | 280 |
278 // The DelegatedRendererLayer is at position 9,9 compared to the root, so all | 281 // The DelegatedRendererLayer is at position 9,9 compared to the root, so all |
279 // render pass' transforms to the root should be shifted by this amount. | 282 // render pass' transforms to the root should be shifted by this amount. |
| 283 // The DelegatedRendererLayer has a size of 10x10, but the root delegated |
| 284 // RenderPass has a size of 8x8, so any render passes should be scaled by |
| 285 // 10/8. |
280 gfx::Transform transform; | 286 gfx::Transform transform; |
281 transform.Translate(9.0, 9.0); | 287 transform.Translate(9.0, 9.0); |
| 288 transform.Scale(10.0 / 8.0, 10.0 / 8.0); |
282 | 289 |
283 // The first contributing surface has a translation of 5, 6. | 290 // The first contributing surface has a translation of 5, 6. |
284 gfx::Transform five_six(1, 0, 0, 1, 5, 6); | 291 gfx::Transform five_six(1, 0, 0, 1, 5, 6); |
285 | 292 |
286 // The second contributing surface has a translation of 7, 8. | 293 // The second contributing surface has a translation of 7, 8. |
287 gfx::Transform seven_eight(1, 0, 0, 1, 7, 8); | 294 gfx::Transform seven_eight(1, 0, 0, 1, 7, 8); |
288 | 295 |
289 EXPECT_TRANSFORMATION_MATRIX_EQ( | 296 EXPECT_TRANSFORMATION_MATRIX_EQ( |
290 transform * five_six, frame.render_passes[1]->transform_to_root_target); | 297 transform * five_six, frame.render_passes[1]->transform_to_root_target); |
291 EXPECT_TRANSFORMATION_MATRIX_EQ( | 298 EXPECT_TRANSFORMATION_MATRIX_EQ( |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
454 QuadsFromRootRenderPassAreNotModifiedForTheTarget) { | 461 QuadsFromRootRenderPassAreNotModifiedForTheTarget) { |
455 LayerTreeHostImpl::FrameData frame; | 462 LayerTreeHostImpl::FrameData frame; |
456 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); | 463 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
457 | 464 |
458 // Each non-DelegatedRendererLayer added one RenderPass. The | 465 // Each non-DelegatedRendererLayer added one RenderPass. The |
459 // DelegatedRendererLayer added two contributing passes and its owned surface | 466 // DelegatedRendererLayer added two contributing passes and its owned surface |
460 // added one pass. | 467 // added one pass. |
461 ASSERT_EQ(6u, frame.render_passes.size()); | 468 ASSERT_EQ(6u, frame.render_passes.size()); |
462 | 469 |
463 // Because the DelegatedRendererLayer owns a RenderSurfaceImpl, its root | 470 // Because the DelegatedRendererLayer owns a RenderSurfaceImpl, its root |
464 // RenderPass' quads do not need to be translated at all. | 471 // RenderPass' quads do not need to be translated at all. However, they are |
| 472 // scaled from the frame's size (8x8) to the layer's bounds (10x10). |
| 473 gfx::Transform transform; |
| 474 transform.Scale(10.0 / 8.0, 10.0 / 8.0); |
465 EXPECT_TRANSFORMATION_MATRIX_EQ( | 475 EXPECT_TRANSFORMATION_MATRIX_EQ( |
466 gfx::Transform(), frame.render_passes[3]->quad_list[0]->quadTransform()); | 476 transform, frame.render_passes[3]->quad_list[0]->quadTransform()); |
467 | 477 |
468 // Quads from non-root RenderPasses should not be shifted either. | 478 // Quads from non-root RenderPasses should not be shifted either. |
469 ASSERT_EQ(2u, frame.render_passes[2]->quad_list.size()); | 479 ASSERT_EQ(2u, frame.render_passes[2]->quad_list.size()); |
470 EXPECT_TRANSFORMATION_MATRIX_EQ( | 480 EXPECT_TRANSFORMATION_MATRIX_EQ( |
471 gfx::Transform(), frame.render_passes[2]->quad_list[0]->quadTransform()); | 481 gfx::Transform(), frame.render_passes[2]->quad_list[0]->quadTransform()); |
472 EXPECT_TRANSFORMATION_MATRIX_EQ( | 482 EXPECT_TRANSFORMATION_MATRIX_EQ( |
473 gfx::Transform(), frame.render_passes[2]->quad_list[1]->quadTransform()); | 483 gfx::Transform(), frame.render_passes[2]->quad_list[1]->quadTransform()); |
474 ASSERT_EQ(1u, frame.render_passes[1]->quad_list.size()); | 484 ASSERT_EQ(1u, frame.render_passes[1]->quad_list.size()); |
475 EXPECT_TRANSFORMATION_MATRIX_EQ( | 485 EXPECT_TRANSFORMATION_MATRIX_EQ( |
476 gfx::Transform(), frame.render_passes[1]->quad_list[0]->quadTransform()); | 486 gfx::Transform(), frame.render_passes[1]->quad_list[0]->quadTransform()); |
477 | 487 |
478 host_impl_->DrawLayers(&frame, gfx::FrameTime::Now()); | 488 host_impl_->DrawLayers(&frame, gfx::FrameTime::Now()); |
479 host_impl_->DidDrawAllLayers(frame); | 489 host_impl_->DidDrawAllLayers(frame); |
480 } | 490 } |
481 | 491 |
482 class DelegatedRendererLayerImplTestTransform | 492 class DelegatedRendererLayerImplTestTransform |
483 : public DelegatedRendererLayerImplTest { | 493 : public DelegatedRendererLayerImplTest { |
484 public: | 494 public: |
485 DelegatedRendererLayerImplTestTransform() | |
486 : root_delegated_render_pass_is_clipped_(false), | |
487 delegated_device_scale_factor_(2.f) {} | |
488 | |
489 void SetUpTest() { | 495 void SetUpTest() { |
490 host_impl_->SetDeviceScaleFactor(2.f); | 496 host_impl_->SetDeviceScaleFactor(2.f); |
491 | 497 |
492 scoped_ptr<LayerImpl> root_layer = LayerImpl::Create( | 498 scoped_ptr<LayerImpl> root_layer = LayerImpl::Create( |
493 host_impl_->active_tree(), 1); | 499 host_impl_->active_tree(), 1); |
494 scoped_ptr<FakeDelegatedRendererLayerImpl> delegated_renderer_layer = | 500 scoped_ptr<FakeDelegatedRendererLayerImpl> delegated_renderer_layer = |
495 FakeDelegatedRendererLayerImpl::Create(host_impl_->active_tree(), 2); | 501 FakeDelegatedRendererLayerImpl::Create(host_impl_->active_tree(), 2); |
496 | 502 |
497 host_impl_->SetViewportSize(gfx::Size(200, 200)); | 503 host_impl_->SetViewportSize(gfx::Size(200, 200)); |
498 root_layer->SetBounds(gfx::Size(100, 100)); | 504 root_layer->SetBounds(gfx::Size(100, 100)); |
499 | 505 |
500 delegated_renderer_layer->SetPosition(gfx::Point(20, 20)); | 506 delegated_renderer_layer->SetPosition(gfx::Point(20, 20)); |
501 delegated_renderer_layer->SetBounds(gfx::Size(75, 75)); | 507 delegated_renderer_layer->SetBounds(gfx::Size(75, 75)); |
502 delegated_renderer_layer->SetContentBounds(gfx::Size(75, 75)); | 508 delegated_renderer_layer->SetContentBounds(gfx::Size(75, 75)); |
503 delegated_renderer_layer->SetDrawsContent(true); | 509 delegated_renderer_layer->SetDrawsContent(true); |
504 gfx::Transform transform; | 510 gfx::Transform transform; |
505 transform.Scale(2.0, 2.0); | 511 transform.Scale(2.0, 2.0); |
506 transform.Translate(8.0, 8.0); | 512 transform.Translate(8.0, 8.0); |
507 delegated_renderer_layer->SetTransform(transform); | 513 delegated_renderer_layer->SetTransform(transform); |
| 514 delegated_renderer_layer->SetTransformOrigin( |
| 515 gfx::Point3F(75 * 0.5f, 75 * 0.5f, 0.0f)); |
508 | 516 |
509 ScopedPtrVector<RenderPass> delegated_render_passes; | 517 ScopedPtrVector<RenderPass> delegated_render_passes; |
510 | 518 |
511 gfx::Size child_pass_content_bounds(7, 7); | 519 gfx::Size child_pass_content_bounds(7, 7); |
512 gfx::Rect child_pass_rect(20, 20, 7, 7); | 520 gfx::Rect child_pass_rect(20, 20, 7, 7); |
513 gfx::Transform child_pass_transform; | 521 gfx::Transform child_pass_transform; |
514 child_pass_transform.Scale(0.8f, 0.8f); | 522 child_pass_transform.Scale(0.8f, 0.8f); |
515 child_pass_transform.Translate(9.0, 9.0); | 523 child_pass_transform.Translate(9.0, 9.0); |
516 gfx::Rect child_pass_clip_rect(21, 21, 3, 3); | 524 gfx::Rect child_pass_clip_rect(21, 21, 3, 3); |
517 bool child_pass_clipped = false; | 525 bool child_pass_clipped = false; |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
614 | 622 |
615 color_quad = SolidColorDrawQuad::Create(); | 623 color_quad = SolidColorDrawQuad::Create(); |
616 color_quad->SetNew(shared_quad_state, | 624 color_quad->SetNew(shared_quad_state, |
617 gfx::Rect(10, 10, 10, 10), | 625 gfx::Rect(10, 10, 10, 10), |
618 gfx::Rect(10, 10, 10, 10), | 626 gfx::Rect(10, 10, 10, 10), |
619 4u, | 627 4u, |
620 false); | 628 false); |
621 pass->AppendDrawQuad(color_quad.PassAs<DrawQuad>()); | 629 pass->AppendDrawQuad(color_quad.PassAs<DrawQuad>()); |
622 | 630 |
623 delegated_renderer_layer->SetFrameDataForRenderPasses( | 631 delegated_renderer_layer->SetFrameDataForRenderPasses( |
624 delegated_device_scale_factor_, &delegated_render_passes); | 632 &delegated_render_passes); |
625 | 633 |
626 // The RenderPasses should be taken by the layer. | 634 // The RenderPasses should be taken by the layer. |
627 EXPECT_EQ(0u, delegated_render_passes.size()); | 635 EXPECT_EQ(0u, delegated_render_passes.size()); |
628 | 636 |
629 root_layer_ = root_layer.get(); | 637 root_layer_ = root_layer.get(); |
630 delegated_renderer_layer_ = delegated_renderer_layer.get(); | 638 delegated_renderer_layer_ = delegated_renderer_layer.get(); |
631 | 639 |
632 root_layer->AddChild(delegated_renderer_layer.PassAs<LayerImpl>()); | 640 root_layer->AddChild(delegated_renderer_layer.PassAs<LayerImpl>()); |
633 host_impl_->active_tree()->SetRootLayer(root_layer.Pass()); | 641 host_impl_->active_tree()->SetRootLayer(root_layer.Pass()); |
634 } | 642 } |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
672 root_delegated_quad_list[4]->shared_quad_state); | 680 root_delegated_quad_list[4]->shared_quad_state); |
673 | 681 |
674 EXPECT_NE(*contrib_delegated_shared_quad_state, | 682 EXPECT_NE(*contrib_delegated_shared_quad_state, |
675 *root_delegated_shared_quad_state); | 683 *root_delegated_shared_quad_state); |
676 } | 684 } |
677 | 685 |
678 protected: | 686 protected: |
679 LayerImpl* root_layer_; | 687 LayerImpl* root_layer_; |
680 DelegatedRendererLayerImpl* delegated_renderer_layer_; | 688 DelegatedRendererLayerImpl* delegated_renderer_layer_; |
681 bool root_delegated_render_pass_is_clipped_; | 689 bool root_delegated_render_pass_is_clipped_; |
682 float delegated_device_scale_factor_; | |
683 }; | 690 }; |
684 | 691 |
685 TEST_F(DelegatedRendererLayerImplTestTransform, QuadsUnclipped_NoSurface) { | 692 TEST_F(DelegatedRendererLayerImplTestTransform, QuadsUnclipped_NoSurface) { |
686 root_delegated_render_pass_is_clipped_ = false; | 693 root_delegated_render_pass_is_clipped_ = false; |
687 SetUpTest(); | 694 SetUpTest(); |
688 | 695 |
689 LayerTreeHostImpl::FrameData frame; | 696 LayerTreeHostImpl::FrameData frame; |
690 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); | 697 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
691 | 698 |
692 const SharedQuadState* root_delegated_shared_quad_state = NULL; | 699 const SharedQuadState* root_delegated_shared_quad_state = NULL; |
693 const SharedQuadState* contrib_delegated_shared_quad_state = NULL; | 700 const SharedQuadState* contrib_delegated_shared_quad_state = NULL; |
694 VerifyRenderPasses( | 701 VerifyRenderPasses( |
695 frame, | 702 frame, |
696 2, | 703 2, |
697 &root_delegated_shared_quad_state, | 704 &root_delegated_shared_quad_state, |
698 &contrib_delegated_shared_quad_state); | 705 &contrib_delegated_shared_quad_state); |
699 | 706 |
700 // When the quads don't have a clip of their own, the clip rect is set to | 707 // When the quads don't have a clip of their own, the clip rect is set to |
701 // the drawable_content_rect of the delegated renderer layer. | 708 // the drawable_content_rect of the delegated renderer layer. |
702 EXPECT_EQ(delegated_renderer_layer_->drawable_content_rect().ToString(), | 709 EXPECT_EQ(delegated_renderer_layer_->drawable_content_rect().ToString(), |
703 root_delegated_shared_quad_state->clip_rect.ToString()); | 710 root_delegated_shared_quad_state->clip_rect.ToString()); |
704 | 711 |
705 // Even though the quads in the root pass have no clip of their own, they | 712 // Even though the quads in the root pass have no clip of their own, they |
706 // inherit the clip rect from the delegated renderer layer if it does not | 713 // inherit the clip rect from the delegated renderer layer if it does not |
707 // own a surface. | 714 // own a surface. |
708 EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped); | 715 EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped); |
709 | 716 |
710 gfx::Transform expected; | 717 gfx::Transform expected; |
711 // Device scale factor. | 718 // Device scale factor is 2. |
712 expected.Scale(2.0, 2.0); | 719 expected.Scale(2.0, 2.0); |
713 // This is the transform from the layer's space to its target. | 720 // This is the transform from the layer's space to its target. |
714 expected.Translate(20, 20); | 721 // The position (20) - the width / scale (75 / 2) = 20 - 37.5 = -17.5 |
| 722 expected.Translate(-17.5, -17.5); |
715 expected.Scale(2.0, 2.0); | 723 expected.Scale(2.0, 2.0); |
716 expected.Translate(8.0, 8.0); | 724 expected.Translate(8.0, 8.0); |
| 725 // The frame has size 100x100 but the layer's bounds are 75x75. |
| 726 expected.Scale(75.0 / 100.0, 75.0 / 100.0); |
717 // This is the transform within the source frame. | 727 // This is the transform within the source frame. |
718 // Inverse device scale factor to go from physical space to layer space. | |
719 expected.Scale(0.5, 0.5); | |
720 expected.Scale(1.5, 1.5); | 728 expected.Scale(1.5, 1.5); |
721 expected.Translate(7.0, 7.0); | 729 expected.Translate(7.0, 7.0); |
722 EXPECT_TRANSFORMATION_MATRIX_EQ( | 730 EXPECT_TRANSFORMATION_MATRIX_EQ( |
723 expected, root_delegated_shared_quad_state->content_to_target_transform); | 731 expected, root_delegated_shared_quad_state->content_to_target_transform); |
724 | 732 |
725 // The contributing render pass should not be transformed from its input. | 733 // The contributing render pass should not be transformed from its input. |
726 EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(), | 734 EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(), |
727 contrib_delegated_shared_quad_state->clip_rect.ToString()); | 735 contrib_delegated_shared_quad_state->clip_rect.ToString()); |
728 EXPECT_FALSE(contrib_delegated_shared_quad_state->is_clipped); | 736 EXPECT_FALSE(contrib_delegated_shared_quad_state->is_clipped); |
729 expected.MakeIdentity(); | 737 expected.MakeIdentity(); |
(...skipping 18 matching lines...) Expand all Loading... |
748 const SharedQuadState* contrib_delegated_shared_quad_state = NULL; | 756 const SharedQuadState* contrib_delegated_shared_quad_state = NULL; |
749 VerifyRenderPasses( | 757 VerifyRenderPasses( |
750 frame, | 758 frame, |
751 2, | 759 2, |
752 &root_delegated_shared_quad_state, | 760 &root_delegated_shared_quad_state, |
753 &contrib_delegated_shared_quad_state); | 761 &contrib_delegated_shared_quad_state); |
754 | 762 |
755 // Since the quads have a clip_rect it should be modified by delegated | 763 // Since the quads have a clip_rect it should be modified by delegated |
756 // renderer layer's draw_transform. | 764 // renderer layer's draw_transform. |
757 // The position of the resulting clip_rect is: | 765 // The position of the resulting clip_rect is: |
758 // (clip rect position (10) * inverse dsf (1/2) + translate (8)) * | 766 // (clip rect position (10) * scale to layer (75/100) + translate (8)) * |
759 // layer scale (2) + layer position (20) = 46 | 767 // layer scale (2) + layer position (20) = 51 |
760 // The device scale is 2, so everything gets doubled, giving 92. | 768 // But the layer is centered, so: 51 - (75 / 2) = 51 - 75 / 2 = 13.5 |
| 769 // The device scale is 2, so everything gets doubled, giving 27. |
761 // | 770 // |
762 // The size is 35x35 scaled by the device scale. | 771 // The size is 35x35 scaled to fit inside the layer's bounds at 75x75 from |
763 EXPECT_EQ(gfx::Rect(92, 92, 70, 70).ToString(), | 772 // a frame at 100x100: 35 * 2 (device scale) * 75 / 100 = 52.5. The device |
| 773 // scale doubles this to 105. |
| 774 EXPECT_EQ(gfx::Rect(27, 27, 105, 105).ToString(), |
764 root_delegated_shared_quad_state->clip_rect.ToString()); | 775 root_delegated_shared_quad_state->clip_rect.ToString()); |
765 | 776 |
766 // The quads had a clip and it should be preserved. | 777 // The quads had a clip and it should be preserved. |
767 EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped); | 778 EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped); |
768 | 779 |
769 gfx::Transform expected; | 780 gfx::Transform expected; |
770 // Device scale factor. | 781 // Device scale factor is 2. |
771 expected.Scale(2.0, 2.0); | 782 expected.Scale(2.0, 2.0); |
772 // This is the transform from the layer's space to its target. | 783 // This is the transform from the layer's space to its target. |
773 expected.Translate(20, 20); | 784 // The position (20) - the width / scale (75 / 2) = 20 - 37.5 = -17.5 |
| 785 expected.Translate(-17.5, -17.5); |
774 expected.Scale(2.0, 2.0); | 786 expected.Scale(2.0, 2.0); |
775 expected.Translate(8.0, 8.0); | 787 expected.Translate(8.0, 8.0); |
| 788 // The frame has size 100x100 but the layer's bounds are 75x75. |
| 789 expected.Scale(75.0 / 100.0, 75.0 / 100.0); |
776 // This is the transform within the source frame. | 790 // This is the transform within the source frame. |
777 // Inverse device scale factor to go from physical space to layer space. | |
778 expected.Scale(0.5, 0.5); | |
779 expected.Scale(1.5, 1.5); | 791 expected.Scale(1.5, 1.5); |
780 expected.Translate(7.0, 7.0); | 792 expected.Translate(7.0, 7.0); |
781 EXPECT_TRANSFORMATION_MATRIX_EQ( | 793 EXPECT_TRANSFORMATION_MATRIX_EQ( |
782 expected, root_delegated_shared_quad_state->content_to_target_transform); | 794 expected, root_delegated_shared_quad_state->content_to_target_transform); |
783 | 795 |
784 // The contributing render pass should not be transformed from its input. | 796 // The contributing render pass should not be transformed from its input. |
785 EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(), | 797 EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(), |
786 contrib_delegated_shared_quad_state->clip_rect.ToString()); | 798 contrib_delegated_shared_quad_state->clip_rect.ToString()); |
787 EXPECT_FALSE(contrib_delegated_shared_quad_state->is_clipped); | 799 EXPECT_FALSE(contrib_delegated_shared_quad_state->is_clipped); |
788 expected.MakeIdentity(); | 800 expected.MakeIdentity(); |
(...skipping 19 matching lines...) Expand all Loading... |
808 const SharedQuadState* root_delegated_shared_quad_state = NULL; | 820 const SharedQuadState* root_delegated_shared_quad_state = NULL; |
809 const SharedQuadState* contrib_delegated_shared_quad_state = NULL; | 821 const SharedQuadState* contrib_delegated_shared_quad_state = NULL; |
810 VerifyRenderPasses( | 822 VerifyRenderPasses( |
811 frame, | 823 frame, |
812 3, | 824 3, |
813 &root_delegated_shared_quad_state, | 825 &root_delegated_shared_quad_state, |
814 &contrib_delegated_shared_quad_state); | 826 &contrib_delegated_shared_quad_state); |
815 | 827 |
816 // When the layer owns a surface, then its position and translation are not | 828 // When the layer owns a surface, then its position and translation are not |
817 // a part of its draw transform. | 829 // a part of its draw transform. |
818 EXPECT_EQ(gfx::Rect(10, 10, 35, 35).ToString(), | 830 // The position of the resulting clip_rect is: |
| 831 // (clip rect position (10) * scale to layer (75/100)) * device scale (2) = 15 |
| 832 // The size is 35x35 scaled to fit inside the layer's bounds at 75x75 from |
| 833 // a frame at 100x100: 35 * 2 (device scale) * 75 / 100 = 52.5. |
| 834 EXPECT_EQ(gfx::Rect(15, 15, 53, 53).ToString(), |
819 root_delegated_shared_quad_state->clip_rect.ToString()); | 835 root_delegated_shared_quad_state->clip_rect.ToString()); |
820 | 836 |
821 // Since the layer owns a surface it doesn't need to clip its quads, so | 837 // Since the layer owns a surface it doesn't need to clip its quads, so |
822 // unclipped quads remain unclipped. | 838 // unclipped quads remain unclipped. |
823 EXPECT_FALSE(root_delegated_shared_quad_state->is_clipped); | 839 EXPECT_FALSE(root_delegated_shared_quad_state->is_clipped); |
824 | 840 |
825 gfx::Transform expected; | 841 gfx::Transform expected; |
| 842 // Device scale factor is 2. |
| 843 expected.Scale(2.0, 2.0); |
| 844 // The frame has size 100x100 but the layer's bounds are 75x75. |
| 845 expected.Scale(75.0 / 100.0, 75.0 / 100.0); |
826 // This is the transform within the source frame. | 846 // This is the transform within the source frame. |
827 expected.Scale(1.5, 1.5); | 847 expected.Scale(1.5, 1.5); |
828 expected.Translate(7.0, 7.0); | 848 expected.Translate(7.0, 7.0); |
829 EXPECT_TRANSFORMATION_MATRIX_EQ( | 849 EXPECT_TRANSFORMATION_MATRIX_EQ( |
830 expected, root_delegated_shared_quad_state->content_to_target_transform); | 850 expected, root_delegated_shared_quad_state->content_to_target_transform); |
831 | 851 |
832 // The contributing render pass should not be transformed from its input. | 852 // The contributing render pass should not be transformed from its input. |
833 EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(), | 853 EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(), |
834 contrib_delegated_shared_quad_state->clip_rect.ToString()); | 854 contrib_delegated_shared_quad_state->clip_rect.ToString()); |
835 EXPECT_FALSE(contrib_delegated_shared_quad_state->is_clipped); | 855 EXPECT_FALSE(contrib_delegated_shared_quad_state->is_clipped); |
(...skipping 19 matching lines...) Expand all Loading... |
855 | 875 |
856 const SharedQuadState* root_delegated_shared_quad_state = NULL; | 876 const SharedQuadState* root_delegated_shared_quad_state = NULL; |
857 const SharedQuadState* contrib_delegated_shared_quad_state = NULL; | 877 const SharedQuadState* contrib_delegated_shared_quad_state = NULL; |
858 VerifyRenderPasses( | 878 VerifyRenderPasses( |
859 frame, | 879 frame, |
860 3, | 880 3, |
861 &root_delegated_shared_quad_state, | 881 &root_delegated_shared_quad_state, |
862 &contrib_delegated_shared_quad_state); | 882 &contrib_delegated_shared_quad_state); |
863 | 883 |
864 // When the layer owns a surface, then its position and translation are not | 884 // When the layer owns a surface, then its position and translation are not |
865 // a part of its draw transform. The clip_rect should be preserved. | 885 // a part of its draw transform. |
866 EXPECT_EQ(gfx::Rect(10, 10, 35, 35).ToString(), | 886 // The position of the resulting clip_rect is: |
| 887 // (clip rect position (10) * scale to layer (75/100)) * device scale (2) = 15 |
| 888 // The size is 35x35 scaled to fit inside the layer's bounds at 75x75 from |
| 889 // a frame at 100x100: 35 * 2 (device scale) * 75 / 100 = 52.5. |
| 890 EXPECT_EQ(gfx::Rect(15, 15, 53, 53).ToString(), |
867 root_delegated_shared_quad_state->clip_rect.ToString()); | 891 root_delegated_shared_quad_state->clip_rect.ToString()); |
868 | 892 |
869 // The quads had a clip and it should be preserved. | 893 // The quads had a clip and it should be preserved. |
870 EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped); | 894 EXPECT_TRUE(root_delegated_shared_quad_state->is_clipped); |
871 | 895 |
872 gfx::Transform expected; | 896 gfx::Transform expected; |
| 897 // Device scale factor is 2. |
| 898 expected.Scale(2.0, 2.0); |
| 899 // The frame has size 100x100 but the layer's bounds are 75x75. |
| 900 expected.Scale(75.0 / 100.0, 75.0 / 100.0); |
873 // This is the transform within the source frame. | 901 // This is the transform within the source frame. |
874 expected.Scale(1.5, 1.5); | 902 expected.Scale(1.5, 1.5); |
875 expected.Translate(7.0, 7.0); | 903 expected.Translate(7.0, 7.0); |
876 EXPECT_TRANSFORMATION_MATRIX_EQ( | 904 EXPECT_TRANSFORMATION_MATRIX_EQ( |
877 expected, root_delegated_shared_quad_state->content_to_target_transform); | 905 expected, root_delegated_shared_quad_state->content_to_target_transform); |
878 | 906 |
879 // The contributing render pass should not be transformed from its input. | 907 // The contributing render pass should not be transformed from its input. |
880 EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(), | 908 EXPECT_EQ(gfx::Rect(21, 21, 3, 3).ToString(), |
881 contrib_delegated_shared_quad_state->clip_rect.ToString()); | 909 contrib_delegated_shared_quad_state->clip_rect.ToString()); |
882 EXPECT_FALSE(contrib_delegated_shared_quad_state->is_clipped); | 910 EXPECT_FALSE(contrib_delegated_shared_quad_state->is_clipped); |
883 expected.MakeIdentity(); | 911 expected.MakeIdentity(); |
884 expected.Scale(0.8f, 0.8f); | 912 expected.Scale(0.8f, 0.8f); |
885 expected.Translate(9.0, 9.0); | 913 expected.Translate(9.0, 9.0); |
886 EXPECT_TRANSFORMATION_MATRIX_EQ( | 914 EXPECT_TRANSFORMATION_MATRIX_EQ( |
887 expected, | 915 expected, |
888 contrib_delegated_shared_quad_state->content_to_target_transform); | 916 contrib_delegated_shared_quad_state->content_to_target_transform); |
889 | 917 |
890 host_impl_->DrawLayers(&frame, gfx::FrameTime::Now()); | 918 host_impl_->DrawLayers(&frame, gfx::FrameTime::Now()); |
891 host_impl_->DidDrawAllLayers(frame); | 919 host_impl_->DidDrawAllLayers(frame); |
892 } | |
893 | |
894 TEST_F(DelegatedRendererLayerImplTestTransform, MismatchedDeviceScaleFactor) { | |
895 root_delegated_render_pass_is_clipped_ = true; | |
896 delegated_device_scale_factor_ = 1.3f; | |
897 | |
898 SetUpTest(); | |
899 | |
900 LayerTreeHostImpl::FrameData frame; | |
901 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); | |
902 | |
903 const SharedQuadState* root_delegated_shared_quad_state = NULL; | |
904 const SharedQuadState* contrib_delegated_shared_quad_state = NULL; | |
905 VerifyRenderPasses(frame, | |
906 2, | |
907 &root_delegated_shared_quad_state, | |
908 &contrib_delegated_shared_quad_state); | |
909 | |
910 // The parent tree's device scale factor is 2.0, but the child has submitted a | |
911 // frame with a device scale factor of 1.3. Absent any better option, the | |
912 // only thing we can do is scale from 1.3 -> 2.0. | |
913 | |
914 gfx::Transform expected; | |
915 // Device scale factor (from parent). | |
916 expected.Scale(2.0, 2.0); | |
917 // This is the transform from the layer's space to its target. | |
918 expected.Translate(20, 20); | |
919 expected.Scale(2.0, 2.0); | |
920 expected.Translate(8.0, 8.0); | |
921 // This is the transform within the source frame. | |
922 // Inverse device scale factor (from child). | |
923 expected.Scale(1.0f / 1.3f, 1.0f / 1.3f); | |
924 expected.Scale(1.5, 1.5); | |
925 expected.Translate(7.0, 7.0); | |
926 EXPECT_TRANSFORMATION_MATRIX_EQ( | |
927 expected, root_delegated_shared_quad_state->content_to_target_transform); | |
928 | |
929 host_impl_->DrawLayers(&frame, gfx::FrameTime::Now()); | |
930 host_impl_->DidDrawAllLayers(frame); | |
931 } | 920 } |
932 | 921 |
933 class DelegatedRendererLayerImplTestClip | 922 class DelegatedRendererLayerImplTestClip |
934 : public DelegatedRendererLayerImplTest { | 923 : public DelegatedRendererLayerImplTest { |
935 public: | 924 public: |
936 void SetUpTest() { | 925 void SetUpTest() { |
937 scoped_ptr<LayerImpl> root_layer = | 926 scoped_ptr<LayerImpl> root_layer = |
938 LayerImpl::Create(host_impl_->active_tree(), 1); | 927 LayerImpl::Create(host_impl_->active_tree(), 1); |
939 scoped_ptr<FakeDelegatedRendererLayerImpl> delegated_renderer_layer = | 928 scoped_ptr<FakeDelegatedRendererLayerImpl> delegated_renderer_layer = |
940 FakeDelegatedRendererLayerImpl::Create(host_impl_->active_tree(), 2); | 929 FakeDelegatedRendererLayerImpl::Create(host_impl_->active_tree(), 2); |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1055 | 1044 |
1056 color_quad = SolidColorDrawQuad::Create(); | 1045 color_quad = SolidColorDrawQuad::Create(); |
1057 color_quad->SetNew(shared_quad_state, | 1046 color_quad->SetNew(shared_quad_state, |
1058 gfx::Rect(10, 10, 10, 10), | 1047 gfx::Rect(10, 10, 10, 10), |
1059 gfx::Rect(10, 10, 10, 10), | 1048 gfx::Rect(10, 10, 10, 10), |
1060 4u, | 1049 4u, |
1061 false); | 1050 false); |
1062 pass->AppendDrawQuad(color_quad.PassAs<DrawQuad>()); | 1051 pass->AppendDrawQuad(color_quad.PassAs<DrawQuad>()); |
1063 | 1052 |
1064 delegated_renderer_layer->SetFrameDataForRenderPasses( | 1053 delegated_renderer_layer->SetFrameDataForRenderPasses( |
1065 1.f, &delegated_render_passes); | 1054 &delegated_render_passes); |
1066 | 1055 |
1067 // The RenderPasses should be taken by the layer. | 1056 // The RenderPasses should be taken by the layer. |
1068 EXPECT_EQ(0u, delegated_render_passes.size()); | 1057 EXPECT_EQ(0u, delegated_render_passes.size()); |
1069 | 1058 |
1070 root_layer_ = root_layer.get(); | 1059 root_layer_ = root_layer.get(); |
1071 delegated_renderer_layer_ = delegated_renderer_layer.get(); | 1060 delegated_renderer_layer_ = delegated_renderer_layer.get(); |
1072 | 1061 |
1073 if (clip_delegated_renderer_layer_) { | 1062 if (clip_delegated_renderer_layer_) { |
1074 gfx::Rect clip_rect(21, 27, 23, 21); | 1063 gfx::Rect clip_rect(21, 27, 23, 21); |
1075 | 1064 |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1359 scoped_ptr<TestRenderPass> missing_pass(TestRenderPass::Create()); | 1348 scoped_ptr<TestRenderPass> missing_pass(TestRenderPass::Create()); |
1360 missing_pass->SetNew(RenderPass::Id(9, 7), | 1349 missing_pass->SetNew(RenderPass::Id(9, 7), |
1361 gfx::Rect(7, 7, 7, 7), | 1350 gfx::Rect(7, 7, 7, 7), |
1362 gfx::Rect(7, 7, 7, 7), | 1351 gfx::Rect(7, 7, 7, 7), |
1363 gfx::Transform()); | 1352 gfx::Transform()); |
1364 | 1353 |
1365 // But a render pass quad refers to it. | 1354 // But a render pass quad refers to it. |
1366 AddRenderPassQuad(pass1, missing_pass.get()); | 1355 AddRenderPassQuad(pass1, missing_pass.get()); |
1367 | 1356 |
1368 delegated_renderer_layer->SetFrameDataForRenderPasses( | 1357 delegated_renderer_layer->SetFrameDataForRenderPasses( |
1369 1.f, &delegated_render_passes); | 1358 &delegated_render_passes); |
1370 | 1359 |
1371 // The RenderPasses should be taken by the layer. | 1360 // The RenderPasses should be taken by the layer. |
1372 EXPECT_EQ(0u, delegated_render_passes.size()); | 1361 EXPECT_EQ(0u, delegated_render_passes.size()); |
1373 | 1362 |
1374 root_layer->AddChild(delegated_renderer_layer.PassAs<LayerImpl>()); | 1363 root_layer->AddChild(delegated_renderer_layer.PassAs<LayerImpl>()); |
1375 host_impl_->active_tree()->SetRootLayer(root_layer.Pass()); | 1364 host_impl_->active_tree()->SetRootLayer(root_layer.Pass()); |
1376 | 1365 |
1377 LayerTreeHostImpl::FrameData frame; | 1366 LayerTreeHostImpl::FrameData frame; |
1378 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); | 1367 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
1379 | 1368 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1412 AddRenderPass(&delegated_render_passes, pass2_id, quad_rect, transform); | 1401 AddRenderPass(&delegated_render_passes, pass2_id, quad_rect, transform); |
1413 AddQuad(pass2, gfx::Rect(quad_rect.size()), SK_ColorRED); | 1402 AddQuad(pass2, gfx::Rect(quad_rect.size()), SK_ColorRED); |
1414 // |pass1| covers the whole layer. | 1403 // |pass1| covers the whole layer. |
1415 RenderPass::Id pass1_id = RenderPass::Id(impl.root_layer()->id(), 0); | 1404 RenderPass::Id pass1_id = RenderPass::Id(impl.root_layer()->id(), 0); |
1416 TestRenderPass* pass1 = AddRenderPass(&delegated_render_passes, | 1405 TestRenderPass* pass1 = AddRenderPass(&delegated_render_passes, |
1417 pass1_id, | 1406 pass1_id, |
1418 gfx::Rect(layer_size), | 1407 gfx::Rect(layer_size), |
1419 gfx::Transform()); | 1408 gfx::Transform()); |
1420 AddRenderPassQuad(pass1, pass2, 0, FilterOperations(), transform); | 1409 AddRenderPassQuad(pass1, pass2, 0, FilterOperations(), transform); |
1421 delegated_renderer_layer_impl->SetFrameDataForRenderPasses( | 1410 delegated_renderer_layer_impl->SetFrameDataForRenderPasses( |
1422 1.f, &delegated_render_passes); | 1411 &delegated_render_passes); |
1423 | 1412 |
1424 impl.CalcDrawProps(viewport_size); | 1413 impl.CalcDrawProps(viewport_size); |
1425 | 1414 |
1426 // The |quad_rect| translated by the |transform|. | 1415 // The |quad_rect| translated by the |transform|. |
1427 gfx::Rect quad_screen_rect = quad_rect + gfx::Vector2d(11, 0); | 1416 gfx::Rect quad_screen_rect = quad_rect + gfx::Vector2d(11, 0); |
1428 | 1417 |
1429 { | 1418 { |
1430 SCOPED_TRACE("No occlusion"); | 1419 SCOPED_TRACE("No occlusion"); |
1431 gfx::Rect occluded; | 1420 gfx::Rect occluded; |
1432 | 1421 |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1515 // The occlusion extends to 500 in the x-axis, pushing the left of the | 1504 // The occlusion extends to 500 in the x-axis, pushing the left of the |
1516 // visible part of the quad to 500 - 211 = 300 - 11 inside the quad. | 1505 // visible part of the quad to 500 - 211 = 300 - 11 inside the quad. |
1517 EXPECT_EQ(gfx::Rect(300 - 11, 0, 100 + 11, 500).ToString(), | 1506 EXPECT_EQ(gfx::Rect(300 - 11, 0, 100 + 11, 500).ToString(), |
1518 impl.quad_list()[0]->visible_rect.ToString()); | 1507 impl.quad_list()[0]->visible_rect.ToString()); |
1519 } | 1508 } |
1520 } | 1509 } |
1521 } | 1510 } |
1522 | 1511 |
1523 } // namespace | 1512 } // namespace |
1524 } // namespace cc | 1513 } // namespace cc |
OLD | NEW |