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

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

Issue 1051273003: Revert of cc: Make scheduling be driven by vsync for android webview. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 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
« no previous file with comments | « cc/scheduler/scheduler_state_machine.cc ('k') | cc/surfaces/display.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 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 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 void ScheduledActionCommit() override { PushAction("ScheduledActionCommit"); } 134 void ScheduledActionCommit() override { PushAction("ScheduledActionCommit"); }
135 void ScheduledActionActivateSyncTree() override { 135 void ScheduledActionActivateSyncTree() override {
136 PushAction("ScheduledActionActivateSyncTree"); 136 PushAction("ScheduledActionActivateSyncTree");
137 } 137 }
138 void ScheduledActionBeginOutputSurfaceCreation() override { 138 void ScheduledActionBeginOutputSurfaceCreation() override {
139 PushAction("ScheduledActionBeginOutputSurfaceCreation"); 139 PushAction("ScheduledActionBeginOutputSurfaceCreation");
140 } 140 }
141 void ScheduledActionPrepareTiles() override { 141 void ScheduledActionPrepareTiles() override {
142 PushAction("ScheduledActionPrepareTiles"); 142 PushAction("ScheduledActionPrepareTiles");
143 } 143 }
144 void ScheduledActionInvalidateOutputSurface() override {
145 actions_.push_back("ScheduledActionInvalidateOutputSurface");
146 states_.push_back(scheduler_->AsValue());
147 }
148 void DidAnticipatedDrawTimeChange(base::TimeTicks) override { 144 void DidAnticipatedDrawTimeChange(base::TimeTicks) override {
149 if (log_anticipated_draw_time_change_) 145 if (log_anticipated_draw_time_change_)
150 PushAction("DidAnticipatedDrawTimeChange"); 146 PushAction("DidAnticipatedDrawTimeChange");
151 } 147 }
152 base::TimeDelta DrawDurationEstimate() override { return base::TimeDelta(); } 148 base::TimeDelta DrawDurationEstimate() override { return base::TimeDelta(); }
153 base::TimeDelta BeginMainFrameToCommitDurationEstimate() override { 149 base::TimeDelta BeginMainFrameToCommitDurationEstimate() override {
154 return base::TimeDelta(); 150 return base::TimeDelta();
155 } 151 }
156 base::TimeDelta CommitToActivateDurationEstimate() override { 152 base::TimeDelta CommitToActivateDurationEstimate() override {
157 return base::TimeDelta(); 153 return base::TimeDelta();
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); 299 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending());
304 client_->Reset(); 300 client_->Reset();
305 301
306 { 302 {
307 SCOPED_TRACE("Do first frame to commit after initialize."); 303 SCOPED_TRACE("Do first frame to commit after initialize.");
308 AdvanceFrame(); 304 AdvanceFrame();
309 305
310 scheduler_->NotifyBeginMainFrameStarted(); 306 scheduler_->NotifyBeginMainFrameStarted();
311 scheduler_->NotifyReadyToCommitThenActivateIfNeeded(); 307 scheduler_->NotifyReadyToCommitThenActivateIfNeeded();
312 308
309 // Run the posted deadline task.
310 EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending());
311 task_runner_->RunTasksWhile(client_->ImplFrameDeadlinePending(true));
312 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending());
313
313 EXPECT_FALSE(scheduler_->CommitPending()); 314 EXPECT_FALSE(scheduler_->CommitPending());
314
315 if (scheduler_settings_.using_synchronous_renderer_compositor) {
316 scheduler_->SetNeedsRedraw();
317 scheduler_->OnDrawForOutputSurface();
318 } else {
319 // Run the posted deadline task.
320 EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending());
321 task_runner_->RunTasksWhile(client_->ImplFrameDeadlinePending(true));
322 }
323
324 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending());
325 } 315 }
326 316
327 client_->Reset(); 317 client_->Reset();
328 318
329 { 319 {
330 SCOPED_TRACE( 320 SCOPED_TRACE(
331 "Run second frame so Scheduler calls SetNeedsBeginFrame(false)."); 321 "Run second frame so Scheduler calls SetNeedsBeginFrame(false).");
332 AdvanceFrame(); 322 AdvanceFrame();
333 323
334 if (!scheduler_settings_.using_synchronous_renderer_compositor) { 324 // Run the posted deadline task.
335 // Run the posted deadline task. 325 EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending());
336 EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); 326 task_runner_->RunTasksWhile(client_->ImplFrameDeadlinePending(true));
337 task_runner_->RunTasksWhile(client_->ImplFrameDeadlinePending(true));
338 }
339
340 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); 327 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending());
341 } 328 }
342 329
343 EXPECT_FALSE(client_->needs_begin_frames()); 330 EXPECT_FALSE(client_->needs_begin_frames());
344 client_->Reset(); 331 client_->Reset();
345 } 332 }
346 333
347 // As this function contains EXPECT macros, to allow debugging it should be 334 // As this function contains EXPECT macros, to allow debugging it should be
348 // called inside EXPECT_SCOPED like so; 335 // called inside EXPECT_SCOPED like so;
349 // EXPECT_SCOPED(client.AdvanceFrame()); 336 // EXPECT_SCOPED(client.AdvanceFrame());
350 void AdvanceFrame() { 337 void AdvanceFrame() {
351 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler.frames"), 338 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler.frames"),
352 "FakeSchedulerClient::AdvanceFrame"); 339 "FakeSchedulerClient::AdvanceFrame");
353 // Consume any previous deadline first, if no deadline is currently 340 // Consume any previous deadline first, if no deadline is currently
354 // pending, ImplFrameDeadlinePending will return false straight away and we 341 // pending, ImplFrameDeadlinePending will return false straight away and we
355 // will run no tasks. 342 // will run no tasks.
356 task_runner_->RunTasksWhile(client_->ImplFrameDeadlinePending(true)); 343 task_runner_->RunTasksWhile(client_->ImplFrameDeadlinePending(true));
357 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); 344 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending());
358 345
359 // Send the next BeginFrame message if using an external source, otherwise 346 // Send the next BeginFrame message if using an external source, otherwise
360 // it will be already in the task queue. 347 // it will be already in the task queue.
361 if (scheduler_->settings().use_external_begin_frame_source && 348 if (scheduler_->settings().use_external_begin_frame_source &&
362 scheduler_->FrameProductionThrottled()) { 349 scheduler_->FrameProductionThrottled()) {
363 SendNextBeginFrame(); 350 SendNextBeginFrame();
351 EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending());
364 } 352 }
365 353
366 if (!scheduler_->settings().using_synchronous_renderer_compositor) { 354 // Then run tasks until new deadline is scheduled.
367 // Then run tasks until new deadline is scheduled. 355 EXPECT_TRUE(
368 EXPECT_TRUE(task_runner_->RunTasksWhile( 356 task_runner_->RunTasksWhile(client_->ImplFrameDeadlinePending(false)));
369 client_->ImplFrameDeadlinePending(false))); 357 EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending());
370 EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending());
371 }
372 } 358 }
373 359
374 void SendNextBeginFrame() { 360 void SendNextBeginFrame() {
375 DCHECK(scheduler_->settings().use_external_begin_frame_source); 361 DCHECK(scheduler_->settings().use_external_begin_frame_source);
376 // Creep the time forward so that any BeginFrameArgs is not equal to the 362 // Creep the time forward so that any BeginFrameArgs is not equal to the
377 // last one otherwise we violate the BeginFrameSource contract. 363 // last one otherwise we violate the BeginFrameSource contract.
378 now_src_->AdvanceNow(BeginFrameArgs::DefaultInterval()); 364 now_src_->AdvanceNow(BeginFrameArgs::DefaultInterval());
379 fake_external_begin_frame_source_->TestOnBeginFrame( 365 fake_external_begin_frame_source_->TestOnBeginFrame(
380 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src())); 366 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src()));
381 } 367 }
(...skipping 1980 matching lines...) Expand 10 before | Expand all | Expand 10 after
2362 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_); 2348 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_);
2363 EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); 2349 EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending());
2364 client_->Reset(); 2350 client_->Reset();
2365 2351
2366 task_runner().RunPendingTasks(); // Run posted deadline. 2352 task_runner().RunPendingTasks(); // Run posted deadline.
2367 EXPECT_ACTION("SetNeedsBeginFrames(false)", client_, 0, 2); 2353 EXPECT_ACTION("SetNeedsBeginFrames(false)", client_, 0, 2);
2368 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 1, 2); 2354 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 1, 2);
2369 client_->Reset(); 2355 client_->Reset();
2370 } 2356 }
2371 2357
2372 TEST_F(SchedulerTest, UsingSynchronousCompositor) {
2373 scheduler_settings_.using_synchronous_renderer_compositor = true;
2374 scheduler_settings_.use_external_begin_frame_source = true;
2375 scheduler_settings_.impl_side_painting = true;
2376 SetUpScheduler(true);
2377
2378 // Compositor thread initiated input/animation.
2379 // --------------------------------------------
2380 scheduler_->SetNeedsAnimate();
2381 EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_);
2382 client_->Reset();
2383
2384 // Next vsync.
2385 AdvanceFrame();
2386 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 3);
2387 EXPECT_ACTION("ScheduledActionAnimate", client_, 1, 3);
2388 EXPECT_ACTION("ScheduledActionInvalidateOutputSurface", client_, 2, 3);
2389 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending());
2390 client_->Reset();
2391
2392 // Continue with animation.
2393 scheduler_->SetNeedsAnimate();
2394 EXPECT_NO_ACTION(client_);
2395
2396 // Android onDraw.
2397 scheduler_->SetNeedsRedraw();
2398 scheduler_->OnDrawForOutputSurface();
2399 EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client_);
2400 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending());
2401 client_->Reset();
2402
2403 // Next vsync.
2404 AdvanceFrame();
2405 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 3);
2406 EXPECT_ACTION("ScheduledActionAnimate", client_, 1, 3);
2407 EXPECT_ACTION("ScheduledActionInvalidateOutputSurface", client_, 2, 3);
2408 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending());
2409 client_->Reset();
2410
2411 // Android onDraw.
2412 scheduler_->SetNeedsRedraw();
2413 scheduler_->OnDrawForOutputSurface();
2414 EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client_);
2415 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending());
2416 client_->Reset();
2417
2418 // Idle on next vsync.
2419 AdvanceFrame();
2420 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 3);
2421 EXPECT_ACTION("SetNeedsBeginFrames(false)", client_, 1, 3);
2422 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3);
2423 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending());
2424 client_->Reset();
2425
2426 // Android onDraw after idle.
2427 // --------------------------
2428 scheduler_->SetNeedsRedraw();
2429 scheduler_->OnDrawForOutputSurface();
2430 EXPECT_ACTION("SetNeedsBeginFrames(true)", client_, 0, 3);
2431 EXPECT_ACTION("ScheduledActionAnimate", client_, 1, 3);
2432 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 2, 3);
2433 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending());
2434 client_->Reset();
2435
2436 // Idle on next vsync.
2437 AdvanceFrame();
2438 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 3);
2439 EXPECT_ACTION("SetNeedsBeginFrames(false)", client_, 1, 3);
2440 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3);
2441 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending());
2442 client_->Reset();
2443
2444 // Main thread initiated activity.
2445 // -------------------------------
2446 scheduler_->SetNeedsCommit();
2447 EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_);
2448 client_->Reset();
2449
2450 // Next vsync.
2451 AdvanceFrame();
2452 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2);
2453 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2);
2454 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending());
2455 client_->Reset();
2456
2457 scheduler_->NotifyBeginMainFrameStarted();
2458 EXPECT_NO_ACTION(client_);
2459
2460 // Next vsync.
2461 AdvanceFrame();
2462 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_);
2463 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending());
2464 client_->Reset();
2465
2466 scheduler_->NotifyReadyToCommit();
2467 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_);
2468 client_->Reset();
2469
2470 scheduler_->NotifyReadyToActivate();
2471 EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_);
2472 client_->Reset();
2473
2474 // Next vsync.
2475 AdvanceFrame();
2476 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 3);
2477 EXPECT_ACTION("ScheduledActionAnimate", client_, 1, 3);
2478 EXPECT_ACTION("ScheduledActionInvalidateOutputSurface", client_, 2, 3);
2479 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending());
2480 client_->Reset();
2481
2482 // Android onDraw.
2483 scheduler_->SetNeedsRedraw();
2484 scheduler_->OnDrawForOutputSurface();
2485 EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client_);
2486 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending());
2487 client_->Reset();
2488
2489 // Idle on next vsync.
2490 AdvanceFrame();
2491 EXPECT_ACTION("WillBeginImplFrame", client_, 0, 3);
2492 EXPECT_ACTION("SetNeedsBeginFrames(false)", client_, 1, 3);
2493 EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3);
2494 EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending());
2495 client_->Reset();
2496 }
2497
2498 TEST_F(SchedulerTest, AuthoritativeVSyncInterval) { 2358 TEST_F(SchedulerTest, AuthoritativeVSyncInterval) {
2499 SetUpScheduler(true); 2359 SetUpScheduler(true);
2500 2360
2501 base::TimeDelta initial_interval = 2361 base::TimeDelta initial_interval =
2502 scheduler_->begin_impl_frame_args().interval; 2362 scheduler_->begin_impl_frame_args().interval;
2503 base::TimeDelta authoritative_interval = 2363 base::TimeDelta authoritative_interval =
2504 base::TimeDelta::FromMilliseconds(33); 2364 base::TimeDelta::FromMilliseconds(33);
2505 2365
2506 scheduler_->SetNeedsCommit(); 2366 scheduler_->SetNeedsCommit();
2507 EXPECT_SCOPED(AdvanceFrame()); 2367 EXPECT_SCOPED(AdvanceFrame());
(...skipping 10 matching lines...) Expand all
2518 2378
2519 // At the next BeginFrame, authoritative interval is used instead of previous 2379 // At the next BeginFrame, authoritative interval is used instead of previous
2520 // interval. 2380 // interval.
2521 EXPECT_NE(initial_interval, scheduler_->begin_impl_frame_args().interval); 2381 EXPECT_NE(initial_interval, scheduler_->begin_impl_frame_args().interval);
2522 EXPECT_EQ(authoritative_interval, 2382 EXPECT_EQ(authoritative_interval,
2523 scheduler_->begin_impl_frame_args().interval); 2383 scheduler_->begin_impl_frame_args().interval);
2524 } 2384 }
2525 2385
2526 } // namespace 2386 } // namespace
2527 } // namespace cc 2387 } // namespace cc
OLDNEW
« no previous file with comments | « cc/scheduler/scheduler_state_machine.cc ('k') | cc/surfaces/display.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698