| 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::CreateForTesting()); |
| 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::CreateForTesting()); |
| 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::CreateForTesting()); |
| 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::CreateForTesting()); |
| 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::CreateForTesting()); |
| 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::CreateForTesting()); |
| 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::CreateForTesting()); |
| 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::CreateForTesting()); |
| 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::CreateForTesting()); |
| 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::CreateForTesting()); |
| 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::CreateForTesting()); |
| 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::CreateForTesting()); |
| 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::CreateForTesting()); |
| 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::CreateForTesting()); |
| 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::CreateForTesting()); |
| 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::CreateForTesting()); |
| 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::CreateForTesting()); |
| 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::CreateForTesting()); |
| 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::CreateForTesting()); |
| 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 |