Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(24)

Side by Side Diff: cc/trees/thread_proxy.cc

Issue 24304002: cc: Implement deadline scheduling disabled by default (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: rebase Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/trees/thread_proxy.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 379 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 Proxy::MainThreadTaskRunner()->PostTask( 390 Proxy::MainThreadTaskRunner()->PostTask(
391 FROM_HERE, 391 FROM_HERE,
392 base::Bind(&ThreadProxy::DidCompleteSwapBuffers, main_thread_weak_ptr_)); 392 base::Bind(&ThreadProxy::DidCompleteSwapBuffers, main_thread_weak_ptr_));
393 } 393 }
394 394
395 void ThreadProxy::SetNeedsBeginFrameOnImplThread(bool enable) { 395 void ThreadProxy::SetNeedsBeginFrameOnImplThread(bool enable) {
396 DCHECK(IsImplThread()); 396 DCHECK(IsImplThread());
397 TRACE_EVENT1("cc", "ThreadProxy::SetNeedsBeginFrameOnImplThread", 397 TRACE_EVENT1("cc", "ThreadProxy::SetNeedsBeginFrameOnImplThread",
398 "enable", enable); 398 "enable", enable);
399 layer_tree_host_impl_->SetNeedsBeginFrame(enable); 399 layer_tree_host_impl_->SetNeedsBeginFrame(enable);
400 UpdateBackgroundAnimateTicking();
400 } 401 }
401 402
402 void ThreadProxy::BeginFrameOnImplThread(const BeginFrameArgs& args) { 403 void ThreadProxy::BeginFrameOnImplThread(const BeginFrameArgs& args) {
403 DCHECK(IsImplThread()); 404 DCHECK(IsImplThread());
404 TRACE_EVENT0("cc", "ThreadProxy::BeginFrameOnImplThread"); 405 TRACE_EVENT0("cc", "ThreadProxy::BeginFrameOnImplThread");
406
407 // Sample the frame time now. This time will be used for updating animations
408 // when we draw.
409 layer_tree_host_impl_->CurrentFrameTimeTicks();
410
405 scheduler_on_impl_thread_->BeginFrame(args); 411 scheduler_on_impl_thread_->BeginFrame(args);
406 } 412 }
407 413
414 void ThreadProxy::DidBeginFrameDeadlineOnImplThread() {
415 layer_tree_host_impl_->ResetCurrentFrameTimeForNextFrame();
416 }
417
408 void ThreadProxy::OnCanDrawStateChanged(bool can_draw) { 418 void ThreadProxy::OnCanDrawStateChanged(bool can_draw) {
409 DCHECK(IsImplThread()); 419 DCHECK(IsImplThread());
410 TRACE_EVENT1( 420 TRACE_EVENT1(
411 "cc", "ThreadProxy::OnCanDrawStateChanged", "can_draw", can_draw); 421 "cc", "ThreadProxy::OnCanDrawStateChanged", "can_draw", can_draw);
412 scheduler_on_impl_thread_->SetCanDraw(can_draw); 422 scheduler_on_impl_thread_->SetCanDraw(can_draw);
413 UpdateBackgroundAnimateTicking(); 423 UpdateBackgroundAnimateTicking();
414 } 424 }
415 425
416 void ThreadProxy::NotifyReadyToActivate() { 426 void ThreadProxy::NotifyReadyToActivate() {
417 TRACE_EVENT0("cc", "ThreadProxy::NotifyReadyToActivate"); 427 TRACE_EVENT0("cc", "ThreadProxy::NotifyReadyToActivate");
(...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after
1028 result.did_readback = false; 1038 result.did_readback = false;
1029 DCHECK(IsImplThread()); 1039 DCHECK(IsImplThread());
1030 DCHECK(layer_tree_host_impl_.get()); 1040 DCHECK(layer_tree_host_impl_.get());
1031 if (!layer_tree_host_impl_) 1041 if (!layer_tree_host_impl_)
1032 return result; 1042 return result;
1033 1043
1034 DCHECK(layer_tree_host_impl_->renderer()); 1044 DCHECK(layer_tree_host_impl_->renderer());
1035 if (!layer_tree_host_impl_->renderer()) 1045 if (!layer_tree_host_impl_->renderer())
1036 return result; 1046 return result;
1037 1047
1038 base::TimeTicks monotonic_time =
1039 layer_tree_host_impl_->CurrentFrameTimeTicks();
1040 base::Time wall_clock_time = layer_tree_host_impl_->CurrentFrameTime();
1041
1042 // TODO(enne): This should probably happen post-animate.
1043 if (layer_tree_host_impl_->pending_tree())
1044 layer_tree_host_impl_->pending_tree()->UpdateDrawProperties();
1045 layer_tree_host_impl_->Animate(monotonic_time, wall_clock_time);
1046 UpdateBackgroundAnimateTicking();
1047
1048 base::TimeTicks start_time = base::TimeTicks::HighResNow(); 1048 base::TimeTicks start_time = base::TimeTicks::HighResNow();
1049 base::TimeDelta draw_duration_estimate = DrawDurationEstimate(); 1049 base::TimeDelta draw_duration_estimate = DrawDurationEstimate();
1050 base::AutoReset<bool> mark_inside(&inside_draw_, true); 1050 base::AutoReset<bool> mark_inside(&inside_draw_, true);
1051 1051
1052 // Advance our animations.
1053 base::TimeTicks monotonic_time =
1054 layer_tree_host_impl_->CurrentFrameTimeTicks();
1055 base::Time wall_clock_time = layer_tree_host_impl_->CurrentFrameTime();
1056 layer_tree_host_impl_->Animate(monotonic_time, wall_clock_time);
1057
1052 // This method is called on a forced draw, regardless of whether we are able 1058 // This method is called on a forced draw, regardless of whether we are able
1053 // to produce a frame, as the calling site on main thread is blocked until its 1059 // to produce a frame, as the calling site on main thread is blocked until its
1054 // request completes, and we signal completion here. If CanDraw() is false, we 1060 // request completes, and we signal completion here. If CanDraw() is false, we
1055 // will indicate success=false to the caller, but we must still signal 1061 // will indicate success=false to the caller, but we must still signal
1056 // completion to avoid deadlock. 1062 // completion to avoid deadlock.
1057 1063
1058 // We guard PrepareToDraw() with CanDraw() because it always returns a valid 1064 // We guard PrepareToDraw() with CanDraw() because it always returns a valid
1059 // frame, so can only be used when such a frame is possible. Since 1065 // frame, so can only be used when such a frame is possible. Since
1060 // DrawLayers() depends on the result of PrepareToDraw(), it is guarded on 1066 // DrawLayers() depends on the result of PrepareToDraw(), it is guarded on
1061 // CanDraw() as well. 1067 // CanDraw() as well.
1062 1068
1063 // readback_request_on_impl_thread_ may be for the pending tree, do
1064 // not perform the readback unless explicitly requested.
1065 bool drawing_for_readback = 1069 bool drawing_for_readback =
1066 readback_requested && !!readback_request_on_impl_thread_; 1070 readback_requested && !!readback_request_on_impl_thread_;
1067 bool can_do_readback = layer_tree_host_impl_->renderer()->CanReadPixels(); 1071 bool can_do_readback = layer_tree_host_impl_->renderer()->CanReadPixels();
1068 1072
1069 LayerTreeHostImpl::FrameData frame; 1073 LayerTreeHostImpl::FrameData frame;
1070 bool draw_frame = false; 1074 bool draw_frame = false;
1071 bool start_ready_animations = true;
1072 1075
1073 if (layer_tree_host_impl_->CanDraw() && 1076 if (layer_tree_host_impl_->CanDraw() &&
1074 (!drawing_for_readback || can_do_readback)) { 1077 (!drawing_for_readback || can_do_readback)) {
1075 // If it is for a readback, make sure we draw the portion being read back. 1078 // If it is for a readback, make sure we draw the portion being read back.
1076 gfx::Rect readback_rect; 1079 gfx::Rect readback_rect;
1077 if (drawing_for_readback) 1080 if (drawing_for_readback)
1078 readback_rect = readback_request_on_impl_thread_->rect; 1081 readback_rect = readback_request_on_impl_thread_->rect;
1079 1082
1080 // Do not start animations if we skip drawing the frame to avoid
1081 // checkerboarding.
1082 if (layer_tree_host_impl_->PrepareToDraw(&frame, readback_rect) || 1083 if (layer_tree_host_impl_->PrepareToDraw(&frame, readback_rect) ||
1083 forced_draw) 1084 forced_draw)
1084 draw_frame = true; 1085 draw_frame = true;
1085 else
1086 start_ready_animations = false;
1087 } 1086 }
1088 1087
1089 if (draw_frame) { 1088 if (draw_frame) {
1090 layer_tree_host_impl_->DrawLayers( 1089 layer_tree_host_impl_->DrawLayers(
1091 &frame, 1090 &frame,
1092 scheduler_on_impl_thread_->LastBeginFrameOnImplThreadTime()); 1091 scheduler_on_impl_thread_->LastBeginFrameOnImplThreadTime());
1093 result.did_draw = true; 1092 result.did_draw = true;
1094 } 1093 }
1095 layer_tree_host_impl_->DidDrawAllLayers(frame); 1094 layer_tree_host_impl_->DidDrawAllLayers(frame);
1095
1096 bool start_ready_animations = draw_frame;
1096 layer_tree_host_impl_->UpdateAnimationState(start_ready_animations); 1097 layer_tree_host_impl_->UpdateAnimationState(start_ready_animations);
1097 1098
1098 // Check for a pending CompositeAndReadback. 1099 // Check for a pending CompositeAndReadback.
1099 if (drawing_for_readback) { 1100 if (drawing_for_readback) {
1100 DCHECK(!swap_requested); 1101 DCHECK(!swap_requested);
1101 result.did_readback = false; 1102 result.did_readback = false;
1102 if (draw_frame && !layer_tree_host_impl_->IsContextLost()) { 1103 if (draw_frame && !layer_tree_host_impl_->IsContextLost()) {
1103 layer_tree_host_impl_->Readback(readback_request_on_impl_thread_->pixels, 1104 layer_tree_host_impl_->Readback(readback_request_on_impl_thread_->pixels,
1104 readback_request_on_impl_thread_->rect); 1105 readback_request_on_impl_thread_->rect);
1105 result.did_readback = true; 1106 result.did_readback = true;
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
1226 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionDrawAndReadback"); 1227 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionDrawAndReadback");
1227 bool forced_draw = true; 1228 bool forced_draw = true;
1228 bool swap_requested = false; 1229 bool swap_requested = false;
1229 bool readback_requested = true; 1230 bool readback_requested = true;
1230 return DrawSwapReadbackInternal( 1231 return DrawSwapReadbackInternal(
1231 forced_draw, swap_requested, readback_requested); 1232 forced_draw, swap_requested, readback_requested);
1232 } 1233 }
1233 1234
1234 void ThreadProxy::DidAnticipatedDrawTimeChange(base::TimeTicks time) { 1235 void ThreadProxy::DidAnticipatedDrawTimeChange(base::TimeTicks time) {
1235 if (current_resource_update_controller_on_impl_thread_) 1236 if (current_resource_update_controller_on_impl_thread_)
1236 current_resource_update_controller_on_impl_thread_ 1237 current_resource_update_controller_on_impl_thread_->PerformMoreUpdates(
1237 ->PerformMoreUpdates(time); 1238 time);
1238 layer_tree_host_impl_->ResetCurrentFrameTimeForNextFrame();
1239 } 1239 }
1240 1240
1241 base::TimeDelta ThreadProxy::DrawDurationEstimate() { 1241 base::TimeDelta ThreadProxy::DrawDurationEstimate() {
1242 base::TimeDelta historical_estimate = 1242 base::TimeDelta historical_estimate =
1243 draw_duration_history_.Percentile(kDrawDurationEstimationPercentile); 1243 draw_duration_history_.Percentile(kDrawDurationEstimationPercentile);
1244 base::TimeDelta padding = base::TimeDelta::FromMicroseconds( 1244 base::TimeDelta padding = base::TimeDelta::FromMicroseconds(
1245 kDrawDurationEstimatePaddingInMicroseconds); 1245 kDrawDurationEstimatePaddingInMicroseconds);
1246 return historical_estimate + padding; 1246 return historical_estimate + padding;
1247 } 1247 }
1248 1248
1249 base::TimeDelta ThreadProxy::BeginFrameToCommitDurationEstimate() { 1249 base::TimeDelta ThreadProxy::BeginFrameToCommitDurationEstimate() {
1250 return begin_frame_to_commit_duration_history_.Percentile( 1250 return begin_frame_to_commit_duration_history_.Percentile(
1251 kCommitAndActivationDurationEstimationPercentile); 1251 kCommitAndActivationDurationEstimationPercentile);
1252 } 1252 }
1253 1253
1254 base::TimeDelta ThreadProxy::CommitToActivateDurationEstimate() { 1254 base::TimeDelta ThreadProxy::CommitToActivateDurationEstimate() {
1255 return commit_to_activate_duration_history_.Percentile( 1255 return commit_to_activate_duration_history_.Percentile(
1256 kCommitAndActivationDurationEstimationPercentile); 1256 kCommitAndActivationDurationEstimationPercentile);
1257 } 1257 }
1258 1258
1259 void ThreadProxy::PostBeginFrameDeadline(const base::Closure& closure,
1260 base::TimeTicks deadline) {
1261 base::TimeDelta delta = deadline - base::TimeTicks::Now();
1262 if (delta <= base::TimeDelta())
1263 delta = base::TimeDelta();
1264 Proxy::ImplThreadTaskRunner()->PostDelayedTask(FROM_HERE, closure, delta);
1265 }
1266
1259 void ThreadProxy::ReadyToFinalizeTextureUpdates() { 1267 void ThreadProxy::ReadyToFinalizeTextureUpdates() {
1260 DCHECK(IsImplThread()); 1268 DCHECK(IsImplThread());
1261 scheduler_on_impl_thread_->FinishCommit(); 1269 scheduler_on_impl_thread_->FinishCommit();
1262 } 1270 }
1263 1271
1264 void ThreadProxy::DidCommitAndDrawFrame() { 1272 void ThreadProxy::DidCommitAndDrawFrame() {
1265 DCHECK(IsMainThread()); 1273 DCHECK(IsMainThread());
1266 if (!layer_tree_host_) 1274 if (!layer_tree_host_)
1267 return; 1275 return;
1268 layer_tree_host_->DidCommitAndDrawFrame(); 1276 layer_tree_host_->DidCommitAndDrawFrame();
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1319 scheduler_on_impl_thread_->HasInitializedOutputSurface(); 1327 scheduler_on_impl_thread_->HasInitializedOutputSurface();
1320 completion->Signal(); 1328 completion->Signal();
1321 } 1329 }
1322 1330
1323 void ThreadProxy::InitializeImplOnImplThread(CompletionEvent* completion) { 1331 void ThreadProxy::InitializeImplOnImplThread(CompletionEvent* completion) {
1324 TRACE_EVENT0("cc", "ThreadProxy::InitializeImplOnImplThread"); 1332 TRACE_EVENT0("cc", "ThreadProxy::InitializeImplOnImplThread");
1325 DCHECK(IsImplThread()); 1333 DCHECK(IsImplThread());
1326 layer_tree_host_impl_ = layer_tree_host_->CreateLayerTreeHostImpl(this); 1334 layer_tree_host_impl_ = layer_tree_host_->CreateLayerTreeHostImpl(this);
1327 const LayerTreeSettings& settings = layer_tree_host_->settings(); 1335 const LayerTreeSettings& settings = layer_tree_host_->settings();
1328 SchedulerSettings scheduler_settings; 1336 SchedulerSettings scheduler_settings;
1337 scheduler_settings.deadline_scheduling_enabled =
1338 settings.deadline_scheduling_enabled;
1329 scheduler_settings.impl_side_painting = settings.impl_side_painting; 1339 scheduler_settings.impl_side_painting = settings.impl_side_painting;
1330 scheduler_settings.timeout_and_draw_when_animation_checkerboards = 1340 scheduler_settings.timeout_and_draw_when_animation_checkerboards =
1331 settings.timeout_and_draw_when_animation_checkerboards; 1341 settings.timeout_and_draw_when_animation_checkerboards;
1332 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced_ = 1342 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced_ =
1333 settings.maximum_number_of_failed_draws_before_draw_is_forced_; 1343 settings.maximum_number_of_failed_draws_before_draw_is_forced_;
1334 scheduler_settings.using_synchronous_renderer_compositor = 1344 scheduler_settings.using_synchronous_renderer_compositor =
1335 settings.using_synchronous_renderer_compositor; 1345 settings.using_synchronous_renderer_compositor;
1336 scheduler_settings.throttle_frame_production = 1346 scheduler_settings.throttle_frame_production =
1337 settings.throttle_frame_production; 1347 settings.throttle_frame_production;
1338 scheduler_on_impl_thread_ = Scheduler::Create(this, scheduler_settings); 1348 scheduler_on_impl_thread_ = Scheduler::Create(this, scheduler_settings);
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
1568 completion_event_for_commit_held_on_tree_activation_ = NULL; 1578 completion_event_for_commit_held_on_tree_activation_ = NULL;
1569 } 1579 }
1570 1580
1571 UpdateBackgroundAnimateTicking(); 1581 UpdateBackgroundAnimateTicking();
1572 1582
1573 commit_to_activate_duration_history_.InsertSample( 1583 commit_to_activate_duration_history_.InsertSample(
1574 base::TimeTicks::HighResNow() - commit_complete_time_); 1584 base::TimeTicks::HighResNow() - commit_complete_time_);
1575 } 1585 }
1576 1586
1577 } // namespace cc 1587 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/thread_proxy.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698