OLD | NEW |
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 605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
616 | 616 |
617 void ThreadProxy::SendBeginMainFrameNotExpectedSoon() { | 617 void ThreadProxy::SendBeginMainFrameNotExpectedSoon() { |
618 impl().channel_impl->BeginMainFrameNotExpectedSoon(); | 618 impl().channel_impl->BeginMainFrameNotExpectedSoon(); |
619 } | 619 } |
620 | 620 |
621 void ThreadProxy::BeginMainFrame( | 621 void ThreadProxy::BeginMainFrame( |
622 scoped_ptr<BeginMainFrameAndCommitState> begin_main_frame_state) { | 622 scoped_ptr<BeginMainFrameAndCommitState> begin_main_frame_state) { |
623 benchmark_instrumentation::ScopedBeginFrameTask begin_frame_task( | 623 benchmark_instrumentation::ScopedBeginFrameTask begin_frame_task( |
624 benchmark_instrumentation::kDoBeginFrame, | 624 benchmark_instrumentation::kDoBeginFrame, |
625 begin_main_frame_state->begin_frame_id); | 625 begin_main_frame_state->begin_frame_id); |
| 626 |
| 627 base::TimeTicks begin_main_frame_start_time = base::TimeTicks::Now(); |
| 628 |
626 TRACE_EVENT_SYNTHETIC_DELAY_BEGIN("cc.BeginMainFrame"); | 629 TRACE_EVENT_SYNTHETIC_DELAY_BEGIN("cc.BeginMainFrame"); |
627 DCHECK(IsMainThread()); | 630 DCHECK(IsMainThread()); |
628 DCHECK_EQ(NO_PIPELINE_STAGE, main().current_pipeline_stage); | 631 DCHECK_EQ(NO_PIPELINE_STAGE, main().current_pipeline_stage); |
629 | 632 |
630 if (main().defer_commits) { | 633 if (main().defer_commits) { |
631 TRACE_EVENT_INSTANT0("cc", "EarlyOut_DeferCommit", | 634 TRACE_EVENT_INSTANT0("cc", "EarlyOut_DeferCommit", |
632 TRACE_EVENT_SCOPE_THREAD); | 635 TRACE_EVENT_SCOPE_THREAD); |
633 main().channel_main->BeginMainFrameAbortedOnImpl( | 636 main().channel_main->BeginMainFrameAbortedOnImpl( |
634 CommitEarlyOutReason::ABORTED_DEFERRED_COMMIT); | 637 CommitEarlyOutReason::ABORTED_DEFERRED_COMMIT, |
| 638 begin_main_frame_start_time); |
635 return; | 639 return; |
636 } | 640 } |
637 | 641 |
638 // If the commit finishes, LayerTreeHost will transfer its swap promises to | 642 // If the commit finishes, LayerTreeHost will transfer its swap promises to |
639 // LayerTreeImpl. The destructor of ScopedSwapPromiseChecker aborts the | 643 // LayerTreeImpl. The destructor of ScopedSwapPromiseChecker aborts the |
640 // remaining swap promises. | 644 // remaining swap promises. |
641 ScopedAbortRemainingSwapPromises swap_promise_checker(layer_tree_host()); | 645 ScopedAbortRemainingSwapPromises swap_promise_checker(layer_tree_host()); |
642 | 646 |
643 main().final_pipeline_stage = main().max_requested_pipeline_stage; | 647 main().final_pipeline_stage = main().max_requested_pipeline_stage; |
644 main().max_requested_pipeline_stage = NO_PIPELINE_STAGE; | 648 main().max_requested_pipeline_stage = NO_PIPELINE_STAGE; |
645 | 649 |
646 if (!layer_tree_host()->visible()) { | 650 if (!layer_tree_host()->visible()) { |
647 TRACE_EVENT_INSTANT0("cc", "EarlyOut_NotVisible", TRACE_EVENT_SCOPE_THREAD); | 651 TRACE_EVENT_INSTANT0("cc", "EarlyOut_NotVisible", TRACE_EVENT_SCOPE_THREAD); |
648 main().channel_main->BeginMainFrameAbortedOnImpl( | 652 main().channel_main->BeginMainFrameAbortedOnImpl( |
649 CommitEarlyOutReason::ABORTED_NOT_VISIBLE); | 653 CommitEarlyOutReason::ABORTED_NOT_VISIBLE, begin_main_frame_start_time); |
650 return; | 654 return; |
651 } | 655 } |
652 | 656 |
653 if (layer_tree_host()->output_surface_lost()) { | 657 if (layer_tree_host()->output_surface_lost()) { |
654 TRACE_EVENT_INSTANT0( | 658 TRACE_EVENT_INSTANT0( |
655 "cc", "EarlyOut_OutputSurfaceLost", TRACE_EVENT_SCOPE_THREAD); | 659 "cc", "EarlyOut_OutputSurfaceLost", TRACE_EVENT_SCOPE_THREAD); |
656 main().channel_main->BeginMainFrameAbortedOnImpl( | 660 main().channel_main->BeginMainFrameAbortedOnImpl( |
657 CommitEarlyOutReason::ABORTED_OUTPUT_SURFACE_LOST); | 661 CommitEarlyOutReason::ABORTED_OUTPUT_SURFACE_LOST, |
| 662 begin_main_frame_start_time); |
658 return; | 663 return; |
659 } | 664 } |
660 | 665 |
661 main().current_pipeline_stage = ANIMATE_PIPELINE_STAGE; | 666 main().current_pipeline_stage = ANIMATE_PIPELINE_STAGE; |
662 | 667 |
663 layer_tree_host()->ApplyScrollAndScale( | 668 layer_tree_host()->ApplyScrollAndScale( |
664 begin_main_frame_state->scroll_info.get()); | 669 begin_main_frame_state->scroll_info.get()); |
665 | 670 |
666 layer_tree_host()->WillBeginMainFrame(); | 671 layer_tree_host()->WillBeginMainFrame(); |
667 | 672 |
(...skipping 19 matching lines...) Expand all Loading... |
687 bool updated = should_update_layers && layer_tree_host()->UpdateLayers(); | 692 bool updated = should_update_layers && layer_tree_host()->UpdateLayers(); |
688 | 693 |
689 layer_tree_host()->WillCommit(); | 694 layer_tree_host()->WillCommit(); |
690 devtools_instrumentation::ScopedCommitTrace commit_task( | 695 devtools_instrumentation::ScopedCommitTrace commit_task( |
691 layer_tree_host()->id()); | 696 layer_tree_host()->id()); |
692 | 697 |
693 main().current_pipeline_stage = COMMIT_PIPELINE_STAGE; | 698 main().current_pipeline_stage = COMMIT_PIPELINE_STAGE; |
694 if (!updated && can_cancel_this_commit) { | 699 if (!updated && can_cancel_this_commit) { |
695 TRACE_EVENT_INSTANT0("cc", "EarlyOut_NoUpdates", TRACE_EVENT_SCOPE_THREAD); | 700 TRACE_EVENT_INSTANT0("cc", "EarlyOut_NoUpdates", TRACE_EVENT_SCOPE_THREAD); |
696 main().channel_main->BeginMainFrameAbortedOnImpl( | 701 main().channel_main->BeginMainFrameAbortedOnImpl( |
697 CommitEarlyOutReason::FINISHED_NO_UPDATES); | 702 CommitEarlyOutReason::FINISHED_NO_UPDATES, begin_main_frame_start_time); |
698 | 703 |
699 // Although the commit is internally aborted, this is because it has been | 704 // Although the commit is internally aborted, this is because it has been |
700 // detected to be a no-op. From the perspective of an embedder, this commit | 705 // detected to be a no-op. From the perspective of an embedder, this commit |
701 // went through, and input should no longer be throttled, etc. | 706 // went through, and input should no longer be throttled, etc. |
702 main().current_pipeline_stage = NO_PIPELINE_STAGE; | 707 main().current_pipeline_stage = NO_PIPELINE_STAGE; |
703 layer_tree_host()->CommitComplete(); | 708 layer_tree_host()->CommitComplete(); |
704 layer_tree_host()->DidBeginMainFrame(); | 709 layer_tree_host()->DidBeginMainFrame(); |
705 layer_tree_host()->BreakSwapPromises(SwapPromise::COMMIT_NO_UPDATE); | 710 layer_tree_host()->BreakSwapPromises(SwapPromise::COMMIT_NO_UPDATE); |
706 return; | 711 return; |
707 } | 712 } |
708 | 713 |
709 // Notify the impl thread that the main thread is ready to commit. This will | 714 // Notify the impl thread that the main thread is ready to commit. This will |
710 // begin the commit process, which is blocking from the main thread's | 715 // begin the commit process, which is blocking from the main thread's |
711 // point of view, but asynchronously performed on the impl thread, | 716 // point of view, but asynchronously performed on the impl thread, |
712 // coordinated by the Scheduler. | 717 // coordinated by the Scheduler. |
713 { | 718 { |
714 TRACE_EVENT0("cc", "ThreadProxy::BeginMainFrame::commit"); | 719 TRACE_EVENT0("cc", "ThreadProxy::BeginMainFrame::commit"); |
715 | 720 |
716 DebugScopedSetMainThreadBlocked main_thread_blocked(this); | 721 DebugScopedSetMainThreadBlocked main_thread_blocked(this); |
717 | 722 |
718 // This CapturePostTasks should be destroyed before CommitComplete() is | 723 // This CapturePostTasks should be destroyed before CommitComplete() is |
719 // called since that goes out to the embedder, and we want the embedder | 724 // called since that goes out to the embedder, and we want the embedder |
720 // to receive its callbacks before that. | 725 // to receive its callbacks before that. |
721 BlockingTaskRunner::CapturePostTasks blocked( | 726 BlockingTaskRunner::CapturePostTasks blocked( |
722 blocking_main_thread_task_runner()); | 727 blocking_main_thread_task_runner()); |
723 | 728 |
724 CompletionEvent completion; | 729 CompletionEvent completion; |
725 main().channel_main->StartCommitOnImpl(&completion); | 730 main().channel_main->StartCommitOnImpl(&completion, |
| 731 begin_main_frame_start_time); |
726 completion.Wait(); | 732 completion.Wait(); |
727 } | 733 } |
728 | 734 |
729 main().current_pipeline_stage = NO_PIPELINE_STAGE; | 735 main().current_pipeline_stage = NO_PIPELINE_STAGE; |
730 layer_tree_host()->CommitComplete(); | 736 layer_tree_host()->CommitComplete(); |
731 layer_tree_host()->DidBeginMainFrame(); | 737 layer_tree_host()->DidBeginMainFrame(); |
732 } | 738 } |
733 | 739 |
734 void ThreadProxy::BeginMainFrameNotExpectedSoon() { | 740 void ThreadProxy::BeginMainFrameNotExpectedSoon() { |
735 TRACE_EVENT0("cc", "ThreadProxy::BeginMainFrameNotExpectedSoon"); | 741 TRACE_EVENT0("cc", "ThreadProxy::BeginMainFrameNotExpectedSoon"); |
736 DCHECK(IsMainThread()); | 742 DCHECK(IsMainThread()); |
737 layer_tree_host()->BeginMainFrameNotExpectedSoon(); | 743 layer_tree_host()->BeginMainFrameNotExpectedSoon(); |
738 } | 744 } |
739 | 745 |
740 void ThreadProxy::StartCommitOnImpl(CompletionEvent* completion) { | 746 void ThreadProxy::StartCommitOnImpl(CompletionEvent* completion, |
| 747 base::TimeTicks main_thread_start_time) { |
741 TRACE_EVENT0("cc", "ThreadProxy::StartCommitOnImplThread"); | 748 TRACE_EVENT0("cc", "ThreadProxy::StartCommitOnImplThread"); |
742 DCHECK(!impl().commit_completion_event); | 749 DCHECK(!impl().commit_completion_event); |
743 DCHECK(IsImplThread() && IsMainThreadBlocked()); | 750 DCHECK(IsImplThread() && IsMainThreadBlocked()); |
744 DCHECK(impl().scheduler); | 751 DCHECK(impl().scheduler); |
745 DCHECK(impl().scheduler->CommitPending()); | 752 DCHECK(impl().scheduler->CommitPending()); |
746 | 753 |
747 if (!impl().layer_tree_host_impl) { | 754 if (!impl().layer_tree_host_impl) { |
748 TRACE_EVENT_INSTANT0( | 755 TRACE_EVENT_INSTANT0( |
749 "cc", "EarlyOut_NoLayerTree", TRACE_EVENT_SCOPE_THREAD); | 756 "cc", "EarlyOut_NoLayerTree", TRACE_EVENT_SCOPE_THREAD); |
750 completion->Signal(); | 757 completion->Signal(); |
751 return; | 758 return; |
752 } | 759 } |
753 | 760 |
754 // Ideally, we should inform to impl thread when BeginMainFrame is started. | 761 // Ideally, we should inform to impl thread when BeginMainFrame is started. |
755 // But, we can avoid a PostTask in here. | 762 // But, we can avoid a PostTask in here. |
756 impl().scheduler->NotifyBeginMainFrameStarted(); | 763 impl().scheduler->NotifyBeginMainFrameStarted(main_thread_start_time); |
757 impl().commit_completion_event = completion; | 764 impl().commit_completion_event = completion; |
758 impl().scheduler->NotifyReadyToCommit(); | 765 impl().scheduler->NotifyReadyToCommit(); |
759 } | 766 } |
760 | 767 |
761 void ThreadProxy::BeginMainFrameAbortedOnImpl(CommitEarlyOutReason reason) { | 768 void ThreadProxy::BeginMainFrameAbortedOnImpl( |
| 769 CommitEarlyOutReason reason, |
| 770 base::TimeTicks main_thread_start_time) { |
762 TRACE_EVENT1("cc", "ThreadProxy::BeginMainFrameAbortedOnImplThread", "reason", | 771 TRACE_EVENT1("cc", "ThreadProxy::BeginMainFrameAbortedOnImplThread", "reason", |
763 CommitEarlyOutReasonToString(reason)); | 772 CommitEarlyOutReasonToString(reason)); |
764 DCHECK(IsImplThread()); | 773 DCHECK(IsImplThread()); |
765 DCHECK(impl().scheduler); | 774 DCHECK(impl().scheduler); |
766 DCHECK(impl().scheduler->CommitPending()); | 775 DCHECK(impl().scheduler->CommitPending()); |
767 DCHECK(!impl().layer_tree_host_impl->pending_tree()); | 776 DCHECK(!impl().layer_tree_host_impl->pending_tree()); |
768 | 777 |
769 if (CommitEarlyOutHandledCommit(reason)) { | 778 if (CommitEarlyOutHandledCommit(reason)) { |
770 SetInputThrottledUntilCommitOnImpl(false); | 779 SetInputThrottledUntilCommitOnImpl(false); |
771 impl().last_processed_begin_main_frame_args = | 780 impl().last_processed_begin_main_frame_args = |
772 impl().last_begin_main_frame_args; | 781 impl().last_begin_main_frame_args; |
773 } | 782 } |
774 impl().layer_tree_host_impl->BeginMainFrameAborted(reason); | 783 impl().layer_tree_host_impl->BeginMainFrameAborted(reason); |
| 784 impl().scheduler->NotifyBeginMainFrameStarted(main_thread_start_time); |
775 impl().scheduler->BeginMainFrameAborted(reason); | 785 impl().scheduler->BeginMainFrameAborted(reason); |
776 } | 786 } |
777 | 787 |
778 void ThreadProxy::ScheduledActionAnimate() { | 788 void ThreadProxy::ScheduledActionAnimate() { |
779 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionAnimate"); | 789 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionAnimate"); |
780 DCHECK(IsImplThread()); | 790 DCHECK(IsImplThread()); |
781 | 791 |
782 impl().layer_tree_host_impl->Animate(); | 792 impl().layer_tree_host_impl->Animate(); |
783 } | 793 } |
784 | 794 |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1188 | 1198 |
1189 base::WeakPtr<ProxyMain> ThreadProxy::GetMainWeakPtr() { | 1199 base::WeakPtr<ProxyMain> ThreadProxy::GetMainWeakPtr() { |
1190 return main_thread_weak_ptr_; | 1200 return main_thread_weak_ptr_; |
1191 } | 1201 } |
1192 | 1202 |
1193 base::WeakPtr<ProxyImpl> ThreadProxy::GetImplWeakPtr() { | 1203 base::WeakPtr<ProxyImpl> ThreadProxy::GetImplWeakPtr() { |
1194 return impl_thread_weak_ptr_; | 1204 return impl_thread_weak_ptr_; |
1195 } | 1205 } |
1196 | 1206 |
1197 } // namespace cc | 1207 } // namespace cc |
OLD | NEW |