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/debug/stack_trace.h" | 7 #include "base/debug/stack_trace.h" |
8 #include "base/macros.h" | 8 #include "base/macros.h" |
9 #include "cc/output/compositor_frame.h" | 9 #include "cc/output/compositor_frame.h" |
10 #include "cc/surfaces/compositor_frame_sink_support_client.h" | 10 #include "cc/surfaces/compositor_frame_sink_support_client.h" |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 std::vector<SurfaceId> empty_surface_ids() { | 64 std::vector<SurfaceId> empty_surface_ids() { |
65 return std::vector<SurfaceId>(); | 65 return std::vector<SurfaceId>(); |
66 } | 66 } |
67 | 67 |
68 SurfaceId MakeSurfaceId(const FrameSinkId& frame_sink_id, uint32_t local_id) { | 68 SurfaceId MakeSurfaceId(const FrameSinkId& frame_sink_id, uint32_t local_id) { |
69 return SurfaceId( | 69 return SurfaceId( |
70 frame_sink_id, | 70 frame_sink_id, |
71 LocalSurfaceId(local_id, base::UnguessableToken::Deserialize(0, 1u))); | 71 LocalSurfaceId(local_id, base::UnguessableToken::Deserialize(0, 1u))); |
72 } | 72 } |
73 | 73 |
74 CompositorFrame MakeCompositorFrame() { | 74 CompositorFrame MakeCompositorFrame(std::vector<SurfaceId> embedded_surfaces, |
| 75 std::vector<SurfaceId> referenced_surfaces, |
| 76 TransferableResourceArray resource_list) { |
75 CompositorFrame compositor_frame; | 77 CompositorFrame compositor_frame; |
76 compositor_frame.metadata.begin_frame_ack = BeginFrameAck(0, 1, 1, true); | 78 compositor_frame.metadata.begin_frame_ack = BeginFrameAck(0, 1, 1, true); |
77 return compositor_frame; | 79 compositor_frame.metadata.embedded_surfaces = std::move(embedded_surfaces); |
78 } | |
79 | |
80 CompositorFrame MakeCompositorFrame( | |
81 std::vector<SurfaceId> referenced_surfaces) { | |
82 CompositorFrame compositor_frame; | |
83 compositor_frame.metadata.begin_frame_ack = BeginFrameAck(0, 1, 1, true); | |
84 compositor_frame.metadata.referenced_surfaces = | |
85 std::move(referenced_surfaces); | |
86 return compositor_frame; | |
87 } | |
88 | |
89 CompositorFrame MakeCompositorFrameWithResources( | |
90 std::vector<SurfaceId> referenced_surfaces, | |
91 TransferableResourceArray resource_list) { | |
92 CompositorFrame compositor_frame; | |
93 compositor_frame.metadata.begin_frame_ack = BeginFrameAck(0, 1, 1, true); | |
94 compositor_frame.metadata.referenced_surfaces = | 80 compositor_frame.metadata.referenced_surfaces = |
95 std::move(referenced_surfaces); | 81 std::move(referenced_surfaces); |
96 compositor_frame.resource_list = std::move(resource_list); | 82 compositor_frame.resource_list = std::move(resource_list); |
97 return compositor_frame; | 83 return compositor_frame; |
98 } | 84 } |
99 | 85 |
| 86 CompositorFrame MakeCompositorFrame() { |
| 87 return MakeCompositorFrame(empty_surface_ids(), empty_surface_ids(), |
| 88 TransferableResourceArray()); |
| 89 } |
| 90 |
| 91 CompositorFrame MakeCompositorFrame(std::vector<SurfaceId> embedded_surfaces) { |
| 92 return MakeCompositorFrame(embedded_surfaces, embedded_surfaces, |
| 93 TransferableResourceArray()); |
| 94 } |
| 95 |
| 96 CompositorFrame MakeCompositorFrame( |
| 97 std::vector<SurfaceId> embedded_surfaces, |
| 98 std::vector<SurfaceId> referenced_surfaces) { |
| 99 return MakeCompositorFrame(std::move(embedded_surfaces), |
| 100 std::move(referenced_surfaces), |
| 101 TransferableResourceArray()); |
| 102 } |
| 103 |
| 104 CompositorFrame MakeCompositorFrameWithResources( |
| 105 std::vector<SurfaceId> embedded_surfaces, |
| 106 TransferableResourceArray resource_list) { |
| 107 return MakeCompositorFrame(embedded_surfaces, embedded_surfaces, |
| 108 std::move(resource_list)); |
| 109 } |
| 110 |
100 TransferableResource MakeResource(ResourceId id, | 111 TransferableResource MakeResource(ResourceId id, |
101 ResourceFormat format, | 112 ResourceFormat format, |
102 uint32_t filter, | 113 uint32_t filter, |
103 const gfx::Size& size) { | 114 const gfx::Size& size) { |
104 TransferableResource resource; | 115 TransferableResource resource; |
105 resource.id = id; | 116 resource.id = id; |
106 resource.format = format; | 117 resource.format = format; |
107 resource.filter = filter; | 118 resource.filter = filter; |
108 resource.size = size; | 119 resource.size = size; |
109 return resource; | 120 return resource; |
(...skipping 1077 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1187 // SurfaceDependencyTracker is in the process of activating surfaces. This | 1198 // SurfaceDependencyTracker is in the process of activating surfaces. This |
1188 // should not cause a crash or use-after-free. | 1199 // should not cause a crash or use-after-free. |
1189 for (int i = 0; i < 3; ++i) { | 1200 for (int i = 0; i < 3; ++i) { |
1190 begin_frame_source()->TestOnBeginFrame(args); | 1201 begin_frame_source()->TestOnBeginFrame(args); |
1191 EXPECT_TRUE(dependency_tracker().has_deadline()); | 1202 EXPECT_TRUE(dependency_tracker().has_deadline()); |
1192 } | 1203 } |
1193 begin_frame_source()->TestOnBeginFrame(args); | 1204 begin_frame_source()->TestOnBeginFrame(args); |
1194 EXPECT_FALSE(dependency_tracker().has_deadline()); | 1205 EXPECT_FALSE(dependency_tracker().has_deadline()); |
1195 } | 1206 } |
1196 | 1207 |
| 1208 // This test verifies that a CompositorFrame will only blocked on embedded |
| 1209 // surfaces but not on other retained surface IDs in the CompositorFrame. |
| 1210 TEST_F(CompositorFrameSinkSupportTest, OnlyBlockOnEmbeddedSurfaces) { |
| 1211 const SurfaceId display_id = MakeSurfaceId(kDisplayFrameSink, 1); |
| 1212 const SurfaceId parent_id1 = MakeSurfaceId(kParentFrameSink, 1); |
| 1213 const SurfaceId parent_id2 = MakeSurfaceId(kParentFrameSink, 2); |
| 1214 |
| 1215 display_support().SubmitCompositorFrame( |
| 1216 display_id.local_surface_id(), |
| 1217 MakeCompositorFrame({parent_id1}, {parent_id1, parent_id2})); |
| 1218 |
| 1219 EXPECT_TRUE(display_surface()->HasPendingFrame()); |
| 1220 EXPECT_FALSE(display_surface()->HasActiveFrame()); |
| 1221 EXPECT_TRUE(dependency_tracker().has_deadline()); |
| 1222 |
| 1223 // Verify that the display CompositorFrame will only block on |parent_id1| but |
| 1224 // not |parent_id2|. |
| 1225 EXPECT_THAT(display_surface()->blocking_surfaces(), |
| 1226 UnorderedElementsAre(parent_id1)); |
| 1227 // Verify that the display CompositorFrame holds refernces to both |
| 1228 // |parent_id1| and |parent_id2|. |
| 1229 EXPECT_THAT(GetChildReferences(display_id), |
| 1230 UnorderedElementsAre(parent_id1, parent_id2)); |
| 1231 |
| 1232 // Submitting a CompositorFrame with |parent_id1| should unblock the display |
| 1233 // CompositorFrame. |
| 1234 parent_support().SubmitCompositorFrame(parent_id1.local_surface_id(), |
| 1235 MakeCompositorFrame()); |
| 1236 |
| 1237 EXPECT_FALSE(dependency_tracker().has_deadline()); |
| 1238 EXPECT_FALSE(display_surface()->HasPendingFrame()); |
| 1239 EXPECT_TRUE(display_surface()->HasActiveFrame()); |
| 1240 EXPECT_THAT(display_surface()->blocking_surfaces(), IsEmpty()); |
| 1241 EXPECT_THAT(GetChildReferences(display_id), |
| 1242 UnorderedElementsAre(parent_id1, parent_id2)); |
| 1243 } |
| 1244 |
1197 } // namespace test | 1245 } // namespace test |
1198 } // namespace cc | 1246 } // namespace cc |
OLD | NEW |