OLD | NEW |
---|---|
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 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
231 &completion, | 231 &completion, |
232 visible)); | 232 visible)); |
233 completion.Wait(); | 233 completion.Wait(); |
234 } | 234 } |
235 | 235 |
236 void ThreadProxy::SetVisibleOnImplThread(CompletionEvent* completion, | 236 void ThreadProxy::SetVisibleOnImplThread(CompletionEvent* completion, |
237 bool visible) { | 237 bool visible) { |
238 TRACE_EVENT0("cc", "ThreadProxy::SetVisibleOnImplThread"); | 238 TRACE_EVENT0("cc", "ThreadProxy::SetVisibleOnImplThread"); |
239 layer_tree_host_impl_->SetVisible(visible); | 239 layer_tree_host_impl_->SetVisible(visible); |
240 scheduler_on_impl_thread_->SetVisible(visible); | 240 scheduler_on_impl_thread_->SetVisible(visible); |
241 UpdateBackgroundAnimateTicking(); | |
242 completion->Signal(); | |
243 } | |
244 | |
245 void ThreadProxy::UpdateBackgroundAnimateTicking() { | |
241 layer_tree_host_impl_->UpdateBackgroundAnimateTicking( | 246 layer_tree_host_impl_->UpdateBackgroundAnimateTicking( |
242 !scheduler_on_impl_thread_->WillDrawIfNeeded()); | 247 !scheduler_on_impl_thread_->WillDrawIfNeeded() && |
243 completion->Signal(); | 248 layer_tree_host_impl_->active_tree()->root_layer()); |
enne (OOO)
2013/08/29 00:10:10
This seems a little redundant. Scheduler::WillDra
brianderson
2013/08/29 00:16:04
It's confusing with all the negations going on. Th
| |
244 } | 249 } |
245 | 250 |
246 void ThreadProxy::DoCreateAndInitializeOutputSurface() { | 251 void ThreadProxy::DoCreateAndInitializeOutputSurface() { |
247 TRACE_EVENT0("cc", "ThreadProxy::DoCreateAndInitializeOutputSurface"); | 252 TRACE_EVENT0("cc", "ThreadProxy::DoCreateAndInitializeOutputSurface"); |
248 DCHECK(IsMainThread()); | 253 DCHECK(IsMainThread()); |
249 | 254 |
250 scoped_ptr<OutputSurface> output_surface = first_output_surface_.Pass(); | 255 scoped_ptr<OutputSurface> output_surface = first_output_surface_.Pass(); |
251 if (!output_surface) | 256 if (!output_surface) |
252 output_surface = layer_tree_host_->CreateOutputSurface(); | 257 output_surface = layer_tree_host_->CreateOutputSurface(); |
253 | 258 |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
399 DCHECK(IsImplThread()); | 404 DCHECK(IsImplThread()); |
400 TRACE_EVENT0("cc", "ThreadProxy::BeginFrameOnImplThread"); | 405 TRACE_EVENT0("cc", "ThreadProxy::BeginFrameOnImplThread"); |
401 scheduler_on_impl_thread_->BeginFrame(args); | 406 scheduler_on_impl_thread_->BeginFrame(args); |
402 } | 407 } |
403 | 408 |
404 void ThreadProxy::OnCanDrawStateChanged(bool can_draw) { | 409 void ThreadProxy::OnCanDrawStateChanged(bool can_draw) { |
405 DCHECK(IsImplThread()); | 410 DCHECK(IsImplThread()); |
406 TRACE_EVENT1( | 411 TRACE_EVENT1( |
407 "cc", "ThreadProxy::OnCanDrawStateChanged", "can_draw", can_draw); | 412 "cc", "ThreadProxy::OnCanDrawStateChanged", "can_draw", can_draw); |
408 scheduler_on_impl_thread_->SetCanDraw(can_draw); | 413 scheduler_on_impl_thread_->SetCanDraw(can_draw); |
409 layer_tree_host_impl_->UpdateBackgroundAnimateTicking( | 414 UpdateBackgroundAnimateTicking(); |
410 !scheduler_on_impl_thread_->WillDrawIfNeeded()); | |
411 } | 415 } |
412 | 416 |
413 void ThreadProxy::NotifyReadyToActivate() { | 417 void ThreadProxy::NotifyReadyToActivate() { |
414 TRACE_EVENT0("cc", "ThreadProxy::NotifyReadyToActivate"); | 418 TRACE_EVENT0("cc", "ThreadProxy::NotifyReadyToActivate"); |
415 scheduler_on_impl_thread_->NotifyReadyToActivate(); | 419 scheduler_on_impl_thread_->NotifyReadyToActivate(); |
416 } | 420 } |
417 | 421 |
418 void ThreadProxy::SetNeedsCommitOnImplThread() { | 422 void ThreadProxy::SetNeedsCommitOnImplThread() { |
419 DCHECK(IsImplThread()); | 423 DCHECK(IsImplThread()); |
420 TRACE_EVENT0("cc", "ThreadProxy::SetNeedsCommitOnImplThread"); | 424 TRACE_EVENT0("cc", "ThreadProxy::SetNeedsCommitOnImplThread"); |
(...skipping 500 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
921 current_resource_update_controller_on_impl_thread_->Finalize(); | 925 current_resource_update_controller_on_impl_thread_->Finalize(); |
922 current_resource_update_controller_on_impl_thread_.reset(); | 926 current_resource_update_controller_on_impl_thread_.reset(); |
923 | 927 |
924 layer_tree_host_impl_->BeginCommit(); | 928 layer_tree_host_impl_->BeginCommit(); |
925 layer_tree_host_->BeginCommitOnImplThread(layer_tree_host_impl_.get()); | 929 layer_tree_host_->BeginCommitOnImplThread(layer_tree_host_impl_.get()); |
926 layer_tree_host_->FinishCommitOnImplThread(layer_tree_host_impl_.get()); | 930 layer_tree_host_->FinishCommitOnImplThread(layer_tree_host_impl_.get()); |
927 layer_tree_host_impl_->CommitComplete(); | 931 layer_tree_host_impl_->CommitComplete(); |
928 | 932 |
929 SetInputThrottledUntilCommitOnImplThread(false); | 933 SetInputThrottledUntilCommitOnImplThread(false); |
930 | 934 |
931 layer_tree_host_impl_->UpdateBackgroundAnimateTicking( | 935 UpdateBackgroundAnimateTicking(); |
932 !scheduler_on_impl_thread_->WillDrawIfNeeded()); | |
933 | 936 |
934 next_frame_is_newly_committed_frame_on_impl_thread_ = true; | 937 next_frame_is_newly_committed_frame_on_impl_thread_ = true; |
935 | 938 |
936 if (layer_tree_host_->settings().impl_side_painting && | 939 if (layer_tree_host_->settings().impl_side_painting && |
937 layer_tree_host_->BlocksPendingCommit() && | 940 layer_tree_host_->BlocksPendingCommit() && |
938 layer_tree_host_impl_->pending_tree()) { | 941 layer_tree_host_impl_->pending_tree()) { |
939 // For some layer types in impl-side painting, the commit is held until | 942 // For some layer types in impl-side painting, the commit is held until |
940 // the pending tree is activated. It's also possible that the | 943 // the pending tree is activated. It's also possible that the |
941 // pending tree has already activated if there was no work to be done. | 944 // pending tree has already activated if there was no work to be done. |
942 TRACE_EVENT_INSTANT0("cc", "HoldCommit", TRACE_EVENT_SCOPE_THREAD); | 945 TRACE_EVENT_INSTANT0("cc", "HoldCommit", TRACE_EVENT_SCOPE_THREAD); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
995 return result; | 998 return result; |
996 | 999 |
997 base::TimeTicks monotonic_time = | 1000 base::TimeTicks monotonic_time = |
998 layer_tree_host_impl_->CurrentFrameTimeTicks(); | 1001 layer_tree_host_impl_->CurrentFrameTimeTicks(); |
999 base::Time wall_clock_time = layer_tree_host_impl_->CurrentFrameTime(); | 1002 base::Time wall_clock_time = layer_tree_host_impl_->CurrentFrameTime(); |
1000 | 1003 |
1001 // TODO(enne): This should probably happen post-animate. | 1004 // TODO(enne): This should probably happen post-animate. |
1002 if (layer_tree_host_impl_->pending_tree()) | 1005 if (layer_tree_host_impl_->pending_tree()) |
1003 layer_tree_host_impl_->pending_tree()->UpdateDrawProperties(); | 1006 layer_tree_host_impl_->pending_tree()->UpdateDrawProperties(); |
1004 layer_tree_host_impl_->Animate(monotonic_time, wall_clock_time); | 1007 layer_tree_host_impl_->Animate(monotonic_time, wall_clock_time); |
1005 layer_tree_host_impl_->UpdateBackgroundAnimateTicking(false); | 1008 UpdateBackgroundAnimateTicking(); |
1006 | 1009 |
1007 base::TimeTicks start_time = base::TimeTicks::HighResNow(); | 1010 base::TimeTicks start_time = base::TimeTicks::HighResNow(); |
1008 base::TimeDelta draw_duration_estimate = DrawDurationEstimate(); | 1011 base::TimeDelta draw_duration_estimate = DrawDurationEstimate(); |
1009 base::AutoReset<bool> mark_inside(&inside_draw_, true); | 1012 base::AutoReset<bool> mark_inside(&inside_draw_, true); |
1010 | 1013 |
1011 // This method is called on a forced draw, regardless of whether we are able | 1014 // This method is called on a forced draw, regardless of whether we are able |
1012 // to produce a frame, as the calling site on main thread is blocked until its | 1015 // to produce a frame, as the calling site on main thread is blocked until its |
1013 // request completes, and we signal completion here. If CanDraw() is false, we | 1016 // request completes, and we signal completion here. If CanDraw() is false, we |
1014 // will indicate success=false to the caller, but we must still signal | 1017 // will indicate success=false to the caller, but we must still signal |
1015 // completion to avoid deadlock. | 1018 // completion to avoid deadlock. |
(...skipping 26 matching lines...) Expand all Loading... | |
1042 start_ready_animations = false; | 1045 start_ready_animations = false; |
1043 } | 1046 } |
1044 | 1047 |
1045 if (draw_frame) { | 1048 if (draw_frame) { |
1046 layer_tree_host_impl_->DrawLayers( | 1049 layer_tree_host_impl_->DrawLayers( |
1047 &frame, | 1050 &frame, |
1048 scheduler_on_impl_thread_->LastBeginFrameOnImplThreadTime()); | 1051 scheduler_on_impl_thread_->LastBeginFrameOnImplThreadTime()); |
1049 result.did_draw = true; | 1052 result.did_draw = true; |
1050 } | 1053 } |
1051 layer_tree_host_impl_->DidDrawAllLayers(frame); | 1054 layer_tree_host_impl_->DidDrawAllLayers(frame); |
1052 | |
1053 layer_tree_host_impl_->UpdateAnimationState(start_ready_animations); | 1055 layer_tree_host_impl_->UpdateAnimationState(start_ready_animations); |
1054 | 1056 |
1055 // Check for a pending CompositeAndReadback. | 1057 // Check for a pending CompositeAndReadback. |
1056 if (readback_request_on_impl_thread_) { | 1058 if (readback_request_on_impl_thread_) { |
1057 readback_request_on_impl_thread_->success = false; | 1059 readback_request_on_impl_thread_->success = false; |
1058 if (draw_frame) { | 1060 if (draw_frame) { |
1059 layer_tree_host_impl_->Readback(readback_request_on_impl_thread_->pixels, | 1061 layer_tree_host_impl_->Readback(readback_request_on_impl_thread_->pixels, |
1060 readback_request_on_impl_thread_->rect); | 1062 readback_request_on_impl_thread_->rect); |
1061 readback_request_on_impl_thread_->success = | 1063 readback_request_on_impl_thread_->success = |
1062 !layer_tree_host_impl_->IsContextLost(); | 1064 !layer_tree_host_impl_->IsContextLost(); |
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1493 | 1495 |
1494 if (completion_event_for_commit_held_on_tree_activation_ && | 1496 if (completion_event_for_commit_held_on_tree_activation_ && |
1495 !layer_tree_host_impl_->pending_tree()) { | 1497 !layer_tree_host_impl_->pending_tree()) { |
1496 TRACE_EVENT_INSTANT0("cc", "ReleaseCommitbyActivation", | 1498 TRACE_EVENT_INSTANT0("cc", "ReleaseCommitbyActivation", |
1497 TRACE_EVENT_SCOPE_THREAD); | 1499 TRACE_EVENT_SCOPE_THREAD); |
1498 DCHECK(layer_tree_host_impl_->settings().impl_side_painting); | 1500 DCHECK(layer_tree_host_impl_->settings().impl_side_painting); |
1499 completion_event_for_commit_held_on_tree_activation_->Signal(); | 1501 completion_event_for_commit_held_on_tree_activation_->Signal(); |
1500 completion_event_for_commit_held_on_tree_activation_ = NULL; | 1502 completion_event_for_commit_held_on_tree_activation_ = NULL; |
1501 } | 1503 } |
1502 | 1504 |
1505 UpdateBackgroundAnimateTicking(); | |
1506 | |
1503 commit_to_activate_duration_history_.InsertSample( | 1507 commit_to_activate_duration_history_.InsertSample( |
1504 base::TimeTicks::HighResNow() - commit_complete_time_); | 1508 base::TimeTicks::HighResNow() - commit_complete_time_); |
1505 } | 1509 } |
1506 | 1510 |
1507 } // namespace cc | 1511 } // namespace cc |
OLD | NEW |