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 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 &completion, | 259 &completion, |
260 visible)); | 260 visible)); |
261 completion.Wait(); | 261 completion.Wait(); |
262 } | 262 } |
263 | 263 |
264 void ThreadProxy::SetVisibleOnImplThread(CompletionEvent* completion, | 264 void ThreadProxy::SetVisibleOnImplThread(CompletionEvent* completion, |
265 bool visible) { | 265 bool visible) { |
266 TRACE_EVENT0("cc", "ThreadProxy::SetVisibleOnImplThread"); | 266 TRACE_EVENT0("cc", "ThreadProxy::SetVisibleOnImplThread"); |
267 impl().layer_tree_host_impl->SetVisible(visible); | 267 impl().layer_tree_host_impl->SetVisible(visible); |
268 impl().scheduler->SetVisible(visible); | 268 impl().scheduler->SetVisible(visible); |
269 UpdateBackgroundAnimateTicking(); | |
270 completion->Signal(); | 269 completion->Signal(); |
271 } | 270 } |
272 | 271 |
273 void ThreadProxy::UpdateBackgroundAnimateTicking() { | |
274 bool should_background_tick = | |
275 !impl().scheduler->WillDrawIfNeeded() && | |
276 impl().layer_tree_host_impl->active_tree()->root_layer(); | |
277 impl().layer_tree_host_impl->UpdateBackgroundAnimateTicking( | |
278 should_background_tick); | |
279 if (should_background_tick) | |
280 impl().animations_frozen_until_next_draw = false; | |
281 } | |
282 | |
283 void ThreadProxy::DoCreateAndInitializeOutputSurface() { | 272 void ThreadProxy::DoCreateAndInitializeOutputSurface() { |
284 TRACE_EVENT0("cc", "ThreadProxy::DoCreateAndInitializeOutputSurface"); | 273 TRACE_EVENT0("cc", "ThreadProxy::DoCreateAndInitializeOutputSurface"); |
285 DCHECK(IsMainThread()); | 274 DCHECK(IsMainThread()); |
286 | 275 |
287 scoped_ptr<OutputSurface> output_surface = | 276 scoped_ptr<OutputSurface> output_surface = |
288 layer_tree_host()->CreateOutputSurface(); | 277 layer_tree_host()->CreateOutputSurface(); |
289 | 278 |
290 RendererCapabilities capabilities; | 279 RendererCapabilities capabilities; |
291 bool success = !!output_surface; | 280 bool success = !!output_surface; |
292 if (success) { | 281 if (success) { |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
390 } | 379 } |
391 | 380 |
392 void ThreadProxy::CheckOutputSurfaceStatusOnImplThread() { | 381 void ThreadProxy::CheckOutputSurfaceStatusOnImplThread() { |
393 TRACE_EVENT0("cc", "ThreadProxy::CheckOutputSurfaceStatusOnImplThread"); | 382 TRACE_EVENT0("cc", "ThreadProxy::CheckOutputSurfaceStatusOnImplThread"); |
394 DCHECK(IsImplThread()); | 383 DCHECK(IsImplThread()); |
395 if (!impl().layer_tree_host_impl->IsContextLost()) | 384 if (!impl().layer_tree_host_impl->IsContextLost()) |
396 return; | 385 return; |
397 impl().scheduler->DidLoseOutputSurface(); | 386 impl().scheduler->DidLoseOutputSurface(); |
398 } | 387 } |
399 | 388 |
400 void ThreadProxy::CommitVSyncParameters(base::TimeTicks timebase, | |
401 base::TimeDelta interval) { | |
402 impl().scheduler->CommitVSyncParameters(timebase, interval); | |
403 } | |
404 | |
405 void ThreadProxy::SetEstimatedParentDrawTime(base::TimeDelta draw_time) { | 389 void ThreadProxy::SetEstimatedParentDrawTime(base::TimeDelta draw_time) { |
406 impl().scheduler->SetEstimatedParentDrawTime(draw_time); | 390 impl().scheduler->SetEstimatedParentDrawTime(draw_time); |
407 } | 391 } |
408 | 392 |
409 void ThreadProxy::SetMaxSwapsPendingOnImplThread(int max) { | 393 void ThreadProxy::SetMaxSwapsPendingOnImplThread(int max) { |
410 impl().scheduler->SetMaxSwapsPending(max); | 394 impl().scheduler->SetMaxSwapsPending(max); |
411 } | 395 } |
412 | 396 |
413 void ThreadProxy::DidSwapBuffersOnImplThread() { | 397 void ThreadProxy::DidSwapBuffersOnImplThread() { |
414 impl().scheduler->DidSwapBuffers(); | 398 impl().scheduler->DidSwapBuffers(); |
415 } | 399 } |
416 | 400 |
417 void ThreadProxy::DidSwapBuffersCompleteOnImplThread() { | 401 void ThreadProxy::DidSwapBuffersCompleteOnImplThread() { |
418 TRACE_EVENT0("cc", "ThreadProxy::DidSwapBuffersCompleteOnImplThread"); | 402 TRACE_EVENT0("cc", "ThreadProxy::DidSwapBuffersCompleteOnImplThread"); |
419 DCHECK(IsImplThread()); | |
420 impl().scheduler->DidSwapBuffersComplete(); | 403 impl().scheduler->DidSwapBuffersComplete(); |
421 Proxy::MainThreadTaskRunner()->PostTask( | 404 Proxy::MainThreadTaskRunner()->PostTask( |
422 FROM_HERE, | 405 FROM_HERE, |
423 base::Bind(&ThreadProxy::DidCompleteSwapBuffers, main_thread_weak_ptr_)); | 406 base::Bind(&ThreadProxy::DidCompleteSwapBuffers, main_thread_weak_ptr_)); |
424 } | 407 } |
425 | 408 |
426 void ThreadProxy::SetNeedsBeginFrame(bool enable) { | |
427 TRACE_EVENT1("cc", "ThreadProxy::SetNeedsBeginFrame", "enable", enable); | |
428 impl().layer_tree_host_impl->SetNeedsBeginFrame(enable); | |
429 UpdateBackgroundAnimateTicking(); | |
430 } | |
431 | |
432 void ThreadProxy::BeginFrame(const BeginFrameArgs& args) { | |
433 impl().scheduler->BeginFrame(args); | |
434 } | |
435 | |
436 void ThreadProxy::WillBeginImplFrame(const BeginFrameArgs& args) { | 409 void ThreadProxy::WillBeginImplFrame(const BeginFrameArgs& args) { |
437 impl().layer_tree_host_impl->WillBeginImplFrame(args); | 410 impl().layer_tree_host_impl->WillBeginImplFrame(args); |
438 } | 411 } |
439 | 412 |
440 void ThreadProxy::OnCanDrawStateChanged(bool can_draw) { | 413 void ThreadProxy::OnCanDrawStateChanged(bool can_draw) { |
441 TRACE_EVENT1( | 414 TRACE_EVENT1( |
442 "cc", "ThreadProxy::OnCanDrawStateChanged", "can_draw", can_draw); | 415 "cc", "ThreadProxy::OnCanDrawStateChanged", "can_draw", can_draw); |
443 DCHECK(IsImplThread()); | 416 DCHECK(IsImplThread()); |
444 impl().scheduler->SetCanDraw(can_draw); | 417 impl().scheduler->SetCanDraw(can_draw); |
445 UpdateBackgroundAnimateTicking(); | |
446 } | 418 } |
447 | 419 |
448 void ThreadProxy::NotifyReadyToActivate() { | 420 void ThreadProxy::NotifyReadyToActivate() { |
449 TRACE_EVENT0("cc", "ThreadProxy::NotifyReadyToActivate"); | 421 TRACE_EVENT0("cc", "ThreadProxy::NotifyReadyToActivate"); |
450 impl().scheduler->NotifyReadyToActivate(); | 422 impl().scheduler->NotifyReadyToActivate(); |
451 } | 423 } |
452 | 424 |
453 void ThreadProxy::SetNeedsCommitOnImplThread() { | 425 void ThreadProxy::SetNeedsCommitOnImplThread() { |
454 TRACE_EVENT0("cc", "ThreadProxy::SetNeedsCommitOnImplThread"); | 426 TRACE_EVENT0("cc", "ThreadProxy::SetNeedsCommitOnImplThread"); |
455 DCHECK(IsImplThread()); | 427 DCHECK(IsImplThread()); |
(...skipping 624 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1080 impl().commit_completion_event->Signal(); | 1052 impl().commit_completion_event->Signal(); |
1081 impl().commit_completion_event = NULL; | 1053 impl().commit_completion_event = NULL; |
1082 } | 1054 } |
1083 | 1055 |
1084 // Delay this step until afer the main thread has been released as it's | 1056 // Delay this step until afer the main thread has been released as it's |
1085 // often a good bit of work to update the tree and prepare the new frame. | 1057 // often a good bit of work to update the tree and prepare the new frame. |
1086 impl().layer_tree_host_impl->CommitComplete(); | 1058 impl().layer_tree_host_impl->CommitComplete(); |
1087 | 1059 |
1088 SetInputThrottledUntilCommitOnImplThread(false); | 1060 SetInputThrottledUntilCommitOnImplThread(false); |
1089 | 1061 |
1090 UpdateBackgroundAnimateTicking(); | |
1091 | |
1092 impl().next_frame_is_newly_committed_frame = true; | 1062 impl().next_frame_is_newly_committed_frame = true; |
1093 | 1063 |
1094 impl().timing_history.DidCommit(); | 1064 impl().timing_history.DidCommit(); |
1095 } | 1065 } |
1096 | 1066 |
1097 void ThreadProxy::ScheduledActionUpdateVisibleTiles() { | 1067 void ThreadProxy::ScheduledActionUpdateVisibleTiles() { |
1098 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionUpdateVisibleTiles"); | 1068 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionUpdateVisibleTiles"); |
1099 DCHECK(IsImplThread()); | 1069 DCHECK(IsImplThread()); |
1100 impl().layer_tree_host_impl->UpdateVisibleTiles(); | 1070 impl().layer_tree_host_impl->UpdateVisibleTiles(); |
1101 } | 1071 } |
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1406 settings.timeout_and_draw_when_animation_checkerboards; | 1376 settings.timeout_and_draw_when_animation_checkerboards; |
1407 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced_ = | 1377 scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced_ = |
1408 settings.maximum_number_of_failed_draws_before_draw_is_forced_; | 1378 settings.maximum_number_of_failed_draws_before_draw_is_forced_; |
1409 scheduler_settings.using_synchronous_renderer_compositor = | 1379 scheduler_settings.using_synchronous_renderer_compositor = |
1410 settings.using_synchronous_renderer_compositor; | 1380 settings.using_synchronous_renderer_compositor; |
1411 scheduler_settings.throttle_frame_production = | 1381 scheduler_settings.throttle_frame_production = |
1412 settings.throttle_frame_production; | 1382 settings.throttle_frame_production; |
1413 impl().scheduler = Scheduler::Create(this, | 1383 impl().scheduler = Scheduler::Create(this, |
1414 scheduler_settings, | 1384 scheduler_settings, |
1415 impl().layer_tree_host_id, | 1385 impl().layer_tree_host_id, |
| 1386 impl().layer_tree_host_impl.get(), |
1416 ImplThreadTaskRunner()); | 1387 ImplThreadTaskRunner()); |
1417 impl().scheduler->SetVisible(impl().layer_tree_host_impl->visible()); | 1388 impl().scheduler->SetVisible(impl().layer_tree_host_impl->visible()); |
1418 | 1389 |
1419 impl_thread_weak_ptr_ = impl().weak_factory.GetWeakPtr(); | 1390 impl_thread_weak_ptr_ = impl().weak_factory.GetWeakPtr(); |
1420 completion->Signal(); | 1391 completion->Signal(); |
1421 } | 1392 } |
1422 | 1393 |
1423 void ThreadProxy::InitializeOutputSurfaceOnImplThread( | 1394 void ThreadProxy::InitializeOutputSurfaceOnImplThread( |
1424 CompletionEvent* completion, | 1395 CompletionEvent* completion, |
1425 scoped_ptr<OutputSurface> output_surface, | 1396 scoped_ptr<OutputSurface> output_surface, |
(...skipping 28 matching lines...) Expand all Loading... |
1454 impl().layer_tree_host_impl->resource_provider()->Finish(); | 1425 impl().layer_tree_host_impl->resource_provider()->Finish(); |
1455 completion->Signal(); | 1426 completion->Signal(); |
1456 } | 1427 } |
1457 | 1428 |
1458 void ThreadProxy::LayerTreeHostClosedOnImplThread(CompletionEvent* completion) { | 1429 void ThreadProxy::LayerTreeHostClosedOnImplThread(CompletionEvent* completion) { |
1459 TRACE_EVENT0("cc", "ThreadProxy::LayerTreeHostClosedOnImplThread"); | 1430 TRACE_EVENT0("cc", "ThreadProxy::LayerTreeHostClosedOnImplThread"); |
1460 DCHECK(IsImplThread()); | 1431 DCHECK(IsImplThread()); |
1461 layer_tree_host()->DeleteContentsTexturesOnImplThread( | 1432 layer_tree_host()->DeleteContentsTexturesOnImplThread( |
1462 impl().layer_tree_host_impl->resource_provider()); | 1433 impl().layer_tree_host_impl->resource_provider()); |
1463 impl().current_resource_update_controller.reset(); | 1434 impl().current_resource_update_controller.reset(); |
1464 impl().layer_tree_host_impl->SetNeedsBeginFrame(false); | |
1465 impl().scheduler.reset(); | 1435 impl().scheduler.reset(); |
1466 impl().layer_tree_host_impl.reset(); | 1436 impl().layer_tree_host_impl.reset(); |
1467 impl().weak_factory.InvalidateWeakPtrs(); | 1437 impl().weak_factory.InvalidateWeakPtrs(); |
1468 impl().contents_texture_manager = NULL; | 1438 impl().contents_texture_manager = NULL; |
1469 completion->Signal(); | 1439 completion->Signal(); |
1470 } | 1440 } |
1471 | 1441 |
1472 size_t ThreadProxy::MaxPartialTextureUpdates() const { | 1442 size_t ThreadProxy::MaxPartialTextureUpdates() const { |
1473 return ResourceUpdateController::MaxPartialTextureUpdates(); | 1443 return ResourceUpdateController::MaxPartialTextureUpdates(); |
1474 } | 1444 } |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1642 DCHECK(!impl().layer_tree_host_impl->pending_tree()); | 1612 DCHECK(!impl().layer_tree_host_impl->pending_tree()); |
1643 | 1613 |
1644 if (impl().completion_event_for_commit_held_on_tree_activation) { | 1614 if (impl().completion_event_for_commit_held_on_tree_activation) { |
1645 TRACE_EVENT_INSTANT0( | 1615 TRACE_EVENT_INSTANT0( |
1646 "cc", "ReleaseCommitbyActivation", TRACE_EVENT_SCOPE_THREAD); | 1616 "cc", "ReleaseCommitbyActivation", TRACE_EVENT_SCOPE_THREAD); |
1647 DCHECK(impl().layer_tree_host_impl->settings().impl_side_painting); | 1617 DCHECK(impl().layer_tree_host_impl->settings().impl_side_painting); |
1648 impl().completion_event_for_commit_held_on_tree_activation->Signal(); | 1618 impl().completion_event_for_commit_held_on_tree_activation->Signal(); |
1649 impl().completion_event_for_commit_held_on_tree_activation = NULL; | 1619 impl().completion_event_for_commit_held_on_tree_activation = NULL; |
1650 } | 1620 } |
1651 | 1621 |
1652 UpdateBackgroundAnimateTicking(); | |
1653 | |
1654 impl().timing_history.DidActivatePendingTree(); | 1622 impl().timing_history.DidActivatePendingTree(); |
1655 } | 1623 } |
1656 | 1624 |
1657 void ThreadProxy::DidManageTiles() { | 1625 void ThreadProxy::DidManageTiles() { |
1658 DCHECK(IsImplThread()); | 1626 DCHECK(IsImplThread()); |
1659 impl().scheduler->DidManageTiles(); | 1627 impl().scheduler->DidManageTiles(); |
1660 } | 1628 } |
1661 | 1629 |
1662 } // namespace cc | 1630 } // namespace cc |
OLD | NEW |