OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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/compositor_frame_sink_support.h" | 5 #include "cc/surfaces/compositor_frame_sink_support.h" |
6 | 6 |
7 #include "base/macros.h" | 7 #include "base/macros.h" |
8 #include "cc/output/compositor_frame.h" | 8 #include "cc/output/compositor_frame.h" |
9 #include "cc/surfaces/compositor_frame_sink_support_client.h" | 9 #include "cc/surfaces/compositor_frame_sink_support_client.h" |
10 #include "cc/surfaces/frame_sink_id.h" | 10 #include "cc/surfaces/frame_sink_id.h" |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 } | 104 } |
105 | 105 |
106 SurfaceManager& surface_manager() { return surface_manager_; } | 106 SurfaceManager& surface_manager() { return surface_manager_; } |
107 | 107 |
108 // Returns all the references where |surface_id| is the parent. | 108 // Returns all the references where |surface_id| is the parent. |
109 const SurfaceManager::SurfaceIdSet& GetChildReferences( | 109 const SurfaceManager::SurfaceIdSet& GetChildReferences( |
110 const SurfaceId& surface_id) { | 110 const SurfaceId& surface_id) { |
111 return surface_manager().parent_to_child_refs_[surface_id]; | 111 return surface_manager().parent_to_child_refs_[surface_id]; |
112 } | 112 } |
113 | 113 |
114 // Returns all the temporary references for the given frame sink id. | 114 // Returns true if there is a temporary reference for |surface_id|. |
115 std::vector<LocalSurfaceId> GetTempReferences( | 115 bool HasTemporaryReference(const SurfaceId& surface_id) { |
116 const FrameSinkId& frame_sink_id) { | 116 return surface_manager().HasTemporaryReference(surface_id); |
117 return surface_manager().temp_references_[frame_sink_id]; | |
118 } | 117 } |
119 | 118 |
120 SurfaceDependencyTracker& dependency_tracker() { | 119 SurfaceDependencyTracker& dependency_tracker() { |
121 return *surface_manager_.dependency_tracker(); | 120 return *surface_manager_.dependency_tracker(); |
122 } | 121 } |
123 | 122 |
124 FakeExternalBeginFrameSource* begin_frame_source() { | 123 FakeExternalBeginFrameSource* begin_frame_source() { |
125 return begin_frame_source_.get(); | 124 return begin_frame_source_.get(); |
126 } | 125 } |
127 | 126 |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 const SurfaceId display_id_first = MakeSurfaceId(kDisplayFrameSink, 1); | 189 const SurfaceId display_id_first = MakeSurfaceId(kDisplayFrameSink, 1); |
191 const SurfaceId display_id_second = MakeSurfaceId(kDisplayFrameSink, 2); | 190 const SurfaceId display_id_second = MakeSurfaceId(kDisplayFrameSink, 2); |
192 | 191 |
193 // Submit a CompositorFrame for the first display root surface. | 192 // Submit a CompositorFrame for the first display root surface. |
194 display_support().SubmitCompositorFrame( | 193 display_support().SubmitCompositorFrame( |
195 display_id_first.local_surface_id(), | 194 display_id_first.local_surface_id(), |
196 MakeCompositorFrame({MakeSurfaceId(kParentFrameSink, 1)})); | 195 MakeCompositorFrame({MakeSurfaceId(kParentFrameSink, 1)})); |
197 | 196 |
198 // A surface reference from the top-level root is added and there shouldn't be | 197 // A surface reference from the top-level root is added and there shouldn't be |
199 // a temporary reference. | 198 // a temporary reference. |
200 EXPECT_THAT(GetTempReferences(kDisplayFrameSink), IsEmpty()); | 199 EXPECT_FALSE(HasTemporaryReference(display_id_first)); |
201 EXPECT_THAT(GetChildReferences(surface_manager().GetRootSurfaceId()), | 200 EXPECT_THAT(GetChildReferences(surface_manager().GetRootSurfaceId()), |
202 UnorderedElementsAre(display_id_first)); | 201 UnorderedElementsAre(display_id_first)); |
203 | 202 |
204 // Submit a CompositorFrame for the second display root surface. | 203 // Submit a CompositorFrame for the second display root surface. |
205 display_support().SubmitCompositorFrame( | 204 display_support().SubmitCompositorFrame( |
206 display_id_second.local_surface_id(), | 205 display_id_second.local_surface_id(), |
207 MakeCompositorFrame({MakeSurfaceId(kParentFrameSink, 2)})); | 206 MakeCompositorFrame({MakeSurfaceId(kParentFrameSink, 2)})); |
208 | 207 |
209 // A surface reference from the top-level root to |display_id_second| should | 208 // A surface reference from the top-level root to |display_id_second| should |
210 // be added and the reference to |display_root_first| removed. | 209 // be added and the reference to |display_root_first| removed. |
211 EXPECT_THAT(GetTempReferences(kDisplayFrameSink), IsEmpty()); | 210 EXPECT_FALSE(HasTemporaryReference(display_id_second)); |
212 EXPECT_THAT(GetChildReferences(surface_manager().GetRootSurfaceId()), | 211 EXPECT_THAT(GetChildReferences(surface_manager().GetRootSurfaceId()), |
213 UnorderedElementsAre(display_id_second)); | 212 UnorderedElementsAre(display_id_second)); |
214 | 213 |
215 // Surface |display_id_first| is unreachable and should get deleted. | 214 // Surface |display_id_first| is unreachable and should get deleted. |
216 EXPECT_EQ(nullptr, surface_manager().GetSurfaceForId(display_id_first)); | 215 EXPECT_EQ(nullptr, surface_manager().GetSurfaceForId(display_id_first)); |
217 } | 216 } |
218 | 217 |
219 // The parent Surface is blocked on |child_id1| and |child_id2|. | 218 // The parent Surface is blocked on |child_id1| and |child_id2|. |
220 TEST_F(CompositorFrameSinkSupportTest, DisplayCompositorLockingBlockedOnTwo) { | 219 TEST_F(CompositorFrameSinkSupportTest, DisplayCompositorLockingBlockedOnTwo) { |
221 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); | 220 const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); |
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
605 child_support1().SubmitCompositorFrame( | 604 child_support1().SubmitCompositorFrame( |
606 child_id.local_surface_id(), MakeCompositorFrame(empty_surface_ids())); | 605 child_id.local_surface_id(), MakeCompositorFrame(empty_surface_ids())); |
607 | 606 |
608 // Verify that the child CompositorFrame activates immediately. | 607 // Verify that the child CompositorFrame activates immediately. |
609 EXPECT_TRUE(child_surface1()->HasActiveFrame()); | 608 EXPECT_TRUE(child_surface1()->HasActiveFrame()); |
610 EXPECT_FALSE(child_surface1()->HasPendingFrame()); | 609 EXPECT_FALSE(child_surface1()->HasPendingFrame()); |
611 EXPECT_THAT(child_surface1()->blocking_surfaces_for_testing(), IsEmpty()); | 610 EXPECT_THAT(child_surface1()->blocking_surfaces_for_testing(), IsEmpty()); |
612 | 611 |
613 // Verify that there is no temporary reference for the child and that | 612 // Verify that there is no temporary reference for the child and that |
614 // the reference from the parent to the child still exists. | 613 // the reference from the parent to the child still exists. |
615 EXPECT_THAT(GetTempReferences(child_id.frame_sink_id()), IsEmpty()); | 614 EXPECT_FALSE(HasTemporaryReference(child_id)); |
616 EXPECT_THAT(GetChildReferences(parent_id), UnorderedElementsAre(child_id)); | 615 EXPECT_THAT(GetChildReferences(parent_id), UnorderedElementsAre(child_id)); |
617 } | 616 } |
618 | 617 |
619 // The parent Surface is blocked on |child_id2| which is blocked on |child_id3|. | 618 // The parent Surface is blocked on |child_id2| which is blocked on |child_id3|. |
620 // child_support1 evicts its blocked Surface. The parent surface should | 619 // child_support1 evicts its blocked Surface. The parent surface should |
621 // activate. | 620 // activate. |
622 TEST_F(CompositorFrameSinkSupportTest, EvictSurfaceWithPendingFrame) { | 621 TEST_F(CompositorFrameSinkSupportTest, EvictSurfaceWithPendingFrame) { |
623 const SurfaceId parent_id1 = MakeSurfaceId(kParentFrameSink, 1); | 622 const SurfaceId parent_id1 = MakeSurfaceId(kParentFrameSink, 1); |
624 const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1); | 623 const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1); |
625 const SurfaceId child_id2 = MakeSurfaceId(kChildFrameSink2, 1); | 624 const SurfaceId child_id2 = MakeSurfaceId(kChildFrameSink2, 1); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
688 EXPECT_FALSE(child_surface1()->HasPendingFrame()); | 687 EXPECT_FALSE(child_surface1()->HasPendingFrame()); |
689 EXPECT_THAT(child_surface1()->blocking_surfaces_for_testing(), IsEmpty()); | 688 EXPECT_THAT(child_surface1()->blocking_surfaces_for_testing(), IsEmpty()); |
690 | 689 |
691 // Verify that the parent Surface has activated. | 690 // Verify that the parent Surface has activated. |
692 EXPECT_TRUE(parent_surface()->HasActiveFrame()); | 691 EXPECT_TRUE(parent_surface()->HasActiveFrame()); |
693 EXPECT_FALSE(parent_surface()->HasPendingFrame()); | 692 EXPECT_FALSE(parent_surface()->HasPendingFrame()); |
694 EXPECT_THAT(parent_surface()->blocking_surfaces_for_testing(), IsEmpty()); | 693 EXPECT_THAT(parent_surface()->blocking_surfaces_for_testing(), IsEmpty()); |
695 | 694 |
696 // Verify that there is no temporary reference for the child and that | 695 // Verify that there is no temporary reference for the child and that |
697 // the reference from the parent to the child still exists. | 696 // the reference from the parent to the child still exists. |
698 EXPECT_THAT(GetTempReferences(child_id1.frame_sink_id()), IsEmpty()); | 697 EXPECT_FALSE(HasTemporaryReference(child_id1)); |
699 EXPECT_THAT(GetChildReferences(parent_id), UnorderedElementsAre(child_id1)); | 698 EXPECT_THAT(GetChildReferences(parent_id), UnorderedElementsAre(child_id1)); |
700 | 699 |
701 // The parent submits another CompositorFrame that depends on |child_id2|. | 700 // The parent submits another CompositorFrame that depends on |child_id2|. |
702 parent_support().SubmitCompositorFrame(parent_id.local_surface_id(), | 701 parent_support().SubmitCompositorFrame(parent_id.local_surface_id(), |
703 MakeCompositorFrame({child_id2})); | 702 MakeCompositorFrame({child_id2})); |
704 | 703 |
705 // The parent surface should now have both a pending and activate | 704 // The parent surface should now have both a pending and activate |
706 // CompositorFrame. Verify that the set of child references from | 705 // CompositorFrame. Verify that the set of child references from |
707 // |parent_id| include both the pending and active CompositorFrames. | 706 // |parent_id| include both the pending and active CompositorFrames. |
708 EXPECT_TRUE(parent_surface()->HasActiveFrame()); | 707 EXPECT_TRUE(parent_surface()->HasActiveFrame()); |
(...skipping 10 matching lines...) Expand all Loading... |
719 // CompositorFrame. Also verify that |child_id1| is no longer a child | 718 // CompositorFrame. Also verify that |child_id1| is no longer a child |
720 // reference of |parent_id|. | 719 // reference of |parent_id|. |
721 EXPECT_TRUE(parent_surface()->HasActiveFrame()); | 720 EXPECT_TRUE(parent_surface()->HasActiveFrame()); |
722 EXPECT_FALSE(parent_surface()->HasPendingFrame()); | 721 EXPECT_FALSE(parent_surface()->HasPendingFrame()); |
723 EXPECT_THAT(parent_surface()->blocking_surfaces_for_testing(), IsEmpty()); | 722 EXPECT_THAT(parent_surface()->blocking_surfaces_for_testing(), IsEmpty()); |
724 EXPECT_THAT(GetChildReferences(parent_id), UnorderedElementsAre(child_id2)); | 723 EXPECT_THAT(GetChildReferences(parent_id), UnorderedElementsAre(child_id2)); |
725 } | 724 } |
726 | 725 |
727 } // namespace test | 726 } // namespace test |
728 } // namespace cc | 727 } // namespace cc |
OLD | NEW |