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

Unified Diff: cc/scheduler/scheduler.cc

Issue 423773002: Unified BeginFrame scheduling (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Working on aura with --enable-begin-frame-scheduling Created 6 years, 4 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 a20bfd2b3b0e2c6eece49c94fcfd66258bc5f5f3..9e8923fa9aa5ced5ecb6083c8916ef1c838e6777 100644
--- a/cc/scheduler/scheduler.cc
+++ b/cc/scheduler/scheduler.cc
@@ -91,6 +91,7 @@ Scheduler::Scheduler(
state_machine_(scheduler_settings),
inside_process_scheduled_actions_(false),
inside_action_(SchedulerStateMachine::ACTION_NONE),
+ begin_frame_requested_(false),
weak_factory_(this) {
TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler"),
"Scheduler::Scheduler",
@@ -299,7 +300,10 @@ void Scheduler::SetupNextBeginFrameWhenVSyncThrottlingEnabled(
// Always request the BeginFrame immediately if it wasn't needed before.
(needs_begin_frame && !last_set_needs_begin_frame_) ||
// Only stop requesting BeginFrames after a deadline.
- (!needs_begin_frame && last_set_needs_begin_frame_ && at_end_of_deadline);
+ (!needs_begin_frame &&
+ last_set_needs_begin_frame_ &&
+ at_end_of_deadline &&
+ !begin_frame_requested_);
brianderson 2014/08/21 00:13:59 Instead of taking begin_frame_requested_ into acco
simonhong 2014/08/26 08:24:47 Yeap, handling this state by SchdulerStateMachine
if (should_call_set_needs_begin_frame) {
if (settings_.begin_frame_scheduling_enabled) {
@@ -408,6 +412,13 @@ void Scheduler::BeginFrame(const BeginFrameArgs& args) {
DCHECK(settings_.throttle_frame_production);
BeginFrameArgs adjusted_args(args);
+
+ if (settings_.begin_frame_publisher && begin_frame_requested_) {
+ // |arg.deadline| should be adjusted by subscribed Scheduler.
+ client_->SendBeginFrame(args);
+ begin_frame_requested_ = false;
brianderson 2014/08/21 00:13:59 The child Schedulers should be setting begin_frame
simonhong 2014/08/26 08:24:47 Yeap, calling SetChildrenNeedBeginFrames() from Be
+ }
+
adjusted_args.deadline -= EstimatedParentDrawTime();
bool should_defer_begin_frame;
@@ -612,6 +623,20 @@ bool Scheduler::IsBeginMainFrameSent() const {
SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT;
}
+void Scheduler::BeginFrameRequested() {
+ DCHECK(settings_.begin_frame_publisher);
+ DCHECK(!begin_frame_requested_);
+
+ begin_frame_requested_ = true;
+
+ // If frame source is already activated, next BeginFrame will be scheduled.
+ if (synthetic_begin_frame_source_->IsActive())
+ return;
+
+ synthetic_begin_frame_source_->SetNeedsBeginFrame(true,
brianderson 2014/08/21 00:13:59 Instead of calling SetNeedsBeginFrame direcly here
simonhong 2014/08/26 08:24:47 Done.
+ &begin_retro_frame_args_);
+}
+
void Scheduler::DrawAndSwapIfPossible() {
DrawResult result = client_->ScheduledActionDrawAndSwapIfPossible();
state_machine_.DidDrawIfPossibleCompleted(result);

Powered by Google App Engine
This is Rietveld 408576698