OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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 #include "cc/scheduler/scheduler.h" | 4 #include "cc/scheduler/scheduler.h" |
5 | 5 |
6 #include <string> | 6 #include <string> |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/memory/scoped_vector.h" | 10 #include "base/memory/scoped_vector.h" |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 scheduler->SetCanStart(); | 199 scheduler->SetCanStart(); |
200 scheduler->SetVisible(true); | 200 scheduler->SetVisible(true); |
201 scheduler->SetCanDraw(true); | 201 scheduler->SetCanDraw(true); |
202 | 202 |
203 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); | 203 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
204 client.Reset(); | 204 client.Reset(); |
205 scheduler->DidCreateAndInitializeOutputSurface(); | 205 scheduler->DidCreateAndInitializeOutputSurface(); |
206 EXPECT_EQ(0, client.num_actions_()); | 206 EXPECT_EQ(0, client.num_actions_()); |
207 } | 207 } |
208 | 208 |
209 void RequestCommit(bool deadline_scheduling_enabled) { | 209 TEST(SchedulerTest, RequestCommit) { |
210 FakeSchedulerClient client; | 210 FakeSchedulerClient client; |
211 SchedulerSettings scheduler_settings; | 211 SchedulerSettings scheduler_settings; |
212 scheduler_settings.deadline_scheduling_enabled = deadline_scheduling_enabled; | |
213 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); | 212 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); |
214 scheduler->SetCanStart(); | 213 scheduler->SetCanStart(); |
215 scheduler->SetVisible(true); | 214 scheduler->SetVisible(true); |
216 scheduler->SetCanDraw(true); | 215 scheduler->SetCanDraw(true); |
217 | 216 |
218 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); | 217 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
219 InitializeOutputSurfaceAndFirstCommit(scheduler); | 218 InitializeOutputSurfaceAndFirstCommit(scheduler); |
220 | 219 |
221 // SetNeedsCommit should begin the frame on the next BeginImplFrame. | 220 // SetNeedsCommit should begin the frame on the next BeginImplFrame. |
222 client.Reset(); | 221 client.Reset(); |
223 scheduler->SetNeedsCommit(); | 222 scheduler->SetNeedsCommit(); |
224 EXPECT_TRUE(client.needs_begin_impl_frame()); | 223 EXPECT_TRUE(client.needs_begin_impl_frame()); |
225 if (deadline_scheduling_enabled) { | 224 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); |
226 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); | |
227 } else { | |
228 EXPECT_EQ(client.num_actions_(), 2); | |
229 EXPECT_TRUE(client.HasAction("ScheduledActionSendBeginMainFrame")); | |
230 EXPECT_TRUE(client.HasAction("SetNeedsBeginImplFrame")); | |
231 } | |
232 client.Reset(); | 225 client.Reset(); |
233 | 226 |
234 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); | 227 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
235 if (deadline_scheduling_enabled) { | 228 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 2); |
236 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 2); | 229 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); |
237 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); | |
238 } else { | |
239 EXPECT_SINGLE_ACTION("PostBeginImplFrameDeadlineTask", client); | |
240 } | |
241 EXPECT_TRUE(client.needs_begin_impl_frame()); | 230 EXPECT_TRUE(client.needs_begin_impl_frame()); |
242 client.Reset(); | 231 client.Reset(); |
243 | 232 |
244 // If we don't swap on the deadline, we need to request another | 233 // If we don't swap on the deadline, we need to request another |
245 // BeginImplFrame. | 234 // BeginImplFrame. |
246 scheduler->OnBeginImplFrameDeadline(); | 235 scheduler->OnBeginImplFrameDeadline(); |
247 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); | 236 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); |
248 EXPECT_TRUE(client.needs_begin_impl_frame()); | 237 EXPECT_TRUE(client.needs_begin_impl_frame()); |
249 client.Reset(); | 238 client.Reset(); |
250 | 239 |
(...skipping 21 matching lines...) Expand all Loading... |
272 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); | 261 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
273 EXPECT_SINGLE_ACTION("PostBeginImplFrameDeadlineTask", client); | 262 EXPECT_SINGLE_ACTION("PostBeginImplFrameDeadlineTask", client); |
274 client.Reset(); | 263 client.Reset(); |
275 | 264 |
276 scheduler->OnBeginImplFrameDeadline(); | 265 scheduler->OnBeginImplFrameDeadline(); |
277 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); | 266 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); |
278 EXPECT_FALSE(client.needs_begin_impl_frame()); | 267 EXPECT_FALSE(client.needs_begin_impl_frame()); |
279 client.Reset(); | 268 client.Reset(); |
280 } | 269 } |
281 | 270 |
282 TEST(SchedulerTest, RequestCommit) { | 271 TEST(SchedulerTest, RequestCommitAfterBeginMainFrameSent) { |
283 bool deadline_scheduling_enabled = false; | |
284 RequestCommit(deadline_scheduling_enabled); | |
285 } | |
286 | |
287 TEST(SchedulerTest, RequestCommit_Deadline) { | |
288 bool deadline_scheduling_enabled = true; | |
289 RequestCommit(deadline_scheduling_enabled); | |
290 } | |
291 | |
292 void RequestCommitAfterBeginMainFrameSent( | |
293 bool deadline_scheduling_enabled) { | |
294 FakeSchedulerClient client; | 272 FakeSchedulerClient client; |
295 SchedulerSettings scheduler_settings; | 273 SchedulerSettings scheduler_settings; |
296 scheduler_settings.deadline_scheduling_enabled = deadline_scheduling_enabled; | |
297 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); | 274 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); |
298 scheduler->SetCanStart(); | 275 scheduler->SetCanStart(); |
299 scheduler->SetVisible(true); | 276 scheduler->SetVisible(true); |
300 scheduler->SetCanDraw(true); | 277 scheduler->SetCanDraw(true); |
301 | 278 |
302 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); | 279 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
303 InitializeOutputSurfaceAndFirstCommit(scheduler); | 280 InitializeOutputSurfaceAndFirstCommit(scheduler); |
304 client.Reset(); | 281 client.Reset(); |
305 | 282 |
306 // SetNeedsCommit should begin the frame. | 283 // SetNeedsCommit should begin the frame. |
307 scheduler->SetNeedsCommit(); | 284 scheduler->SetNeedsCommit(); |
308 if (deadline_scheduling_enabled) { | 285 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); |
309 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); | |
310 } else { | |
311 EXPECT_EQ(client.num_actions_(), 2); | |
312 EXPECT_TRUE(client.HasAction("SetNeedsBeginImplFrame")); | |
313 EXPECT_TRUE(client.HasAction("ScheduledActionSendBeginMainFrame")); | |
314 } | |
315 | 286 |
316 client.Reset(); | 287 client.Reset(); |
317 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); | 288 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
318 if (deadline_scheduling_enabled) { | 289 EXPECT_EQ(client.num_actions_(), 2); |
319 EXPECT_EQ(client.num_actions_(), 2); | 290 EXPECT_TRUE(client.HasAction("ScheduledActionSendBeginMainFrame")); |
320 EXPECT_TRUE(client.HasAction("ScheduledActionSendBeginMainFrame")); | 291 EXPECT_TRUE(client.HasAction("PostBeginImplFrameDeadlineTask")); |
321 EXPECT_TRUE(client.HasAction("PostBeginImplFrameDeadlineTask")); | |
322 } else { | |
323 EXPECT_SINGLE_ACTION("PostBeginImplFrameDeadlineTask", client); | |
324 } | |
325 | 292 |
326 EXPECT_TRUE(client.needs_begin_impl_frame()); | 293 EXPECT_TRUE(client.needs_begin_impl_frame()); |
327 client.Reset(); | 294 client.Reset(); |
328 | 295 |
329 // Now SetNeedsCommit again. Calling here means we need a second commit. | 296 // Now SetNeedsCommit again. Calling here means we need a second commit. |
330 scheduler->SetNeedsCommit(); | 297 scheduler->SetNeedsCommit(); |
331 EXPECT_EQ(client.num_actions_(), 0); | 298 EXPECT_EQ(client.num_actions_(), 0); |
332 client.Reset(); | 299 client.Reset(); |
333 | 300 |
334 // Finish the first commit. | 301 // Finish the first commit. |
335 scheduler->FinishCommit(); | 302 scheduler->FinishCommit(); |
336 EXPECT_ACTION("ScheduledActionCommit", client, 0, 2); | 303 EXPECT_ACTION("ScheduledActionCommit", client, 0, 2); |
337 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); | 304 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); |
338 client.Reset(); | 305 client.Reset(); |
339 scheduler->OnBeginImplFrameDeadline(); | 306 scheduler->OnBeginImplFrameDeadline(); |
340 if (deadline_scheduling_enabled) { | 307 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
341 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); | 308 EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2); |
342 EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2); | |
343 } else { | |
344 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 3); | |
345 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 3); | |
346 EXPECT_ACTION("SetNeedsBeginImplFrame", client, 2, 3); | |
347 } | |
348 | 309 |
349 // Because we just swapped, the Scheduler should also request the next | 310 // Because we just swapped, the Scheduler should also request the next |
350 // BeginImplFrame from the OutputSurface. | 311 // BeginImplFrame from the OutputSurface. |
351 EXPECT_TRUE(client.needs_begin_impl_frame()); | 312 EXPECT_TRUE(client.needs_begin_impl_frame()); |
352 client.Reset(); | 313 client.Reset(); |
353 | 314 |
354 // Since another commit is needed, the next BeginImplFrame should initiate | 315 // Since another commit is needed, the next BeginImplFrame should initiate |
355 // the second commit. | 316 // the second commit. |
356 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); | 317 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
357 if (deadline_scheduling_enabled) { | 318 EXPECT_EQ(client.num_actions_(), 2); |
358 EXPECT_EQ(client.num_actions_(), 2); | 319 EXPECT_TRUE(client.HasAction("ScheduledActionSendBeginMainFrame")); |
359 EXPECT_TRUE(client.HasAction("ScheduledActionSendBeginMainFrame")); | 320 EXPECT_TRUE(client.HasAction("PostBeginImplFrameDeadlineTask")); |
360 EXPECT_TRUE(client.HasAction("PostBeginImplFrameDeadlineTask")); | |
361 } else { | |
362 EXPECT_SINGLE_ACTION("PostBeginImplFrameDeadlineTask", client); | |
363 } | |
364 client.Reset(); | 321 client.Reset(); |
365 | 322 |
366 // Finishing the commit before the deadline should post a new deadline task | 323 // Finishing the commit before the deadline should post a new deadline task |
367 // to trigger the deadline early. | 324 // to trigger the deadline early. |
368 scheduler->FinishCommit(); | 325 scheduler->FinishCommit(); |
369 EXPECT_ACTION("ScheduledActionCommit", client, 0, 2); | 326 EXPECT_ACTION("ScheduledActionCommit", client, 0, 2); |
370 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); | 327 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); |
371 client.Reset(); | 328 client.Reset(); |
372 scheduler->OnBeginImplFrameDeadline(); | 329 scheduler->OnBeginImplFrameDeadline(); |
373 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); | 330 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
374 EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2); | 331 EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2); |
375 EXPECT_TRUE(client.needs_begin_impl_frame()); | 332 EXPECT_TRUE(client.needs_begin_impl_frame()); |
376 client.Reset(); | 333 client.Reset(); |
377 | 334 |
378 // On the next BeginImplFrame, verify we go back to a quiescent state and | 335 // On the next BeginImplFrame, verify we go back to a quiescent state and |
379 // no longer request BeginImplFrames. | 336 // no longer request BeginImplFrames. |
380 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); | 337 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
381 scheduler->OnBeginImplFrameDeadline(); | 338 scheduler->OnBeginImplFrameDeadline(); |
382 EXPECT_FALSE(client.needs_begin_impl_frame()); | 339 EXPECT_FALSE(client.needs_begin_impl_frame()); |
383 client.Reset(); | 340 client.Reset(); |
384 } | 341 } |
385 | 342 |
386 TEST(SchedulerTest, RequestCommitAfterBeginMainFrameSent) { | 343 TEST(SchedulerTest, TextureAcquisitionCausesCommitInsteadOfDraw) { |
387 bool deadline_scheduling_enabled = false; | |
388 RequestCommitAfterBeginMainFrameSent(deadline_scheduling_enabled); | |
389 } | |
390 | |
391 TEST(SchedulerTest, RequestCommitAfterBeginMainFrameSent_Deadline) { | |
392 bool deadline_scheduling_enabled = true; | |
393 RequestCommitAfterBeginMainFrameSent(deadline_scheduling_enabled); | |
394 } | |
395 | |
396 void TextureAcquisitionCausesCommitInsteadOfDraw( | |
397 bool deadline_scheduling_enabled) { | |
398 FakeSchedulerClient client; | 344 FakeSchedulerClient client; |
399 SchedulerSettings scheduler_settings; | 345 SchedulerSettings scheduler_settings; |
400 scheduler_settings.deadline_scheduling_enabled = deadline_scheduling_enabled; | |
401 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); | 346 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); |
402 scheduler->SetCanStart(); | 347 scheduler->SetCanStart(); |
403 scheduler->SetVisible(true); | 348 scheduler->SetVisible(true); |
404 scheduler->SetCanDraw(true); | 349 scheduler->SetCanDraw(true); |
405 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); | 350 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
406 | 351 |
407 InitializeOutputSurfaceAndFirstCommit(scheduler); | 352 InitializeOutputSurfaceAndFirstCommit(scheduler); |
408 client.Reset(); | 353 client.Reset(); |
409 scheduler->SetNeedsRedraw(); | 354 scheduler->SetNeedsRedraw(); |
410 EXPECT_TRUE(scheduler->RedrawPending()); | 355 EXPECT_TRUE(scheduler->RedrawPending()); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
447 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); | 392 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
448 EXPECT_SINGLE_ACTION("PostBeginImplFrameDeadlineTask", client); | 393 EXPECT_SINGLE_ACTION("PostBeginImplFrameDeadlineTask", client); |
449 client.Reset(); | 394 client.Reset(); |
450 scheduler->OnBeginImplFrameDeadline(); | 395 scheduler->OnBeginImplFrameDeadline(); |
451 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); | 396 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); |
452 EXPECT_TRUE(scheduler->RedrawPending()); | 397 EXPECT_TRUE(scheduler->RedrawPending()); |
453 EXPECT_TRUE(client.needs_begin_impl_frame()); | 398 EXPECT_TRUE(client.needs_begin_impl_frame()); |
454 | 399 |
455 client.Reset(); | 400 client.Reset(); |
456 scheduler->SetNeedsCommit(); | 401 scheduler->SetNeedsCommit(); |
457 if (deadline_scheduling_enabled) { | 402 EXPECT_EQ(0, client.num_actions_()); |
458 EXPECT_EQ(0, client.num_actions_()); | |
459 } else { | |
460 EXPECT_SINGLE_ACTION("ScheduledActionSendBeginMainFrame", client); | |
461 } | |
462 | 403 |
463 client.Reset(); | 404 client.Reset(); |
464 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); | 405 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
465 if (deadline_scheduling_enabled) { | 406 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 2); |
466 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 2); | 407 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); |
467 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); | |
468 } else { | |
469 EXPECT_SINGLE_ACTION("PostBeginImplFrameDeadlineTask", client); | |
470 } | |
471 | 408 |
472 // Commit will release the texture. | 409 // Commit will release the texture. |
473 client.Reset(); | 410 client.Reset(); |
474 scheduler->FinishCommit(); | 411 scheduler->FinishCommit(); |
475 EXPECT_ACTION("ScheduledActionCommit", client, 0, 2); | 412 EXPECT_ACTION("ScheduledActionCommit", client, 0, 2); |
476 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); | 413 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); |
477 EXPECT_TRUE(scheduler->RedrawPending()); | 414 EXPECT_TRUE(scheduler->RedrawPending()); |
478 | 415 |
479 // Now we can draw again after the commit happens. | 416 // Now we can draw again after the commit happens. |
480 client.Reset(); | 417 client.Reset(); |
481 scheduler->OnBeginImplFrameDeadline(); | 418 scheduler->OnBeginImplFrameDeadline(); |
482 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); | 419 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
483 EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2); | 420 EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2); |
484 EXPECT_FALSE(scheduler->RedrawPending()); | 421 EXPECT_FALSE(scheduler->RedrawPending()); |
485 EXPECT_TRUE(client.needs_begin_impl_frame()); | 422 EXPECT_TRUE(client.needs_begin_impl_frame()); |
486 | 423 |
487 // Make sure we stop requesting BeginImplFrames if we don't swap. | 424 // Make sure we stop requesting BeginImplFrames if we don't swap. |
488 client.Reset(); | 425 client.Reset(); |
489 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); | 426 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
490 EXPECT_SINGLE_ACTION("PostBeginImplFrameDeadlineTask", client); | 427 EXPECT_SINGLE_ACTION("PostBeginImplFrameDeadlineTask", client); |
491 client.Reset(); | 428 client.Reset(); |
492 scheduler->OnBeginImplFrameDeadline(); | 429 scheduler->OnBeginImplFrameDeadline(); |
493 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); | 430 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); |
494 EXPECT_FALSE(client.needs_begin_impl_frame()); | 431 EXPECT_FALSE(client.needs_begin_impl_frame()); |
495 } | 432 } |
496 | 433 |
497 TEST(SchedulerTest, TextureAcquisitionCausesCommitInsteadOfDraw) { | 434 TEST(SchedulerTest, TextureAcquisitionCollision) { |
498 bool deadline_scheduling_enabled = false; | |
499 TextureAcquisitionCausesCommitInsteadOfDraw(deadline_scheduling_enabled); | |
500 } | |
501 | |
502 TEST(SchedulerTest, TextureAcquisitionCausesCommitInsteadOfDraw_Deadline) { | |
503 bool deadline_scheduling_enabled = true; | |
504 TextureAcquisitionCausesCommitInsteadOfDraw(deadline_scheduling_enabled); | |
505 } | |
506 | |
507 void TextureAcquisitionCollision(bool deadline_scheduling_enabled) { | |
508 FakeSchedulerClient client; | 435 FakeSchedulerClient client; |
509 SchedulerSettings scheduler_settings; | 436 SchedulerSettings scheduler_settings; |
510 scheduler_settings.deadline_scheduling_enabled = deadline_scheduling_enabled; | |
511 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); | 437 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); |
512 scheduler->SetCanStart(); | 438 scheduler->SetCanStart(); |
513 scheduler->SetVisible(true); | 439 scheduler->SetVisible(true); |
514 scheduler->SetCanDraw(true); | 440 scheduler->SetCanDraw(true); |
515 | 441 |
516 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); | 442 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
517 InitializeOutputSurfaceAndFirstCommit(scheduler); | 443 InitializeOutputSurfaceAndFirstCommit(scheduler); |
518 | 444 |
519 client.Reset(); | 445 client.Reset(); |
520 scheduler->SetNeedsCommit(); | 446 scheduler->SetNeedsCommit(); |
521 if (deadline_scheduling_enabled) { | 447 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); |
522 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); | |
523 } else { | |
524 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 2); | |
525 EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2); | |
526 } | |
527 | 448 |
528 client.Reset(); | 449 client.Reset(); |
529 scheduler->SetMainThreadNeedsLayerTextures(); | 450 scheduler->SetMainThreadNeedsLayerTextures(); |
530 EXPECT_SINGLE_ACTION( | 451 EXPECT_SINGLE_ACTION( |
531 "ScheduledActionAcquireLayerTexturesForMainThread", client); | 452 "ScheduledActionAcquireLayerTexturesForMainThread", client); |
532 | 453 |
533 client.Reset(); | 454 client.Reset(); |
534 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); | 455 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
535 if (deadline_scheduling_enabled) { | 456 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 2); |
536 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 2); | 457 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); |
537 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); | |
538 } else { | |
539 EXPECT_SINGLE_ACTION("PostBeginImplFrameDeadlineTask", client); | |
540 } | |
541 | 458 |
542 client.Reset(); | 459 client.Reset(); |
543 scheduler->OnBeginImplFrameDeadline(); | 460 scheduler->OnBeginImplFrameDeadline(); |
544 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); | 461 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); |
545 | 462 |
546 // Although the compositor cannot draw because textures are locked by main | 463 // Although the compositor cannot draw because textures are locked by main |
547 // thread, we continue requesting SetNeedsBeginImplFrame in anticipation of | 464 // thread, we continue requesting SetNeedsBeginImplFrame in anticipation of |
548 // the unlock. | 465 // the unlock. |
549 EXPECT_TRUE(client.needs_begin_impl_frame()); | 466 EXPECT_TRUE(client.needs_begin_impl_frame()); |
550 | 467 |
(...skipping 27 matching lines...) Expand all Loading... |
578 EXPECT_SINGLE_ACTION("PostBeginImplFrameDeadlineTask", client); | 495 EXPECT_SINGLE_ACTION("PostBeginImplFrameDeadlineTask", client); |
579 client.Reset(); | 496 client.Reset(); |
580 scheduler->OnBeginImplFrameDeadline(); | 497 scheduler->OnBeginImplFrameDeadline(); |
581 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); | 498 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); |
582 EXPECT_FALSE(client.needs_begin_impl_frame()); | 499 EXPECT_FALSE(client.needs_begin_impl_frame()); |
583 | 500 |
584 // The impl thread need an explicit commit from the main thread to lock | 501 // The impl thread need an explicit commit from the main thread to lock |
585 // the textures. | 502 // the textures. |
586 client.Reset(); | 503 client.Reset(); |
587 scheduler->SetNeedsCommit(); | 504 scheduler->SetNeedsCommit(); |
588 if (deadline_scheduling_enabled) { | 505 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); |
589 EXPECT_SINGLE_ACTION("SetNeedsBeginImplFrame", client); | |
590 } else { | |
591 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 2); | |
592 EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2); | |
593 } | |
594 EXPECT_TRUE(client.needs_begin_impl_frame()); | 506 EXPECT_TRUE(client.needs_begin_impl_frame()); |
595 | 507 |
596 client.Reset(); | 508 client.Reset(); |
597 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); | 509 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
598 if (deadline_scheduling_enabled) { | 510 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 2); |
599 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 2); | 511 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); |
600 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); | |
601 } else { | |
602 EXPECT_SINGLE_ACTION("PostBeginImplFrameDeadlineTask", client); | |
603 } | |
604 client.Reset(); | 512 client.Reset(); |
605 | 513 |
606 // Trigger the commit, which will trigger the deadline task early. | 514 // Trigger the commit, which will trigger the deadline task early. |
607 scheduler->FinishCommit(); | 515 scheduler->FinishCommit(); |
608 EXPECT_ACTION("ScheduledActionCommit", client, 0, 2); | 516 EXPECT_ACTION("ScheduledActionCommit", client, 0, 2); |
609 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); | 517 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); |
610 EXPECT_TRUE(client.needs_begin_impl_frame()); | 518 EXPECT_TRUE(client.needs_begin_impl_frame()); |
611 client.Reset(); | 519 client.Reset(); |
612 | 520 |
613 // Verify we draw on the next BeginImplFrame deadline | 521 // Verify we draw on the next BeginImplFrame deadline |
614 scheduler->OnBeginImplFrameDeadline(); | 522 scheduler->OnBeginImplFrameDeadline(); |
615 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); | 523 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
616 EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2); | 524 EXPECT_ACTION("SetNeedsBeginImplFrame", client, 1, 2); |
617 EXPECT_TRUE(client.needs_begin_impl_frame()); | 525 EXPECT_TRUE(client.needs_begin_impl_frame()); |
618 client.Reset(); | 526 client.Reset(); |
619 } | 527 } |
620 | 528 |
621 TEST(SchedulerTest, TextureAcquisitionCollision) { | 529 TEST(SchedulerTest, VisibilitySwitchWithTextureAcquisition) { |
622 bool deadline_scheduling_enabled = false; | |
623 TextureAcquisitionCollision(deadline_scheduling_enabled); | |
624 } | |
625 | |
626 TEST(SchedulerTest, TextureAcquisitionCollision_Deadline) { | |
627 bool deadline_scheduling_enabled = true; | |
628 TextureAcquisitionCollision(deadline_scheduling_enabled); | |
629 } | |
630 | |
631 void VisibilitySwitchWithTextureAcquisition(bool deadline_scheduling_enabled) { | |
632 FakeSchedulerClient client; | 530 FakeSchedulerClient client; |
633 SchedulerSettings scheduler_settings; | 531 SchedulerSettings scheduler_settings; |
634 scheduler_settings.deadline_scheduling_enabled = deadline_scheduling_enabled; | |
635 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); | 532 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); |
636 scheduler->SetCanStart(); | 533 scheduler->SetCanStart(); |
637 scheduler->SetVisible(true); | 534 scheduler->SetVisible(true); |
638 scheduler->SetCanDraw(true); | 535 scheduler->SetCanDraw(true); |
639 | 536 |
640 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); | 537 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
641 client.Reset(); | 538 client.Reset(); |
642 scheduler->DidCreateAndInitializeOutputSurface(); | 539 scheduler->DidCreateAndInitializeOutputSurface(); |
643 | 540 |
644 scheduler->SetNeedsCommit(); | 541 scheduler->SetNeedsCommit(); |
645 if (deadline_scheduling_enabled) { | 542 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
646 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); | 543 scheduler->OnBeginImplFrameDeadline(); |
647 scheduler->OnBeginImplFrameDeadline(); | |
648 } | |
649 scheduler->FinishCommit(); | 544 scheduler->FinishCommit(); |
650 scheduler->SetMainThreadNeedsLayerTextures(); | 545 scheduler->SetMainThreadNeedsLayerTextures(); |
651 scheduler->SetNeedsCommit(); | 546 scheduler->SetNeedsCommit(); |
652 client.Reset(); | 547 client.Reset(); |
653 // Verify that pending texture acquisition fires when visibility | 548 // Verify that pending texture acquisition fires when visibility |
654 // is lost in order to avoid a deadlock. | 549 // is lost in order to avoid a deadlock. |
655 scheduler->SetVisible(false); | 550 scheduler->SetVisible(false); |
656 EXPECT_SINGLE_ACTION("ScheduledActionAcquireLayerTexturesForMainThread", | 551 EXPECT_SINGLE_ACTION("ScheduledActionAcquireLayerTexturesForMainThread", |
657 client); | 552 client); |
658 | 553 |
659 client.Reset(); | 554 client.Reset(); |
660 scheduler->SetVisible(true); | 555 scheduler->SetVisible(true); |
661 EXPECT_EQ(0, client.num_actions_()); | 556 EXPECT_EQ(0, client.num_actions_()); |
662 EXPECT_TRUE(client.needs_begin_impl_frame()); | 557 EXPECT_TRUE(client.needs_begin_impl_frame()); |
663 | 558 |
664 // Regaining visibility with textures acquired by main thread while | 559 // Regaining visibility with textures acquired by main thread while |
665 // compositor is waiting for first draw should result in a request | 560 // compositor is waiting for first draw should result in a request |
666 // for a new frame in order to escape a deadlock. | 561 // for a new frame in order to escape a deadlock. |
667 client.Reset(); | 562 client.Reset(); |
668 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); | 563 scheduler->BeginImplFrame(BeginFrameArgs::CreateForTesting()); |
669 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 2); | 564 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 2); |
670 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); | 565 EXPECT_ACTION("PostBeginImplFrameDeadlineTask", client, 1, 2); |
671 } | 566 } |
672 | 567 |
673 TEST(SchedulerTest, VisibilitySwitchWithTextureAcquisition) { | |
674 bool deadline_scheduling_enabled = false; | |
675 VisibilitySwitchWithTextureAcquisition(deadline_scheduling_enabled); | |
676 } | |
677 | |
678 TEST(SchedulerTest, VisibilitySwitchWithTextureAcquisition_Deadline) { | |
679 bool deadline_scheduling_enabled = true; | |
680 VisibilitySwitchWithTextureAcquisition(deadline_scheduling_enabled); | |
681 } | |
682 | |
683 class SchedulerClientThatsetNeedsDrawInsideDraw : public FakeSchedulerClient { | 568 class SchedulerClientThatsetNeedsDrawInsideDraw : public FakeSchedulerClient { |
684 public: | 569 public: |
685 virtual void ScheduledActionSendBeginMainFrame() OVERRIDE {} | 570 virtual void ScheduledActionSendBeginMainFrame() OVERRIDE {} |
686 virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible() | 571 virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible() |
687 OVERRIDE { | 572 OVERRIDE { |
688 // Only SetNeedsRedraw the first time this is called | 573 // Only SetNeedsRedraw the first time this is called |
689 if (!num_draws_) | 574 if (!num_draws_) |
690 scheduler_->SetNeedsRedraw(); | 575 scheduler_->SetNeedsRedraw(); |
691 return FakeSchedulerClient::ScheduledActionDrawAndSwapIfPossible(); | 576 return FakeSchedulerClient::ScheduledActionDrawAndSwapIfPossible(); |
692 } | 577 } |
(...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1232 void MainFrameInHighLatencyMode(int64 begin_main_frame_to_commit_estimate_in_ms, | 1117 void MainFrameInHighLatencyMode(int64 begin_main_frame_to_commit_estimate_in_ms, |
1233 int64 commit_to_activate_estimate_in_ms, | 1118 int64 commit_to_activate_estimate_in_ms, |
1234 bool should_send_begin_main_frame) { | 1119 bool should_send_begin_main_frame) { |
1235 // Set up client with specified estimates (draw duration is set to 1). | 1120 // Set up client with specified estimates (draw duration is set to 1). |
1236 SchedulerClientWithFixedEstimates client( | 1121 SchedulerClientWithFixedEstimates client( |
1237 base::TimeDelta::FromMilliseconds(1), | 1122 base::TimeDelta::FromMilliseconds(1), |
1238 base::TimeDelta::FromMilliseconds( | 1123 base::TimeDelta::FromMilliseconds( |
1239 begin_main_frame_to_commit_estimate_in_ms), | 1124 begin_main_frame_to_commit_estimate_in_ms), |
1240 base::TimeDelta::FromMilliseconds(commit_to_activate_estimate_in_ms)); | 1125 base::TimeDelta::FromMilliseconds(commit_to_activate_estimate_in_ms)); |
1241 SchedulerSettings scheduler_settings; | 1126 SchedulerSettings scheduler_settings; |
1242 scheduler_settings.deadline_scheduling_enabled = true; | |
1243 scheduler_settings.switch_to_low_latency_if_possible = true; | 1127 scheduler_settings.switch_to_low_latency_if_possible = true; |
1244 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); | 1128 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); |
1245 scheduler->SetCanStart(); | 1129 scheduler->SetCanStart(); |
1246 scheduler->SetVisible(true); | 1130 scheduler->SetVisible(true); |
1247 scheduler->SetCanDraw(true); | 1131 scheduler->SetCanDraw(true); |
1248 InitializeOutputSurfaceAndFirstCommit(scheduler); | 1132 InitializeOutputSurfaceAndFirstCommit(scheduler); |
1249 | 1133 |
1250 // Impl thread hits deadline before commit finishes. | 1134 // Impl thread hits deadline before commit finishes. |
1251 client.Reset(); | 1135 client.Reset(); |
1252 scheduler->SetNeedsCommit(); | 1136 scheduler->SetNeedsCommit(); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1338 SpinForMillis(interval * 2); | 1222 SpinForMillis(interval * 2); |
1339 EXPECT_GT(client.num_actions_(), actions_so_far); | 1223 EXPECT_GT(client.num_actions_(), actions_so_far); |
1340 EXPECT_STREQ(client.Action(client.num_actions_() - 1), | 1224 EXPECT_STREQ(client.Action(client.num_actions_() - 1), |
1341 "DidAnticipatedDrawTimeChange"); | 1225 "DidAnticipatedDrawTimeChange"); |
1342 actions_so_far = client.num_actions_(); | 1226 actions_so_far = client.num_actions_(); |
1343 } | 1227 } |
1344 } | 1228 } |
1345 | 1229 |
1346 } // namespace | 1230 } // namespace |
1347 } // namespace cc | 1231 } // namespace cc |
OLD | NEW |