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