| 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 | |
| 5 #include "cc/scheduler/scheduler.h" | 4 #include "cc/scheduler/scheduler.h" |
| 6 | 5 |
| 7 #include <string> | 6 #include <string> |
| 8 #include <vector> | 7 #include <vector> |
| 9 | 8 |
| 10 #include "base/logging.h" | 9 #include "base/logging.h" |
| 11 #include "base/memory/scoped_vector.h" | 10 #include "base/memory/scoped_vector.h" |
| 12 #include "cc/test/scheduler_test_common.h" | 11 #include "cc/test/scheduler_test_common.h" |
| 13 #include "testing/gmock/include/gmock/gmock.h" | 12 #include "testing/gmock/include/gmock/gmock.h" |
| 14 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 28 | 27 |
| 29 namespace cc { | 28 namespace cc { |
| 30 namespace { | 29 namespace { |
| 31 | 30 |
| 32 void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler) { | 31 void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler) { |
| 33 scheduler->DidCreateAndInitializeOutputSurface(); | 32 scheduler->DidCreateAndInitializeOutputSurface(); |
| 34 scheduler->SetNeedsCommit(); | 33 scheduler->SetNeedsCommit(); |
| 35 scheduler->FinishCommit(); | 34 scheduler->FinishCommit(); |
| 36 // Go through the motions to draw the commit. | 35 // Go through the motions to draw the commit. |
| 37 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 36 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 38 // We need another BeginFrame so scheduler calls SetNeedsBeginFrame(false). | 37 scheduler->OnBeginFrameDeadline(); |
| 38 // We need another BeginFrame so Scheduler calls SetNeedsBeginFrame(false). |
| 39 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 39 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 40 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 40 scheduler->OnBeginFrameDeadline(); |
| 41 } | 41 } |
| 42 | 42 |
| 43 class FakeSchedulerClient : public SchedulerClient { | 43 class FakeSchedulerClient : public SchedulerClient { |
| 44 public: | 44 public: |
| 45 FakeSchedulerClient() | 45 FakeSchedulerClient() |
| 46 : needs_begin_frame_(false) { | 46 : needs_begin_frame_(false) { |
| 47 Reset(); | 47 Reset(); |
| 48 } | 48 } |
| 49 | 49 |
| 50 void Reset() { | 50 void Reset() { |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 141 virtual base::TimeDelta DrawDurationEstimate() OVERRIDE { | 141 virtual base::TimeDelta DrawDurationEstimate() OVERRIDE { |
| 142 return base::TimeDelta(); | 142 return base::TimeDelta(); |
| 143 } | 143 } |
| 144 virtual base::TimeDelta BeginFrameToCommitDurationEstimate() OVERRIDE { | 144 virtual base::TimeDelta BeginFrameToCommitDurationEstimate() OVERRIDE { |
| 145 return base::TimeDelta(); | 145 return base::TimeDelta(); |
| 146 } | 146 } |
| 147 virtual base::TimeDelta CommitToActivateDurationEstimate() OVERRIDE { | 147 virtual base::TimeDelta CommitToActivateDurationEstimate() OVERRIDE { |
| 148 return base::TimeDelta(); | 148 return base::TimeDelta(); |
| 149 } | 149 } |
| 150 | 150 |
| 151 virtual void PostBeginFrameDeadline(const base::Closure& closure, |
| 152 base::TimeTicks deadline) OVERRIDE { |
| 153 actions_.push_back("PostBeginFrameDeadlineTask"); |
| 154 states_.push_back(scheduler_->StateAsValue().release()); |
| 155 } |
| 156 |
| 157 virtual void DidBeginFrameDeadlineOnImplThread() OVERRIDE {} |
| 158 |
| 151 protected: | 159 protected: |
| 152 bool needs_begin_frame_; | 160 bool needs_begin_frame_; |
| 153 bool draw_will_happen_; | 161 bool draw_will_happen_; |
| 154 bool swap_will_happen_if_draw_happens_; | 162 bool swap_will_happen_if_draw_happens_; |
| 155 int num_draws_; | 163 int num_draws_; |
| 156 std::vector<const char*> actions_; | 164 std::vector<const char*> actions_; |
| 157 ScopedVector<base::Value> states_; | 165 ScopedVector<base::Value> states_; |
| 158 scoped_ptr<Scheduler> scheduler_; | 166 scoped_ptr<Scheduler> scheduler_; |
| 159 }; | 167 }; |
| 160 | 168 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 176 FakeSchedulerClient client; | 184 FakeSchedulerClient client; |
| 177 SchedulerSettings default_scheduler_settings; | 185 SchedulerSettings default_scheduler_settings; |
| 178 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 186 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
| 179 scheduler->SetCanStart(); | 187 scheduler->SetCanStart(); |
| 180 scheduler->SetVisible(true); | 188 scheduler->SetVisible(true); |
| 181 scheduler->SetCanDraw(true); | 189 scheduler->SetCanDraw(true); |
| 182 | 190 |
| 183 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); | 191 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
| 184 InitializeOutputSurfaceAndFirstCommit(scheduler); | 192 InitializeOutputSurfaceAndFirstCommit(scheduler); |
| 185 | 193 |
| 186 // SetNeedsCommit should begin the frame. | 194 // SetNeedsCommit should begin the frame on the next BeginFrame. |
| 187 client.Reset(); | 195 client.Reset(); |
| 188 scheduler->SetNeedsCommit(); | 196 scheduler->SetNeedsCommit(); |
| 189 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 2); | |
| 190 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2); | |
| 191 EXPECT_TRUE(client.needs_begin_frame()); | 197 EXPECT_TRUE(client.needs_begin_frame()); |
| 192 client.Reset(); | 198 client.Reset(); |
| 193 | 199 |
| 200 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 201 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 2); |
| 202 EXPECT_ACTION("PostBeginFrameDeadlineTask", client, 1, 2); |
| 203 EXPECT_TRUE(client.needs_begin_frame()); |
| 204 client.Reset(); |
| 205 |
| 206 // If we don't swap on the deadline, we need to request another BeginFrame. |
| 207 scheduler->OnBeginFrameDeadline(); |
| 208 EXPECT_SINGLE_ACTION("SetNeedsBeginFrameOnImplThread", client); |
| 209 EXPECT_TRUE(client.needs_begin_frame()); |
| 210 client.Reset(); |
| 211 |
| 194 // FinishCommit should commit | 212 // FinishCommit should commit |
| 195 scheduler->FinishCommit(); | 213 scheduler->FinishCommit(); |
| 196 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 214 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| 197 EXPECT_TRUE(client.needs_begin_frame()); | 215 EXPECT_TRUE(client.needs_begin_frame()); |
| 198 client.Reset(); | 216 client.Reset(); |
| 199 | 217 |
| 200 // BeginFrame should draw. | 218 // BeginFrame should prepare the draw. |
| 201 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 219 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 202 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); | 220 EXPECT_SINGLE_ACTION("PostBeginFrameDeadlineTask", client); |
| 203 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2); | 221 EXPECT_TRUE(client.needs_begin_frame()); |
| 222 client.Reset(); |
| 223 |
| 224 // BeginFrame deadline should draw. |
| 225 scheduler->OnBeginFrameDeadline(); |
| 226 EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client); |
| 227 client.Reset(); |
| 228 |
| 229 // The following BeginFrame deadline should SetNeedsBeginFrame(false) to avoid |
| 230 // excessive toggles. |
| 231 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 232 EXPECT_SINGLE_ACTION("PostBeginFrameDeadlineTask", client); |
| 233 client.Reset(); |
| 234 |
| 235 scheduler->OnBeginFrameDeadline(); |
| 236 EXPECT_SINGLE_ACTION("SetNeedsBeginFrameOnImplThread", client); |
| 204 EXPECT_FALSE(client.needs_begin_frame()); | 237 EXPECT_FALSE(client.needs_begin_frame()); |
| 205 client.Reset(); | 238 client.Reset(); |
| 206 } | 239 } |
| 207 | 240 |
| 208 TEST(SchedulerTest, RequestCommitAfterBeginFrameSentToMainThread) { | 241 TEST(SchedulerTest, RequestCommitAfterBeginFrameSentToMainThread) { |
| 209 FakeSchedulerClient client; | 242 FakeSchedulerClient client; |
| 210 SchedulerSettings default_scheduler_settings; | 243 SchedulerSettings default_scheduler_settings; |
| 211 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 244 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
| 212 scheduler->SetCanStart(); | 245 scheduler->SetCanStart(); |
| 213 scheduler->SetVisible(true); | 246 scheduler->SetVisible(true); |
| 214 scheduler->SetCanDraw(true); | 247 scheduler->SetCanDraw(true); |
| 215 | 248 |
| 216 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); | 249 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
| 217 InitializeOutputSurfaceAndFirstCommit(scheduler); | 250 InitializeOutputSurfaceAndFirstCommit(scheduler); |
| 218 client.Reset(); | 251 client.Reset(); |
| 219 | 252 |
| 220 // SetNedsCommit should begin the frame. | 253 // SetNeddsCommit should begin the frame. |
| 221 scheduler->SetNeedsCommit(); | 254 scheduler->SetNeedsCommit(); |
| 255 EXPECT_SINGLE_ACTION("SetNeedsBeginFrameOnImplThread", client); |
| 256 client.Reset(); |
| 257 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 222 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 2); | 258 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 2); |
| 223 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2); | 259 EXPECT_ACTION("PostBeginFrameDeadlineTask", client, 1, 2); |
| 260 EXPECT_TRUE(client.needs_begin_frame()); |
| 224 client.Reset(); | 261 client.Reset(); |
| 225 | 262 |
| 226 // Now SetNeedsCommit again. Calling here means we need a second frame. | 263 // Now SetNeedsCommit again. Calling here means we need a second commit. |
| 227 scheduler->SetNeedsCommit(); | 264 scheduler->SetNeedsCommit(); |
| 228 | 265 EXPECT_EQ(client.num_actions_(), 0); |
| 229 // Finish the commit for the first frame. | |
| 230 scheduler->FinishCommit(); | |
| 231 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | |
| 232 client.Reset(); | 266 client.Reset(); |
| 233 | 267 |
| 234 // Tick should draw but then begin another frame for the second commit. | 268 // Finish the first commit. |
| 235 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 269 scheduler->FinishCommit(); |
| 236 EXPECT_TRUE(client.needs_begin_frame()); | 270 EXPECT_ACTION("ScheduledActionCommit", client, 0, 2); |
| 237 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); | 271 EXPECT_ACTION("PostBeginFrameDeadlineTask", client, 1, 2); |
| 238 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 1, 2); | 272 client.Reset(); |
| 273 scheduler->OnBeginFrameDeadline(); |
| 274 EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client); |
| 239 client.Reset(); | 275 client.Reset(); |
| 240 | 276 |
| 241 // Finish the second commit to go back to quiescent state and verify we no | 277 // Since another commit is needed, the next BeginFrame should initiate |
| 242 // longer request BeginFrames. | 278 // the second commit. |
| 279 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 280 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 2); |
| 281 EXPECT_ACTION("PostBeginFrameDeadlineTask", client, 1, 2); |
| 282 client.Reset(); |
| 283 |
| 284 // Finishing the commit before the deadline should post a new deadline task |
| 285 // to trigger the deadline early. |
| 243 scheduler->FinishCommit(); | 286 scheduler->FinishCommit(); |
| 287 EXPECT_ACTION("ScheduledActionCommit", client, 0, 2); |
| 288 EXPECT_ACTION("PostBeginFrameDeadlineTask", client, 1, 2); |
| 289 client.Reset(); |
| 290 scheduler->OnBeginFrameDeadline(); |
| 291 EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client); |
| 292 EXPECT_TRUE(client.needs_begin_frame()); |
| 293 |
| 294 // On the next BeginFrame, go back to quiescent state and verify we no longer |
| 295 // request BeginFrames. |
| 244 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 296 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 297 scheduler->OnBeginFrameDeadline(); |
| 245 EXPECT_FALSE(client.needs_begin_frame()); | 298 EXPECT_FALSE(client.needs_begin_frame()); |
| 299 client.Reset(); |
| 246 } | 300 } |
| 247 | 301 |
| 248 TEST(SchedulerTest, TextureAcquisitionCausesCommitInsteadOfDraw) { | 302 TEST(SchedulerTest, TextureAcquisitionCausesCommitInsteadOfDraw) { |
| 249 FakeSchedulerClient client; | 303 FakeSchedulerClient client; |
| 250 SchedulerSettings default_scheduler_settings; | 304 SchedulerSettings default_scheduler_settings; |
| 251 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 305 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
| 252 scheduler->SetCanStart(); | 306 scheduler->SetCanStart(); |
| 253 scheduler->SetVisible(true); | 307 scheduler->SetVisible(true); |
| 254 scheduler->SetCanDraw(true); | 308 scheduler->SetCanDraw(true); |
| 255 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); | 309 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
| 256 | 310 |
| 257 InitializeOutputSurfaceAndFirstCommit(scheduler); | 311 InitializeOutputSurfaceAndFirstCommit(scheduler); |
| 258 client.Reset(); | 312 client.Reset(); |
| 259 scheduler->SetNeedsRedraw(); | 313 scheduler->SetNeedsRedraw(); |
| 260 EXPECT_TRUE(scheduler->RedrawPending()); | 314 EXPECT_TRUE(scheduler->RedrawPending()); |
| 261 EXPECT_SINGLE_ACTION("SetNeedsBeginFrameOnImplThread", client); | 315 EXPECT_SINGLE_ACTION("SetNeedsBeginFrameOnImplThread", client); |
| 262 EXPECT_TRUE(client.needs_begin_frame()); | 316 EXPECT_TRUE(client.needs_begin_frame()); |
| 263 | 317 |
| 264 client.Reset(); | 318 client.Reset(); |
| 265 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 319 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 266 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); | 320 EXPECT_SINGLE_ACTION("PostBeginFrameDeadlineTask", client); |
| 267 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2); | 321 |
| 322 client.Reset(); |
| 323 scheduler->OnBeginFrameDeadline(); |
| 324 EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client); |
| 268 EXPECT_FALSE(scheduler->RedrawPending()); | 325 EXPECT_FALSE(scheduler->RedrawPending()); |
| 269 EXPECT_FALSE(client.needs_begin_frame()); | |
| 270 | 326 |
| 271 client.Reset(); | 327 client.Reset(); |
| 272 scheduler->SetMainThreadNeedsLayerTextures(); | 328 scheduler->SetMainThreadNeedsLayerTextures(); |
| 273 EXPECT_SINGLE_ACTION("ScheduledActionAcquireLayerTexturesForMainThread", | 329 EXPECT_SINGLE_ACTION("ScheduledActionAcquireLayerTexturesForMainThread", |
| 274 client); | 330 client); |
| 275 | 331 |
| 276 // We should request a BeginFrame in anticipation of a draw. | 332 // We should request a BeginFrame in anticipation of a draw. |
| 277 client.Reset(); | 333 client.Reset(); |
| 278 scheduler->SetNeedsRedraw(); | 334 scheduler->SetNeedsRedraw(); |
| 279 EXPECT_TRUE(scheduler->RedrawPending()); | 335 EXPECT_TRUE(scheduler->RedrawPending()); |
| 280 EXPECT_SINGLE_ACTION("SetNeedsBeginFrameOnImplThread", client); | 336 EXPECT_EQ(0, client.num_actions_()); |
| 281 EXPECT_TRUE(client.needs_begin_frame()); | |
| 282 | 337 |
| 283 // No draw happens since the textures are acquired by the main thread. | 338 // No draw happens since the textures are acquired by the main thread. |
| 284 client.Reset(); | 339 client.Reset(); |
| 285 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 340 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 341 EXPECT_SINGLE_ACTION("PostBeginFrameDeadlineTask", client); |
| 342 |
| 343 client.Reset(); |
| 344 scheduler->OnBeginFrameDeadline(); |
| 286 EXPECT_SINGLE_ACTION("SetNeedsBeginFrameOnImplThread", client); | 345 EXPECT_SINGLE_ACTION("SetNeedsBeginFrameOnImplThread", client); |
| 287 EXPECT_TRUE(scheduler->RedrawPending()); | 346 EXPECT_TRUE(scheduler->RedrawPending()); |
| 288 EXPECT_TRUE(client.needs_begin_frame()); | 347 EXPECT_TRUE(client.needs_begin_frame()); |
| 289 | 348 |
| 349 client.Reset(); |
| 290 scheduler->SetNeedsCommit(); | 350 scheduler->SetNeedsCommit(); |
| 291 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 0, 2); | 351 EXPECT_EQ(0, client.num_actions_()); |
| 292 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 1, 2); | 352 |
| 293 EXPECT_TRUE(client.needs_begin_frame()); | 353 client.Reset(); |
| 354 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 355 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 2); |
| 356 EXPECT_ACTION("PostBeginFrameDeadlineTask", client, 1, 2); |
| 294 | 357 |
| 295 // Commit will release the texture. | 358 // Commit will release the texture. |
| 296 client.Reset(); | 359 client.Reset(); |
| 297 scheduler->FinishCommit(); | 360 scheduler->FinishCommit(); |
| 298 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 361 EXPECT_ACTION("ScheduledActionCommit", client, 0, 2); |
| 362 EXPECT_ACTION("PostBeginFrameDeadlineTask", client, 1, 2); |
| 299 EXPECT_TRUE(scheduler->RedrawPending()); | 363 EXPECT_TRUE(scheduler->RedrawPending()); |
| 300 EXPECT_TRUE(client.needs_begin_frame()); | |
| 301 | 364 |
| 302 // Now we can draw again after the commit happens. | 365 // Now we can draw again after the commit happens. |
| 303 client.Reset(); | 366 client.Reset(); |
| 367 scheduler->OnBeginFrameDeadline(); |
| 368 EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client); |
| 369 EXPECT_FALSE(scheduler->RedrawPending()); |
| 370 |
| 371 // SetNeedsBeginFrame(false) should be deferred to the end of the next |
| 372 // BeginFrame to avoid excessive toggling. |
| 373 EXPECT_TRUE(client.needs_begin_frame()); |
| 304 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 374 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 305 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); | 375 scheduler->OnBeginFrameDeadline(); |
| 306 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2); | |
| 307 EXPECT_FALSE(scheduler->RedrawPending()); | |
| 308 EXPECT_FALSE(client.needs_begin_frame()); | 376 EXPECT_FALSE(client.needs_begin_frame()); |
| 309 client.Reset(); | |
| 310 } | 377 } |
| 311 | 378 |
| 312 TEST(SchedulerTest, TextureAcquisitionCollision) { | 379 TEST(SchedulerTest, TextureAcquisitionCollision) { |
| 313 FakeSchedulerClient client; | 380 FakeSchedulerClient client; |
| 314 SchedulerSettings default_scheduler_settings; | 381 SchedulerSettings default_scheduler_settings; |
| 315 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 382 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
| 316 scheduler->SetCanStart(); | 383 scheduler->SetCanStart(); |
| 317 scheduler->SetVisible(true); | 384 scheduler->SetVisible(true); |
| 318 scheduler->SetCanDraw(true); | 385 scheduler->SetCanDraw(true); |
| 319 | 386 |
| 320 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); | 387 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
| 321 InitializeOutputSurfaceAndFirstCommit(scheduler); | 388 InitializeOutputSurfaceAndFirstCommit(scheduler); |
| 322 | 389 |
| 323 client.Reset(); | 390 client.Reset(); |
| 324 scheduler->SetNeedsCommit(); | 391 scheduler->SetNeedsCommit(); |
| 325 scheduler->SetMainThreadNeedsLayerTextures(); | 392 scheduler->SetMainThreadNeedsLayerTextures(); |
| 326 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 3); | 393 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 0, 2); |
| 327 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 3); | |
| 328 EXPECT_ACTION( | 394 EXPECT_ACTION( |
| 329 "ScheduledActionAcquireLayerTexturesForMainThread", client, 2, 3); | 395 "ScheduledActionAcquireLayerTexturesForMainThread", client, 1, 2); |
| 396 |
| 330 client.Reset(); | 397 client.Reset(); |
| 398 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 399 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 2); |
| 400 EXPECT_ACTION("PostBeginFrameDeadlineTask", client, 1, 2); |
| 401 |
| 402 client.Reset(); |
| 403 scheduler->OnBeginFrameDeadline(); |
| 404 EXPECT_SINGLE_ACTION("SetNeedsBeginFrameOnImplThread", client); |
| 331 | 405 |
| 332 // Although the compositor cannot draw because textures are locked by main | 406 // Although the compositor cannot draw because textures are locked by main |
| 333 // thread, we continue requesting SetNeedsBeginFrame in anticipation of the | 407 // thread, we continue requesting SetNeedsBeginFrame in anticipation of the |
| 334 // unlock. | 408 // unlock. |
| 335 EXPECT_TRUE(client.needs_begin_frame()); | 409 EXPECT_TRUE(client.needs_begin_frame()); |
| 336 | 410 |
| 337 // Trigger the commit | 411 // Trigger the commit |
| 338 scheduler->FinishCommit(); | 412 scheduler->FinishCommit(); |
| 339 EXPECT_TRUE(client.needs_begin_frame()); | 413 EXPECT_TRUE(client.needs_begin_frame()); |
| 340 client.Reset(); | |
| 341 | 414 |
| 342 // Between commit and draw, texture acquisition for main thread delayed, | 415 // Between commit and draw, texture acquisition for main thread delayed, |
| 343 // and main thread blocks. | 416 // and main thread blocks. |
| 417 client.Reset(); |
| 344 scheduler->SetMainThreadNeedsLayerTextures(); | 418 scheduler->SetMainThreadNeedsLayerTextures(); |
| 345 EXPECT_EQ(0, client.num_actions_()); | 419 EXPECT_EQ(0, client.num_actions_()); |
| 346 client.Reset(); | |
| 347 | 420 |
| 348 // No implicit commit is expected. | 421 // No implicit commit is expected. |
| 422 client.Reset(); |
| 349 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 423 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 350 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 3); | 424 EXPECT_SINGLE_ACTION("PostBeginFrameDeadlineTask", client); |
| 351 EXPECT_ACTION("ScheduledActionAcquireLayerTexturesForMainThread", | 425 |
| 352 client, | |
| 353 1, | |
| 354 3); | |
| 355 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 2, 3); | |
| 356 client.Reset(); | 426 client.Reset(); |
| 427 scheduler->OnBeginFrameDeadline(); |
| 428 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
| 429 EXPECT_ACTION( |
| 430 "ScheduledActionAcquireLayerTexturesForMainThread", client, 1, 2); |
| 357 | 431 |
| 358 // Compositor not scheduled to draw because textures are locked by main | 432 // Although the compositor is not scheduled to draw because textures are |
| 359 // thread. | 433 // locked by main thread, we proactively request the begin frame. |
| 360 EXPECT_FALSE(client.needs_begin_frame()); | 434 EXPECT_TRUE(client.needs_begin_frame()); |
| 361 | 435 |
| 362 // Needs an explicit commit from the main thread. | 436 // Needs an explicit commit from the main thread. |
| 437 client.Reset(); |
| 363 scheduler->SetNeedsCommit(); | 438 scheduler->SetNeedsCommit(); |
| 439 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 364 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 2); | 440 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 2); |
| 365 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2); | 441 EXPECT_ACTION("PostBeginFrameDeadlineTask", client, 1, 2); |
| 366 client.Reset(); | 442 client.Reset(); |
| 367 | 443 |
| 368 // Trigger the commit | 444 // Trigger the commit |
| 369 scheduler->FinishCommit(); | 445 scheduler->FinishCommit(); |
| 370 EXPECT_TRUE(client.needs_begin_frame()); | 446 EXPECT_TRUE(client.needs_begin_frame()); |
| 371 } | 447 } |
| 372 | 448 |
| 373 TEST(SchedulerTest, VisibilitySwitchWithTextureAcquisition) { | 449 TEST(SchedulerTest, VisibilitySwitchWithTextureAcquisition) { |
| 374 FakeSchedulerClient client; | 450 FakeSchedulerClient client; |
| 375 SchedulerSettings default_scheduler_settings; | 451 SchedulerSettings default_scheduler_settings; |
| 376 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 452 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
| 377 scheduler->SetCanStart(); | 453 scheduler->SetCanStart(); |
| 378 scheduler->SetVisible(true); | 454 scheduler->SetVisible(true); |
| 379 scheduler->SetCanDraw(true); | 455 scheduler->SetCanDraw(true); |
| 380 | 456 |
| 381 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); | 457 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
| 382 client.Reset(); | 458 client.Reset(); |
| 383 scheduler->DidCreateAndInitializeOutputSurface(); | 459 scheduler->DidCreateAndInitializeOutputSurface(); |
| 384 | 460 |
| 385 scheduler->SetNeedsCommit(); | 461 scheduler->SetNeedsCommit(); |
| 462 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 463 scheduler->OnBeginFrameDeadline(); |
| 386 scheduler->FinishCommit(); | 464 scheduler->FinishCommit(); |
| 387 scheduler->SetMainThreadNeedsLayerTextures(); | 465 scheduler->SetMainThreadNeedsLayerTextures(); |
| 388 scheduler->SetNeedsCommit(); | 466 scheduler->SetNeedsCommit(); |
| 389 client.Reset(); | 467 client.Reset(); |
| 390 // Verify that pending texture acquisition fires when visibility | 468 // Verify that pending texture acquisition fires when visibility |
| 391 // is lost in order to avoid a deadlock. | 469 // is lost in order to avoid a deadlock. |
| 392 scheduler->SetVisible(false); | 470 scheduler->SetVisible(false); |
| 393 EXPECT_SINGLE_ACTION("ScheduledActionAcquireLayerTexturesForMainThread", | 471 EXPECT_SINGLE_ACTION("ScheduledActionAcquireLayerTexturesForMainThread", |
| 394 client); | 472 client); |
| 395 client.Reset(); | |
| 396 | 473 |
| 397 // Already sent a begin frame on this current frame, so wait. | 474 // Already sent a begin frame on this current frame, so wait. |
| 475 client.Reset(); |
| 398 scheduler->SetVisible(true); | 476 scheduler->SetVisible(true); |
| 399 EXPECT_EQ(0, client.num_actions_()); | 477 EXPECT_EQ(0, client.num_actions_()); |
| 400 client.Reset(); | 478 EXPECT_TRUE(client.needs_begin_frame()); |
| 401 | 479 |
| 402 // Regaining visibility with textures acquired by main thread while | 480 // Regaining visibility with textures acquired by main thread while |
| 403 // compositor is waiting for first draw should result in a request | 481 // compositor is waiting for first draw should result in a request |
| 404 // for a new frame in order to escape a deadlock. | 482 // for a new frame in order to escape a deadlock. |
| 483 client.Reset(); |
| 405 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 484 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 406 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 2); | 485 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 2); |
| 407 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2); | 486 EXPECT_ACTION("PostBeginFrameDeadlineTask", client, 1, 2); |
| 408 } | 487 } |
| 409 | 488 |
| 410 class SchedulerClientThatsetNeedsDrawInsideDraw : public FakeSchedulerClient { | 489 class SchedulerClientThatsetNeedsDrawInsideDraw : public FakeSchedulerClient { |
| 411 public: | 490 public: |
| 412 virtual void ScheduledActionSendBeginFrameToMainThread() OVERRIDE {} | 491 virtual void ScheduledActionSendBeginFrameToMainThread() OVERRIDE {} |
| 413 virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible() | 492 virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible() |
| 414 OVERRIDE { | 493 OVERRIDE { |
| 415 // Only SetNeedsRedraw the first time this is called | 494 // Only SetNeedsRedraw the first time this is called |
| 416 if (!num_draws_) | 495 if (!num_draws_) |
| 417 scheduler_->SetNeedsRedraw(); | 496 scheduler_->SetNeedsRedraw(); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 444 scheduler->SetCanDraw(true); | 523 scheduler->SetCanDraw(true); |
| 445 InitializeOutputSurfaceAndFirstCommit(scheduler); | 524 InitializeOutputSurfaceAndFirstCommit(scheduler); |
| 446 client.Reset(); | 525 client.Reset(); |
| 447 | 526 |
| 448 scheduler->SetNeedsRedraw(); | 527 scheduler->SetNeedsRedraw(); |
| 449 EXPECT_TRUE(scheduler->RedrawPending()); | 528 EXPECT_TRUE(scheduler->RedrawPending()); |
| 450 EXPECT_TRUE(client.needs_begin_frame()); | 529 EXPECT_TRUE(client.needs_begin_frame()); |
| 451 EXPECT_EQ(0, client.num_draws()); | 530 EXPECT_EQ(0, client.num_draws()); |
| 452 | 531 |
| 453 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 532 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 533 scheduler->OnBeginFrameDeadline(); |
| 454 EXPECT_EQ(1, client.num_draws()); | 534 EXPECT_EQ(1, client.num_draws()); |
| 455 EXPECT_TRUE(scheduler->RedrawPending()); | 535 EXPECT_TRUE(scheduler->RedrawPending()); |
| 456 EXPECT_TRUE(client.needs_begin_frame()); | 536 EXPECT_TRUE(client.needs_begin_frame()); |
| 457 | 537 |
| 458 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 538 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 539 scheduler->OnBeginFrameDeadline(); |
| 459 EXPECT_EQ(2, client.num_draws()); | 540 EXPECT_EQ(2, client.num_draws()); |
| 460 EXPECT_FALSE(scheduler->RedrawPending()); | 541 EXPECT_FALSE(scheduler->RedrawPending()); |
| 542 EXPECT_TRUE(client.needs_begin_frame()); |
| 543 |
| 544 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 545 scheduler->OnBeginFrameDeadline(); |
| 461 EXPECT_FALSE(client.needs_begin_frame()); | 546 EXPECT_FALSE(client.needs_begin_frame()); |
| 462 } | 547 } |
| 463 | 548 |
| 464 // Test that requesting redraw inside a failed draw doesn't lose the request. | 549 // Test that requesting redraw inside a failed draw doesn't lose the request. |
| 465 TEST(SchedulerTest, RequestRedrawInsideFailedDraw) { | 550 TEST(SchedulerTest, RequestRedrawInsideFailedDraw) { |
| 466 SchedulerClientThatsetNeedsDrawInsideDraw client; | 551 SchedulerClientThatsetNeedsDrawInsideDraw client; |
| 467 SchedulerSettings default_scheduler_settings; | 552 SchedulerSettings default_scheduler_settings; |
| 468 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 553 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
| 469 scheduler->SetCanStart(); | 554 scheduler->SetCanStart(); |
| 470 scheduler->SetVisible(true); | 555 scheduler->SetVisible(true); |
| 471 scheduler->SetCanDraw(true); | 556 scheduler->SetCanDraw(true); |
| 472 InitializeOutputSurfaceAndFirstCommit(scheduler); | 557 InitializeOutputSurfaceAndFirstCommit(scheduler); |
| 473 client.Reset(); | 558 client.Reset(); |
| 474 | 559 |
| 475 client.SetDrawWillHappen(false); | 560 client.SetDrawWillHappen(false); |
| 476 | 561 |
| 477 scheduler->SetNeedsRedraw(); | 562 scheduler->SetNeedsRedraw(); |
| 478 EXPECT_TRUE(scheduler->RedrawPending()); | 563 EXPECT_TRUE(scheduler->RedrawPending()); |
| 479 EXPECT_TRUE(client.needs_begin_frame()); | 564 EXPECT_TRUE(client.needs_begin_frame()); |
| 480 EXPECT_EQ(0, client.num_draws()); | 565 EXPECT_EQ(0, client.num_draws()); |
| 481 | 566 |
| 482 // Fail the draw. | 567 // Fail the draw. |
| 483 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 568 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 569 scheduler->OnBeginFrameDeadline(); |
| 484 EXPECT_EQ(1, client.num_draws()); | 570 EXPECT_EQ(1, client.num_draws()); |
| 485 | 571 |
| 486 // We have a commit pending and the draw failed, and we didn't lose the redraw | 572 // We have a commit pending and the draw failed, and we didn't lose the redraw |
| 487 // request. | 573 // request. |
| 488 EXPECT_TRUE(scheduler->CommitPending()); | 574 EXPECT_TRUE(scheduler->CommitPending()); |
| 489 EXPECT_TRUE(scheduler->RedrawPending()); | 575 EXPECT_TRUE(scheduler->RedrawPending()); |
| 490 EXPECT_TRUE(client.needs_begin_frame()); | 576 EXPECT_TRUE(client.needs_begin_frame()); |
| 491 | 577 |
| 492 // Fail the draw again. | 578 // Fail the draw again. |
| 493 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 579 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 580 scheduler->OnBeginFrameDeadline(); |
| 494 EXPECT_EQ(2, client.num_draws()); | 581 EXPECT_EQ(2, client.num_draws()); |
| 495 EXPECT_TRUE(scheduler->CommitPending()); | 582 EXPECT_TRUE(scheduler->CommitPending()); |
| 496 EXPECT_TRUE(scheduler->RedrawPending()); | 583 EXPECT_TRUE(scheduler->RedrawPending()); |
| 497 EXPECT_TRUE(client.needs_begin_frame()); | 584 EXPECT_TRUE(client.needs_begin_frame()); |
| 498 | 585 |
| 499 // Draw successfully. | 586 // Draw successfully. |
| 500 client.SetDrawWillHappen(true); | 587 client.SetDrawWillHappen(true); |
| 501 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 588 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 589 scheduler->OnBeginFrameDeadline(); |
| 502 EXPECT_EQ(3, client.num_draws()); | 590 EXPECT_EQ(3, client.num_draws()); |
| 503 EXPECT_TRUE(scheduler->CommitPending()); | 591 EXPECT_TRUE(scheduler->CommitPending()); |
| 504 EXPECT_FALSE(scheduler->RedrawPending()); | 592 EXPECT_FALSE(scheduler->RedrawPending()); |
| 505 EXPECT_TRUE(client.needs_begin_frame()); | 593 EXPECT_TRUE(client.needs_begin_frame()); |
| 506 } | 594 } |
| 507 | 595 |
| 508 class SchedulerClientThatSetNeedsCommitInsideDraw : public FakeSchedulerClient { | 596 class SchedulerClientThatSetNeedsCommitInsideDraw : public FakeSchedulerClient { |
| 509 public: | 597 public: |
| 510 SchedulerClientThatSetNeedsCommitInsideDraw() | 598 SchedulerClientThatSetNeedsCommitInsideDraw() |
| 511 : set_needs_commit_on_next_draw_(false) {} | 599 : set_needs_commit_on_next_draw_(false) {} |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 544 TEST(SchedulerTest, RequestCommitInsideDraw) { | 632 TEST(SchedulerTest, RequestCommitInsideDraw) { |
| 545 SchedulerClientThatSetNeedsCommitInsideDraw client; | 633 SchedulerClientThatSetNeedsCommitInsideDraw client; |
| 546 SchedulerSettings default_scheduler_settings; | 634 SchedulerSettings default_scheduler_settings; |
| 547 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 635 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
| 548 scheduler->SetCanStart(); | 636 scheduler->SetCanStart(); |
| 549 scheduler->SetVisible(true); | 637 scheduler->SetVisible(true); |
| 550 scheduler->SetCanDraw(true); | 638 scheduler->SetCanDraw(true); |
| 551 InitializeOutputSurfaceAndFirstCommit(scheduler); | 639 InitializeOutputSurfaceAndFirstCommit(scheduler); |
| 552 client.Reset(); | 640 client.Reset(); |
| 553 | 641 |
| 642 EXPECT_FALSE(client.needs_begin_frame()); |
| 554 scheduler->SetNeedsRedraw(); | 643 scheduler->SetNeedsRedraw(); |
| 555 EXPECT_TRUE(scheduler->RedrawPending()); | 644 EXPECT_TRUE(scheduler->RedrawPending()); |
| 556 EXPECT_EQ(0, client.num_draws()); | 645 EXPECT_EQ(0, client.num_draws()); |
| 557 EXPECT_TRUE(client.needs_begin_frame()); | 646 EXPECT_TRUE(client.needs_begin_frame()); |
| 558 | 647 |
| 559 client.SetNeedsCommitOnNextDraw(); | 648 client.SetNeedsCommitOnNextDraw(); |
| 560 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 649 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 650 client.SetNeedsCommitOnNextDraw(); |
| 651 scheduler->OnBeginFrameDeadline(); |
| 561 EXPECT_EQ(1, client.num_draws()); | 652 EXPECT_EQ(1, client.num_draws()); |
| 562 EXPECT_TRUE(scheduler->CommitPending()); | 653 EXPECT_TRUE(scheduler->CommitPending()); |
| 563 EXPECT_TRUE(client.needs_begin_frame()); | 654 EXPECT_TRUE(client.needs_begin_frame()); |
| 564 scheduler->FinishCommit(); | 655 scheduler->FinishCommit(); |
| 565 | 656 |
| 566 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 657 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 567 EXPECT_EQ(2, client.num_draws());; | 658 scheduler->OnBeginFrameDeadline(); |
| 659 EXPECT_EQ(2, client.num_draws()); |
| 660 |
| 568 EXPECT_FALSE(scheduler->RedrawPending()); | 661 EXPECT_FALSE(scheduler->RedrawPending()); |
| 569 EXPECT_FALSE(scheduler->CommitPending()); | 662 EXPECT_FALSE(scheduler->CommitPending()); |
| 663 EXPECT_TRUE(client.needs_begin_frame()); |
| 664 |
| 665 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 666 scheduler->OnBeginFrameDeadline(); |
| 570 EXPECT_FALSE(client.needs_begin_frame()); | 667 EXPECT_FALSE(client.needs_begin_frame()); |
| 571 } | 668 } |
| 572 | 669 |
| 573 // Tests that when a draw fails then the pending commit should not be dropped. | 670 // Tests that when a draw fails then the pending commit should not be dropped. |
| 574 TEST(SchedulerTest, RequestCommitInsideFailedDraw) { | 671 TEST(SchedulerTest, RequestCommitInsideFailedDraw) { |
| 575 SchedulerClientThatsetNeedsDrawInsideDraw client; | 672 SchedulerClientThatsetNeedsDrawInsideDraw client; |
| 576 SchedulerSettings default_scheduler_settings; | 673 SchedulerSettings default_scheduler_settings; |
| 577 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 674 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
| 578 scheduler->SetCanStart(); | 675 scheduler->SetCanStart(); |
| 579 scheduler->SetVisible(true); | 676 scheduler->SetVisible(true); |
| 580 scheduler->SetCanDraw(true); | 677 scheduler->SetCanDraw(true); |
| 581 InitializeOutputSurfaceAndFirstCommit(scheduler); | 678 InitializeOutputSurfaceAndFirstCommit(scheduler); |
| 582 client.Reset(); | 679 client.Reset(); |
| 583 | 680 |
| 584 client.SetDrawWillHappen(false); | 681 client.SetDrawWillHappen(false); |
| 585 | 682 |
| 586 scheduler->SetNeedsRedraw(); | 683 scheduler->SetNeedsRedraw(); |
| 587 EXPECT_TRUE(scheduler->RedrawPending()); | 684 EXPECT_TRUE(scheduler->RedrawPending()); |
| 588 EXPECT_TRUE(client.needs_begin_frame()); | 685 EXPECT_TRUE(client.needs_begin_frame()); |
| 589 EXPECT_EQ(0, client.num_draws()); | 686 EXPECT_EQ(0, client.num_draws()); |
| 590 | 687 |
| 591 // Fail the draw. | 688 // Fail the draw. |
| 592 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 689 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 690 scheduler->OnBeginFrameDeadline(); |
| 593 EXPECT_EQ(1, client.num_draws()); | 691 EXPECT_EQ(1, client.num_draws()); |
| 594 | 692 |
| 595 // We have a commit pending and the draw failed, and we didn't lose the commit | 693 // We have a commit pending and the draw failed, and we didn't lose the commit |
| 596 // request. | 694 // request. |
| 597 EXPECT_TRUE(scheduler->CommitPending()); | 695 EXPECT_TRUE(scheduler->CommitPending()); |
| 598 EXPECT_TRUE(scheduler->RedrawPending()); | 696 EXPECT_TRUE(scheduler->RedrawPending()); |
| 599 EXPECT_TRUE(client.needs_begin_frame()); | 697 EXPECT_TRUE(client.needs_begin_frame()); |
| 600 | 698 |
| 601 // Fail the draw again. | 699 // Fail the draw again. |
| 602 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 700 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 701 scheduler->OnBeginFrameDeadline(); |
| 603 EXPECT_EQ(2, client.num_draws()); | 702 EXPECT_EQ(2, client.num_draws()); |
| 604 EXPECT_TRUE(scheduler->CommitPending()); | 703 EXPECT_TRUE(scheduler->CommitPending()); |
| 605 EXPECT_TRUE(scheduler->RedrawPending()); | 704 EXPECT_TRUE(scheduler->RedrawPending()); |
| 606 EXPECT_TRUE(client.needs_begin_frame()); | 705 EXPECT_TRUE(client.needs_begin_frame()); |
| 607 | 706 |
| 608 // Draw successfully. | 707 // Draw successfully. |
| 609 client.SetDrawWillHappen(true); | 708 client.SetDrawWillHappen(true); |
| 610 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 709 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 710 scheduler->OnBeginFrameDeadline(); |
| 611 EXPECT_EQ(3, client.num_draws()); | 711 EXPECT_EQ(3, client.num_draws()); |
| 612 EXPECT_TRUE(scheduler->CommitPending()); | 712 EXPECT_TRUE(scheduler->CommitPending()); |
| 613 EXPECT_FALSE(scheduler->RedrawPending()); | 713 EXPECT_FALSE(scheduler->RedrawPending()); |
| 614 EXPECT_TRUE(client.needs_begin_frame()); | 714 EXPECT_TRUE(client.needs_begin_frame()); |
| 615 } | 715 } |
| 616 | 716 |
| 617 TEST(SchedulerTest, NoSwapWhenDrawFails) { | 717 TEST(SchedulerTest, NoSwapWhenDrawFails) { |
| 618 SchedulerClientThatSetNeedsCommitInsideDraw client; | 718 SchedulerClientThatSetNeedsCommitInsideDraw client; |
| 619 SchedulerSettings default_scheduler_settings; | 719 SchedulerSettings default_scheduler_settings; |
| 620 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 720 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
| 621 scheduler->SetCanStart(); | 721 scheduler->SetCanStart(); |
| 622 scheduler->SetVisible(true); | 722 scheduler->SetVisible(true); |
| 623 scheduler->SetCanDraw(true); | 723 scheduler->SetCanDraw(true); |
| 624 InitializeOutputSurfaceAndFirstCommit(scheduler); | 724 InitializeOutputSurfaceAndFirstCommit(scheduler); |
| 625 client.Reset(); | 725 client.Reset(); |
| 626 | 726 |
| 627 scheduler->SetNeedsRedraw(); | 727 scheduler->SetNeedsRedraw(); |
| 628 EXPECT_TRUE(scheduler->RedrawPending()); | 728 EXPECT_TRUE(scheduler->RedrawPending()); |
| 629 EXPECT_TRUE(client.needs_begin_frame()); | 729 EXPECT_TRUE(client.needs_begin_frame()); |
| 630 EXPECT_EQ(0, client.num_draws()); | 730 EXPECT_EQ(0, client.num_draws()); |
| 631 | 731 |
| 632 // Draw successfully, this starts a new frame. | 732 // Draw successfully, this starts a new frame. |
| 633 client.SetNeedsCommitOnNextDraw(); | 733 client.SetNeedsCommitOnNextDraw(); |
| 634 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 734 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 735 scheduler->OnBeginFrameDeadline(); |
| 635 EXPECT_EQ(1, client.num_draws()); | 736 EXPECT_EQ(1, client.num_draws()); |
| 636 | 737 |
| 637 scheduler->SetNeedsRedraw(); | 738 scheduler->SetNeedsRedraw(); |
| 638 EXPECT_TRUE(scheduler->RedrawPending()); | 739 EXPECT_TRUE(scheduler->RedrawPending()); |
| 639 EXPECT_TRUE(client.needs_begin_frame()); | 740 EXPECT_TRUE(client.needs_begin_frame()); |
| 640 | 741 |
| 641 // Fail to draw, this should not start a frame. | 742 // Fail to draw, this should not start a frame. |
| 642 client.SetDrawWillHappen(false); | 743 client.SetDrawWillHappen(false); |
| 643 client.SetNeedsCommitOnNextDraw(); | 744 client.SetNeedsCommitOnNextDraw(); |
| 644 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); | 745 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); |
| 746 scheduler->OnBeginFrameDeadline(); |
| 645 EXPECT_EQ(2, client.num_draws()); | 747 EXPECT_EQ(2, client.num_draws()); |
| 646 } | 748 } |
| 647 | 749 |
| 648 TEST(SchedulerTest, NoSwapWhenSwapFailsDuringForcedCommit) { | 750 TEST(SchedulerTest, NoSwapWhenSwapFailsDuringForcedCommit) { |
| 649 FakeSchedulerClient client; | 751 FakeSchedulerClient client; |
| 650 SchedulerSettings default_scheduler_settings; | 752 SchedulerSettings default_scheduler_settings; |
| 651 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 753 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
| 652 | 754 |
| 653 // Tell the client that it will fail to swap. | 755 // Tell the client that it will fail to swap. |
| 654 client.SetDrawWillHappen(true); | 756 client.SetDrawWillHappen(true); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 682 scheduler->FinishCommit(); | 784 scheduler->FinishCommit(); |
| 683 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndReadback")); | 785 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndReadback")); |
| 684 | 786 |
| 685 // The replacement commit comes in after 2 readbacks. | 787 // The replacement commit comes in after 2 readbacks. |
| 686 client.Reset(); | 788 client.Reset(); |
| 687 scheduler->FinishCommit(); | 789 scheduler->FinishCommit(); |
| 688 } | 790 } |
| 689 | 791 |
| 690 } // namespace | 792 } // namespace |
| 691 } // namespace cc | 793 } // namespace cc |
| OLD | NEW |