Index: cc/surfaces/compositor_frame_sink_support_unittest.cc |
diff --git a/cc/surfaces/compositor_frame_sink_support_unittest.cc b/cc/surfaces/compositor_frame_sink_support_unittest.cc |
index 027022e8bc66d2b86487e1ffd7c8127a2591e7a8..7451f8cb5d7c68e4c5dbdf52f8848ab3f38738ad 100644 |
--- a/cc/surfaces/compositor_frame_sink_support_unittest.cc |
+++ b/cc/surfaces/compositor_frame_sink_support_unittest.cc |
@@ -111,7 +111,7 @@ CompositorFrame MakeCompositorFrame( |
CompositorFrame MakeCompositorFrameWithResources( |
std::vector<SurfaceId> activation_dependencies, |
TransferableResourceArray resource_list) { |
- return MakeCompositorFrame(activation_dependencies, activation_dependencies, |
+ return MakeCompositorFrame(activation_dependencies, empty_surface_ids(), |
std::move(resource_list)); |
} |
@@ -293,7 +293,7 @@ TEST_F(CompositorFrameSinkSupportTest, DisplayCompositorLockingBlockedOnTwo) { |
parent_support().SubmitCompositorFrame( |
parent_id.local_surface_id(), |
- MakeCompositorFrame({child_id1, child_id2})); |
+ MakeCompositorFrame({child_id1, child_id2}, empty_surface_ids())); |
// parent_support is blocked on |child_id1| and |child_id2|. |
EXPECT_TRUE(dependency_tracker().has_deadline()); |
@@ -304,8 +304,8 @@ TEST_F(CompositorFrameSinkSupportTest, DisplayCompositorLockingBlockedOnTwo) { |
// Submit a CompositorFrame without any dependencies to |child_id1|. |
// parent_support should now only be blocked on |child_id2|. |
- child_support1().SubmitCompositorFrame( |
- child_id1.local_surface_id(), MakeCompositorFrame(empty_surface_ids())); |
+ child_support1().SubmitCompositorFrame(child_id1.local_surface_id(), |
+ MakeCompositorFrame()); |
EXPECT_TRUE(dependency_tracker().has_deadline()); |
EXPECT_FALSE(parent_surface()->HasActiveFrame()); |
@@ -315,8 +315,8 @@ TEST_F(CompositorFrameSinkSupportTest, DisplayCompositorLockingBlockedOnTwo) { |
// Submit a CompositorFrame without any dependencies to |child_id2|. |
// parent_support should be activated. |
- child_support2().SubmitCompositorFrame( |
- child_id2.local_surface_id(), MakeCompositorFrame(empty_surface_ids())); |
+ child_support2().SubmitCompositorFrame(child_id2.local_surface_id(), |
+ MakeCompositorFrame()); |
EXPECT_FALSE(dependency_tracker().has_deadline()); |
EXPECT_TRUE(parent_surface()->HasActiveFrame()); |
@@ -330,8 +330,9 @@ TEST_F(CompositorFrameSinkSupportTest, DisplayCompositorLockingBlockedChain) { |
const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1); |
const SurfaceId child_id2 = MakeSurfaceId(kChildFrameSink2, 1); |
- parent_support().SubmitCompositorFrame(parent_id.local_surface_id(), |
- MakeCompositorFrame({child_id1})); |
+ parent_support().SubmitCompositorFrame( |
+ parent_id.local_surface_id(), |
+ MakeCompositorFrame({child_id1}, empty_surface_ids())); |
// parent_support is blocked on |child_id1|. |
EXPECT_TRUE(dependency_tracker().has_deadline()); |
@@ -342,8 +343,9 @@ TEST_F(CompositorFrameSinkSupportTest, DisplayCompositorLockingBlockedChain) { |
// The parent should not report damage until it activates. |
EXPECT_FALSE(IsSurfaceDamaged(parent_id)); |
- child_support1().SubmitCompositorFrame(child_id1.local_surface_id(), |
- MakeCompositorFrame({child_id2})); |
+ child_support1().SubmitCompositorFrame( |
+ child_id1.local_surface_id(), |
+ MakeCompositorFrame({child_id2}, empty_surface_ids())); |
// child_support1 should now be blocked on |child_id2|. |
EXPECT_TRUE(dependency_tracker().has_deadline()); |
@@ -390,8 +392,9 @@ TEST_F(CompositorFrameSinkSupportTest, |
const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1); |
const SurfaceId child_id2 = MakeSurfaceId(kChildFrameSink2, 1); |
- parent_support().SubmitCompositorFrame(parent_id.local_surface_id(), |
- MakeCompositorFrame({child_id2})); |
+ parent_support().SubmitCompositorFrame( |
+ parent_id.local_surface_id(), |
+ MakeCompositorFrame({child_id2}, empty_surface_ids())); |
// parent_support is blocked on |child_id2|. |
EXPECT_TRUE(dependency_tracker().has_deadline()); |
@@ -401,8 +404,9 @@ TEST_F(CompositorFrameSinkSupportTest, |
UnorderedElementsAre(child_id2)); |
// child_support1 should now be blocked on |child_id2|. |
- child_support1().SubmitCompositorFrame(child_id1.local_surface_id(), |
- MakeCompositorFrame({child_id2})); |
+ child_support1().SubmitCompositorFrame( |
+ child_id1.local_surface_id(), |
+ MakeCompositorFrame({child_id2}, empty_surface_ids())); |
EXPECT_TRUE(dependency_tracker().has_deadline()); |
EXPECT_FALSE(child_surface1()->HasActiveFrame()); |
@@ -416,8 +420,8 @@ TEST_F(CompositorFrameSinkSupportTest, |
// Submit a CompositorFrame without any dependencies to |child_id2|. |
// parent_support should be activated. |
- child_support2().SubmitCompositorFrame( |
- child_id2.local_surface_id(), MakeCompositorFrame(empty_surface_ids())); |
+ child_support2().SubmitCompositorFrame(child_id2.local_surface_id(), |
+ MakeCompositorFrame()); |
EXPECT_FALSE(dependency_tracker().has_deadline()); |
@@ -439,8 +443,9 @@ TEST_F(CompositorFrameSinkSupportTest, DisplayCompositorLockingDeadlineHits) { |
const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1); |
const SurfaceId child_id2 = MakeSurfaceId(kChildFrameSink2, 1); |
- parent_support().SubmitCompositorFrame(parent_id.local_surface_id(), |
- MakeCompositorFrame({child_id1})); |
+ parent_support().SubmitCompositorFrame( |
+ parent_id.local_surface_id(), |
+ MakeCompositorFrame({child_id1}, empty_surface_ids())); |
// parent_support is blocked on |child_id1|. |
EXPECT_TRUE(dependency_tracker().has_deadline()); |
@@ -449,8 +454,9 @@ TEST_F(CompositorFrameSinkSupportTest, DisplayCompositorLockingDeadlineHits) { |
EXPECT_THAT(parent_surface()->blocking_surfaces(), |
UnorderedElementsAre(child_id1)); |
- child_support1().SubmitCompositorFrame(child_id1.local_surface_id(), |
- MakeCompositorFrame({child_id2})); |
+ child_support1().SubmitCompositorFrame( |
+ child_id1.local_surface_id(), |
+ MakeCompositorFrame({child_id2}, empty_surface_ids())); |
// child_support1 should now be blocked on |child_id2|. |
EXPECT_TRUE(dependency_tracker().has_deadline()); |
@@ -509,8 +515,9 @@ TEST_F(CompositorFrameSinkSupportTest, |
CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1); |
for (int i = 0; i < 3; ++i) { |
LocalSurfaceId local_surface_id(1, base::UnguessableToken::Create()); |
- support(i).SubmitCompositorFrame(local_surface_id, |
- MakeCompositorFrame({arbitrary_id})); |
+ support(i).SubmitCompositorFrame( |
+ local_surface_id, |
+ MakeCompositorFrame({arbitrary_id}, empty_surface_ids())); |
// The deadline has been set. |
EXPECT_TRUE(dependency_tracker().has_deadline()); |
@@ -541,8 +548,9 @@ TEST_F(CompositorFrameSinkSupportTest, |
const SurfaceId arbitrary_id = MakeSurfaceId(kArbitraryFrameSink, 1); |
// Submit a CompositorFrame that depends on |arbitrary_id|. |
- parent_support().SubmitCompositorFrame(parent_id.local_surface_id(), |
- MakeCompositorFrame({arbitrary_id})); |
+ parent_support().SubmitCompositorFrame( |
+ parent_id.local_surface_id(), |
+ MakeCompositorFrame({arbitrary_id}, empty_surface_ids())); |
// Verify that the CompositorFrame is blocked on |arbitrary_id|. |
EXPECT_FALSE(parent_surface()->HasActiveFrame()); |
@@ -551,8 +559,8 @@ TEST_F(CompositorFrameSinkSupportTest, |
UnorderedElementsAre(arbitrary_id)); |
// Submit a CompositorFrame that has no dependencies. |
- parent_support().SubmitCompositorFrame( |
- parent_id.local_surface_id(), MakeCompositorFrame(empty_surface_ids())); |
+ parent_support().SubmitCompositorFrame(parent_id.local_surface_id(), |
+ MakeCompositorFrame()); |
// Verify that the CompositorFrame has been activated. |
EXPECT_TRUE(parent_surface()->HasActiveFrame()); |
@@ -592,7 +600,7 @@ TEST_F(CompositorFrameSinkSupportTest, |
EXPECT_CALL(support_client_, DidReceiveCompositorFrameAck(_)).Times(0); |
parent_support().SubmitCompositorFrame( |
parent_id.local_surface_id(), |
- MakeCompositorFrame({child_id1, child_id2})); |
+ MakeCompositorFrame({child_id2}, {child_id1})); |
EXPECT_FALSE(parent_surface()->HasActiveFrame()); |
EXPECT_TRUE(parent_surface()->HasPendingFrame()); |
EXPECT_THAT(parent_surface()->blocking_surfaces(), |
@@ -623,8 +631,7 @@ TEST_F(CompositorFrameSinkSupportTest, |
EXPECT_FALSE(parent_surface()->HasPendingFrame()); |
EXPECT_THAT(parent_surface()->blocking_surfaces(), IsEmpty()); |
EXPECT_FALSE(HasTemporaryReference(child_id1)); |
- EXPECT_THAT(GetChildReferences(parent_id), |
- UnorderedElementsAre(child_id1, child_id2)); |
+ EXPECT_THAT(GetChildReferences(parent_id), UnorderedElementsAre(child_id1)); |
} |
// This test verifies that we do not double count returned resources when a |
@@ -687,8 +694,9 @@ TEST_F(CompositorFrameSinkSupportTest, EvictSurfaceWithPendingFrame) { |
const SurfaceId child_id2 = MakeSurfaceId(kChildFrameSink2, 1); |
// Submit a CompositorFrame that depends on |child_id1|. |
- parent_support().SubmitCompositorFrame(parent_id1.local_surface_id(), |
- MakeCompositorFrame({child_id1})); |
+ parent_support().SubmitCompositorFrame( |
+ parent_id1.local_surface_id(), |
+ MakeCompositorFrame({child_id1}, empty_surface_ids())); |
// Verify that the CompositorFrame is blocked on |child_id1|. |
EXPECT_FALSE(parent_surface()->HasActiveFrame()); |
@@ -697,8 +705,9 @@ TEST_F(CompositorFrameSinkSupportTest, EvictSurfaceWithPendingFrame) { |
UnorderedElementsAre(child_id1)); |
// Submit a CompositorFrame that depends on |child_id2|. |
- child_support1().SubmitCompositorFrame(child_id1.local_surface_id(), |
- MakeCompositorFrame({child_id2})); |
+ child_support1().SubmitCompositorFrame( |
+ child_id1.local_surface_id(), |
+ MakeCompositorFrame({child_id2}, empty_surface_ids())); |
// Verify that the CompositorFrame is blocked on |child_id2|. |
EXPECT_FALSE(child_surface1()->HasActiveFrame()); |
@@ -730,8 +739,9 @@ TEST_F(CompositorFrameSinkSupportTest, DropStaleReferencesAfterActivation) { |
// The parent submits a CompositorFrame that depends on |child_id1| before the |
// child submits a CompositorFrame. |
EXPECT_CALL(support_client_, DidReceiveCompositorFrameAck(_)).Times(0); |
- parent_support().SubmitCompositorFrame(parent_id.local_surface_id(), |
- MakeCompositorFrame({child_id1})); |
+ parent_support().SubmitCompositorFrame( |
+ parent_id.local_surface_id(), |
+ MakeCompositorFrame({child_id1}, empty_surface_ids())); |
// Verify that the CompositorFrame is blocked on |child_id|. |
EXPECT_FALSE(parent_surface()->HasActiveFrame()); |
@@ -746,8 +756,8 @@ TEST_F(CompositorFrameSinkSupportTest, DropStaleReferencesAfterActivation) { |
// DidReceiveCompositorFrameAck should get called twice: once for the child |
// and once for the now active parent CompositorFrame. |
EXPECT_CALL(support_client_, DidReceiveCompositorFrameAck(_)).Times(2); |
- child_support1().SubmitCompositorFrame( |
- child_id1.local_surface_id(), MakeCompositorFrame(empty_surface_ids())); |
+ child_support1().SubmitCompositorFrame(child_id1.local_surface_id(), |
+ MakeCompositorFrame()); |
testing::Mock::VerifyAndClearExpectations(&support_client_); |
// Verify that the child CompositorFrame activates immediately. |
@@ -760,6 +770,16 @@ TEST_F(CompositorFrameSinkSupportTest, DropStaleReferencesAfterActivation) { |
EXPECT_FALSE(parent_surface()->HasPendingFrame()); |
EXPECT_THAT(parent_surface()->blocking_surfaces(), IsEmpty()); |
+ // Submit a new parent CompositorFrame to add a reference. |
+ parent_support().SubmitCompositorFrame( |
+ parent_id.local_surface_id(), |
+ MakeCompositorFrame(empty_surface_ids(), {child_id1})); |
+ |
+ // Verify that the parent Surface has activated. |
+ EXPECT_TRUE(parent_surface()->HasActiveFrame()); |
+ EXPECT_FALSE(parent_surface()->HasPendingFrame()); |
+ EXPECT_THAT(parent_surface()->blocking_surfaces(), IsEmpty()); |
+ |
// Verify that there is no temporary reference for the child and that |
// the reference from the parent to the child still exists. |
EXPECT_FALSE(HasTemporaryReference(child_id1)); |
@@ -768,8 +788,9 @@ TEST_F(CompositorFrameSinkSupportTest, DropStaleReferencesAfterActivation) { |
// The parent submits another CompositorFrame that depends on |child_id2|. |
// Submitting a pending CompositorFrame will not trigger a CompositorFrameAck. |
EXPECT_CALL(support_client_, DidReceiveCompositorFrameAck(_)).Times(0); |
- parent_support().SubmitCompositorFrame(parent_id.local_surface_id(), |
- MakeCompositorFrame({child_id2})); |
+ parent_support().SubmitCompositorFrame( |
+ parent_id.local_surface_id(), |
+ MakeCompositorFrame({child_id2}, empty_surface_ids())); |
testing::Mock::VerifyAndClearExpectations(&support_client_); |
// The parent surface should now have both a pending and activate |
@@ -781,8 +802,8 @@ TEST_F(CompositorFrameSinkSupportTest, DropStaleReferencesAfterActivation) { |
UnorderedElementsAre(child_id2)); |
EXPECT_THAT(GetChildReferences(parent_id), UnorderedElementsAre(child_id1)); |
- child_support2().SubmitCompositorFrame( |
- child_id2.local_surface_id(), MakeCompositorFrame(empty_surface_ids())); |
+ child_support2().SubmitCompositorFrame(child_id2.local_surface_id(), |
+ MakeCompositorFrame()); |
// Verify that the parent Surface has activated and no longer has a pending |
// CompositorFrame. Also verify that |child_id1| is no longer a child |
@@ -790,7 +811,9 @@ TEST_F(CompositorFrameSinkSupportTest, DropStaleReferencesAfterActivation) { |
EXPECT_TRUE(parent_surface()->HasActiveFrame()); |
EXPECT_FALSE(parent_surface()->HasPendingFrame()); |
EXPECT_THAT(parent_surface()->blocking_surfaces(), IsEmpty()); |
- EXPECT_THAT(GetChildReferences(parent_id), UnorderedElementsAre(child_id2)); |
+ // The parent will not immediately refer to the child until it submits a new |
+ // CompositorFrame with the reference. |
+ EXPECT_THAT(GetChildReferences(parent_id), IsEmpty()); |
} |
// Checks whether the latency info are moved to the new surface from the old |
@@ -893,7 +916,7 @@ TEST_F(CompositorFrameSinkSupportTest, |
ui::LatencyInfo info2; |
info2.AddLatencyNumber(latency_type2, latency_id2, latency_sequence_number2); |
- CompositorFrame frame2 = MakeCompositorFrame({child_id}); |
+ CompositorFrame frame2 = MakeCompositorFrame({child_id}, empty_surface_ids()); |
frame2.metadata.latency_info.push_back(info2); |
parent_support().SubmitCompositorFrame(parent_id1.local_surface_id(), |
@@ -976,7 +999,7 @@ TEST_F(CompositorFrameSinkSupportTest, |
ui::LatencyInfo info2; |
info2.AddLatencyNumber(latency_type2, latency_id2, latency_sequence_number2); |
- CompositorFrame frame2 = MakeCompositorFrame({child_id}); |
+ CompositorFrame frame2 = MakeCompositorFrame({child_id}, empty_surface_ids()); |
frame2.metadata.latency_info.push_back(info2); |
parent_support().SubmitCompositorFrame(parent_id2.local_surface_id(), |
@@ -1072,10 +1095,6 @@ TEST_F(CompositorFrameSinkSupportTest, SurfaceResurrection) { |
const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); |
const SurfaceId child_id = MakeSurfaceId(kChildFrameSink1, 3); |
- // Add a reference from the parent to the child. |
- parent_support().SubmitCompositorFrame(parent_id.local_surface_id(), |
- MakeCompositorFrame({child_id})); |
- |
// Create the child surface by submitting a frame to it. |
EXPECT_EQ(nullptr, surface_manager().GetSurfaceForId(child_id)); |
child_support1().SubmitCompositorFrame(child_id.local_surface_id(), |
@@ -1085,6 +1104,10 @@ TEST_F(CompositorFrameSinkSupportTest, SurfaceResurrection) { |
Surface* surface = surface_manager().GetSurfaceForId(child_id); |
EXPECT_NE(nullptr, surface); |
+ // Add a reference from the parent to the child. |
+ parent_support().SubmitCompositorFrame(parent_id.local_surface_id(), |
+ MakeCompositorFrame({child_id})); |
+ |
// Attempt to destroy the child surface. The surface must still exist since |
// the parent needs it but it will be marked as destroyed. |
child_support1().EvictFrame(); |
@@ -1110,15 +1133,15 @@ TEST_F(CompositorFrameSinkSupportTest, LocalSurfaceIdIsReusable) { |
const SurfaceId parent_id = MakeSurfaceId(kParentFrameSink, 1); |
const SurfaceId child_id = MakeSurfaceId(kChildFrameSink1, 3); |
- // Add a reference from parent. |
- parent_support().SubmitCompositorFrame(parent_id.local_surface_id(), |
- MakeCompositorFrame({child_id})); |
- |
// Submit the first frame. Creates the surface. |
child_support1().SubmitCompositorFrame(child_id.local_surface_id(), |
MakeCompositorFrame()); |
EXPECT_NE(nullptr, surface_manager().GetSurfaceForId(child_id)); |
+ // Add a reference from parent. |
+ parent_support().SubmitCompositorFrame(parent_id.local_surface_id(), |
+ MakeCompositorFrame({child_id})); |
+ |
// Remove the reference from parant. This allows us to destroy the surface. |
parent_support().SubmitCompositorFrame(parent_id.local_surface_id(), |
MakeCompositorFrame()); |
@@ -1147,10 +1170,12 @@ TEST_F(CompositorFrameSinkSupportTest, DependencyTrackingGarbageCollection) { |
const SurfaceId parent_id2 = MakeSurfaceId(kParentFrameSink, 2); |
const SurfaceId child_id = MakeSurfaceId(kChildFrameSink1, 1); |
- parent_support().SubmitCompositorFrame(parent_id1.local_surface_id(), |
- MakeCompositorFrame({child_id})); |
- display_support().SubmitCompositorFrame(display_id.local_surface_id(), |
- MakeCompositorFrame({parent_id1})); |
+ parent_support().SubmitCompositorFrame( |
+ parent_id1.local_surface_id(), |
+ MakeCompositorFrame({child_id}, empty_surface_ids())); |
+ display_support().SubmitCompositorFrame( |
+ display_id.local_surface_id(), |
+ MakeCompositorFrame({parent_id1}, empty_surface_ids())); |
EXPECT_TRUE(dependency_tracker().has_deadline()); |
@@ -1170,10 +1195,12 @@ TEST_F(CompositorFrameSinkSupportTest, DependencyTrackingGarbageCollection) { |
EXPECT_TRUE(parent_surface()->HasActiveFrame()); |
EXPECT_FALSE(parent_surface()->HasPendingFrame()); |
- parent_support().SubmitCompositorFrame(parent_id2.local_surface_id(), |
- MakeCompositorFrame({child_id})); |
- display_support().SubmitCompositorFrame(display_id.local_surface_id(), |
- MakeCompositorFrame({parent_id2})); |
+ parent_support().SubmitCompositorFrame( |
+ parent_id2.local_surface_id(), |
+ MakeCompositorFrame({child_id}, empty_surface_ids())); |
+ display_support().SubmitCompositorFrame( |
+ display_id.local_surface_id(), |
+ MakeCompositorFrame({parent_id2}, empty_surface_ids())); |
// The display surface now has two CompositorFrames. One that is pending, |
// indirectly blocked on child_id and one that is active, also indirectly |
@@ -1183,8 +1210,8 @@ TEST_F(CompositorFrameSinkSupportTest, DependencyTrackingGarbageCollection) { |
// Submitting a CompositorFrame will trigger garbage collection of the |
// |parent_id1| subtree. This should not crash. |
- child_support1().SubmitCompositorFrame( |
- child_id.local_surface_id(), MakeCompositorFrame(empty_surface_ids())); |
+ child_support1().SubmitCompositorFrame(child_id.local_surface_id(), |
+ MakeCompositorFrame()); |
} |
// This test verifies that a crash does not occur if garbage collection is |
@@ -1201,11 +1228,16 @@ TEST_F(CompositorFrameSinkSupportTest, GarbageCollectionOnDeadline) { |
const SurfaceId parent_id2 = MakeSurfaceId(kParentFrameSink, 2); |
const SurfaceId child_id = MakeSurfaceId(kChildFrameSink1, 1); |
+ // |parent_id1| is blocked on |child_id|. |
+ parent_support().SubmitCompositorFrame( |
+ parent_id1.local_surface_id(), |
+ MakeCompositorFrame({child_id}, empty_surface_ids())); |
+ |
display_support().SubmitCompositorFrame(display_id.local_surface_id(), |
MakeCompositorFrame({parent_id1})); |
- EXPECT_TRUE(display_surface()->HasPendingFrame()); |
EXPECT_TRUE(dependency_tracker().has_deadline()); |
+ EXPECT_TRUE(display_surface()->HasPendingFrame()); |
EXPECT_FALSE(display_surface()->HasActiveFrame()); |
// Advance BeginFrames to trigger a deadline. This activates the |
@@ -1221,21 +1253,17 @@ TEST_F(CompositorFrameSinkSupportTest, GarbageCollectionOnDeadline) { |
EXPECT_FALSE(display_surface()->HasPendingFrame()); |
EXPECT_TRUE(display_surface()->HasActiveFrame()); |
- // |parent_id1| is blocked on |child_id|, but |display_id|'s CompositorFrame |
- // has activated due to a deadline. |parent_id1| will be tracked by the |
- // SurfaceDependencyTracker. |
- parent_support().SubmitCompositorFrame(parent_id1.local_surface_id(), |
- MakeCompositorFrame({child_id})); |
- |
// By submitting a display CompositorFrame, and replacing the parent's |
// CompositorFrame with another surface ID, parent_id1 becomes unreachable and |
// a candidate for garbage collection. |
- display_support().SubmitCompositorFrame(display_id.local_surface_id(), |
- MakeCompositorFrame({parent_id2})); |
+ display_support().SubmitCompositorFrame( |
+ display_id.local_surface_id(), |
+ MakeCompositorFrame({parent_id2}, empty_surface_ids())); |
// Now |parent_id1| is only kept alive by the active |display_id| frame. |
- parent_support().SubmitCompositorFrame(parent_id2.local_surface_id(), |
- MakeCompositorFrame({child_id})); |
+ parent_support().SubmitCompositorFrame( |
+ parent_id2.local_surface_id(), |
+ MakeCompositorFrame({child_id}, empty_surface_ids())); |
// SurfaceDependencyTracker should now be tracking |display_id|, |parent_id1| |
// and |parent_id2|. By activating the pending |display_id| frame by deadline, |
@@ -1257,9 +1285,14 @@ TEST_F(CompositorFrameSinkSupportTest, OnlyBlockOnEmbeddedSurfaces) { |
const SurfaceId parent_id1 = MakeSurfaceId(kParentFrameSink, 1); |
const SurfaceId parent_id2 = MakeSurfaceId(kParentFrameSink, 2); |
+ // Submitting a CompositorFrame with |parent_id2| so that the display |
+ // CompositorFrame can hold a reference to it. |
+ parent_support().SubmitCompositorFrame(parent_id2.local_surface_id(), |
+ MakeCompositorFrame()); |
+ |
display_support().SubmitCompositorFrame( |
display_id.local_surface_id(), |
- MakeCompositorFrame({parent_id1}, {parent_id1, parent_id2})); |
+ MakeCompositorFrame({parent_id1}, {parent_id2})); |
EXPECT_TRUE(display_surface()->HasPendingFrame()); |
EXPECT_FALSE(display_surface()->HasActiveFrame()); |
@@ -1282,10 +1315,6 @@ TEST_F(CompositorFrameSinkSupportTest, OnlyBlockOnEmbeddedSurfaces) { |
EXPECT_FALSE(display_surface()->HasPendingFrame()); |
EXPECT_TRUE(display_surface()->HasActiveFrame()); |
EXPECT_THAT(display_surface()->blocking_surfaces(), IsEmpty()); |
- |
- // Only a reference to |parent_id1| is added because |parent_id2| does not |
- // exist. |
- EXPECT_THAT(GetChildReferences(display_id), UnorderedElementsAre(parent_id1)); |
} |
// This test verifies that a late arriving CompositorFrame activates immediately |
@@ -1295,8 +1324,9 @@ TEST_F(CompositorFrameSinkSupportTest, LateArrivingDependency) { |
const SurfaceId parent_id1 = MakeSurfaceId(kParentFrameSink, 1); |
const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1); |
- display_support().SubmitCompositorFrame(display_id.local_surface_id(), |
- MakeCompositorFrame({parent_id1})); |
+ display_support().SubmitCompositorFrame( |
+ display_id.local_surface_id(), |
+ MakeCompositorFrame({parent_id1}, empty_surface_ids())); |
EXPECT_TRUE(display_surface()->HasPendingFrame()); |
EXPECT_FALSE(display_surface()->HasActiveFrame()); |
@@ -1317,11 +1347,86 @@ TEST_F(CompositorFrameSinkSupportTest, LateArrivingDependency) { |
// A late arriving CompositorFrame should activate immediately without |
// scheduling a deadline and without waiting for dependencies to resolve. |
- parent_support().SubmitCompositorFrame(parent_id1.local_surface_id(), |
- MakeCompositorFrame({child_id1})); |
+ parent_support().SubmitCompositorFrame( |
+ parent_id1.local_surface_id(), |
+ MakeCompositorFrame({child_id1}, empty_surface_ids())); |
EXPECT_FALSE(dependency_tracker().has_deadline()); |
EXPECT_FALSE(parent_surface()->HasPendingFrame()); |
EXPECT_TRUE(parent_surface()->HasActiveFrame()); |
} |
+// This test verifies that CompositorFrames submitted to a surface referenced |
+// by a parent CompositorFrame as a fallback will be rejected and ACK'ed |
+// immediately. |
+TEST_F(CompositorFrameSinkSupportTest, FallbackSurfacesClosed) { |
+ const SurfaceId parent_id1 = MakeSurfaceId(kParentFrameSink, 1); |
+ // This is the fallback child surface that the parent holds a reference to. |
+ const SurfaceId child_id1 = MakeSurfaceId(kChildFrameSink1, 1); |
+ // This is the primary child surface that the parent wants to block on. |
+ const SurfaceId child_id2 = MakeSurfaceId(kChildFrameSink1, 2); |
+ |
+ // child_support1 submits a CompositorFrame without any dependencies. |
+ // DidReceiveCompositorFrameAck should call on immediate activation. |
+ // However, resources will not be returned because this frame is a candidate |
+ // for display. |
+ TransferableResource resource = |
+ MakeResource(1337 /* id */, ALPHA_8 /* format */, 1234 /* filter */, |
+ gfx::Size(1234, 5678)); |
+ ReturnedResourceArray returned_resources; |
+ TransferableResource::ReturnResources({resource}, &returned_resources); |
+ |
+ EXPECT_CALL(support_client_, |
+ DidReceiveCompositorFrameAck(Eq(ReturnedResourceArray()))); |
+ child_support1().SubmitCompositorFrame( |
+ child_id1.local_surface_id(), |
+ MakeCompositorFrameWithResources(empty_surface_ids(), {resource})); |
+ testing::Mock::VerifyAndClearExpectations(&support_client_); |
+ |
+ // The parent is blocked on |child_id2| and references |child_id1|. The |
+ // surface corresponding to |child_id1| will not accept new CompositorFrames |
+ // while the parent CompositorFrame is blocked. |
+ parent_support().SubmitCompositorFrame( |
+ parent_id1.local_surface_id(), |
+ MakeCompositorFrame({child_id2}, {child_id1})); |
+ EXPECT_TRUE(dependency_tracker().has_deadline()); |
+ EXPECT_TRUE(parent_surface()->HasPendingFrame()); |
+ EXPECT_FALSE(parent_surface()->HasActiveFrame()); |
+ |
+ // Resources will be returned immediately because |child_id1|'s surface is |
+ // closed. |
+ TransferableResource resource2 = |
+ MakeResource(1246 /* id */, ALPHA_8 /* format */, 1357 /* filter */, |
+ gfx::Size(8765, 4321)); |
+ ReturnedResourceArray returned_resources2; |
+ TransferableResource::ReturnResources({resource2}, &returned_resources2); |
+ EXPECT_CALL(support_client_, |
+ DidReceiveCompositorFrameAck(Eq(returned_resources2))); |
+ child_support1().SubmitCompositorFrame( |
+ child_id1.local_surface_id(), |
+ MakeCompositorFrameWithResources(empty_surface_ids(), {resource2})); |
+ testing::Mock::VerifyAndClearExpectations(&support_client_); |
+ |
+ // Advance BeginFrames to trigger a deadline. This activates the |
+ // CompositorFrame submitted to the parent. |
+ BeginFrameArgs args = |
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1); |
+ for (int i = 0; i < 3; ++i) { |
+ begin_frame_source()->TestOnBeginFrame(args); |
+ EXPECT_TRUE(dependency_tracker().has_deadline()); |
+ } |
+ begin_frame_source()->TestOnBeginFrame(args); |
+ EXPECT_FALSE(dependency_tracker().has_deadline()); |
+ EXPECT_FALSE(parent_surface()->HasPendingFrame()); |
+ EXPECT_TRUE(parent_surface()->HasActiveFrame()); |
+ |
+ // Resources will be returned immediately because |child_id1|'s surface is |
+ // closed forever. |
+ EXPECT_CALL(support_client_, |
+ DidReceiveCompositorFrameAck(Eq(returned_resources2))); |
+ child_support1().SubmitCompositorFrame( |
+ child_id1.local_surface_id(), |
+ MakeCompositorFrameWithResources(empty_surface_ids(), {resource2})); |
+ testing::Mock::VerifyAndClearExpectations(&support_client_); |
+} |
+ |
} // namespace cc |