Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(96)

Side by Side Diff: cc/trees/layer_tree_host_impl_unittest.cc

Issue 14244021: cc: Remove incorrect dcheck for masks. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
OLDNEW
« cc/layers/render_surface_impl.cc ('K') | « cc/layers/render_surface_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698