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 | 4 |
5 #include "cc/scheduler/scheduler.h" | 5 #include "cc/scheduler/scheduler.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 EXPECT_TRUE(client.needs_begin_frame()); | 159 EXPECT_TRUE(client.needs_begin_frame()); |
160 client.Reset(); | 160 client.Reset(); |
161 | 161 |
162 // FinishCommit should commit | 162 // FinishCommit should commit |
163 scheduler->FinishCommit(); | 163 scheduler->FinishCommit(); |
164 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 164 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
165 EXPECT_TRUE(client.needs_begin_frame()); | 165 EXPECT_TRUE(client.needs_begin_frame()); |
166 client.Reset(); | 166 client.Reset(); |
167 | 167 |
168 // BeginFrame should draw. | 168 // BeginFrame should draw. |
169 scheduler->BeginFrame(base::TimeTicks::Now()); | 169 scheduler->BeginFrame(BeginFrameArgs::CreateBeginFrameForTesting()); |
170 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); | 170 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
171 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2); | 171 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2); |
172 EXPECT_FALSE(client.needs_begin_frame()); | 172 EXPECT_FALSE(client.needs_begin_frame()); |
173 client.Reset(); | 173 client.Reset(); |
174 } | 174 } |
175 | 175 |
176 TEST(SchedulerTest, RequestCommitAfterBeginFrameSentToMainThread) { | 176 TEST(SchedulerTest, RequestCommitAfterBeginFrameSentToMainThread) { |
177 FakeSchedulerClient client; | 177 FakeSchedulerClient client; |
178 SchedulerSettings default_scheduler_settings; | 178 SchedulerSettings default_scheduler_settings; |
179 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 179 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
(...skipping 14 matching lines...) Expand all Loading... |
194 // Now SetNeedsCommit again. Calling here means we need a second frame. | 194 // Now SetNeedsCommit again. Calling here means we need a second frame. |
195 scheduler->SetNeedsCommit(); | 195 scheduler->SetNeedsCommit(); |
196 | 196 |
197 // Since another commit is needed, FinishCommit should commit, | 197 // Since another commit is needed, FinishCommit should commit, |
198 // then begin another frame. | 198 // then begin another frame. |
199 scheduler->FinishCommit(); | 199 scheduler->FinishCommit(); |
200 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 200 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
201 client.Reset(); | 201 client.Reset(); |
202 | 202 |
203 // Tick should draw but then begin another frame. | 203 // Tick should draw but then begin another frame. |
204 scheduler->BeginFrame(base::TimeTicks::Now()); | 204 scheduler->BeginFrame(BeginFrameArgs::CreateBeginFrameForTesting()); |
205 EXPECT_TRUE(client.needs_begin_frame()); | 205 EXPECT_TRUE(client.needs_begin_frame()); |
206 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); | 206 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
207 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 1, 2); | 207 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 1, 2); |
208 client.Reset(); | 208 client.Reset(); |
209 | 209 |
210 // Go back to quiescent state and verify we no longer request BeginFrames. | 210 // Go back to quiescent state and verify we no longer request BeginFrames. |
211 scheduler->FinishCommit(); | 211 scheduler->FinishCommit(); |
212 scheduler->BeginFrame(base::TimeTicks::Now()); | 212 scheduler->BeginFrame(BeginFrameArgs::CreateBeginFrameForTesting()); |
213 EXPECT_FALSE(client.needs_begin_frame()); | 213 EXPECT_FALSE(client.needs_begin_frame()); |
214 } | 214 } |
215 | 215 |
216 TEST(SchedulerTest, TextureAcquisitionCausesCommitInsteadOfDraw) { | 216 TEST(SchedulerTest, TextureAcquisitionCausesCommitInsteadOfDraw) { |
217 FakeSchedulerClient client; | 217 FakeSchedulerClient client; |
218 SchedulerSettings default_scheduler_settings; | 218 SchedulerSettings default_scheduler_settings; |
219 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 219 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
220 scheduler->SetCanStart(); | 220 scheduler->SetCanStart(); |
221 scheduler->SetVisible(true); | 221 scheduler->SetVisible(true); |
222 scheduler->SetCanDraw(true); | 222 scheduler->SetCanDraw(true); |
223 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); | 223 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
224 | 224 |
225 client.Reset(); | 225 client.Reset(); |
226 scheduler->DidCreateAndInitializeOutputSurface(); | 226 scheduler->DidCreateAndInitializeOutputSurface(); |
227 scheduler->SetNeedsRedraw(); | 227 scheduler->SetNeedsRedraw(); |
228 EXPECT_TRUE(scheduler->RedrawPending()); | 228 EXPECT_TRUE(scheduler->RedrawPending()); |
229 EXPECT_SINGLE_ACTION("SetNeedsBeginFrameOnImplThread", client); | 229 EXPECT_SINGLE_ACTION("SetNeedsBeginFrameOnImplThread", client); |
230 EXPECT_TRUE(client.needs_begin_frame()); | 230 EXPECT_TRUE(client.needs_begin_frame()); |
231 | 231 |
232 client.Reset(); | 232 client.Reset(); |
233 scheduler->BeginFrame(base::TimeTicks::Now()); | 233 scheduler->BeginFrame(BeginFrameArgs::CreateBeginFrameForTesting()); |
234 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); | 234 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
235 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2); | 235 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2); |
236 EXPECT_FALSE(scheduler->RedrawPending()); | 236 EXPECT_FALSE(scheduler->RedrawPending()); |
237 EXPECT_FALSE(client.needs_begin_frame()); | 237 EXPECT_FALSE(client.needs_begin_frame()); |
238 | 238 |
239 client.Reset(); | 239 client.Reset(); |
240 scheduler->SetMainThreadNeedsLayerTextures(); | 240 scheduler->SetMainThreadNeedsLayerTextures(); |
241 EXPECT_ACTION("ScheduledActionAcquireLayerTexturesForMainThread", | 241 EXPECT_ACTION("ScheduledActionAcquireLayerTexturesForMainThread", |
242 client, | 242 client, |
243 0, | 243 0, |
244 3); | 244 3); |
245 // A commit was started by SetMainThreadNeedsLayerTextures(). | 245 // A commit was started by SetMainThreadNeedsLayerTextures(). |
246 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 1, 3); | 246 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 1, 3); |
247 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 2, 3); | 247 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 2, 3); |
248 | 248 |
249 // We should request a BeginFrame in anticipation of a draw. | 249 // We should request a BeginFrame in anticipation of a draw. |
250 client.Reset(); | 250 client.Reset(); |
251 scheduler->SetNeedsRedraw(); | 251 scheduler->SetNeedsRedraw(); |
252 EXPECT_TRUE(scheduler->RedrawPending()); | 252 EXPECT_TRUE(scheduler->RedrawPending()); |
253 EXPECT_TRUE(client.needs_begin_frame()); | 253 EXPECT_TRUE(client.needs_begin_frame()); |
254 | 254 |
255 // No draw happens since the textures are acquired by the main thread. | 255 // No draw happens since the textures are acquired by the main thread. |
256 client.Reset(); | 256 client.Reset(); |
257 scheduler->BeginFrame(base::TimeTicks::Now()); | 257 scheduler->BeginFrame(BeginFrameArgs::CreateBeginFrameForTesting()); |
258 EXPECT_SINGLE_ACTION("SetNeedsBeginFrameOnImplThread", client); | 258 EXPECT_SINGLE_ACTION("SetNeedsBeginFrameOnImplThread", client); |
259 EXPECT_TRUE(scheduler->RedrawPending()); | 259 EXPECT_TRUE(scheduler->RedrawPending()); |
260 EXPECT_TRUE(client.needs_begin_frame()); | 260 EXPECT_TRUE(client.needs_begin_frame()); |
261 | 261 |
262 // Commit will release the texture. | 262 // Commit will release the texture. |
263 client.Reset(); | 263 client.Reset(); |
264 scheduler->FinishCommit(); | 264 scheduler->FinishCommit(); |
265 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 265 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
266 EXPECT_TRUE(scheduler->RedrawPending()); | 266 EXPECT_TRUE(scheduler->RedrawPending()); |
267 EXPECT_TRUE(client.needs_begin_frame()); | 267 EXPECT_TRUE(client.needs_begin_frame()); |
268 | 268 |
269 // Now we can draw again after the commit happens. | 269 // Now we can draw again after the commit happens. |
270 client.Reset(); | 270 client.Reset(); |
271 scheduler->BeginFrame(base::TimeTicks::Now()); | 271 scheduler->BeginFrame(BeginFrameArgs::CreateBeginFrameForTesting()); |
272 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); | 272 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
273 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2); | 273 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2); |
274 EXPECT_FALSE(scheduler->RedrawPending()); | 274 EXPECT_FALSE(scheduler->RedrawPending()); |
275 EXPECT_FALSE(client.needs_begin_frame()); | 275 EXPECT_FALSE(client.needs_begin_frame()); |
276 client.Reset(); | 276 client.Reset(); |
277 } | 277 } |
278 | 278 |
279 TEST(SchedulerTest, TextureAcquisitionCollision) { | 279 TEST(SchedulerTest, TextureAcquisitionCollision) { |
280 FakeSchedulerClient client; | 280 FakeSchedulerClient client; |
281 SchedulerSettings default_scheduler_settings; | 281 SchedulerSettings default_scheduler_settings; |
(...skipping 26 matching lines...) Expand all Loading... |
308 EXPECT_TRUE(client.needs_begin_frame()); | 308 EXPECT_TRUE(client.needs_begin_frame()); |
309 client.Reset(); | 309 client.Reset(); |
310 | 310 |
311 // Between commit and draw, texture acquisition for main thread delayed, | 311 // Between commit and draw, texture acquisition for main thread delayed, |
312 // and main thread blocks. | 312 // and main thread blocks. |
313 scheduler->SetMainThreadNeedsLayerTextures(); | 313 scheduler->SetMainThreadNeedsLayerTextures(); |
314 EXPECT_EQ(0, client.num_actions_()); | 314 EXPECT_EQ(0, client.num_actions_()); |
315 client.Reset(); | 315 client.Reset(); |
316 | 316 |
317 // Once compositor draw complete, the delayed texture acquisition fires. | 317 // Once compositor draw complete, the delayed texture acquisition fires. |
318 scheduler->BeginFrame(base::TimeTicks::Now()); | 318 scheduler->BeginFrame(BeginFrameArgs::CreateBeginFrameForTesting()); |
319 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 3); | 319 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 3); |
320 EXPECT_ACTION("ScheduledActionAcquireLayerTexturesForMainThread", | 320 EXPECT_ACTION("ScheduledActionAcquireLayerTexturesForMainThread", |
321 client, | 321 client, |
322 1, | 322 1, |
323 3); | 323 3); |
324 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 2, 3); | 324 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 2, 3); |
325 client.Reset(); | 325 client.Reset(); |
326 } | 326 } |
327 | 327 |
328 TEST(SchedulerTest, VisibilitySwitchWithTextureAcquisition) { | 328 TEST(SchedulerTest, VisibilitySwitchWithTextureAcquisition) { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 scheduler->SetCanStart(); | 389 scheduler->SetCanStart(); |
390 scheduler->SetVisible(true); | 390 scheduler->SetVisible(true); |
391 scheduler->SetCanDraw(true); | 391 scheduler->SetCanDraw(true); |
392 scheduler->DidCreateAndInitializeOutputSurface(); | 392 scheduler->DidCreateAndInitializeOutputSurface(); |
393 | 393 |
394 scheduler->SetNeedsRedraw(); | 394 scheduler->SetNeedsRedraw(); |
395 EXPECT_TRUE(scheduler->RedrawPending()); | 395 EXPECT_TRUE(scheduler->RedrawPending()); |
396 EXPECT_TRUE(client.needs_begin_frame()); | 396 EXPECT_TRUE(client.needs_begin_frame()); |
397 EXPECT_EQ(0, client.num_draws()); | 397 EXPECT_EQ(0, client.num_draws()); |
398 | 398 |
399 scheduler->BeginFrame(base::TimeTicks::Now()); | 399 scheduler->BeginFrame(BeginFrameArgs::CreateBeginFrameForTesting()); |
400 EXPECT_EQ(1, client.num_draws()); | 400 EXPECT_EQ(1, client.num_draws()); |
401 EXPECT_TRUE(scheduler->RedrawPending()); | 401 EXPECT_TRUE(scheduler->RedrawPending()); |
402 EXPECT_TRUE(client.needs_begin_frame()); | 402 EXPECT_TRUE(client.needs_begin_frame()); |
403 | 403 |
404 scheduler->BeginFrame(base::TimeTicks::Now()); | 404 scheduler->BeginFrame(BeginFrameArgs::CreateBeginFrameForTesting()); |
405 EXPECT_EQ(2, client.num_draws()); | 405 EXPECT_EQ(2, client.num_draws()); |
406 EXPECT_FALSE(scheduler->RedrawPending()); | 406 EXPECT_FALSE(scheduler->RedrawPending()); |
407 EXPECT_FALSE(client.needs_begin_frame()); | 407 EXPECT_FALSE(client.needs_begin_frame()); |
408 } | 408 } |
409 | 409 |
410 // Test that requesting redraw inside a failed draw doesn't lose the request. | 410 // Test that requesting redraw inside a failed draw doesn't lose the request. |
411 TEST(SchedulerTest, RequestRedrawInsideFailedDraw) { | 411 TEST(SchedulerTest, RequestRedrawInsideFailedDraw) { |
412 SchedulerClientThatsetNeedsDrawInsideDraw client; | 412 SchedulerClientThatsetNeedsDrawInsideDraw client; |
413 SchedulerSettings default_scheduler_settings; | 413 SchedulerSettings default_scheduler_settings; |
414 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 414 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
415 scheduler->SetCanStart(); | 415 scheduler->SetCanStart(); |
416 scheduler->SetVisible(true); | 416 scheduler->SetVisible(true); |
417 scheduler->SetCanDraw(true); | 417 scheduler->SetCanDraw(true); |
418 scheduler->DidCreateAndInitializeOutputSurface(); | 418 scheduler->DidCreateAndInitializeOutputSurface(); |
419 | 419 |
420 client.SetDrawWillHappen(false); | 420 client.SetDrawWillHappen(false); |
421 | 421 |
422 scheduler->SetNeedsRedraw(); | 422 scheduler->SetNeedsRedraw(); |
423 EXPECT_TRUE(scheduler->RedrawPending()); | 423 EXPECT_TRUE(scheduler->RedrawPending()); |
424 EXPECT_TRUE(client.needs_begin_frame()); | 424 EXPECT_TRUE(client.needs_begin_frame()); |
425 EXPECT_EQ(0, client.num_draws()); | 425 EXPECT_EQ(0, client.num_draws()); |
426 | 426 |
427 // Fail the draw. | 427 // Fail the draw. |
428 scheduler->BeginFrame(base::TimeTicks::Now()); | 428 scheduler->BeginFrame(BeginFrameArgs::CreateBeginFrameForTesting()); |
429 EXPECT_EQ(1, client.num_draws()); | 429 EXPECT_EQ(1, client.num_draws()); |
430 | 430 |
431 // We have a commit pending and the draw failed, and we didn't lose the redraw | 431 // We have a commit pending and the draw failed, and we didn't lose the redraw |
432 // request. | 432 // request. |
433 EXPECT_TRUE(scheduler->CommitPending()); | 433 EXPECT_TRUE(scheduler->CommitPending()); |
434 EXPECT_TRUE(scheduler->RedrawPending()); | 434 EXPECT_TRUE(scheduler->RedrawPending()); |
435 EXPECT_TRUE(client.needs_begin_frame()); | 435 EXPECT_TRUE(client.needs_begin_frame()); |
436 | 436 |
437 // Fail the draw again. | 437 // Fail the draw again. |
438 scheduler->BeginFrame(base::TimeTicks::Now()); | 438 scheduler->BeginFrame(BeginFrameArgs::CreateBeginFrameForTesting()); |
439 EXPECT_EQ(2, client.num_draws()); | 439 EXPECT_EQ(2, client.num_draws()); |
440 EXPECT_TRUE(scheduler->CommitPending()); | 440 EXPECT_TRUE(scheduler->CommitPending()); |
441 EXPECT_TRUE(scheduler->RedrawPending()); | 441 EXPECT_TRUE(scheduler->RedrawPending()); |
442 EXPECT_TRUE(client.needs_begin_frame()); | 442 EXPECT_TRUE(client.needs_begin_frame()); |
443 | 443 |
444 // Draw successfully. | 444 // Draw successfully. |
445 client.SetDrawWillHappen(true); | 445 client.SetDrawWillHappen(true); |
446 scheduler->BeginFrame(base::TimeTicks::Now()); | 446 scheduler->BeginFrame(BeginFrameArgs::CreateBeginFrameForTesting()); |
447 EXPECT_EQ(3, client.num_draws()); | 447 EXPECT_EQ(3, client.num_draws()); |
448 EXPECT_TRUE(scheduler->CommitPending()); | 448 EXPECT_TRUE(scheduler->CommitPending()); |
449 EXPECT_FALSE(scheduler->RedrawPending()); | 449 EXPECT_FALSE(scheduler->RedrawPending()); |
450 EXPECT_TRUE(client.needs_begin_frame()); | 450 EXPECT_TRUE(client.needs_begin_frame()); |
451 } | 451 } |
452 | 452 |
453 class SchedulerClientThatsetNeedsCommitInsideDraw : public FakeSchedulerClient { | 453 class SchedulerClientThatsetNeedsCommitInsideDraw : public FakeSchedulerClient { |
454 public: | 454 public: |
455 virtual void ScheduledActionSendBeginFrameToMainThread() OVERRIDE {} | 455 virtual void ScheduledActionSendBeginFrameToMainThread() OVERRIDE {} |
456 virtual ScheduledActionDrawAndSwapResult | 456 virtual ScheduledActionDrawAndSwapResult |
(...skipping 24 matching lines...) Expand all Loading... |
481 scheduler->SetCanStart(); | 481 scheduler->SetCanStart(); |
482 scheduler->SetVisible(true); | 482 scheduler->SetVisible(true); |
483 scheduler->SetCanDraw(true); | 483 scheduler->SetCanDraw(true); |
484 scheduler->DidCreateAndInitializeOutputSurface(); | 484 scheduler->DidCreateAndInitializeOutputSurface(); |
485 | 485 |
486 scheduler->SetNeedsRedraw(); | 486 scheduler->SetNeedsRedraw(); |
487 EXPECT_TRUE(scheduler->RedrawPending()); | 487 EXPECT_TRUE(scheduler->RedrawPending()); |
488 EXPECT_EQ(0, client.num_draws()); | 488 EXPECT_EQ(0, client.num_draws()); |
489 EXPECT_TRUE(client.needs_begin_frame()); | 489 EXPECT_TRUE(client.needs_begin_frame()); |
490 | 490 |
491 scheduler->BeginFrame(base::TimeTicks::Now()); | 491 scheduler->BeginFrame(BeginFrameArgs::CreateBeginFrameForTesting()); |
492 EXPECT_EQ(1, client.num_draws()); | 492 EXPECT_EQ(1, client.num_draws()); |
493 EXPECT_TRUE(scheduler->CommitPending()); | 493 EXPECT_TRUE(scheduler->CommitPending()); |
494 EXPECT_TRUE(client.needs_begin_frame()); | 494 EXPECT_TRUE(client.needs_begin_frame()); |
495 scheduler->FinishCommit(); | 495 scheduler->FinishCommit(); |
496 | 496 |
497 scheduler->BeginFrame(base::TimeTicks::Now()); | 497 scheduler->BeginFrame(BeginFrameArgs::CreateBeginFrameForTesting()); |
498 EXPECT_EQ(2, client.num_draws());; | 498 EXPECT_EQ(2, client.num_draws());; |
499 EXPECT_FALSE(scheduler->RedrawPending()); | 499 EXPECT_FALSE(scheduler->RedrawPending()); |
500 EXPECT_FALSE(scheduler->CommitPending()); | 500 EXPECT_FALSE(scheduler->CommitPending()); |
501 EXPECT_FALSE(client.needs_begin_frame()); | 501 EXPECT_FALSE(client.needs_begin_frame()); |
502 } | 502 } |
503 | 503 |
504 // Tests that when a draw fails then the pending commit should not be dropped. | 504 // Tests that when a draw fails then the pending commit should not be dropped. |
505 TEST(SchedulerTest, RequestCommitInsideFailedDraw) { | 505 TEST(SchedulerTest, RequestCommitInsideFailedDraw) { |
506 SchedulerClientThatsetNeedsDrawInsideDraw client; | 506 SchedulerClientThatsetNeedsDrawInsideDraw client; |
507 SchedulerSettings default_scheduler_settings; | 507 SchedulerSettings default_scheduler_settings; |
508 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 508 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
509 scheduler->SetCanStart(); | 509 scheduler->SetCanStart(); |
510 scheduler->SetVisible(true); | 510 scheduler->SetVisible(true); |
511 scheduler->SetCanDraw(true); | 511 scheduler->SetCanDraw(true); |
512 scheduler->DidCreateAndInitializeOutputSurface(); | 512 scheduler->DidCreateAndInitializeOutputSurface(); |
513 | 513 |
514 client.SetDrawWillHappen(false); | 514 client.SetDrawWillHappen(false); |
515 | 515 |
516 scheduler->SetNeedsRedraw(); | 516 scheduler->SetNeedsRedraw(); |
517 EXPECT_TRUE(scheduler->RedrawPending()); | 517 EXPECT_TRUE(scheduler->RedrawPending()); |
518 EXPECT_TRUE(client.needs_begin_frame()); | 518 EXPECT_TRUE(client.needs_begin_frame()); |
519 EXPECT_EQ(0, client.num_draws()); | 519 EXPECT_EQ(0, client.num_draws()); |
520 | 520 |
521 // Fail the draw. | 521 // Fail the draw. |
522 scheduler->BeginFrame(base::TimeTicks::Now()); | 522 scheduler->BeginFrame(BeginFrameArgs::CreateBeginFrameForTesting()); |
523 EXPECT_EQ(1, client.num_draws()); | 523 EXPECT_EQ(1, client.num_draws()); |
524 | 524 |
525 // We have a commit pending and the draw failed, and we didn't lose the commit | 525 // We have a commit pending and the draw failed, and we didn't lose the commit |
526 // request. | 526 // request. |
527 EXPECT_TRUE(scheduler->CommitPending()); | 527 EXPECT_TRUE(scheduler->CommitPending()); |
528 EXPECT_TRUE(scheduler->RedrawPending()); | 528 EXPECT_TRUE(scheduler->RedrawPending()); |
529 EXPECT_TRUE(client.needs_begin_frame()); | 529 EXPECT_TRUE(client.needs_begin_frame()); |
530 | 530 |
531 // Fail the draw again. | 531 // Fail the draw again. |
532 scheduler->BeginFrame(base::TimeTicks::Now()); | 532 scheduler->BeginFrame(BeginFrameArgs::CreateBeginFrameForTesting()); |
533 EXPECT_EQ(2, client.num_draws()); | 533 EXPECT_EQ(2, client.num_draws()); |
534 EXPECT_TRUE(scheduler->CommitPending()); | 534 EXPECT_TRUE(scheduler->CommitPending()); |
535 EXPECT_TRUE(scheduler->RedrawPending()); | 535 EXPECT_TRUE(scheduler->RedrawPending()); |
536 EXPECT_TRUE(client.needs_begin_frame()); | 536 EXPECT_TRUE(client.needs_begin_frame()); |
537 | 537 |
538 // Draw successfully. | 538 // Draw successfully. |
539 client.SetDrawWillHappen(true); | 539 client.SetDrawWillHappen(true); |
540 scheduler->BeginFrame(base::TimeTicks::Now()); | 540 scheduler->BeginFrame(BeginFrameArgs::CreateBeginFrameForTesting()); |
541 EXPECT_EQ(3, client.num_draws()); | 541 EXPECT_EQ(3, client.num_draws()); |
542 EXPECT_TRUE(scheduler->CommitPending()); | 542 EXPECT_TRUE(scheduler->CommitPending()); |
543 EXPECT_FALSE(scheduler->RedrawPending()); | 543 EXPECT_FALSE(scheduler->RedrawPending()); |
544 EXPECT_TRUE(client.needs_begin_frame()); | 544 EXPECT_TRUE(client.needs_begin_frame()); |
545 } | 545 } |
546 | 546 |
547 TEST(SchedulerTest, NoSwapWhenDrawFails) { | 547 TEST(SchedulerTest, NoSwapWhenDrawFails) { |
548 SchedulerClientThatsetNeedsCommitInsideDraw client; | 548 SchedulerClientThatsetNeedsCommitInsideDraw client; |
549 SchedulerSettings default_scheduler_settings; | 549 SchedulerSettings default_scheduler_settings; |
550 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 550 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
551 scheduler->SetCanStart(); | 551 scheduler->SetCanStart(); |
552 scheduler->SetVisible(true); | 552 scheduler->SetVisible(true); |
553 scheduler->SetCanDraw(true); | 553 scheduler->SetCanDraw(true); |
554 scheduler->DidCreateAndInitializeOutputSurface(); | 554 scheduler->DidCreateAndInitializeOutputSurface(); |
555 | 555 |
556 scheduler->SetNeedsRedraw(); | 556 scheduler->SetNeedsRedraw(); |
557 EXPECT_TRUE(scheduler->RedrawPending()); | 557 EXPECT_TRUE(scheduler->RedrawPending()); |
558 EXPECT_TRUE(client.needs_begin_frame()); | 558 EXPECT_TRUE(client.needs_begin_frame()); |
559 EXPECT_EQ(0, client.num_draws()); | 559 EXPECT_EQ(0, client.num_draws()); |
560 | 560 |
561 // Draw successfully, this starts a new frame. | 561 // Draw successfully, this starts a new frame. |
562 scheduler->BeginFrame(base::TimeTicks::Now()); | 562 scheduler->BeginFrame(BeginFrameArgs::CreateBeginFrameForTesting()); |
563 EXPECT_EQ(1, client.num_draws()); | 563 EXPECT_EQ(1, client.num_draws()); |
564 | 564 |
565 scheduler->SetNeedsRedraw(); | 565 scheduler->SetNeedsRedraw(); |
566 EXPECT_TRUE(scheduler->RedrawPending()); | 566 EXPECT_TRUE(scheduler->RedrawPending()); |
567 EXPECT_TRUE(client.needs_begin_frame()); | 567 EXPECT_TRUE(client.needs_begin_frame()); |
568 | 568 |
569 // Fail to draw, this should not start a frame. | 569 // Fail to draw, this should not start a frame. |
570 client.SetDrawWillHappen(false); | 570 client.SetDrawWillHappen(false); |
571 scheduler->BeginFrame(base::TimeTicks::Now()); | 571 scheduler->BeginFrame(BeginFrameArgs::CreateBeginFrameForTesting()); |
572 EXPECT_EQ(2, client.num_draws()); | 572 EXPECT_EQ(2, client.num_draws()); |
573 } | 573 } |
574 | 574 |
575 TEST(SchedulerTest, NoSwapWhenSwapFailsDuringForcedCommit) { | 575 TEST(SchedulerTest, NoSwapWhenSwapFailsDuringForcedCommit) { |
576 FakeSchedulerClient client; | 576 FakeSchedulerClient client; |
577 SchedulerSettings default_scheduler_settings; | 577 SchedulerSettings default_scheduler_settings; |
578 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 578 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
579 | 579 |
580 // Tell the client that it will fail to swap. | 580 // Tell the client that it will fail to swap. |
581 client.SetDrawWillHappen(true); | 581 client.SetDrawWillHappen(true); |
582 client.SetSwapWillHappenIfDrawHappens(false); | 582 client.SetSwapWillHappenIfDrawHappens(false); |
583 | 583 |
584 // Get the compositor to do a ScheduledActionDrawAndSwapForced. | 584 // Get the compositor to do a ScheduledActionDrawAndSwapForced. |
585 scheduler->SetCanDraw(true); | 585 scheduler->SetCanDraw(true); |
586 scheduler->SetNeedsRedraw(); | 586 scheduler->SetNeedsRedraw(); |
587 scheduler->SetNeedsForcedRedraw(); | 587 scheduler->SetNeedsForcedRedraw(); |
588 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapForced")); | 588 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapForced")); |
589 } | 589 } |
590 | 590 |
591 } // namespace | 591 } // namespace |
592 } // namespace cc | 592 } // namespace cc |
OLD | NEW |