diff options
author | mithro <mithro@mithis.com> | 2014-09-09 18:03:36 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-09-10 01:18:39 +0000 |
commit | 0c0ac6a1616778e3852e3f8b3248688ca9d899b2 (patch) | |
tree | 0f79cee120a2dbaba414e6828ce555f14b0f0c7c /cc/scheduler | |
parent | dc6bae3bdc5154b73600a1180c0a82859b271a3f (diff) | |
download | chromium_src-0c0ac6a1616778e3852e3f8b3248688ca9d899b2.zip chromium_src-0c0ac6a1616778e3852e3f8b3248688ca9d899b2.tar.gz chromium_src-0c0ac6a1616778e3852e3f8b3248688ca9d899b2.tar.bz2 |
New features include;
* Actually running the tasks in the ordered you asked!
* Allow running only pending tasks, all tasks until idle, to a given time or
for a given period.
* Allow stopping of running tasks on *any* arbitrary condition. No longer will
your tasks stop working when someone adds a new task or changes the task
order!
* Task runner intimately connected to time and controls Now().
Supports both automatic management and manual control.
This change makes it possible for the scheduler_unit tests to be 100%
deterministic. It also allows them to be more flexible and less brittle.
BUG=380889
Review URL: https://codereview.chromium.org/387493002
Cr-Commit-Position: refs/heads/master@{#294059}
Diffstat (limited to 'cc/scheduler')
-rw-r--r-- | cc/scheduler/scheduler.cc | 44 | ||||
-rw-r--r-- | cc/scheduler/scheduler.h | 8 | ||||
-rw-r--r-- | cc/scheduler/scheduler_unittest.cc | 215 |
3 files changed, 133 insertions, 134 deletions
diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc index 65f63fc..1c66f01a 100644 --- a/cc/scheduler/scheduler.cc +++ b/cc/scheduler/scheduler.cc @@ -19,15 +19,8 @@ namespace cc { Scheduler::SyntheticBeginFrameSource::SyntheticBeginFrameSource( Scheduler* scheduler, - base::SingleThreadTaskRunner* task_runner) - : scheduler_(scheduler) { - if (gfx::FrameTime::TimestampsAreHighRes()) { - time_source_ = DelayBasedTimeSourceHighRes::Create( - scheduler_->VSyncInterval(), task_runner); - } else { - time_source_ = DelayBasedTimeSource::Create(scheduler_->VSyncInterval(), - task_runner); - } + scoped_refptr<DelayBasedTimeSource> time_source) + : scheduler_(scheduler), time_source_(time_source) { time_source_->SetClient(this); } @@ -126,9 +119,21 @@ Scheduler::~Scheduler() { } void Scheduler::SetupSyntheticBeginFrames() { + scoped_refptr<DelayBasedTimeSource> time_source; + if (gfx::FrameTime::TimestampsAreHighRes()) { + time_source = DelayBasedTimeSourceHighRes::Create(VSyncInterval(), + task_runner_.get()); + } else { + time_source = + DelayBasedTimeSource::Create(VSyncInterval(), task_runner_.get()); + } DCHECK(!synthetic_begin_frame_source_); synthetic_begin_frame_source_.reset( - new SyntheticBeginFrameSource(this, task_runner_.get())); + new SyntheticBeginFrameSource(this, time_source)); +} + +base::TimeTicks Scheduler::Now() const { + return gfx::FrameTime::Now(); } void Scheduler::CommitVSyncParameters(base::TimeTicks timebase, @@ -262,7 +267,7 @@ base::TimeTicks Scheduler::AnticipatedDrawTime() const { begin_impl_frame_args_.interval <= base::TimeDelta()) return base::TimeTicks(); - base::TimeTicks now = gfx::FrameTime::Now(); + base::TimeTicks now = Now(); base::TimeTicks timebase = std::max(begin_impl_frame_args_.frame_time, begin_impl_frame_args_.deadline); int64 intervals = 1 + ((now - timebase) / begin_impl_frame_args_.interval); @@ -340,7 +345,7 @@ void Scheduler::BeginUnthrottledFrame() { DCHECK(!settings_.throttle_frame_production); DCHECK(begin_retro_frame_args_.empty()); - base::TimeTicks now = gfx::FrameTime::Now(); + base::TimeTicks now = Now(); base::TimeTicks deadline = now + vsync_interval_; BeginFrameArgs begin_frame_args = @@ -451,7 +456,7 @@ void Scheduler::BeginRetroFrame() { // TODO(brianderson): In the future, long deadlines could result in us not // draining the queue if we don't catch up. If we consistently can't catch // up, our fallback should be to lower our frame rate. - base::TimeTicks now = gfx::FrameTime::Now(); + base::TimeTicks now = Now(); base::TimeDelta draw_duration_estimate = client_->DrawDurationEstimate(); while (!begin_retro_frame_args_.empty() && now > AdjustedBeginImplFrameDeadline(begin_retro_frame_args_.front(), @@ -479,6 +484,10 @@ void Scheduler::BeginRetroFrame() { // will check if there is a pending BeginRetroFrame to ensure we handle // BeginFrames in FIFO order. void Scheduler::PostBeginRetroFrameIfNeeded() { + TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler"), + "Scheduler::PostBeginRetroFrameIfNeeded", + "state", + AsValue()); if (!last_set_needs_begin_frame_) return; @@ -555,6 +564,8 @@ base::TimeTicks Scheduler::AdjustedBeginImplFrameDeadline( } void Scheduler::ScheduleBeginImplFrameDeadline(base::TimeTicks deadline) { + TRACE_EVENT1( + "cc", "Scheduler::ScheduleBeginImplFrameDeadline", "deadline", deadline); if (settings_.using_synchronous_renderer_compositor) { // The synchronous renderer compositor has to make its GL calls // within this call. @@ -567,7 +578,7 @@ void Scheduler::ScheduleBeginImplFrameDeadline(base::TimeTicks deadline) { begin_impl_frame_deadline_task_.Cancel(); begin_impl_frame_deadline_task_.Reset(begin_impl_frame_deadline_closure_); - base::TimeDelta delta = deadline - gfx::FrameTime::Now(); + base::TimeDelta delta = deadline - Now(); if (delta <= base::TimeDelta()) delta = base::TimeDelta(); task_runner_->PostDelayedTask( @@ -697,9 +708,8 @@ scoped_refptr<base::debug::ConvertableToTraceFormat> Scheduler::AsValue() } state->BeginDictionary("scheduler_state"); - state->SetDouble( - "time_until_anticipated_draw_time_ms", - (AnticipatedDrawTime() - base::TimeTicks::Now()).InMillisecondsF()); + state->SetDouble("time_until_anticipated_draw_time_ms", + (AnticipatedDrawTime() - Now()).InMillisecondsF()); state->SetDouble("vsync_interval_ms", vsync_interval_.InMillisecondsF()); state->SetDouble("estimated_parent_draw_time_ms", estimated_parent_draw_time_.InMillisecondsF()); diff --git a/cc/scheduler/scheduler.h b/cc/scheduler/scheduler.h index 97b17b7..70522eb 100644 --- a/cc/scheduler/scheduler.h +++ b/cc/scheduler/scheduler.h @@ -137,7 +137,7 @@ class CC_EXPORT Scheduler { class CC_EXPORT SyntheticBeginFrameSource : public TimeSourceClient { public: SyntheticBeginFrameSource(Scheduler* scheduler, - base::SingleThreadTaskRunner* task_runner); + scoped_refptr<DelayBasedTimeSource> time_source); virtual ~SyntheticBeginFrameSource(); // Updates the phase and frequency of the timer. @@ -168,6 +168,8 @@ class CC_EXPORT Scheduler { int layer_tree_host_id, const scoped_refptr<base::SingleThreadTaskRunner>& task_runner); + virtual base::TimeTicks Now() const; + const SchedulerSettings settings_; SchedulerClient* client_; int layer_tree_host_id_; @@ -198,6 +200,8 @@ class CC_EXPORT Scheduler { bool inside_process_scheduled_actions_; SchedulerStateMachine::Action inside_action_; + base::TimeDelta VSyncInterval() { return vsync_interval_; } + private: base::TimeTicks AdjustedBeginImplFrameDeadline( const BeginFrameArgs& args, @@ -221,8 +225,6 @@ class CC_EXPORT Scheduler { void PollForAnticipatedDrawTriggers(); void PollToAdvanceCommitState(); - base::TimeDelta VSyncInterval() { return vsync_interval_; } - base::TimeDelta EstimatedParentDrawTime() { return estimated_parent_draw_time_; } diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc index 7df5bf2..256acd5 100644 --- a/cc/scheduler/scheduler_unittest.cc +++ b/cc/scheduler/scheduler_unittest.cc @@ -43,47 +43,14 @@ class FakeSchedulerClient; void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler, FakeSchedulerClient* client); -class TestScheduler : public Scheduler { - public: - static scoped_ptr<TestScheduler> Create( - SchedulerClient* client, - const SchedulerSettings& scheduler_settings, - int layer_tree_host_id, - const scoped_refptr<base::SingleThreadTaskRunner>& impl_task_runner) { - return make_scoped_ptr(new TestScheduler( - client, scheduler_settings, layer_tree_host_id, impl_task_runner)); - } - - virtual ~TestScheduler() {} - - bool IsBeginRetroFrameArgsEmpty() const { - return begin_retro_frame_args_.empty(); - } - - bool IsSyntheticBeginFrameSourceActive() const { - return synthetic_begin_frame_source_->IsActive(); - } - - private: - TestScheduler( - SchedulerClient* client, - const SchedulerSettings& scheduler_settings, - int layer_tree_host_id, - const scoped_refptr<base::SingleThreadTaskRunner> & impl_task_runner) - : Scheduler(client, - scheduler_settings, - layer_tree_host_id, - impl_task_runner) { - } -}; - class FakeSchedulerClient : public SchedulerClient { public: FakeSchedulerClient() : needs_begin_frame_(false), automatic_swap_ack_(true), swap_contains_incomplete_tile_(false), - redraw_will_happen_if_update_visible_tiles_happens_(false) { + redraw_will_happen_if_update_visible_tiles_happens_(false), + now_src_(TestNowSource::Create()) { Reset(); } @@ -97,8 +64,9 @@ class FakeSchedulerClient : public SchedulerClient { } TestScheduler* CreateScheduler(const SchedulerSettings& settings) { - task_runner_ = new OrderedSimpleTaskRunner; - scheduler_ = TestScheduler::Create(this, settings, 0, task_runner_); + scheduler_ = TestScheduler::Create(now_src_, this, settings, 0); + // Fail if we need to run 100 tasks in a row. + task_runner().SetRunTaskLimit(100); return scheduler_.get(); } @@ -116,7 +84,21 @@ class FakeSchedulerClient : public SchedulerClient { return posted_begin_impl_frame_deadline_; } - OrderedSimpleTaskRunner& task_runner() { return *task_runner_.get(); } + void AdvanceFrame() { + bool external_begin_frame = + scheduler_->settings().begin_frame_scheduling_enabled && + scheduler_->settings().throttle_frame_production; + + if (external_begin_frame) { + scheduler_->BeginFrame(CreateBeginFrameArgsForTesting(now_src_)); + } + + EXPECT_TRUE(task_runner().RunTasksWhile(ImplFrameDeadlinePending(false))); + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); + } + + OrderedSimpleTaskRunner& task_runner() { return scheduler_->task_runner(); } + TestNowSource* now_src() { return now_src_.get(); } int ActionIndex(const char* action) const { for (size_t i = 0; i < actions_.size(); i++) @@ -228,7 +210,17 @@ class FakeSchedulerClient : public SchedulerClient { virtual void DidBeginImplFrameDeadline() OVERRIDE {} + base::Callback<bool(void)> ImplFrameDeadlinePending(bool state) { + return base::Bind(&FakeSchedulerClient::ImplFrameDeadlinePendingCallback, + base::Unretained(this), + state); + } + protected: + bool ImplFrameDeadlinePendingCallback(bool state) { + return scheduler_->BeginImplFrameDeadlinePending() == state; + } + bool needs_begin_frame_; bool draw_will_happen_; bool swap_will_happen_if_draw_happens_; @@ -241,14 +233,13 @@ class FakeSchedulerClient : public SchedulerClient { std::vector<const char*> actions_; std::vector<scoped_refptr<base::debug::ConvertableToTraceFormat> > states_; scoped_ptr<TestScheduler> scheduler_; - scoped_refptr<OrderedSimpleTaskRunner> task_runner_; + scoped_refptr<TestNowSource> now_src_; }; void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler, FakeSchedulerClient* client) { - bool client_initiates_begin_frame = - scheduler->settings().begin_frame_scheduling_enabled && - scheduler->settings().throttle_frame_production; + TRACE_EVENT0("cc", + "SchedulerUnitTest::InitializeOutputSurfaceAndFirstCommit"); scheduler->DidCreateAndInitializeOutputSurface(); scheduler->SetNeedsCommit(); @@ -256,27 +247,22 @@ void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler, scheduler->NotifyReadyToCommit(); if (scheduler->settings().impl_side_painting) scheduler->NotifyReadyToActivate(); + // Go through the motions to draw the commit. - if (client_initiates_begin_frame) - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); - else - client->task_runner().RunPendingTasks(); // Run posted BeginFrame. + client->AdvanceFrame(); // Run the posted deadline task. EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); - client->task_runner().RunPendingTasks(); + client->task_runner().RunTasksWhile(client->ImplFrameDeadlinePending(true)); EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); // We need another BeginImplFrame so Scheduler calls // SetNeedsBeginFrame(false). - if (client_initiates_begin_frame) - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); - else - client->task_runner().RunPendingTasks(); // Run posted BeginFrame. + client->AdvanceFrame(); // Run the posted deadline task. EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); - client->task_runner().RunPendingTasks(); + client->task_runner().RunTasksWhile(client->ImplFrameDeadlinePending(true)); EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); } @@ -312,7 +298,7 @@ TEST(SchedulerTest, RequestCommit) { EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); client.Reset(); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); @@ -334,7 +320,7 @@ TEST(SchedulerTest, RequestCommit) { client.Reset(); // BeginImplFrame should prepare the draw. - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); @@ -350,7 +336,7 @@ TEST(SchedulerTest, RequestCommit) { // The following BeginImplFrame deadline should SetNeedsBeginFrame(false) // to avoid excessive toggles. - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); client.Reset(); @@ -378,7 +364,7 @@ TEST(SchedulerTest, RequestCommitAfterBeginMainFrameSent) { EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); client.Reset(); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); @@ -408,7 +394,7 @@ TEST(SchedulerTest, RequestCommitAfterBeginMainFrameSent) { client.Reset(); // Since another commit is needed, the next BeginImplFrame should initiate // the second commit. - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); @@ -430,7 +416,7 @@ TEST(SchedulerTest, RequestCommitAfterBeginMainFrameSent) { // On the next BeginImplFrame, verify we go back to a quiescent state and // no longer request BeginImplFrames. - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); client.task_runner().RunPendingTasks(); // Run posted deadline. EXPECT_FALSE(client.needs_begin_frame()); client.Reset(); @@ -476,13 +462,13 @@ TEST(SchedulerTest, RequestRedrawInsideDraw) { EXPECT_TRUE(client.needs_begin_frame()); EXPECT_EQ(0, client.num_draws()); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); client.task_runner().RunPendingTasks(); // Run posted deadline. EXPECT_EQ(1, client.num_draws()); EXPECT_TRUE(scheduler->RedrawPending()); EXPECT_TRUE(client.needs_begin_frame()); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); client.task_runner().RunPendingTasks(); // Run posted deadline. EXPECT_EQ(2, client.num_draws()); EXPECT_FALSE(scheduler->RedrawPending()); @@ -490,7 +476,7 @@ TEST(SchedulerTest, RequestRedrawInsideDraw) { // We stop requesting BeginImplFrames after a BeginImplFrame where we don't // swap. - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); client.task_runner().RunPendingTasks(); // Run posted deadline. EXPECT_EQ(2, client.num_draws()); EXPECT_FALSE(scheduler->RedrawPending()); @@ -516,7 +502,7 @@ TEST(SchedulerTest, RequestRedrawInsideFailedDraw) { EXPECT_EQ(0, client.num_draws()); // Fail the draw. - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); client.task_runner().RunPendingTasks(); // Run posted deadline. EXPECT_EQ(1, client.num_draws()); @@ -527,7 +513,7 @@ TEST(SchedulerTest, RequestRedrawInsideFailedDraw) { EXPECT_TRUE(client.needs_begin_frame()); // Fail the draw again. - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); client.task_runner().RunPendingTasks(); // Run posted deadline. EXPECT_EQ(2, client.num_draws()); EXPECT_TRUE(scheduler->CommitPending()); @@ -536,7 +522,7 @@ TEST(SchedulerTest, RequestRedrawInsideFailedDraw) { // Draw successfully. client.SetDrawWillHappen(true); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); client.task_runner().RunPendingTasks(); // Run posted deadline. EXPECT_EQ(3, client.num_draws()); EXPECT_TRUE(scheduler->CommitPending()); @@ -594,7 +580,7 @@ TEST(SchedulerTest, RequestCommitInsideDraw) { EXPECT_TRUE(client.needs_begin_frame()); client.SetNeedsCommitOnNextDraw(); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); client.SetNeedsCommitOnNextDraw(); client.task_runner().RunPendingTasks(); // Run posted deadline. EXPECT_EQ(1, client.num_draws()); @@ -603,7 +589,7 @@ TEST(SchedulerTest, RequestCommitInsideDraw) { scheduler->NotifyBeginMainFrameStarted(); scheduler->NotifyReadyToCommit(); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); client.task_runner().RunPendingTasks(); // Run posted deadline. EXPECT_EQ(2, client.num_draws()); @@ -613,7 +599,7 @@ TEST(SchedulerTest, RequestCommitInsideDraw) { // We stop requesting BeginImplFrames after a BeginImplFrame where we don't // swap. - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); client.task_runner().RunPendingTasks(); // Run posted deadline. EXPECT_EQ(2, client.num_draws()); EXPECT_FALSE(scheduler->RedrawPending()); @@ -640,7 +626,7 @@ TEST(SchedulerTest, RequestCommitInsideFailedDraw) { EXPECT_EQ(0, client.num_draws()); // Fail the draw. - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); client.task_runner().RunPendingTasks(); // Run posted deadline. EXPECT_EQ(1, client.num_draws()); @@ -651,7 +637,7 @@ TEST(SchedulerTest, RequestCommitInsideFailedDraw) { EXPECT_TRUE(client.needs_begin_frame()); // Fail the draw again. - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); client.task_runner().RunPendingTasks(); // Run posted deadline. EXPECT_EQ(2, client.num_draws()); @@ -661,7 +647,7 @@ TEST(SchedulerTest, RequestCommitInsideFailedDraw) { // Draw successfully. client.SetDrawWillHappen(true); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); client.task_runner().RunPendingTasks(); // Run posted deadline. EXPECT_EQ(3, client.num_draws()); EXPECT_TRUE(scheduler->CommitPending()); @@ -686,7 +672,7 @@ TEST(SchedulerTest, NoSwapWhenDrawFails) { // Draw successfully, this starts a new frame. client.SetNeedsCommitOnNextDraw(); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); client.task_runner().RunPendingTasks(); // Run posted deadline. EXPECT_EQ(1, client.num_draws()); @@ -697,7 +683,7 @@ TEST(SchedulerTest, NoSwapWhenDrawFails) { // Fail to draw, this should not start a frame. client.SetDrawWillHappen(false); client.SetNeedsCommitOnNextDraw(); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); client.task_runner().RunPendingTasks(); // Run posted deadline. EXPECT_EQ(2, client.num_draws()); } @@ -736,7 +722,7 @@ TEST(SchedulerTest, ManageTiles) { // We have no immediate actions to perform, so the BeginImplFrame should post // the deadline task. client.Reset(); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); @@ -764,7 +750,7 @@ TEST(SchedulerTest, ManageTiles) { // We have no immediate actions to perform, so the BeginImplFrame should post // the deadline task. client.Reset(); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); @@ -785,7 +771,7 @@ TEST(SchedulerTest, ManageTiles) { // We need a BeginImplFrame where we don't swap to go idle. client.Reset(); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); client.Reset(); @@ -806,7 +792,7 @@ TEST(SchedulerTest, ManageTiles) { // BeginImplFrame. There will be no draw, only ManageTiles. client.Reset(); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); client.Reset(); @@ -832,7 +818,7 @@ TEST(SchedulerTest, ManageTilesOncePerFrame) { scheduler->SetNeedsManageTiles(); scheduler->SetNeedsRedraw(); client.Reset(); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); @@ -854,7 +840,7 @@ TEST(SchedulerTest, ManageTilesOncePerFrame) { scheduler->SetNeedsManageTiles(); scheduler->SetNeedsRedraw(); client.Reset(); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); @@ -877,7 +863,7 @@ TEST(SchedulerTest, ManageTilesOncePerFrame) { scheduler->SetNeedsManageTiles(); scheduler->SetNeedsRedraw(); client.Reset(); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); @@ -900,7 +886,7 @@ TEST(SchedulerTest, ManageTilesOncePerFrame) { scheduler->SetNeedsManageTiles(); scheduler->SetNeedsRedraw(); client.Reset(); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); @@ -919,7 +905,7 @@ TEST(SchedulerTest, ManageTilesOncePerFrame) { scheduler->SetNeedsManageTiles(); scheduler->SetNeedsRedraw(); client.Reset(); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); @@ -955,7 +941,7 @@ TEST(SchedulerTest, ShouldUpdateVisibleTiles) { EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); client.Reset(); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); @@ -977,7 +963,7 @@ TEST(SchedulerTest, ShouldUpdateVisibleTiles) { EXPECT_FALSE(scheduler->RedrawPending()); client.Reset(); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); @@ -988,7 +974,7 @@ TEST(SchedulerTest, ShouldUpdateVisibleTiles) { EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 2, 3); client.Reset(); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); @@ -1010,7 +996,7 @@ TEST(SchedulerTest, TriggerBeginFrameDeadlineEarly) { client.Reset(); scheduler->SetNeedsRedraw(); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); // The deadline should be zero since there is no work other than drawing // pending. @@ -1066,7 +1052,7 @@ void MainFrameInHighLatencyMode(int64 begin_main_frame_to_commit_estimate_in_ms, client.Reset(); scheduler->SetNeedsCommit(); EXPECT_FALSE(scheduler->MainThreadIsInHighLatencyMode()); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); EXPECT_FALSE(scheduler->MainThreadIsInHighLatencyMode()); client.task_runner().RunPendingTasks(); // Run posted deadline. EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); @@ -1078,7 +1064,7 @@ void MainFrameInHighLatencyMode(int64 begin_main_frame_to_commit_estimate_in_ms, client.Reset(); scheduler->SetNeedsCommit(); EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); client.task_runner().RunPendingTasks(); // Run posted deadline. EXPECT_EQ(scheduler->MainThreadIsInHighLatencyMode(), @@ -1135,7 +1121,7 @@ TEST(SchedulerTest, PollForCommitCompletion) { scheduler->NotifyReadyToCommit(); scheduler->SetNeedsRedraw(); - BeginFrameArgs frame_args = CreateBeginFrameArgsForTesting(); + BeginFrameArgs frame_args = CreateBeginFrameArgsForTesting(client.now_src()); frame_args.interval = base::TimeDelta::FromMilliseconds(1000); scheduler->BeginFrame(frame_args); @@ -1167,7 +1153,7 @@ TEST(SchedulerTest, PollForCommitCompletion) { // Does three iterations to make sure that the timer is properly repeating. for (int i = 0; i < 3; ++i) { EXPECT_EQ((frame_args.interval * 2).InMicroseconds(), - client.task_runner().NextPendingTaskDelay().InMicroseconds()) + client.task_runner().DelayToNextTaskTime().InMicroseconds()) << scheduler->AsValue()->ToString(); client.task_runner().RunPendingTasks(); EXPECT_GT(client.num_actions_(), actions_so_far); @@ -1180,7 +1166,7 @@ TEST(SchedulerTest, PollForCommitCompletion) { scheduler->NotifyBeginMainFrameStarted(); for (int i = 0; i < 3; ++i) { EXPECT_EQ((frame_args.interval * 2).InMicroseconds(), - client.task_runner().NextPendingTaskDelay().InMicroseconds()) + client.task_runner().DelayToNextTaskTime().InMicroseconds()) << scheduler->AsValue()->ToString(); client.task_runner().RunPendingTasks(); EXPECT_GT(client.num_actions_(), actions_so_far); @@ -1208,7 +1194,7 @@ TEST(SchedulerTest, BeginRetroFrame) { // Create a BeginFrame with a long deadline to avoid race conditions. // This is the first BeginFrame, which will be handled immediately. - BeginFrameArgs args = CreateBeginFrameArgsForTesting(); + BeginFrameArgs args = CreateBeginFrameArgsForTesting(client.now_src()); args.deadline += base::TimeDelta::FromHours(1); scheduler->BeginFrame(args); EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); @@ -1287,7 +1273,7 @@ TEST(SchedulerTest, BeginRetroFrame_SwapThrottled) { // Create a BeginFrame with a long deadline to avoid race conditions. // This is the first BeginFrame, which will be handled immediately. - BeginFrameArgs args = CreateBeginFrameArgsForTesting(); + BeginFrameArgs args = CreateBeginFrameArgsForTesting(client.now_src()); args.deadline += base::TimeDelta::FromHours(1); scheduler->BeginFrame(args); EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); @@ -1345,7 +1331,10 @@ TEST(SchedulerTest, BeginRetroFrame_SwapThrottled) { // BeginImplFrame deadline should draw. scheduler->SetNeedsRedraw(); - client.task_runner().RunPendingTasks(); // Run posted deadline. + + EXPECT_TRUE(client.task_runner().RunTasksWhile( + client.ImplFrameDeadlinePending(true))); + EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); @@ -1406,7 +1395,7 @@ void BeginFramesNotFromClient(bool begin_frame_scheduling_enabled, client.Reset(); // BeginImplFrame deadline should draw. - client.task_runner().RunPendingTasks(); // Run posted deadline. + client.task_runner().RunTasksWhile(client.ImplFrameDeadlinePending(true)); EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); EXPECT_FALSE(client.needs_begin_frame()); @@ -1427,8 +1416,7 @@ void BeginFramesNotFromClient(bool begin_frame_scheduling_enabled, client.Reset(); } -// See: http://crbug.com/380889 -TEST(SchedulerTest, DISABLED_SyntheticBeginFrames) { +TEST(SchedulerTest, SyntheticBeginFrames) { bool begin_frame_scheduling_enabled = false; bool throttle_frame_production = true; BeginFramesNotFromClient(begin_frame_scheduling_enabled, @@ -1442,8 +1430,7 @@ TEST(SchedulerTest, VSyncThrottlingDisabled) { throttle_frame_production); } -// See: http://crbug.com/380889 -TEST(SchedulerTest, DISABLED_SyntheticBeginFrames_And_VSyncThrottlingDisabled) { +TEST(SchedulerTest, SyntheticBeginFrames_And_VSyncThrottlingDisabled) { bool begin_frame_scheduling_enabled = false; bool throttle_frame_production = false; BeginFramesNotFromClient(begin_frame_scheduling_enabled, @@ -1523,8 +1510,7 @@ void BeginFramesNotFromClient_SwapThrottled(bool begin_frame_scheduling_enabled, client.Reset(); } -// See: http://crbug.com/380889 -TEST(SchedulerTest, DISABLED_SyntheticBeginFrames_SwapThrottled) { +TEST(SchedulerTest, SyntheticBeginFrames_SwapThrottled) { bool begin_frame_scheduling_enabled = false; bool throttle_frame_production = true; BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, @@ -1538,9 +1524,8 @@ TEST(SchedulerTest, VSyncThrottlingDisabled_SwapThrottled) { throttle_frame_production); } -// See: http://crbug.com/380889 TEST(SchedulerTest, - DISABLED_SyntheticBeginFrames_And_VSyncThrottlingDisabled_SwapThrottled) { + SyntheticBeginFrames_And_VSyncThrottlingDisabled_SwapThrottled) { bool begin_frame_scheduling_enabled = false; bool throttle_frame_production = false; BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, @@ -1580,7 +1565,7 @@ TEST(SchedulerTest, DidLoseOutputSurfaceAfterBeginFrameStarted) { EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); client.Reset(); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); @@ -1619,7 +1604,7 @@ void DidLoseOutputSurfaceAfterBeginFrameStartedWithHighLatency( EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); client.Reset(); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); @@ -1630,13 +1615,17 @@ void DidLoseOutputSurfaceAfterBeginFrameStartedWithHighLatency( EXPECT_NO_ACTION(client); client.Reset(); - client.task_runner().RunPendingTasks(); // Run posted deadline. + // Run posted deadline. + EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); + client.task_runner().RunTasksWhile(client.ImplFrameDeadlinePending(true)); // OnBeginImplFrameDeadline didn't schedule any actions because main frame is // not yet completed. EXPECT_NO_ACTION(client); + EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); // BeginImplFrame is not started. - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.task_runner().RunUntilTime(client.now_src()->Now() + + base::TimeDelta::FromMilliseconds(10)); EXPECT_NO_ACTION(client); EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); @@ -1682,7 +1671,7 @@ void DidLoseOutputSurfaceAfterReadyToCommit(bool impl_side_painting) { EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); client.Reset(); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); @@ -1731,7 +1720,7 @@ TEST(SchedulerTest, DidLoseOutputSurfaceAfterSetNeedsManageTiles) { EXPECT_TRUE(client.needs_begin_frame()); client.Reset(); - scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); + client.AdvanceFrame(); EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); @@ -1764,7 +1753,7 @@ TEST(SchedulerTest, DidLoseOutputSurfaceAfterBeginRetroFramePosted) { // Create a BeginFrame with a long deadline to avoid race conditions. // This is the first BeginFrame, which will be handled immediately. client.Reset(); - BeginFrameArgs args = CreateBeginFrameArgsForTesting(); + BeginFrameArgs args = CreateBeginFrameArgsForTesting(client.now_src()); args.deadline += base::TimeDelta::FromHours(1); scheduler->BeginFrame(args); EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); @@ -1823,7 +1812,7 @@ TEST(SchedulerTest, DidLoseOutputSurfaceDuringBeginRetroFrameRunning) { // Create a BeginFrame with a long deadline to avoid race conditions. // This is the first BeginFrame, which will be handled immediately. client.Reset(); - BeginFrameArgs args = CreateBeginFrameArgsForTesting(); + BeginFrameArgs args = CreateBeginFrameArgsForTesting(client.now_src()); args.deadline += base::TimeDelta::FromHours(1); scheduler->BeginFrame(args); EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); @@ -1878,10 +1867,8 @@ TEST(SchedulerTest, DidLoseOutputSurfaceDuringBeginRetroFrameRunning) { EXPECT_NO_ACTION(client); } -// See: http://crbug.com/380889 -TEST( - SchedulerTest, - DISABLED_StopBeginFrameAfterDidLoseOutputSurfaceWithSyntheticBeginFrameSource) { +TEST(SchedulerTest, + StopBeginFrameAfterDidLoseOutputSurfaceWithSyntheticBeginFrameSource) { FakeSchedulerClient client; SchedulerSettings scheduler_settings; scheduler_settings.begin_frame_scheduling_enabled = false; |