Commit c072db71 authored by Sadrul Habib Chowdhury's avatar Sadrul Habib Chowdhury Committed by Commit Bot

[throughput] Notify trackers when commit happens.

Notify the trackers when a begin-main-frame processing is complete, so
that the tracker can verify (with DCHECKs) that it is notified of the
events in a well-defined and expected sequence. At the moment, there
are synthesized 'begin main frame' notifications to the trackers that
prohibit the DCHECK()s to be added, but we will be turning those on in
follow up CLs.

BUG=1021963

Change-Id: I01e8bb2d869a1707b6a1b412fdab0cadfde12255
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1995461
Commit-Queue: Xida Chen <xidachen@chromium.org>
Reviewed-by: default avatarXida Chen <xidachen@chromium.org>
Cr-Commit-Position: refs/heads/master@{#732238}
parent c368800d
...@@ -293,6 +293,12 @@ void FrameSequenceTrackerCollection::NotifyBeginMainFrame( ...@@ -293,6 +293,12 @@ void FrameSequenceTrackerCollection::NotifyBeginMainFrame(
tracker.second->ReportBeginMainFrame(args); tracker.second->ReportBeginMainFrame(args);
} }
void FrameSequenceTrackerCollection::NotifyMainFrameProcessed(
const viz::BeginFrameArgs& args) {
for (auto& tracker : frame_trackers_)
tracker.second->ReportMainFrameProcessed(args);
}
void FrameSequenceTrackerCollection::NotifyImplFrameCausedNoDamage( void FrameSequenceTrackerCollection::NotifyImplFrameCausedNoDamage(
const viz::BeginFrameAck& ack) { const viz::BeginFrameAck& ack) {
for (auto& tracker : frame_trackers_) { for (auto& tracker : frame_trackers_) {
...@@ -490,15 +496,42 @@ void FrameSequenceTracker::ReportBeginMainFrame( ...@@ -490,15 +496,42 @@ void FrameSequenceTracker::ReportBeginMainFrame(
} }
#endif #endif
// TODO(sad, xidachen): This DCHECK needs to be turned on, but the synthesized
// BeginMainFrame notifications from LayerTreeHostImpl needs to be removed
// first.
// DCHECK_EQ(awaiting_main_response_sequence_, 0u) << TRACKER_DCHECK_MSG;
awaiting_main_response_sequence_ = args.frame_id.sequence_number;
UpdateTrackedFrameData(&begin_main_frame_data_, args.frame_id.source_id, UpdateTrackedFrameData(&begin_main_frame_data_, args.frame_id.source_id,
args.frame_id.sequence_number); args.frame_id.sequence_number);
if (!first_received_main_sequence_ || if (!first_received_main_sequence_ ||
first_received_main_sequence_ <= last_no_main_damage_sequence_) first_received_main_sequence_ <= last_no_main_damage_sequence_) {
first_received_main_sequence_ = args.frame_id.sequence_number; first_received_main_sequence_ = args.frame_id.sequence_number;
}
main_throughput().frames_expected += main_throughput().frames_expected +=
begin_main_frame_data_.previous_sequence_delta; begin_main_frame_data_.previous_sequence_delta;
} }
void FrameSequenceTracker::ReportMainFrameProcessed(
const viz::BeginFrameArgs& args) {
if (termination_status_ != TerminationStatus::kActive)
return;
if (ShouldIgnoreBeginFrameSource(args.frame_id.source_id))
return;
TRACKER_TRACE_STREAM << "E(" << args.frame_id.sequence_number << ")";
if (first_received_main_sequence_ &&
args.frame_id.sequence_number >= first_received_main_sequence_) {
// TODO(sad, xidachen): This DCHECK needs to be turned on, but the
// synthesized BeginMainFrame notifications from LayerTreeHostImpl needs to
// be removed first.
// DCHECK_EQ(awaiting_main_response_sequence_,
// args.frame_id.sequence_number) << TRACKER_DCHECK_MSG;
awaiting_main_response_sequence_ = 0;
}
}
void FrameSequenceTracker::ReportSubmitFrame( void FrameSequenceTracker::ReportSubmitFrame(
uint32_t frame_token, uint32_t frame_token,
bool has_missing_content, bool has_missing_content,
...@@ -729,6 +762,13 @@ void FrameSequenceTracker::ReportMainFrameCausedNoDamage( ...@@ -729,6 +762,13 @@ void FrameSequenceTracker::ReportMainFrameCausedNoDamage(
if (last_no_main_damage_sequence_ == args.frame_id.sequence_number) if (last_no_main_damage_sequence_ == args.frame_id.sequence_number)
return; return;
// TODO(sad, xidachen): This DCHECK needs to be turned on, but the synthesized
// BeginMainFrame notifications from LayerTreeHostImpl needs to be removed
// first.
// DCHECK_EQ(awaiting_main_response_sequence_, args.frame_id.sequence_number)
// << TRACKER_DCHECK_MSG;
awaiting_main_response_sequence_ = 0;
DCHECK_GT(main_throughput().frames_expected, 0u) << TRACKER_DCHECK_MSG; DCHECK_GT(main_throughput().frames_expected, 0u) << TRACKER_DCHECK_MSG;
DCHECK_GT(main_throughput().frames_expected, DCHECK_GT(main_throughput().frames_expected,
main_throughput().frames_produced) main_throughput().frames_produced)
......
...@@ -157,6 +157,7 @@ class CC_EXPORT FrameSequenceTrackerCollection { ...@@ -157,6 +157,7 @@ class CC_EXPORT FrameSequenceTrackerCollection {
// Notifies all trackers of various events. // Notifies all trackers of various events.
void NotifyBeginImplFrame(const viz::BeginFrameArgs& args); void NotifyBeginImplFrame(const viz::BeginFrameArgs& args);
void NotifyBeginMainFrame(const viz::BeginFrameArgs& args); void NotifyBeginMainFrame(const viz::BeginFrameArgs& args);
void NotifyMainFrameProcessed(const viz::BeginFrameArgs& args);
void NotifyImplFrameCausedNoDamage(const viz::BeginFrameAck& ack); void NotifyImplFrameCausedNoDamage(const viz::BeginFrameAck& ack);
void NotifyMainFrameCausedNoDamage(const viz::BeginFrameArgs& args); void NotifyMainFrameCausedNoDamage(const viz::BeginFrameArgs& args);
void NotifyPauseFrameProduction(); void NotifyPauseFrameProduction();
...@@ -236,6 +237,8 @@ class CC_EXPORT FrameSequenceTracker { ...@@ -236,6 +237,8 @@ class CC_EXPORT FrameSequenceTracker {
// thread. // thread.
void ReportBeginMainFrame(const viz::BeginFrameArgs& args); void ReportBeginMainFrame(const viz::BeginFrameArgs& args);
void ReportMainFrameProcessed(const viz::BeginFrameArgs& args);
// Notifies the tracker when the compositor submits a CompositorFrame. // Notifies the tracker when the compositor submits a CompositorFrame.
// |origin_args| represents the BeginFrameArgs that triggered the update from // |origin_args| represents the BeginFrameArgs that triggered the update from
// the main-thread. // the main-thread.
...@@ -362,6 +365,9 @@ class CC_EXPORT FrameSequenceTracker { ...@@ -362,6 +365,9 @@ class CC_EXPORT FrameSequenceTracker {
// This is used to decide when to terminate this FrameSequenceTracker object. // This is used to decide when to terminate this FrameSequenceTracker object.
uint32_t last_submitted_frame_ = 0; uint32_t last_submitted_frame_ = 0;
// Keeps track of the begin-main-frame that needs to be processed next.
uint64_t awaiting_main_response_sequence_ = 0;
// Keeps track of the last sequence-number that produced a frame from the // Keeps track of the last sequence-number that produced a frame from the
// main-thread. // main-thread.
uint64_t last_submitted_main_sequence_ = 0; uint64_t last_submitted_main_sequence_ = 0;
......
...@@ -212,8 +212,8 @@ class LayerTreeHostImplForTesting : public LayerTreeHostImpl { ...@@ -212,8 +212,8 @@ class LayerTreeHostImplForTesting : public LayerTreeHostImpl {
test_hooks_->BeginMainFrameAbortedOnThread(this, reason); test_hooks_->BeginMainFrameAbortedOnThread(this, reason);
} }
void ReadyToCommit() override { void ReadyToCommit(const viz::BeginFrameArgs& commit_args) override {
LayerTreeHostImpl::ReadyToCommit(); LayerTreeHostImpl::ReadyToCommit(commit_args);
test_hooks_->ReadyToCommitOnThread(this); test_hooks_->ReadyToCommitOnThread(this);
} }
......
...@@ -375,6 +375,8 @@ void LayerTreeHostImpl::BeginMainFrameAborted( ...@@ -375,6 +375,8 @@ void LayerTreeHostImpl::BeginMainFrameAborted(
if (reason == CommitEarlyOutReason::ABORTED_NOT_VISIBLE || if (reason == CommitEarlyOutReason::ABORTED_NOT_VISIBLE ||
reason == CommitEarlyOutReason::FINISHED_NO_UPDATES) { reason == CommitEarlyOutReason::FINISHED_NO_UPDATES) {
frame_trackers_.NotifyMainFrameCausedNoDamage(args); frame_trackers_.NotifyMainFrameCausedNoDamage(args);
} else {
frame_trackers_.NotifyMainFrameProcessed(args);
} }
// If the begin frame data was handled, then scroll and scale set was applied // If the begin frame data was handled, then scroll and scale set was applied
...@@ -391,6 +393,10 @@ void LayerTreeHostImpl::BeginMainFrameAborted( ...@@ -391,6 +393,10 @@ void LayerTreeHostImpl::BeginMainFrameAborted(
} }
} }
void LayerTreeHostImpl::ReadyToCommit(const viz::BeginFrameArgs& commit_args) {
frame_trackers_.NotifyMainFrameProcessed(commit_args);
}
void LayerTreeHostImpl::BeginCommit() { void LayerTreeHostImpl::BeginCommit() {
TRACE_EVENT0("cc", "LayerTreeHostImpl::BeginCommit"); TRACE_EVENT0("cc", "LayerTreeHostImpl::BeginCommit");
......
...@@ -341,7 +341,7 @@ class CC_EXPORT LayerTreeHostImpl : public InputHandler, ...@@ -341,7 +341,7 @@ class CC_EXPORT LayerTreeHostImpl : public InputHandler,
CommitEarlyOutReason reason, CommitEarlyOutReason reason,
std::vector<std::unique_ptr<SwapPromise>> swap_promises, std::vector<std::unique_ptr<SwapPromise>> swap_promises,
const viz::BeginFrameArgs& args); const viz::BeginFrameArgs& args);
virtual void ReadyToCommit() {} // For tests. virtual void ReadyToCommit(const viz::BeginFrameArgs& commit_args);
virtual void BeginCommit(); virtual void BeginCommit();
virtual void CommitComplete(); virtual void CommitComplete();
virtual void UpdateAnimationState(bool start_ready_animations); virtual void UpdateAnimationState(bool start_ready_animations);
......
...@@ -270,7 +270,8 @@ void ProxyImpl::NotifyReadyToCommitOnImpl( ...@@ -270,7 +270,8 @@ void ProxyImpl::NotifyReadyToCommitOnImpl(
// But, we can avoid a PostTask in here. // But, we can avoid a PostTask in here.
scheduler_->NotifyBeginMainFrameStarted(main_thread_start_time); scheduler_->NotifyBeginMainFrameStarted(main_thread_start_time);
host_impl_->ReadyToCommit(); host_impl_->ReadyToCommit(
scheduler_->last_dispatched_begin_main_frame_args());
commit_completion_event_ = commit_completion_event_ =
std::make_unique<ScopedCompletionEvent>(completion); std::make_unique<ScopedCompletionEvent>(completion);
......
...@@ -174,7 +174,7 @@ void SingleThreadProxy::SetNeedsUpdateLayers() { ...@@ -174,7 +174,7 @@ void SingleThreadProxy::SetNeedsUpdateLayers() {
SetNeedsCommit(); SetNeedsCommit();
} }
void SingleThreadProxy::DoCommit() { void SingleThreadProxy::DoCommit(const viz::BeginFrameArgs& commit_args) {
TRACE_EVENT0("cc", "SingleThreadProxy::DoCommit"); TRACE_EVENT0("cc", "SingleThreadProxy::DoCommit");
DCHECK(task_runner_provider_->IsMainThread()); DCHECK(task_runner_provider_->IsMainThread());
...@@ -187,7 +187,7 @@ void SingleThreadProxy::DoCommit() { ...@@ -187,7 +187,7 @@ void SingleThreadProxy::DoCommit() {
DebugScopedSetMainThreadBlocked main_thread_blocked(task_runner_provider_); DebugScopedSetMainThreadBlocked main_thread_blocked(task_runner_provider_);
DebugScopedSetImplThread impl(task_runner_provider_); DebugScopedSetImplThread impl(task_runner_provider_);
host_impl_->ReadyToCommit(); host_impl_->ReadyToCommit(commit_args);
host_impl_->BeginCommit(); host_impl_->BeginCommit();
if (host_impl_->EvictedUIResourcesExist()) if (host_impl_->EvictedUIResourcesExist())
...@@ -595,7 +595,7 @@ void SingleThreadProxy::CompositeImmediately(base::TimeTicks frame_begin_time, ...@@ -595,7 +595,7 @@ void SingleThreadProxy::CompositeImmediately(base::TimeTicks frame_begin_time,
DoBeginMainFrame(begin_frame_args); DoBeginMainFrame(begin_frame_args);
commit_requested_ = false; commit_requested_ = false;
DoPainting(); DoPainting();
DoCommit(); DoCommit(begin_frame_args);
DCHECK_EQ( DCHECK_EQ(
0u, 0u,
...@@ -900,7 +900,7 @@ DrawResult SingleThreadProxy::ScheduledActionDrawForced() { ...@@ -900,7 +900,7 @@ DrawResult SingleThreadProxy::ScheduledActionDrawForced() {
void SingleThreadProxy::ScheduledActionCommit() { void SingleThreadProxy::ScheduledActionCommit() {
DebugScopedSetMainThread main(task_runner_provider_); DebugScopedSetMainThread main(task_runner_provider_);
DoCommit(); DoCommit(scheduler_on_impl_thread_->last_dispatched_begin_main_frame_args());
} }
void SingleThreadProxy::ScheduledActionActivateSyncTree() { void SingleThreadProxy::ScheduledActionActivateSyncTree() {
......
...@@ -153,7 +153,7 @@ class CC_EXPORT SingleThreadProxy : public Proxy, ...@@ -153,7 +153,7 @@ class CC_EXPORT SingleThreadProxy : public Proxy,
void BeginMainFrameAbortedOnImplThread(CommitEarlyOutReason reason); void BeginMainFrameAbortedOnImplThread(CommitEarlyOutReason reason);
void DoBeginMainFrame(const viz::BeginFrameArgs& begin_frame_args); void DoBeginMainFrame(const viz::BeginFrameArgs& begin_frame_args);
void DoPainting(); void DoPainting();
void DoCommit(); void DoCommit(const viz::BeginFrameArgs& commit_args);
DrawResult DoComposite(LayerTreeHostImpl::FrameData* frame); DrawResult DoComposite(LayerTreeHostImpl::FrameData* frame);
void DoSwap(); void DoSwap();
void DidCommitAndDrawFrame(); void DidCommitAndDrawFrame();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment