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

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

Issue 337693005: cc: Control defer_commits logic by Scheduler (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 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 | Annotate | Revision Log
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/single_thread_proxy.h" 5 #include "cc/trees/single_thread_proxy.h"
6 6
7 #include "base/auto_reset.h" 7 #include "base/auto_reset.h"
8 #include "base/debug/trace_event.h" 8 #include "base/debug/trace_event.h"
9 #include "cc/debug/benchmark_instrumentation.h" 9 #include "cc/debug/benchmark_instrumentation.h"
10 #include "cc/output/context_provider.h" 10 #include "cc/output/context_provider.h"
(...skipping 26 matching lines...) Expand all
37 LayerTreeHostSingleThreadClient* client, 37 LayerTreeHostSingleThreadClient* client,
38 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, 38 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
39 scoped_ptr<BeginFrameSource> external_begin_frame_source) 39 scoped_ptr<BeginFrameSource> external_begin_frame_source)
40 : Proxy(main_task_runner, NULL), 40 : Proxy(main_task_runner, NULL),
41 layer_tree_host_(layer_tree_host), 41 layer_tree_host_(layer_tree_host),
42 client_(client), 42 client_(client),
43 timing_history_(layer_tree_host->rendering_stats_instrumentation()), 43 timing_history_(layer_tree_host->rendering_stats_instrumentation()),
44 next_frame_is_newly_committed_frame_(false), 44 next_frame_is_newly_committed_frame_(false),
45 inside_draw_(false), 45 inside_draw_(false),
46 defer_commits_(false), 46 defer_commits_(false),
47 commit_was_deferred_(false),
48 commit_requested_(false), 47 commit_requested_(false),
49 inside_synchronous_composite_(false), 48 inside_synchronous_composite_(false),
50 output_surface_creation_requested_(false), 49 output_surface_creation_requested_(false),
51 external_begin_frame_source_(external_begin_frame_source.Pass()), 50 external_begin_frame_source_(external_begin_frame_source.Pass()),
52 weak_factory_(this) { 51 weak_factory_(this) {
53 TRACE_EVENT0("cc", "SingleThreadProxy::SingleThreadProxy"); 52 TRACE_EVENT0("cc", "SingleThreadProxy::SingleThreadProxy");
54 DCHECK(Proxy::IsMainThread()); 53 DCHECK(Proxy::IsMainThread());
55 DCHECK(layer_tree_host); 54 DCHECK(layer_tree_host);
56 } 55 }
57 56
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 return; 292 return;
294 if (defer_commits_ == defer_commits) 293 if (defer_commits_ == defer_commits)
295 return; 294 return;
296 295
297 if (defer_commits) 296 if (defer_commits)
298 TRACE_EVENT_ASYNC_BEGIN0("cc", "SingleThreadProxy::SetDeferCommits", this); 297 TRACE_EVENT_ASYNC_BEGIN0("cc", "SingleThreadProxy::SetDeferCommits", this);
299 else 298 else
300 TRACE_EVENT_ASYNC_END0("cc", "SingleThreadProxy::SetDeferCommits", this); 299 TRACE_EVENT_ASYNC_END0("cc", "SingleThreadProxy::SetDeferCommits", this);
301 300
302 defer_commits_ = defer_commits; 301 defer_commits_ = defer_commits;
303 if (!defer_commits_ && commit_was_deferred_) { 302 scheduler_on_impl_thread_->SetDeferCommits(defer_commits);
304 commit_was_deferred_ = false;
305 BeginMainFrame();
306 }
307 } 303 }
308 304
309 bool SingleThreadProxy::CommitRequested() const { 305 bool SingleThreadProxy::CommitRequested() const {
310 DCHECK(Proxy::IsMainThread()); 306 DCHECK(Proxy::IsMainThread());
311 return commit_requested_; 307 return commit_requested_;
312 } 308 }
313 309
314 bool SingleThreadProxy::BeginMainFrameRequested() const { 310 bool SingleThreadProxy::BeginMainFrameRequested() const {
315 DCHECK(Proxy::IsMainThread()); 311 DCHECK(Proxy::IsMainThread());
316 // If there is no scheduler, then there can be no pending begin frame, 312 // If there is no scheduler, then there can be no pending begin frame,
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after
653 // fall on the next. Doing it asynchronously instead matches the semantics of 649 // fall on the next. Doing it asynchronously instead matches the semantics of
654 // ThreadProxy::SetNeedsCommit where SetNeedsCommit will not cause a 650 // ThreadProxy::SetNeedsCommit where SetNeedsCommit will not cause a
655 // synchronous commit. 651 // synchronous commit.
656 MainThreadTaskRunner()->PostTask( 652 MainThreadTaskRunner()->PostTask(
657 FROM_HERE, 653 FROM_HERE,
658 base::Bind(&SingleThreadProxy::BeginMainFrame, 654 base::Bind(&SingleThreadProxy::BeginMainFrame,
659 weak_factory_.GetWeakPtr())); 655 weak_factory_.GetWeakPtr()));
660 } 656 }
661 657
662 void SingleThreadProxy::BeginMainFrame() { 658 void SingleThreadProxy::BeginMainFrame() {
663 if (defer_commits_) {
664 DCHECK(!commit_was_deferred_);
665 commit_was_deferred_ = true;
666 layer_tree_host_->DidDeferCommit();
667 return;
668 }
669
670 // This checker assumes NotifyReadyToCommit in this stack causes a synchronous 659 // This checker assumes NotifyReadyToCommit in this stack causes a synchronous
671 // commit. 660 // commit.
672 ScopedAbortRemainingSwapPromises swap_promise_checker(layer_tree_host_); 661 ScopedAbortRemainingSwapPromises swap_promise_checker(layer_tree_host_);
673 662
674 if (!layer_tree_host_->visible()) { 663 bool need_to_abort_begin_main_frame = true;
664 if (defer_commits_) {
danakj 2014/11/19 16:31:34 nit: i mildly prefer a few early outs/returns inst
simonhong 2014/11/26 15:52:53 Done.
665 TRACE_EVENT_INSTANT0("cc", "EarlyOut_DeferCommits",
666 TRACE_EVENT_SCOPE_THREAD);
667 layer_tree_host_->DidDeferCommit();
brianderson 2014/11/19 19:55:07 It looks like LTH::DidDeferCommit() is only used b
simonhong 2014/11/26 15:52:53 This change breaks below three tests. * LayerTreeH
brianderson 2014/12/03 02:12:10 The scheduler tests are good, but I think we shoul
668 } else if (!layer_tree_host_->visible()) {
675 TRACE_EVENT_INSTANT0("cc", "EarlyOut_NotVisible", TRACE_EVENT_SCOPE_THREAD); 669 TRACE_EVENT_INSTANT0("cc", "EarlyOut_NotVisible", TRACE_EVENT_SCOPE_THREAD);
670 } else if (layer_tree_host_->output_surface_lost()) {
671 TRACE_EVENT_INSTANT0(
672 "cc", "EarlyOut_OutputSurfaceLost", TRACE_EVENT_SCOPE_THREAD);
673 } else {
674 need_to_abort_begin_main_frame = false;
675 }
676
677 if (need_to_abort_begin_main_frame) {
676 BeginMainFrameAbortedOnImplThread(); 678 BeginMainFrameAbortedOnImplThread();
677 return; 679 return;
678 } 680 }
679
680 if (layer_tree_host_->output_surface_lost()) {
681 TRACE_EVENT_INSTANT0(
682 "cc", "EarlyOut_OutputSurfaceLost", TRACE_EVENT_SCOPE_THREAD);
683 BeginMainFrameAbortedOnImplThread();
684 return;
685 }
686 681
687 const BeginFrameArgs& begin_frame_args = 682 const BeginFrameArgs& begin_frame_args =
688 layer_tree_host_impl_->CurrentBeginFrameArgs(); 683 layer_tree_host_impl_->CurrentBeginFrameArgs();
689 DoBeginMainFrame(begin_frame_args); 684 DoBeginMainFrame(begin_frame_args);
690 } 685 }
691 686
692 void SingleThreadProxy::DoBeginMainFrame( 687 void SingleThreadProxy::DoBeginMainFrame(
693 const BeginFrameArgs& begin_frame_args) { 688 const BeginFrameArgs& begin_frame_args) {
694 layer_tree_host_->WillBeginMainFrame(); 689 layer_tree_host_->WillBeginMainFrame();
695 layer_tree_host_->BeginMainFrame(begin_frame_args); 690 layer_tree_host_->BeginMainFrame(begin_frame_args);
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
797 792
798 base::TimeDelta SingleThreadProxy::CommitToActivateDurationEstimate() { 793 base::TimeDelta SingleThreadProxy::CommitToActivateDurationEstimate() {
799 return timing_history_.CommitToActivateDurationEstimate(); 794 return timing_history_.CommitToActivateDurationEstimate();
800 } 795 }
801 796
802 void SingleThreadProxy::DidBeginImplFrameDeadline() { 797 void SingleThreadProxy::DidBeginImplFrameDeadline() {
803 layer_tree_host_impl_->ResetCurrentBeginFrameArgsForNextFrame(); 798 layer_tree_host_impl_->ResetCurrentBeginFrameArgsForNextFrame();
804 } 799 }
805 800
806 } // namespace cc 801 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698