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) { |