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

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

Issue 16871016: cc: Use BeginFrameArgs (Closed) Base URL: http://git.chromium.org/chromium/src.git@bfargs2
Patch Set: else if typo Created 7 years, 5 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
« cc/trees/layer_tree_host_impl.cc ('K') | « cc/trees/thread_proxy.h ('k') | no next file » | 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 <string> 7 #include <string>
8 8
9 #include "base/auto_reset.h" 9 #include "base/auto_reset.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 commit_requested_(false), 69 commit_requested_(false),
70 commit_request_sent_to_impl_thread_(false), 70 commit_request_sent_to_impl_thread_(false),
71 created_offscreen_context_provider_(false), 71 created_offscreen_context_provider_(false),
72 layer_tree_host_(layer_tree_host), 72 layer_tree_host_(layer_tree_host),
73 started_(false), 73 started_(false),
74 textures_acquired_(true), 74 textures_acquired_(true),
75 in_composite_and_readback_(false), 75 in_composite_and_readback_(false),
76 manage_tiles_pending_(false), 76 manage_tiles_pending_(false),
77 weak_factory_on_impl_thread_(this), 77 weak_factory_on_impl_thread_(this),
78 weak_factory_(this), 78 weak_factory_(this),
79 frame_did_draw_(false),
79 begin_frame_sent_to_main_thread_completion_event_on_impl_thread_(NULL), 80 begin_frame_sent_to_main_thread_completion_event_on_impl_thread_(NULL),
80 readback_request_on_impl_thread_(NULL), 81 readback_request_on_impl_thread_(NULL),
81 commit_completion_event_on_impl_thread_(NULL), 82 commit_completion_event_on_impl_thread_(NULL),
82 completion_event_for_commit_held_on_tree_activation_(NULL), 83 completion_event_for_commit_held_on_tree_activation_(NULL),
83 texture_acquisition_completion_event_on_impl_thread_(NULL), 84 texture_acquisition_completion_event_on_impl_thread_(NULL),
84 next_frame_is_newly_committed_frame_on_impl_thread_(false), 85 next_frame_is_newly_committed_frame_on_impl_thread_(false),
85 throttle_frame_production_( 86 throttle_frame_production_(
86 layer_tree_host->settings().throttle_frame_production), 87 layer_tree_host->settings().throttle_frame_production),
87 begin_frame_scheduling_enabled_( 88 begin_frame_scheduling_enabled_(
88 layer_tree_host->settings().begin_frame_scheduling_enabled), 89 layer_tree_host->settings().begin_frame_scheduling_enabled),
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 Proxy::MainThreadTaskRunner()->PostTask( 364 Proxy::MainThreadTaskRunner()->PostTask(
364 FROM_HERE, 365 FROM_HERE,
365 base::Bind(&ThreadProxy::DidCompleteSwapBuffers, main_thread_weak_ptr_)); 366 base::Bind(&ThreadProxy::DidCompleteSwapBuffers, main_thread_weak_ptr_));
366 } 367 }
367 368
368 void ThreadProxy::SetNeedsBeginFrameOnImplThread(bool enable) { 369 void ThreadProxy::SetNeedsBeginFrameOnImplThread(bool enable) {
369 DCHECK(IsImplThread()); 370 DCHECK(IsImplThread());
370 TRACE_EVENT1("cc", "ThreadProxy::SetNeedsBeginFrameOnImplThread", 371 TRACE_EVENT1("cc", "ThreadProxy::SetNeedsBeginFrameOnImplThread",
371 "enable", enable); 372 "enable", enable);
372 layer_tree_host_impl_->SetNeedsBeginFrame(enable); 373 layer_tree_host_impl_->SetNeedsBeginFrame(enable);
374 layer_tree_host_impl_->UpdateBackgroundAnimateTicking(!enable);
373 } 375 }
374 376
375 void ThreadProxy::BeginFrameOnImplThread(const BeginFrameArgs& args) { 377 void ThreadProxy::BeginFrameOnImplThread(const BeginFrameArgs& args) {
376 DCHECK(IsImplThread()); 378 DCHECK(IsImplThread());
377 TRACE_EVENT0("cc", "ThreadProxy::BeginFrameOnImplThread"); 379 TRACE_EVENT0("cc", "ThreadProxy::BeginFrameOnImplThread");
380
381 base::TimeTicks monotonic_time =
382 layer_tree_host_impl_->CurrentFrameTimeTicks();
383 base::Time wall_clock_time = layer_tree_host_impl_->CurrentFrameTime();
384 layer_tree_host_impl_->Animate(monotonic_time, wall_clock_time);
385
386 // Reinitialize for the current frame.
387 frame_did_draw_ = false;
388
378 scheduler_on_impl_thread_->BeginFrame(args); 389 scheduler_on_impl_thread_->BeginFrame(args);
379 } 390 }
380 391
392 void ThreadProxy::DidBeginFrameDeadlineOnImplThread() {
393 layer_tree_host_impl_->UpdateAnimationState(
394 frame_did_draw_ || !layer_tree_host_impl_->CanDraw());
brianderson 2013/07/10 21:58:04 This makes sure to update animation state when we
395 layer_tree_host_impl_->ResetCurrentFrameTimeForNextFrame();
396 }
397
381 void ThreadProxy::OnCanDrawStateChanged(bool can_draw) { 398 void ThreadProxy::OnCanDrawStateChanged(bool can_draw) {
382 DCHECK(IsImplThread()); 399 DCHECK(IsImplThread());
383 TRACE_EVENT1( 400 TRACE_EVENT1(
384 "cc", "ThreadProxy::OnCanDrawStateChanged", "can_draw", can_draw); 401 "cc", "ThreadProxy::OnCanDrawStateChanged", "can_draw", can_draw);
385 scheduler_on_impl_thread_->SetCanDraw(can_draw); 402 scheduler_on_impl_thread_->SetCanDraw(can_draw);
386 layer_tree_host_impl_->UpdateBackgroundAnimateTicking( 403 layer_tree_host_impl_->UpdateBackgroundAnimateTicking(
387 !scheduler_on_impl_thread_->WillDrawIfNeeded()); 404 !scheduler_on_impl_thread_->WillDrawIfNeeded());
388 } 405 }
389 406
390 void ThreadProxy::OnHasPendingTreeStateChanged(bool has_pending_tree) { 407 void ThreadProxy::OnHasPendingTreeStateChanged(bool has_pending_tree) {
391 DCHECK(IsImplThread()); 408 DCHECK(IsImplThread());
392 TRACE_EVENT1("cc", "ThreadProxy::OnHasPendingTreeStateChanged", 409 TRACE_EVENT1("cc", "ThreadProxy::OnHasPendingTreeStateChanged",
393 "has_pending_tree", has_pending_tree); 410 "has_pending_tree", has_pending_tree);
394 scheduler_on_impl_thread_->SetHasPendingTree(has_pending_tree); 411 scheduler_on_impl_thread_->SetHasTrees(
412 has_pending_tree,
413 layer_tree_host_impl_->active_tree() ?
414 !layer_tree_host_impl_->active_tree()->root_layer() : true);
415
416 if (!has_pending_tree && !deferred_start_commit_on_impl_thread_.is_null()) {
417 Proxy::ImplThreadTaskRunner()->PostTask(
418 FROM_HERE,
419 deferred_start_commit_on_impl_thread_);
420 deferred_start_commit_on_impl_thread_.Reset();
421 }
395 } 422 }
396 423
397 void ThreadProxy::SetNeedsCommitOnImplThread() { 424 void ThreadProxy::SetNeedsCommitOnImplThread() {
398 DCHECK(IsImplThread()); 425 DCHECK(IsImplThread());
399 TRACE_EVENT0("cc", "ThreadProxy::SetNeedsCommitOnImplThread"); 426 TRACE_EVENT0("cc", "ThreadProxy::SetNeedsCommitOnImplThread");
400 scheduler_on_impl_thread_->SetNeedsCommit(); 427 scheduler_on_impl_thread_->SetNeedsCommit();
401 } 428 }
402 429
403 void ThreadProxy::PostAnimationEventsToMainThreadOnImplThread( 430 void ThreadProxy::PostAnimationEventsToMainThreadOnImplThread(
404 scoped_ptr<AnimationEventsVector> events, 431 scoped_ptr<AnimationEventsVector> events,
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
620 TRACE_EVENT0("cc", "ThreadProxy::FinishAllRenderingOnImplThread"); 647 TRACE_EVENT0("cc", "ThreadProxy::FinishAllRenderingOnImplThread");
621 DCHECK(IsImplThread()); 648 DCHECK(IsImplThread());
622 layer_tree_host_impl_->FinishAllRendering(); 649 layer_tree_host_impl_->FinishAllRendering();
623 completion->Signal(); 650 completion->Signal();
624 } 651 }
625 652
626 void ThreadProxy::ScheduledActionSendBeginFrameToMainThread() { 653 void ThreadProxy::ScheduledActionSendBeginFrameToMainThread() {
627 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionSendBeginFrameToMainThread"); 654 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionSendBeginFrameToMainThread");
628 scoped_ptr<BeginFrameAndCommitState> begin_frame_state( 655 scoped_ptr<BeginFrameAndCommitState> begin_frame_state(
629 new BeginFrameAndCommitState); 656 new BeginFrameAndCommitState);
657
630 begin_frame_state->monotonic_frame_begin_time = 658 begin_frame_state->monotonic_frame_begin_time =
631 layer_tree_host_impl_->CurrentPhysicalTimeTicks(); 659 layer_tree_host_impl_->CurrentPhysicalTimeTicks();
632 begin_frame_state->scroll_info = 660 begin_frame_state->scroll_info =
633 layer_tree_host_impl_->ProcessScrollDeltas(); 661 layer_tree_host_impl_->ProcessScrollDeltas();
634 662
635 if (!layer_tree_host_impl_->settings().impl_side_painting) { 663 if (!layer_tree_host_impl_->settings().impl_side_painting) {
636 DCHECK_GT(layer_tree_host_impl_->memory_allocation_limit_bytes(), 0u); 664 DCHECK_GT(layer_tree_host_impl_->memory_allocation_limit_bytes(), 0u);
637 } 665 }
666
667
638 begin_frame_state->memory_allocation_limit_bytes = 668 begin_frame_state->memory_allocation_limit_bytes =
639 layer_tree_host_impl_->memory_allocation_limit_bytes(); 669 layer_tree_host_impl_->memory_allocation_limit_bytes();
640 Proxy::MainThreadTaskRunner()->PostTask( 670 Proxy::MainThreadTaskRunner()->PostTask(
641 FROM_HERE, 671 FROM_HERE,
642 base::Bind(&ThreadProxy::BeginFrameOnMainThread, 672 base::Bind(&ThreadProxy::BeginFrameOnMainThread,
643 main_thread_weak_ptr_, 673 main_thread_weak_ptr_,
644 base::Passed(&begin_frame_state))); 674 base::Passed(&begin_frame_state)));
645 675
646 if (begin_frame_sent_to_main_thread_completion_event_on_impl_thread_) { 676 if (begin_frame_sent_to_main_thread_completion_event_on_impl_thread_) {
647 begin_frame_sent_to_main_thread_completion_event_on_impl_thread_->Signal(); 677 begin_frame_sent_to_main_thread_completion_event_on_impl_thread_->Signal();
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
775 } 805 }
776 806
777 layer_tree_host_->CommitComplete(); 807 layer_tree_host_->CommitComplete();
778 layer_tree_host_->DidBeginFrame(); 808 layer_tree_host_->DidBeginFrame();
779 } 809 }
780 810
781 void ThreadProxy::StartCommitOnImplThread( 811 void ThreadProxy::StartCommitOnImplThread(
782 CompletionEvent* completion, 812 CompletionEvent* completion,
783 ResourceUpdateQueue* raw_queue, 813 ResourceUpdateQueue* raw_queue,
784 scoped_refptr<cc::ContextProvider> offscreen_context_provider) { 814 scoped_refptr<cc::ContextProvider> offscreen_context_provider) {
785 scoped_ptr<ResourceUpdateQueue> queue(raw_queue);
786
787 TRACE_EVENT0("cc", "ThreadProxy::StartCommitOnImplThread"); 815 TRACE_EVENT0("cc", "ThreadProxy::StartCommitOnImplThread");
788 DCHECK(!commit_completion_event_on_impl_thread_); 816 DCHECK(!commit_completion_event_on_impl_thread_);
789 DCHECK(IsImplThread() && IsMainThreadBlocked()); 817 DCHECK(IsImplThread() && IsMainThreadBlocked());
790 DCHECK(scheduler_on_impl_thread_); 818 DCHECK(scheduler_on_impl_thread_);
791 DCHECK(scheduler_on_impl_thread_->CommitPending()); 819 DCHECK(scheduler_on_impl_thread_->CommitPending());
792 820
793 if (!layer_tree_host_impl_) { 821 if (!layer_tree_host_impl_) {
794 TRACE_EVENT0("cc", "EarlyOut_NoLayerTree"); 822 TRACE_EVENT0("cc", "EarlyOut_NoLayerTree");
795 completion->Signal(); 823 completion->Signal();
824
796 return; 825 return;
797 } 826 }
798 827
828 // We defer forced commits while there is a pending tree here.
829 if (layer_tree_host_impl_->pending_tree()) {
830 DCHECK(deferred_start_commit_on_impl_thread_.is_null());
831 deferred_start_commit_on_impl_thread_ =
832 base::Bind(&ThreadProxy::StartCommitOnImplThread,
833 impl_thread_weak_ptr_,
834 completion,
835 raw_queue,
836 offscreen_context_provider);
837 return;
838 }
839
840 scoped_ptr<ResourceUpdateQueue> queue(raw_queue);
841
799 if (offscreen_context_provider.get()) 842 if (offscreen_context_provider.get())
800 offscreen_context_provider->BindToCurrentThread(); 843 offscreen_context_provider->BindToCurrentThread();
801 layer_tree_host_impl_->resource_provider()-> 844 layer_tree_host_impl_->resource_provider()->
802 set_offscreen_context_provider(offscreen_context_provider); 845 set_offscreen_context_provider(offscreen_context_provider);
803 846
804 if (layer_tree_host_->contents_texture_manager()) { 847 if (layer_tree_host_->contents_texture_manager()) {
805 if (layer_tree_host_->contents_texture_manager()-> 848 if (layer_tree_host_->contents_texture_manager()->
806 LinkedEvictedBackingsExist()) { 849 LinkedEvictedBackingsExist()) {
807 // Clear any uploads we were making to textures linked to evicted 850 // Clear any uploads we were making to textures linked to evicted
808 // resources 851 // resources
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
844 887
845 // Complete all remaining texture updates. 888 // Complete all remaining texture updates.
846 current_resource_update_controller_on_impl_thread_->Finalize(); 889 current_resource_update_controller_on_impl_thread_->Finalize();
847 current_resource_update_controller_on_impl_thread_.reset(); 890 current_resource_update_controller_on_impl_thread_.reset();
848 891
849 layer_tree_host_impl_->BeginCommit(); 892 layer_tree_host_impl_->BeginCommit();
850 layer_tree_host_->BeginCommitOnImplThread(layer_tree_host_impl_.get()); 893 layer_tree_host_->BeginCommitOnImplThread(layer_tree_host_impl_.get());
851 layer_tree_host_->FinishCommitOnImplThread(layer_tree_host_impl_.get()); 894 layer_tree_host_->FinishCommitOnImplThread(layer_tree_host_impl_.get());
852 layer_tree_host_impl_->CommitComplete(); 895 layer_tree_host_impl_->CommitComplete();
853 896
854 layer_tree_host_impl_->UpdateBackgroundAnimateTicking(
855 !scheduler_on_impl_thread_->WillDrawIfNeeded());
856
857 next_frame_is_newly_committed_frame_on_impl_thread_ = true; 897 next_frame_is_newly_committed_frame_on_impl_thread_ = true;
858 898
859 if (layer_tree_host_->settings().impl_side_painting && 899 if (layer_tree_host_->settings().impl_side_painting &&
860 layer_tree_host_->BlocksPendingCommit() && 900 layer_tree_host_->BlocksPendingCommit() &&
861 layer_tree_host_impl_->pending_tree()) { 901 layer_tree_host_impl_->pending_tree()) {
862 // For some layer types in impl-side painting, the commit is held until 902 // For some layer types in impl-side painting, the commit is held until
863 // the pending tree is activated. It's also possible that the 903 // the pending tree is activated. It's also possible that the
864 // pending tree has already activated if there was no work to be done. 904 // pending tree has already activated if there was no work to be done.
865 TRACE_EVENT_INSTANT0("cc", "HoldCommit", TRACE_EVENT_SCOPE_THREAD); 905 TRACE_EVENT_INSTANT0("cc", "HoldCommit", TRACE_EVENT_SCOPE_THREAD);
866 completion_event_for_commit_held_on_tree_activation_ = 906 completion_event_for_commit_held_on_tree_activation_ =
867 commit_completion_event_on_impl_thread_; 907 commit_completion_event_on_impl_thread_;
868 commit_completion_event_on_impl_thread_ = NULL; 908 commit_completion_event_on_impl_thread_ = NULL;
869 } else { 909 } else {
870 commit_completion_event_on_impl_thread_->Signal(); 910 commit_completion_event_on_impl_thread_->Signal();
871 commit_completion_event_on_impl_thread_ = NULL; 911 commit_completion_event_on_impl_thread_ = NULL;
872 } 912 }
873 913
914 // The commit may have added animations, requiring us to start
915 // background ticking.
916 layer_tree_host_impl_->UpdateBackgroundAnimateTicking(
917 !scheduler_on_impl_thread_->WillDrawIfNeeded());
874 // SetVisible kicks off the next scheduler action, so this must be last. 918 // SetVisible kicks off the next scheduler action, so this must be last.
875 scheduler_on_impl_thread_->SetVisible(layer_tree_host_impl_->visible()); 919 scheduler_on_impl_thread_->SetVisible(layer_tree_host_impl_->visible());
876 } 920 }
877 921
878 void ThreadProxy::ScheduledActionCheckForCompletedTileUploads() { 922 void ThreadProxy::ScheduledActionCheckForCompletedTileUploads() {
879 DCHECK(IsImplThread()); 923 DCHECK(IsImplThread());
880 TRACE_EVENT0("cc", 924 TRACE_EVENT0("cc",
881 "ThreadProxy::ScheduledActionCheckForCompletedTileUploads"); 925 "ThreadProxy::ScheduledActionCheckForCompletedTileUploads");
882 layer_tree_host_impl_->CheckForCompletedTileUploads(); 926 layer_tree_host_impl_->CheckForCompletedTileUploads();
883 } 927 }
(...skipping 21 matching lines...) Expand all
905 result.did_swap = false; 949 result.did_swap = false;
906 DCHECK(IsImplThread()); 950 DCHECK(IsImplThread());
907 DCHECK(layer_tree_host_impl_.get()); 951 DCHECK(layer_tree_host_impl_.get());
908 if (!layer_tree_host_impl_) 952 if (!layer_tree_host_impl_)
909 return result; 953 return result;
910 954
911 DCHECK(layer_tree_host_impl_->renderer()); 955 DCHECK(layer_tree_host_impl_->renderer());
912 if (!layer_tree_host_impl_->renderer()) 956 if (!layer_tree_host_impl_->renderer())
913 return result; 957 return result;
914 958
915 base::TimeTicks monotonic_time =
916 layer_tree_host_impl_->CurrentFrameTimeTicks();
917 base::Time wall_clock_time = layer_tree_host_impl_->CurrentFrameTime();
918
919 // TODO(enne): This should probably happen post-animate.
920 if (layer_tree_host_impl_->pending_tree()) {
921 layer_tree_host_impl_->ActivatePendingTreeIfNeeded();
922 if (layer_tree_host_impl_->pending_tree())
923 layer_tree_host_impl_->pending_tree()->UpdateDrawProperties();
924 }
925 layer_tree_host_impl_->Animate(monotonic_time, wall_clock_time);
926 layer_tree_host_impl_->UpdateBackgroundAnimateTicking(false);
927
928 base::TimeTicks start_time = base::TimeTicks::HighResNow(); 959 base::TimeTicks start_time = base::TimeTicks::HighResNow();
929 base::TimeDelta draw_duration_estimate = DrawDurationEstimate(); 960 base::TimeDelta draw_duration_estimate = DrawDurationEstimate();
930 base::AutoReset<bool> mark_inside(&inside_draw_, true); 961 base::AutoReset<bool> mark_inside(&inside_draw_, true);
931 962
932 // This method is called on a forced draw, regardless of whether we are able 963 // This method is called on a forced draw, regardless of whether we are able
933 // to produce a frame, as the calling site on main thread is blocked until its 964 // to produce a frame, as the calling site on main thread is blocked until its
934 // request completes, and we signal completion here. If CanDraw() is false, we 965 // request completes, and we signal completion here. If CanDraw() is false, we
935 // will indicate success=false to the caller, but we must still signal 966 // will indicate success=false to the caller, but we must still signal
936 // completion to avoid deadlock. 967 // completion to avoid deadlock.
937 968
938 // We guard PrepareToDraw() with CanDraw() because it always returns a valid 969 // We guard PrepareToDraw() with CanDraw() because it always returns a valid
939 // frame, so can only be used when such a frame is possible. Since 970 // frame, so can only be used when such a frame is possible. Since
940 // DrawLayers() depends on the result of PrepareToDraw(), it is guarded on 971 // DrawLayers() depends on the result of PrepareToDraw(), it is guarded on
941 // CanDraw() as well. 972 // CanDraw() as well.
942 973
943 bool drawing_for_readback = !!readback_request_on_impl_thread_; 974 bool drawing_for_readback = !!readback_request_on_impl_thread_;
944 bool can_do_readback = layer_tree_host_impl_->renderer()->CanReadPixels(); 975 bool can_do_readback = layer_tree_host_impl_->renderer()->CanReadPixels();
945 976
946 LayerTreeHostImpl::FrameData frame; 977 LayerTreeHostImpl::FrameData frame;
947 bool draw_frame = false; 978 bool draw_frame = false;
948 bool start_ready_animations = true;
949 979
950 if (layer_tree_host_impl_->CanDraw() && 980 if (layer_tree_host_impl_->CanDraw() &&
951 (!drawing_for_readback || can_do_readback)) { 981 (!drawing_for_readback || can_do_readback)) {
952 // If it is for a readback, make sure we draw the portion being read back. 982 // If it is for a readback, make sure we draw the portion being read back.
953 gfx::Rect readback_rect; 983 gfx::Rect readback_rect;
954 if (drawing_for_readback) 984 if (drawing_for_readback)
955 readback_rect = readback_request_on_impl_thread_->rect; 985 readback_rect = readback_request_on_impl_thread_->rect;
956 986
957 // Do not start animations if we skip drawing the frame to avoid 987 // Do not start animations if we skip drawing the frame to avoid
958 // checkerboarding. 988 // checkerboarding.
959 if (layer_tree_host_impl_->PrepareToDraw(&frame, readback_rect) || 989 if (layer_tree_host_impl_->PrepareToDraw(&frame, readback_rect) ||
960 forced_draw) 990 forced_draw)
961 draw_frame = true; 991 draw_frame = true;
962 else
963 start_ready_animations = false;
964 } 992 }
965 993
994 frame_did_draw_ = draw_frame;
995
966 if (draw_frame) { 996 if (draw_frame) {
967 layer_tree_host_impl_->DrawLayers( 997 layer_tree_host_impl_->DrawLayers(
968 &frame, 998 &frame,
969 scheduler_on_impl_thread_->LastBeginFrameOnImplThreadTime()); 999 scheduler_on_impl_thread_->LastBeginFrameOnImplThreadTime());
970 result.did_draw = true; 1000 result.did_draw = true;
971 } 1001 }
972 layer_tree_host_impl_->DidDrawAllLayers(frame); 1002 layer_tree_host_impl_->DidDrawAllLayers(frame);
973 1003
974 layer_tree_host_impl_->UpdateAnimationState(start_ready_animations);
975
976 // Check for a pending CompositeAndReadback. 1004 // Check for a pending CompositeAndReadback.
977 if (readback_request_on_impl_thread_) { 1005 if (readback_request_on_impl_thread_) {
978 readback_request_on_impl_thread_->success = false; 1006 readback_request_on_impl_thread_->success = false;
979 if (draw_frame) { 1007 if (draw_frame) {
980 layer_tree_host_impl_->Readback(readback_request_on_impl_thread_->pixels, 1008 layer_tree_host_impl_->Readback(readback_request_on_impl_thread_->pixels,
981 readback_request_on_impl_thread_->rect); 1009 readback_request_on_impl_thread_->rect);
982 readback_request_on_impl_thread_->success = 1010 readback_request_on_impl_thread_->success =
983 !layer_tree_host_impl_->IsContextLost(); 1011 !layer_tree_host_impl_->IsContextLost();
984 } 1012 }
985 readback_request_on_impl_thread_->completion.Signal(); 1013 readback_request_on_impl_thread_->completion.Signal();
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
1083 1111
1084 ScheduledActionDrawAndSwapResult 1112 ScheduledActionDrawAndSwapResult
1085 ThreadProxy::ScheduledActionDrawAndSwapForced() { 1113 ThreadProxy::ScheduledActionDrawAndSwapForced() {
1086 return ScheduledActionDrawAndSwapInternal(true); 1114 return ScheduledActionDrawAndSwapInternal(true);
1087 } 1115 }
1088 1116
1089 void ThreadProxy::DidAnticipatedDrawTimeChange(base::TimeTicks time) { 1117 void ThreadProxy::DidAnticipatedDrawTimeChange(base::TimeTicks time) {
1090 if (current_resource_update_controller_on_impl_thread_) 1118 if (current_resource_update_controller_on_impl_thread_)
1091 current_resource_update_controller_on_impl_thread_ 1119 current_resource_update_controller_on_impl_thread_
1092 ->PerformMoreUpdates(time); 1120 ->PerformMoreUpdates(time);
1093 layer_tree_host_impl_->ResetCurrentFrameTimeForNextFrame();
1094 } 1121 }
1095 1122
1096 base::TimeDelta ThreadProxy::DrawDurationEstimate() { 1123 base::TimeDelta ThreadProxy::DrawDurationEstimate() {
1097 base::TimeDelta historical_estimate = 1124 base::TimeDelta historical_estimate =
1098 draw_duration_history_.Percentile(kDrawDurationEstimationPercentile); 1125 draw_duration_history_.Percentile(kDrawDurationEstimationPercentile);
1099 base::TimeDelta padding = base::TimeDelta::FromMicroseconds( 1126 base::TimeDelta padding = base::TimeDelta::FromMicroseconds(
1100 kDrawDurationEstimatePaddingInMicroseconds); 1127 kDrawDurationEstimatePaddingInMicroseconds);
1101 return historical_estimate + padding; 1128 return historical_estimate + padding;
1102 } 1129 }
1103 1130
1131 void ThreadProxy::PostBeginFrameDeadline(const base::Closure &closure,
1132 base::TimeTicks deadline) {
1133 base::TimeDelta delta = deadline - base::TimeTicks::Now();
1134 if (delta <= base::TimeDelta())
1135 delta = base::TimeDelta();
1136 Proxy::ImplThreadTaskRunner()->PostDelayedTask(FROM_HERE, closure, delta);
1137 }
1138
1104 void ThreadProxy::ReadyToFinalizeTextureUpdates() { 1139 void ThreadProxy::ReadyToFinalizeTextureUpdates() {
1105 DCHECK(IsImplThread()); 1140 DCHECK(IsImplThread());
1106 scheduler_on_impl_thread_->FinishCommit(); 1141 scheduler_on_impl_thread_->FinishCommit();
1107 } 1142 }
1108 1143
1109 void ThreadProxy::DidCommitAndDrawFrame() { 1144 void ThreadProxy::DidCommitAndDrawFrame() {
1110 DCHECK(IsMainThread()); 1145 DCHECK(IsMainThread());
1111 if (!layer_tree_host_) 1146 if (!layer_tree_host_)
1112 return; 1147 return;
1113 layer_tree_host_->DidCommitAndDrawFrame(); 1148 layer_tree_host_->DidCommitAndDrawFrame();
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after
1439 !layer_tree_host_impl_->pending_tree()) { 1474 !layer_tree_host_impl_->pending_tree()) {
1440 TRACE_EVENT_INSTANT0("cc", "ReleaseCommitbyActivation", 1475 TRACE_EVENT_INSTANT0("cc", "ReleaseCommitbyActivation",
1441 TRACE_EVENT_SCOPE_THREAD); 1476 TRACE_EVENT_SCOPE_THREAD);
1442 DCHECK(layer_tree_host_impl_->settings().impl_side_painting); 1477 DCHECK(layer_tree_host_impl_->settings().impl_side_painting);
1443 completion_event_for_commit_held_on_tree_activation_->Signal(); 1478 completion_event_for_commit_held_on_tree_activation_->Signal();
1444 completion_event_for_commit_held_on_tree_activation_ = NULL; 1479 completion_event_for_commit_held_on_tree_activation_ = NULL;
1445 } 1480 }
1446 } 1481 }
1447 1482
1448 } // namespace cc 1483 } // namespace cc
OLDNEW
« cc/trees/layer_tree_host_impl.cc ('K') | « cc/trees/thread_proxy.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698