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

Unified Diff: cc/scheduler/scheduler.cc

Issue 548153004: Unified BeginFrame scheduling (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: git cl format Created 6 years, 3 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
« no previous file with comments | « cc/scheduler/scheduler.h ('k') | cc/scheduler/scheduler_settings.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/scheduler/scheduler.cc
diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc
index 65f63fc8b641040ad3e26a8e572ae97fd9c6943f..ac92bad550524535d447ce1e2d595a6eac63077a 100644
--- a/cc/scheduler/scheduler.cc
+++ b/cc/scheduler/scheduler.cc
@@ -5,6 +5,7 @@
#include "cc/scheduler/scheduler.h"
#include <algorithm>
+
#include "base/auto_reset.h"
#include "base/debug/trace_event.h"
#include "base/debug/trace_event_argument.h"
@@ -85,6 +86,7 @@ Scheduler::Scheduler(
layer_tree_host_id_(layer_tree_host_id),
task_runner_(task_runner),
vsync_interval_(BeginFrameArgs::DefaultInterval()),
+ authoritative_vsync_interval_(base::TimeDelta()),
last_set_needs_begin_frame_(false),
begin_unthrottled_frame_posted_(false),
begin_retro_frame_posted_(false),
@@ -101,7 +103,6 @@ Scheduler::Scheduler(
if (settings_.main_frame_before_activation_enabled) {
DCHECK(settings_.main_frame_before_draw_enabled);
}
-
begin_retro_frame_closure_ =
base::Bind(&Scheduler::BeginRetroFrame, weak_factory_.GetWeakPtr());
begin_unthrottled_frame_closure_ =
@@ -113,9 +114,8 @@ Scheduler::Scheduler(
advance_commit_state_closure_ = base::Bind(
&Scheduler::PollToAdvanceCommitState, weak_factory_.GetWeakPtr());
- if (!settings_.begin_frame_scheduling_enabled) {
+ if (!settings_.begin_frame_receiver)
SetupSyntheticBeginFrames();
- }
}
Scheduler::~Scheduler() {
@@ -133,12 +133,21 @@ void Scheduler::SetupSyntheticBeginFrames() {
void Scheduler::CommitVSyncParameters(base::TimeTicks timebase,
base::TimeDelta interval) {
- // TODO(brianderson): We should not be receiving 0 intervals.
- if (interval == base::TimeDelta())
- interval = BeginFrameArgs::DefaultInterval();
- vsync_interval_ = interval;
- if (!settings_.begin_frame_scheduling_enabled)
- synthetic_begin_frame_source_->CommitVSyncParameters(timebase, interval);
+ if (authoritative_vsync_interval_ == base::TimeDelta()) {
+ // TODO(brianderson): We should not be receiving 0 intervals.
+ if (interval == base::TimeDelta())
+ interval = BeginFrameArgs::DefaultInterval();
+ vsync_interval_ = interval;
+ } else {
+ vsync_interval_ = authoritative_vsync_interval_;
+ }
+
+ last_timebase_ = timebase;
+
+ if (!settings_.begin_frame_receiver) {
+ synthetic_begin_frame_source_->CommitVSyncParameters(timebase,
+ vsync_interval_);
+ }
}
void Scheduler::SetEstimatedParentDrawTime(base::TimeDelta draw_time) {
@@ -236,7 +245,7 @@ void Scheduler::DidLoseOutputSurface() {
TRACE_EVENT0("cc", "Scheduler::DidLoseOutputSurface");
state_machine_.DidLoseOutputSurface();
last_set_needs_begin_frame_ = false;
- if (!settings_.begin_frame_scheduling_enabled) {
+ if (!settings_.begin_frame_receiver) {
synthetic_begin_frame_source_->SetNeedsBeginFrame(false,
&begin_retro_frame_args_);
}
@@ -302,7 +311,7 @@ void Scheduler::SetupNextBeginFrameWhenVSyncThrottlingEnabled(
(!needs_begin_frame && last_set_needs_begin_frame_ && at_end_of_deadline);
if (should_call_set_needs_begin_frame) {
- if (settings_.begin_frame_scheduling_enabled) {
+ if (settings_.begin_frame_receiver) {
client_->SetNeedsBeginFrame(needs_begin_frame);
} else {
synthetic_begin_frame_source_->SetNeedsBeginFrame(
@@ -408,6 +417,20 @@ void Scheduler::BeginFrame(const BeginFrameArgs& args) {
DCHECK(settings_.throttle_frame_production);
BeginFrameArgs adjusted_args(args);
+
+ if (settings_.begin_frame_publisher &&
+ state_machine_.children_need_begin_frames()) {
+ // Adjust a dealine for child schedulers.
+ // TODO(simonhong): Once we have commitless update, we can get rid of
+ // BeginMainFrameToCommitDurationEstimate() +
+ // CommitToActivateDurationEstimate().
+ adjusted_args.deadline -=
+ (client_->BeginMainFrameToCommitDurationEstimate() +
+ client_->CommitToActivateDurationEstimate() +
+ client_->DrawDurationEstimate() + EstimatedParentDrawTime());
+ client_->SendBeginFrameToChildren(args);
+ }
+
adjusted_args.deadline -= EstimatedParentDrawTime();
bool should_defer_begin_frame;
@@ -607,6 +630,23 @@ void Scheduler::PollToAdvanceCommitState() {
ProcessScheduledActions();
}
+void Scheduler::SetChildrenNeedBeginFrames(bool need_begin_frame) {
+ DCHECK(settings_.begin_frame_publisher);
+
+ state_machine_.SetChildrenNeedBeginFrames(need_begin_frame);
+ ProcessScheduledActions();
+}
+
+void Scheduler::SetAuthoritativeVSyncInterval(base::TimeDelta interval) {
+ authoritative_vsync_interval_ = interval;
+ vsync_interval_ = interval;
+
+ if (!settings_.begin_frame_receiver) {
+ synthetic_begin_frame_source_->CommitVSyncParameters(last_timebase_,
+ interval);
+ }
+}
+
void Scheduler::DrawAndSwapIfPossible() {
DrawResult result = client_->ScheduledActionDrawAndSwapIfPossible();
state_machine_.DidDrawIfPossibleCompleted(result);
« no previous file with comments | « cc/scheduler/scheduler.h ('k') | cc/scheduler/scheduler_settings.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698