OLD | NEW |
---|---|
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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/trees/layer_tree_host_impl.h" | 5 #include "cc/trees/layer_tree_host_impl.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 4487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4498 const char* name; | 4498 const char* name; |
4499 const char* init_script; | 4499 const char* init_script; |
4500 const char* expected_result; | 4500 const char* expected_result; |
4501 }; | 4501 }; |
4502 | 4502 |
4503 TestCase remove_render_passes_cases[] = { | 4503 TestCase remove_render_passes_cases[] = { |
4504 { | 4504 { |
4505 "Single root pass", | 4505 "Single root pass", |
4506 "R0ssss\n", | 4506 "R0ssss\n", |
4507 "R0ssss\n" | 4507 "R0ssss\n" |
4508 }, | 4508 }, { |
4509 { | |
4510 "Single pass - no quads", | 4509 "Single pass - no quads", |
4511 "R0\n", | 4510 "R0\n", |
4512 "R0\n" | 4511 "R0\n" |
4513 }, | 4512 }, { |
4514 { | |
4515 "Two passes, no removal", | 4513 "Two passes, no removal", |
4516 "R0ssssA0sss\n" | 4514 "R0ssssA0sss\n" |
4517 "A0ssss\n", | 4515 "A0ssss\n", |
4518 "R0ssssA0sss\n" | 4516 "R0ssssA0sss\n" |
4519 "A0ssss\n" | 4517 "A0ssss\n" |
4520 }, | 4518 }, { |
4521 { | |
4522 "Two passes, remove last", | 4519 "Two passes, remove last", |
4523 "R0ssssA0[ct]sss\n" | 4520 "R0ssssA0[ct]sss\n" |
4524 "A0ssss\n", | 4521 "A0ssss\n", |
4525 "R0ssssA0sss\n" | 4522 "R0ssssA0sss\n" |
4526 }, | 4523 }, { |
4527 { | |
4528 "Have texture but contents changed - leave pass", | 4524 "Have texture but contents changed - leave pass", |
4529 "R0ssssA0[t]sss\n" | 4525 "R0ssssA0[t]sss\n" |
4530 "A0ssss\n", | 4526 "A0ssss\n", |
4531 "R0ssssA0sss\n" | 4527 "R0ssssA0sss\n" |
4532 "A0ssss\n" | 4528 "A0ssss\n" |
4533 }, | 4529 }, { |
4534 { | |
4535 "Contents didn't change but no texture - leave pass", | 4530 "Contents didn't change but no texture - leave pass", |
4536 "R0ssssA0[c]sss\n" | 4531 "R0ssssA0[c]sss\n" |
4537 "A0ssss\n", | 4532 "A0ssss\n", |
4538 "R0ssssA0sss\n" | 4533 "R0ssssA0sss\n" |
4539 "A0ssss\n" | 4534 "A0ssss\n" |
4540 }, | 4535 }, { |
4541 { | |
4542 "Replica: two quads reference the same pass; remove", | 4536 "Replica: two quads reference the same pass; remove", |
4543 "R0ssssA0[ct]A0[ct]sss\n" | 4537 "R0ssssA0[ct]A0[ct]sss\n" |
4544 "A0ssss\n", | 4538 "A0ssss\n", |
4545 "R0ssssA0A0sss\n" | 4539 "R0ssssA0A0sss\n" |
4546 }, | 4540 }, { |
4547 { | |
4548 "Replica: two quads reference the same pass; leave", | 4541 "Replica: two quads reference the same pass; leave", |
4549 "R0ssssA0[c]A0[c]sss\n" | 4542 "R0ssssA0[c]A0[c]sss\n" |
4550 "A0ssss\n", | 4543 "A0ssss\n", |
4551 "R0ssssA0A0sss\n" | 4544 "R0ssssA0A0sss\n" |
4552 "A0ssss\n", | 4545 "A0ssss\n", |
4553 }, | 4546 }, { |
4554 { | |
4555 "Many passes, remove all", | 4547 "Many passes, remove all", |
4556 "R0ssssA0[ct]sss\n" | 4548 "R0ssssA0[ct]sss\n" |
4557 "A0sssB0[ct]C0[ct]s\n" | 4549 "A0sssB0[ct]C0[ct]s\n" |
4558 "B0sssD0[ct]ssE0[ct]F0[ct]\n" | 4550 "B0sssD0[ct]ssE0[ct]F0[ct]\n" |
4559 "E0ssssss\n" | 4551 "E0ssssss\n" |
4560 "C0G0[ct]\n" | 4552 "C0G0[ct]\n" |
4561 "D0sssssss\n" | 4553 "D0sssssss\n" |
4562 "F0sssssss\n" | 4554 "F0sssssss\n" |
4563 "G0sss\n", | 4555 "G0sss\n", |
4564 | 4556 |
4565 "R0ssssA0sss\n" | 4557 "R0ssssA0sss\n" |
4566 }, | 4558 }, { |
4567 { | |
4568 "Deep recursion, remove all", | 4559 "Deep recursion, remove all", |
4569 | 4560 |
4570 "R0sssssA0[ct]ssss\n" | 4561 "R0sssssA0[ct]ssss\n" |
4571 "A0ssssB0sss\n" | 4562 "A0ssssB0sss\n" |
4572 "B0C0\n" | 4563 "B0C0\n" |
4573 "C0D0\n" | 4564 "C0D0\n" |
4574 "D0E0\n" | 4565 "D0E0\n" |
4575 "E0F0\n" | 4566 "E0F0\n" |
4576 "F0G0\n" | 4567 "F0G0\n" |
4577 "G0H0\n" | 4568 "G0H0\n" |
4578 "H0sssI0sss\n" | 4569 "H0sssI0sss\n" |
4579 "I0J0\n" | 4570 "I0J0\n" |
4580 "J0ssss\n", | 4571 "J0ssss\n", |
4581 | 4572 |
4582 "R0sssssA0ssss\n" | 4573 "R0sssssA0ssss\n" |
4583 }, | 4574 }, { |
4584 { | |
4585 "Wide recursion, remove all", | 4575 "Wide recursion, remove all", |
4586 "R0A0[ct]B0[ct]C0[ct]D0[ct]E0[ct]F0[ct]G0[ct]H0[ct]I0[ct]J0[ct]\n" | 4576 "R0A0[ct]B0[ct]C0[ct]D0[ct]E0[ct]F0[ct]G0[ct]H0[ct]I0[ct]J0[ct]\n" |
4587 "A0s\n" | 4577 "A0s\n" |
4588 "B0s\n" | 4578 "B0s\n" |
4589 "C0ssss\n" | 4579 "C0ssss\n" |
4590 "D0ssss\n" | 4580 "D0ssss\n" |
4591 "E0s\n" | 4581 "E0s\n" |
4592 "F0\n" | 4582 "F0\n" |
4593 "G0s\n" | 4583 "G0s\n" |
4594 "H0s\n" | 4584 "H0s\n" |
4595 "I0s\n" | 4585 "I0s\n" |
4596 "J0ssss\n", | 4586 "J0ssss\n", |
4597 | 4587 |
4598 "R0A0B0C0D0E0F0G0H0I0J0\n" | 4588 "R0A0B0C0D0E0F0G0H0I0J0\n" |
4599 }, | 4589 }, { |
4600 { | |
4601 "Remove passes regardless of cache state", | 4590 "Remove passes regardless of cache state", |
4602 "R0ssssA0[ct]sss\n" | 4591 "R0ssssA0[ct]sss\n" |
4603 "A0sssB0C0s\n" | 4592 "A0sssB0C0s\n" |
4604 "B0sssD0[c]ssE0[t]F0\n" | 4593 "B0sssD0[c]ssE0[t]F0\n" |
4605 "E0ssssss\n" | 4594 "E0ssssss\n" |
4606 "C0G0\n" | 4595 "C0G0\n" |
4607 "D0sssssss\n" | 4596 "D0sssssss\n" |
4608 "F0sssssss\n" | 4597 "F0sssssss\n" |
4609 "G0sss\n", | 4598 "G0sss\n", |
4610 | 4599 |
4611 "R0ssssA0sss\n" | 4600 "R0ssssA0sss\n" |
4612 }, | 4601 }, { |
4613 { | |
4614 "Leave some passes, remove others", | 4602 "Leave some passes, remove others", |
4615 | 4603 |
4616 "R0ssssA0[c]sss\n" | 4604 "R0ssssA0[c]sss\n" |
4617 "A0sssB0[t]C0[ct]s\n" | 4605 "A0sssB0[t]C0[ct]s\n" |
4618 "B0sssD0[c]ss\n" | 4606 "B0sssD0[c]ss\n" |
4619 "C0G0\n" | 4607 "C0G0\n" |
4620 "D0sssssss\n" | 4608 "D0sssssss\n" |
4621 "G0sss\n", | 4609 "G0sss\n", |
4622 | 4610 |
4623 "R0ssssA0sss\n" | 4611 "R0ssssA0sss\n" |
4624 "A0sssB0C0s\n" | 4612 "A0sssB0C0s\n" |
4625 "B0sssD0ss\n" | 4613 "B0sssD0ss\n" |
4626 "D0sssssss\n" | 4614 "D0sssssss\n" |
4627 }, | 4615 }, { |
4628 { | |
4629 0, 0, 0 | 4616 0, 0, 0 |
4630 } | 4617 } |
4631 }; | 4618 }; |
4632 | 4619 |
4633 static void VerifyRenderPassTestData( | 4620 static void VerifyRenderPassTestData( |
4634 const TestCase& test_case, | 4621 const TestCase& test_case, |
4635 const RenderPassRemovalTestData& test_data) { | 4622 const RenderPassRemovalTestData& test_data) { |
4636 char actual_result[1024]; | 4623 char actual_result[1024]; |
4637 DumpRenderPassTestData(test_data, actual_result); | 4624 DumpRenderPassTestData(test_data, actual_result); |
4638 EXPECT_STREQ(test_case.expected_result, actual_result) << "In test case: " << | 4625 EXPECT_STREQ(test_case.expected_result, actual_result) << "In test case: " << |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4932 content_layer->SetAnchorPoint(gfx::PointF()); | 4919 content_layer->SetAnchorPoint(gfx::PointF()); |
4933 content_layer->SetDrawsContent(true); | 4920 content_layer->SetDrawsContent(true); |
4934 | 4921 |
4935 gfx::Size mask_size(100, 100); | 4922 gfx::Size mask_size(100, 100); |
4936 mask_layer->SetBounds(mask_size); | 4923 mask_layer->SetBounds(mask_size); |
4937 mask_layer->SetContentBounds(mask_size); | 4924 mask_layer->SetContentBounds(mask_size); |
4938 mask_layer->SetPosition(gfx::PointF()); | 4925 mask_layer->SetPosition(gfx::PointF()); |
4939 mask_layer->SetAnchorPoint(gfx::PointF()); | 4926 mask_layer->SetAnchorPoint(gfx::PointF()); |
4940 mask_layer->SetDrawsContent(true); | 4927 mask_layer->SetDrawsContent(true); |
4941 | 4928 |
4942 | |
4943 // Check that the mask fills the surface. | 4929 // Check that the mask fills the surface. |
4944 float device_scale_factor = 1.f; | 4930 float device_scale_factor = 1.f; |
4945 host_impl_->SetViewportSize(root_size); | 4931 host_impl_->SetViewportSize(root_size); |
4946 host_impl_->SetDeviceScaleFactor(device_scale_factor); | 4932 host_impl_->SetDeviceScaleFactor(device_scale_factor); |
4947 { | 4933 { |
4948 LayerTreeHostImpl::FrameData frame; | 4934 LayerTreeHostImpl::FrameData frame; |
4949 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); | 4935 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); |
4950 | 4936 |
4951 ASSERT_EQ(1u, frame.render_passes.size()); | 4937 ASSERT_EQ(1u, frame.render_passes.size()); |
4952 ASSERT_EQ(1u, frame.render_passes[0]->quad_list.size()); | 4938 ASSERT_EQ(1u, frame.render_passes[0]->quad_list.size()); |
4953 ASSERT_EQ(DrawQuad::RENDER_PASS, | 4939 ASSERT_EQ(DrawQuad::RENDER_PASS, |
4954 frame.render_passes[0]->quad_list[0]->material); | 4940 frame.render_passes[0]->quad_list[0]->material); |
4955 const RenderPassDrawQuad* render_pass_quad = | 4941 const RenderPassDrawQuad* render_pass_quad = |
4956 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[0]); | 4942 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[0]); |
4957 EXPECT_EQ(gfx::Rect(0, 0, 50, 50).ToString(), | 4943 EXPECT_EQ(gfx::Rect(0, 0, 50, 50).ToString(), |
4958 render_pass_quad->rect.ToString()); | 4944 render_pass_quad->rect.ToString()); |
4959 EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), | 4945 EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), |
4960 render_pass_quad->mask_uv_rect.ToString()); | 4946 render_pass_quad->mask_uv_rect.ToString()); |
4961 | 4947 |
4962 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); | 4948 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); |
4963 host_impl_->DidDrawAllLayers(frame); | 4949 host_impl_->DidDrawAllLayers(frame); |
4964 } | 4950 } |
4965 | 4951 |
4966 | |
4967 // Applying a DSF should change the render surface size, but won't affect | 4952 // Applying a DSF should change the render surface size, but won't affect |
4968 // which part of the mask is used. | 4953 // which part of the mask is used. |
4969 device_scale_factor = 2.f; | 4954 device_scale_factor = 2.f; |
4970 gfx::Size device_viewport = | 4955 gfx::Size device_viewport = |
4971 gfx::ToFlooredSize(gfx::ScaleSize(root_size, device_scale_factor)); | 4956 gfx::ToFlooredSize(gfx::ScaleSize(root_size, device_scale_factor)); |
4972 host_impl_->SetViewportSize(device_viewport); | 4957 host_impl_->SetViewportSize(device_viewport); |
4973 host_impl_->SetDeviceScaleFactor(device_scale_factor); | 4958 host_impl_->SetDeviceScaleFactor(device_scale_factor); |
4974 host_impl_->active_tree()->set_needs_update_draw_properties(); | 4959 host_impl_->active_tree()->set_needs_update_draw_properties(); |
4975 { | 4960 { |
4976 LayerTreeHostImpl::FrameData frame; | 4961 LayerTreeHostImpl::FrameData frame; |
4977 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); | 4962 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); |
4978 | 4963 |
4979 ASSERT_EQ(1u, frame.render_passes.size()); | 4964 ASSERT_EQ(1u, frame.render_passes.size()); |
4980 ASSERT_EQ(1u, frame.render_passes[0]->quad_list.size()); | 4965 ASSERT_EQ(1u, frame.render_passes[0]->quad_list.size()); |
4981 ASSERT_EQ(DrawQuad::RENDER_PASS, | 4966 ASSERT_EQ(DrawQuad::RENDER_PASS, |
4982 frame.render_passes[0]->quad_list[0]->material); | 4967 frame.render_passes[0]->quad_list[0]->material); |
4983 const RenderPassDrawQuad* render_pass_quad = | 4968 const RenderPassDrawQuad* render_pass_quad = |
4984 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[0]); | 4969 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[0]); |
4985 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), | 4970 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), |
4986 render_pass_quad->rect.ToString()); | 4971 render_pass_quad->rect.ToString()); |
4987 EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), | 4972 EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), |
4988 render_pass_quad->mask_uv_rect.ToString()); | 4973 render_pass_quad->mask_uv_rect.ToString()); |
4989 | 4974 |
4990 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); | 4975 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); |
4991 host_impl_->DidDrawAllLayers(frame); | 4976 host_impl_->DidDrawAllLayers(frame); |
4992 } | 4977 } |
4993 | 4978 |
4994 | |
4995 // Applying an equivalent content scale on the content layer and the mask | 4979 // Applying an equivalent content scale on the content layer and the mask |
4996 // should still result in the same part of the mask being used. | 4980 // should still result in the same part of the mask being used. |
4997 gfx::Size layer_size_large = | 4981 gfx::Size layer_size_large = |
4998 gfx::ToRoundedSize(gfx::ScaleSize(layer_size, device_scale_factor)); | 4982 gfx::ToRoundedSize(gfx::ScaleSize(layer_size, device_scale_factor)); |
4999 content_layer->SetContentBounds(layer_size_large); | 4983 content_layer->SetContentBounds(layer_size_large); |
5000 content_layer->SetContentsScale(device_scale_factor, device_scale_factor); | 4984 content_layer->SetContentsScale(device_scale_factor, device_scale_factor); |
5001 gfx::Size mask_size_large = | 4985 gfx::Size mask_size_large = |
5002 gfx::ToRoundedSize(gfx::ScaleSize(mask_size, device_scale_factor)); | 4986 gfx::ToRoundedSize(gfx::ScaleSize(mask_size, device_scale_factor)); |
5003 mask_layer->SetContentBounds(mask_size_large); | 4987 mask_layer->SetContentBounds(mask_size_large); |
5004 mask_layer->SetContentsScale(device_scale_factor, device_scale_factor); | 4988 mask_layer->SetContentsScale(device_scale_factor, device_scale_factor); |
(...skipping 10 matching lines...) Expand all Loading... | |
5015 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[0]); | 4999 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[0]); |
5016 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), | 5000 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), |
5017 render_pass_quad->rect.ToString()); | 5001 render_pass_quad->rect.ToString()); |
5018 EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), | 5002 EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), |
5019 render_pass_quad->mask_uv_rect.ToString()); | 5003 render_pass_quad->mask_uv_rect.ToString()); |
5020 | 5004 |
5021 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); | 5005 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); |
5022 host_impl_->DidDrawAllLayers(frame); | 5006 host_impl_->DidDrawAllLayers(frame); |
5023 } | 5007 } |
5024 | 5008 |
5025 // Applying a different contents scale to the mask layer will still result | 5009 // Applying a different contents scale to the mask layer means it will have |
5026 // in the mask covering the owning layer. | 5010 // to scale itself to cover the same area its bounds should cover. Since |
5011 // the contents scale is halved, the mask will have to be stretched double | |
5012 // to cover the right area. | |
5027 mask_layer->SetContentBounds(mask_size); | 5013 mask_layer->SetContentBounds(mask_size); |
5028 mask_layer->SetContentsScale(device_scale_factor, device_scale_factor); | 5014 mask_layer->SetContentsScale(1.f, 1.f); |
5029 host_impl_->active_tree()->set_needs_update_draw_properties(); | 5015 host_impl_->active_tree()->set_needs_update_draw_properties(); |
5030 { | 5016 { |
5031 LayerTreeHostImpl::FrameData frame; | 5017 LayerTreeHostImpl::FrameData frame; |
5032 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); | 5018 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); |
5033 | 5019 |
5034 ASSERT_EQ(1u, frame.render_passes.size()); | 5020 ASSERT_EQ(1u, frame.render_passes.size()); |
5035 ASSERT_EQ(1u, frame.render_passes[0]->quad_list.size()); | 5021 ASSERT_EQ(1u, frame.render_passes[0]->quad_list.size()); |
5036 ASSERT_EQ(DrawQuad::RENDER_PASS, | 5022 ASSERT_EQ(DrawQuad::RENDER_PASS, |
5037 frame.render_passes[0]->quad_list[0]->material); | 5023 frame.render_passes[0]->quad_list[0]->material); |
5038 const RenderPassDrawQuad* render_pass_quad = | 5024 const RenderPassDrawQuad* render_pass_quad = |
5039 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[0]); | 5025 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[0]); |
5040 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), | 5026 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), |
5041 render_pass_quad->rect.ToString()); | 5027 render_pass_quad->rect.ToString()); |
5028 EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.5f, 0.5f).ToString(), | |
5029 render_pass_quad->mask_uv_rect.ToString()); | |
5030 | |
5031 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); | |
5032 host_impl_->DidDrawAllLayers(frame); | |
5033 } | |
5034 } | |
5035 | |
5036 TEST_F(LayerTreeHostImplTest, ReflectionMaskLayerWithDifferentBounds) { | |
5037 // The replica's mask layer has bounds 100x100 but the replica is of a | |
5038 // layer with bounds 50x50. | |
5039 | |
5040 scoped_ptr<LayerImpl> scoped_root = | |
5041 LayerImpl::Create(host_impl_->active_tree(), 1); | |
5042 LayerImpl* root = scoped_root.get(); | |
5043 host_impl_->active_tree()->SetRootLayer(scoped_root.Pass()); | |
5044 | |
5045 scoped_ptr<LayerImpl> scoped_content_layer = | |
5046 LayerImpl::Create(host_impl_->active_tree(), 3); | |
5047 LayerImpl* content_layer = scoped_content_layer.get(); | |
5048 root->AddChild(scoped_content_layer.Pass()); | |
5049 | |
5050 scoped_ptr<LayerImpl> scoped_replica_layer = | |
5051 LayerImpl::Create(host_impl_->active_tree(), 2); | |
5052 LayerImpl* replica_layer = scoped_replica_layer.get(); | |
5053 content_layer->SetReplicaLayer(scoped_replica_layer.Pass()); | |
5054 | |
5055 scoped_ptr<FakeMaskLayerImpl> scoped_mask_layer = | |
5056 FakeMaskLayerImpl::Create(host_impl_->active_tree(), 4); | |
5057 FakeMaskLayerImpl* mask_layer = scoped_mask_layer.get(); | |
5058 replica_layer->SetMaskLayer(scoped_mask_layer.PassAs<LayerImpl>()); | |
5059 | |
5060 gfx::Size root_size(100, 100); | |
5061 root->SetBounds(root_size); | |
5062 root->SetContentBounds(root_size); | |
5063 root->SetPosition(gfx::PointF()); | |
5064 root->SetAnchorPoint(gfx::PointF()); | |
5065 | |
5066 gfx::Size layer_size(50, 50); | |
5067 content_layer->SetBounds(layer_size); | |
5068 content_layer->SetContentBounds(layer_size); | |
5069 content_layer->SetPosition(gfx::PointF()); | |
5070 content_layer->SetAnchorPoint(gfx::PointF()); | |
5071 content_layer->SetDrawsContent(true); | |
5072 | |
5073 gfx::Size mask_size(100, 100); | |
5074 mask_layer->SetBounds(mask_size); | |
5075 mask_layer->SetContentBounds(mask_size); | |
5076 mask_layer->SetPosition(gfx::PointF()); | |
5077 mask_layer->SetAnchorPoint(gfx::PointF()); | |
5078 mask_layer->SetDrawsContent(true); | |
5079 | |
5080 // Check that the mask fills the surface. | |
5081 float device_scale_factor = 1.f; | |
5082 host_impl_->SetViewportSize(root_size); | |
5083 host_impl_->SetDeviceScaleFactor(device_scale_factor); | |
5084 { | |
5085 LayerTreeHostImpl::FrameData frame; | |
5086 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); | |
5087 | |
5088 ASSERT_EQ(1u, frame.render_passes.size()); | |
5089 ASSERT_EQ(2u, frame.render_passes[0]->quad_list.size()); | |
5090 ASSERT_EQ(DrawQuad::RENDER_PASS, | |
5091 frame.render_passes[0]->quad_list[1]->material); | |
5092 const RenderPassDrawQuad* replica_quad = | |
5093 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[1]); | |
5094 EXPECT_TRUE(replica_quad->is_replica); | |
5095 EXPECT_EQ(gfx::Rect(0, 0, 50, 50).ToString(), | |
5096 replica_quad->rect.ToString()); | |
5042 EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), | 5097 EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), |
5098 replica_quad->mask_uv_rect.ToString()); | |
5099 | |
5100 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); | |
5101 host_impl_->DidDrawAllLayers(frame); | |
5102 } | |
5103 | |
5104 // Applying a DSF should change the render surface size, but won't affect | |
5105 // which part of the mask is used. | |
5106 device_scale_factor = 2.f; | |
5107 gfx::Size device_viewport = | |
5108 gfx::ToFlooredSize(gfx::ScaleSize(root_size, device_scale_factor)); | |
5109 host_impl_->SetViewportSize(device_viewport); | |
5110 host_impl_->SetDeviceScaleFactor(device_scale_factor); | |
5111 host_impl_->active_tree()->set_needs_update_draw_properties(); | |
5112 { | |
5113 LayerTreeHostImpl::FrameData frame; | |
5114 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); | |
5115 | |
5116 ASSERT_EQ(1u, frame.render_passes.size()); | |
5117 ASSERT_EQ(2u, frame.render_passes[0]->quad_list.size()); | |
5118 ASSERT_EQ(DrawQuad::RENDER_PASS, | |
5119 frame.render_passes[0]->quad_list[1]->material); | |
5120 const RenderPassDrawQuad* replica_quad = | |
5121 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[1]); | |
5122 EXPECT_TRUE(replica_quad->is_replica); | |
5123 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), | |
5124 replica_quad->rect.ToString()); | |
5125 EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), | |
5126 replica_quad->mask_uv_rect.ToString()); | |
5127 | |
5128 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); | |
5129 host_impl_->DidDrawAllLayers(frame); | |
5130 } | |
5131 | |
5132 // Applying an equivalent content scale on the content layer and the mask | |
5133 // should still result in the same part of the mask being used. | |
5134 gfx::Size layer_size_large = | |
5135 gfx::ToRoundedSize(gfx::ScaleSize(layer_size, device_scale_factor)); | |
5136 content_layer->SetContentBounds(layer_size_large); | |
5137 content_layer->SetContentsScale(device_scale_factor, device_scale_factor); | |
5138 gfx::Size mask_size_large = | |
5139 gfx::ToRoundedSize(gfx::ScaleSize(mask_size, device_scale_factor)); | |
5140 mask_layer->SetContentBounds(mask_size_large); | |
5141 mask_layer->SetContentsScale(device_scale_factor, device_scale_factor); | |
5142 host_impl_->active_tree()->set_needs_update_draw_properties(); | |
5143 { | |
5144 LayerTreeHostImpl::FrameData frame; | |
5145 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); | |
5146 | |
5147 ASSERT_EQ(1u, frame.render_passes.size()); | |
5148 ASSERT_EQ(2u, frame.render_passes[0]->quad_list.size()); | |
5149 ASSERT_EQ(DrawQuad::RENDER_PASS, | |
5150 frame.render_passes[0]->quad_list[1]->material); | |
5151 const RenderPassDrawQuad* replica_quad = | |
5152 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[1]); | |
5153 EXPECT_TRUE(replica_quad->is_replica); | |
5154 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), | |
5155 replica_quad->rect.ToString()); | |
5156 EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), | |
5157 replica_quad->mask_uv_rect.ToString()); | |
5158 | |
5159 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); | |
5160 host_impl_->DidDrawAllLayers(frame); | |
5161 } | |
5162 | |
5163 // Applying a different contents scale to the mask layer means it will have | |
5164 // to scale itself to cover the same area its bounds should cover. Since | |
5165 // the contents scale is halved, the mask will have to be stretched double | |
5166 // to cover the right area. | |
5167 mask_layer->SetContentBounds(mask_size); | |
5168 mask_layer->SetContentsScale(1.f, 1.f); | |
5169 host_impl_->active_tree()->set_needs_update_draw_properties(); | |
5170 { | |
5171 LayerTreeHostImpl::FrameData frame; | |
5172 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); | |
5173 | |
5174 ASSERT_EQ(1u, frame.render_passes.size()); | |
5175 ASSERT_EQ(2u, frame.render_passes[0]->quad_list.size()); | |
5176 ASSERT_EQ(DrawQuad::RENDER_PASS, | |
5177 frame.render_passes[0]->quad_list[1]->material); | |
5178 const RenderPassDrawQuad* replica_quad = | |
5179 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[1]); | |
5180 EXPECT_TRUE(replica_quad->is_replica); | |
5181 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), | |
5182 replica_quad->rect.ToString()); | |
5183 EXPECT_EQ(gfx::RectF(0.f, 0.f, 0.5f, 0.5f).ToString(), | |
enne (OOO)
2013/04/16 21:06:44
Can you explain this? These uv coords look like y
danakj
2013/04/16 21:21:01
The shader takes a tex coord in the surface textur
| |
5184 replica_quad->mask_uv_rect.ToString()); | |
5185 | |
5186 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); | |
5187 host_impl_->DidDrawAllLayers(frame); | |
5188 } | |
5189 } | |
5190 | |
5191 TEST_F(LayerTreeHostImplTest, ReflectionMaskLayerForSurfaceWithUnclippedChild) { | |
5192 // The replica is of a layer with bounds 50x50, but it has a child that causes | |
5193 // the surface bounds to be larger. | |
5194 | |
5195 scoped_ptr<LayerImpl> scoped_root = | |
5196 LayerImpl::Create(host_impl_->active_tree(), 1); | |
5197 LayerImpl* root = scoped_root.get(); | |
5198 host_impl_->active_tree()->SetRootLayer(scoped_root.Pass()); | |
5199 | |
5200 scoped_ptr<LayerImpl> scoped_content_layer = | |
5201 LayerImpl::Create(host_impl_->active_tree(), 2); | |
5202 LayerImpl* content_layer = scoped_content_layer.get(); | |
5203 root->AddChild(scoped_content_layer.Pass()); | |
5204 | |
5205 scoped_ptr<LayerImpl> scoped_content_child_layer = | |
5206 LayerImpl::Create(host_impl_->active_tree(), 3); | |
5207 LayerImpl* content_child_layer = scoped_content_child_layer.get(); | |
5208 content_layer->AddChild(scoped_content_child_layer.Pass()); | |
5209 | |
5210 scoped_ptr<LayerImpl> scoped_replica_layer = | |
5211 LayerImpl::Create(host_impl_->active_tree(), 4); | |
5212 LayerImpl* replica_layer = scoped_replica_layer.get(); | |
5213 content_layer->SetReplicaLayer(scoped_replica_layer.Pass()); | |
5214 | |
5215 scoped_ptr<FakeMaskLayerImpl> scoped_mask_layer = | |
5216 FakeMaskLayerImpl::Create(host_impl_->active_tree(), 5); | |
5217 FakeMaskLayerImpl* mask_layer = scoped_mask_layer.get(); | |
5218 replica_layer->SetMaskLayer(scoped_mask_layer.PassAs<LayerImpl>()); | |
5219 | |
5220 gfx::Size root_size(100, 100); | |
5221 root->SetBounds(root_size); | |
5222 root->SetContentBounds(root_size); | |
5223 root->SetPosition(gfx::PointF()); | |
5224 root->SetAnchorPoint(gfx::PointF()); | |
5225 | |
5226 gfx::Size layer_size(50, 50); | |
5227 content_layer->SetBounds(layer_size); | |
5228 content_layer->SetContentBounds(layer_size); | |
5229 content_layer->SetPosition(gfx::PointF()); | |
5230 content_layer->SetAnchorPoint(gfx::PointF()); | |
5231 content_layer->SetDrawsContent(true); | |
5232 | |
5233 gfx::Size child_size(50, 50); | |
5234 content_child_layer->SetBounds(child_size); | |
5235 content_child_layer->SetContentBounds(child_size); | |
5236 content_child_layer->SetPosition(gfx::Point(50, 0)); | |
5237 content_child_layer->SetAnchorPoint(gfx::PointF()); | |
5238 content_child_layer->SetDrawsContent(true); | |
5239 | |
5240 gfx::Size mask_size(50, 50); | |
5241 mask_layer->SetBounds(mask_size); | |
5242 mask_layer->SetContentBounds(mask_size); | |
5243 mask_layer->SetPosition(gfx::PointF()); | |
5244 mask_layer->SetAnchorPoint(gfx::PointF()); | |
5245 mask_layer->SetDrawsContent(true); | |
5246 | |
5247 float device_scale_factor = 1.f; | |
5248 host_impl_->SetViewportSize(root_size); | |
5249 host_impl_->SetDeviceScaleFactor(device_scale_factor); | |
5250 { | |
5251 LayerTreeHostImpl::FrameData frame; | |
5252 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); | |
5253 | |
5254 ASSERT_EQ(1u, frame.render_passes.size()); | |
5255 ASSERT_EQ(2u, frame.render_passes[0]->quad_list.size()); | |
5256 | |
5257 // The surface is 100x50. | |
5258 ASSERT_EQ(DrawQuad::RENDER_PASS, | |
5259 frame.render_passes[0]->quad_list[0]->material); | |
5260 const RenderPassDrawQuad* render_pass_quad = | |
5261 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[0]); | |
5262 EXPECT_FALSE(render_pass_quad->is_replica); | |
5263 EXPECT_EQ(gfx::Rect(0, 0, 100, 50).ToString(), | |
5264 render_pass_quad->rect.ToString()); | |
5265 | |
5266 // The mask covers the owning layer only. | |
enne (OOO)
2013/04/16 21:06:44
This does not jibe with the numbers below. 0011 m
danakj
2013/04/16 21:21:01
If the mask is 50px wide, and the surface texture
| |
5267 ASSERT_EQ(DrawQuad::RENDER_PASS, | |
5268 frame.render_passes[0]->quad_list[1]->material); | |
5269 const RenderPassDrawQuad* replica_quad = | |
5270 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[1]); | |
5271 EXPECT_TRUE(replica_quad->is_replica); | |
5272 EXPECT_EQ(gfx::Rect(0, 0, 100, 50).ToString(), | |
5273 replica_quad->rect.ToString()); | |
5274 EXPECT_EQ(gfx::RectF(0.f, 0.f, 1.f, 1.f).ToString(), | |
5275 replica_quad->mask_uv_rect.ToString()); | |
5276 | |
5277 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); | |
5278 host_impl_->DidDrawAllLayers(frame); | |
5279 } | |
5280 | |
5281 // Move the child to (-50, 0) instead. Now the mask should be moved to still | |
5282 // cover the layer being replicated. | |
5283 content_child_layer->SetPosition(gfx::Point(-50, 0)); | |
5284 { | |
5285 LayerTreeHostImpl::FrameData frame; | |
5286 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); | |
5287 | |
5288 ASSERT_EQ(1u, frame.render_passes.size()); | |
5289 ASSERT_EQ(2u, frame.render_passes[0]->quad_list.size()); | |
5290 | |
5291 // The surface is 100x50 with its origin at (-50, 0). | |
5292 ASSERT_EQ(DrawQuad::RENDER_PASS, | |
5293 frame.render_passes[0]->quad_list[0]->material); | |
5294 const RenderPassDrawQuad* render_pass_quad = | |
5295 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[0]); | |
5296 EXPECT_FALSE(render_pass_quad->is_replica); | |
5297 EXPECT_EQ(gfx::Rect(-50, 0, 100, 50).ToString(), | |
5298 render_pass_quad->rect.ToString()); | |
5299 | |
5300 // The mask covers the owning layer only. | |
5301 ASSERT_EQ(DrawQuad::RENDER_PASS, | |
5302 frame.render_passes[0]->quad_list[1]->material); | |
5303 const RenderPassDrawQuad* replica_quad = | |
5304 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[1]); | |
5305 EXPECT_TRUE(replica_quad->is_replica); | |
5306 EXPECT_EQ(gfx::Rect(-50, 0, 100, 50).ToString(), | |
5307 replica_quad->rect.ToString()); | |
5308 EXPECT_EQ(gfx::RectF(-0.5f, 0.f, 1.f, 1.f).ToString(), | |
enne (OOO)
2013/04/16 21:06:44
Previously, I mentioned that 2.f as a texcoord was
danakj
2013/04/16 21:21:01
The offset is not applied the same way as the scal
enne (OOO)
2013/04/17 16:24:40
I still think this is wrong, and this is why I sug
danakj
2013/04/17 16:55:59
Oh I replied to the pictures one about this before
| |
5309 replica_quad->mask_uv_rect.ToString()); | |
5310 | |
5311 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); | |
5312 host_impl_->DidDrawAllLayers(frame); | |
5313 } | |
5314 } | |
5315 | |
5316 TEST_F(LayerTreeHostImplTest, MaskLayerForSurfaceWithClippedLayer) { | |
5317 // The masked layer has bounds 50x50, but it has a child that causes | |
5318 // the surface bounds to be larger. It also has a parent that clips the | |
5319 // masked layer and its surface. | |
5320 | |
5321 scoped_ptr<LayerImpl> scoped_root = | |
5322 LayerImpl::Create(host_impl_->active_tree(), 1); | |
5323 LayerImpl* root = scoped_root.get(); | |
5324 host_impl_->active_tree()->SetRootLayer(scoped_root.Pass()); | |
5325 | |
5326 scoped_ptr<LayerImpl> scoped_clipping_layer = | |
5327 LayerImpl::Create(host_impl_->active_tree(), 2); | |
5328 LayerImpl* clipping_layer = scoped_clipping_layer.get(); | |
5329 root->AddChild(scoped_clipping_layer.Pass()); | |
5330 | |
5331 scoped_ptr<LayerImpl> scoped_content_layer = | |
5332 LayerImpl::Create(host_impl_->active_tree(), 3); | |
5333 LayerImpl* content_layer = scoped_content_layer.get(); | |
5334 clipping_layer->AddChild(scoped_content_layer.Pass()); | |
5335 | |
5336 scoped_ptr<LayerImpl> scoped_content_child_layer = | |
5337 LayerImpl::Create(host_impl_->active_tree(), 4); | |
5338 LayerImpl* content_child_layer = scoped_content_child_layer.get(); | |
5339 content_layer->AddChild(scoped_content_child_layer.Pass()); | |
5340 | |
5341 scoped_ptr<FakeMaskLayerImpl> scoped_mask_layer = | |
5342 FakeMaskLayerImpl::Create(host_impl_->active_tree(), 6); | |
5343 FakeMaskLayerImpl* mask_layer = scoped_mask_layer.get(); | |
5344 content_layer->SetMaskLayer(scoped_mask_layer.PassAs<LayerImpl>()); | |
5345 | |
5346 gfx::Size root_size(100, 100); | |
5347 root->SetBounds(root_size); | |
5348 root->SetContentBounds(root_size); | |
5349 root->SetPosition(gfx::PointF()); | |
5350 root->SetAnchorPoint(gfx::PointF()); | |
5351 | |
5352 gfx::Rect clipping_rect(20, 10, 10, 20); | |
5353 clipping_layer->SetBounds(clipping_rect.size()); | |
5354 clipping_layer->SetContentBounds(clipping_rect.size()); | |
5355 clipping_layer->SetPosition(clipping_rect.origin()); | |
5356 clipping_layer->SetAnchorPoint(gfx::PointF()); | |
5357 clipping_layer->SetMasksToBounds(true); | |
5358 | |
5359 gfx::Size layer_size(50, 50); | |
5360 content_layer->SetBounds(layer_size); | |
5361 content_layer->SetContentBounds(layer_size); | |
5362 content_layer->SetPosition(gfx::Point() - clipping_rect.OffsetFromOrigin()); | |
5363 content_layer->SetAnchorPoint(gfx::PointF()); | |
5364 content_layer->SetDrawsContent(true); | |
5365 | |
5366 gfx::Size child_size(50, 50); | |
5367 content_child_layer->SetBounds(child_size); | |
5368 content_child_layer->SetContentBounds(child_size); | |
5369 content_child_layer->SetPosition(gfx::Point(50, 0)); | |
5370 content_child_layer->SetAnchorPoint(gfx::PointF()); | |
5371 content_child_layer->SetDrawsContent(true); | |
5372 | |
5373 gfx::Size mask_size(100, 100); | |
5374 mask_layer->SetBounds(mask_size); | |
5375 mask_layer->SetContentBounds(mask_size); | |
5376 mask_layer->SetPosition(gfx::PointF()); | |
5377 mask_layer->SetAnchorPoint(gfx::PointF()); | |
5378 mask_layer->SetDrawsContent(true); | |
5379 | |
5380 float device_scale_factor = 1.f; | |
5381 host_impl_->SetViewportSize(root_size); | |
5382 host_impl_->SetDeviceScaleFactor(device_scale_factor); | |
5383 { | |
5384 LayerTreeHostImpl::FrameData frame; | |
5385 EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect())); | |
5386 | |
5387 ASSERT_EQ(1u, frame.render_passes.size()); | |
5388 ASSERT_EQ(1u, frame.render_passes[0]->quad_list.size()); | |
5389 | |
5390 // The surface is clipped to 10x20. | |
5391 ASSERT_EQ(DrawQuad::RENDER_PASS, | |
5392 frame.render_passes[0]->quad_list[0]->material); | |
5393 const RenderPassDrawQuad* render_pass_quad = | |
5394 RenderPassDrawQuad::MaterialCast(frame.render_passes[0]->quad_list[0]); | |
5395 EXPECT_FALSE(render_pass_quad->is_replica); | |
5396 EXPECT_EQ(gfx::Rect(20, 10, 10, 20).ToString(), | |
5397 render_pass_quad->rect.ToString()); | |
5398 | |
5399 // The masked layer is 50x50, but the surface size is 10x20. So the texture | |
5400 // coords in the mask are scaled by 10/50 and 20/50. | |
5401 // The surface is clipped to (20,10) so the mask texture coords are offset | |
5402 // by 20/50 and 10/50 | |
5403 EXPECT_EQ(gfx::ScaleRect(gfx::RectF(20.f, 10.f, 10.f, 20.f), | |
5404 1.f / 50.f).ToString(), | |
5043 render_pass_quad->mask_uv_rect.ToString()); | 5405 render_pass_quad->mask_uv_rect.ToString()); |
5044 | 5406 |
5045 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); | 5407 host_impl_->DrawLayers(&frame, base::TimeTicks::Now()); |
5046 host_impl_->DidDrawAllLayers(frame); | 5408 host_impl_->DidDrawAllLayers(frame); |
5047 } | 5409 } |
5048 } | 5410 } |
5049 | 5411 |
5050 } // namespace | 5412 } // namespace |
5051 } // namespace cc | 5413 } // namespace cc |
OLD | NEW |