| 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 1077 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1088 | 1088 |
| 1089 void ThreadProxy::ScheduledActionBeginOutputSurfaceCreation() { | 1089 void ThreadProxy::ScheduledActionBeginOutputSurfaceCreation() { |
| 1090 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionBeginOutputSurfaceCreation"); | 1090 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionBeginOutputSurfaceCreation"); |
| 1091 DCHECK(IsImplThread()); | 1091 DCHECK(IsImplThread()); |
| 1092 Proxy::MainThreadTaskRunner()->PostTask( | 1092 Proxy::MainThreadTaskRunner()->PostTask( |
| 1093 FROM_HERE, | 1093 FROM_HERE, |
| 1094 base::Bind(&ThreadProxy::CreateAndInitializeOutputSurface, | 1094 base::Bind(&ThreadProxy::CreateAndInitializeOutputSurface, |
| 1095 main_thread_weak_ptr_)); | 1095 main_thread_weak_ptr_)); |
| 1096 } | 1096 } |
| 1097 | 1097 |
| 1098 DrawSwapReadbackResult ThreadProxy::DrawSwapReadbackInternal( | 1098 DrawResult ThreadProxy::DrawSwapReadbackInternal( |
| 1099 bool forced_draw, | 1099 bool forced_draw, |
| 1100 bool swap_requested, | 1100 bool swap_requested, |
| 1101 bool readback_requested) { | 1101 bool readback_requested) { |
| 1102 TRACE_EVENT_SYNTHETIC_DELAY("cc.DrawAndSwap"); | 1102 TRACE_EVENT_SYNTHETIC_DELAY("cc.DrawAndSwap"); |
| 1103 DrawSwapReadbackResult result; | 1103 DrawResult result; |
| 1104 | 1104 |
| 1105 DCHECK(IsImplThread()); | 1105 DCHECK(IsImplThread()); |
| 1106 DCHECK(impl().layer_tree_host_impl.get()); | 1106 DCHECK(impl().layer_tree_host_impl.get()); |
| 1107 | 1107 |
| 1108 impl().timing_history.DidStartDrawing(); | 1108 impl().timing_history.DidStartDrawing(); |
| 1109 base::TimeDelta draw_duration_estimate = DrawDurationEstimate(); | 1109 base::TimeDelta draw_duration_estimate = DrawDurationEstimate(); |
| 1110 base::AutoReset<bool> mark_inside(&impl().inside_draw, true); | 1110 base::AutoReset<bool> mark_inside(&impl().inside_draw, true); |
| 1111 | 1111 |
| 1112 // Advance our animations. | 1112 // Advance our animations. |
| 1113 base::TimeTicks monotonic_time; | 1113 base::TimeTicks monotonic_time; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1139 LayerTreeHostImpl::FrameData frame; | 1139 LayerTreeHostImpl::FrameData frame; |
| 1140 bool draw_frame = false; | 1140 bool draw_frame = false; |
| 1141 | 1141 |
| 1142 if (impl().layer_tree_host_impl->CanDraw()) { | 1142 if (impl().layer_tree_host_impl->CanDraw()) { |
| 1143 if (!drawing_for_readback || can_do_readback) { | 1143 if (!drawing_for_readback || can_do_readback) { |
| 1144 // If it is for a readback, make sure we draw the portion being read back. | 1144 // If it is for a readback, make sure we draw the portion being read back. |
| 1145 gfx::Rect readback_rect; | 1145 gfx::Rect readback_rect; |
| 1146 if (drawing_for_readback) | 1146 if (drawing_for_readback) |
| 1147 readback_rect = impl().readback_request->rect; | 1147 readback_rect = impl().readback_request->rect; |
| 1148 | 1148 |
| 1149 result.draw_result = | 1149 result = |
| 1150 impl().layer_tree_host_impl->PrepareToDraw(&frame, readback_rect); | 1150 impl().layer_tree_host_impl->PrepareToDraw(&frame, readback_rect); |
| 1151 draw_frame = forced_draw || | 1151 draw_frame = forced_draw || result == DRAW_SUCCESS; |
| 1152 result.draw_result == DrawSwapReadbackResult::DRAW_SUCCESS; | |
| 1153 } else { | 1152 } else { |
| 1154 result.draw_result = DrawSwapReadbackResult::DRAW_ABORTED_CANT_READBACK; | 1153 result = DRAW_ABORTED_CANT_READBACK; |
| 1155 } | 1154 } |
| 1156 } else { | 1155 } else { |
| 1157 result.draw_result = DrawSwapReadbackResult::DRAW_ABORTED_CANT_DRAW; | 1156 result = DRAW_ABORTED_CANT_DRAW; |
| 1158 } | 1157 } |
| 1159 | 1158 |
| 1160 if (draw_frame) { | 1159 if (draw_frame) { |
| 1161 impl().layer_tree_host_impl->DrawLayers( | 1160 impl().layer_tree_host_impl->DrawLayers( |
| 1162 &frame, impl().scheduler->LastBeginImplFrameTime()); | 1161 &frame, impl().scheduler->LastBeginImplFrameTime()); |
| 1163 result.draw_result = DrawSwapReadbackResult::DRAW_SUCCESS; | 1162 result = DRAW_SUCCESS; |
| 1164 impl().animations_frozen_until_next_draw = false; | 1163 impl().animations_frozen_until_next_draw = false; |
| 1165 } else if (result.draw_result == | 1164 } else if (result == DRAW_ABORTED_CHECKERBOARD_ANIMATIONS && |
| 1166 DrawSwapReadbackResult::DRAW_ABORTED_CHECKERBOARD_ANIMATIONS && | |
| 1167 !impl().layer_tree_host_impl->settings().impl_side_painting) { | 1165 !impl().layer_tree_host_impl->settings().impl_side_painting) { |
| 1168 // Without impl-side painting, the animated layer that is checkerboarding | 1166 // Without impl-side painting, the animated layer that is checkerboarding |
| 1169 // will continue to checkerboard until the next commit. If this layer | 1167 // will continue to checkerboard until the next commit. If this layer |
| 1170 // continues to move during the commit, it may continue to checkerboard | 1168 // continues to move during the commit, it may continue to checkerboard |
| 1171 // after the commit since the region rasterized during the commit will not | 1169 // after the commit since the region rasterized during the commit will not |
| 1172 // match the region that is currently visible; eventually this | 1170 // match the region that is currently visible; eventually this |
| 1173 // checkerboarding will be displayed when we force a draw. To avoid this, | 1171 // checkerboarding will be displayed when we force a draw. To avoid this, |
| 1174 // we freeze animations until we successfully draw. | 1172 // we freeze animations until we successfully draw. |
| 1175 impl().animations_frozen_until_next_draw = true; | 1173 impl().animations_frozen_until_next_draw = true; |
| 1176 impl().animation_freeze_time = monotonic_time; | 1174 impl().animation_freeze_time = monotonic_time; |
| 1177 } else { | 1175 } else { |
| 1178 DCHECK_NE(DrawSwapReadbackResult::DRAW_SUCCESS, result.draw_result); | 1176 DCHECK_NE(DRAW_SUCCESS, result); |
| 1179 } | 1177 } |
| 1180 impl().layer_tree_host_impl->DidDrawAllLayers(frame); | 1178 impl().layer_tree_host_impl->DidDrawAllLayers(frame); |
| 1181 | 1179 |
| 1182 bool start_ready_animations = draw_frame; | 1180 bool start_ready_animations = draw_frame; |
| 1183 impl().layer_tree_host_impl->UpdateAnimationState(start_ready_animations); | 1181 impl().layer_tree_host_impl->UpdateAnimationState(start_ready_animations); |
| 1184 | 1182 |
| 1185 // Check for a pending CompositeAndReadback. | 1183 // Check for a pending CompositeAndReadback. |
| 1186 if (drawing_for_readback) { | 1184 if (drawing_for_readback) { |
| 1187 DCHECK(!swap_requested); | 1185 DCHECK(!swap_requested); |
| 1188 result.did_readback = false; | 1186 bool did_readback = false; |
| 1189 if (draw_frame) { | 1187 if (draw_frame) { |
| 1190 if (!impl().layer_tree_host_impl->IsContextLost()) { | 1188 if (!impl().layer_tree_host_impl->IsContextLost()) { |
| 1191 impl().layer_tree_host_impl->Readback(impl().readback_request->pixels, | 1189 impl().layer_tree_host_impl->Readback(impl().readback_request->pixels, |
| 1192 impl().readback_request->rect); | 1190 impl().readback_request->rect); |
| 1193 result.did_readback = true; | 1191 did_readback = true; |
| 1194 } else { | 1192 } else { |
| 1195 result.draw_result = DrawSwapReadbackResult::DRAW_ABORTED_CONTEXT_LOST; | 1193 result = DRAW_ABORTED_CONTEXT_LOST; |
| 1196 } | 1194 } |
| 1197 } | 1195 } |
| 1198 impl().readback_request->success = result.did_readback; | 1196 impl().readback_request->success = did_readback; |
| 1199 impl().readback_request->completion.Signal(); | 1197 impl().readback_request->completion.Signal(); |
| 1200 impl().readback_request = NULL; | 1198 impl().readback_request = NULL; |
| 1201 } else if (draw_frame) { | 1199 } else if (draw_frame) { |
| 1202 DCHECK(swap_requested); | 1200 DCHECK(swap_requested); |
| 1203 result.did_request_swap = impl().layer_tree_host_impl->SwapBuffers(frame); | 1201 bool did_request_swap = impl().layer_tree_host_impl->SwapBuffers(frame); |
| 1204 | 1202 |
| 1205 // We don't know if we have incomplete tiles if we didn't actually swap. | 1203 // We don't know if we have incomplete tiles if we didn't actually swap. |
| 1206 if (result.did_request_swap) { | 1204 if (did_request_swap) { |
| 1207 DCHECK(!frame.has_no_damage); | 1205 DCHECK(!frame.has_no_damage); |
| 1208 SetSwapUsedIncompleteTileOnImplThread(frame.contains_incomplete_tile); | 1206 SetSwapUsedIncompleteTileOnImplThread(frame.contains_incomplete_tile); |
| 1209 } | 1207 } |
| 1210 } | 1208 } |
| 1211 | 1209 |
| 1212 // Tell the main thread that the the newly-commited frame was drawn. | 1210 // Tell the main thread that the the newly-commited frame was drawn. |
| 1213 if (impl().next_frame_is_newly_committed_frame) { | 1211 if (impl().next_frame_is_newly_committed_frame) { |
| 1214 impl().next_frame_is_newly_committed_frame = false; | 1212 impl().next_frame_is_newly_committed_frame = false; |
| 1215 Proxy::MainThreadTaskRunner()->PostTask( | 1213 Proxy::MainThreadTaskRunner()->PostTask( |
| 1216 FROM_HERE, | 1214 FROM_HERE, |
| 1217 base::Bind(&ThreadProxy::DidCommitAndDrawFrame, main_thread_weak_ptr_)); | 1215 base::Bind(&ThreadProxy::DidCommitAndDrawFrame, main_thread_weak_ptr_)); |
| 1218 } | 1216 } |
| 1219 | 1217 |
| 1220 if (draw_frame) | 1218 if (draw_frame) |
| 1221 CheckOutputSurfaceStatusOnImplThread(); | 1219 CheckOutputSurfaceStatusOnImplThread(); |
| 1222 | 1220 |
| 1223 if (result.draw_result == DrawSwapReadbackResult::DRAW_SUCCESS) { | 1221 if (result == DRAW_SUCCESS) { |
| 1224 base::TimeDelta draw_duration = impl().timing_history.DidFinishDrawing(); | 1222 base::TimeDelta draw_duration = impl().timing_history.DidFinishDrawing(); |
| 1225 | 1223 |
| 1226 base::TimeDelta draw_duration_overestimate; | 1224 base::TimeDelta draw_duration_overestimate; |
| 1227 base::TimeDelta draw_duration_underestimate; | 1225 base::TimeDelta draw_duration_underestimate; |
| 1228 if (draw_duration > draw_duration_estimate) | 1226 if (draw_duration > draw_duration_estimate) |
| 1229 draw_duration_underestimate = draw_duration - draw_duration_estimate; | 1227 draw_duration_underestimate = draw_duration - draw_duration_estimate; |
| 1230 else | 1228 else |
| 1231 draw_duration_overestimate = draw_duration_estimate - draw_duration; | 1229 draw_duration_overestimate = draw_duration_estimate - draw_duration; |
| 1232 UMA_HISTOGRAM_CUSTOM_TIMES("Renderer.DrawDuration", | 1230 UMA_HISTOGRAM_CUSTOM_TIMES("Renderer.DrawDuration", |
| 1233 draw_duration, | 1231 draw_duration, |
| 1234 base::TimeDelta::FromMilliseconds(1), | 1232 base::TimeDelta::FromMilliseconds(1), |
| 1235 base::TimeDelta::FromMilliseconds(100), | 1233 base::TimeDelta::FromMilliseconds(100), |
| 1236 50); | 1234 50); |
| 1237 UMA_HISTOGRAM_CUSTOM_TIMES("Renderer.DrawDurationUnderestimate", | 1235 UMA_HISTOGRAM_CUSTOM_TIMES("Renderer.DrawDurationUnderestimate", |
| 1238 draw_duration_underestimate, | 1236 draw_duration_underestimate, |
| 1239 base::TimeDelta::FromMilliseconds(1), | 1237 base::TimeDelta::FromMilliseconds(1), |
| 1240 base::TimeDelta::FromMilliseconds(100), | 1238 base::TimeDelta::FromMilliseconds(100), |
| 1241 50); | 1239 50); |
| 1242 UMA_HISTOGRAM_CUSTOM_TIMES("Renderer.DrawDurationOverestimate", | 1240 UMA_HISTOGRAM_CUSTOM_TIMES("Renderer.DrawDurationOverestimate", |
| 1243 draw_duration_overestimate, | 1241 draw_duration_overestimate, |
| 1244 base::TimeDelta::FromMilliseconds(1), | 1242 base::TimeDelta::FromMilliseconds(1), |
| 1245 base::TimeDelta::FromMilliseconds(100), | 1243 base::TimeDelta::FromMilliseconds(100), |
| 1246 50); | 1244 50); |
| 1247 } | 1245 } |
| 1248 | 1246 |
| 1249 DCHECK_NE(DrawSwapReadbackResult::INVALID_RESULT, result.draw_result); | 1247 DCHECK_NE(INVALID_RESULT, result); |
| 1250 return result; | 1248 return result; |
| 1251 } | 1249 } |
| 1252 | 1250 |
| 1253 void ThreadProxy::ScheduledActionManageTiles() { | 1251 void ThreadProxy::ScheduledActionManageTiles() { |
| 1254 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionManageTiles"); | 1252 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionManageTiles"); |
| 1255 DCHECK(impl().layer_tree_host_impl->settings().impl_side_painting); | 1253 DCHECK(impl().layer_tree_host_impl->settings().impl_side_painting); |
| 1256 impl().layer_tree_host_impl->ManageTiles(); | 1254 impl().layer_tree_host_impl->ManageTiles(); |
| 1257 } | 1255 } |
| 1258 | 1256 |
| 1259 DrawSwapReadbackResult ThreadProxy::ScheduledActionDrawAndSwapIfPossible() { | 1257 DrawResult ThreadProxy::ScheduledActionDrawAndSwapIfPossible() { |
| 1260 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionDrawAndSwap"); | 1258 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionDrawAndSwap"); |
| 1261 | 1259 |
| 1262 // SchedulerStateMachine::DidDrawIfPossibleCompleted isn't set up to | 1260 // SchedulerStateMachine::DidDrawIfPossibleCompleted isn't set up to |
| 1263 // handle DRAW_ABORTED_CANT_DRAW. Moreover, the scheduler should | 1261 // handle DRAW_ABORTED_CANT_DRAW. Moreover, the scheduler should |
| 1264 // never generate this call when it can't draw. | 1262 // never generate this call when it can't draw. |
| 1265 DCHECK(impl().layer_tree_host_impl->CanDraw()); | 1263 DCHECK(impl().layer_tree_host_impl->CanDraw()); |
| 1266 | 1264 |
| 1267 bool forced_draw = false; | 1265 bool forced_draw = false; |
| 1268 bool swap_requested = true; | 1266 bool swap_requested = true; |
| 1269 bool readback_requested = false; | 1267 bool readback_requested = false; |
| 1270 return DrawSwapReadbackInternal( | 1268 return DrawSwapReadbackInternal( |
| 1271 forced_draw, swap_requested, readback_requested); | 1269 forced_draw, swap_requested, readback_requested); |
| 1272 } | 1270 } |
| 1273 | 1271 |
| 1274 DrawSwapReadbackResult ThreadProxy::ScheduledActionDrawAndSwapForced() { | 1272 DrawResult ThreadProxy::ScheduledActionDrawAndSwapForced() { |
| 1275 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionDrawAndSwapForced"); | 1273 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionDrawAndSwapForced"); |
| 1276 bool forced_draw = true; | 1274 bool forced_draw = true; |
| 1277 bool swap_requested = true; | 1275 bool swap_requested = true; |
| 1278 bool readback_requested = false; | 1276 bool readback_requested = false; |
| 1279 return DrawSwapReadbackInternal( | 1277 return DrawSwapReadbackInternal( |
| 1280 forced_draw, swap_requested, readback_requested); | 1278 forced_draw, swap_requested, readback_requested); |
| 1281 } | 1279 } |
| 1282 | 1280 |
| 1283 DrawSwapReadbackResult ThreadProxy::ScheduledActionDrawAndReadback() { | 1281 DrawResult ThreadProxy::ScheduledActionDrawAndReadback() { |
| 1284 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionDrawAndReadback"); | 1282 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionDrawAndReadback"); |
| 1285 bool forced_draw = true; | 1283 bool forced_draw = true; |
| 1286 bool swap_requested = false; | 1284 bool swap_requested = false; |
| 1287 bool readback_requested = true; | 1285 bool readback_requested = true; |
| 1288 return DrawSwapReadbackInternal( | 1286 return DrawSwapReadbackInternal( |
| 1289 forced_draw, swap_requested, readback_requested); | 1287 forced_draw, swap_requested, readback_requested); |
| 1290 } | 1288 } |
| 1291 | 1289 |
| 1292 void ThreadProxy::DidAnticipatedDrawTimeChange(base::TimeTicks time) { | 1290 void ThreadProxy::DidAnticipatedDrawTimeChange(base::TimeTicks time) { |
| 1293 if (impl().current_resource_update_controller) | 1291 if (impl().current_resource_update_controller) |
| (...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1644 | 1642 |
| 1645 impl().timing_history.DidActivatePendingTree(); | 1643 impl().timing_history.DidActivatePendingTree(); |
| 1646 } | 1644 } |
| 1647 | 1645 |
| 1648 void ThreadProxy::DidManageTiles() { | 1646 void ThreadProxy::DidManageTiles() { |
| 1649 DCHECK(IsImplThread()); | 1647 DCHECK(IsImplThread()); |
| 1650 impl().scheduler->DidManageTiles(); | 1648 impl().scheduler->DidManageTiles(); |
| 1651 } | 1649 } |
| 1652 | 1650 |
| 1653 } // namespace cc | 1651 } // namespace cc |
| OLD | NEW |