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

Unified Diff: cc/scheduler/scheduler.cc

Issue 16871016: cc: Use BeginFrameArgs (Closed) Base URL: http://git.chromium.org/chromium/src.git@bfargs2
Patch Set: Created 7 years, 6 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 side-by-side diff with in-line comments
Download patch
Index: cc/scheduler/scheduler.cc
diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc
index 2f43e8fd5ad22ca334de4f30a7d84e55b670cdfe..aebe761e4b394ac4982aa847d8fab2b40c1b04b2 100644
--- a/cc/scheduler/scheduler.cc
+++ b/cc/scheduler/scheduler.cc
@@ -126,35 +126,60 @@ base::TimeTicks Scheduler::LastBeginFrameOnImplThreadTime() {
void Scheduler::SetupNextBeginFrameIfNeeded() {
// Determine if we need BeginFrame notifications.
- // If we do, always request the BeginFrame immediately.
- // If not, only disable on the next BeginFrame to avoid unnecessary toggles.
- // The synchronous renderer compositor requires immediate disables though.
bool needs_begin_frame = state_machine_.BeginFrameNeededByImplThread();
- if ((needs_begin_frame ||
- state_machine_.inside_begin_frame() ||
- settings_.using_synchronous_renderer_compositor) &&
- (needs_begin_frame != last_set_needs_begin_frame_)) {
- client_->SetNeedsBeginFrameOnImplThread(needs_begin_frame);
- last_set_needs_begin_frame_ = needs_begin_frame;
- }
-
- // Request another BeginFrame if we haven't drawn for now until we have
- // deadlines implemented.
- if (state_machine_.inside_begin_frame() && has_pending_begin_frame_) {
- has_pending_begin_frame_ = false;
- client_->SetNeedsBeginFrameOnImplThread(true);
+ if (settings_.using_synchronous_renderer_compositor) {
+ // The synchronous renderer compositor needs immediate enables/disables.
+ if (needs_begin_frame != last_set_needs_begin_frame_) {
+ client_->SetNeedsBeginFrameOnImplThread(needs_begin_frame);
+ last_set_needs_begin_frame_ = needs_begin_frame;
+ }
+ } else {
+ // The non-synchronous renderer compositor is a bit more complicated:
+ if (needs_begin_frame && !last_set_needs_begin_frame_) {
+ // Always request the BeginFrame immediately if it wasn't needed before.
+ client_->SetNeedsBeginFrameOnImplThread(needs_begin_frame);
Sami 2013/06/14 15:59:20 nit: This function might be a little easier to rea
brianderson 2013/06/14 18:42:36 Ok. This could definitely be simplified.
+ last_set_needs_begin_frame_ = needs_begin_frame;
+ } else if (!needs_begin_frame && last_set_needs_begin_frame_ &&
+ has_pending_begin_frame_ &&
+ state_machine_.begin_frame_state() ==
+ SchedulerStateMachine::BEGIN_FRAME_IDLE) {
+ // Only disable the BeginFrame after a BeginFrame where we didn't swap.
+ client_->SetNeedsBeginFrameOnImplThread(needs_begin_frame);
+ last_set_needs_begin_frame_ = needs_begin_frame;
+ has_pending_begin_frame_ = false;
+ } else if (needs_begin_frame && has_pending_begin_frame_ &&
+ state_machine_.begin_frame_state() ==
+ SchedulerStateMachine::BEGIN_FRAME_IDLE) {
+ // We did not draw and swap this BeginFrame,
+ // so we need to explicitly request another BeginFrame.
+ client_->SetNeedsBeginFrameOnImplThread(needs_begin_frame);
+ last_set_needs_begin_frame_ = needs_begin_frame;
+ has_pending_begin_frame_ = false;
+ }
}
}
void Scheduler::BeginFrame(BeginFrameArgs args) {
TRACE_EVENT0("cc", "Scheduler::BeginFrame");
- last_begin_frame_args_ = args;
DCHECK(!has_pending_begin_frame_);
has_pending_begin_frame_ = true;
- last_begin_frame_args_ = args;
- state_machine_.DidEnterBeginFrame(args);
+ last_begin_frame_args_ = args.CreateBeginFrameWithAdjustedDeadline(
+ BeginFrameArgs::DefaultDeadlineAdjustment());
+ state_machine_.StartBeginFrame(args);
+ ProcessScheduledActions();
+ if (state_machine_.begin_frame_state() ==
+ SchedulerStateMachine::BEGIN_FRAME_WAITING) {
+ client_->PostBeginFrameDeadlineTask(last_begin_frame_args_.deadline());
+ } else {
+ DCHECK_EQ(state_machine_.begin_frame_state(),
+ SchedulerStateMachine::BEGIN_FRAME_IDLE);
+ }
+}
+
+void Scheduler::OnBeginFrameDeadline() {
+ TRACE_EVENT0("cc", "Scheduler::OnBeginFrameDeadline");
+ state_machine_.OnBeginFrameDeadline();
ProcessScheduledActions();
- state_machine_.DidLeaveBeginFrame();
}
void Scheduler::DrawAndSwapIfPossible() {
@@ -180,8 +205,11 @@ void Scheduler::ProcessScheduledActions() {
base::AutoReset<bool> mark_inside(&inside_process_scheduled_actions_, true);
- SchedulerStateMachine::Action action = state_machine_.NextAction();
- while (action != SchedulerStateMachine::ACTION_NONE) {
+ SchedulerStateMachine::Action action;
+ do {
brianderson 2013/06/14 04:16:29 Changing to a do-while loop allows UpdateState to
Sami 2013/06/14 15:59:20 Advancing the begin frame state on ACTION_NONE see
brianderson 2013/06/14 18:42:36 It is a bit fishy, but I couldn't think of a simpl
+ TRACE_EVENT1("cc", "SchedulerStateMachine",
+ "state", state_machine_.ToString());
+ action = state_machine_.NextAction();
state_machine_.UpdateState(action);
switch (action) {
case SchedulerStateMachine::ACTION_NONE:
@@ -211,8 +239,7 @@ void Scheduler::ProcessScheduledActions() {
client_->ScheduledActionAcquireLayerTexturesForMainThread();
break;
}
- action = state_machine_.NextAction();
- }
+ } while (action != SchedulerStateMachine::ACTION_NONE);
SetupNextBeginFrameIfNeeded();
client_->DidAnticipatedDrawTimeChange(AnticipatedDrawTime());

Powered by Google App Engine
This is Rietveld 408576698