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

Unified Diff: cc/scheduler/scheduler.cc

Issue 2632563003: [cc] Calculate the correct latest_confirmed_sequence_number in cc::Scheduler. (Closed)
Patch Set: add todo for impl-side invalidations. Created 3 years, 10 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_state_machine.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 6e8172608c195a47d8c09f242d6ca5b56c90cab6..66de03d3139dd6c003e698e4ecd5dce33c106308 100644
--- a/cc/scheduler/scheduler.cc
+++ b/cc/scheduler/scheduler.cc
@@ -266,10 +266,10 @@ bool Scheduler::OnBeginFrameDerivedImpl(const BeginFrameArgs& args) {
if (!state_machine_.BeginFrameNeeded()) {
TRACE_EVENT_INSTANT0("cc", "Scheduler::BeginFrameDropped",
TRACE_EVENT_SCOPE_THREAD);
- // TODO(eseckler): Determine and set correct |ack.latest_confirmed_frame|.
- BeginFrameAck ack(args.source_id, args.sequence_number,
- args.sequence_number, 0, false);
- begin_frame_source_->DidFinishFrame(this, ack);
+ // Since we don't use the BeginFrame, we may later receive the same
+ // BeginFrame again. Thus, we can't confirm it at this point, even though we
+ // don't have any updates right now.
+ SendBeginFrameAck(args, kBeginFrameSkipped);
return false;
}
@@ -331,10 +331,7 @@ void Scheduler::BeginImplFrameWithDeadline(const BeginFrameArgs& args) {
// Discard missed begin frames if they are too late.
if (adjusted_args.type == BeginFrameArgs::MISSED &&
now > adjusted_args.deadline) {
- // TODO(eseckler): Determine and set correct |ack.latest_confirmed_frame|.
- BeginFrameAck ack(adjusted_args.source_id, adjusted_args.sequence_number,
- adjusted_args.sequence_number, 0, false);
- begin_frame_source_->DidFinishFrame(this, ack);
+ SendBeginFrameAck(adjusted_args, kBeginFrameSkipped);
return;
}
@@ -344,10 +341,12 @@ void Scheduler::BeginImplFrameWithDeadline(const BeginFrameArgs& args) {
OnBeginImplFrameDeadline();
// We may not need begin frames any longer.
if (!observing_begin_frame_source_) {
- // TODO(eseckler): Determine and set correct |ack.latest_confirmed_frame|.
- BeginFrameAck ack(adjusted_args.source_id, adjusted_args.sequence_number,
- adjusted_args.sequence_number, 0, false);
- begin_frame_source_->DidFinishFrame(this, ack);
+ // We need to confirm the ignored BeginFrame, since we don't have updates.
+ // To persist the confirmation for future BeginFrameAcks, we let the state
+ // machine know about the BeginFrame.
+ state_machine_.OnBeginFrameDroppedNotObserving(args.source_id,
+ args.sequence_number);
+ SendBeginFrameAck(adjusted_args, kBeginFrameSkipped);
return;
}
}
@@ -406,12 +405,7 @@ void Scheduler::BeginImplFrameWithDeadline(const BeginFrameArgs& args) {
can_activate_before_deadline)) {
TRACE_EVENT_INSTANT0("cc", "SkipBeginImplFrameToReduceLatency",
TRACE_EVENT_SCOPE_THREAD);
- if (begin_frame_source_) {
- // TODO(eseckler): Determine and set correct |ack.latest_confirmed_frame|.
- BeginFrameAck ack(adjusted_args.source_id, adjusted_args.sequence_number,
- adjusted_args.sequence_number, 0, false);
- begin_frame_source_->DidFinishFrame(this, ack);
- }
+ SendBeginFrameAck(begin_main_frame_args_, kBeginFrameSkipped);
return;
}
@@ -439,17 +433,33 @@ void Scheduler::FinishImplFrame() {
ProcessScheduledActions();
client_->DidFinishImplFrame();
- if (begin_frame_source_) {
- // TODO(eseckler): Determine and set correct |ack.latest_confirmed_frame|.
- BeginFrameAck ack(begin_main_frame_args_.source_id,
- begin_main_frame_args_.sequence_number,
- begin_main_frame_args_.sequence_number, 0,
- state_machine_.did_submit_in_last_frame());
- begin_frame_source_->DidFinishFrame(this, ack);
- }
+ SendBeginFrameAck(begin_main_frame_args_, kBeginFrameFinished);
begin_impl_frame_tracker_.Finish();
}
+void Scheduler::SendBeginFrameAck(const BeginFrameArgs& args,
+ BeginFrameResult result) {
+ if (!begin_frame_source_)
+ return;
+
+ uint64_t latest_confirmed_sequence_number =
+ BeginFrameArgs::kInvalidFrameNumber;
+ if (args.source_id == state_machine_.begin_frame_source_id()) {
+ latest_confirmed_sequence_number =
+ state_machine_
+ .last_begin_frame_sequence_number_compositor_frame_was_fresh();
+ }
+
+ bool did_submit = false;
+ if (result == kBeginFrameFinished) {
+ did_submit = state_machine_.did_submit_in_last_frame();
+ }
+
+ BeginFrameAck ack(args.source_id, args.sequence_number,
+ latest_confirmed_sequence_number, 0, did_submit);
+ begin_frame_source_->DidFinishFrame(this, ack);
+}
+
// BeginImplFrame starts a compositor frame that will wait up until a deadline
// for a BeginMainFrame+activation to complete before it times out and draws
// any asynchronous animation and scroll/pinch updates.
@@ -460,7 +470,7 @@ void Scheduler::BeginImplFrame(const BeginFrameArgs& args) {
DCHECK(state_machine_.HasInitializedCompositorFrameSink());
begin_impl_frame_tracker_.Start(args);
- state_machine_.OnBeginImplFrame();
+ state_machine_.OnBeginImplFrame(args.source_id, args.sequence_number);
devtools_instrumentation::DidBeginFrame(layer_tree_host_id_);
compositor_timing_history_->WillBeginImplFrame(
state_machine_.NewActiveTreeLikely());
« no previous file with comments | « cc/scheduler/scheduler.h ('k') | cc/scheduler/scheduler_state_machine.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698