Index: cc/scheduler/scheduler.cc |
diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc |
index cf994fb222028383612438f74aa8331fde298d4c..ebdc289b18e50082e00ff9cac20698d227e00f0b 100644 |
--- a/cc/scheduler/scheduler.cc |
+++ b/cc/scheduler/scheduler.cc |
@@ -151,7 +151,23 @@ void Scheduler::SetupNextBeginFrameIfNeeded() { |
if (state_machine_.inside_begin_frame() && has_pending_begin_frame_) { |
has_pending_begin_frame_ = false; |
client_->SetNeedsBeginFrameOnImplThread(true); |
- return; |
+ } |
+ |
+ // Setup PollForAnticipatedDrawTriggers for cases where we want a proactive |
+ // BeginFrame but aren't requesting one. |
+ if (!needs_begin_frame && |
+ state_machine_.ProactiveBeginFrameWantedByImplThread()) { |
+ if (poll_for_draw_triggers_closure_.IsCancelled()) { |
+ poll_for_draw_triggers_closure_.Reset( |
+ base::Bind(&Scheduler::PollForAnticipatedDrawTriggers, |
+ weak_factory_.GetWeakPtr())); |
+ base::MessageLoop::current()->PostDelayedTask( |
+ FROM_HERE, |
+ poll_for_draw_triggers_closure_.callback(), |
+ last_begin_frame_args_.interval); |
+ } |
+ } else { |
+ poll_for_draw_triggers_closure_.Cancel(); |
} |
} |
@@ -165,6 +181,12 @@ void Scheduler::BeginFrame(const BeginFrameArgs& args) { |
state_machine_.DidLeaveBeginFrame(); |
} |
+void Scheduler::PollForAnticipatedDrawTriggers() { |
+ TRACE_EVENT0("cc", "Scheduler::PollForAnticipatedDrawTriggers"); |
+ state_machine_.PollForAnticipatedDrawTriggers(); |
+ ProcessScheduledActions(); |
+} |
+ |
void Scheduler::DrawAndSwapIfPossible() { |
DrawSwapReadbackResult result = |
client_->ScheduledActionDrawAndSwapIfPossible(); |