| 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 <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 118 : layer_tree_host_id(layer_tree_host_id), | 118 : layer_tree_host_id(layer_tree_host_id), |
| 119 contents_texture_manager(NULL), | 119 contents_texture_manager(NULL), |
| 120 begin_main_frame_sent_completion_event(NULL), | 120 begin_main_frame_sent_completion_event(NULL), |
| 121 readback_request(NULL), | 121 readback_request(NULL), |
| 122 commit_completion_event(NULL), | 122 commit_completion_event(NULL), |
| 123 completion_event_for_commit_held_on_tree_activation(NULL), | 123 completion_event_for_commit_held_on_tree_activation(NULL), |
| 124 next_frame_is_newly_committed_frame(false), | 124 next_frame_is_newly_committed_frame(false), |
| 125 inside_draw(false), | 125 inside_draw(false), |
| 126 input_throttled_until_commit(false), | 126 input_throttled_until_commit(false), |
| 127 animations_frozen_until_next_draw(false), | 127 animations_frozen_until_next_draw(false), |
| 128 did_commit_after_animating(false), |
| 128 renew_tree_priority_pending(false), | 129 renew_tree_priority_pending(false), |
| 129 weak_factory(proxy) {} | 130 weak_factory(proxy) { |
| 131 } |
| 130 | 132 |
| 131 ThreadProxy::CompositorThreadOnly::~CompositorThreadOnly() {} | 133 ThreadProxy::CompositorThreadOnly::~CompositorThreadOnly() {} |
| 132 | 134 |
| 133 ThreadProxy::~ThreadProxy() { | 135 ThreadProxy::~ThreadProxy() { |
| 134 TRACE_EVENT0("cc", "ThreadProxy::~ThreadProxy"); | 136 TRACE_EVENT0("cc", "ThreadProxy::~ThreadProxy"); |
| 135 DCHECK(IsMainThread()); | 137 DCHECK(IsMainThread()); |
| 136 DCHECK(!main().started); | 138 DCHECK(!main().started); |
| 137 } | 139 } |
| 138 | 140 |
| 139 bool ThreadProxy::CompositeAndReadback(void* pixels, const gfx::Rect& rect) { | 141 bool ThreadProxy::CompositeAndReadback(void* pixels, const gfx::Rect& rect) { |
| (...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 556 DCHECK(IsMainThread()); | 558 DCHECK(IsMainThread()); |
| 557 return main().commit_request_sent_to_impl_thread; | 559 return main().commit_request_sent_to_impl_thread; |
| 558 } | 560 } |
| 559 | 561 |
| 560 void ThreadProxy::SetNeedsRedrawOnImplThread() { | 562 void ThreadProxy::SetNeedsRedrawOnImplThread() { |
| 561 TRACE_EVENT0("cc", "ThreadProxy::SetNeedsRedrawOnImplThread"); | 563 TRACE_EVENT0("cc", "ThreadProxy::SetNeedsRedrawOnImplThread"); |
| 562 DCHECK(IsImplThread()); | 564 DCHECK(IsImplThread()); |
| 563 impl().scheduler->SetNeedsRedraw(); | 565 impl().scheduler->SetNeedsRedraw(); |
| 564 } | 566 } |
| 565 | 567 |
| 568 void ThreadProxy::SetNeedsAnimateOnImplThread() { |
| 569 TRACE_EVENT0("cc", "ThreadProxy::SetNeedsAnimateOnImplThread"); |
| 570 DCHECK(IsImplThread()); |
| 571 impl().scheduler->SetNeedsAnimate(); |
| 572 } |
| 573 |
| 566 void ThreadProxy::SetNeedsManageTilesOnImplThread() { | 574 void ThreadProxy::SetNeedsManageTilesOnImplThread() { |
| 567 DCHECK(IsImplThread()); | 575 DCHECK(IsImplThread()); |
| 568 impl().scheduler->SetNeedsManageTiles(); | 576 impl().scheduler->SetNeedsManageTiles(); |
| 569 } | 577 } |
| 570 | 578 |
| 571 void ThreadProxy::SetNeedsRedrawRectOnImplThread(const gfx::Rect& damage_rect) { | 579 void ThreadProxy::SetNeedsRedrawRectOnImplThread(const gfx::Rect& damage_rect) { |
| 572 DCHECK(IsImplThread()); | 580 DCHECK(IsImplThread()); |
| 573 impl().layer_tree_host_impl->SetViewportDamage(damage_rect); | 581 impl().layer_tree_host_impl->SetViewportDamage(damage_rect); |
| 574 SetNeedsRedrawOnImplThread(); | 582 SetNeedsRedrawOnImplThread(); |
| 575 } | 583 } |
| (...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1013 DCHECK(impl().scheduler); | 1021 DCHECK(impl().scheduler); |
| 1014 DCHECK(impl().scheduler->CommitPending()); | 1022 DCHECK(impl().scheduler->CommitPending()); |
| 1015 DCHECK(!impl().layer_tree_host_impl->pending_tree()); | 1023 DCHECK(!impl().layer_tree_host_impl->pending_tree()); |
| 1016 | 1024 |
| 1017 if (did_handle) | 1025 if (did_handle) |
| 1018 SetInputThrottledUntilCommitOnImplThread(false); | 1026 SetInputThrottledUntilCommitOnImplThread(false); |
| 1019 impl().layer_tree_host_impl->BeginMainFrameAborted(did_handle); | 1027 impl().layer_tree_host_impl->BeginMainFrameAborted(did_handle); |
| 1020 impl().scheduler->BeginMainFrameAborted(did_handle); | 1028 impl().scheduler->BeginMainFrameAborted(did_handle); |
| 1021 } | 1029 } |
| 1022 | 1030 |
| 1031 void ThreadProxy::ScheduledActionAnimate() { |
| 1032 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionAnimate"); |
| 1033 DCHECK(IsImplThread()); |
| 1034 |
| 1035 if (!impl().animations_frozen_until_next_draw) { |
| 1036 impl().animation_time = |
| 1037 impl().layer_tree_host_impl->CurrentFrameTimeTicks(); |
| 1038 } |
| 1039 impl().layer_tree_host_impl->Animate(impl().animation_time); |
| 1040 impl().did_commit_after_animating = false; |
| 1041 } |
| 1042 |
| 1023 void ThreadProxy::ScheduledActionCommit() { | 1043 void ThreadProxy::ScheduledActionCommit() { |
| 1024 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionCommit"); | 1044 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionCommit"); |
| 1025 DCHECK(IsImplThread()); | 1045 DCHECK(IsImplThread()); |
| 1026 DCHECK(IsMainThreadBlocked()); | 1046 DCHECK(IsMainThreadBlocked()); |
| 1027 DCHECK(impl().commit_completion_event); | 1047 DCHECK(impl().commit_completion_event); |
| 1028 DCHECK(impl().current_resource_update_controller); | 1048 DCHECK(impl().current_resource_update_controller); |
| 1029 | 1049 |
| 1030 // Complete all remaining texture updates. | 1050 // Complete all remaining texture updates. |
| 1031 impl().current_resource_update_controller->Finalize(); | 1051 impl().current_resource_update_controller->Finalize(); |
| 1032 impl().current_resource_update_controller.reset(); | 1052 impl().current_resource_update_controller.reset(); |
| 1033 | 1053 |
| 1034 if (impl().animations_frozen_until_next_draw) { | 1054 if (impl().animations_frozen_until_next_draw) { |
| 1035 impl().animation_freeze_time = | 1055 impl().animation_time = std::max( |
| 1036 std::max(impl().animation_freeze_time, | 1056 impl().animation_time, blocked_main().last_monotonic_frame_begin_time); |
| 1037 blocked_main().last_monotonic_frame_begin_time); | |
| 1038 } | 1057 } |
| 1058 impl().did_commit_after_animating = true; |
| 1039 | 1059 |
| 1040 blocked_main().main_thread_inside_commit = true; | 1060 blocked_main().main_thread_inside_commit = true; |
| 1041 impl().layer_tree_host_impl->BeginCommit(); | 1061 impl().layer_tree_host_impl->BeginCommit(); |
| 1042 layer_tree_host()->BeginCommitOnImplThread(impl().layer_tree_host_impl.get()); | 1062 layer_tree_host()->BeginCommitOnImplThread(impl().layer_tree_host_impl.get()); |
| 1043 layer_tree_host()->FinishCommitOnImplThread( | 1063 layer_tree_host()->FinishCommitOnImplThread( |
| 1044 impl().layer_tree_host_impl.get()); | 1064 impl().layer_tree_host_impl.get()); |
| 1045 blocked_main().main_thread_inside_commit = false; | 1065 blocked_main().main_thread_inside_commit = false; |
| 1046 | 1066 |
| 1047 bool hold_commit = layer_tree_host()->settings().impl_side_painting && | 1067 bool hold_commit = layer_tree_host()->settings().impl_side_painting && |
| 1048 blocked_main().commit_waits_for_activation; | 1068 blocked_main().commit_waits_for_activation; |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1102 TRACE_EVENT_SYNTHETIC_DELAY("cc.DrawAndSwap"); | 1122 TRACE_EVENT_SYNTHETIC_DELAY("cc.DrawAndSwap"); |
| 1103 DrawSwapReadbackResult result; | 1123 DrawSwapReadbackResult result; |
| 1104 | 1124 |
| 1105 DCHECK(IsImplThread()); | 1125 DCHECK(IsImplThread()); |
| 1106 DCHECK(impl().layer_tree_host_impl.get()); | 1126 DCHECK(impl().layer_tree_host_impl.get()); |
| 1107 | 1127 |
| 1108 impl().timing_history.DidStartDrawing(); | 1128 impl().timing_history.DidStartDrawing(); |
| 1109 base::TimeDelta draw_duration_estimate = DrawDurationEstimate(); | 1129 base::TimeDelta draw_duration_estimate = DrawDurationEstimate(); |
| 1110 base::AutoReset<bool> mark_inside(&impl().inside_draw, true); | 1130 base::AutoReset<bool> mark_inside(&impl().inside_draw, true); |
| 1111 | 1131 |
| 1112 // Advance our animations. | 1132 if (impl().did_commit_after_animating) { |
| 1113 base::TimeTicks monotonic_time; | 1133 impl().layer_tree_host_impl->Animate(impl().animation_time); |
| 1114 if (impl().animations_frozen_until_next_draw) | 1134 impl().did_commit_after_animating = false; |
| 1115 monotonic_time = impl().animation_freeze_time; | 1135 } |
| 1116 else | |
| 1117 monotonic_time = impl().layer_tree_host_impl->CurrentFrameTimeTicks(); | |
| 1118 | 1136 |
| 1119 // TODO(enne): This should probably happen post-animate. | |
| 1120 if (impl().layer_tree_host_impl->pending_tree()) | 1137 if (impl().layer_tree_host_impl->pending_tree()) |
| 1121 impl().layer_tree_host_impl->pending_tree()->UpdateDrawProperties(); | 1138 impl().layer_tree_host_impl->pending_tree()->UpdateDrawProperties(); |
| 1122 impl().layer_tree_host_impl->Animate(monotonic_time); | |
| 1123 | 1139 |
| 1124 // This method is called on a forced draw, regardless of whether we are able | 1140 // This method is called on a forced draw, regardless of whether we are able |
| 1125 // to produce a frame, as the calling site on main thread is blocked until its | 1141 // to produce a frame, as the calling site on main thread is blocked until its |
| 1126 // request completes, and we signal completion here. If CanDraw() is false, we | 1142 // request completes, and we signal completion here. If CanDraw() is false, we |
| 1127 // will indicate success=false to the caller, but we must still signal | 1143 // will indicate success=false to the caller, but we must still signal |
| 1128 // completion to avoid deadlock. | 1144 // completion to avoid deadlock. |
| 1129 | 1145 |
| 1130 // We guard PrepareToDraw() with CanDraw() because it always returns a valid | 1146 // We guard PrepareToDraw() with CanDraw() because it always returns a valid |
| 1131 // frame, so can only be used when such a frame is possible. Since | 1147 // frame, so can only be used when such a frame is possible. Since |
| 1132 // DrawLayers() depends on the result of PrepareToDraw(), it is guarded on | 1148 // DrawLayers() depends on the result of PrepareToDraw(), it is guarded on |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1166 DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS && | 1182 DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS && |
| 1167 !impl().layer_tree_host_impl->settings().impl_side_painting) { | 1183 !impl().layer_tree_host_impl->settings().impl_side_painting) { |
| 1168 // Without impl-side painting, the animated layer that is checkerboarding | 1184 // Without impl-side painting, the animated layer that is checkerboarding |
| 1169 // will continue to checkerboard until the next commit. If this layer | 1185 // will continue to checkerboard until the next commit. If this layer |
| 1170 // continues to move during the commit, it may continue to checkerboard | 1186 // continues to move during the commit, it may continue to checkerboard |
| 1171 // after the commit since the region rasterized during the commit will not | 1187 // after the commit since the region rasterized during the commit will not |
| 1172 // match the region that is currently visible; eventually this | 1188 // match the region that is currently visible; eventually this |
| 1173 // checkerboarding will be displayed when we force a draw. To avoid this, | 1189 // checkerboarding will be displayed when we force a draw. To avoid this, |
| 1174 // we freeze animations until we successfully draw. | 1190 // we freeze animations until we successfully draw. |
| 1175 impl().animations_frozen_until_next_draw = true; | 1191 impl().animations_frozen_until_next_draw = true; |
| 1176 impl().animation_freeze_time = monotonic_time; | |
| 1177 } else { | 1192 } else { |
| 1178 DCHECK_NE(DrawSwapReadbackResult::DRAW_SUCCESS, result.draw_result); | 1193 DCHECK_NE(DrawSwapReadbackResult::DRAW_SUCCESS, result.draw_result); |
| 1179 } | 1194 } |
| 1180 impl().layer_tree_host_impl->DidDrawAllLayers(frame); | 1195 impl().layer_tree_host_impl->DidDrawAllLayers(frame); |
| 1181 | 1196 |
| 1182 bool start_ready_animations = draw_frame; | 1197 bool start_ready_animations = draw_frame; |
| 1183 impl().layer_tree_host_impl->UpdateAnimationState(start_ready_animations); | 1198 impl().layer_tree_host_impl->UpdateAnimationState(start_ready_animations); |
| 1184 | 1199 |
| 1185 // Check for a pending CompositeAndReadback. | 1200 // Check for a pending CompositeAndReadback. |
| 1186 if (drawing_for_readback) { | 1201 if (drawing_for_readback) { |
| (...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1644 | 1659 |
| 1645 impl().timing_history.DidActivatePendingTree(); | 1660 impl().timing_history.DidActivatePendingTree(); |
| 1646 } | 1661 } |
| 1647 | 1662 |
| 1648 void ThreadProxy::DidManageTiles() { | 1663 void ThreadProxy::DidManageTiles() { |
| 1649 DCHECK(IsImplThread()); | 1664 DCHECK(IsImplThread()); |
| 1650 impl().scheduler->DidManageTiles(); | 1665 impl().scheduler->DidManageTiles(); |
| 1651 } | 1666 } |
| 1652 | 1667 |
| 1653 } // namespace cc | 1668 } // namespace cc |
| OLD | NEW |