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

Side by Side Diff: cc/scheduler/scheduler.cc

Issue 1192663005: cc: Measure compositor timing with finer granularity (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@modeTimingHistory3
Patch Set: rebase; remove skipping logic; Created 5 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 unified diff | Download patch
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/scheduler/scheduler.h" 5 #include "cc/scheduler/scheduler.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/auto_reset.h" 9 #include "base/auto_reset.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 estimated_parent_draw_time_ = draw_time; 124 estimated_parent_draw_time_ = draw_time;
125 } 125 }
126 126
127 void Scheduler::SetCanStart() { 127 void Scheduler::SetCanStart() {
128 state_machine_.SetCanStart(); 128 state_machine_.SetCanStart();
129 ProcessScheduledActions(); 129 ProcessScheduledActions();
130 } 130 }
131 131
132 void Scheduler::SetVisible(bool visible) { 132 void Scheduler::SetVisible(bool visible) {
133 state_machine_.SetVisible(visible); 133 state_machine_.SetVisible(visible);
134 UpdateCompositorTimingHistoryRecordingEnabled();
134 ProcessScheduledActions(); 135 ProcessScheduledActions();
135 } 136 }
136 137
137 void Scheduler::SetCanDraw(bool can_draw) { 138 void Scheduler::SetCanDraw(bool can_draw) {
138 state_machine_.SetCanDraw(can_draw); 139 state_machine_.SetCanDraw(can_draw);
139 ProcessScheduledActions(); 140 ProcessScheduledActions();
140 } 141 }
141 142
142 void Scheduler::NotifyReadyToActivate() { 143 void Scheduler::NotifyReadyToActivate() {
144 compositor_timing_history_->ReadyToActivate();
143 state_machine_.NotifyReadyToActivate(); 145 state_machine_.NotifyReadyToActivate();
144 ProcessScheduledActions(); 146 ProcessScheduledActions();
145 } 147 }
146 148
147 void Scheduler::NotifyReadyToDraw() { 149 void Scheduler::NotifyReadyToDraw() {
148 // Future work might still needed for crbug.com/352894. 150 // Future work might still needed for crbug.com/352894.
149 state_machine_.NotifyReadyToDraw(); 151 state_machine_.NotifyReadyToDraw();
150 ProcessScheduledActions(); 152 ProcessScheduledActions();
151 } 153 }
152 154
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 state_machine_.SetImplLatencyTakesPriority(impl_latency_takes_priority); 212 state_machine_.SetImplLatencyTakesPriority(impl_latency_takes_priority);
211 ProcessScheduledActions(); 213 ProcessScheduledActions();
212 } 214 }
213 215
214 void Scheduler::NotifyReadyToCommit() { 216 void Scheduler::NotifyReadyToCommit() {
215 TRACE_EVENT0("cc", "Scheduler::NotifyReadyToCommit"); 217 TRACE_EVENT0("cc", "Scheduler::NotifyReadyToCommit");
216 state_machine_.NotifyReadyToCommit(); 218 state_machine_.NotifyReadyToCommit();
217 ProcessScheduledActions(); 219 ProcessScheduledActions();
218 } 220 }
219 221
222 void Scheduler::DidCommit() {
223 compositor_timing_history_->DidCommit();
224 }
225
220 void Scheduler::BeginMainFrameAborted(CommitEarlyOutReason reason) { 226 void Scheduler::BeginMainFrameAborted(CommitEarlyOutReason reason) {
221 TRACE_EVENT1("cc", "Scheduler::BeginMainFrameAborted", "reason", 227 TRACE_EVENT1("cc", "Scheduler::BeginMainFrameAborted", "reason",
222 CommitEarlyOutReasonToString(reason)); 228 CommitEarlyOutReasonToString(reason));
229 compositor_timing_history_->BeginMainFrameAborted();
223 state_machine_.BeginMainFrameAborted(reason); 230 state_machine_.BeginMainFrameAborted(reason);
224 ProcessScheduledActions(); 231 ProcessScheduledActions();
225 } 232 }
226 233
234 void Scheduler::WillPrepareTiles() {
235 compositor_timing_history_->WillPrepareTiles();
236 }
237
227 void Scheduler::DidPrepareTiles() { 238 void Scheduler::DidPrepareTiles() {
239 compositor_timing_history_->DidPrepareTiles();
228 state_machine_.DidPrepareTiles(); 240 state_machine_.DidPrepareTiles();
229 } 241 }
230 242
231 void Scheduler::DidLoseOutputSurface() { 243 void Scheduler::DidLoseOutputSurface() {
232 TRACE_EVENT0("cc", "Scheduler::DidLoseOutputSurface"); 244 TRACE_EVENT0("cc", "Scheduler::DidLoseOutputSurface");
233 begin_retro_frame_args_.clear(); 245 begin_retro_frame_args_.clear();
234 begin_retro_frame_task_.Cancel(); 246 begin_retro_frame_task_.Cancel();
235 state_machine_.DidLoseOutputSurface(); 247 state_machine_.DidLoseOutputSurface();
248 UpdateCompositorTimingHistoryRecordingEnabled();
236 ProcessScheduledActions(); 249 ProcessScheduledActions();
237 } 250 }
238 251
239 void Scheduler::DidCreateAndInitializeOutputSurface() { 252 void Scheduler::DidCreateAndInitializeOutputSurface() {
240 TRACE_EVENT0("cc", "Scheduler::DidCreateAndInitializeOutputSurface"); 253 TRACE_EVENT0("cc", "Scheduler::DidCreateAndInitializeOutputSurface");
241 DCHECK(!frame_source_->NeedsBeginFrames()); 254 DCHECK(!frame_source_->NeedsBeginFrames());
242 DCHECK(begin_impl_frame_deadline_task_.IsCancelled()); 255 DCHECK(begin_impl_frame_deadline_task_.IsCancelled());
243 state_machine_.DidCreateAndInitializeOutputSurface(); 256 state_machine_.DidCreateAndInitializeOutputSurface();
257 UpdateCompositorTimingHistoryRecordingEnabled();
244 ProcessScheduledActions(); 258 ProcessScheduledActions();
245 } 259 }
246 260
247 void Scheduler::NotifyBeginMainFrameStarted() { 261 void Scheduler::NotifyBeginMainFrameStarted() {
248 TRACE_EVENT0("cc", "Scheduler::NotifyBeginMainFrameStarted"); 262 TRACE_EVENT0("cc", "Scheduler::NotifyBeginMainFrameStarted");
249 state_machine_.NotifyBeginMainFrameStarted(); 263 state_machine_.NotifyBeginMainFrameStarted();
250 } 264 }
251 265
252 base::TimeTicks Scheduler::LastBeginImplFrameTime() { 266 base::TimeTicks Scheduler::LastBeginImplFrameTime() {
253 return begin_impl_frame_tracker_.Current().frame_time; 267 return begin_impl_frame_tracker_.Current().frame_time;
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after
572 // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is fixed. 586 // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is fixed.
573 tracked_objects::ScopedTracker tracking_profile1( 587 tracked_objects::ScopedTracker tracking_profile1(
574 FROM_HERE_WITH_EXPLICIT_FUNCTION( 588 FROM_HERE_WITH_EXPLICIT_FUNCTION(
575 "461509 Scheduler::OnBeginImplFrameDeadline1")); 589 "461509 Scheduler::OnBeginImplFrameDeadline1"));
576 state_machine_.OnBeginImplFrameDeadline(); 590 state_machine_.OnBeginImplFrameDeadline();
577 ProcessScheduledActions(); 591 ProcessScheduledActions();
578 FinishImplFrame(); 592 FinishImplFrame();
579 } 593 }
580 594
581 void Scheduler::DrawAndSwapIfPossible() { 595 void Scheduler::DrawAndSwapIfPossible() {
582 compositor_timing_history_->DidStartDrawing(); 596 compositor_timing_history_->WillDraw();
583 DrawResult result = client_->ScheduledActionDrawAndSwapIfPossible(); 597 DrawResult result = client_->ScheduledActionDrawAndSwapIfPossible();
584 state_machine_.DidDrawIfPossibleCompleted(result); 598 state_machine_.DidDrawIfPossibleCompleted(result);
585 compositor_timing_history_->DidFinishDrawing(); 599 compositor_timing_history_->DidDraw();
586 } 600 }
587 601
588 void Scheduler::DrawAndSwapForced() { 602 void Scheduler::DrawAndSwapForced() {
589 compositor_timing_history_->DidStartDrawing(); 603 compositor_timing_history_->WillDraw();
590 client_->ScheduledActionDrawAndSwapForced(); 604 client_->ScheduledActionDrawAndSwapForced();
591 compositor_timing_history_->DidFinishDrawing(); 605 compositor_timing_history_->DidDraw();
592 } 606 }
593 607
594 void Scheduler::SetDeferCommits(bool defer_commits) { 608 void Scheduler::SetDeferCommits(bool defer_commits) {
595 TRACE_EVENT1("cc", "Scheduler::SetDeferCommits", 609 TRACE_EVENT1("cc", "Scheduler::SetDeferCommits",
596 "defer_commits", 610 "defer_commits",
597 defer_commits); 611 defer_commits);
598 state_machine_.SetDeferCommits(defer_commits); 612 state_machine_.SetDeferCommits(defer_commits);
599 ProcessScheduledActions(); 613 ProcessScheduledActions();
600 } 614 }
601 615
(...skipping 28 matching lines...) Expand all
630 compositor_timing_history_->WillBeginMainFrame(); 644 compositor_timing_history_->WillBeginMainFrame();
631 client_->ScheduledActionSendBeginMainFrame(); 645 client_->ScheduledActionSendBeginMainFrame();
632 break; 646 break;
633 case SchedulerStateMachine::ACTION_COMMIT: { 647 case SchedulerStateMachine::ACTION_COMMIT: {
634 // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is 648 // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is
635 // fixed. 649 // fixed.
636 tracked_objects::ScopedTracker tracking_profile4( 650 tracked_objects::ScopedTracker tracking_profile4(
637 FROM_HERE_WITH_EXPLICIT_FUNCTION( 651 FROM_HERE_WITH_EXPLICIT_FUNCTION(
638 "461509 Scheduler::ProcessScheduledActions4")); 652 "461509 Scheduler::ProcessScheduledActions4"));
639 client_->ScheduledActionCommit(); 653 client_->ScheduledActionCommit();
640 compositor_timing_history_->DidCommit();
641 break; 654 break;
642 } 655 }
643 case SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE: 656 case SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE:
657 compositor_timing_history_->WillActivate();
644 client_->ScheduledActionActivateSyncTree(); 658 client_->ScheduledActionActivateSyncTree();
645 compositor_timing_history_->DidActivateSyncTree(); 659 compositor_timing_history_->DidActivate();
646 break; 660 break;
647 case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE: { 661 case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE: {
648 // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is 662 // TODO(robliao): Remove ScopedTracker below once crbug.com/461509 is
649 // fixed. 663 // fixed.
650 tracked_objects::ScopedTracker tracking_profile6( 664 tracked_objects::ScopedTracker tracking_profile6(
651 FROM_HERE_WITH_EXPLICIT_FUNCTION( 665 FROM_HERE_WITH_EXPLICIT_FUNCTION(
652 "461509 Scheduler::ProcessScheduledActions6")); 666 "461509 Scheduler::ProcessScheduledActions6"));
653 DrawAndSwapIfPossible(); 667 DrawAndSwapIfPossible();
654 break; 668 break;
655 } 669 }
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
717 state->BeginDictionary("begin_impl_frame_args"); 731 state->BeginDictionary("begin_impl_frame_args");
718 begin_impl_frame_tracker_.AsValueInto(Now(), state); 732 begin_impl_frame_tracker_.AsValueInto(Now(), state);
719 state->EndDictionary(); 733 state->EndDictionary();
720 state->EndDictionary(); 734 state->EndDictionary();
721 735
722 state->BeginDictionary("compositor_timing_history"); 736 state->BeginDictionary("compositor_timing_history");
723 compositor_timing_history_->AsValueInto(state); 737 compositor_timing_history_->AsValueInto(state);
724 state->EndDictionary(); 738 state->EndDictionary();
725 } 739 }
726 740
741 void Scheduler::UpdateCompositorTimingHistoryRecordingEnabled() {
742 compositor_timing_history_->SetRecordingEnabled(
743 state_machine_.HasInitializedOutputSurface() && state_machine_.visible());
744 }
745
727 bool Scheduler::CanCommitAndActivateBeforeDeadline() const { 746 bool Scheduler::CanCommitAndActivateBeforeDeadline() const {
728 BeginFrameArgs args = 747 BeginFrameArgs args =
729 begin_impl_frame_tracker_.DangerousMethodCurrentOrLast(); 748 begin_impl_frame_tracker_.DangerousMethodCurrentOrLast();
730 749
731 // Check if the main thread computation and commit can be finished before the 750 // Check if the main thread computation and commit can be finished before the
732 // impl thread's deadline. 751 // impl thread's deadline.
733 base::TimeTicks estimated_draw_time = 752 base::TimeTicks estimated_draw_time =
734 args.frame_time + 753 args.frame_time +
735 compositor_timing_history_->BeginMainFrameToCommitDurationEstimate() + 754 compositor_timing_history_->BeginMainFrameToCommitDurationEstimate() +
736 compositor_timing_history_->CommitToActivateDurationEstimate(); 755 compositor_timing_history_
756 ->PrepareTilesBeginToReadyToActivateDurationEstimate() +
757 compositor_timing_history_->ActivateDurationEstimate();
737 758
738 TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler"), 759 TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler"),
739 "CanCommitAndActivateBeforeDeadline", 760 "CanCommitAndActivateBeforeDeadline",
740 "time_left_after_drawing_ms", 761 "time_left_after_drawing_ms",
741 (args.deadline - estimated_draw_time).InMillisecondsF(), "state", 762 (args.deadline - estimated_draw_time).InMillisecondsF(), "state",
742 AsValue()); 763 AsValue());
743 764
744 return estimated_draw_time < args.deadline; 765 return estimated_draw_time < args.deadline;
745 } 766 }
746 767
747 bool Scheduler::IsBeginMainFrameSentOrStarted() const { 768 bool Scheduler::IsBeginMainFrameSentOrStarted() const {
748 return (state_machine_.commit_state() == 769 return (state_machine_.commit_state() ==
749 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT || 770 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT ||
750 state_machine_.commit_state() == 771 state_machine_.commit_state() ==
751 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED); 772 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED);
752 } 773 }
753 774
754 } // namespace cc 775 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698