| 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/output/compositor_frame.h" | 5 #include "cc/output/compositor_frame.h" |
| 6 #include "cc/output/delegated_frame_data.h" | 6 #include "cc/output/delegated_frame_data.h" |
| 7 #include "cc/quads/render_pass.h" | 7 #include "cc/quads/render_pass.h" |
| 8 #include "cc/quads/render_pass_draw_quad.h" | 8 #include "cc/quads/render_pass_draw_quad.h" |
| 9 #include "cc/quads/solid_color_draw_quad.h" | 9 #include "cc/quads/solid_color_draw_quad.h" |
| 10 #include "cc/quads/surface_draw_quad.h" | 10 #include "cc/quads/surface_draw_quad.h" |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 protected: | 54 protected: |
| 55 SurfaceManager manager_; | 55 SurfaceManager manager_; |
| 56 EmptySurfaceFactoryClient empty_client_; | 56 EmptySurfaceFactoryClient empty_client_; |
| 57 SurfaceFactory factory_; | 57 SurfaceFactory factory_; |
| 58 SurfaceAggregator aggregator_; | 58 SurfaceAggregator aggregator_; |
| 59 }; | 59 }; |
| 60 | 60 |
| 61 TEST_F(SurfaceAggregatorTest, ValidSurfaceNoFrame) { | 61 TEST_F(SurfaceAggregatorTest, ValidSurfaceNoFrame) { |
| 62 SurfaceId one_id(7); | 62 SurfaceId one_id(7); |
| 63 factory_.Create(one_id, SurfaceSize()); | 63 factory_.Create(one_id, SurfaceSize()); |
| 64 std::set<SurfaceId> surface_set; | 64 scoped_ptr<CompositorFrame> frame = aggregator_.Aggregate(one_id); |
| 65 scoped_ptr<CompositorFrame> frame = | |
| 66 aggregator_.Aggregate(one_id, &surface_set); | |
| 67 EXPECT_FALSE(frame); | 65 EXPECT_FALSE(frame); |
| 68 factory_.Destroy(one_id); | 66 factory_.Destroy(one_id); |
| 69 } | 67 } |
| 70 | 68 |
| 71 class SurfaceAggregatorValidSurfaceTest : public SurfaceAggregatorTest { | 69 class SurfaceAggregatorValidSurfaceTest : public SurfaceAggregatorTest { |
| 72 public: | 70 public: |
| 73 SurfaceAggregatorValidSurfaceTest() : allocator_(1u) {} | 71 SurfaceAggregatorValidSurfaceTest() : allocator_(1u) {} |
| 74 | 72 |
| 75 virtual void SetUp() { | 73 virtual void SetUp() { |
| 76 SurfaceAggregatorTest::SetUp(); | 74 SurfaceAggregatorTest::SetUp(); |
| 77 root_surface_id_ = allocator_.GenerateId(); | 75 root_surface_id_ = allocator_.GenerateId(); |
| 78 factory_.Create(root_surface_id_, SurfaceSize()); | 76 factory_.Create(root_surface_id_, SurfaceSize()); |
| 79 } | 77 } |
| 80 | 78 |
| 81 virtual void TearDown() { | 79 virtual void TearDown() { |
| 82 factory_.Destroy(root_surface_id_); | 80 factory_.Destroy(root_surface_id_); |
| 83 SurfaceAggregatorTest::TearDown(); | 81 SurfaceAggregatorTest::TearDown(); |
| 84 } | 82 } |
| 85 | 83 |
| 86 void AggregateAndVerify(test::Pass* expected_passes, | 84 void AggregateAndVerify(test::Pass* expected_passes, |
| 87 size_t expected_pass_count, | 85 size_t expected_pass_count, |
| 88 SurfaceId* surface_ids, | 86 SurfaceId* surface_ids, |
| 89 size_t expected_surface_count) { | 87 size_t expected_surface_count) { |
| 90 std::set<SurfaceId> surface_set; | |
| 91 scoped_ptr<CompositorFrame> aggregated_frame = | 88 scoped_ptr<CompositorFrame> aggregated_frame = |
| 92 aggregator_.Aggregate(root_surface_id_, &surface_set); | 89 aggregator_.Aggregate(root_surface_id_); |
| 93 | 90 |
| 94 ASSERT_TRUE(aggregated_frame); | 91 ASSERT_TRUE(aggregated_frame); |
| 95 ASSERT_TRUE(aggregated_frame->delegated_frame_data); | 92 ASSERT_TRUE(aggregated_frame->delegated_frame_data); |
| 96 | 93 |
| 97 DelegatedFrameData* frame_data = | 94 DelegatedFrameData* frame_data = |
| 98 aggregated_frame->delegated_frame_data.get(); | 95 aggregated_frame->delegated_frame_data.get(); |
| 99 | 96 |
| 100 TestPassesMatchExpectations( | 97 TestPassesMatchExpectations( |
| 101 expected_passes, expected_pass_count, &frame_data->render_pass_list); | 98 expected_passes, expected_pass_count, &frame_data->render_pass_list); |
| 102 | 99 |
| 103 EXPECT_EQ(expected_surface_count, surface_set.size()); | 100 EXPECT_EQ(expected_surface_count, |
| 101 aggregator_.previous_contained_surfaces().size()); |
| 104 for (size_t i = 0; i < expected_surface_count; i++) { | 102 for (size_t i = 0; i < expected_surface_count; i++) { |
| 105 EXPECT_TRUE(surface_set.find(surface_ids[i]) != surface_set.end()); | 103 EXPECT_TRUE( |
| 104 aggregator_.previous_contained_surfaces().find(surface_ids[i]) != |
| 105 aggregator_.previous_contained_surfaces().end()); |
| 106 } | 106 } |
| 107 } | 107 } |
| 108 | 108 |
| 109 void SubmitFrame(test::Pass* passes, | 109 void SubmitFrame(test::Pass* passes, |
| 110 size_t pass_count, | 110 size_t pass_count, |
| 111 SurfaceId surface_id) { | 111 SurfaceId surface_id) { |
| 112 RenderPassList pass_list; | 112 RenderPassList pass_list; |
| 113 AddPasses(&pass_list, gfx::Rect(SurfaceSize()), passes, pass_count); | 113 AddPasses(&pass_list, gfx::Rect(SurfaceSize()), passes, pass_count); |
| 114 | 114 |
| 115 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); | 115 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 {test::Quad::SurfaceQuad(embedded_surface_id), | 220 {test::Quad::SurfaceQuad(embedded_surface_id), |
| 221 test::Quad::RenderPassQuad(pass_ids[0])}, | 221 test::Quad::RenderPassQuad(pass_ids[0])}, |
| 222 {test::Quad::SolidColorQuad(7), test::Quad::RenderPassQuad(pass_ids[1])}}; | 222 {test::Quad::SolidColorQuad(7), test::Quad::RenderPassQuad(pass_ids[1])}}; |
| 223 test::Pass root_passes[] = { | 223 test::Pass root_passes[] = { |
| 224 test::Pass(root_quads[0], arraysize(root_quads[0]), pass_ids[0]), | 224 test::Pass(root_quads[0], arraysize(root_quads[0]), pass_ids[0]), |
| 225 test::Pass(root_quads[1], arraysize(root_quads[1]), pass_ids[1]), | 225 test::Pass(root_quads[1], arraysize(root_quads[1]), pass_ids[1]), |
| 226 test::Pass(root_quads[2], arraysize(root_quads[2]), pass_ids[2])}; | 226 test::Pass(root_quads[2], arraysize(root_quads[2]), pass_ids[2])}; |
| 227 | 227 |
| 228 SubmitFrame(root_passes, arraysize(root_passes), root_surface_id_); | 228 SubmitFrame(root_passes, arraysize(root_passes), root_surface_id_); |
| 229 | 229 |
| 230 std::set<SurfaceId> surface_set; | |
| 231 scoped_ptr<CompositorFrame> aggregated_frame = | 230 scoped_ptr<CompositorFrame> aggregated_frame = |
| 232 aggregator_.Aggregate(root_surface_id_, &surface_set); | 231 aggregator_.Aggregate(root_surface_id_); |
| 233 | 232 |
| 234 ASSERT_TRUE(aggregated_frame); | 233 ASSERT_TRUE(aggregated_frame); |
| 235 ASSERT_TRUE(aggregated_frame->delegated_frame_data); | 234 ASSERT_TRUE(aggregated_frame->delegated_frame_data); |
| 236 | 235 |
| 237 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get(); | 236 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get(); |
| 238 | 237 |
| 239 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; | 238 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; |
| 240 | 239 |
| 241 ASSERT_EQ(5u, aggregated_pass_list.size()); | 240 ASSERT_EQ(5u, aggregated_pass_list.size()); |
| 242 RenderPassId actual_pass_ids[] = { | 241 RenderPassId actual_pass_ids[] = { |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 444 // Pass IDs from the parent surface may collide with ones from the child. | 443 // Pass IDs from the parent surface may collide with ones from the child. |
| 445 RenderPassId parent_pass_id[] = {RenderPassId(2, 1), RenderPassId(1, 2)}; | 444 RenderPassId parent_pass_id[] = {RenderPassId(2, 1), RenderPassId(1, 2)}; |
| 446 test::Quad parent_quad[][1] = { | 445 test::Quad parent_quad[][1] = { |
| 447 {test::Quad::SurfaceQuad(child_surface_id)}, | 446 {test::Quad::SurfaceQuad(child_surface_id)}, |
| 448 {test::Quad::RenderPassQuad(parent_pass_id[0])}}; | 447 {test::Quad::RenderPassQuad(parent_pass_id[0])}}; |
| 449 test::Pass parent_passes[] = { | 448 test::Pass parent_passes[] = { |
| 450 test::Pass(parent_quad[0], arraysize(parent_quad[0]), parent_pass_id[0]), | 449 test::Pass(parent_quad[0], arraysize(parent_quad[0]), parent_pass_id[0]), |
| 451 test::Pass(parent_quad[1], arraysize(parent_quad[1]), parent_pass_id[1])}; | 450 test::Pass(parent_quad[1], arraysize(parent_quad[1]), parent_pass_id[1])}; |
| 452 | 451 |
| 453 SubmitFrame(parent_passes, arraysize(parent_passes), root_surface_id_); | 452 SubmitFrame(parent_passes, arraysize(parent_passes), root_surface_id_); |
| 454 std::set<SurfaceId> surface_set; | |
| 455 scoped_ptr<CompositorFrame> aggregated_frame = | 453 scoped_ptr<CompositorFrame> aggregated_frame = |
| 456 aggregator_.Aggregate(root_surface_id_, &surface_set); | 454 aggregator_.Aggregate(root_surface_id_); |
| 457 | 455 |
| 458 ASSERT_TRUE(aggregated_frame); | 456 ASSERT_TRUE(aggregated_frame); |
| 459 ASSERT_TRUE(aggregated_frame->delegated_frame_data); | 457 ASSERT_TRUE(aggregated_frame->delegated_frame_data); |
| 460 | 458 |
| 461 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get(); | 459 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get(); |
| 462 | 460 |
| 463 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; | 461 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; |
| 464 | 462 |
| 465 ASSERT_EQ(3u, aggregated_pass_list.size()); | 463 ASSERT_EQ(3u, aggregated_pass_list.size()); |
| 466 RenderPassId actual_pass_ids[] = {aggregated_pass_list[0]->id, | 464 RenderPassId actual_pass_ids[] = {aggregated_pass_list[0]->id, |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 616 root_pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); | 614 root_pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); |
| 617 child_two_surface_quad->SetNew(root_pass->shared_quad_state_list.back(), | 615 child_two_surface_quad->SetNew(root_pass->shared_quad_state_list.back(), |
| 618 gfx::Rect(SurfaceSize()), | 616 gfx::Rect(SurfaceSize()), |
| 619 gfx::Rect(SurfaceSize()), | 617 gfx::Rect(SurfaceSize()), |
| 620 child_two_surface_id); | 618 child_two_surface_id); |
| 621 AddSolidColorQuadWithBlendMode( | 619 AddSolidColorQuadWithBlendMode( |
| 622 SurfaceSize(), root_pass.get(), blend_modes[6]); | 620 SurfaceSize(), root_pass.get(), blend_modes[6]); |
| 623 | 621 |
| 624 QueuePassAsFrame(root_pass.Pass(), root_surface_id_); | 622 QueuePassAsFrame(root_pass.Pass(), root_surface_id_); |
| 625 | 623 |
| 626 std::set<SurfaceId> surface_set; | |
| 627 scoped_ptr<CompositorFrame> aggregated_frame = | 624 scoped_ptr<CompositorFrame> aggregated_frame = |
| 628 aggregator_.Aggregate(root_surface_id_, &surface_set); | 625 aggregator_.Aggregate(root_surface_id_); |
| 629 | 626 |
| 630 ASSERT_TRUE(aggregated_frame); | 627 ASSERT_TRUE(aggregated_frame); |
| 631 ASSERT_TRUE(aggregated_frame->delegated_frame_data); | 628 ASSERT_TRUE(aggregated_frame->delegated_frame_data); |
| 632 | 629 |
| 633 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get(); | 630 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get(); |
| 634 | 631 |
| 635 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; | 632 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; |
| 636 | 633 |
| 637 ASSERT_EQ(1u, aggregated_pass_list.size()); | 634 ASSERT_EQ(1u, aggregated_pass_list.size()); |
| 638 | 635 |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 720 ->content_to_target_transform.Translate(0, 10); | 717 ->content_to_target_transform.Translate(0, 10); |
| 721 | 718 |
| 722 scoped_ptr<DelegatedFrameData> root_frame_data(new DelegatedFrameData); | 719 scoped_ptr<DelegatedFrameData> root_frame_data(new DelegatedFrameData); |
| 723 root_pass_list.swap(root_frame_data->render_pass_list); | 720 root_pass_list.swap(root_frame_data->render_pass_list); |
| 724 | 721 |
| 725 scoped_ptr<CompositorFrame> root_frame(new CompositorFrame); | 722 scoped_ptr<CompositorFrame> root_frame(new CompositorFrame); |
| 726 root_frame->delegated_frame_data = root_frame_data.Pass(); | 723 root_frame->delegated_frame_data = root_frame_data.Pass(); |
| 727 | 724 |
| 728 factory_.SubmitFrame(root_surface_id_, root_frame.Pass(), base::Closure()); | 725 factory_.SubmitFrame(root_surface_id_, root_frame.Pass(), base::Closure()); |
| 729 | 726 |
| 730 std::set<SurfaceId> surface_set; | |
| 731 scoped_ptr<CompositorFrame> aggregated_frame = | 727 scoped_ptr<CompositorFrame> aggregated_frame = |
| 732 aggregator_.Aggregate(root_surface_id_, &surface_set); | 728 aggregator_.Aggregate(root_surface_id_); |
| 733 | 729 |
| 734 ASSERT_TRUE(aggregated_frame); | 730 ASSERT_TRUE(aggregated_frame); |
| 735 ASSERT_TRUE(aggregated_frame->delegated_frame_data); | 731 ASSERT_TRUE(aggregated_frame->delegated_frame_data); |
| 736 | 732 |
| 737 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get(); | 733 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get(); |
| 738 | 734 |
| 739 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; | 735 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; |
| 740 | 736 |
| 741 ASSERT_EQ(2u, aggregated_pass_list.size()); | 737 ASSERT_EQ(2u, aggregated_pass_list.size()); |
| 742 | 738 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 790 | 786 |
| 791 // The second quad in the root pass is aggregated from the child, so its | 787 // The second quad in the root pass is aggregated from the child, so its |
| 792 // clip rect must be transformed by the child's translation. | 788 // clip rect must be transformed by the child's translation. |
| 793 EXPECT_EQ( | 789 EXPECT_EQ( |
| 794 gfx::Rect(0, 10, 5, 5).ToString(), | 790 gfx::Rect(0, 10, 5, 5).ToString(), |
| 795 aggregated_pass_list[1]->shared_quad_state_list[1]->clip_rect.ToString()); | 791 aggregated_pass_list[1]->shared_quad_state_list[1]->clip_rect.ToString()); |
| 796 | 792 |
| 797 factory_.Destroy(child_surface_id); | 793 factory_.Destroy(child_surface_id); |
| 798 } | 794 } |
| 799 | 795 |
| 796 // Tests that damage rects are aggregated correctly when surfaces change. |
| 797 TEST_F(SurfaceAggregatorValidSurfaceTest, AggregateDamageRect) { |
| 798 SurfaceId child_surface_id = allocator_.GenerateId(); |
| 799 factory_.Create(child_surface_id, SurfaceSize()); |
| 800 RenderPassId child_pass_id = RenderPassId(1, 1); |
| 801 test::Quad child_quads[] = {test::Quad::RenderPassQuad(child_pass_id)}; |
| 802 test::Pass child_passes[] = { |
| 803 test::Pass(child_quads, arraysize(child_quads), child_pass_id)}; |
| 804 |
| 805 RenderPassList child_pass_list; |
| 806 AddPasses(&child_pass_list, |
| 807 gfx::Rect(SurfaceSize()), |
| 808 child_passes, |
| 809 arraysize(child_passes)); |
| 810 |
| 811 RenderPass* child_root_pass = child_pass_list.at(0u); |
| 812 SharedQuadState* child_root_pass_sqs = |
| 813 child_root_pass->shared_quad_state_list[0]; |
| 814 child_root_pass_sqs->content_to_target_transform.Translate(8, 0); |
| 815 |
| 816 scoped_ptr<DelegatedFrameData> child_frame_data(new DelegatedFrameData); |
| 817 child_pass_list.swap(child_frame_data->render_pass_list); |
| 818 |
| 819 scoped_ptr<CompositorFrame> child_frame(new CompositorFrame); |
| 820 child_frame->delegated_frame_data = child_frame_data.Pass(); |
| 821 |
| 822 factory_.SubmitFrame(child_surface_id, child_frame.Pass(), base::Closure()); |
| 823 |
| 824 test::Quad root_quads[] = {test::Quad::SurfaceQuad(child_surface_id)}; |
| 825 test::Pass root_passes[] = {test::Pass(root_quads, arraysize(root_quads))}; |
| 826 |
| 827 RenderPassList root_pass_list; |
| 828 AddPasses(&root_pass_list, |
| 829 gfx::Rect(SurfaceSize()), |
| 830 root_passes, |
| 831 arraysize(root_passes)); |
| 832 |
| 833 root_pass_list.at(0) |
| 834 ->shared_quad_state_list[0] |
| 835 ->content_to_target_transform.Translate(0, 10); |
| 836 root_pass_list.at(0)->damage_rect = gfx::Rect(5, 5, 10, 10); |
| 837 |
| 838 scoped_ptr<DelegatedFrameData> root_frame_data(new DelegatedFrameData); |
| 839 root_pass_list.swap(root_frame_data->render_pass_list); |
| 840 |
| 841 scoped_ptr<CompositorFrame> root_frame(new CompositorFrame); |
| 842 root_frame->delegated_frame_data = root_frame_data.Pass(); |
| 843 |
| 844 factory_.SubmitFrame(root_surface_id_, root_frame.Pass(), base::Closure()); |
| 845 |
| 846 scoped_ptr<CompositorFrame> aggregated_frame = |
| 847 aggregator_.Aggregate(root_surface_id_); |
| 848 |
| 849 ASSERT_TRUE(aggregated_frame); |
| 850 ASSERT_TRUE(aggregated_frame->delegated_frame_data); |
| 851 |
| 852 DelegatedFrameData* frame_data = aggregated_frame->delegated_frame_data.get(); |
| 853 |
| 854 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; |
| 855 |
| 856 ASSERT_EQ(1u, aggregated_pass_list.size()); |
| 857 |
| 858 // Damage rect for first aggregation should contain entire root surface. |
| 859 EXPECT_TRUE( |
| 860 aggregated_pass_list[0]->damage_rect.Contains(gfx::Rect(SurfaceSize()))); |
| 861 |
| 862 { |
| 863 AddPasses(&child_pass_list, |
| 864 gfx::Rect(SurfaceSize()), |
| 865 child_passes, |
| 866 arraysize(child_passes)); |
| 867 |
| 868 RenderPass* child_root_pass = child_pass_list.at(0u); |
| 869 SharedQuadState* child_root_pass_sqs = |
| 870 child_root_pass->shared_quad_state_list[0]; |
| 871 child_root_pass_sqs->content_to_target_transform.Translate(8, 0); |
| 872 child_root_pass->damage_rect = gfx::Rect(10, 10, 10, 10); |
| 873 |
| 874 scoped_ptr<DelegatedFrameData> child_frame_data(new DelegatedFrameData); |
| 875 child_pass_list.swap(child_frame_data->render_pass_list); |
| 876 |
| 877 scoped_ptr<CompositorFrame> child_frame(new CompositorFrame); |
| 878 child_frame->delegated_frame_data = child_frame_data.Pass(); |
| 879 |
| 880 factory_.SubmitFrame(child_surface_id, child_frame.Pass(), base::Closure()); |
| 881 |
| 882 scoped_ptr<CompositorFrame> aggregated_frame = |
| 883 aggregator_.Aggregate(root_surface_id_); |
| 884 |
| 885 ASSERT_TRUE(aggregated_frame); |
| 886 ASSERT_TRUE(aggregated_frame->delegated_frame_data); |
| 887 |
| 888 DelegatedFrameData* frame_data = |
| 889 aggregated_frame->delegated_frame_data.get(); |
| 890 |
| 891 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; |
| 892 |
| 893 ASSERT_EQ(1u, aggregated_pass_list.size()); |
| 894 |
| 895 // Outer surface didn't change, so transformed inner damage rect should be |
| 896 // used. |
| 897 EXPECT_EQ(gfx::Rect(10, 20, 10, 10).ToString(), |
| 898 aggregated_pass_list[0]->damage_rect.ToString()); |
| 899 } |
| 900 |
| 901 { |
| 902 RenderPassList root_pass_list; |
| 903 AddPasses(&root_pass_list, |
| 904 gfx::Rect(SurfaceSize()), |
| 905 root_passes, |
| 906 arraysize(root_passes)); |
| 907 |
| 908 root_pass_list.at(0) |
| 909 ->shared_quad_state_list[0] |
| 910 ->content_to_target_transform.Translate(0, 10); |
| 911 root_pass_list.at(0)->damage_rect = gfx::Rect(0, 0, 1, 1); |
| 912 |
| 913 scoped_ptr<DelegatedFrameData> root_frame_data(new DelegatedFrameData); |
| 914 root_pass_list.swap(root_frame_data->render_pass_list); |
| 915 |
| 916 scoped_ptr<CompositorFrame> root_frame(new CompositorFrame); |
| 917 root_frame->delegated_frame_data = root_frame_data.Pass(); |
| 918 |
| 919 factory_.SubmitFrame(root_surface_id_, root_frame.Pass(), base::Closure()); |
| 920 } |
| 921 |
| 922 { |
| 923 RenderPassList root_pass_list; |
| 924 AddPasses(&root_pass_list, |
| 925 gfx::Rect(SurfaceSize()), |
| 926 root_passes, |
| 927 arraysize(root_passes)); |
| 928 |
| 929 root_pass_list.at(0) |
| 930 ->shared_quad_state_list[0] |
| 931 ->content_to_target_transform.Translate(0, 10); |
| 932 root_pass_list.at(0)->damage_rect = gfx::Rect(1, 1, 1, 1); |
| 933 |
| 934 scoped_ptr<DelegatedFrameData> root_frame_data(new DelegatedFrameData); |
| 935 root_pass_list.swap(root_frame_data->render_pass_list); |
| 936 |
| 937 scoped_ptr<CompositorFrame> root_frame(new CompositorFrame); |
| 938 root_frame->delegated_frame_data = root_frame_data.Pass(); |
| 939 |
| 940 factory_.SubmitFrame(root_surface_id_, root_frame.Pass(), base::Closure()); |
| 941 |
| 942 scoped_ptr<CompositorFrame> aggregated_frame = |
| 943 aggregator_.Aggregate(root_surface_id_); |
| 944 |
| 945 ASSERT_TRUE(aggregated_frame); |
| 946 ASSERT_TRUE(aggregated_frame->delegated_frame_data); |
| 947 |
| 948 DelegatedFrameData* frame_data = |
| 949 aggregated_frame->delegated_frame_data.get(); |
| 950 |
| 951 const RenderPassList& aggregated_pass_list = frame_data->render_pass_list; |
| 952 |
| 953 ASSERT_EQ(1u, aggregated_pass_list.size()); |
| 954 |
| 955 // The root surface was enqueued without being aggregated once, so it should |
| 956 // be treated as completely damaged. |
| 957 EXPECT_TRUE(aggregated_pass_list[0]->damage_rect.Contains( |
| 958 gfx::Rect(SurfaceSize()))); |
| 959 } |
| 960 |
| 961 factory_.Destroy(child_surface_id); |
| 962 } |
| 963 |
| 800 class SurfaceAggregatorWithResourcesTest : public testing::Test { | 964 class SurfaceAggregatorWithResourcesTest : public testing::Test { |
| 801 public: | 965 public: |
| 802 virtual void SetUp() { | 966 virtual void SetUp() { |
| 803 output_surface_ = FakeOutputSurface::CreateSoftware( | 967 output_surface_ = FakeOutputSurface::CreateSoftware( |
| 804 make_scoped_ptr(new SoftwareOutputDevice)); | 968 make_scoped_ptr(new SoftwareOutputDevice)); |
| 805 output_surface_->BindToClient(&output_surface_client_); | 969 output_surface_->BindToClient(&output_surface_client_); |
| 806 shared_bitmap_manager_.reset(new TestSharedBitmapManager); | 970 shared_bitmap_manager_.reset(new TestSharedBitmapManager); |
| 807 | 971 |
| 808 resource_provider_ = ResourceProvider::Create(output_surface_.get(), | 972 resource_provider_ = ResourceProvider::Create(output_surface_.get(), |
| 809 shared_bitmap_manager_.get(), | 973 shared_bitmap_manager_.get(), |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 892 | 1056 |
| 893 TEST_F(SurfaceAggregatorWithResourcesTest, TakeResourcesOneSurface) { | 1057 TEST_F(SurfaceAggregatorWithResourcesTest, TakeResourcesOneSurface) { |
| 894 ResourceTrackingSurfaceFactoryClient client; | 1058 ResourceTrackingSurfaceFactoryClient client; |
| 895 SurfaceFactory factory(&manager_, &client); | 1059 SurfaceFactory factory(&manager_, &client); |
| 896 SurfaceId surface_id(7u); | 1060 SurfaceId surface_id(7u); |
| 897 factory.Create(surface_id, SurfaceSize()); | 1061 factory.Create(surface_id, SurfaceSize()); |
| 898 | 1062 |
| 899 ResourceProvider::ResourceId ids[] = {11, 12, 13}; | 1063 ResourceProvider::ResourceId ids[] = {11, 12, 13}; |
| 900 SubmitFrameWithResources(ids, arraysize(ids), &factory, surface_id); | 1064 SubmitFrameWithResources(ids, arraysize(ids), &factory, surface_id); |
| 901 | 1065 |
| 902 std::set<SurfaceId> surface_set; | 1066 scoped_ptr<CompositorFrame> frame = aggregator_->Aggregate(surface_id); |
| 903 scoped_ptr<CompositorFrame> frame = | |
| 904 aggregator_->Aggregate(surface_id, &surface_set); | |
| 905 | 1067 |
| 906 // Nothing should be available to be returned yet. | 1068 // Nothing should be available to be returned yet. |
| 907 EXPECT_TRUE(client.returned_resources().empty()); | 1069 EXPECT_TRUE(client.returned_resources().empty()); |
| 908 | 1070 |
| 909 SubmitFrameWithResources(NULL, 0u, &factory, surface_id); | 1071 SubmitFrameWithResources(NULL, 0u, &factory, surface_id); |
| 910 | 1072 |
| 911 surface_set.clear(); | 1073 frame = aggregator_->Aggregate(surface_id); |
| 912 frame = aggregator_->Aggregate(surface_id, &surface_set); | |
| 913 | 1074 |
| 914 ASSERT_EQ(3u, client.returned_resources().size()); | 1075 ASSERT_EQ(3u, client.returned_resources().size()); |
| 915 ResourceProvider::ResourceId returned_ids[3]; | 1076 ResourceProvider::ResourceId returned_ids[3]; |
| 916 for (size_t i = 0; i < 3; ++i) { | 1077 for (size_t i = 0; i < 3; ++i) { |
| 917 returned_ids[i] = client.returned_resources()[i].id; | 1078 returned_ids[i] = client.returned_resources()[i].id; |
| 918 } | 1079 } |
| 919 EXPECT_THAT(returned_ids, | 1080 EXPECT_THAT(returned_ids, |
| 920 testing::WhenSorted(testing::ElementsAreArray(ids))); | 1081 testing::WhenSorted(testing::ElementsAreArray(ids))); |
| 921 factory.Destroy(surface_id); | 1082 factory.Destroy(surface_id); |
| 922 } | 1083 } |
| 923 | 1084 |
| 924 } // namespace | 1085 } // namespace |
| 925 } // namespace cc | 1086 } // namespace cc |
| 926 | 1087 |
| OLD | NEW |