Chromium Code Reviews| Index: cc/trees/single_thread_proxy.cc |
| diff --git a/cc/trees/single_thread_proxy.cc b/cc/trees/single_thread_proxy.cc |
| index 920dc15495abdb7be32b0ca26eb5abfb37e9cbbe..bf17528f2b7b0a6d3116b091bb0def438ce9e5c2 100644 |
| --- a/cc/trees/single_thread_proxy.cc |
| +++ b/cc/trees/single_thread_proxy.cc |
| @@ -45,6 +45,7 @@ SingleThreadProxy::SingleThreadProxy( |
| client_(client), |
| timing_history_(layer_tree_host->rendering_stats_instrumentation()), |
| next_frame_is_newly_committed_frame_(false), |
| + inside_impl_frame_(false), |
| inside_draw_(false), |
| defer_commits_(false), |
| animate_requested_(false), |
| @@ -586,6 +587,7 @@ void SingleThreadProxy::OnDrawForOutputSurface() { |
| void SingleThreadProxy::CompositeImmediately(base::TimeTicks frame_begin_time) { |
| TRACE_EVENT0("cc,benchmark", "SingleThreadProxy::CompositeImmediately"); |
| DCHECK(Proxy::IsMainThread()); |
| + DCHECK(!inside_impl_frame_); |
| base::AutoReset<bool> inside_composite(&inside_synchronous_composite_, true); |
| if (layer_tree_host_->output_surface_lost()) { |
| @@ -596,10 +598,19 @@ void SingleThreadProxy::CompositeImmediately(base::TimeTicks frame_begin_time) { |
| return; |
| } |
| + BeginFrameArgs begin_frame_args(BeginFrameArgs::Create( |
| + BEGINFRAME_FROM_HERE, frame_begin_time, base::TimeTicks(), |
| + BeginFrameArgs::DefaultInterval(), BeginFrameArgs::NORMAL)); |
| + |
| + // Start the impl frame. |
| + { |
| + DebugScopedSetImplThread impl(const_cast<SingleThreadProxy*>(this)); |
|
sunnyps
2015/05/01 00:46:38
Why do you need a const_cast here? 'this' is not c
mithro-old
2015/05/01 03:08:54
Done.
|
| + WillBeginImplFrame(begin_frame_args); |
| + } |
| + |
| + // Run the "main thread" and get it to commit. |
| { |
| - BeginFrameArgs begin_frame_args(BeginFrameArgs::Create( |
| - BEGINFRAME_FROM_HERE, frame_begin_time, base::TimeTicks(), |
| - BeginFrameArgs::DefaultInterval(), BeginFrameArgs::NORMAL)); |
| + DCHECK(inside_impl_frame_); |
|
sunnyps
2015/05/01 00:46:38
nit: move this DCHECK to immediately under the Wil
mithro-old
2015/05/01 03:08:54
This DCHCEK is checking that when you call DoBegin
|
| DoBeginMainFrame(begin_frame_args); |
| DoCommit(); |
| @@ -607,6 +618,7 @@ void SingleThreadProxy::CompositeImmediately(base::TimeTicks frame_begin_time) { |
| << "Commit should always succeed and transfer promises."; |
| } |
| + // Finish the impl frame. |
| { |
| DebugScopedSetImplThread impl(const_cast<SingleThreadProxy*>(this)); |
| if (layer_tree_host_impl_->settings().impl_side_painting) { |
| @@ -626,6 +638,8 @@ void SingleThreadProxy::CompositeImmediately(base::TimeTicks frame_begin_time) { |
| // another draw will never be scheduled, so break remaining promises. |
| layer_tree_host_impl_->active_tree()->BreakSwapPromises( |
| SwapPromise::SWAP_FAILS); |
| + |
| + DidBeginImplFrameDeadline(); |
| } |
| } |
| @@ -716,12 +730,6 @@ DrawResult SingleThreadProxy::DoComposite(base::TimeTicks frame_begin_time, |
| FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| "461509 SingleThreadProxy::DoComposite5")); |
| layer_tree_host_impl_->UpdateAnimationState(start_ready_animations); |
| - // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509 |
| - // is fixed. |
| - tracked_objects::ScopedTracker tracking_profile6( |
|
sunnyps
2015/05/01 00:46:38
This is related to the other CL right? https://cod
mithro-old
2015/05/01 03:08:55
Yes, this patch is dependent on that CL. I uploade
|
| - FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| - "461509 SingleThreadProxy::DoComposite6")); |
| - layer_tree_host_impl_->ResetCurrentBeginFrameArgsForNextFrame(); |
| // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509 |
| // is fixed. |
| @@ -791,6 +799,9 @@ void SingleThreadProxy::SetAuthoritativeVSyncInterval( |
| } |
| void SingleThreadProxy::WillBeginImplFrame(const BeginFrameArgs& args) { |
| + DCHECK(!inside_impl_frame_) |
| + << "WillBeginImplFrame called while already inside an impl frame!"; |
| + inside_impl_frame_ = true; |
| layer_tree_host_impl_->WillBeginImplFrame(args); |
| } |
| @@ -803,17 +814,21 @@ void SingleThreadProxy::ScheduledActionSendBeginMainFrame() { |
| // fall on the next. Doing it asynchronously instead matches the semantics of |
| // ThreadProxy::SetNeedsCommit where SetNeedsCommit will not cause a |
| // synchronous commit. |
| + DCHECK(inside_impl_frame_) |
|
sunnyps
2015/05/01 00:46:38
We're pretty sure this is true for SingleThreadPro
mithro-old
2015/05/01 03:08:54
We'd hope so, but as SRE says "hope is not a strat
|
| + << "BeginMainFrame should only be sent inside a BeginImplFrame"; |
| + const BeginFrameArgs& begin_frame_args = |
| + layer_tree_host_impl_->CurrentBeginFrameArgs(); |
| + |
| MainThreadTaskRunner()->PostTask( |
| - FROM_HERE, |
| - base::Bind(&SingleThreadProxy::BeginMainFrame, |
| - weak_factory_.GetWeakPtr())); |
| + FROM_HERE, base::Bind(&SingleThreadProxy::BeginMainFrame, |
| + weak_factory_.GetWeakPtr(), begin_frame_args)); |
| } |
| void SingleThreadProxy::SendBeginMainFrameNotExpectedSoon() { |
| layer_tree_host_->BeginMainFrameNotExpectedSoon(); |
| } |
| -void SingleThreadProxy::BeginMainFrame() { |
| +void SingleThreadProxy::BeginMainFrame(const BeginFrameArgs& begin_frame_args) { |
| commit_requested_ = false; |
| animate_requested_ = false; |
| @@ -849,8 +864,6 @@ void SingleThreadProxy::BeginMainFrame() { |
| // a commit here. |
| commit_requested_ = true; |
| - const BeginFrameArgs& begin_frame_args = |
| - layer_tree_host_impl_->CurrentBeginFrameArgs(); |
| DoBeginMainFrame(begin_frame_args); |
| } |
| @@ -969,6 +982,9 @@ base::TimeDelta SingleThreadProxy::CommitToActivateDurationEstimate() { |
| void SingleThreadProxy::DidBeginImplFrameDeadline() { |
| layer_tree_host_impl_->ResetCurrentBeginFrameArgsForNextFrame(); |
| + DCHECK(inside_impl_frame_) |
| + << "DidBeginImplFrameDeadline called while not inside an impl frame!"; |
| + inside_impl_frame_ = false; |
| } |
| void SingleThreadProxy::SendBeginFramesToChildren(const BeginFrameArgs& args) { |