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

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

Issue 2238693002: Plumb SetVisible from ui::Compositor to the DirectRenderer. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: setvisible-browser: . Created 4 years, 4 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/display_scheduler.h" 5 #include "cc/surfaces/display_scheduler.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/test/null_task_runner.h" 8 #include "base/test/null_task_runner.h"
9 #include "base/test/simple_test_tick_clock.h" 9 #include "base/test/simple_test_tick_clock.h"
10 #include "base/trace_event/trace_event.h" 10 #include "base/trace_event/trace_event.h"
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 FakeDisplaySchedulerClient client_; 102 FakeDisplaySchedulerClient client_;
103 TestDisplayScheduler scheduler_; 103 TestDisplayScheduler scheduler_;
104 }; 104 };
105 105
106 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilNewRootSurface) { 106 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilNewRootSurface) {
107 SurfaceId root_surface_id1(0, 1, 0); 107 SurfaceId root_surface_id1(0, 1, 0);
108 SurfaceId root_surface_id2(0, 2, 0); 108 SurfaceId root_surface_id2(0, 2, 0);
109 SurfaceId sid1(0, 3, 0); 109 SurfaceId sid1(0, 3, 0);
110 base::TimeTicks late_deadline; 110 base::TimeTicks late_deadline;
111 111
112 scheduler_.SetVisible(true);
113
112 // Go trough an initial BeginFrame cycle with the root surface. 114 // Go trough an initial BeginFrame cycle with the root surface.
113 BeginFrameForTest(); 115 BeginFrameForTest();
114 scheduler_.SetNewRootSurface(root_surface_id1); 116 scheduler_.SetNewRootSurface(root_surface_id1);
115 scheduler_.BeginFrameDeadlineForTest(); 117 scheduler_.BeginFrameDeadlineForTest();
116 118
117 // Resize on the next begin frame cycle should cause the deadline to wait 119 // Resize on the next begin frame cycle should cause the deadline to wait
118 // for a new root surface. 120 // for a new root surface.
119 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); 121 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
120 BeginFrameForTest(); 122 BeginFrameForTest();
121 scheduler_.SurfaceDamaged(sid1); 123 scheduler_.SurfaceDamaged(sid1);
(...skipping 14 matching lines...) Expand all
136 EXPECT_GE(now_src().NowTicks(), 138 EXPECT_GE(now_src().NowTicks(),
137 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); 139 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
138 scheduler_.BeginFrameDeadlineForTest(); 140 scheduler_.BeginFrameDeadlineForTest();
139 } 141 }
140 142
141 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilDamagedSurface) { 143 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilDamagedSurface) {
142 SurfaceId root_surface_id(0, 1, 0); 144 SurfaceId root_surface_id(0, 1, 0);
143 SurfaceId sid1(0, 2, 0); 145 SurfaceId sid1(0, 2, 0);
144 base::TimeTicks late_deadline; 146 base::TimeTicks late_deadline;
145 147
148 scheduler_.SetVisible(true);
149
146 // Go trough an initial BeginFrame cycle with the root surface. 150 // Go trough an initial BeginFrame cycle with the root surface.
147 BeginFrameForTest(); 151 BeginFrameForTest();
148 scheduler_.SetNewRootSurface(root_surface_id); 152 scheduler_.SetNewRootSurface(root_surface_id);
149 scheduler_.BeginFrameDeadlineForTest(); 153 scheduler_.BeginFrameDeadlineForTest();
150 154
151 // Resize on the next begin frame cycle should cause the deadline to wait 155 // Resize on the next begin frame cycle should cause the deadline to wait
152 // for a new root surface. 156 // for a new root surface.
153 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); 157 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval();
154 BeginFrameForTest(); 158 BeginFrameForTest();
155 scheduler_.SurfaceDamaged(sid1); 159 scheduler_.SurfaceDamaged(sid1);
(...skipping 14 matching lines...) Expand all
170 EXPECT_GE(now_src().NowTicks(), 174 EXPECT_GE(now_src().NowTicks(),
171 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); 175 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
172 scheduler_.BeginFrameDeadlineForTest(); 176 scheduler_.BeginFrameDeadlineForTest();
173 } 177 }
174 178
175 TEST_F(DisplaySchedulerTest, SurfaceDamaged) { 179 TEST_F(DisplaySchedulerTest, SurfaceDamaged) {
176 SurfaceId root_surface_id(0, 0, 0); 180 SurfaceId root_surface_id(0, 0, 0);
177 SurfaceId sid1(0, 1, 0); 181 SurfaceId sid1(0, 1, 0);
178 SurfaceId sid2(0, 2, 0); 182 SurfaceId sid2(0, 2, 0);
179 183
184 scheduler_.SetVisible(true);
185
180 // Set the root surface 186 // Set the root surface
181 scheduler_.SetNewRootSurface(root_surface_id); 187 scheduler_.SetNewRootSurface(root_surface_id);
182 188
183 // Get scheduler to detect surface 1 as active by drawing 189 // Get scheduler to detect surface 1 as active by drawing
184 // two frames in a row with damage from surface 1. 190 // two frames in a row with damage from surface 1.
185 BeginFrameForTest(); 191 BeginFrameForTest();
186 scheduler_.SurfaceDamaged(sid1); 192 scheduler_.SurfaceDamaged(sid1);
187 scheduler_.BeginFrameDeadlineForTest(); 193 scheduler_.BeginFrameDeadlineForTest();
188 BeginFrameForTest(); 194 BeginFrameForTest();
189 scheduler_.SurfaceDamaged(sid1); 195 scheduler_.SurfaceDamaged(sid1);
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 scheduler_.SurfaceDamaged(root_surface_id); 239 scheduler_.SurfaceDamaged(root_surface_id);
234 EXPECT_GE(now_src().NowTicks(), 240 EXPECT_GE(now_src().NowTicks(),
235 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); 241 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
236 scheduler_.BeginFrameDeadlineForTest(); 242 scheduler_.BeginFrameDeadlineForTest();
237 } 243 }
238 244
239 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { 245 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) {
240 SurfaceId root_surface_id(0, 0, 0); 246 SurfaceId root_surface_id(0, 0, 0);
241 SurfaceId sid1(0, 1, 0); 247 SurfaceId sid1(0, 1, 0);
242 248
249 scheduler_.SetVisible(true);
250
243 // Set the root surface 251 // Set the root surface
244 scheduler_.SetNewRootSurface(root_surface_id); 252 scheduler_.SetNewRootSurface(root_surface_id);
245 253
246 // DrawAndSwap normally. 254 // DrawAndSwap normally.
247 BeginFrameForTest(); 255 BeginFrameForTest();
248 EXPECT_LT(now_src().NowTicks(), 256 EXPECT_LT(now_src().NowTicks(),
249 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); 257 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
250 EXPECT_EQ(0, client_.draw_and_swap_count()); 258 EXPECT_EQ(0, client_.draw_and_swap_count());
251 scheduler_.SurfaceDamaged(sid1); 259 scheduler_.SurfaceDamaged(sid1);
252 scheduler_.BeginFrameDeadlineForTest(); 260 scheduler_.BeginFrameDeadlineForTest();
253 EXPECT_EQ(1, client_.draw_and_swap_count()); 261 EXPECT_EQ(1, client_.draw_and_swap_count());
254 262
255 // Deadline triggers immediately on OutputSurfaceLost. 263 // Deadline triggers immediately on OutputSurfaceLost.
256 BeginFrameForTest(); 264 BeginFrameForTest();
257 EXPECT_LT(now_src().NowTicks(), 265 EXPECT_LT(now_src().NowTicks(),
258 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); 266 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
259 scheduler_.OutputSurfaceLost(); 267 scheduler_.OutputSurfaceLost();
260 EXPECT_GE(now_src().NowTicks(), 268 EXPECT_GE(now_src().NowTicks(),
261 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); 269 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
262 270
263 // Deadline does not DrawAndSwap after OutputSurfaceLost. 271 // Deadline does not DrawAndSwap after OutputSurfaceLost.
264 EXPECT_EQ(1, client_.draw_and_swap_count()); 272 EXPECT_EQ(1, client_.draw_and_swap_count());
265 scheduler_.SurfaceDamaged(sid1); 273 scheduler_.SurfaceDamaged(sid1);
266 scheduler_.BeginFrameDeadlineForTest(); 274 scheduler_.BeginFrameDeadlineForTest();
267 EXPECT_EQ(1, client_.draw_and_swap_count()); 275 EXPECT_EQ(1, client_.draw_and_swap_count());
268 } 276 }
269 277
278 TEST_F(DisplaySchedulerTest, Visibility) {
279 SurfaceId root_surface_id(0, 0, 0);
280 SurfaceId sid1(0, 1, 0);
281
282 // The scheduler doesn't listen for begin frames until being visible.
283 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers());
284 scheduler_.SetVisible(true);
285 EXPECT_EQ(1u, fake_begin_frame_source_.num_observers());
sunnyps 2016/08/15 23:20:03 Should the scheduler ask for begin frames if we ha
danakj 2016/08/16 00:37:22 I think it would only do one, and then in the dead
286
287 // Set the root surface
288 scheduler_.SetNewRootSurface(root_surface_id);
289
290 // DrawAndSwap normally.
291 BeginFrameForTest();
292 EXPECT_LT(now_src().NowTicks(),
293 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
294 EXPECT_EQ(0, client_.draw_and_swap_count());
295 scheduler_.SurfaceDamaged(sid1);
296 scheduler_.BeginFrameDeadlineForTest();
297 EXPECT_EQ(1, client_.draw_and_swap_count());
298
299 BeginFrameForTest();
300 EXPECT_LT(now_src().NowTicks(),
301 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
302
303 // Become not visible.
304 scheduler_.SetVisible(false);
305
306 // It will stop listening for begin frames after the current deadline.
307 EXPECT_EQ(1u, fake_begin_frame_source_.num_observers());
308
309 // Deadline does not DrawAndSwap when not visible.
310 EXPECT_EQ(1, client_.draw_and_swap_count());
311 scheduler_.SurfaceDamaged(sid1);
312 scheduler_.BeginFrameDeadlineForTest();
313 EXPECT_EQ(1, client_.draw_and_swap_count());
314 // Now it stops listening for begin frames.
315 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers());
316
317 // Does not start listening for begin frames when damage arrives.
318 scheduler_.SurfaceDamaged(sid1);
319 EXPECT_EQ(0u, fake_begin_frame_source_.num_observers());
320
321 // But does when becoming visible.
322 scheduler_.SetVisible(true);
323 EXPECT_EQ(1u, fake_begin_frame_source_.num_observers());
324 }
325
270 TEST_F(DisplaySchedulerTest, ResizeCausesSwap) { 326 TEST_F(DisplaySchedulerTest, ResizeCausesSwap) {
271 SurfaceId root_surface_id(0, 0, 0); 327 SurfaceId root_surface_id(0, 0, 0);
272 SurfaceId sid1(0, 1, 0); 328 SurfaceId sid1(0, 1, 0);
273 329
330 scheduler_.SetVisible(true);
331
274 // Set the root surface 332 // Set the root surface
275 scheduler_.SetNewRootSurface(root_surface_id); 333 scheduler_.SetNewRootSurface(root_surface_id);
276 334
277 // DrawAndSwap normally. 335 // DrawAndSwap normally.
278 BeginFrameForTest(); 336 BeginFrameForTest();
279 EXPECT_LT(now_src().NowTicks(), 337 EXPECT_LT(now_src().NowTicks(),
280 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); 338 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
281 EXPECT_EQ(0, client_.draw_and_swap_count()); 339 EXPECT_EQ(0, client_.draw_and_swap_count());
282 scheduler_.SurfaceDamaged(sid1); 340 scheduler_.SurfaceDamaged(sid1);
283 scheduler_.BeginFrameDeadlineForTest(); 341 scheduler_.BeginFrameDeadlineForTest();
284 EXPECT_EQ(1, client_.draw_and_swap_count()); 342 EXPECT_EQ(1, client_.draw_and_swap_count());
285 343
286 scheduler_.DisplayResized(); 344 scheduler_.DisplayResized();
287 BeginFrameForTest(); 345 BeginFrameForTest();
288 // DisplayResized should trigger a swap to happen. 346 // DisplayResized should trigger a swap to happen.
289 scheduler_.BeginFrameDeadlineForTest(); 347 scheduler_.BeginFrameDeadlineForTest();
290 EXPECT_EQ(2, client_.draw_and_swap_count()); 348 EXPECT_EQ(2, client_.draw_and_swap_count());
291 } 349 }
292 350
293 TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) { 351 TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) {
294 SurfaceId root_surface_id(0, 0, 0); 352 SurfaceId root_surface_id(0, 0, 0);
295 SurfaceId sid1(0, 1, 0); 353 SurfaceId sid1(0, 1, 0);
296 base::TimeTicks late_deadline; 354 base::TimeTicks late_deadline;
297 355
356 scheduler_.SetVisible(true);
357
298 // Set the root surface 358 // Set the root surface
299 scheduler_.SetNewRootSurface(root_surface_id); 359 scheduler_.SetNewRootSurface(root_surface_id);
300 360
301 // DrawAndSwap normally. 361 // DrawAndSwap normally.
302 BeginFrameForTest(); 362 BeginFrameForTest();
303 EXPECT_LT(now_src().NowTicks(), 363 EXPECT_LT(now_src().NowTicks(),
304 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); 364 scheduler_.DesiredBeginFrameDeadlineTimeForTest());
305 EXPECT_EQ(0, client_.draw_and_swap_count()); 365 EXPECT_EQ(0, client_.draw_and_swap_count());
306 scheduler_.SurfaceDamaged(sid1); 366 scheduler_.SurfaceDamaged(sid1);
307 scheduler_.BeginFrameDeadlineForTest(); 367 scheduler_.BeginFrameDeadlineForTest();
(...skipping 26 matching lines...) Expand all
334 EXPECT_EQ(1, client_.draw_and_swap_count()); 394 EXPECT_EQ(1, client_.draw_and_swap_count());
335 scheduler_.BeginFrameDeadlineForTest(); 395 scheduler_.BeginFrameDeadlineForTest();
336 EXPECT_EQ(2, client_.draw_and_swap_count()); 396 EXPECT_EQ(2, client_.draw_and_swap_count());
337 } 397 }
338 398
339 TEST_F(DisplaySchedulerTest, DidSwapBuffers) { 399 TEST_F(DisplaySchedulerTest, DidSwapBuffers) {
340 SurfaceId root_surface_id(0, 0, 0); 400 SurfaceId root_surface_id(0, 0, 0);
341 SurfaceId sid1(0, 1, 0); 401 SurfaceId sid1(0, 1, 0);
342 SurfaceId sid2(0, 2, 0); 402 SurfaceId sid2(0, 2, 0);
343 403
404 scheduler_.SetVisible(true);
405
344 // Set the root surface 406 // Set the root surface
345 scheduler_.SetNewRootSurface(root_surface_id); 407 scheduler_.SetNewRootSurface(root_surface_id);
346 408
347 // Get scheduler to detect surface 1 and 2 as active. 409 // Get scheduler to detect surface 1 and 2 as active.
348 BeginFrameForTest(); 410 BeginFrameForTest();
349 scheduler_.SurfaceDamaged(sid1); 411 scheduler_.SurfaceDamaged(sid1);
350 scheduler_.SurfaceDamaged(sid2); 412 scheduler_.SurfaceDamaged(sid2);
351 scheduler_.BeginFrameDeadlineForTest(); 413 scheduler_.BeginFrameDeadlineForTest();
352 BeginFrameForTest(); 414 BeginFrameForTest();
353 scheduler_.SurfaceDamaged(sid1); 415 scheduler_.SurfaceDamaged(sid1);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 scheduler_.BeginFrameDeadlineForTest(); 460 scheduler_.BeginFrameDeadlineForTest();
399 EXPECT_EQ(4, client_.draw_and_swap_count()); 461 EXPECT_EQ(4, client_.draw_and_swap_count());
400 } 462 }
401 463
402 // This test verfies that we try to reschedule the deadline 464 // This test verfies that we try to reschedule the deadline
403 // after any event that may change what deadline we want. 465 // after any event that may change what deadline we want.
404 TEST_F(DisplaySchedulerTest, ScheduleBeginFrameDeadline) { 466 TEST_F(DisplaySchedulerTest, ScheduleBeginFrameDeadline) {
405 SurfaceId root_surface_id(0, 1, 0); 467 SurfaceId root_surface_id(0, 1, 0);
406 SurfaceId sid1(0, 2, 0); 468 SurfaceId sid1(0, 2, 0);
407 int count = 1; 469 int count = 1;
408 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); 470 EXPECT_EQ(count, scheduler_.scheduler_begin_frame_deadline_count());
409 471
410 // Set the root surface 472 scheduler_.SetVisible(true);
473 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count());
474
475 scheduler_.SetVisible(true);
476 EXPECT_EQ(count, scheduler_.scheduler_begin_frame_deadline_count());
477
478 scheduler_.SetVisible(false);
479 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count());
480
481 // Set the root surface while not visible.
411 scheduler_.SetNewRootSurface(root_surface_id); 482 scheduler_.SetNewRootSurface(root_surface_id);
412 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); 483 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count());
484
485 scheduler_.SetVisible(true);
486 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count());
487
488 // Set the root surface while visible.
489 scheduler_.SetNewRootSurface(root_surface_id);
490 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count());
413 491
414 BeginFrameForTest(); 492 BeginFrameForTest();
415 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); 493 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count());
416 494
417 scheduler_.BeginFrameDeadlineForTest(); 495 scheduler_.BeginFrameDeadlineForTest();
418 scheduler_.DidSwapBuffers(); 496 scheduler_.DidSwapBuffers();
419 BeginFrameForTest(); 497 BeginFrameForTest();
420 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); 498 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count());
421 499
422 scheduler_.DidSwapBuffersComplete(); 500 scheduler_.DidSwapBuffersComplete();
423 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); 501 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count());
424 502
425 scheduler_.DisplayResized(); 503 scheduler_.DisplayResized();
426 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); 504 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count());
427 505
428 scheduler_.SetNewRootSurface(root_surface_id); 506 scheduler_.SetNewRootSurface(root_surface_id);
429 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); 507 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count());
430 508
431 scheduler_.SurfaceDamaged(sid1); 509 scheduler_.SurfaceDamaged(sid1);
432 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); 510 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count());
433 511
434 scheduler_.SetRootSurfaceResourcesLocked(true); 512 scheduler_.SetRootSurfaceResourcesLocked(true);
435 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); 513 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count());
436 514
437 scheduler_.OutputSurfaceLost(); 515 scheduler_.OutputSurfaceLost();
438 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); 516 EXPECT_EQ(++count, scheduler_.scheduler_begin_frame_deadline_count());
439 } 517 }
440 518
441 } // namespace 519 } // namespace
442 } // namespace cc 520 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698