Chromium Code Reviews| 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 |