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

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

Issue 2582823002: WIP: Surface Synchronization System
Patch Set: Only create ClientSurfaceEmbedder if window is visible. Trash it otherwise. 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 "base/memory/ptr_util.h"
6 #include "cc/surfaces/display_compositor_lock_manager.h"
5 #include "cc/surfaces/surface.h" 7 #include "cc/surfaces/surface.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<DisplayCompositorLockManager> lock_manager(
54 new DisplayCompositorLockManager(&manager, begin_frame_source.get()));
55 manager.SetLockManager(std::move(lock_manager));
56
57 LocalFrameId local_frame_id1(6, base::UnguessableToken::Create());
58 SurfaceId surface_id1(FrameSinkId(1, 1), local_frame_id1);
59
60 LocalFrameId local_frame_id2(7, base::UnguessableToken::Create());
61 SurfaceId surface_id2(FrameSinkId(2, 2), local_frame_id2);
62
63 LocalFrameId local_frame_id3(8, base::UnguessableToken::Create());
64 SurfaceId surface_id3(FrameSinkId(3, 3), local_frame_id3);
65
66 FakeSurfaceFactoryClient surface_factory_client1;
67 SurfaceFactory factory1(FrameSinkId(1, 1), &manager,
68 &surface_factory_client1);
69 factory1.SubmitCompositorFrame(
70 local_frame_id1, MakeCompositorFrame({surface_id2, surface_id3}),
71 SurfaceFactory::DrawCallback());
72 EXPECT_TRUE(manager.lock_manager()->observing_begin_frames());
73
74 // |factory1| is blocked on |surface_id2| and |surface_id3|.
75 EXPECT_FALSE(factory1.current_surface_for_testing()->HasFrame());
76 EXPECT_TRUE(
77 factory1.current_surface_for_testing()->GetPendingFrame().has_value());
78
79 FakeSurfaceFactoryClient surface_factory_client2;
80 SurfaceFactory factory2(FrameSinkId(2, 2), &manager,
81 &surface_factory_client2);
82 factory2.SubmitCompositorFrame(local_frame_id2,
83 MakeCompositorFrame(std::vector<SurfaceId>()),
84 SurfaceFactory::DrawCallback());
85
86 EXPECT_TRUE(manager.lock_manager()->observing_begin_frames());
87 EXPECT_TRUE(factory2.current_surface_for_testing()->HasFrame());
88 EXPECT_FALSE(
89 factory2.current_surface_for_testing()->GetPendingFrame().has_value());
90
91 // |factory1| is blocked on just |surface_id3|.
92 EXPECT_FALSE(factory1.current_surface_for_testing()->HasFrame());
93 EXPECT_TRUE(
94 factory1.current_surface_for_testing()->GetPendingFrame().has_value());
95
96 FakeSurfaceFactoryClient surface_factory_client3;
97 SurfaceFactory factory3(FrameSinkId(3, 3), &manager,
98 &surface_factory_client3);
99 factory3.SubmitCompositorFrame(local_frame_id3,
100 MakeCompositorFrame(std::vector<SurfaceId>()),
101 SurfaceFactory::DrawCallback());
102 EXPECT_FALSE(manager.lock_manager()->observing_begin_frames());
103
104 // |factory1|'s Frame is now active.
105 EXPECT_TRUE(factory1.current_surface_for_testing()->HasFrame());
106 EXPECT_FALSE(
107 factory1.current_surface_for_testing()->GetPendingFrame().has_value());
108
109 factory1.EvictSurface();
110 factory2.EvictSurface();
111 factory3.EvictSurface();
112 }
113
114 // Surface 1 is blocked on Surface 2 which is blocked on Surface 3.
115 TEST(SurfaceTest, DisplayCompositorLocking2) {
116 SurfaceManager manager;
117 std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source(
118 new FakeExternalBeginFrameSource(0.f, false));
119
120 std::unique_ptr<DisplayCompositorLockManager> lock_manager(
121 new DisplayCompositorLockManager(&manager, begin_frame_source.get()));
122 manager.SetLockManager(std::move(lock_manager));
123
124 LocalFrameId local_frame_id1(6, base::UnguessableToken::Create());
125 SurfaceId surface_id1(FrameSinkId(1, 1), local_frame_id1);
126
127 LocalFrameId local_frame_id2(7, base::UnguessableToken::Create());
128 SurfaceId surface_id2(FrameSinkId(2, 2), local_frame_id2);
129
130 LocalFrameId local_frame_id3(8, base::UnguessableToken::Create());
131 SurfaceId surface_id3(FrameSinkId(3, 3), local_frame_id3);
132
133 FakeSurfaceFactoryClient surface_factory_client1;
134 SurfaceFactory factory1(FrameSinkId(1, 1), &manager,
135 &surface_factory_client1);
136 factory1.SubmitCompositorFrame(local_frame_id1,
137 MakeCompositorFrame({surface_id2}),
138 SurfaceFactory::DrawCallback());
139
140 // |factory1| is blocked on |surface_id2|.
141 EXPECT_FALSE(factory1.current_surface_for_testing()->HasFrame());
142 EXPECT_TRUE(
143 factory1.current_surface_for_testing()->GetPendingFrame().has_value());
144
145 FakeSurfaceFactoryClient surface_factory_client2;
146 SurfaceFactory factory2(FrameSinkId(2, 2), &manager,
147 &surface_factory_client2);
148 factory2.SubmitCompositorFrame(local_frame_id2,
149 MakeCompositorFrame({surface_id3}),
150 SurfaceFactory::DrawCallback());
151
152 // |factory2| is blocked on |surface_id3|.
153 EXPECT_FALSE(factory2.current_surface_for_testing()->HasFrame());
154 EXPECT_TRUE(
155 factory2.current_surface_for_testing()->GetPendingFrame().has_value());
156
157 // |factory1| is still blocked on just |surface_id2|.
158 EXPECT_FALSE(factory1.current_surface_for_testing()->HasFrame());
159 EXPECT_TRUE(
160 factory1.current_surface_for_testing()->GetPendingFrame().has_value());
161
162 FakeSurfaceFactoryClient surface_factory_client3;
163 SurfaceFactory factory3(FrameSinkId(3, 3), &manager,
164 &surface_factory_client3);
165 CompositorFrame frame3;
166 factory3.SubmitCompositorFrame(local_frame_id3,
167 MakeCompositorFrame(std::vector<SurfaceId>()),
168 SurfaceFactory::DrawCallback());
169
170 // |factory1|'s Frame is now active.
171 EXPECT_TRUE(factory1.current_surface_for_testing()->HasFrame());
172 EXPECT_FALSE(
173 factory1.current_surface_for_testing()->GetPendingFrame().has_value());
174
175 // |factory2|'s Frame is now active.
176 EXPECT_TRUE(factory2.current_surface_for_testing()->HasFrame());
177 EXPECT_FALSE(
178 factory2.current_surface_for_testing()->GetPendingFrame().has_value());
179
180 factory1.EvictSurface();
181 factory2.EvictSurface();
182 factory3.EvictSurface();
183 }
184
185 // Surface 1 and Surface 2 are blocked on Surface 3.
186 TEST(SurfaceTest, DisplayCompositorLocking3) {
187 SurfaceManager manager;
188 std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source(
189 new FakeExternalBeginFrameSource(0.f, false));
190
191 std::unique_ptr<DisplayCompositorLockManager> lock_manager(
192 new DisplayCompositorLockManager(&manager, begin_frame_source.get()));
193 manager.SetLockManager(std::move(lock_manager));
194
195 LocalFrameId local_frame_id1(6, base::UnguessableToken::Create());
196 SurfaceId surface_id1(FrameSinkId(1, 1), local_frame_id1);
197
198 LocalFrameId local_frame_id2(7, base::UnguessableToken::Create());
199 SurfaceId surface_id2(FrameSinkId(2, 2), local_frame_id2);
200
201 LocalFrameId local_frame_id3(8, base::UnguessableToken::Create());
202 SurfaceId surface_id3(FrameSinkId(3, 3), local_frame_id3);
203
204 FakeSurfaceFactoryClient surface_factory_client1;
205 SurfaceFactory factory1(FrameSinkId(1, 1), &manager,
206 &surface_factory_client1);
207 factory1.SubmitCompositorFrame(local_frame_id1,
208 MakeCompositorFrame({surface_id3}),
209 SurfaceFactory::DrawCallback());
210
211 // |factory1| is blocked on |surface_id3|.
212 EXPECT_FALSE(factory1.current_surface_for_testing()->HasFrame());
213 EXPECT_TRUE(
214 factory1.current_surface_for_testing()->GetPendingFrame().has_value());
215
216 FakeSurfaceFactoryClient surface_factory_client2;
217 SurfaceFactory factory2(FrameSinkId(2, 2), &manager,
218 &surface_factory_client2);
219 factory2.SubmitCompositorFrame(local_frame_id2,
220 MakeCompositorFrame({surface_id3}),
221 SurfaceFactory::DrawCallback());
222
223 // |factory2| is blocked on |surface_id3|.
224 EXPECT_FALSE(factory2.current_surface_for_testing()->HasFrame());
225 EXPECT_TRUE(
226 factory2.current_surface_for_testing()->GetPendingFrame().has_value());
227
228 // |factory1| is still blocked on |surface_id3|.
229 EXPECT_FALSE(factory1.current_surface_for_testing()->HasFrame());
230 EXPECT_TRUE(
231 factory1.current_surface_for_testing()->GetPendingFrame().has_value());
232
233 FakeSurfaceFactoryClient surface_factory_client3;
234 SurfaceFactory factory3(FrameSinkId(3, 3), &manager,
235 &surface_factory_client3);
236 factory3.SubmitCompositorFrame(local_frame_id3,
237 MakeCompositorFrame(std::vector<SurfaceId>()),
238 SurfaceFactory::DrawCallback());
239
240 // |factory1|'s Frame is now active.
241 EXPECT_TRUE(factory1.current_surface_for_testing()->HasFrame());
242 EXPECT_FALSE(
243 factory1.current_surface_for_testing()->GetPendingFrame().has_value());
244
245 // |factory2|'s Frame is now active.
246 EXPECT_TRUE(factory2.current_surface_for_testing()->HasFrame());
247 EXPECT_FALSE(
248 factory2.current_surface_for_testing()->GetPendingFrame().has_value());
249
250 factory1.EvictSurface();
251 factory2.EvictSurface();
252 factory3.EvictSurface();
253 }
254
255 // |factory1| is blocked on |surface_id2| but the deadline hits.
256 TEST(SurfaceTest, DisplayCompositorLocking4) {
257 SurfaceManager manager;
258 std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source(
259 new FakeExternalBeginFrameSource(0.f, false));
260
261 std::unique_ptr<DisplayCompositorLockManager> lock_manager(
262 new DisplayCompositorLockManager(&manager, begin_frame_source.get()));
263 manager.SetLockManager(std::move(lock_manager));
264
265 LocalFrameId local_frame_id1(6, base::UnguessableToken::Create());
266 SurfaceId surface_id1(FrameSinkId(1, 1), local_frame_id1);
267
268 LocalFrameId local_frame_id2(7, base::UnguessableToken::Create());
269 SurfaceId surface_id2(FrameSinkId(2, 2), local_frame_id2);
270
271 LocalFrameId local_frame_id3(8, base::UnguessableToken::Create());
272 SurfaceId surface_id3(FrameSinkId(3, 3), local_frame_id3);
273
274 FakeSurfaceFactoryClient surface_factory_client1;
275 SurfaceFactory factory1(FrameSinkId(1, 1), &manager,
276 &surface_factory_client1);
277 CompositorFrame frame;
278 factory1.SubmitCompositorFrame(local_frame_id1,
279 MakeCompositorFrame({surface_id2}),
280 SurfaceFactory::DrawCallback());
281 EXPECT_TRUE(manager.lock_manager()->observing_begin_frames());
282
283 // |factory1| is blocked on |surface_id2|.
284 EXPECT_FALSE(factory1.current_surface_for_testing()->HasFrame());
285 EXPECT_TRUE(
286 factory1.current_surface_for_testing()->GetPendingFrame().has_value());
287
288 FakeSurfaceFactoryClient surface_factory_client2;
289 SurfaceFactory factory2(FrameSinkId(2, 2), &manager,
290 &surface_factory_client2);
291 factory2.SubmitCompositorFrame(local_frame_id2,
292 MakeCompositorFrame({surface_id3}),
293 SurfaceFactory::DrawCallback());
294 EXPECT_TRUE(manager.lock_manager()->observing_begin_frames());
295
296 // |factory2| is blocked on |surface_id3|.
297 EXPECT_FALSE(factory2.current_surface_for_testing()->HasFrame());
298 EXPECT_TRUE(
299 factory2.current_surface_for_testing()->GetPendingFrame().has_value());
300
301 BeginFrameArgs args =
302 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1);
303 begin_frame_source->TestOnBeginFrame(args);
304
305 // |factory1| is still blocked on |surface_id2|.
306 EXPECT_FALSE(factory1.current_surface_for_testing()->HasFrame());
307 EXPECT_TRUE(
308 factory1.current_surface_for_testing()->GetPendingFrame().has_value());
309
310 // |factory2| is still blcoked on |surface_id3|.
311 EXPECT_FALSE(factory2.current_surface_for_testing()->HasFrame());
312 EXPECT_TRUE(
313 factory2.current_surface_for_testing()->GetPendingFrame().has_value());
314
315 begin_frame_source->TestOnBeginFrame(args);
316 begin_frame_source->TestOnBeginFrame(args);
317 begin_frame_source->TestOnBeginFrame(args);
318
319 // |factory1| and |factory2| are no longer blocked.
320 EXPECT_TRUE(factory1.current_surface_for_testing()->HasFrame());
321 EXPECT_FALSE(
322 factory1.current_surface_for_testing()->GetPendingFrame().has_value());
323 EXPECT_TRUE(factory2.current_surface_for_testing()->HasFrame());
324 EXPECT_FALSE(
325 factory2.current_surface_for_testing()->GetPendingFrame().has_value());
326 EXPECT_FALSE(manager.lock_manager()->observing_begin_frames());
327
328 factory1.EvictSurface();
329 factory2.EvictSurface();
330 }
331
332 // Frame activates once a new frame is submitted.
333 TEST(SurfaceTest, DisplayCompositorLocking5) {
334 SurfaceManager manager;
335 std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source(
336 new FakeExternalBeginFrameSource(0.f, false));
337
338 manager.SetLockManager(base::MakeUnique<DisplayCompositorLockManager>(
339 &manager, begin_frame_source.get()));
340
341 LocalFrameId local_frame_id1(6, base::UnguessableToken::Create());
342 SurfaceId surface_id1(FrameSinkId(1, 1), local_frame_id1);
343
344 LocalFrameId local_frame_id2(7, base::UnguessableToken::Create());
345 SurfaceId surface_id2(FrameSinkId(2, 2), local_frame_id2);
346
347 FakeSurfaceFactoryClient surface_factory_client1;
348 SurfaceFactory factory1(FrameSinkId(1, 1), &manager,
349 &surface_factory_client1);
350 factory1.SubmitCompositorFrame(local_frame_id1,
351 MakeCompositorFrame({surface_id2}),
352 SurfaceFactory::DrawCallback());
353
354 // |factory1|'s Frame is blocked on |surface_id2|.
355 EXPECT_FALSE(factory1.current_surface_for_testing()->HasFrame());
356 EXPECT_TRUE(
357 factory1.current_surface_for_testing()->GetPendingFrame().has_value());
358 EXPECT_TRUE(manager.lock_manager()->observing_begin_frames());
359
360 // Another frame is submitted to |factory1| that has no dependencies.
361 factory1.SubmitCompositorFrame(local_frame_id1,
362 MakeCompositorFrame(std::vector<SurfaceId>()),
363 SurfaceFactory::DrawCallback());
364 EXPECT_TRUE(factory1.current_surface_for_testing()->HasFrame());
365 EXPECT_FALSE(
366 factory1.current_surface_for_testing()->GetPendingFrame().has_value());
367 EXPECT_FALSE(manager.lock_manager()->observing_begin_frames());
368
369 factory1.EvictSurface();
370 }
371
35 TEST(SurfaceTest, SurfaceLifetime) { 372 TEST(SurfaceTest, SurfaceLifetime) {
36 SurfaceManager manager; 373 SurfaceManager manager;
37 FakeSurfaceFactoryClient surface_factory_client; 374 FakeSurfaceFactoryClient surface_factory_client;
38 SurfaceFactory factory(kArbitraryFrameSinkId, &manager, 375 SurfaceFactory factory(kArbitraryFrameSinkId, &manager,
39 &surface_factory_client); 376 &surface_factory_client);
40 377
41 LocalFrameId local_frame_id(6, base::UnguessableToken::Create()); 378 LocalFrameId local_frame_id(6, base::UnguessableToken::Create());
42 SurfaceId surface_id(kArbitraryFrameSinkId, local_frame_id); 379 SurfaceId surface_id(kArbitraryFrameSinkId, local_frame_id);
43 factory.SubmitCompositorFrame(local_frame_id, CompositorFrame(), 380 factory.SubmitCompositorFrame(local_frame_id, CompositorFrame(),
44 SurfaceFactory::DrawCallback()); 381 SurfaceFactory::DrawCallback());
45 EXPECT_TRUE(manager.GetSurfaceForId(surface_id)); 382 EXPECT_TRUE(manager.GetSurfaceForId(surface_id));
46 factory.EvictSurface(); 383 factory.EvictSurface();
47 384
48 EXPECT_EQ(NULL, manager.GetSurfaceForId(surface_id)); 385 EXPECT_EQ(NULL, manager.GetSurfaceForId(surface_id));
49 } 386 }
50 387
51 TEST(SurfaceTest, SurfaceIds) { 388 TEST(SurfaceTest, SurfaceIds) {
52 for (size_t i = 0; i < 3; ++i) { 389 for (size_t i = 0; i < 3; ++i) {
53 SurfaceIdAllocator allocator; 390 SurfaceIdAllocator allocator;
54 LocalFrameId id1 = allocator.GenerateId(); 391 LocalFrameId id1 = allocator.GenerateId();
55 LocalFrameId id2 = allocator.GenerateId(); 392 LocalFrameId id2 = allocator.GenerateId();
56 EXPECT_NE(id1, id2); 393 EXPECT_NE(id1, id2);
57 } 394 }
58 } 395 }
59 396
60 } // namespace 397 } // namespace
61 } // namespace cc 398 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698