Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1529)

Side by Side Diff: cc/surfaces/surface_unittest.cc

Issue 2676373004: Implement service-side surface synchronization (Closed)
Patch Set: DisplayCompositorLockManager => SurfaceDependencyTracker. Added More Comments Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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.h" 5 #include "cc/surfaces/surface.h"
6 #include "base/memory/ptr_util.h"
7 #include "cc/surfaces/surface_dependency_tracker.h"
6 #include "cc/surfaces/surface_factory.h" 8 #include "cc/surfaces/surface_factory.h"
7 #include "cc/surfaces/surface_factory_client.h" 9 #include "cc/surfaces/surface_factory_client.h"
8 #include "cc/surfaces/surface_id_allocator.h" 10 #include "cc/surfaces/surface_id_allocator.h"
9 #include "cc/surfaces/surface_manager.h" 11 #include "cc/surfaces/surface_manager.h"
12 #include "cc/test/begin_frame_args_test.h"
13 #include "cc/test/fake_external_begin_frame_source.h"
10 #include "cc/test/scheduler_test_common.h" 14 #include "cc/test/scheduler_test_common.h"
11 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
12 #include "ui/gfx/geometry/size.h" 16 #include "ui/gfx/geometry/size.h"
13 17
14 namespace cc { 18 namespace cc {
15 namespace { 19 namespace {
16 20
17 static constexpr FrameSinkId kArbitraryFrameSinkId(1, 1); 21 static constexpr FrameSinkId kArbitraryFrameSinkId(1, 1);
18 22
23 CompositorFrame MakeCompositorFrame(
24 std::vector<SurfaceId> referenced_surfaces) {
25 CompositorFrame compositor_frame;
26 compositor_frame.metadata.referenced_surfaces =
27 std::move(referenced_surfaces);
28 return compositor_frame;
29 }
30
19 class FakeSurfaceFactoryClient : public SurfaceFactoryClient { 31 class FakeSurfaceFactoryClient : public SurfaceFactoryClient {
20 public: 32 public:
21 FakeSurfaceFactoryClient() : begin_frame_source_(nullptr) {} 33 FakeSurfaceFactoryClient() : begin_frame_source_(nullptr) {}
22 34
23 void ReturnResources(const ReturnedResourceArray& resources) override {} 35 void ReturnResources(const ReturnedResourceArray& resources) override {}
24 36
25 void SetBeginFrameSource(BeginFrameSource* begin_frame_source) override { 37 void SetBeginFrameSource(BeginFrameSource* begin_frame_source) override {
26 begin_frame_source_ = begin_frame_source; 38 begin_frame_source_ = begin_frame_source;
27 } 39 }
28 40
29 BeginFrameSource* begin_frame_source() { return begin_frame_source_; } 41 BeginFrameSource* begin_frame_source() { return begin_frame_source_; }
30 42
31 private: 43 private:
32 BeginFrameSource* begin_frame_source_; 44 BeginFrameSource* begin_frame_source_;
33 }; 45 };
34 46
47 // Surface 1 is blocked on Surface 2 and Surface 3.
48 TEST(SurfaceTest, DisplayCompositorLocking1) {
49 SurfaceManager manager;
50 std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source(
51 new FakeExternalBeginFrameSource(0.f, false));
52
53 std::unique_ptr<SurfaceDependencyTracker> dependency_tracker(
54 new SurfaceDependencyTracker(&manager, begin_frame_source.get()));
55 manager.SetDependencyTracker(std::move(dependency_tracker));
56
57 LocalSurfaceId local_surface_id1(6, base::UnguessableToken::Create());
58 SurfaceId surface_id1(FrameSinkId(1, 1), local_surface_id1);
59
60 LocalSurfaceId local_surface_id2(7, base::UnguessableToken::Create());
61 SurfaceId surface_id2(FrameSinkId(2, 2), local_surface_id2);
62
63 LocalSurfaceId local_surface_id3(8, base::UnguessableToken::Create());
64 SurfaceId surface_id3(FrameSinkId(3, 3), local_surface_id3);
65
66 FakeSurfaceFactoryClient surface_factory_client1;
67 SurfaceFactory factory1(FrameSinkId(1, 1), &manager,
68 &surface_factory_client1);
69 factory1.SubmitCompositorFrame(
70 local_surface_id1, MakeCompositorFrame({surface_id2, surface_id3}),
71 SurfaceFactory::DrawCallback());
72 EXPECT_TRUE(manager.dependency_tracker()->has_deadline());
73
74 // |factory1| is blocked on |surface_id2| and |surface_id3|.
75 EXPECT_FALSE(factory1.current_surface_for_testing()->HasActiveFrame());
76 EXPECT_TRUE(factory1.current_surface_for_testing()->HasPendingFrame());
77
78 FakeSurfaceFactoryClient surface_factory_client2;
79 SurfaceFactory factory2(FrameSinkId(2, 2), &manager,
80 &surface_factory_client2);
81 factory2.SubmitCompositorFrame(local_surface_id2,
82 MakeCompositorFrame(std::vector<SurfaceId>()),
83 SurfaceFactory::DrawCallback());
84
85 EXPECT_TRUE(manager.dependency_tracker()->has_deadline());
86 EXPECT_TRUE(factory2.current_surface_for_testing()->HasActiveFrame());
87 EXPECT_FALSE(factory2.current_surface_for_testing()->HasPendingFrame());
88
89 // |factory1| is blocked on just |surface_id3|.
90 EXPECT_FALSE(factory1.current_surface_for_testing()->HasActiveFrame());
91 EXPECT_TRUE(factory1.current_surface_for_testing()->HasPendingFrame());
92
93 FakeSurfaceFactoryClient surface_factory_client3;
94 SurfaceFactory factory3(FrameSinkId(3, 3), &manager,
95 &surface_factory_client3);
96 factory3.SubmitCompositorFrame(local_surface_id3,
97 MakeCompositorFrame(std::vector<SurfaceId>()),
98 SurfaceFactory::DrawCallback());
99 EXPECT_FALSE(manager.dependency_tracker()->has_deadline());
100
101 // |factory1|'s Frame is now active.
102 EXPECT_TRUE(factory1.current_surface_for_testing()->HasActiveFrame());
103 EXPECT_FALSE(factory1.current_surface_for_testing()->HasPendingFrame());
104
105 factory1.EvictSurface();
106 factory2.EvictSurface();
107 factory3.EvictSurface();
108 }
109
110 // Surface 1 is blocked on Surface 2 which is blocked on Surface 3.
111 TEST(SurfaceTest, DisplayCompositorLocking2) {
112 SurfaceManager manager;
113 std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source(
114 new FakeExternalBeginFrameSource(0.f, false));
115
116 std::unique_ptr<SurfaceDependencyTracker> dependency_tracker(
117 new SurfaceDependencyTracker(&manager, begin_frame_source.get()));
118 manager.SetDependencyTracker(std::move(dependency_tracker));
119
120 LocalSurfaceId local_surface_id1(6, base::UnguessableToken::Create());
121 SurfaceId surface_id1(FrameSinkId(1, 1), local_surface_id1);
122
123 LocalSurfaceId local_surface_id2(7, base::UnguessableToken::Create());
124 SurfaceId surface_id2(FrameSinkId(2, 2), local_surface_id2);
125
126 LocalSurfaceId local_surface_id3(8, base::UnguessableToken::Create());
127 SurfaceId surface_id3(FrameSinkId(3, 3), local_surface_id3);
128
129 FakeSurfaceFactoryClient surface_factory_client1;
130 SurfaceFactory factory1(FrameSinkId(1, 1), &manager,
131 &surface_factory_client1);
132 factory1.SubmitCompositorFrame(local_surface_id1,
133 MakeCompositorFrame({surface_id2}),
134 SurfaceFactory::DrawCallback());
135
136 // |factory1| is blocked on |surface_id2|.
137 EXPECT_FALSE(factory1.current_surface_for_testing()->HasActiveFrame());
138 EXPECT_TRUE(factory1.current_surface_for_testing()->HasPendingFrame());
139
140 FakeSurfaceFactoryClient surface_factory_client2;
141 SurfaceFactory factory2(FrameSinkId(2, 2), &manager,
142 &surface_factory_client2);
143 factory2.SubmitCompositorFrame(local_surface_id2,
144 MakeCompositorFrame({surface_id3}),
145 SurfaceFactory::DrawCallback());
146
147 // |factory2| is blocked on |surface_id3|.
148 EXPECT_FALSE(factory2.current_surface_for_testing()->HasActiveFrame());
149 EXPECT_TRUE(factory2.current_surface_for_testing()->HasPendingFrame());
150
151 // |factory1| is still blocked on just |surface_id2|.
152 EXPECT_FALSE(factory1.current_surface_for_testing()->HasActiveFrame());
153 EXPECT_TRUE(factory1.current_surface_for_testing()->HasPendingFrame());
154
155 FakeSurfaceFactoryClient surface_factory_client3;
156 SurfaceFactory factory3(FrameSinkId(3, 3), &manager,
157 &surface_factory_client3);
158 CompositorFrame frame3;
159 factory3.SubmitCompositorFrame(local_surface_id3,
160 MakeCompositorFrame(std::vector<SurfaceId>()),
161 SurfaceFactory::DrawCallback());
162
163 // |factory1|'s Frame is now active.
164 EXPECT_TRUE(factory1.current_surface_for_testing()->HasActiveFrame());
165 EXPECT_FALSE(factory1.current_surface_for_testing()->HasPendingFrame());
166
167 // |factory2|'s Frame is now active.
168 EXPECT_TRUE(factory2.current_surface_for_testing()->HasActiveFrame());
169 EXPECT_FALSE(factory2.current_surface_for_testing()->HasPendingFrame());
170
171 factory1.EvictSurface();
172 factory2.EvictSurface();
173 factory3.EvictSurface();
174 }
175
176 // Surface 1 and Surface 2 are blocked on Surface 3.
177 TEST(SurfaceTest, DisplayCompositorLocking3) {
178 SurfaceManager manager;
179 std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source(
180 new FakeExternalBeginFrameSource(0.f, false));
181
182 std::unique_ptr<SurfaceDependencyTracker> dependency_tracker(
183 new SurfaceDependencyTracker(&manager, begin_frame_source.get()));
184 manager.SetDependencyTracker(std::move(dependency_tracker));
185
186 LocalSurfaceId local_surface_id1(6, base::UnguessableToken::Create());
187 SurfaceId surface_id1(FrameSinkId(1, 1), local_surface_id1);
188
189 LocalSurfaceId local_surface_id2(7, base::UnguessableToken::Create());
190 SurfaceId surface_id2(FrameSinkId(2, 2), local_surface_id2);
191
192 LocalSurfaceId local_surface_id3(8, base::UnguessableToken::Create());
193 SurfaceId surface_id3(FrameSinkId(3, 3), local_surface_id3);
194
195 FakeSurfaceFactoryClient surface_factory_client1;
196 SurfaceFactory factory1(FrameSinkId(1, 1), &manager,
197 &surface_factory_client1);
198 factory1.SubmitCompositorFrame(local_surface_id1,
199 MakeCompositorFrame({surface_id3}),
200 SurfaceFactory::DrawCallback());
201
202 // |factory1| is blocked on |surface_id3|.
203 EXPECT_FALSE(factory1.current_surface_for_testing()->HasActiveFrame());
204 EXPECT_TRUE(factory1.current_surface_for_testing()->HasPendingFrame());
205
206 FakeSurfaceFactoryClient surface_factory_client2;
207 SurfaceFactory factory2(FrameSinkId(2, 2), &manager,
208 &surface_factory_client2);
209 factory2.SubmitCompositorFrame(local_surface_id2,
210 MakeCompositorFrame({surface_id3}),
211 SurfaceFactory::DrawCallback());
212
213 // |factory2| is blocked on |surface_id3|.
214 EXPECT_FALSE(factory2.current_surface_for_testing()->HasActiveFrame());
215 EXPECT_TRUE(factory2.current_surface_for_testing()->HasPendingFrame());
216
217 // |factory1| is still blocked on |surface_id3|.
218 EXPECT_FALSE(factory1.current_surface_for_testing()->HasActiveFrame());
219 EXPECT_TRUE(factory1.current_surface_for_testing()->HasPendingFrame());
220
221 FakeSurfaceFactoryClient surface_factory_client3;
222 SurfaceFactory factory3(FrameSinkId(3, 3), &manager,
223 &surface_factory_client3);
224 factory3.SubmitCompositorFrame(local_surface_id3,
225 MakeCompositorFrame(std::vector<SurfaceId>()),
226 SurfaceFactory::DrawCallback());
227
228 // |factory1|'s Frame is now active.
229 EXPECT_TRUE(factory1.current_surface_for_testing()->HasActiveFrame());
230 EXPECT_FALSE(factory1.current_surface_for_testing()->HasPendingFrame());
231
232 // |factory2|'s Frame is now active.
233 EXPECT_TRUE(factory2.current_surface_for_testing()->HasActiveFrame());
234 EXPECT_FALSE(factory2.current_surface_for_testing()->HasPendingFrame());
235
236 factory1.EvictSurface();
237 factory2.EvictSurface();
238 factory3.EvictSurface();
239 }
240
241 // |factory1| is blocked on |surface_id2| but the deadline hits.
242 TEST(SurfaceTest, DisplayCompositorLocking4) {
243 SurfaceManager manager;
244 std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source(
245 new FakeExternalBeginFrameSource(0.f, false));
246
247 std::unique_ptr<SurfaceDependencyTracker> dependency_tracker(
248 new SurfaceDependencyTracker(&manager, begin_frame_source.get()));
249 manager.SetDependencyTracker(std::move(dependency_tracker));
250
251 LocalSurfaceId local_surface_id1(6, base::UnguessableToken::Create());
252 SurfaceId surface_id1(FrameSinkId(1, 1), local_surface_id1);
253
254 LocalSurfaceId local_surface_id2(7, base::UnguessableToken::Create());
255 SurfaceId surface_id2(FrameSinkId(2, 2), local_surface_id2);
256
257 LocalSurfaceId local_surface_id3(8, base::UnguessableToken::Create());
258 SurfaceId surface_id3(FrameSinkId(3, 3), local_surface_id3);
259
260 FakeSurfaceFactoryClient surface_factory_client1;
261 SurfaceFactory factory1(FrameSinkId(1, 1), &manager,
262 &surface_factory_client1);
263 CompositorFrame frame;
264 factory1.SubmitCompositorFrame(local_surface_id1,
265 MakeCompositorFrame({surface_id2}),
266 SurfaceFactory::DrawCallback());
267 EXPECT_TRUE(manager.dependency_tracker()->has_deadline());
268
269 // |factory1| is blocked on |surface_id2|.
270 EXPECT_FALSE(factory1.current_surface_for_testing()->HasActiveFrame());
271 EXPECT_TRUE(factory1.current_surface_for_testing()->HasPendingFrame());
272
273 FakeSurfaceFactoryClient surface_factory_client2;
274 SurfaceFactory factory2(FrameSinkId(2, 2), &manager,
275 &surface_factory_client2);
276 factory2.SubmitCompositorFrame(local_surface_id2,
277 MakeCompositorFrame({surface_id3}),
278 SurfaceFactory::DrawCallback());
279 EXPECT_TRUE(manager.dependency_tracker()->has_deadline());
280
281 // |factory2| is blocked on |surface_id3|.
282 EXPECT_FALSE(factory2.current_surface_for_testing()->HasActiveFrame());
283 EXPECT_TRUE(factory2.current_surface_for_testing()->HasPendingFrame());
284
285 BeginFrameArgs args =
286 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1);
287 begin_frame_source->TestOnBeginFrame(args);
288
289 // |factory1| is still blocked on |surface_id2|.
290 EXPECT_FALSE(factory1.current_surface_for_testing()->HasActiveFrame());
291 EXPECT_TRUE(factory1.current_surface_for_testing()->HasPendingFrame());
292
293 // |factory2| is still blcoked on |surface_id3|.
294 EXPECT_FALSE(factory2.current_surface_for_testing()->HasActiveFrame());
295 EXPECT_TRUE(factory2.current_surface_for_testing()->HasPendingFrame());
296
297 begin_frame_source->TestOnBeginFrame(args);
298 begin_frame_source->TestOnBeginFrame(args);
299 begin_frame_source->TestOnBeginFrame(args);
300
301 // |factory1| and |factory2| are no longer blocked.
302 EXPECT_TRUE(factory1.current_surface_for_testing()->HasActiveFrame());
303 EXPECT_FALSE(factory1.current_surface_for_testing()->HasPendingFrame());
304 EXPECT_TRUE(factory2.current_surface_for_testing()->HasActiveFrame());
305 EXPECT_FALSE(factory2.current_surface_for_testing()->HasPendingFrame());
306 EXPECT_FALSE(manager.dependency_tracker()->has_deadline());
307
308 factory1.EvictSurface();
309 factory2.EvictSurface();
310 }
311
312 // Frame activates once a new frame is submitted.
313 TEST(SurfaceTest, DisplayCompositorLocking5) {
314 SurfaceManager manager;
315 std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source(
316 new FakeExternalBeginFrameSource(0.f, false));
317
318 manager.SetDependencyTracker(base::MakeUnique<SurfaceDependencyTracker>(
319 &manager, begin_frame_source.get()));
320
321 LocalSurfaceId local_surface_id1(6, base::UnguessableToken::Create());
322 SurfaceId surface_id1(FrameSinkId(1, 1), local_surface_id1);
323
324 LocalSurfaceId local_surface_id2(7, base::UnguessableToken::Create());
325 SurfaceId surface_id2(FrameSinkId(2, 2), local_surface_id2);
326
327 FakeSurfaceFactoryClient surface_factory_client1;
328 SurfaceFactory factory1(FrameSinkId(1, 1), &manager,
329 &surface_factory_client1);
330 factory1.SubmitCompositorFrame(local_surface_id1,
331 MakeCompositorFrame({surface_id2}),
332 SurfaceFactory::DrawCallback());
333
334 // |factory1|'s Frame is blocked on |surface_id2|.
335 EXPECT_FALSE(factory1.current_surface_for_testing()->HasActiveFrame());
336 EXPECT_TRUE(factory1.current_surface_for_testing()->HasPendingFrame());
337 EXPECT_TRUE(manager.dependency_tracker()->has_deadline());
338
339 // Another frame is submitted to |factory1| that has no dependencies.
340 factory1.SubmitCompositorFrame(local_surface_id1,
341 MakeCompositorFrame(std::vector<SurfaceId>()),
342 SurfaceFactory::DrawCallback());
343 EXPECT_TRUE(factory1.current_surface_for_testing()->HasActiveFrame());
344 EXPECT_FALSE(factory1.current_surface_for_testing()->HasPendingFrame());
345 EXPECT_FALSE(manager.dependency_tracker()->has_deadline());
346
347 factory1.EvictSurface();
348 }
349
35 TEST(SurfaceTest, SurfaceLifetime) { 350 TEST(SurfaceTest, SurfaceLifetime) {
36 SurfaceManager manager; 351 SurfaceManager manager;
37 FakeSurfaceFactoryClient surface_factory_client; 352 FakeSurfaceFactoryClient surface_factory_client;
38 SurfaceFactory factory(kArbitraryFrameSinkId, &manager, 353 SurfaceFactory factory(kArbitraryFrameSinkId, &manager,
39 &surface_factory_client); 354 &surface_factory_client);
40 355
41 LocalSurfaceId local_surface_id(6, base::UnguessableToken::Create()); 356 LocalSurfaceId local_surface_id(6, base::UnguessableToken::Create());
42 SurfaceId surface_id(kArbitraryFrameSinkId, local_surface_id); 357 SurfaceId surface_id(kArbitraryFrameSinkId, local_surface_id);
43 factory.SubmitCompositorFrame(local_surface_id, CompositorFrame(), 358 factory.SubmitCompositorFrame(local_surface_id, CompositorFrame(),
44 SurfaceFactory::DrawCallback()); 359 SurfaceFactory::DrawCallback());
45 EXPECT_TRUE(manager.GetSurfaceForId(surface_id)); 360 EXPECT_TRUE(manager.GetSurfaceForId(surface_id));
46 factory.EvictSurface(); 361 factory.EvictSurface();
47 362
48 EXPECT_EQ(NULL, manager.GetSurfaceForId(surface_id)); 363 EXPECT_EQ(NULL, manager.GetSurfaceForId(surface_id));
49 } 364 }
50 365
51 TEST(SurfaceTest, SurfaceIds) { 366 TEST(SurfaceTest, SurfaceIds) {
52 for (size_t i = 0; i < 3; ++i) { 367 for (size_t i = 0; i < 3; ++i) {
53 SurfaceIdAllocator allocator; 368 SurfaceIdAllocator allocator;
54 LocalSurfaceId id1 = allocator.GenerateId(); 369 LocalSurfaceId id1 = allocator.GenerateId();
55 LocalSurfaceId id2 = allocator.GenerateId(); 370 LocalSurfaceId id2 = allocator.GenerateId();
56 EXPECT_NE(id1, id2); 371 EXPECT_NE(id1, id2);
57 } 372 }
58 } 373 }
59 374
60 } // namespace 375 } // namespace
61 } // namespace cc 376 } // namespace cc
OLDNEW
« cc/surfaces/surface_manager.cc ('K') | « cc/surfaces/surface_manager.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698