| 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 "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
| 10 #include "cc/base/thread.h" | 10 #include "cc/base/thread.h" |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 45 commit_requested_(false), | 45 commit_requested_(false), |
| 46 commit_request_sent_to_impl_thread_(false), | 46 commit_request_sent_to_impl_thread_(false), |
| 47 created_offscreen_context_provider_(false), | 47 created_offscreen_context_provider_(false), |
| 48 layer_tree_host_(layer_tree_host), | 48 layer_tree_host_(layer_tree_host), |
| 49 started_(false), | 49 started_(false), |
| 50 textures_acquired_(true), | 50 textures_acquired_(true), |
| 51 in_composite_and_readback_(false), | 51 in_composite_and_readback_(false), |
| 52 manage_tiles_pending_(false), | 52 manage_tiles_pending_(false), |
| 53 weak_factory_on_impl_thread_(this), | 53 weak_factory_on_impl_thread_(this), |
| 54 weak_factory_(this), | 54 weak_factory_(this), |
| 55 begin_frame_completion_event_on_impl_thread_(NULL), | 55 begin_frame_sent_to_main_thread_completion_event_on_impl_thread_(NULL), |
| 56 readback_request_on_impl_thread_(NULL), | 56 readback_request_on_impl_thread_(NULL), |
| 57 commit_completion_event_on_impl_thread_(NULL), | 57 commit_completion_event_on_impl_thread_(NULL), |
| 58 completion_event_for_commit_held_on_tree_activation_(NULL), | 58 completion_event_for_commit_held_on_tree_activation_(NULL), |
| 59 texture_acquisition_completion_event_on_impl_thread_(NULL), | 59 texture_acquisition_completion_event_on_impl_thread_(NULL), |
| 60 next_frame_is_newly_committed_frame_on_impl_thread_(false), | 60 next_frame_is_newly_committed_frame_on_impl_thread_(false), |
| 61 render_vsync_enabled_(layer_tree_host->settings().render_vsync_enabled), | 61 throttle_frame_production_( |
| 62 render_vsync_notification_enabled_( | 62 layer_tree_host->settings().throttle_frame_production), |
| 63 layer_tree_host->settings().render_vsync_notification_enabled), | 63 render_parent_drives_begin_frame__( |
| 64 synchronously_disable_vsync_( | 64 layer_tree_host->settings().render_parent_drives_begin_frame_), |
| 65 layer_tree_host->settings().synchronously_disable_vsync), | 65 using_synchronous_renderer_compositor_( |
| 66 layer_tree_host->settings().using_synchronous_renderer_compositor), |
| 66 vsync_client_(NULL), | 67 vsync_client_(NULL), |
| 67 inside_draw_(false), | 68 inside_draw_(false), |
| 68 defer_commits_(false), | 69 defer_commits_(false), |
| 69 renew_tree_priority_on_impl_thread_pending_(false) { | 70 renew_tree_priority_on_impl_thread_pending_(false) { |
| 70 TRACE_EVENT0("cc", "ThreadProxy::ThreadProxy"); | 71 TRACE_EVENT0("cc", "ThreadProxy::ThreadProxy"); |
| 71 DCHECK(IsMainThread()); | 72 DCHECK(IsMainThread()); |
| 72 DCHECK(layer_tree_host_); | 73 DCHECK(layer_tree_host_); |
| 73 } | 74 } |
| 74 | 75 |
| 75 ThreadProxy::~ThreadProxy() { | 76 ThreadProxy::~ThreadProxy() { |
| 76 TRACE_EVENT0("cc", "ThreadProxy::~ThreadProxy"); | 77 TRACE_EVENT0("cc", "ThreadProxy::~ThreadProxy"); |
| 77 DCHECK(IsMainThread()); | 78 DCHECK(IsMainThread()); |
| 78 DCHECK(!started_); | 79 DCHECK(!started_); |
| 79 } | 80 } |
| 80 | 81 |
| 81 bool ThreadProxy::CompositeAndReadback(void* pixels, gfx::Rect rect) { | 82 bool ThreadProxy::CompositeAndReadback(void* pixels, gfx::Rect rect) { |
| 82 TRACE_EVENT0("cc", "ThreadProxy::CompositeAndReadback"); | 83 TRACE_EVENT0("cc", "ThreadProxy::CompositeAndReadback"); |
| 83 DCHECK(IsMainThread()); | 84 DCHECK(IsMainThread()); |
| 84 DCHECK(layer_tree_host_); | 85 DCHECK(layer_tree_host_); |
| 85 DCHECK(!defer_commits_); | 86 DCHECK(!defer_commits_); |
| 86 | 87 |
| 87 if (!layer_tree_host_->InitializeOutputSurfaceIfNeeded()) { | 88 if (!layer_tree_host_->InitializeOutputSurfaceIfNeeded()) { |
| 88 TRACE_EVENT0("cc", "CompositeAndReadback_EarlyOut_LR_Uninitialized"); | 89 TRACE_EVENT0("cc", "CompositeAndReadback_EarlyOut_LR_Uninitialized"); |
| 89 return false; | 90 return false; |
| 90 } | 91 } |
| 91 | 92 |
| 92 // Perform a synchronous commit. | 93 // Perform a synchronous commit. |
| 93 { | 94 { |
| 94 DebugScopedSetMainThreadBlocked main_thread_blocked(this); | 95 DebugScopedSetMainThreadBlocked main_thread_blocked(this); |
| 95 CompletionEvent begin_frame_completion; | 96 CompletionEvent begin_frame_sent_to_main_thread_completion; |
| 96 Proxy::ImplThread()->PostTask( | 97 Proxy::ImplThread()->PostTask( |
| 97 base::Bind(&ThreadProxy::ForceBeginFrameOnImplThread, | 98 base::Bind(&ThreadProxy::ForceCommitOnImplThread, |
| 98 impl_thread_weak_ptr_, | 99 impl_thread_weak_ptr_, |
| 99 &begin_frame_completion)); | 100 &begin_frame_sent_to_main_thread_completion)); |
| 100 begin_frame_completion.Wait(); | 101 begin_frame_sent_to_main_thread_completion.Wait(); |
| 101 } | 102 } |
| 102 in_composite_and_readback_ = true; | 103 in_composite_and_readback_ = true; |
| 103 BeginFrame(scoped_ptr<BeginFrameAndCommitState>()); | 104 BeginFrameOnMainThread(scoped_ptr<BeginFrameAndCommitState>()); |
| 104 in_composite_and_readback_ = false; | 105 in_composite_and_readback_ = false; |
| 105 | 106 |
| 106 // Perform a synchronous readback. | 107 // Perform a synchronous readback. |
| 107 ReadbackRequest request; | 108 ReadbackRequest request; |
| 108 request.rect = rect; | 109 request.rect = rect; |
| 109 request.pixels = pixels; | 110 request.pixels = pixels; |
| 110 { | 111 { |
| 111 DebugScopedSetMainThreadBlocked main_thread_blocked(this); | 112 DebugScopedSetMainThreadBlocked main_thread_blocked(this); |
| 112 Proxy::ImplThread()->PostTask( | 113 Proxy::ImplThread()->PostTask( |
| 113 base::Bind(&ThreadProxy::RequestReadbackOnImplThread, | 114 base::Bind(&ThreadProxy::RequestReadbackOnImplThread, |
| 114 impl_thread_weak_ptr_, | 115 impl_thread_weak_ptr_, |
| 115 &request)); | 116 &request)); |
| 116 request.completion.Wait(); | 117 request.completion.Wait(); |
| 117 } | 118 } |
| 118 return request.success; | 119 return request.success; |
| 119 } | 120 } |
| 120 | 121 |
| 122 void ThreadProxy::ForceCommitOnImplThread(CompletionEvent* completion) { |
| 123 TRACE_EVENT0("cc", "ThreadProxy::ForceCommitOnImplThread"); |
| 124 DCHECK(IsImplThread()); |
| 125 DCHECK(!begin_frame_sent_to_main_thread_completion_event_on_impl_thread_); |
| 126 |
| 127 scheduler_on_impl_thread_->SetNeedsForcedCommit(); |
| 128 if (scheduler_on_impl_thread_->CommitPending()) { |
| 129 completion->Signal(); |
| 130 return; |
| 131 } |
| 132 |
| 133 begin_frame_sent_to_main_thread_completion_event_on_impl_thread_ = completion; |
| 134 } |
| 135 |
| 121 void ThreadProxy::RequestReadbackOnImplThread(ReadbackRequest* request) { | 136 void ThreadProxy::RequestReadbackOnImplThread(ReadbackRequest* request) { |
| 122 DCHECK(Proxy::IsImplThread()); | 137 DCHECK(Proxy::IsImplThread()); |
| 123 DCHECK(!readback_request_on_impl_thread_); | 138 DCHECK(!readback_request_on_impl_thread_); |
| 124 if (!layer_tree_host_impl_) { | 139 if (!layer_tree_host_impl_) { |
| 125 request->success = false; | 140 request->success = false; |
| 126 request->completion.Signal(); | 141 request->completion.Signal(); |
| 127 return; | 142 return; |
| 128 } | 143 } |
| 129 | 144 |
| 130 readback_request_on_impl_thread_ = request; | 145 readback_request_on_impl_thread_ = request; |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 DCHECK(IsImplThread()); | 338 DCHECK(IsImplThread()); |
| 324 TRACE_EVENT2("cc", | 339 TRACE_EVENT2("cc", |
| 325 "ThreadProxy::OnVSyncParametersChanged", | 340 "ThreadProxy::OnVSyncParametersChanged", |
| 326 "timebase", | 341 "timebase", |
| 327 (timebase - base::TimeTicks()).InMilliseconds(), | 342 (timebase - base::TimeTicks()).InMilliseconds(), |
| 328 "interval", | 343 "interval", |
| 329 interval.InMilliseconds()); | 344 interval.InMilliseconds()); |
| 330 scheduler_on_impl_thread_->SetTimebaseAndInterval(timebase, interval); | 345 scheduler_on_impl_thread_->SetTimebaseAndInterval(timebase, interval); |
| 331 } | 346 } |
| 332 | 347 |
| 333 void ThreadProxy::DidVSync(base::TimeTicks frame_time) { | 348 void ThreadProxy::BeginFrameOnImplThread(base::TimeTicks frame_time) { |
| 334 DCHECK(IsImplThread()); | 349 DCHECK(IsImplThread()); |
| 335 TRACE_EVENT0("cc", "ThreadProxy::DidVSync"); | 350 TRACE_EVENT0("cc", "ThreadProxy::OnBeginFrameOnImplThread"); |
| 336 if (vsync_client_) | 351 if (vsync_client_) |
| 337 vsync_client_->DidVSync(frame_time); | 352 vsync_client_->DidVSync(frame_time); |
| 338 } | 353 } |
| 339 | 354 |
| 340 void ThreadProxy::RequestVSyncNotification(VSyncClient* client) { | 355 void ThreadProxy::RequestVSyncNotification(VSyncClient* client) { |
| 341 DCHECK(IsImplThread()); | 356 DCHECK(IsImplThread()); |
| 342 TRACE_EVENT1( | 357 TRACE_EVENT1( |
| 343 "cc", "ThreadProxy::RequestVSyncNotification", "enable", !!client); | 358 "cc", "ThreadProxy::RequestVSyncNotification", "enable", !!client); |
| 344 vsync_client_ = client; | 359 vsync_client_ = client; |
| 345 layer_tree_host_impl_->EnableVSyncNotification(!!client); | 360 layer_tree_host_impl_->SetNeedsBeginFrame(!!client); |
| 346 } | 361 } |
| 347 | 362 |
| 348 void ThreadProxy::OnCanDrawStateChanged(bool can_draw) { | 363 void ThreadProxy::OnCanDrawStateChanged(bool can_draw) { |
| 349 DCHECK(IsImplThread()); | 364 DCHECK(IsImplThread()); |
| 350 TRACE_EVENT1( | 365 TRACE_EVENT1( |
| 351 "cc", "ThreadProxy::OnCanDrawStateChanged", "can_draw", can_draw); | 366 "cc", "ThreadProxy::OnCanDrawStateChanged", "can_draw", can_draw); |
| 352 scheduler_on_impl_thread_->SetCanDraw(can_draw); | 367 scheduler_on_impl_thread_->SetCanDraw(can_draw); |
| 353 layer_tree_host_impl_->UpdateBackgroundAnimateTicking( | 368 layer_tree_host_impl_->UpdateBackgroundAnimateTicking( |
| 354 !scheduler_on_impl_thread_->WillDrawIfNeeded()); | 369 !scheduler_on_impl_thread_->WillDrawIfNeeded()); |
| 355 } | 370 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 377 manage_tiles_pending_ = true; | 392 manage_tiles_pending_ = true; |
| 378 } | 393 } |
| 379 | 394 |
| 380 void ThreadProxy::ManageTilesOnImplThread() { | 395 void ThreadProxy::ManageTilesOnImplThread() { |
| 381 // TODO(nduca): If needed, move this into CCSchedulerStateMachine. | 396 // TODO(nduca): If needed, move this into CCSchedulerStateMachine. |
| 382 manage_tiles_pending_ = false; | 397 manage_tiles_pending_ = false; |
| 383 if (layer_tree_host_impl_) | 398 if (layer_tree_host_impl_) |
| 384 layer_tree_host_impl_->ManageTiles(); | 399 layer_tree_host_impl_->ManageTiles(); |
| 385 } | 400 } |
| 386 | 401 |
| 387 void ThreadProxy::SetNeedsForcedCommitOnImplThread() { | |
| 388 DCHECK(IsImplThread()); | |
| 389 TRACE_EVENT0("cc", "ThreadProxy::SetNeedsForcedCommitOnImplThread"); | |
| 390 scheduler_on_impl_thread_->SetNeedsForcedCommit(); | |
| 391 } | |
| 392 | |
| 393 void ThreadProxy::PostAnimationEventsToMainThreadOnImplThread( | 402 void ThreadProxy::PostAnimationEventsToMainThreadOnImplThread( |
| 394 scoped_ptr<AnimationEventsVector> events, | 403 scoped_ptr<AnimationEventsVector> events, |
| 395 base::Time wall_clock_time) { | 404 base::Time wall_clock_time) { |
| 396 DCHECK(IsImplThread()); | 405 DCHECK(IsImplThread()); |
| 397 TRACE_EVENT0("cc", | 406 TRACE_EVENT0("cc", |
| 398 "ThreadProxy::PostAnimationEventsToMainThreadOnImplThread"); | 407 "ThreadProxy::PostAnimationEventsToMainThreadOnImplThread"); |
| 399 Proxy::MainThread()->PostTask(base::Bind(&ThreadProxy::SetAnimationEvents, | 408 Proxy::MainThread()->PostTask(base::Bind(&ThreadProxy::SetAnimationEvents, |
| 400 main_thread_weak_ptr_, | 409 main_thread_weak_ptr_, |
| 401 base::Passed(&events), | 410 base::Passed(&events), |
| 402 wall_clock_time)); | 411 wall_clock_time)); |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 474 DCHECK_NE(defer_commits_, defer_commits); | 483 DCHECK_NE(defer_commits_, defer_commits); |
| 475 defer_commits_ = defer_commits; | 484 defer_commits_ = defer_commits; |
| 476 | 485 |
| 477 if (defer_commits_) | 486 if (defer_commits_) |
| 478 TRACE_EVENT_ASYNC_BEGIN0("cc", "ThreadProxy::SetDeferCommits", this); | 487 TRACE_EVENT_ASYNC_BEGIN0("cc", "ThreadProxy::SetDeferCommits", this); |
| 479 else | 488 else |
| 480 TRACE_EVENT_ASYNC_END0("cc", "ThreadProxy::SetDeferCommits", this); | 489 TRACE_EVENT_ASYNC_END0("cc", "ThreadProxy::SetDeferCommits", this); |
| 481 | 490 |
| 482 if (!defer_commits_ && pending_deferred_commit_) | 491 if (!defer_commits_ && pending_deferred_commit_) |
| 483 Proxy::MainThread()->PostTask( | 492 Proxy::MainThread()->PostTask( |
| 484 base::Bind(&ThreadProxy::BeginFrame, | 493 base::Bind(&ThreadProxy::BeginFrameOnMainThread, |
| 485 main_thread_weak_ptr_, | 494 main_thread_weak_ptr_, |
| 486 base::Passed(&pending_deferred_commit_))); | 495 base::Passed(&pending_deferred_commit_))); |
| 487 } | 496 } |
| 488 | 497 |
| 489 bool ThreadProxy::CommitRequested() const { | 498 bool ThreadProxy::CommitRequested() const { |
| 490 DCHECK(IsMainThread()); | 499 DCHECK(IsMainThread()); |
| 491 return commit_requested_; | 500 return commit_requested_; |
| 492 } | 501 } |
| 493 | 502 |
| 494 void ThreadProxy::SetNeedsRedrawOnImplThread() { | 503 void ThreadProxy::SetNeedsRedrawOnImplThread() { |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 600 completion->Signal(); | 609 completion->Signal(); |
| 601 } | 610 } |
| 602 | 611 |
| 603 void ThreadProxy::FinishAllRenderingOnImplThread(CompletionEvent* completion) { | 612 void ThreadProxy::FinishAllRenderingOnImplThread(CompletionEvent* completion) { |
| 604 TRACE_EVENT0("cc", "ThreadProxy::FinishAllRenderingOnImplThread"); | 613 TRACE_EVENT0("cc", "ThreadProxy::FinishAllRenderingOnImplThread"); |
| 605 DCHECK(IsImplThread()); | 614 DCHECK(IsImplThread()); |
| 606 layer_tree_host_impl_->FinishAllRendering(); | 615 layer_tree_host_impl_->FinishAllRendering(); |
| 607 completion->Signal(); | 616 completion->Signal(); |
| 608 } | 617 } |
| 609 | 618 |
| 610 void ThreadProxy::ForceBeginFrameOnImplThread(CompletionEvent* completion) { | 619 void ThreadProxy::ScheduledActionSendBeginFrameToMainThread() { |
| 611 TRACE_EVENT0("cc", "ThreadProxy::ForceBeginFrameOnImplThread"); | 620 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionSendBeginFrameToMainThread"); |
| 612 DCHECK(!begin_frame_completion_event_on_impl_thread_); | |
| 613 | |
| 614 SetNeedsForcedCommitOnImplThread(); | |
| 615 if (scheduler_on_impl_thread_->CommitPending()) { | |
| 616 completion->Signal(); | |
| 617 return; | |
| 618 } | |
| 619 | |
| 620 begin_frame_completion_event_on_impl_thread_ = completion; | |
| 621 } | |
| 622 | |
| 623 void ThreadProxy::ScheduledActionBeginFrame() { | |
| 624 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionBeginFrame"); | |
| 625 scoped_ptr<BeginFrameAndCommitState> begin_frame_state( | 621 scoped_ptr<BeginFrameAndCommitState> begin_frame_state( |
| 626 new BeginFrameAndCommitState); | 622 new BeginFrameAndCommitState); |
| 627 begin_frame_state->monotonic_frame_begin_time = base::TimeTicks::Now(); | 623 begin_frame_state->monotonic_frame_begin_time = base::TimeTicks::Now(); |
| 628 begin_frame_state->scroll_info = layer_tree_host_impl_->ProcessScrollDeltas(); | 624 begin_frame_state->scroll_info = |
| 625 layer_tree_host_impl_->ProcessScrollDeltas(); |
| 629 DCHECK_GT(layer_tree_host_impl_->memory_allocation_limit_bytes(), 0u); | 626 DCHECK_GT(layer_tree_host_impl_->memory_allocation_limit_bytes(), 0u); |
| 630 begin_frame_state->memory_allocation_limit_bytes = | 627 begin_frame_state->memory_allocation_limit_bytes = |
| 631 layer_tree_host_impl_->memory_allocation_limit_bytes(); | 628 layer_tree_host_impl_->memory_allocation_limit_bytes(); |
| 632 Proxy::MainThread()->PostTask(base::Bind(&ThreadProxy::BeginFrame, | 629 Proxy::MainThread()->PostTask( |
| 633 main_thread_weak_ptr_, | 630 base::Bind(&ThreadProxy::BeginFrameOnMainThread, |
| 634 base::Passed(&begin_frame_state))); | 631 main_thread_weak_ptr_, |
| 632 base::Passed(&begin_frame_state))); |
| 635 | 633 |
| 636 if (begin_frame_completion_event_on_impl_thread_) { | 634 if (begin_frame_sent_to_main_thread_completion_event_on_impl_thread_) { |
| 637 begin_frame_completion_event_on_impl_thread_->Signal(); | 635 begin_frame_sent_to_main_thread_completion_event_on_impl_thread_->Signal(); |
| 638 begin_frame_completion_event_on_impl_thread_ = NULL; | 636 begin_frame_sent_to_main_thread_completion_event_on_impl_thread_ = NULL; |
| 639 } | 637 } |
| 640 } | 638 } |
| 641 | 639 |
| 642 void ThreadProxy::BeginFrame( | 640 void ThreadProxy::BeginFrameOnMainThread( |
| 643 scoped_ptr<BeginFrameAndCommitState> begin_frame_state) { | 641 scoped_ptr<BeginFrameAndCommitState> begin_frame_state) { |
| 644 TRACE_EVENT0("cc", "ThreadProxy::BeginFrame"); | 642 TRACE_EVENT0("cc", "ThreadProxy::BeginFrameOnMainThread"); |
| 645 DCHECK(IsMainThread()); | 643 DCHECK(IsMainThread()); |
| 646 if (!layer_tree_host_) | 644 if (!layer_tree_host_) |
| 647 return; | 645 return; |
| 648 | 646 |
| 649 if (defer_commits_) { | 647 if (defer_commits_) { |
| 650 pending_deferred_commit_ = begin_frame_state.Pass(); | 648 pending_deferred_commit_ = begin_frame_state.Pass(); |
| 651 layer_tree_host_->DidDeferCommit(); | 649 layer_tree_host_->DidDeferCommit(); |
| 652 TRACE_EVENT0("cc", "EarlyOut_DeferCommits"); | 650 TRACE_EVENT0("cc", "EarlyOut_DeferCommits"); |
| 653 return; | 651 return; |
| 654 } | 652 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 668 | 666 |
| 669 if (begin_frame_state) | 667 if (begin_frame_state) |
| 670 layer_tree_host_->ApplyScrollAndScale(*begin_frame_state->scroll_info); | 668 layer_tree_host_->ApplyScrollAndScale(*begin_frame_state->scroll_info); |
| 671 | 669 |
| 672 if (!in_composite_and_readback_ && !layer_tree_host_->visible()) { | 670 if (!in_composite_and_readback_ && !layer_tree_host_->visible()) { |
| 673 commit_requested_ = false; | 671 commit_requested_ = false; |
| 674 commit_request_sent_to_impl_thread_ = false; | 672 commit_request_sent_to_impl_thread_ = false; |
| 675 | 673 |
| 676 TRACE_EVENT0("cc", "EarlyOut_NotVisible"); | 674 TRACE_EVENT0("cc", "EarlyOut_NotVisible"); |
| 677 Proxy::ImplThread()->PostTask(base::Bind( | 675 Proxy::ImplThread()->PostTask(base::Bind( |
| 678 &ThreadProxy::BeginFrameAbortedOnImplThread, impl_thread_weak_ptr_)); | 676 &ThreadProxy::BeginFrameAbortedByMainThreadOnImplThread, |
| 677 impl_thread_weak_ptr_)); |
| 679 return; | 678 return; |
| 680 } | 679 } |
| 681 | 680 |
| 682 layer_tree_host_->WillBeginFrame(); | 681 layer_tree_host_->WillBeginFrame(); |
| 683 | 682 |
| 684 if (begin_frame_state) { | 683 if (begin_frame_state) { |
| 685 layer_tree_host_->UpdateClientAnimations( | 684 layer_tree_host_->UpdateClientAnimations( |
| 686 begin_frame_state->monotonic_frame_begin_time); | 685 begin_frame_state->monotonic_frame_begin_time); |
| 687 layer_tree_host_->AnimateLayers( | 686 layer_tree_host_->AnimateLayers( |
| 688 begin_frame_state->monotonic_frame_begin_time); | 687 begin_frame_state->monotonic_frame_begin_time); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 700 // Clear the commit flag after updating animations and layout here --- objects | 699 // Clear the commit flag after updating animations and layout here --- objects |
| 701 // that only layout when painted will trigger another SetNeedsCommit inside | 700 // that only layout when painted will trigger another SetNeedsCommit inside |
| 702 // UpdateLayers. | 701 // UpdateLayers. |
| 703 commit_requested_ = false; | 702 commit_requested_ = false; |
| 704 commit_request_sent_to_impl_thread_ = false; | 703 commit_request_sent_to_impl_thread_ = false; |
| 705 | 704 |
| 706 scoped_ptr<ResourceUpdateQueue> queue = | 705 scoped_ptr<ResourceUpdateQueue> queue = |
| 707 make_scoped_ptr(new ResourceUpdateQueue); | 706 make_scoped_ptr(new ResourceUpdateQueue); |
| 708 layer_tree_host_->UpdateLayers( | 707 layer_tree_host_->UpdateLayers( |
| 709 queue.get(), | 708 queue.get(), |
| 710 begin_frame_state ? begin_frame_state->memory_allocation_limit_bytes | 709 begin_frame_state ? |
| 711 : 0u); | 710 begin_frame_state->memory_allocation_limit_bytes : 0u); |
| 712 | 711 |
| 713 // Once single buffered layers are committed, they cannot be modified until | 712 // Once single buffered layers are committed, they cannot be modified until |
| 714 // they are drawn by the impl thread. | 713 // they are drawn by the impl thread. |
| 715 textures_acquired_ = false; | 714 textures_acquired_ = false; |
| 716 | 715 |
| 717 layer_tree_host_->WillCommit(); | 716 layer_tree_host_->WillCommit(); |
| 718 // Before applying scrolls and calling animate, we set animate_requested_ to | 717 // Before applying scrolls and calling animate, we set animate_requested_ to |
| 719 // false. If it is true now, it means SetNeedAnimate was called again, but | 718 // false. If it is true now, it means SetNeedAnimate was called again, but |
| 720 // during a state when commit_request_sent_to_impl_thread_ = true. We need to | 719 // during a state when commit_request_sent_to_impl_thread_ = true. We need to |
| 721 // force that call to happen again now so that the commit request is sent to | 720 // force that call to happen again now so that the commit request is sent to |
| 722 // the impl thread. | 721 // the impl thread. |
| 723 if (animate_requested_) { | 722 if (animate_requested_) { |
| 724 // Forces SetNeedsAnimate to consider posting a commit task. | 723 // Forces SetNeedsAnimate to consider posting a commit task. |
| 725 animate_requested_ = false; | 724 animate_requested_ = false; |
| 726 SetNeedsAnimate(); | 725 SetNeedsAnimate(); |
| 727 } | 726 } |
| 728 | 727 |
| 729 scoped_refptr<cc::ContextProvider> offscreen_context_provider; | 728 scoped_refptr<cc::ContextProvider> offscreen_context_provider; |
| 730 if (renderer_capabilities_main_thread_copy_.using_offscreen_context3d && | 729 if (renderer_capabilities_main_thread_copy_.using_offscreen_context3d && |
| 731 layer_tree_host_->needs_offscreen_context()) { | 730 layer_tree_host_->needs_offscreen_context()) { |
| 732 offscreen_context_provider = layer_tree_host_->client()-> | 731 offscreen_context_provider = layer_tree_host_->client()-> |
| 733 OffscreenContextProviderForCompositorThread(); | 732 OffscreenContextProviderForCompositorThread(); |
| 734 if (offscreen_context_provider) | 733 if (offscreen_context_provider) |
| 735 created_offscreen_context_provider_ = true; | 734 created_offscreen_context_provider_ = true; |
| 736 } | 735 } |
| 737 | 736 |
| 738 // Notify the impl thread that the BeginFrame has completed. This will | 737 // Notify the impl thread that the main thread is ready to commit. This will |
| 739 // begin the commit process, which is blocking from the main thread's | 738 // begin the commit process, which is blocking from the main thread's |
| 740 // point of view, but asynchronously performed on the impl thread, | 739 // point of view, but asynchronously performed on the impl thread, |
| 741 // coordinated by the Scheduler. | 740 // coordinated by the Scheduler. |
| 742 { | 741 { |
| 743 TRACE_EVENT0("cc", "ThreadProxy::BeginFrame::commit"); | 742 TRACE_EVENT0("cc", "ThreadProxy::BeginFrameOnMainThread::commit"); |
| 744 | 743 |
| 745 DebugScopedSetMainThreadBlocked main_thread_blocked(this); | 744 DebugScopedSetMainThreadBlocked main_thread_blocked(this); |
| 746 | 745 |
| 747 RenderingStatsInstrumentation* stats_instrumentation = | 746 RenderingStatsInstrumentation* stats_instrumentation = |
| 748 layer_tree_host_->rendering_stats_instrumentation(); | 747 layer_tree_host_->rendering_stats_instrumentation(); |
| 749 base::TimeTicks start_time = stats_instrumentation->StartRecording(); | 748 base::TimeTicks start_time = stats_instrumentation->StartRecording(); |
| 750 | 749 |
| 751 CompletionEvent completion; | 750 CompletionEvent completion; |
| 752 Proxy::ImplThread()->PostTask( | 751 Proxy::ImplThread()->PostTask( |
| 753 base::Bind(&ThreadProxy::BeginFrameCompleteOnImplThread, | 752 base::Bind(&ThreadProxy::StartCommitOnImplThread, |
| 754 impl_thread_weak_ptr_, | 753 impl_thread_weak_ptr_, |
| 755 &completion, | 754 &completion, |
| 756 queue.release(), | 755 queue.release(), |
| 757 offscreen_context_provider)); | 756 offscreen_context_provider)); |
| 758 completion.Wait(); | 757 completion.Wait(); |
| 759 | 758 |
| 760 base::TimeDelta duration = stats_instrumentation->EndRecording(start_time); | 759 base::TimeDelta duration = stats_instrumentation->EndRecording(start_time); |
| 761 stats_instrumentation->AddCommit(duration); | 760 stats_instrumentation->AddCommit(duration); |
| 762 } | 761 } |
| 763 | 762 |
| 764 layer_tree_host_->CommitComplete(); | 763 layer_tree_host_->CommitComplete(); |
| 765 layer_tree_host_->DidBeginFrame(); | 764 layer_tree_host_->DidBeginFrame(); |
| 766 } | 765 } |
| 767 | 766 |
| 768 void ThreadProxy::BeginFrameCompleteOnImplThread( | 767 void ThreadProxy::StartCommitOnImplThread( |
| 769 CompletionEvent* completion, | 768 CompletionEvent* completion, |
| 770 ResourceUpdateQueue* raw_queue, | 769 ResourceUpdateQueue* raw_queue, |
| 771 scoped_refptr<cc::ContextProvider> offscreen_context_provider) { | 770 scoped_refptr<cc::ContextProvider> offscreen_context_provider) { |
| 772 scoped_ptr<ResourceUpdateQueue> queue(raw_queue); | 771 scoped_ptr<ResourceUpdateQueue> queue(raw_queue); |
| 773 | 772 |
| 774 TRACE_EVENT0("cc", "ThreadProxy::BeginFrameCompleteOnImplThread"); | 773 TRACE_EVENT0("cc", "ThreadProxy::StartCommitOnImplThread"); |
| 775 DCHECK(!commit_completion_event_on_impl_thread_); | 774 DCHECK(!commit_completion_event_on_impl_thread_); |
| 776 DCHECK(IsImplThread() && IsMainThreadBlocked()); | 775 DCHECK(IsImplThread() && IsMainThreadBlocked()); |
| 777 DCHECK(scheduler_on_impl_thread_); | 776 DCHECK(scheduler_on_impl_thread_); |
| 778 DCHECK(scheduler_on_impl_thread_->CommitPending()); | 777 DCHECK(scheduler_on_impl_thread_->CommitPending()); |
| 779 | 778 |
| 780 if (!layer_tree_host_impl_) { | 779 if (!layer_tree_host_impl_) { |
| 781 TRACE_EVENT0("cc", "EarlyOut_NoLayerTree"); | 780 TRACE_EVENT0("cc", "EarlyOut_NoLayerTree"); |
| 782 completion->Signal(); | 781 completion->Signal(); |
| 783 return; | 782 return; |
| 784 } | 783 } |
| (...skipping 22 matching lines...) Expand all Loading... |
| 807 if (layer_tree_host_impl_->resource_provider()) { | 806 if (layer_tree_host_impl_->resource_provider()) { |
| 808 current_resource_update_controller_on_impl_thread_ = | 807 current_resource_update_controller_on_impl_thread_ = |
| 809 ResourceUpdateController::Create( | 808 ResourceUpdateController::Create( |
| 810 this, | 809 this, |
| 811 Proxy::ImplThread(), | 810 Proxy::ImplThread(), |
| 812 queue.Pass(), | 811 queue.Pass(), |
| 813 layer_tree_host_impl_->resource_provider()); | 812 layer_tree_host_impl_->resource_provider()); |
| 814 current_resource_update_controller_on_impl_thread_->PerformMoreUpdates( | 813 current_resource_update_controller_on_impl_thread_->PerformMoreUpdates( |
| 815 scheduler_on_impl_thread_->AnticipatedDrawTime()); | 814 scheduler_on_impl_thread_->AnticipatedDrawTime()); |
| 816 } else { | 815 } else { |
| 817 // Normally the ResourceUpdateController notifies when begin frame has | 816 // Normally the ResourceUpdateController notifies when commit should |
| 818 // completed, but in tile-free software rendering there is no resource | 817 // finish, but in tile-free software rendering there is no resource |
| 819 // update step so jump straight to the notification. | 818 // update step so jump straight to the notification. |
| 820 scheduler_on_impl_thread_->BeginFrameComplete(); | 819 scheduler_on_impl_thread_->FinishCommit(); |
| 821 } | 820 } |
| 822 } | 821 } |
| 823 | 822 |
| 824 void ThreadProxy::BeginFrameAbortedOnImplThread() { | 823 void ThreadProxy::BeginFrameAbortedByMainThreadOnImplThread() { |
| 825 TRACE_EVENT0("cc", "ThreadProxy::BeginFrameAbortedOnImplThread"); | 824 TRACE_EVENT0("cc", "ThreadProxy::BeginFrameAbortedByMainThreadOnImplThread"); |
| 826 DCHECK(IsImplThread()); | 825 DCHECK(IsImplThread()); |
| 827 DCHECK(scheduler_on_impl_thread_); | 826 DCHECK(scheduler_on_impl_thread_); |
| 828 DCHECK(scheduler_on_impl_thread_->CommitPending()); | 827 DCHECK(scheduler_on_impl_thread_->CommitPending()); |
| 829 | 828 |
| 830 scheduler_on_impl_thread_->BeginFrameAborted(); | 829 scheduler_on_impl_thread_->BeginFrameAbortedByMainThread(); |
| 831 } | 830 } |
| 832 | 831 |
| 833 void ThreadProxy::ScheduledActionCommit() { | 832 void ThreadProxy::ScheduledActionCommit() { |
| 834 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionCommit"); | 833 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionCommit"); |
| 835 DCHECK(IsImplThread()); | 834 DCHECK(IsImplThread()); |
| 836 DCHECK(commit_completion_event_on_impl_thread_); | 835 DCHECK(commit_completion_event_on_impl_thread_); |
| 837 if (current_resource_update_controller_on_impl_thread_) { | 836 if (current_resource_update_controller_on_impl_thread_) { |
| 838 // Complete all remaining texture updates. | 837 // Complete all remaining texture updates. |
| 839 current_resource_update_controller_on_impl_thread_->Finalize(); | 838 current_resource_update_controller_on_impl_thread_->Finalize(); |
| 840 current_resource_update_controller_on_impl_thread_.reset(); | 839 current_resource_update_controller_on_impl_thread_.reset(); |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 943 if (layer_tree_host_impl_->PrepareToDraw(&frame, readback_rect) || | 942 if (layer_tree_host_impl_->PrepareToDraw(&frame, readback_rect) || |
| 944 forced_draw) | 943 forced_draw) |
| 945 draw_frame = true; | 944 draw_frame = true; |
| 946 else | 945 else |
| 947 start_ready_animations = false; | 946 start_ready_animations = false; |
| 948 } | 947 } |
| 949 | 948 |
| 950 if (draw_frame) { | 949 if (draw_frame) { |
| 951 layer_tree_host_impl_->DrawLayers( | 950 layer_tree_host_impl_->DrawLayers( |
| 952 &frame, | 951 &frame, |
| 953 scheduler_on_impl_thread_->LastVSyncTime()); | 952 scheduler_on_impl_thread_->LastBeginFrameOnImplThreadTime()); |
| 954 result.did_draw = true; | 953 result.did_draw = true; |
| 955 } | 954 } |
| 956 layer_tree_host_impl_->DidDrawAllLayers(frame); | 955 layer_tree_host_impl_->DidDrawAllLayers(frame); |
| 957 | 956 |
| 958 layer_tree_host_impl_->UpdateAnimationState(start_ready_animations); | 957 layer_tree_host_impl_->UpdateAnimationState(start_ready_animations); |
| 959 | 958 |
| 960 // Check for a pending CompositeAndReadback. | 959 // Check for a pending CompositeAndReadback. |
| 961 if (readback_request_on_impl_thread_) { | 960 if (readback_request_on_impl_thread_) { |
| 962 readback_request_on_impl_thread_->success = false; | 961 readback_request_on_impl_thread_->success = false; |
| 963 if (draw_frame) { | 962 if (draw_frame) { |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1039 | 1038 |
| 1040 void ThreadProxy::DidAnticipatedDrawTimeChange(base::TimeTicks time) { | 1039 void ThreadProxy::DidAnticipatedDrawTimeChange(base::TimeTicks time) { |
| 1041 if (current_resource_update_controller_on_impl_thread_) | 1040 if (current_resource_update_controller_on_impl_thread_) |
| 1042 current_resource_update_controller_on_impl_thread_ | 1041 current_resource_update_controller_on_impl_thread_ |
| 1043 ->PerformMoreUpdates(time); | 1042 ->PerformMoreUpdates(time); |
| 1044 layer_tree_host_impl_->ResetCurrentFrameTimeForNextFrame(); | 1043 layer_tree_host_impl_->ResetCurrentFrameTimeForNextFrame(); |
| 1045 } | 1044 } |
| 1046 | 1045 |
| 1047 void ThreadProxy::ReadyToFinalizeTextureUpdates() { | 1046 void ThreadProxy::ReadyToFinalizeTextureUpdates() { |
| 1048 DCHECK(IsImplThread()); | 1047 DCHECK(IsImplThread()); |
| 1049 scheduler_on_impl_thread_->BeginFrameComplete(); | 1048 scheduler_on_impl_thread_->FinishCommit(); |
| 1050 } | 1049 } |
| 1051 | 1050 |
| 1052 void ThreadProxy::DidCommitAndDrawFrame() { | 1051 void ThreadProxy::DidCommitAndDrawFrame() { |
| 1053 DCHECK(IsMainThread()); | 1052 DCHECK(IsMainThread()); |
| 1054 if (!layer_tree_host_) | 1053 if (!layer_tree_host_) |
| 1055 return; | 1054 return; |
| 1056 layer_tree_host_->DidCommitAndDrawFrame(); | 1055 layer_tree_host_->DidCommitAndDrawFrame(); |
| 1057 } | 1056 } |
| 1058 | 1057 |
| 1059 void ThreadProxy::DidCompleteSwapBuffers() { | 1058 void ThreadProxy::DidCompleteSwapBuffers() { |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1109 | 1108 |
| 1110 void ThreadProxy::InitializeImplOnImplThread(CompletionEvent* completion) { | 1109 void ThreadProxy::InitializeImplOnImplThread(CompletionEvent* completion) { |
| 1111 TRACE_EVENT0("cc", "ThreadProxy::InitializeImplOnImplThread"); | 1110 TRACE_EVENT0("cc", "ThreadProxy::InitializeImplOnImplThread"); |
| 1112 DCHECK(IsImplThread()); | 1111 DCHECK(IsImplThread()); |
| 1113 layer_tree_host_impl_ = layer_tree_host_->CreateLayerTreeHostImpl(this); | 1112 layer_tree_host_impl_ = layer_tree_host_->CreateLayerTreeHostImpl(this); |
| 1114 const base::TimeDelta display_refresh_interval = | 1113 const base::TimeDelta display_refresh_interval = |
| 1115 base::TimeDelta::FromMicroseconds( | 1114 base::TimeDelta::FromMicroseconds( |
| 1116 base::Time::kMicrosecondsPerSecond / | 1115 base::Time::kMicrosecondsPerSecond / |
| 1117 layer_tree_host_->settings().refresh_rate); | 1116 layer_tree_host_->settings().refresh_rate); |
| 1118 scoped_ptr<FrameRateController> frame_rate_controller; | 1117 scoped_ptr<FrameRateController> frame_rate_controller; |
| 1119 if (render_vsync_enabled_) { | 1118 if (throttle_frame_production_) { |
| 1120 if (render_vsync_notification_enabled_) { | 1119 if (render_parent_drives_begin_frame__) { |
| 1121 frame_rate_controller.reset( | 1120 frame_rate_controller.reset( |
| 1122 new FrameRateController(VSyncTimeSource::Create( | 1121 new FrameRateController(VSyncTimeSource::Create( |
| 1123 this, | 1122 this, |
| 1124 synchronously_disable_vsync_ ? | 1123 using_synchronous_renderer_compositor_ ? |
| 1125 VSyncTimeSource::DISABLE_SYNCHRONOUSLY : | 1124 VSyncTimeSource::DISABLE_SYNCHRONOUSLY : |
| 1126 VSyncTimeSource::DISABLE_ON_NEXT_TICK))); | 1125 VSyncTimeSource::DISABLE_ON_NEXT_TICK))); |
| 1127 } else { | 1126 } else { |
| 1128 frame_rate_controller.reset( | 1127 frame_rate_controller.reset( |
| 1129 new FrameRateController(DelayBasedTimeSource::Create( | 1128 new FrameRateController(DelayBasedTimeSource::Create( |
| 1130 display_refresh_interval, Proxy::ImplThread()))); | 1129 display_refresh_interval, Proxy::ImplThread()))); |
| 1131 } | 1130 } |
| 1132 } else { | 1131 } else { |
| 1133 frame_rate_controller.reset(new FrameRateController(Proxy::ImplThread())); | 1132 frame_rate_controller.reset(new FrameRateController(Proxy::ImplThread())); |
| 1134 } | 1133 } |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1200 if (layer_tree_host_impl_->resource_provider()) | 1199 if (layer_tree_host_impl_->resource_provider()) |
| 1201 layer_tree_host_impl_->resource_provider()->Finish(); | 1200 layer_tree_host_impl_->resource_provider()->Finish(); |
| 1202 completion->Signal(); | 1201 completion->Signal(); |
| 1203 } | 1202 } |
| 1204 | 1203 |
| 1205 void ThreadProxy::LayerTreeHostClosedOnImplThread(CompletionEvent* completion) { | 1204 void ThreadProxy::LayerTreeHostClosedOnImplThread(CompletionEvent* completion) { |
| 1206 TRACE_EVENT0("cc", "ThreadProxy::LayerTreeHostClosedOnImplThread"); | 1205 TRACE_EVENT0("cc", "ThreadProxy::LayerTreeHostClosedOnImplThread"); |
| 1207 DCHECK(IsImplThread()); | 1206 DCHECK(IsImplThread()); |
| 1208 layer_tree_host_->DeleteContentsTexturesOnImplThread( | 1207 layer_tree_host_->DeleteContentsTexturesOnImplThread( |
| 1209 layer_tree_host_impl_->resource_provider()); | 1208 layer_tree_host_impl_->resource_provider()); |
| 1210 layer_tree_host_impl_->EnableVSyncNotification(false); | 1209 layer_tree_host_impl_->SetNeedsBeginFrame(false); |
| 1211 scheduler_on_impl_thread_.reset(); | 1210 scheduler_on_impl_thread_.reset(); |
| 1212 layer_tree_host_impl_.reset(); | 1211 layer_tree_host_impl_.reset(); |
| 1213 weak_factory_on_impl_thread_.InvalidateWeakPtrs(); | 1212 weak_factory_on_impl_thread_.InvalidateWeakPtrs(); |
| 1214 vsync_client_ = NULL; | 1213 vsync_client_ = NULL; |
| 1215 completion->Signal(); | 1214 completion->Signal(); |
| 1216 } | 1215 } |
| 1217 | 1216 |
| 1218 size_t ThreadProxy::MaxPartialTextureUpdates() const { | 1217 size_t ThreadProxy::MaxPartialTextureUpdates() const { |
| 1219 return ResourceUpdateController::MaxPartialTextureUpdates(); | 1218 return ResourceUpdateController::MaxPartialTextureUpdates(); |
| 1220 } | 1219 } |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1361 base::Bind(&ThreadProxy::StartScrollbarAnimationOnImplThread, | 1360 base::Bind(&ThreadProxy::StartScrollbarAnimationOnImplThread, |
| 1362 impl_thread_weak_ptr_), | 1361 impl_thread_weak_ptr_), |
| 1363 delay); | 1362 delay); |
| 1364 } | 1363 } |
| 1365 | 1364 |
| 1366 void ThreadProxy::StartScrollbarAnimationOnImplThread() { | 1365 void ThreadProxy::StartScrollbarAnimationOnImplThread() { |
| 1367 layer_tree_host_impl_->StartScrollbarAnimation( | 1366 layer_tree_host_impl_->StartScrollbarAnimation( |
| 1368 layer_tree_host_impl_->CurrentFrameTimeTicks()); | 1367 layer_tree_host_impl_->CurrentFrameTimeTicks()); |
| 1369 } | 1368 } |
| 1370 | 1369 |
| 1371 void ThreadProxy::DidReceiveLastInputEventForVSync( | 1370 void ThreadProxy::DidReceiveLastInputEventForBeginFrameOnImplThread( |
| 1372 base::TimeTicks frame_time) { | 1371 base::TimeTicks frame_time) { |
| 1373 if (render_vsync_notification_enabled_) { | 1372 if (render_parent_drives_begin_frame__) { |
| 1374 TRACE_EVENT0("cc", "ThreadProxy::DidReceiveLastInputEventForVSync"); | 1373 TRACE_EVENT0("cc", |
| 1375 DidVSync(frame_time); | 1374 "ThreadProxy::DidReceiveLastInputEventForBeginFrameOnImplThread"); |
| 1375 BeginFrameOnImplThread(frame_time); |
| 1376 } | 1376 } |
| 1377 } | 1377 } |
| 1378 | 1378 |
| 1379 void ThreadProxy::DidActivatePendingTree() { | 1379 void ThreadProxy::DidActivatePendingTree() { |
| 1380 DCHECK(IsImplThread()); | 1380 DCHECK(IsImplThread()); |
| 1381 TRACE_EVENT0("cc", "ThreadProxy::DidActivatePendingTreeOnImplThread"); | 1381 TRACE_EVENT0("cc", "ThreadProxy::DidActivatePendingTreeOnImplThread"); |
| 1382 | 1382 |
| 1383 if (completion_event_for_commit_held_on_tree_activation_ && | 1383 if (completion_event_for_commit_held_on_tree_activation_ && |
| 1384 !layer_tree_host_impl_->pending_tree()) { | 1384 !layer_tree_host_impl_->pending_tree()) { |
| 1385 TRACE_EVENT_INSTANT0("cc", "ReleaseCommitbyActivation", | 1385 TRACE_EVENT_INSTANT0("cc", "ReleaseCommitbyActivation", |
| 1386 TRACE_EVENT_SCOPE_THREAD); | 1386 TRACE_EVENT_SCOPE_THREAD); |
| 1387 DCHECK(layer_tree_host_impl_->settings().impl_side_painting); | 1387 DCHECK(layer_tree_host_impl_->settings().impl_side_painting); |
| 1388 completion_event_for_commit_held_on_tree_activation_->Signal(); | 1388 completion_event_for_commit_held_on_tree_activation_->Signal(); |
| 1389 completion_event_for_commit_held_on_tree_activation_ = NULL; | 1389 completion_event_for_commit_held_on_tree_activation_ = NULL; |
| 1390 } | 1390 } |
| 1391 } | 1391 } |
| 1392 | 1392 |
| 1393 } // namespace cc | 1393 } // namespace cc |
| OLD | NEW |