Index: cc/trees/thread_proxy.cc |
diff --git a/cc/trees/thread_proxy.cc b/cc/trees/thread_proxy.cc |
index 5e94ebc8f4ab3291fe3b540a6a3a2ffc0369757b..f18b2b4cbb66f9e6197c4f602cfb28184c3b2b5a 100644 |
--- a/cc/trees/thread_proxy.cc |
+++ b/cc/trees/thread_proxy.cc |
@@ -76,6 +76,7 @@ ThreadProxy::ThreadProxy( |
manage_tiles_pending_(false), |
weak_factory_on_impl_thread_(this), |
weak_factory_(this), |
+ frame_did_draw_(false), |
begin_frame_sent_to_main_thread_completion_event_on_impl_thread_(NULL), |
readback_request_on_impl_thread_(NULL), |
commit_completion_event_on_impl_thread_(NULL), |
@@ -370,14 +371,29 @@ void ThreadProxy::SetNeedsBeginFrameOnImplThread(bool enable) { |
TRACE_EVENT1("cc", "ThreadProxy::SetNeedsBeginFrameOnImplThread", |
"enable", enable); |
layer_tree_host_impl_->SetNeedsBeginFrame(enable); |
+ layer_tree_host_impl_->UpdateBackgroundAnimateTicking(!enable); |
} |
void ThreadProxy::BeginFrameOnImplThread(const BeginFrameArgs& args) { |
DCHECK(IsImplThread()); |
TRACE_EVENT0("cc", "ThreadProxy::BeginFrameOnImplThread"); |
+ |
+ base::TimeTicks monotonic_time = |
+ layer_tree_host_impl_->CurrentFrameTimeTicks(); |
+ base::Time wall_clock_time = layer_tree_host_impl_->CurrentFrameTime(); |
+ layer_tree_host_impl_->Animate(monotonic_time, wall_clock_time); |
+ |
+ // Reinitialize for the current frame. |
+ frame_did_draw_ = false; |
+ |
scheduler_on_impl_thread_->BeginFrame(args); |
} |
+void ThreadProxy::DidBeginFrameDeadlineOnImplThread() { |
+ layer_tree_host_impl_->UpdateAnimationState(frame_did_draw_); |
+ layer_tree_host_impl_->ResetCurrentFrameTimeForNextFrame(); |
+} |
+ |
void ThreadProxy::OnCanDrawStateChanged(bool can_draw) { |
DCHECK(IsImplThread()); |
TRACE_EVENT1( |
@@ -391,7 +407,17 @@ void ThreadProxy::OnHasPendingTreeStateChanged(bool has_pending_tree) { |
DCHECK(IsImplThread()); |
TRACE_EVENT1("cc", "ThreadProxy::OnHasPendingTreeStateChanged", |
"has_pending_tree", has_pending_tree); |
- scheduler_on_impl_thread_->SetHasPendingTree(has_pending_tree); |
+ scheduler_on_impl_thread_->SetHasTrees( |
brianderson
2013/07/09 01:50:48
The meaning of the two arguments to SetHasTrees (h
|
+ has_pending_tree, |
+ layer_tree_host_impl_->active_tree() ? |
+ !layer_tree_host_impl_->active_tree()->root_layer() : true); |
+ |
+ if (!has_pending_tree && !deferred_start_commit_on_impl_thread_.is_null()) { |
+ Proxy::ImplThreadTaskRunner()->PostTask( |
+ FROM_HERE, |
+ deferred_start_commit_on_impl_thread_); |
+ deferred_start_commit_on_impl_thread_.Reset(); |
+ } |
} |
void ThreadProxy::SetNeedsCommitOnImplThread() { |
@@ -627,6 +653,7 @@ void ThreadProxy::ScheduledActionSendBeginFrameToMainThread() { |
TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionSendBeginFrameToMainThread"); |
scoped_ptr<BeginFrameAndCommitState> begin_frame_state( |
new BeginFrameAndCommitState); |
+ |
begin_frame_state->monotonic_frame_begin_time = |
layer_tree_host_impl_->CurrentPhysicalTimeTicks(); |
begin_frame_state->scroll_info = |
@@ -635,6 +662,8 @@ void ThreadProxy::ScheduledActionSendBeginFrameToMainThread() { |
if (!layer_tree_host_impl_->settings().impl_side_painting) { |
DCHECK_GT(layer_tree_host_impl_->memory_allocation_limit_bytes(), 0u); |
} |
+ |
+ |
begin_frame_state->memory_allocation_limit_bytes = |
layer_tree_host_impl_->memory_allocation_limit_bytes(); |
Proxy::MainThreadTaskRunner()->PostTask( |
@@ -782,8 +811,6 @@ void ThreadProxy::StartCommitOnImplThread( |
CompletionEvent* completion, |
ResourceUpdateQueue* raw_queue, |
scoped_refptr<cc::ContextProvider> offscreen_context_provider) { |
- scoped_ptr<ResourceUpdateQueue> queue(raw_queue); |
- |
TRACE_EVENT0("cc", "ThreadProxy::StartCommitOnImplThread"); |
DCHECK(!commit_completion_event_on_impl_thread_); |
DCHECK(IsImplThread() && IsMainThreadBlocked()); |
@@ -793,9 +820,24 @@ void ThreadProxy::StartCommitOnImplThread( |
if (!layer_tree_host_impl_) { |
TRACE_EVENT0("cc", "EarlyOut_NoLayerTree"); |
completion->Signal(); |
+ |
return; |
} |
+ // We defer forced commits while there is a pending tree here. |
brianderson
2013/07/09 01:50:48
I added deferred_start_commit_on_impl_thread_ in o
|
+ if (layer_tree_host_impl_->pending_tree()) { |
+ DCHECK(deferred_start_commit_on_impl_thread_.is_null()); |
+ deferred_start_commit_on_impl_thread_ = |
+ base::Bind(&ThreadProxy::StartCommitOnImplThread, |
+ impl_thread_weak_ptr_, |
+ completion, |
+ raw_queue, |
+ offscreen_context_provider); |
+ return; |
+ } |
+ |
+ scoped_ptr<ResourceUpdateQueue> queue(raw_queue); |
+ |
if (offscreen_context_provider.get()) |
offscreen_context_provider->BindToCurrentThread(); |
layer_tree_host_impl_->resource_provider()-> |
@@ -851,9 +893,6 @@ void ThreadProxy::ScheduledActionCommit() { |
layer_tree_host_->FinishCommitOnImplThread(layer_tree_host_impl_.get()); |
layer_tree_host_impl_->CommitComplete(); |
- layer_tree_host_impl_->UpdateBackgroundAnimateTicking( |
- !scheduler_on_impl_thread_->WillDrawIfNeeded()); |
- |
next_frame_is_newly_committed_frame_on_impl_thread_ = true; |
if (layer_tree_host_->settings().impl_side_painting && |
@@ -871,6 +910,10 @@ void ThreadProxy::ScheduledActionCommit() { |
commit_completion_event_on_impl_thread_ = NULL; |
} |
+ // The commit may have added animations, requiring us to start |
+ // background ticking. |
+ layer_tree_host_impl_->UpdateBackgroundAnimateTicking( |
+ !scheduler_on_impl_thread_->WillDrawIfNeeded()); |
// SetVisible kicks off the next scheduler action, so this must be last. |
scheduler_on_impl_thread_->SetVisible(layer_tree_host_impl_->visible()); |
} |
@@ -912,19 +955,6 @@ ThreadProxy::ScheduledActionDrawAndSwapInternal(bool forced_draw) { |
if (!layer_tree_host_impl_->renderer()) |
return result; |
- base::TimeTicks monotonic_time = |
- layer_tree_host_impl_->CurrentFrameTimeTicks(); |
- base::Time wall_clock_time = layer_tree_host_impl_->CurrentFrameTime(); |
- |
- // TODO(enne): This should probably happen post-animate. |
- if (layer_tree_host_impl_->pending_tree()) { |
- layer_tree_host_impl_->ActivatePendingTreeIfNeeded(); |
- if (layer_tree_host_impl_->pending_tree()) |
- layer_tree_host_impl_->pending_tree()->UpdateDrawProperties(); |
- } |
- layer_tree_host_impl_->Animate(monotonic_time, wall_clock_time); |
- layer_tree_host_impl_->UpdateBackgroundAnimateTicking(false); |
- |
base::TimeTicks start_time = base::TimeTicks::HighResNow(); |
base::TimeDelta draw_duration_estimate = DrawDurationEstimate(); |
base::AutoReset<bool> mark_inside(&inside_draw_, true); |
@@ -945,7 +975,6 @@ ThreadProxy::ScheduledActionDrawAndSwapInternal(bool forced_draw) { |
LayerTreeHostImpl::FrameData frame; |
bool draw_frame = false; |
- bool start_ready_animations = true; |
if (layer_tree_host_impl_->CanDraw() && |
(!drawing_for_readback || can_do_readback)) { |
@@ -959,10 +988,10 @@ ThreadProxy::ScheduledActionDrawAndSwapInternal(bool forced_draw) { |
if (layer_tree_host_impl_->PrepareToDraw(&frame, readback_rect) || |
forced_draw) |
draw_frame = true; |
- else |
- start_ready_animations = false; |
} |
+ frame_did_draw_ = draw_frame; |
+ |
if (draw_frame) { |
layer_tree_host_impl_->DrawLayers( |
&frame, |
@@ -971,8 +1000,6 @@ ThreadProxy::ScheduledActionDrawAndSwapInternal(bool forced_draw) { |
} |
layer_tree_host_impl_->DidDrawAllLayers(frame); |
- layer_tree_host_impl_->UpdateAnimationState(start_ready_animations); |
- |
// Check for a pending CompositeAndReadback. |
if (readback_request_on_impl_thread_) { |
readback_request_on_impl_thread_->success = false; |
@@ -1090,7 +1117,6 @@ void ThreadProxy::DidAnticipatedDrawTimeChange(base::TimeTicks time) { |
if (current_resource_update_controller_on_impl_thread_) |
current_resource_update_controller_on_impl_thread_ |
->PerformMoreUpdates(time); |
- layer_tree_host_impl_->ResetCurrentFrameTimeForNextFrame(); |
} |
base::TimeDelta ThreadProxy::DrawDurationEstimate() { |
@@ -1101,6 +1127,14 @@ base::TimeDelta ThreadProxy::DrawDurationEstimate() { |
return historical_estimate + padding; |
} |
+void ThreadProxy::PostBeginFrameDeadline(const base::Closure &closure, |
+ base::TimeTicks deadline) { |
+ base::TimeDelta delta = deadline - base::TimeTicks::Now(); |
+ if (delta <= base::TimeDelta()) |
+ delta = base::TimeDelta(); |
+ Proxy::ImplThreadTaskRunner()->PostDelayedTask(FROM_HERE, closure, delta); |
+} |
+ |
void ThreadProxy::ReadyToFinalizeTextureUpdates() { |
DCHECK(IsImplThread()); |
scheduler_on_impl_thread_->FinishCommit(); |