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

Side by Side Diff: cc/scheduler/scheduler_unittest.cc

Issue 23796002: cc: Implement deadine scheduling disabled by default (Closed) Base URL: http://git.chromium.org/chromium/src.git@schedReadback4
Patch Set: address enne's comments Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 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
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
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
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());
220 EXPECT_SINGLE_ACTION("PostBeginFrameDeadlineTask", client);
221 EXPECT_TRUE(client.needs_begin_frame());
222 client.Reset();
223
224 // BeginFrame deadline should draw.
225 scheduler->OnBeginFrameDeadline();
202 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); 226 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2);
203 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2); 227 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2);
228 client.Reset();
229
230 // The following BeginFrame deadline should SetNeedsBeginFrame(false) to avoid
231 // excessive toggles.
232 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
233 EXPECT_SINGLE_ACTION("PostBeginFrameDeadlineTask", client);
234 client.Reset();
235
236 scheduler->OnBeginFrameDeadline();
237 EXPECT_SINGLE_ACTION("SetNeedsBeginFrameOnImplThread", client);
204 EXPECT_FALSE(client.needs_begin_frame()); 238 EXPECT_FALSE(client.needs_begin_frame());
205 client.Reset(); 239 client.Reset();
206 } 240 }
207 241
208 TEST(SchedulerTest, RequestCommitAfterBeginFrameSentToMainThread) { 242 TEST(SchedulerTest, RequestCommitAfterBeginFrameSentToMainThread) {
209 FakeSchedulerClient client; 243 FakeSchedulerClient client;
210 SchedulerSettings default_scheduler_settings; 244 SchedulerSettings default_scheduler_settings;
211 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); 245 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings);
212 scheduler->SetCanStart(); 246 scheduler->SetCanStart();
213 scheduler->SetVisible(true); 247 scheduler->SetVisible(true);
214 scheduler->SetCanDraw(true); 248 scheduler->SetCanDraw(true);
215 249
216 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); 250 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client);
217 InitializeOutputSurfaceAndFirstCommit(scheduler); 251 InitializeOutputSurfaceAndFirstCommit(scheduler);
218 client.Reset(); 252 client.Reset();
219 253
220 // SetNedsCommit should begin the frame. 254 // SetNeddsCommit should begin the frame.
221 scheduler->SetNeedsCommit(); 255 scheduler->SetNeedsCommit();
256 EXPECT_SINGLE_ACTION("SetNeedsBeginFrameOnImplThread", client);
257 client.Reset();
258 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
222 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 2); 259 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 2);
260 EXPECT_ACTION("PostBeginFrameDeadlineTask", client, 1, 2);
261 EXPECT_TRUE(client.needs_begin_frame());
262 client.Reset();
263
264 // Now SetNeedsCommit again. Calling here means we need a second commit.
265 scheduler->SetNeedsCommit();
266 EXPECT_EQ(client.num_actions_(), 0);
267 client.Reset();
268
269 // Finish the first commit.
270 scheduler->FinishCommit();
271 EXPECT_ACTION("ScheduledActionCommit", client, 0, 2);
272 EXPECT_ACTION("PostBeginFrameDeadlineTask", client, 1, 2);
273 client.Reset();
274 scheduler->OnBeginFrameDeadline();
275 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2);
223 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2); 276 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2);
224 client.Reset(); 277 client.Reset();
225 278
226 // Now SetNeedsCommit again. Calling here means we need a second frame. 279 // Since another commit is needed, the next BeginFrame should initiate
227 scheduler->SetNeedsCommit(); 280 // the second commit.
228 281 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
229 // Finish the commit for the first frame. 282 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 2);
230 scheduler->FinishCommit(); 283 EXPECT_ACTION("PostBeginFrameDeadlineTask", client, 1, 2);
231 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client);
232 client.Reset(); 284 client.Reset();
233 285
234 // Tick should draw but then begin another frame for the second commit. 286 // Finishing the commit before the deadline should post a new deadline task
287 // to trigger the deadline early.
288 scheduler->FinishCommit();
289 EXPECT_ACTION("ScheduledActionCommit", client, 0, 2);
290 EXPECT_ACTION("PostBeginFrameDeadlineTask", client, 1, 2);
291 client.Reset();
292 scheduler->OnBeginFrameDeadline();
293 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2);
294 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2);
295 EXPECT_TRUE(client.needs_begin_frame());
296
297 // On the next BeginFrame, go back to quiescent state and verify we no longer
298 // request BeginFrames.
235 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); 299 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
236 EXPECT_TRUE(client.needs_begin_frame()); 300 scheduler->OnBeginFrameDeadline();
237 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 3); 301 EXPECT_FALSE(client.needs_begin_frame());
238 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 1, 3);
239 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 2, 3);
240 client.Reset(); 302 client.Reset();
241
242 // Finish the second commit to go back to quiescent state and verify we no
243 // longer request BeginFrames.
244 scheduler->FinishCommit();
245 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
246 EXPECT_FALSE(client.needs_begin_frame());
247 } 303 }
248 304
249 TEST(SchedulerTest, TextureAcquisitionCausesCommitInsteadOfDraw) { 305 TEST(SchedulerTest, TextureAcquisitionCausesCommitInsteadOfDraw) {
250 FakeSchedulerClient client; 306 FakeSchedulerClient client;
251 SchedulerSettings default_scheduler_settings; 307 SchedulerSettings default_scheduler_settings;
252 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); 308 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings);
253 scheduler->SetCanStart(); 309 scheduler->SetCanStart();
254 scheduler->SetVisible(true); 310 scheduler->SetVisible(true);
255 scheduler->SetCanDraw(true); 311 scheduler->SetCanDraw(true);
256 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); 312 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client);
257 313
258 InitializeOutputSurfaceAndFirstCommit(scheduler); 314 InitializeOutputSurfaceAndFirstCommit(scheduler);
259 client.Reset(); 315 client.Reset();
260 scheduler->SetNeedsRedraw(); 316 scheduler->SetNeedsRedraw();
261 EXPECT_TRUE(scheduler->RedrawPending()); 317 EXPECT_TRUE(scheduler->RedrawPending());
262 EXPECT_SINGLE_ACTION("SetNeedsBeginFrameOnImplThread", client); 318 EXPECT_SINGLE_ACTION("SetNeedsBeginFrameOnImplThread", client);
263 EXPECT_TRUE(client.needs_begin_frame()); 319 EXPECT_TRUE(client.needs_begin_frame());
264 320
265 client.Reset(); 321 client.Reset();
266 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); 322 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
323 EXPECT_SINGLE_ACTION("PostBeginFrameDeadlineTask", client);
324
325 client.Reset();
326 scheduler->OnBeginFrameDeadline();
267 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); 327 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2);
268 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2); 328 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2);
269 EXPECT_FALSE(scheduler->RedrawPending()); 329 EXPECT_FALSE(scheduler->RedrawPending());
270 EXPECT_FALSE(client.needs_begin_frame());
271 330
272 client.Reset(); 331 client.Reset();
273 scheduler->SetMainThreadNeedsLayerTextures(); 332 scheduler->SetMainThreadNeedsLayerTextures();
274 EXPECT_SINGLE_ACTION("ScheduledActionAcquireLayerTexturesForMainThread", 333 EXPECT_SINGLE_ACTION("ScheduledActionAcquireLayerTexturesForMainThread",
275 client); 334 client);
276 335
277 // We should request a BeginFrame in anticipation of a draw. 336 // We should request a BeginFrame in anticipation of a draw.
278 client.Reset(); 337 client.Reset();
279 scheduler->SetNeedsRedraw(); 338 scheduler->SetNeedsRedraw();
280 EXPECT_TRUE(scheduler->RedrawPending()); 339 EXPECT_TRUE(scheduler->RedrawPending());
281 EXPECT_SINGLE_ACTION("SetNeedsBeginFrameOnImplThread", client); 340 EXPECT_EQ(0, client.num_actions_());
282 EXPECT_TRUE(client.needs_begin_frame());
283 341
284 // No draw happens since the textures are acquired by the main thread. 342 // No draw happens since the textures are acquired by the main thread.
285 client.Reset(); 343 client.Reset();
286 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); 344 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
345 EXPECT_SINGLE_ACTION("PostBeginFrameDeadlineTask", client);
346
347 client.Reset();
348 scheduler->OnBeginFrameDeadline();
287 EXPECT_SINGLE_ACTION("SetNeedsBeginFrameOnImplThread", client); 349 EXPECT_SINGLE_ACTION("SetNeedsBeginFrameOnImplThread", client);
288 EXPECT_TRUE(scheduler->RedrawPending()); 350 EXPECT_TRUE(scheduler->RedrawPending());
289 EXPECT_TRUE(client.needs_begin_frame()); 351 EXPECT_TRUE(client.needs_begin_frame());
290 352
353 client.Reset();
291 scheduler->SetNeedsCommit(); 354 scheduler->SetNeedsCommit();
292 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 0, 2); 355 EXPECT_EQ(0, client.num_actions_());
293 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 1, 2); 356
294 EXPECT_TRUE(client.needs_begin_frame()); 357 client.Reset();
358 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
359 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 2);
360 EXPECT_ACTION("PostBeginFrameDeadlineTask", client, 1, 2);
295 361
296 // Commit will release the texture. 362 // Commit will release the texture.
297 client.Reset(); 363 client.Reset();
298 scheduler->FinishCommit(); 364 scheduler->FinishCommit();
299 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); 365 EXPECT_ACTION("ScheduledActionCommit", client, 0, 2);
366 EXPECT_ACTION("PostBeginFrameDeadlineTask", client, 1, 2);
300 EXPECT_TRUE(scheduler->RedrawPending()); 367 EXPECT_TRUE(scheduler->RedrawPending());
301 EXPECT_TRUE(client.needs_begin_frame());
302 368
303 // Now we can draw again after the commit happens. 369 // Now we can draw again after the commit happens.
304 client.Reset(); 370 client.Reset();
305 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); 371 scheduler->OnBeginFrameDeadline();
306 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); 372 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2);
307 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2); 373 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2);
308 EXPECT_FALSE(scheduler->RedrawPending()); 374 EXPECT_FALSE(scheduler->RedrawPending());
375
376 // SetNeedsBeginFrame(false) should be deferred to the end of the next
377 // BeginFrame to avoid excessive toggling.
378 EXPECT_TRUE(client.needs_begin_frame());
379 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
380 scheduler->OnBeginFrameDeadline();
309 EXPECT_FALSE(client.needs_begin_frame()); 381 EXPECT_FALSE(client.needs_begin_frame());
310 client.Reset();
311 } 382 }
312 383
313 TEST(SchedulerTest, TextureAcquisitionCollision) { 384 TEST(SchedulerTest, TextureAcquisitionCollision) {
314 FakeSchedulerClient client; 385 FakeSchedulerClient client;
315 SchedulerSettings default_scheduler_settings; 386 SchedulerSettings default_scheduler_settings;
316 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); 387 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings);
317 scheduler->SetCanStart(); 388 scheduler->SetCanStart();
318 scheduler->SetVisible(true); 389 scheduler->SetVisible(true);
319 scheduler->SetCanDraw(true); 390 scheduler->SetCanDraw(true);
320 391
321 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); 392 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client);
322 InitializeOutputSurfaceAndFirstCommit(scheduler); 393 InitializeOutputSurfaceAndFirstCommit(scheduler);
323 394
324 client.Reset(); 395 client.Reset();
325 scheduler->SetNeedsCommit(); 396 scheduler->SetNeedsCommit();
326 scheduler->SetMainThreadNeedsLayerTextures(); 397 scheduler->SetMainThreadNeedsLayerTextures();
327 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 3); 398 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 0, 2);
328 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 3);
329 EXPECT_ACTION( 399 EXPECT_ACTION(
330 "ScheduledActionAcquireLayerTexturesForMainThread", client, 2, 3); 400 "ScheduledActionAcquireLayerTexturesForMainThread", client, 1, 2);
401
331 client.Reset(); 402 client.Reset();
403 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
404 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 2);
405 EXPECT_ACTION("PostBeginFrameDeadlineTask", client, 1, 2);
406
407 client.Reset();
408 scheduler->OnBeginFrameDeadline();
409 EXPECT_SINGLE_ACTION("SetNeedsBeginFrameOnImplThread", client);
332 410
333 // Although the compositor cannot draw because textures are locked by main 411 // Although the compositor cannot draw because textures are locked by main
334 // thread, we continue requesting SetNeedsBeginFrame in anticipation of the 412 // thread, we continue requesting SetNeedsBeginFrame in anticipation of the
335 // unlock. 413 // unlock.
336 EXPECT_TRUE(client.needs_begin_frame()); 414 EXPECT_TRUE(client.needs_begin_frame());
337 415
338 // Trigger the commit 416 // Trigger the commit
339 scheduler->FinishCommit(); 417 scheduler->FinishCommit();
340 EXPECT_TRUE(client.needs_begin_frame()); 418 EXPECT_TRUE(client.needs_begin_frame());
341 client.Reset();
342 419
343 // Between commit and draw, texture acquisition for main thread delayed, 420 // Between commit and draw, texture acquisition for main thread delayed,
344 // and main thread blocks. 421 // and main thread blocks.
422 client.Reset();
345 scheduler->SetMainThreadNeedsLayerTextures(); 423 scheduler->SetMainThreadNeedsLayerTextures();
346 EXPECT_EQ(0, client.num_actions_()); 424 EXPECT_EQ(0, client.num_actions_());
347 client.Reset();
348 425
349 // No implicit commit is expected. 426 // No implicit commit is expected.
427 client.Reset();
350 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); 428 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
429 EXPECT_SINGLE_ACTION("PostBeginFrameDeadlineTask", client);
430
431 client.Reset();
432 scheduler->OnBeginFrameDeadline();
351 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 3); 433 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 3);
352 EXPECT_ACTION("ScheduledActionAcquireLayerTexturesForMainThread", 434 EXPECT_ACTION(
353 client, 435 "ScheduledActionAcquireLayerTexturesForMainThread", client, 1, 3);
354 1,
355 3);
356 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 2, 3); 436 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 2, 3);
357 client.Reset();
358 437
359 // Compositor not scheduled to draw because textures are locked by main 438 // Although the compositor is not scheduled to draw because textures are
360 // thread. 439 // locked by main thread, we proactively request the begin frame.
361 EXPECT_FALSE(client.needs_begin_frame()); 440 EXPECT_TRUE(client.needs_begin_frame());
362 441
363 // Needs an explicit commit from the main thread. 442 // Needs an explicit commit from the main thread.
443 client.Reset();
364 scheduler->SetNeedsCommit(); 444 scheduler->SetNeedsCommit();
445 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
365 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 2); 446 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 2);
366 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2); 447 EXPECT_ACTION("PostBeginFrameDeadlineTask", client, 1, 2);
367 client.Reset(); 448 client.Reset();
368 449
369 // Trigger the commit 450 // Trigger the commit
370 scheduler->FinishCommit(); 451 scheduler->FinishCommit();
371 EXPECT_TRUE(client.needs_begin_frame()); 452 EXPECT_TRUE(client.needs_begin_frame());
372 } 453 }
373 454
374 TEST(SchedulerTest, VisibilitySwitchWithTextureAcquisition) { 455 TEST(SchedulerTest, VisibilitySwitchWithTextureAcquisition) {
375 FakeSchedulerClient client; 456 FakeSchedulerClient client;
376 SchedulerSettings default_scheduler_settings; 457 SchedulerSettings default_scheduler_settings;
377 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); 458 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings);
378 scheduler->SetCanStart(); 459 scheduler->SetCanStart();
379 scheduler->SetVisible(true); 460 scheduler->SetVisible(true);
380 scheduler->SetCanDraw(true); 461 scheduler->SetCanDraw(true);
381 462
382 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); 463 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client);
383 client.Reset(); 464 client.Reset();
384 scheduler->DidCreateAndInitializeOutputSurface(); 465 scheduler->DidCreateAndInitializeOutputSurface();
385 466
386 scheduler->SetNeedsCommit(); 467 scheduler->SetNeedsCommit();
468 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
469 scheduler->OnBeginFrameDeadline();
387 scheduler->FinishCommit(); 470 scheduler->FinishCommit();
388 scheduler->SetMainThreadNeedsLayerTextures(); 471 scheduler->SetMainThreadNeedsLayerTextures();
389 scheduler->SetNeedsCommit(); 472 scheduler->SetNeedsCommit();
390 client.Reset(); 473 client.Reset();
391 // Verify that pending texture acquisition fires when visibility 474 // Verify that pending texture acquisition fires when visibility
392 // is lost in order to avoid a deadlock. 475 // is lost in order to avoid a deadlock.
393 scheduler->SetVisible(false); 476 scheduler->SetVisible(false);
394 EXPECT_SINGLE_ACTION("ScheduledActionAcquireLayerTexturesForMainThread", 477 EXPECT_SINGLE_ACTION("ScheduledActionAcquireLayerTexturesForMainThread",
395 client); 478 client);
396 client.Reset();
397 479
398 // Already sent a begin frame on this current frame, so wait. 480 // Already sent a begin frame on this current frame, so wait.
481 client.Reset();
399 scheduler->SetVisible(true); 482 scheduler->SetVisible(true);
400 EXPECT_EQ(0, client.num_actions_()); 483 EXPECT_EQ(0, client.num_actions_());
401 client.Reset(); 484 EXPECT_TRUE(client.needs_begin_frame());
402 485
403 // Regaining visibility with textures acquired by main thread while 486 // Regaining visibility with textures acquired by main thread while
404 // compositor is waiting for first draw should result in a request 487 // compositor is waiting for first draw should result in a request
405 // for a new frame in order to escape a deadlock. 488 // for a new frame in order to escape a deadlock.
489 client.Reset();
406 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); 490 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
407 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 2); 491 EXPECT_ACTION("ScheduledActionSendBeginFrameToMainThread", client, 0, 2);
408 EXPECT_ACTION("SetNeedsBeginFrameOnImplThread", client, 1, 2); 492 EXPECT_ACTION("PostBeginFrameDeadlineTask", client, 1, 2);
409 } 493 }
410 494
411 class SchedulerClientThatsetNeedsDrawInsideDraw : public FakeSchedulerClient { 495 class SchedulerClientThatsetNeedsDrawInsideDraw : public FakeSchedulerClient {
412 public: 496 public:
413 virtual void ScheduledActionSendBeginFrameToMainThread() OVERRIDE {} 497 virtual void ScheduledActionSendBeginFrameToMainThread() OVERRIDE {}
414 virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible() 498 virtual DrawSwapReadbackResult ScheduledActionDrawAndSwapIfPossible()
415 OVERRIDE { 499 OVERRIDE {
416 // Only SetNeedsRedraw the first time this is called 500 // Only SetNeedsRedraw the first time this is called
417 if (!num_draws_) 501 if (!num_draws_)
418 scheduler_->SetNeedsRedraw(); 502 scheduler_->SetNeedsRedraw();
(...skipping 26 matching lines...) Expand all
445 scheduler->SetCanDraw(true); 529 scheduler->SetCanDraw(true);
446 InitializeOutputSurfaceAndFirstCommit(scheduler); 530 InitializeOutputSurfaceAndFirstCommit(scheduler);
447 client.Reset(); 531 client.Reset();
448 532
449 scheduler->SetNeedsRedraw(); 533 scheduler->SetNeedsRedraw();
450 EXPECT_TRUE(scheduler->RedrawPending()); 534 EXPECT_TRUE(scheduler->RedrawPending());
451 EXPECT_TRUE(client.needs_begin_frame()); 535 EXPECT_TRUE(client.needs_begin_frame());
452 EXPECT_EQ(0, client.num_draws()); 536 EXPECT_EQ(0, client.num_draws());
453 537
454 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); 538 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
539 scheduler->OnBeginFrameDeadline();
455 EXPECT_EQ(1, client.num_draws()); 540 EXPECT_EQ(1, client.num_draws());
456 EXPECT_TRUE(scheduler->RedrawPending()); 541 EXPECT_TRUE(scheduler->RedrawPending());
457 EXPECT_TRUE(client.needs_begin_frame()); 542 EXPECT_TRUE(client.needs_begin_frame());
458 543
459 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); 544 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
545 scheduler->OnBeginFrameDeadline();
460 EXPECT_EQ(2, client.num_draws()); 546 EXPECT_EQ(2, client.num_draws());
461 EXPECT_FALSE(scheduler->RedrawPending()); 547 EXPECT_FALSE(scheduler->RedrawPending());
548 EXPECT_TRUE(client.needs_begin_frame());
549
550 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
551 scheduler->OnBeginFrameDeadline();
462 EXPECT_FALSE(client.needs_begin_frame()); 552 EXPECT_FALSE(client.needs_begin_frame());
463 } 553 }
464 554
465 // Test that requesting redraw inside a failed draw doesn't lose the request. 555 // Test that requesting redraw inside a failed draw doesn't lose the request.
466 TEST(SchedulerTest, RequestRedrawInsideFailedDraw) { 556 TEST(SchedulerTest, RequestRedrawInsideFailedDraw) {
467 SchedulerClientThatsetNeedsDrawInsideDraw client; 557 SchedulerClientThatsetNeedsDrawInsideDraw client;
468 SchedulerSettings default_scheduler_settings; 558 SchedulerSettings default_scheduler_settings;
469 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); 559 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings);
470 scheduler->SetCanStart(); 560 scheduler->SetCanStart();
471 scheduler->SetVisible(true); 561 scheduler->SetVisible(true);
472 scheduler->SetCanDraw(true); 562 scheduler->SetCanDraw(true);
473 InitializeOutputSurfaceAndFirstCommit(scheduler); 563 InitializeOutputSurfaceAndFirstCommit(scheduler);
474 client.Reset(); 564 client.Reset();
475 565
476 client.SetDrawWillHappen(false); 566 client.SetDrawWillHappen(false);
477 567
478 scheduler->SetNeedsRedraw(); 568 scheduler->SetNeedsRedraw();
479 EXPECT_TRUE(scheduler->RedrawPending()); 569 EXPECT_TRUE(scheduler->RedrawPending());
480 EXPECT_TRUE(client.needs_begin_frame()); 570 EXPECT_TRUE(client.needs_begin_frame());
481 EXPECT_EQ(0, client.num_draws()); 571 EXPECT_EQ(0, client.num_draws());
482 572
483 // Fail the draw. 573 // Fail the draw.
484 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); 574 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
575 scheduler->OnBeginFrameDeadline();
485 EXPECT_EQ(1, client.num_draws()); 576 EXPECT_EQ(1, client.num_draws());
486 577
487 // We have a commit pending and the draw failed, and we didn't lose the redraw 578 // We have a commit pending and the draw failed, and we didn't lose the redraw
488 // request. 579 // request.
489 EXPECT_TRUE(scheduler->CommitPending()); 580 EXPECT_TRUE(scheduler->CommitPending());
490 EXPECT_TRUE(scheduler->RedrawPending()); 581 EXPECT_TRUE(scheduler->RedrawPending());
491 EXPECT_TRUE(client.needs_begin_frame()); 582 EXPECT_TRUE(client.needs_begin_frame());
492 583
493 // Fail the draw again. 584 // Fail the draw again.
494 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); 585 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
586 scheduler->OnBeginFrameDeadline();
495 EXPECT_EQ(2, client.num_draws()); 587 EXPECT_EQ(2, client.num_draws());
496 EXPECT_TRUE(scheduler->CommitPending()); 588 EXPECT_TRUE(scheduler->CommitPending());
497 EXPECT_TRUE(scheduler->RedrawPending()); 589 EXPECT_TRUE(scheduler->RedrawPending());
498 EXPECT_TRUE(client.needs_begin_frame()); 590 EXPECT_TRUE(client.needs_begin_frame());
499 591
500 // Draw successfully. 592 // Draw successfully.
501 client.SetDrawWillHappen(true); 593 client.SetDrawWillHappen(true);
502 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); 594 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
595 scheduler->OnBeginFrameDeadline();
503 EXPECT_EQ(3, client.num_draws()); 596 EXPECT_EQ(3, client.num_draws());
504 EXPECT_TRUE(scheduler->CommitPending()); 597 EXPECT_TRUE(scheduler->CommitPending());
505 EXPECT_FALSE(scheduler->RedrawPending()); 598 EXPECT_FALSE(scheduler->RedrawPending());
506 EXPECT_TRUE(client.needs_begin_frame()); 599 EXPECT_TRUE(client.needs_begin_frame());
507 } 600 }
508 601
509 class SchedulerClientThatSetNeedsCommitInsideDraw : public FakeSchedulerClient { 602 class SchedulerClientThatSetNeedsCommitInsideDraw : public FakeSchedulerClient {
510 public: 603 public:
511 SchedulerClientThatSetNeedsCommitInsideDraw() 604 SchedulerClientThatSetNeedsCommitInsideDraw()
512 : set_needs_commit_on_next_draw_(false) {} 605 : set_needs_commit_on_next_draw_(false) {}
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
545 TEST(SchedulerTest, RequestCommitInsideDraw) { 638 TEST(SchedulerTest, RequestCommitInsideDraw) {
546 SchedulerClientThatSetNeedsCommitInsideDraw client; 639 SchedulerClientThatSetNeedsCommitInsideDraw client;
547 SchedulerSettings default_scheduler_settings; 640 SchedulerSettings default_scheduler_settings;
548 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); 641 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings);
549 scheduler->SetCanStart(); 642 scheduler->SetCanStart();
550 scheduler->SetVisible(true); 643 scheduler->SetVisible(true);
551 scheduler->SetCanDraw(true); 644 scheduler->SetCanDraw(true);
552 InitializeOutputSurfaceAndFirstCommit(scheduler); 645 InitializeOutputSurfaceAndFirstCommit(scheduler);
553 client.Reset(); 646 client.Reset();
554 647
648 EXPECT_FALSE(client.needs_begin_frame());
555 scheduler->SetNeedsRedraw(); 649 scheduler->SetNeedsRedraw();
556 EXPECT_TRUE(scheduler->RedrawPending()); 650 EXPECT_TRUE(scheduler->RedrawPending());
557 EXPECT_EQ(0, client.num_draws()); 651 EXPECT_EQ(0, client.num_draws());
558 EXPECT_TRUE(client.needs_begin_frame()); 652 EXPECT_TRUE(client.needs_begin_frame());
559 653
560 client.SetNeedsCommitOnNextDraw(); 654 client.SetNeedsCommitOnNextDraw();
561 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); 655 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
656 client.SetNeedsCommitOnNextDraw();
657 scheduler->OnBeginFrameDeadline();
562 EXPECT_EQ(1, client.num_draws()); 658 EXPECT_EQ(1, client.num_draws());
563 EXPECT_TRUE(scheduler->CommitPending()); 659 EXPECT_TRUE(scheduler->CommitPending());
564 EXPECT_TRUE(client.needs_begin_frame()); 660 EXPECT_TRUE(client.needs_begin_frame());
565 scheduler->FinishCommit(); 661 scheduler->FinishCommit();
566 662
567 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); 663 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
568 EXPECT_EQ(2, client.num_draws());; 664 scheduler->OnBeginFrameDeadline();
665 EXPECT_EQ(2, client.num_draws());
666
569 EXPECT_FALSE(scheduler->RedrawPending()); 667 EXPECT_FALSE(scheduler->RedrawPending());
570 EXPECT_FALSE(scheduler->CommitPending()); 668 EXPECT_FALSE(scheduler->CommitPending());
669 EXPECT_TRUE(client.needs_begin_frame());
670
671 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
672 scheduler->OnBeginFrameDeadline();
571 EXPECT_FALSE(client.needs_begin_frame()); 673 EXPECT_FALSE(client.needs_begin_frame());
572 } 674 }
573 675
574 // Tests that when a draw fails then the pending commit should not be dropped. 676 // Tests that when a draw fails then the pending commit should not be dropped.
575 TEST(SchedulerTest, RequestCommitInsideFailedDraw) { 677 TEST(SchedulerTest, RequestCommitInsideFailedDraw) {
576 SchedulerClientThatsetNeedsDrawInsideDraw client; 678 SchedulerClientThatsetNeedsDrawInsideDraw client;
577 SchedulerSettings default_scheduler_settings; 679 SchedulerSettings default_scheduler_settings;
578 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); 680 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings);
579 scheduler->SetCanStart(); 681 scheduler->SetCanStart();
580 scheduler->SetVisible(true); 682 scheduler->SetVisible(true);
581 scheduler->SetCanDraw(true); 683 scheduler->SetCanDraw(true);
582 InitializeOutputSurfaceAndFirstCommit(scheduler); 684 InitializeOutputSurfaceAndFirstCommit(scheduler);
583 client.Reset(); 685 client.Reset();
584 686
585 client.SetDrawWillHappen(false); 687 client.SetDrawWillHappen(false);
586 688
587 scheduler->SetNeedsRedraw(); 689 scheduler->SetNeedsRedraw();
588 EXPECT_TRUE(scheduler->RedrawPending()); 690 EXPECT_TRUE(scheduler->RedrawPending());
589 EXPECT_TRUE(client.needs_begin_frame()); 691 EXPECT_TRUE(client.needs_begin_frame());
590 EXPECT_EQ(0, client.num_draws()); 692 EXPECT_EQ(0, client.num_draws());
591 693
592 // Fail the draw. 694 // Fail the draw.
593 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); 695 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
696 scheduler->OnBeginFrameDeadline();
594 EXPECT_EQ(1, client.num_draws()); 697 EXPECT_EQ(1, client.num_draws());
595 698
596 // We have a commit pending and the draw failed, and we didn't lose the commit 699 // We have a commit pending and the draw failed, and we didn't lose the commit
597 // request. 700 // request.
598 EXPECT_TRUE(scheduler->CommitPending()); 701 EXPECT_TRUE(scheduler->CommitPending());
599 EXPECT_TRUE(scheduler->RedrawPending()); 702 EXPECT_TRUE(scheduler->RedrawPending());
600 EXPECT_TRUE(client.needs_begin_frame()); 703 EXPECT_TRUE(client.needs_begin_frame());
601 704
602 // Fail the draw again. 705 // Fail the draw again.
603 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); 706 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
707 scheduler->OnBeginFrameDeadline();
604 EXPECT_EQ(2, client.num_draws()); 708 EXPECT_EQ(2, client.num_draws());
605 EXPECT_TRUE(scheduler->CommitPending()); 709 EXPECT_TRUE(scheduler->CommitPending());
606 EXPECT_TRUE(scheduler->RedrawPending()); 710 EXPECT_TRUE(scheduler->RedrawPending());
607 EXPECT_TRUE(client.needs_begin_frame()); 711 EXPECT_TRUE(client.needs_begin_frame());
608 712
609 // Draw successfully. 713 // Draw successfully.
610 client.SetDrawWillHappen(true); 714 client.SetDrawWillHappen(true);
611 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); 715 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
716 scheduler->OnBeginFrameDeadline();
612 EXPECT_EQ(3, client.num_draws()); 717 EXPECT_EQ(3, client.num_draws());
613 EXPECT_TRUE(scheduler->CommitPending()); 718 EXPECT_TRUE(scheduler->CommitPending());
614 EXPECT_FALSE(scheduler->RedrawPending()); 719 EXPECT_FALSE(scheduler->RedrawPending());
615 EXPECT_TRUE(client.needs_begin_frame()); 720 EXPECT_TRUE(client.needs_begin_frame());
616 } 721 }
617 722
618 TEST(SchedulerTest, NoSwapWhenDrawFails) { 723 TEST(SchedulerTest, NoSwapWhenDrawFails) {
619 SchedulerClientThatSetNeedsCommitInsideDraw client; 724 SchedulerClientThatSetNeedsCommitInsideDraw client;
620 SchedulerSettings default_scheduler_settings; 725 SchedulerSettings default_scheduler_settings;
621 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); 726 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings);
622 scheduler->SetCanStart(); 727 scheduler->SetCanStart();
623 scheduler->SetVisible(true); 728 scheduler->SetVisible(true);
624 scheduler->SetCanDraw(true); 729 scheduler->SetCanDraw(true);
625 InitializeOutputSurfaceAndFirstCommit(scheduler); 730 InitializeOutputSurfaceAndFirstCommit(scheduler);
626 client.Reset(); 731 client.Reset();
627 732
628 scheduler->SetNeedsRedraw(); 733 scheduler->SetNeedsRedraw();
629 EXPECT_TRUE(scheduler->RedrawPending()); 734 EXPECT_TRUE(scheduler->RedrawPending());
630 EXPECT_TRUE(client.needs_begin_frame()); 735 EXPECT_TRUE(client.needs_begin_frame());
631 EXPECT_EQ(0, client.num_draws()); 736 EXPECT_EQ(0, client.num_draws());
632 737
633 // Draw successfully, this starts a new frame. 738 // Draw successfully, this starts a new frame.
634 client.SetNeedsCommitOnNextDraw(); 739 client.SetNeedsCommitOnNextDraw();
635 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); 740 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
741 scheduler->OnBeginFrameDeadline();
636 EXPECT_EQ(1, client.num_draws()); 742 EXPECT_EQ(1, client.num_draws());
637 743
638 scheduler->SetNeedsRedraw(); 744 scheduler->SetNeedsRedraw();
639 EXPECT_TRUE(scheduler->RedrawPending()); 745 EXPECT_TRUE(scheduler->RedrawPending());
640 EXPECT_TRUE(client.needs_begin_frame()); 746 EXPECT_TRUE(client.needs_begin_frame());
641 747
642 // Fail to draw, this should not start a frame. 748 // Fail to draw, this should not start a frame.
643 client.SetDrawWillHappen(false); 749 client.SetDrawWillHappen(false);
644 client.SetNeedsCommitOnNextDraw(); 750 client.SetNeedsCommitOnNextDraw();
645 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting()); 751 scheduler->BeginFrame(BeginFrameArgs::CreateForTesting());
752 scheduler->OnBeginFrameDeadline();
646 EXPECT_EQ(2, client.num_draws()); 753 EXPECT_EQ(2, client.num_draws());
647 } 754 }
648 755
649 TEST(SchedulerTest, NoSwapWhenSwapFailsDuringForcedCommit) { 756 TEST(SchedulerTest, NoSwapWhenSwapFailsDuringForcedCommit) {
650 FakeSchedulerClient client; 757 FakeSchedulerClient client;
651 SchedulerSettings default_scheduler_settings; 758 SchedulerSettings default_scheduler_settings;
652 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); 759 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings);
653 760
654 // Tell the client that it will fail to swap. 761 // Tell the client that it will fail to swap.
655 client.SetDrawWillHappen(true); 762 client.SetDrawWillHappen(true);
(...skipping 27 matching lines...) Expand all
683 scheduler->FinishCommit(); 790 scheduler->FinishCommit();
684 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndReadback")); 791 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndReadback"));
685 792
686 // The replacement commit comes in after 2 readbacks. 793 // The replacement commit comes in after 2 readbacks.
687 client.Reset(); 794 client.Reset();
688 scheduler->FinishCommit(); 795 scheduler->FinishCommit();
689 } 796 }
690 797
691 } // namespace 798 } // namespace
692 } // namespace cc 799 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698