| 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 565 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 576 DCHECK(IsMainThread()); | 576 DCHECK(IsMainThread()); |
| 577 return main().commit_request_sent_to_impl_thread; | 577 return main().commit_request_sent_to_impl_thread; |
| 578 } | 578 } |
| 579 | 579 |
| 580 void ThreadProxy::SetNeedsRedrawOnImplThread() { | 580 void ThreadProxy::SetNeedsRedrawOnImplThread() { |
| 581 TRACE_EVENT0("cc", "ThreadProxy::SetNeedsRedrawOnImplThread"); | 581 TRACE_EVENT0("cc", "ThreadProxy::SetNeedsRedrawOnImplThread"); |
| 582 DCHECK(IsImplThread()); | 582 DCHECK(IsImplThread()); |
| 583 impl().scheduler->SetNeedsRedraw(); | 583 impl().scheduler->SetNeedsRedraw(); |
| 584 } | 584 } |
| 585 | 585 |
| 586 void ThreadProxy::SetNeedsAnimateOnImplThread() { |
| 587 TRACE_EVENT0("cc", "ThreadProxy::SetNeedsAnimateOnImplThread"); |
| 588 DCHECK(IsImplThread()); |
| 589 impl().scheduler->SetNeedsAnimate(); |
| 590 } |
| 591 |
| 586 void ThreadProxy::SetNeedsManageTilesOnImplThread() { | 592 void ThreadProxy::SetNeedsManageTilesOnImplThread() { |
| 587 DCHECK(IsImplThread()); | 593 DCHECK(IsImplThread()); |
| 588 impl().scheduler->SetNeedsManageTiles(); | 594 impl().scheduler->SetNeedsManageTiles(); |
| 589 } | 595 } |
| 590 | 596 |
| 591 void ThreadProxy::SetNeedsRedrawRectOnImplThread(const gfx::Rect& damage_rect) { | 597 void ThreadProxy::SetNeedsRedrawRectOnImplThread(const gfx::Rect& damage_rect) { |
| 592 DCHECK(IsImplThread()); | 598 DCHECK(IsImplThread()); |
| 593 impl().layer_tree_host_impl->SetViewportDamage(damage_rect); | 599 impl().layer_tree_host_impl->SetViewportDamage(damage_rect); |
| 594 SetNeedsRedrawOnImplThread(); | 600 SetNeedsRedrawOnImplThread(); |
| 595 } | 601 } |
| (...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1050 DCHECK(impl().scheduler); | 1056 DCHECK(impl().scheduler); |
| 1051 DCHECK(impl().scheduler->CommitPending()); | 1057 DCHECK(impl().scheduler->CommitPending()); |
| 1052 DCHECK(!impl().layer_tree_host_impl->pending_tree()); | 1058 DCHECK(!impl().layer_tree_host_impl->pending_tree()); |
| 1053 | 1059 |
| 1054 if (did_handle) | 1060 if (did_handle) |
| 1055 SetInputThrottledUntilCommitOnImplThread(false); | 1061 SetInputThrottledUntilCommitOnImplThread(false); |
| 1056 impl().layer_tree_host_impl->BeginMainFrameAborted(did_handle); | 1062 impl().layer_tree_host_impl->BeginMainFrameAborted(did_handle); |
| 1057 impl().scheduler->BeginMainFrameAborted(did_handle); | 1063 impl().scheduler->BeginMainFrameAborted(did_handle); |
| 1058 } | 1064 } |
| 1059 | 1065 |
| 1066 void ThreadProxy::ScheduledActionAnimate() { |
| 1067 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionAnimate"); |
| 1068 DCHECK(IsImplThread()); |
| 1069 |
| 1070 UpdateBackgroundAnimateTicking(); |
| 1071 |
| 1072 if (!impl().animations_frozen_until_next_draw) { |
| 1073 impl().animation_time = |
| 1074 impl().layer_tree_host_impl->CurrentFrameTimeTicks(); |
| 1075 } |
| 1076 impl().layer_tree_host_impl->Animate(impl().animation_time); |
| 1077 } |
| 1078 |
| 1060 void ThreadProxy::ScheduledActionCommit() { | 1079 void ThreadProxy::ScheduledActionCommit() { |
| 1061 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionCommit"); | 1080 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionCommit"); |
| 1062 DCHECK(IsImplThread()); | 1081 DCHECK(IsImplThread()); |
| 1063 DCHECK(IsMainThreadBlocked()); | 1082 DCHECK(IsMainThreadBlocked()); |
| 1064 DCHECK(impl().commit_completion_event); | 1083 DCHECK(impl().commit_completion_event); |
| 1065 DCHECK(impl().current_resource_update_controller); | 1084 DCHECK(impl().current_resource_update_controller); |
| 1066 | 1085 |
| 1067 // Complete all remaining texture updates. | 1086 // Complete all remaining texture updates. |
| 1068 impl().current_resource_update_controller->Finalize(); | 1087 impl().current_resource_update_controller->Finalize(); |
| 1069 impl().current_resource_update_controller.reset(); | 1088 impl().current_resource_update_controller.reset(); |
| 1070 | 1089 |
| 1071 if (impl().animations_frozen_until_next_draw) { | 1090 if (impl().animations_frozen_until_next_draw) { |
| 1072 impl().animation_freeze_time = | 1091 impl().animation_time = std::max( |
| 1073 std::max(impl().animation_freeze_time, | 1092 impl().animation_time, blocked_main().last_monotonic_frame_begin_time); |
| 1074 blocked_main().last_monotonic_frame_begin_time); | |
| 1075 } | 1093 } |
| 1076 | 1094 |
| 1077 blocked_main().main_thread_inside_commit = true; | 1095 blocked_main().main_thread_inside_commit = true; |
| 1078 impl().layer_tree_host_impl->BeginCommit(); | 1096 impl().layer_tree_host_impl->BeginCommit(); |
| 1079 layer_tree_host()->BeginCommitOnImplThread(impl().layer_tree_host_impl.get()); | 1097 layer_tree_host()->BeginCommitOnImplThread(impl().layer_tree_host_impl.get()); |
| 1080 layer_tree_host()->FinishCommitOnImplThread( | 1098 layer_tree_host()->FinishCommitOnImplThread( |
| 1081 impl().layer_tree_host_impl.get()); | 1099 impl().layer_tree_host_impl.get()); |
| 1082 blocked_main().main_thread_inside_commit = false; | 1100 blocked_main().main_thread_inside_commit = false; |
| 1083 | 1101 |
| 1084 bool hold_commit = layer_tree_host()->settings().impl_side_painting && | 1102 bool hold_commit = layer_tree_host()->settings().impl_side_painting && |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1139 TRACE_EVENT_SYNTHETIC_DELAY("cc.DrawAndSwap"); | 1157 TRACE_EVENT_SYNTHETIC_DELAY("cc.DrawAndSwap"); |
| 1140 DrawSwapReadbackResult result; | 1158 DrawSwapReadbackResult result; |
| 1141 | 1159 |
| 1142 DCHECK(IsImplThread()); | 1160 DCHECK(IsImplThread()); |
| 1143 DCHECK(impl().layer_tree_host_impl.get()); | 1161 DCHECK(impl().layer_tree_host_impl.get()); |
| 1144 | 1162 |
| 1145 impl().timing_history.DidStartDrawing(); | 1163 impl().timing_history.DidStartDrawing(); |
| 1146 base::TimeDelta draw_duration_estimate = DrawDurationEstimate(); | 1164 base::TimeDelta draw_duration_estimate = DrawDurationEstimate(); |
| 1147 base::AutoReset<bool> mark_inside(&impl().inside_draw, true); | 1165 base::AutoReset<bool> mark_inside(&impl().inside_draw, true); |
| 1148 | 1166 |
| 1149 // Advance our animations. | |
| 1150 base::TimeTicks monotonic_time; | |
| 1151 if (impl().animations_frozen_until_next_draw) | |
| 1152 monotonic_time = impl().animation_freeze_time; | |
| 1153 else | |
| 1154 monotonic_time = impl().layer_tree_host_impl->CurrentFrameTimeTicks(); | |
| 1155 | |
| 1156 // TODO(enne): This should probably happen post-animate. | |
| 1157 if (impl().layer_tree_host_impl->pending_tree()) | 1167 if (impl().layer_tree_host_impl->pending_tree()) |
| 1158 impl().layer_tree_host_impl->pending_tree()->UpdateDrawProperties(); | 1168 impl().layer_tree_host_impl->pending_tree()->UpdateDrawProperties(); |
| 1159 impl().layer_tree_host_impl->Animate(monotonic_time); | |
| 1160 | 1169 |
| 1161 // This method is called on a forced draw, regardless of whether we are able | 1170 // This method is called on a forced draw, regardless of whether we are able |
| 1162 // to produce a frame, as the calling site on main thread is blocked until its | 1171 // to produce a frame, as the calling site on main thread is blocked until its |
| 1163 // request completes, and we signal completion here. If CanDraw() is false, we | 1172 // request completes, and we signal completion here. If CanDraw() is false, we |
| 1164 // will indicate success=false to the caller, but we must still signal | 1173 // will indicate success=false to the caller, but we must still signal |
| 1165 // completion to avoid deadlock. | 1174 // completion to avoid deadlock. |
| 1166 | 1175 |
| 1167 // We guard PrepareToDraw() with CanDraw() because it always returns a valid | 1176 // We guard PrepareToDraw() with CanDraw() because it always returns a valid |
| 1168 // frame, so can only be used when such a frame is possible. Since | 1177 // frame, so can only be used when such a frame is possible. Since |
| 1169 // DrawLayers() depends on the result of PrepareToDraw(), it is guarded on | 1178 // DrawLayers() depends on the result of PrepareToDraw(), it is guarded on |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1203 DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS && | 1212 DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS && |
| 1204 !impl().layer_tree_host_impl->settings().impl_side_painting) { | 1213 !impl().layer_tree_host_impl->settings().impl_side_painting) { |
| 1205 // Without impl-side painting, the animated layer that is checkerboarding | 1214 // Without impl-side painting, the animated layer that is checkerboarding |
| 1206 // will continue to checkerboard until the next commit. If this layer | 1215 // will continue to checkerboard until the next commit. If this layer |
| 1207 // continues to move during the commit, it may continue to checkerboard | 1216 // continues to move during the commit, it may continue to checkerboard |
| 1208 // after the commit since the region rasterized during the commit will not | 1217 // after the commit since the region rasterized during the commit will not |
| 1209 // match the region that is currently visible; eventually this | 1218 // match the region that is currently visible; eventually this |
| 1210 // checkerboarding will be displayed when we force a draw. To avoid this, | 1219 // checkerboarding will be displayed when we force a draw. To avoid this, |
| 1211 // we freeze animations until we successfully draw. | 1220 // we freeze animations until we successfully draw. |
| 1212 impl().animations_frozen_until_next_draw = true; | 1221 impl().animations_frozen_until_next_draw = true; |
| 1213 impl().animation_freeze_time = monotonic_time; | |
| 1214 } else { | 1222 } else { |
| 1215 DCHECK_NE(DrawSwapReadbackResult::DRAW_SUCCESS, result.draw_result); | 1223 DCHECK_NE(DrawSwapReadbackResult::DRAW_SUCCESS, result.draw_result); |
| 1216 } | 1224 } |
| 1217 impl().layer_tree_host_impl->DidDrawAllLayers(frame); | 1225 impl().layer_tree_host_impl->DidDrawAllLayers(frame); |
| 1218 | 1226 |
| 1219 bool start_ready_animations = draw_frame; | 1227 bool start_ready_animations = draw_frame; |
| 1220 impl().layer_tree_host_impl->UpdateAnimationState(start_ready_animations); | 1228 impl().layer_tree_host_impl->UpdateAnimationState(start_ready_animations); |
| 1221 | 1229 |
| 1222 // Check for a pending CompositeAndReadback. | 1230 // Check for a pending CompositeAndReadback. |
| 1223 if (drawing_for_readback) { | 1231 if (drawing_for_readback) { |
| (...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1687 | 1695 |
| 1688 impl().timing_history.DidActivatePendingTree(); | 1696 impl().timing_history.DidActivatePendingTree(); |
| 1689 } | 1697 } |
| 1690 | 1698 |
| 1691 void ThreadProxy::DidManageTiles() { | 1699 void ThreadProxy::DidManageTiles() { |
| 1692 DCHECK(IsImplThread()); | 1700 DCHECK(IsImplThread()); |
| 1693 impl().scheduler->DidManageTiles(); | 1701 impl().scheduler->DidManageTiles(); |
| 1694 } | 1702 } |
| 1695 | 1703 |
| 1696 } // namespace cc | 1704 } // namespace cc |
| OLD | NEW |