OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/surfaces/surface_aggregator.h" | 5 #include "cc/surfaces/surface_aggregator.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <utility> | 10 #include <utility> |
(...skipping 881 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
892 | 892 |
893 RenderPassId pass_id(1, 1); | 893 RenderPassId pass_id(1, 1); |
894 LocalFrameId grandchild_local_frame_id = allocator_.GenerateId(); | 894 LocalFrameId grandchild_local_frame_id = allocator_.GenerateId(); |
895 SurfaceId grandchild_surface_id(factory_.frame_sink_id(), | 895 SurfaceId grandchild_surface_id(factory_.frame_sink_id(), |
896 grandchild_local_frame_id); | 896 grandchild_local_frame_id); |
897 factory_.Create(grandchild_local_frame_id); | 897 factory_.Create(grandchild_local_frame_id); |
898 std::unique_ptr<RenderPass> grandchild_pass = RenderPass::Create(); | 898 std::unique_ptr<RenderPass> grandchild_pass = RenderPass::Create(); |
899 gfx::Rect output_rect(SurfaceSize()); | 899 gfx::Rect output_rect(SurfaceSize()); |
900 gfx::Rect damage_rect(SurfaceSize()); | 900 gfx::Rect damage_rect(SurfaceSize()); |
901 gfx::Transform transform_to_root_target; | 901 gfx::Transform transform_to_root_target; |
902 grandchild_pass->SetNew( | 902 grandchild_pass->SetNew(pass_id, output_rect, damage_rect, |
903 pass_id, output_rect, damage_rect, transform_to_root_target); | 903 transform_to_root_target); |
904 AddSolidColorQuadWithBlendMode( | 904 AddSolidColorQuadWithBlendMode( |
905 SurfaceSize(), grandchild_pass.get(), blend_modes[2]); | 905 SurfaceSize(), grandchild_pass.get(), blend_modes[2]); |
906 QueuePassAsFrame(std::move(grandchild_pass), grandchild_local_frame_id); | 906 QueuePassAsFrame(std::move(grandchild_pass), grandchild_local_frame_id); |
907 | 907 |
908 LocalFrameId child_one_local_frame_id = allocator_.GenerateId(); | 908 LocalFrameId child_one_local_frame_id = allocator_.GenerateId(); |
909 SurfaceId child_one_surface_id(factory_.frame_sink_id(), | 909 SurfaceId child_one_surface_id(factory_.frame_sink_id(), |
910 child_one_local_frame_id); | 910 child_one_local_frame_id); |
911 factory_.Create(child_one_local_frame_id); | 911 factory_.Create(child_one_local_frame_id); |
912 | 912 |
913 std::unique_ptr<RenderPass> child_one_pass = RenderPass::Create(); | 913 std::unique_ptr<RenderPass> child_one_pass = RenderPass::Create(); |
914 child_one_pass->SetNew( | 914 child_one_pass->SetNew(pass_id, output_rect, damage_rect, |
915 pass_id, output_rect, damage_rect, transform_to_root_target); | 915 transform_to_root_target); |
916 AddSolidColorQuadWithBlendMode( | 916 AddSolidColorQuadWithBlendMode( |
917 SurfaceSize(), child_one_pass.get(), blend_modes[1]); | 917 SurfaceSize(), child_one_pass.get(), blend_modes[1]); |
918 SurfaceDrawQuad* grandchild_surface_quad = | 918 SurfaceDrawQuad* grandchild_surface_quad = |
919 child_one_pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); | 919 child_one_pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); |
920 grandchild_surface_quad->SetNew(child_one_pass->shared_quad_state_list.back(), | 920 grandchild_surface_quad->SetNew(child_one_pass->shared_quad_state_list.back(), |
921 gfx::Rect(SurfaceSize()), | 921 gfx::Rect(SurfaceSize()), |
922 gfx::Rect(SurfaceSize()), | 922 gfx::Rect(SurfaceSize()), |
923 grandchild_surface_id); | 923 grandchild_surface_id); |
924 AddSolidColorQuadWithBlendMode( | 924 AddSolidColorQuadWithBlendMode( |
925 SurfaceSize(), child_one_pass.get(), blend_modes[3]); | 925 SurfaceSize(), child_one_pass.get(), blend_modes[3]); |
926 QueuePassAsFrame(std::move(child_one_pass), child_one_local_frame_id); | 926 QueuePassAsFrame(std::move(child_one_pass), child_one_local_frame_id); |
927 | 927 |
928 LocalFrameId child_two_local_frame_id = allocator_.GenerateId(); | 928 LocalFrameId child_two_local_frame_id = allocator_.GenerateId(); |
929 SurfaceId child_two_surface_id(factory_.frame_sink_id(), | 929 SurfaceId child_two_surface_id(factory_.frame_sink_id(), |
930 child_two_local_frame_id); | 930 child_two_local_frame_id); |
931 factory_.Create(child_two_local_frame_id); | 931 factory_.Create(child_two_local_frame_id); |
932 | 932 |
933 std::unique_ptr<RenderPass> child_two_pass = RenderPass::Create(); | 933 std::unique_ptr<RenderPass> child_two_pass = RenderPass::Create(); |
934 child_two_pass->SetNew( | 934 child_two_pass->SetNew(pass_id, output_rect, damage_rect, |
935 pass_id, output_rect, damage_rect, transform_to_root_target); | 935 transform_to_root_target); |
936 AddSolidColorQuadWithBlendMode( | 936 AddSolidColorQuadWithBlendMode( |
937 SurfaceSize(), child_two_pass.get(), blend_modes[5]); | 937 SurfaceSize(), child_two_pass.get(), blend_modes[5]); |
938 QueuePassAsFrame(std::move(child_two_pass), child_two_local_frame_id); | 938 QueuePassAsFrame(std::move(child_two_pass), child_two_local_frame_id); |
939 | 939 |
940 std::unique_ptr<RenderPass> root_pass = RenderPass::Create(); | 940 std::unique_ptr<RenderPass> root_pass = RenderPass::Create(); |
941 root_pass->SetNew( | 941 root_pass->SetNew(pass_id, output_rect, damage_rect, |
942 pass_id, output_rect, damage_rect, transform_to_root_target); | 942 transform_to_root_target); |
943 | 943 |
944 AddSolidColorQuadWithBlendMode( | 944 AddSolidColorQuadWithBlendMode( |
945 SurfaceSize(), root_pass.get(), blend_modes[0]); | 945 SurfaceSize(), root_pass.get(), blend_modes[0]); |
946 SurfaceDrawQuad* child_one_surface_quad = | 946 SurfaceDrawQuad* child_one_surface_quad = |
947 root_pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); | 947 root_pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); |
948 child_one_surface_quad->SetNew(root_pass->shared_quad_state_list.back(), | 948 child_one_surface_quad->SetNew(root_pass->shared_quad_state_list.back(), |
949 gfx::Rect(SurfaceSize()), | 949 gfx::Rect(SurfaceSize()), |
950 gfx::Rect(SurfaceSize()), | 950 gfx::Rect(SurfaceSize()), |
951 child_one_surface_id); | 951 child_one_surface_id); |
952 AddSolidColorQuadWithBlendMode( | 952 AddSolidColorQuadWithBlendMode( |
(...skipping 653 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1606 const RenderPassList& aggregated_pass_list = | 1606 const RenderPassList& aggregated_pass_list = |
1607 aggregated_frame.render_pass_list; | 1607 aggregated_frame.render_pass_list; |
1608 // There were no changes since last aggregation, so output should be empty | 1608 // There were no changes since last aggregation, so output should be empty |
1609 // and have no damage. | 1609 // and have no damage. |
1610 ASSERT_EQ(1u, aggregated_pass_list.size()); | 1610 ASSERT_EQ(1u, aggregated_pass_list.size()); |
1611 EXPECT_TRUE(aggregated_pass_list[0]->damage_rect.IsEmpty()); | 1611 EXPECT_TRUE(aggregated_pass_list[0]->damage_rect.IsEmpty()); |
1612 ASSERT_EQ(0u, aggregated_pass_list[0]->quad_list.size()); | 1612 ASSERT_EQ(0u, aggregated_pass_list[0]->quad_list.size()); |
1613 } | 1613 } |
1614 | 1614 |
1615 // Root surface has smaller damage rect, but filter on render pass means all | 1615 // Root surface has smaller damage rect, but filter on render pass means all |
1616 // of it should be aggregated. | 1616 // of it and its descendant passes should be aggregated. |
1617 { | 1617 { |
1618 RenderPassId root_pass_ids[] = {RenderPassId(1, 1), RenderPassId(1, 2)}; | 1618 RenderPassId root_pass_ids[] = {RenderPassId(1, 1), RenderPassId(1, 2), |
1619 RenderPassId(1, 3)}; | |
1619 test::Quad root_quads1[] = {test::Quad::SurfaceQuad(child_surface_id, 1.f)}; | 1620 test::Quad root_quads1[] = {test::Quad::SurfaceQuad(child_surface_id, 1.f)}; |
1620 test::Quad root_quads2[] = {test::Quad::RenderPassQuad(root_pass_ids[0])}; | 1621 test::Quad root_quads2[] = {test::Quad::RenderPassQuad(root_pass_ids[0])}; |
1622 test::Quad root_quads3[] = {test::Quad::RenderPassQuad(root_pass_ids[1])}; | |
1621 test::Pass root_passes[] = { | 1623 test::Pass root_passes[] = { |
1622 test::Pass(root_quads1, arraysize(root_quads1), root_pass_ids[0]), | 1624 test::Pass(root_quads1, arraysize(root_quads1), root_pass_ids[0]), |
1623 test::Pass(root_quads2, arraysize(root_quads2), root_pass_ids[1])}; | 1625 test::Pass(root_quads2, arraysize(root_quads2), root_pass_ids[1]), |
1626 test::Pass(root_quads3, arraysize(root_quads3), root_pass_ids[2])}; | |
1624 | 1627 |
1625 RenderPassList root_pass_list; | 1628 RenderPassList root_pass_list; |
1626 AddPasses(&root_pass_list, gfx::Rect(SurfaceSize()), root_passes, | 1629 AddPasses(&root_pass_list, gfx::Rect(SurfaceSize()), root_passes, |
1627 arraysize(root_passes)); | 1630 arraysize(root_passes)); |
1628 | 1631 |
1629 RenderPass* pass = root_pass_list[0].get(); | 1632 RenderPass* pass = root_pass_list[1].get(); |
danakj
2016/12/14 23:23:57
can u name this |filter_pass| now cuz there's 2 no
ajuma
2016/12/15 16:49:21
Done.
| |
1630 pass->shared_quad_state_list.front()->quad_to_target_transform.Translate( | 1633 pass->shared_quad_state_list.front()->quad_to_target_transform.Translate(0, |
danakj
2016/12/14 23:23:57
Why the 0,0 change, and why is that different than
ajuma
2016/12/15 16:49:21
Oh, I changed that while debugging and forgot to r
| |
1631 10, 10); | 1634 0); |
1632 RenderPass* root_pass = root_pass_list[1].get(); | 1635 RenderPass* root_pass = root_pass_list[2].get(); |
1633 RenderPassDrawQuad* quad = | 1636 pass->filters.Append(FilterOperation::CreateBlurFilter(2)); |
1634 static_cast<RenderPassDrawQuad*>(root_pass->quad_list.front()); | |
1635 quad->filters.Append(FilterOperation::CreateBlurFilter(2)); | |
1636 root_pass->damage_rect = gfx::Rect(10, 10, 2, 2); | 1637 root_pass->damage_rect = gfx::Rect(10, 10, 2, 2); |
1637 SubmitPassListAsFrame(&factory_, root_local_frame_id_, &root_pass_list); | 1638 SubmitPassListAsFrame(&factory_, root_local_frame_id_, &root_pass_list); |
1638 } | 1639 } |
1639 | 1640 |
1640 { | 1641 { |
1641 CompositorFrame aggregated_frame = aggregator_.Aggregate(root_surface_id); | 1642 CompositorFrame aggregated_frame = aggregator_.Aggregate(root_surface_id); |
1642 | 1643 |
1643 const RenderPassList& aggregated_pass_list = | 1644 const RenderPassList& aggregated_pass_list = |
1644 aggregated_frame.render_pass_list; | 1645 aggregated_frame.render_pass_list; |
1645 | 1646 |
1646 ASSERT_EQ(3u, aggregated_pass_list.size()); | 1647 ASSERT_EQ(4u, aggregated_pass_list.size()); |
1647 | 1648 |
1648 EXPECT_EQ(gfx::Rect(SurfaceSize()), aggregated_pass_list[0]->damage_rect); | 1649 EXPECT_EQ(gfx::Rect(SurfaceSize()), aggregated_pass_list[0]->damage_rect); |
1649 EXPECT_EQ(gfx::Rect(SurfaceSize()), aggregated_pass_list[1]->damage_rect); | 1650 EXPECT_EQ(gfx::Rect(SurfaceSize()), aggregated_pass_list[1]->damage_rect); |
1650 EXPECT_EQ(gfx::Rect(10, 10, 2, 2), aggregated_pass_list[2]->damage_rect); | 1651 EXPECT_EQ(gfx::Rect(SurfaceSize()), aggregated_pass_list[2]->damage_rect); |
1652 EXPECT_EQ(gfx::Rect(10, 10, 2, 2), aggregated_pass_list[3]->damage_rect); | |
1651 EXPECT_EQ(1u, aggregated_pass_list[0]->quad_list.size()); | 1653 EXPECT_EQ(1u, aggregated_pass_list[0]->quad_list.size()); |
1652 EXPECT_EQ(1u, aggregated_pass_list[1]->quad_list.size()); | 1654 EXPECT_EQ(1u, aggregated_pass_list[1]->quad_list.size()); |
1655 EXPECT_EQ(1u, aggregated_pass_list[2]->quad_list.size()); | |
1653 // First render pass draw quad is outside damage rect, so shouldn't be | 1656 // First render pass draw quad is outside damage rect, so shouldn't be |
1654 // drawn. | 1657 // drawn. |
1655 EXPECT_EQ(0u, aggregated_pass_list[2]->quad_list.size()); | 1658 EXPECT_EQ(0u, aggregated_pass_list[3]->quad_list.size()); |
1656 } | 1659 } |
1657 | 1660 |
1658 // Root surface has smaller damage rect. Background filter on render pass | 1661 // Root surface has smaller damage rect. Background filter on render pass |
1659 // means Surface | 1662 // means Surface |
1660 // quad under it should be aggregated. | 1663 // quad under it should be aggregated. |
1661 { | 1664 { |
1662 RenderPassId root_pass_ids[] = {RenderPassId(1, 1), RenderPassId(1, 2)}; | 1665 RenderPassId root_pass_ids[] = {RenderPassId(1, 1), RenderPassId(1, 2)}; |
1663 test::Quad root_quads1[] = { | 1666 test::Quad root_quads1[] = { |
1664 test::Quad::SolidColorQuad(1), | 1667 test::Quad::SolidColorQuad(1), |
1665 }; | 1668 }; |
1666 test::Quad root_quads2[] = {test::Quad::RenderPassQuad(root_pass_ids[0]), | 1669 test::Quad root_quads2[] = {test::Quad::RenderPassQuad(root_pass_ids[0]), |
1667 test::Quad::SurfaceQuad(child_surface_id, 1.f)}; | 1670 test::Quad::SurfaceQuad(child_surface_id, 1.f)}; |
1668 test::Pass root_passes[] = { | 1671 test::Pass root_passes[] = { |
1669 test::Pass(root_quads1, arraysize(root_quads1), root_pass_ids[0]), | 1672 test::Pass(root_quads1, arraysize(root_quads1), root_pass_ids[0]), |
1670 test::Pass(root_quads2, arraysize(root_quads2), root_pass_ids[1])}; | 1673 test::Pass(root_quads2, arraysize(root_quads2), root_pass_ids[1])}; |
1671 | 1674 |
1672 RenderPassList root_pass_list; | 1675 RenderPassList root_pass_list; |
1673 AddPasses(&root_pass_list, gfx::Rect(SurfaceSize()), root_passes, | 1676 AddPasses(&root_pass_list, gfx::Rect(SurfaceSize()), root_passes, |
1674 arraysize(root_passes)); | 1677 arraysize(root_passes)); |
1675 | 1678 |
1679 RenderPass* pass = root_pass_list[0].get(); | |
1676 RenderPass* root_pass = root_pass_list[1].get(); | 1680 RenderPass* root_pass = root_pass_list[1].get(); |
1677 root_pass->shared_quad_state_list.ElementAt(1) | 1681 root_pass->shared_quad_state_list.ElementAt(1) |
1678 ->quad_to_target_transform.Translate(10, 10); | 1682 ->quad_to_target_transform.Translate(10, 10); |
1679 RenderPassDrawQuad* quad = | 1683 pass->background_filters.Append(FilterOperation::CreateBlurFilter(2)); |
1680 static_cast<RenderPassDrawQuad*>(root_pass->quad_list.front()); | |
1681 quad->background_filters.Append(FilterOperation::CreateBlurFilter(2)); | |
1682 root_pass->damage_rect = gfx::Rect(10, 10, 2, 2); | 1684 root_pass->damage_rect = gfx::Rect(10, 10, 2, 2); |
1683 SubmitPassListAsFrame(&factory_, root_local_frame_id_, &root_pass_list); | 1685 SubmitPassListAsFrame(&factory_, root_local_frame_id_, &root_pass_list); |
1684 } | 1686 } |
1685 | 1687 |
1686 { | 1688 { |
1687 CompositorFrame aggregated_frame = aggregator_.Aggregate(root_surface_id); | 1689 CompositorFrame aggregated_frame = aggregator_.Aggregate(root_surface_id); |
1688 | 1690 |
1689 const RenderPassList& aggregated_pass_list = | 1691 const RenderPassList& aggregated_pass_list = |
1690 aggregated_frame.render_pass_list; | 1692 aggregated_frame.render_pass_list; |
1691 | 1693 |
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2013 // Output is insecure, so texture should be drawn. | 2015 // Output is insecure, so texture should be drawn. |
2014 EXPECT_EQ(DrawQuad::SOLID_COLOR, render_pass->quad_list.back()->material); | 2016 EXPECT_EQ(DrawQuad::SOLID_COLOR, render_pass->quad_list.back()->material); |
2015 | 2017 |
2016 factory.Destroy(local_frame1_id); | 2018 factory.Destroy(local_frame1_id); |
2017 factory.Destroy(local_frame2_id); | 2019 factory.Destroy(local_frame2_id); |
2018 } | 2020 } |
2019 | 2021 |
2020 } // namespace | 2022 } // namespace |
2021 } // namespace cc | 2023 } // namespace cc |
2022 | 2024 |
OLD | NEW |