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