| 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 <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 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 344 FROM_HERE, | 344 FROM_HERE, |
| 345 base::Bind(&ThreadProxy::CheckOutputSurfaceStatusOnImplThread, | 345 base::Bind(&ThreadProxy::CheckOutputSurfaceStatusOnImplThread, |
| 346 impl_thread_weak_ptr_)); | 346 impl_thread_weak_ptr_)); |
| 347 } | 347 } |
| 348 | 348 |
| 349 void ThreadProxy::CheckOutputSurfaceStatusOnImplThread() { | 349 void ThreadProxy::CheckOutputSurfaceStatusOnImplThread() { |
| 350 DCHECK(IsImplThread()); | 350 DCHECK(IsImplThread()); |
| 351 TRACE_EVENT0("cc", "ThreadProxy::CheckOutputSurfaceStatusOnImplThread"); | 351 TRACE_EVENT0("cc", "ThreadProxy::CheckOutputSurfaceStatusOnImplThread"); |
| 352 if (!layer_tree_host_impl_->IsContextLost()) | 352 if (!layer_tree_host_impl_->IsContextLost()) |
| 353 return; | 353 return; |
| 354 cc::ContextProvider* offscreen_contexts = | 354 if (cc::ContextProvider* offscreen_contexts = layer_tree_host_impl_ |
| 355 layer_tree_host_impl_->resource_provider() ? | 355 ->resource_provider()->offscreen_context_provider()) |
| 356 layer_tree_host_impl_->resource_provider()-> | |
| 357 offscreen_context_provider() : NULL; | |
| 358 | |
| 359 if (offscreen_contexts) | |
| 360 offscreen_contexts->VerifyContexts(); | 356 offscreen_contexts->VerifyContexts(); |
| 361 scheduler_on_impl_thread_->DidLoseOutputSurface(); | 357 scheduler_on_impl_thread_->DidLoseOutputSurface(); |
| 362 } | 358 } |
| 363 | 359 |
| 364 void ThreadProxy::OnSwapBuffersCompleteOnImplThread() { | 360 void ThreadProxy::OnSwapBuffersCompleteOnImplThread() { |
| 365 DCHECK(IsImplThread()); | 361 DCHECK(IsImplThread()); |
| 366 TRACE_EVENT0("cc", "ThreadProxy::OnSwapBuffersCompleteOnImplThread"); | 362 TRACE_EVENT0("cc", "ThreadProxy::OnSwapBuffersCompleteOnImplThread"); |
| 367 Proxy::MainThreadTaskRunner()->PostTask( | 363 Proxy::MainThreadTaskRunner()->PostTask( |
| 368 FROM_HERE, | 364 FROM_HERE, |
| 369 base::Bind(&ThreadProxy::DidCompleteSwapBuffers, main_thread_weak_ptr_)); | 365 base::Bind(&ThreadProxy::DidCompleteSwapBuffers, main_thread_weak_ptr_)); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 417 base::Passed(&events), | 413 base::Passed(&events), |
| 418 wall_clock_time)); | 414 wall_clock_time)); |
| 419 } | 415 } |
| 420 | 416 |
| 421 bool ThreadProxy::ReduceContentsTextureMemoryOnImplThread(size_t limit_bytes, | 417 bool ThreadProxy::ReduceContentsTextureMemoryOnImplThread(size_t limit_bytes, |
| 422 int priority_cutoff) { | 418 int priority_cutoff) { |
| 423 DCHECK(IsImplThread()); | 419 DCHECK(IsImplThread()); |
| 424 | 420 |
| 425 if (!layer_tree_host_->contents_texture_manager()) | 421 if (!layer_tree_host_->contents_texture_manager()) |
| 426 return false; | 422 return false; |
| 427 if (!layer_tree_host_impl_->resource_provider()) | |
| 428 return false; | |
| 429 | 423 |
| 430 bool reduce_result = layer_tree_host_->contents_texture_manager()-> | 424 bool reduce_result = layer_tree_host_->contents_texture_manager()-> |
| 431 ReduceMemoryOnImplThread(limit_bytes, | 425 ReduceMemoryOnImplThread(limit_bytes, |
| 432 priority_cutoff, | 426 priority_cutoff, |
| 433 layer_tree_host_impl_->resource_provider()); | 427 layer_tree_host_impl_->resource_provider()); |
| 434 if (!reduce_result) | 428 if (!reduce_result) |
| 435 return false; | 429 return false; |
| 436 | 430 |
| 437 // The texture upload queue may reference textures that were just purged, | 431 // The texture upload queue may reference textures that were just purged, |
| 438 // clear them from the queue. | 432 // clear them from the queue. |
| 439 if (current_resource_update_controller_on_impl_thread_) { | 433 if (current_resource_update_controller_on_impl_thread_) { |
| 440 current_resource_update_controller_on_impl_thread_-> | 434 current_resource_update_controller_on_impl_thread_-> |
| 441 DiscardUploadsToEvictedResources(); | 435 DiscardUploadsToEvictedResources(); |
| 442 } | 436 } |
| 443 return true; | 437 return true; |
| 444 } | 438 } |
| 445 | 439 |
| 446 void ThreadProxy::ReduceWastedContentsTextureMemoryOnImplThread() { | 440 void ThreadProxy::ReduceWastedContentsTextureMemoryOnImplThread() { |
| 447 DCHECK(IsImplThread()); | 441 DCHECK(IsImplThread()); |
| 448 | 442 |
| 449 if (!layer_tree_host_->contents_texture_manager()) | 443 if (!layer_tree_host_->contents_texture_manager()) |
| 450 return; | 444 return; |
| 451 if (!layer_tree_host_impl_->resource_provider()) | |
| 452 return; | |
| 453 | 445 |
| 454 layer_tree_host_->contents_texture_manager()->ReduceWastedMemoryOnImplThread( | 446 layer_tree_host_->contents_texture_manager()->ReduceWastedMemoryOnImplThread( |
| 455 layer_tree_host_impl_->resource_provider()); | 447 layer_tree_host_impl_->resource_provider()); |
| 456 } | 448 } |
| 457 | 449 |
| 458 void ThreadProxy::SendManagedMemoryStats() { | 450 void ThreadProxy::SendManagedMemoryStats() { |
| 459 DCHECK(IsImplThread()); | 451 DCHECK(IsImplThread()); |
| 460 if (!layer_tree_host_impl_) | 452 if (!layer_tree_host_impl_) |
| 461 return; | 453 return; |
| 462 if (!layer_tree_host_->contents_texture_manager()) | 454 if (!layer_tree_host_->contents_texture_manager()) |
| (...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 799 DCHECK(scheduler_on_impl_thread_->CommitPending()); | 791 DCHECK(scheduler_on_impl_thread_->CommitPending()); |
| 800 | 792 |
| 801 if (!layer_tree_host_impl_) { | 793 if (!layer_tree_host_impl_) { |
| 802 TRACE_EVENT0("cc", "EarlyOut_NoLayerTree"); | 794 TRACE_EVENT0("cc", "EarlyOut_NoLayerTree"); |
| 803 completion->Signal(); | 795 completion->Signal(); |
| 804 return; | 796 return; |
| 805 } | 797 } |
| 806 | 798 |
| 807 if (offscreen_context_provider.get()) | 799 if (offscreen_context_provider.get()) |
| 808 offscreen_context_provider->BindToCurrentThread(); | 800 offscreen_context_provider->BindToCurrentThread(); |
| 809 if (layer_tree_host_impl_->resource_provider()) { | 801 layer_tree_host_impl_->resource_provider()-> |
| 810 layer_tree_host_impl_->resource_provider()-> | 802 set_offscreen_context_provider(offscreen_context_provider); |
| 811 set_offscreen_context_provider(offscreen_context_provider); | |
| 812 } | |
| 813 | 803 |
| 814 if (layer_tree_host_->contents_texture_manager()) { | 804 if (layer_tree_host_->contents_texture_manager()) { |
| 815 if (layer_tree_host_->contents_texture_manager()-> | 805 if (layer_tree_host_->contents_texture_manager()-> |
| 816 LinkedEvictedBackingsExist()) { | 806 LinkedEvictedBackingsExist()) { |
| 817 // Clear any uploads we were making to textures linked to evicted | 807 // Clear any uploads we were making to textures linked to evicted |
| 818 // resources | 808 // resources |
| 819 queue->ClearUploadsToEvictedResources(); | 809 queue->ClearUploadsToEvictedResources(); |
| 820 // Some textures in the layer tree are invalid. Kick off another commit | 810 // Some textures in the layer tree are invalid. Kick off another commit |
| 821 // to fill them again. | 811 // to fill them again. |
| 822 SetNeedsCommitOnImplThread(); | 812 SetNeedsCommitOnImplThread(); |
| 823 } | 813 } |
| 824 | 814 |
| 825 layer_tree_host_->contents_texture_manager()-> | 815 layer_tree_host_->contents_texture_manager()-> |
| 826 PushTexturePrioritiesToBackings(); | 816 PushTexturePrioritiesToBackings(); |
| 827 } | 817 } |
| 828 | 818 |
| 829 commit_completion_event_on_impl_thread_ = completion; | 819 commit_completion_event_on_impl_thread_ = completion; |
| 830 if (layer_tree_host_impl_->resource_provider()) { | 820 current_resource_update_controller_on_impl_thread_ = |
| 831 current_resource_update_controller_on_impl_thread_ = | 821 ResourceUpdateController::Create( |
| 832 ResourceUpdateController::Create( | 822 this, |
| 833 this, | 823 Proxy::ImplThreadTaskRunner(), |
| 834 Proxy::ImplThreadTaskRunner(), | 824 queue.Pass(), |
| 835 queue.Pass(), | 825 layer_tree_host_impl_->resource_provider()); |
| 836 layer_tree_host_impl_->resource_provider()); | 826 current_resource_update_controller_on_impl_thread_->PerformMoreUpdates( |
| 837 current_resource_update_controller_on_impl_thread_->PerformMoreUpdates( | 827 scheduler_on_impl_thread_->AnticipatedDrawTime()); |
| 838 scheduler_on_impl_thread_->AnticipatedDrawTime()); | |
| 839 } else { | |
| 840 // Normally the ResourceUpdateController notifies when commit should | |
| 841 // finish, but in tile-free software rendering there is no resource | |
| 842 // update step so jump straight to the notification. | |
| 843 scheduler_on_impl_thread_->FinishCommit(); | |
| 844 } | |
| 845 } | 828 } |
| 846 | 829 |
| 847 void ThreadProxy::BeginFrameAbortedByMainThreadOnImplThread() { | 830 void ThreadProxy::BeginFrameAbortedByMainThreadOnImplThread() { |
| 848 TRACE_EVENT0("cc", "ThreadProxy::BeginFrameAbortedByMainThreadOnImplThread"); | 831 TRACE_EVENT0("cc", "ThreadProxy::BeginFrameAbortedByMainThreadOnImplThread"); |
| 849 DCHECK(IsImplThread()); | 832 DCHECK(IsImplThread()); |
| 850 DCHECK(scheduler_on_impl_thread_); | 833 DCHECK(scheduler_on_impl_thread_); |
| 851 DCHECK(scheduler_on_impl_thread_->CommitPending()); | 834 DCHECK(scheduler_on_impl_thread_->CommitPending()); |
| 852 | 835 |
| 853 scheduler_on_impl_thread_->BeginFrameAbortedByMainThread(); | 836 scheduler_on_impl_thread_->BeginFrameAbortedByMainThread(); |
| 854 } | 837 } |
| 855 | 838 |
| 856 void ThreadProxy::ScheduledActionCommit() { | 839 void ThreadProxy::ScheduledActionCommit() { |
| 857 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionCommit"); | 840 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionCommit"); |
| 858 DCHECK(IsImplThread()); | 841 DCHECK(IsImplThread()); |
| 859 DCHECK(commit_completion_event_on_impl_thread_); | 842 DCHECK(commit_completion_event_on_impl_thread_); |
| 860 if (current_resource_update_controller_on_impl_thread_) { | 843 DCHECK(current_resource_update_controller_on_impl_thread_); |
| 861 // Complete all remaining texture updates. | 844 |
| 862 current_resource_update_controller_on_impl_thread_->Finalize(); | 845 // Complete all remaining texture updates. |
| 863 current_resource_update_controller_on_impl_thread_.reset(); | 846 current_resource_update_controller_on_impl_thread_->Finalize(); |
| 864 } | 847 current_resource_update_controller_on_impl_thread_.reset(); |
| 865 | 848 |
| 866 layer_tree_host_impl_->BeginCommit(); | 849 layer_tree_host_impl_->BeginCommit(); |
| 867 layer_tree_host_->BeginCommitOnImplThread(layer_tree_host_impl_.get()); | 850 layer_tree_host_->BeginCommitOnImplThread(layer_tree_host_impl_.get()); |
| 868 layer_tree_host_->FinishCommitOnImplThread(layer_tree_host_impl_.get()); | 851 layer_tree_host_->FinishCommitOnImplThread(layer_tree_host_impl_.get()); |
| 869 layer_tree_host_impl_->CommitComplete(); | 852 layer_tree_host_impl_->CommitComplete(); |
| 870 | 853 |
| 871 layer_tree_host_impl_->UpdateBackgroundAnimateTicking( | 854 layer_tree_host_impl_->UpdateBackgroundAnimateTicking( |
| 872 !scheduler_on_impl_thread_->WillDrawIfNeeded()); | 855 !scheduler_on_impl_thread_->WillDrawIfNeeded()); |
| 873 | 856 |
| 874 next_frame_is_newly_committed_frame_on_impl_thread_ = true; | 857 next_frame_is_newly_committed_frame_on_impl_thread_ = true; |
| (...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1230 void ThreadProxy::DidTryInitializeRendererOnImplThread( | 1213 void ThreadProxy::DidTryInitializeRendererOnImplThread( |
| 1231 bool success, | 1214 bool success, |
| 1232 scoped_refptr<ContextProvider> offscreen_context_provider) { | 1215 scoped_refptr<ContextProvider> offscreen_context_provider) { |
| 1233 DCHECK(IsImplThread()); | 1216 DCHECK(IsImplThread()); |
| 1234 DCHECK(!inside_draw_); | 1217 DCHECK(!inside_draw_); |
| 1235 | 1218 |
| 1236 if (offscreen_context_provider.get()) | 1219 if (offscreen_context_provider.get()) |
| 1237 offscreen_context_provider->BindToCurrentThread(); | 1220 offscreen_context_provider->BindToCurrentThread(); |
| 1238 | 1221 |
| 1239 if (success) { | 1222 if (success) { |
| 1240 if (layer_tree_host_impl_->resource_provider()) { | 1223 layer_tree_host_impl_->resource_provider()-> |
| 1241 layer_tree_host_impl_->resource_provider()-> | 1224 set_offscreen_context_provider(offscreen_context_provider); |
| 1242 set_offscreen_context_provider(offscreen_context_provider); | |
| 1243 } | |
| 1244 } else if (offscreen_context_provider.get()) { | 1225 } else if (offscreen_context_provider.get()) { |
| 1245 offscreen_context_provider->VerifyContexts(); | 1226 offscreen_context_provider->VerifyContexts(); |
| 1246 } | 1227 } |
| 1247 } | 1228 } |
| 1248 | 1229 |
| 1249 void ThreadProxy::FinishGLOnImplThread(CompletionEvent* completion) { | 1230 void ThreadProxy::FinishGLOnImplThread(CompletionEvent* completion) { |
| 1250 TRACE_EVENT0("cc", "ThreadProxy::FinishGLOnImplThread"); | 1231 TRACE_EVENT0("cc", "ThreadProxy::FinishGLOnImplThread"); |
| 1251 DCHECK(IsImplThread()); | 1232 DCHECK(IsImplThread()); |
| 1252 if (layer_tree_host_impl_->resource_provider()) | 1233 if (layer_tree_host_impl_->resource_provider()) |
| 1253 layer_tree_host_impl_->resource_provider()->Finish(); | 1234 layer_tree_host_impl_->resource_provider()->Finish(); |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1456 !layer_tree_host_impl_->pending_tree()) { | 1437 !layer_tree_host_impl_->pending_tree()) { |
| 1457 TRACE_EVENT_INSTANT0("cc", "ReleaseCommitbyActivation", | 1438 TRACE_EVENT_INSTANT0("cc", "ReleaseCommitbyActivation", |
| 1458 TRACE_EVENT_SCOPE_THREAD); | 1439 TRACE_EVENT_SCOPE_THREAD); |
| 1459 DCHECK(layer_tree_host_impl_->settings().impl_side_painting); | 1440 DCHECK(layer_tree_host_impl_->settings().impl_side_painting); |
| 1460 completion_event_for_commit_held_on_tree_activation_->Signal(); | 1441 completion_event_for_commit_held_on_tree_activation_->Signal(); |
| 1461 completion_event_for_commit_held_on_tree_activation_ = NULL; | 1442 completion_event_for_commit_held_on_tree_activation_ = NULL; |
| 1462 } | 1443 } |
| 1463 } | 1444 } |
| 1464 | 1445 |
| 1465 } // namespace cc | 1446 } // namespace cc |
| OLD | NEW |