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

Side by Side Diff: cc/trees/thread_proxy.cc

Issue 1432463002: cc: Track BeginMainFrame more precisely in CompositorTimingHistory. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase; fix typo Created 5 years, 1 month 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
« no previous file with comments | « cc/trees/thread_proxy.h ('k') | cc/trees/threaded_channel.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/trees/thread_proxy.h" 5 #include "cc/trees/thread_proxy.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 9
10 #include "base/auto_reset.h" 10 #include "base/auto_reset.h"
(...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after
588 588
589 void ThreadProxy::SendBeginMainFrameNotExpectedSoon() { 589 void ThreadProxy::SendBeginMainFrameNotExpectedSoon() {
590 impl().channel_impl->BeginMainFrameNotExpectedSoon(); 590 impl().channel_impl->BeginMainFrameNotExpectedSoon();
591 } 591 }
592 592
593 void ThreadProxy::BeginMainFrame( 593 void ThreadProxy::BeginMainFrame(
594 scoped_ptr<BeginMainFrameAndCommitState> begin_main_frame_state) { 594 scoped_ptr<BeginMainFrameAndCommitState> begin_main_frame_state) {
595 benchmark_instrumentation::ScopedBeginFrameTask begin_frame_task( 595 benchmark_instrumentation::ScopedBeginFrameTask begin_frame_task(
596 benchmark_instrumentation::kDoBeginFrame, 596 benchmark_instrumentation::kDoBeginFrame,
597 begin_main_frame_state->begin_frame_id); 597 begin_main_frame_state->begin_frame_id);
598
599 base::TimeTicks begin_main_frame_start_time = base::TimeTicks::Now();
600
598 TRACE_EVENT_SYNTHETIC_DELAY_BEGIN("cc.BeginMainFrame"); 601 TRACE_EVENT_SYNTHETIC_DELAY_BEGIN("cc.BeginMainFrame");
599 DCHECK(IsMainThread()); 602 DCHECK(IsMainThread());
600 DCHECK_EQ(NO_PIPELINE_STAGE, main().current_pipeline_stage); 603 DCHECK_EQ(NO_PIPELINE_STAGE, main().current_pipeline_stage);
601 604
602 if (main().defer_commits) { 605 if (main().defer_commits) {
603 TRACE_EVENT_INSTANT0("cc", "EarlyOut_DeferCommit", 606 TRACE_EVENT_INSTANT0("cc", "EarlyOut_DeferCommit",
604 TRACE_EVENT_SCOPE_THREAD); 607 TRACE_EVENT_SCOPE_THREAD);
605 main().channel_main->BeginMainFrameAbortedOnImpl( 608 main().channel_main->BeginMainFrameAbortedOnImpl(
606 CommitEarlyOutReason::ABORTED_DEFERRED_COMMIT); 609 CommitEarlyOutReason::ABORTED_DEFERRED_COMMIT,
610 begin_main_frame_start_time);
607 return; 611 return;
608 } 612 }
609 613
610 // If the commit finishes, LayerTreeHost will transfer its swap promises to 614 // If the commit finishes, LayerTreeHost will transfer its swap promises to
611 // LayerTreeImpl. The destructor of ScopedSwapPromiseChecker aborts the 615 // LayerTreeImpl. The destructor of ScopedSwapPromiseChecker aborts the
612 // remaining swap promises. 616 // remaining swap promises.
613 ScopedAbortRemainingSwapPromises swap_promise_checker(main().layer_tree_host); 617 ScopedAbortRemainingSwapPromises swap_promise_checker(main().layer_tree_host);
614 618
615 main().final_pipeline_stage = main().max_requested_pipeline_stage; 619 main().final_pipeline_stage = main().max_requested_pipeline_stage;
616 main().max_requested_pipeline_stage = NO_PIPELINE_STAGE; 620 main().max_requested_pipeline_stage = NO_PIPELINE_STAGE;
617 621
618 if (!main().layer_tree_host->visible()) { 622 if (!main().layer_tree_host->visible()) {
619 TRACE_EVENT_INSTANT0("cc", "EarlyOut_NotVisible", TRACE_EVENT_SCOPE_THREAD); 623 TRACE_EVENT_INSTANT0("cc", "EarlyOut_NotVisible", TRACE_EVENT_SCOPE_THREAD);
620 main().channel_main->BeginMainFrameAbortedOnImpl( 624 main().channel_main->BeginMainFrameAbortedOnImpl(
621 CommitEarlyOutReason::ABORTED_NOT_VISIBLE); 625 CommitEarlyOutReason::ABORTED_NOT_VISIBLE, begin_main_frame_start_time);
622 return; 626 return;
623 } 627 }
624 628
625 if (main().layer_tree_host->output_surface_lost()) { 629 if (main().layer_tree_host->output_surface_lost()) {
626 TRACE_EVENT_INSTANT0( 630 TRACE_EVENT_INSTANT0(
627 "cc", "EarlyOut_OutputSurfaceLost", TRACE_EVENT_SCOPE_THREAD); 631 "cc", "EarlyOut_OutputSurfaceLost", TRACE_EVENT_SCOPE_THREAD);
628 main().channel_main->BeginMainFrameAbortedOnImpl( 632 main().channel_main->BeginMainFrameAbortedOnImpl(
629 CommitEarlyOutReason::ABORTED_OUTPUT_SURFACE_LOST); 633 CommitEarlyOutReason::ABORTED_OUTPUT_SURFACE_LOST,
634 begin_main_frame_start_time);
630 return; 635 return;
631 } 636 }
632 637
633 main().current_pipeline_stage = ANIMATE_PIPELINE_STAGE; 638 main().current_pipeline_stage = ANIMATE_PIPELINE_STAGE;
634 639
635 main().layer_tree_host->ApplyScrollAndScale( 640 main().layer_tree_host->ApplyScrollAndScale(
636 begin_main_frame_state->scroll_info.get()); 641 begin_main_frame_state->scroll_info.get());
637 642
638 main().layer_tree_host->WillBeginMainFrame(); 643 main().layer_tree_host->WillBeginMainFrame();
639 644
(...skipping 20 matching lines...) Expand all
660 bool updated = should_update_layers && main().layer_tree_host->UpdateLayers(); 665 bool updated = should_update_layers && main().layer_tree_host->UpdateLayers();
661 666
662 main().layer_tree_host->WillCommit(); 667 main().layer_tree_host->WillCommit();
663 devtools_instrumentation::ScopedCommitTrace commit_task( 668 devtools_instrumentation::ScopedCommitTrace commit_task(
664 main().layer_tree_host->id()); 669 main().layer_tree_host->id());
665 670
666 main().current_pipeline_stage = COMMIT_PIPELINE_STAGE; 671 main().current_pipeline_stage = COMMIT_PIPELINE_STAGE;
667 if (!updated && can_cancel_this_commit) { 672 if (!updated && can_cancel_this_commit) {
668 TRACE_EVENT_INSTANT0("cc", "EarlyOut_NoUpdates", TRACE_EVENT_SCOPE_THREAD); 673 TRACE_EVENT_INSTANT0("cc", "EarlyOut_NoUpdates", TRACE_EVENT_SCOPE_THREAD);
669 main().channel_main->BeginMainFrameAbortedOnImpl( 674 main().channel_main->BeginMainFrameAbortedOnImpl(
670 CommitEarlyOutReason::FINISHED_NO_UPDATES); 675 CommitEarlyOutReason::FINISHED_NO_UPDATES, begin_main_frame_start_time);
671 676
672 // Although the commit is internally aborted, this is because it has been 677 // Although the commit is internally aborted, this is because it has been
673 // detected to be a no-op. From the perspective of an embedder, this commit 678 // detected to be a no-op. From the perspective of an embedder, this commit
674 // went through, and input should no longer be throttled, etc. 679 // went through, and input should no longer be throttled, etc.
675 main().current_pipeline_stage = NO_PIPELINE_STAGE; 680 main().current_pipeline_stage = NO_PIPELINE_STAGE;
676 main().layer_tree_host->CommitComplete(); 681 main().layer_tree_host->CommitComplete();
677 main().layer_tree_host->DidBeginMainFrame(); 682 main().layer_tree_host->DidBeginMainFrame();
678 main().layer_tree_host->BreakSwapPromises(SwapPromise::COMMIT_NO_UPDATE); 683 main().layer_tree_host->BreakSwapPromises(SwapPromise::COMMIT_NO_UPDATE);
679 return; 684 return;
680 } 685 }
681 686
682 // Notify the impl thread that the main thread is ready to commit. This will 687 // Notify the impl thread that the main thread is ready to commit. This will
683 // begin the commit process, which is blocking from the main thread's 688 // begin the commit process, which is blocking from the main thread's
684 // point of view, but asynchronously performed on the impl thread, 689 // point of view, but asynchronously performed on the impl thread,
685 // coordinated by the Scheduler. 690 // coordinated by the Scheduler.
686 { 691 {
687 TRACE_EVENT0("cc", "ThreadProxy::BeginMainFrame::commit"); 692 TRACE_EVENT0("cc", "ThreadProxy::BeginMainFrame::commit");
688 693
689 DebugScopedSetMainThreadBlocked main_thread_blocked(this); 694 DebugScopedSetMainThreadBlocked main_thread_blocked(this);
690 695
691 // This CapturePostTasks should be destroyed before CommitComplete() is 696 // This CapturePostTasks should be destroyed before CommitComplete() is
692 // called since that goes out to the embedder, and we want the embedder 697 // called since that goes out to the embedder, and we want the embedder
693 // to receive its callbacks before that. 698 // to receive its callbacks before that.
694 BlockingTaskRunner::CapturePostTasks blocked( 699 BlockingTaskRunner::CapturePostTasks blocked(
695 blocking_main_thread_task_runner()); 700 blocking_main_thread_task_runner());
696 701
697 CompletionEvent completion; 702 CompletionEvent completion;
698 main().channel_main->StartCommitOnImpl(&completion, main().layer_tree_host, 703 main().channel_main->StartCommitOnImpl(&completion, main().layer_tree_host,
704 begin_main_frame_start_time,
699 main().commit_waits_for_activation); 705 main().commit_waits_for_activation);
700 completion.Wait(); 706 completion.Wait();
701 main().commit_waits_for_activation = false; 707 main().commit_waits_for_activation = false;
702 } 708 }
703 709
704 main().current_pipeline_stage = NO_PIPELINE_STAGE; 710 main().current_pipeline_stage = NO_PIPELINE_STAGE;
705 main().layer_tree_host->CommitComplete(); 711 main().layer_tree_host->CommitComplete();
706 main().layer_tree_host->DidBeginMainFrame(); 712 main().layer_tree_host->DidBeginMainFrame();
707 } 713 }
708 714
709 void ThreadProxy::BeginMainFrameNotExpectedSoon() { 715 void ThreadProxy::BeginMainFrameNotExpectedSoon() {
710 TRACE_EVENT0("cc", "ThreadProxy::BeginMainFrameNotExpectedSoon"); 716 TRACE_EVENT0("cc", "ThreadProxy::BeginMainFrameNotExpectedSoon");
711 DCHECK(IsMainThread()); 717 DCHECK(IsMainThread());
712 main().layer_tree_host->BeginMainFrameNotExpectedSoon(); 718 main().layer_tree_host->BeginMainFrameNotExpectedSoon();
713 } 719 }
714 720
715 void ThreadProxy::StartCommitOnImpl(CompletionEvent* completion, 721 void ThreadProxy::StartCommitOnImpl(CompletionEvent* completion,
716 LayerTreeHost* layer_tree_host, 722 LayerTreeHost* layer_tree_host,
723 base::TimeTicks main_thread_start_time,
717 bool hold_commit_for_activation) { 724 bool hold_commit_for_activation) {
718 TRACE_EVENT0("cc", "ThreadProxy::StartCommitOnImplThread"); 725 TRACE_EVENT0("cc", "ThreadProxy::StartCommitOnImplThread");
719 DCHECK(!impl().commit_completion_event); 726 DCHECK(!impl().commit_completion_event);
720 DCHECK(IsImplThread() && IsMainThreadBlocked()); 727 DCHECK(IsImplThread() && IsMainThreadBlocked());
721 DCHECK(impl().scheduler); 728 DCHECK(impl().scheduler);
722 DCHECK(impl().scheduler->CommitPending()); 729 DCHECK(impl().scheduler->CommitPending());
723 730
724 if (hold_commit_for_activation) { 731 if (hold_commit_for_activation) {
725 // This commit may be aborted. Store the value for 732 // This commit may be aborted. Store the value for
726 // hold_commit_for_activation so that whenever the next commit is started, 733 // hold_commit_for_activation so that whenever the next commit is started,
727 // the main thread will be unblocked only after pending tree activation. 734 // the main thread will be unblocked only after pending tree activation.
728 impl().next_commit_waits_for_activation = hold_commit_for_activation; 735 impl().next_commit_waits_for_activation = hold_commit_for_activation;
729 } 736 }
730 737
731 if (!impl().layer_tree_host_impl) { 738 if (!impl().layer_tree_host_impl) {
732 TRACE_EVENT_INSTANT0( 739 TRACE_EVENT_INSTANT0(
733 "cc", "EarlyOut_NoLayerTree", TRACE_EVENT_SCOPE_THREAD); 740 "cc", "EarlyOut_NoLayerTree", TRACE_EVENT_SCOPE_THREAD);
734 completion->Signal(); 741 completion->Signal();
735 return; 742 return;
736 } 743 }
737 744
738 // Ideally, we should inform to impl thread when BeginMainFrame is started. 745 // Ideally, we should inform to impl thread when BeginMainFrame is started.
739 // But, we can avoid a PostTask in here. 746 // But, we can avoid a PostTask in here.
740 impl().scheduler->NotifyBeginMainFrameStarted(); 747 impl().scheduler->NotifyBeginMainFrameStarted(main_thread_start_time);
741 impl().commit_completion_event = completion; 748 impl().commit_completion_event = completion;
742 DCHECK(!blocked_main_commit().layer_tree_host); 749 DCHECK(!blocked_main_commit().layer_tree_host);
743 blocked_main_commit().layer_tree_host = layer_tree_host; 750 blocked_main_commit().layer_tree_host = layer_tree_host;
744 impl().scheduler->NotifyReadyToCommit(); 751 impl().scheduler->NotifyReadyToCommit();
745 } 752 }
746 753
747 void ThreadProxy::BeginMainFrameAbortedOnImpl(CommitEarlyOutReason reason) { 754 void ThreadProxy::BeginMainFrameAbortedOnImpl(
755 CommitEarlyOutReason reason,
756 base::TimeTicks main_thread_start_time) {
748 TRACE_EVENT1("cc", "ThreadProxy::BeginMainFrameAbortedOnImplThread", "reason", 757 TRACE_EVENT1("cc", "ThreadProxy::BeginMainFrameAbortedOnImplThread", "reason",
749 CommitEarlyOutReasonToString(reason)); 758 CommitEarlyOutReasonToString(reason));
750 DCHECK(IsImplThread()); 759 DCHECK(IsImplThread());
751 DCHECK(impl().scheduler); 760 DCHECK(impl().scheduler);
752 DCHECK(impl().scheduler->CommitPending()); 761 DCHECK(impl().scheduler->CommitPending());
753 DCHECK(!impl().layer_tree_host_impl->pending_tree()); 762 DCHECK(!impl().layer_tree_host_impl->pending_tree());
754 763
755 if (CommitEarlyOutHandledCommit(reason)) { 764 if (CommitEarlyOutHandledCommit(reason)) {
756 SetInputThrottledUntilCommitOnImpl(false); 765 SetInputThrottledUntilCommitOnImpl(false);
757 impl().last_processed_begin_main_frame_args = 766 impl().last_processed_begin_main_frame_args =
758 impl().last_begin_main_frame_args; 767 impl().last_begin_main_frame_args;
759 } 768 }
760 impl().layer_tree_host_impl->BeginMainFrameAborted(reason); 769 impl().layer_tree_host_impl->BeginMainFrameAborted(reason);
770 impl().scheduler->NotifyBeginMainFrameStarted(main_thread_start_time);
761 impl().scheduler->BeginMainFrameAborted(reason); 771 impl().scheduler->BeginMainFrameAborted(reason);
762 } 772 }
763 773
764 void ThreadProxy::ScheduledActionAnimate() { 774 void ThreadProxy::ScheduledActionAnimate() {
765 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionAnimate"); 775 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionAnimate");
766 DCHECK(IsImplThread()); 776 DCHECK(IsImplThread());
767 777
768 impl().layer_tree_host_impl->Animate(); 778 impl().layer_tree_host_impl->Animate();
769 } 779 }
770 780
(...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after
1177 1187
1178 base::WeakPtr<ProxyMain> ThreadProxy::GetMainWeakPtr() { 1188 base::WeakPtr<ProxyMain> ThreadProxy::GetMainWeakPtr() {
1179 return main_thread_weak_ptr_; 1189 return main_thread_weak_ptr_;
1180 } 1190 }
1181 1191
1182 base::WeakPtr<ProxyImpl> ThreadProxy::GetImplWeakPtr() { 1192 base::WeakPtr<ProxyImpl> ThreadProxy::GetImplWeakPtr() {
1183 return impl_thread_weak_ptr_; 1193 return impl_thread_weak_ptr_;
1184 } 1194 }
1185 1195
1186 } // namespace cc 1196 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/thread_proxy.h ('k') | cc/trees/threaded_channel.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698