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 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
331 Proxy::ImplThread()->PostTask( | 331 Proxy::ImplThread()->PostTask( |
332 base::Bind(&ThreadProxy::CheckOutputSurfaceStatusOnImplThread, | 332 base::Bind(&ThreadProxy::CheckOutputSurfaceStatusOnImplThread, |
333 impl_thread_weak_ptr_)); | 333 impl_thread_weak_ptr_)); |
334 } | 334 } |
335 | 335 |
336 void ThreadProxy::CheckOutputSurfaceStatusOnImplThread() { | 336 void ThreadProxy::CheckOutputSurfaceStatusOnImplThread() { |
337 DCHECK(IsImplThread()); | 337 DCHECK(IsImplThread()); |
338 TRACE_EVENT0("cc", "ThreadProxy::CheckOutputSurfaceStatusOnImplThread"); | 338 TRACE_EVENT0("cc", "ThreadProxy::CheckOutputSurfaceStatusOnImplThread"); |
339 if (!layer_tree_host_impl_->IsContextLost()) | 339 if (!layer_tree_host_impl_->IsContextLost()) |
340 return; | 340 return; |
341 cc::ContextProvider* offscreen_contexts = | 341 if (cc::ContextProvider* offscreen_contexts = layer_tree_host_impl_ |
342 layer_tree_host_impl_->resource_provider() ? | 342 ->resource_provider()->offscreen_context_provider()) |
343 layer_tree_host_impl_->resource_provider()-> | |
344 offscreen_context_provider() : NULL; | |
345 | |
346 if (offscreen_contexts) | |
347 offscreen_contexts->VerifyContexts(); | 343 offscreen_contexts->VerifyContexts(); |
348 scheduler_on_impl_thread_->DidLoseOutputSurface(); | 344 scheduler_on_impl_thread_->DidLoseOutputSurface(); |
349 } | 345 } |
350 | 346 |
351 void ThreadProxy::OnSwapBuffersCompleteOnImplThread() { | 347 void ThreadProxy::OnSwapBuffersCompleteOnImplThread() { |
352 DCHECK(IsImplThread()); | 348 DCHECK(IsImplThread()); |
353 TRACE_EVENT0("cc", "ThreadProxy::OnSwapBuffersCompleteOnImplThread"); | 349 TRACE_EVENT0("cc", "ThreadProxy::OnSwapBuffersCompleteOnImplThread"); |
354 Proxy::MainThread()->PostTask( | 350 Proxy::MainThread()->PostTask( |
355 base::Bind(&ThreadProxy::DidCompleteSwapBuffers, main_thread_weak_ptr_)); | 351 base::Bind(&ThreadProxy::DidCompleteSwapBuffers, main_thread_weak_ptr_)); |
356 } | 352 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
401 base::Passed(&events), | 397 base::Passed(&events), |
402 wall_clock_time)); | 398 wall_clock_time)); |
403 } | 399 } |
404 | 400 |
405 bool ThreadProxy::ReduceContentsTextureMemoryOnImplThread(size_t limit_bytes, | 401 bool ThreadProxy::ReduceContentsTextureMemoryOnImplThread(size_t limit_bytes, |
406 int priority_cutoff) { | 402 int priority_cutoff) { |
407 DCHECK(IsImplThread()); | 403 DCHECK(IsImplThread()); |
408 | 404 |
409 if (!layer_tree_host_->contents_texture_manager()) | 405 if (!layer_tree_host_->contents_texture_manager()) |
410 return false; | 406 return false; |
411 if (!layer_tree_host_impl_->resource_provider()) | |
412 return false; | |
413 | 407 |
414 bool reduce_result = layer_tree_host_->contents_texture_manager()-> | 408 bool reduce_result = layer_tree_host_->contents_texture_manager()-> |
415 ReduceMemoryOnImplThread(limit_bytes, | 409 ReduceMemoryOnImplThread(limit_bytes, |
416 priority_cutoff, | 410 priority_cutoff, |
417 layer_tree_host_impl_->resource_provider()); | 411 layer_tree_host_impl_->resource_provider()); |
418 if (!reduce_result) | 412 if (!reduce_result) |
419 return false; | 413 return false; |
420 | 414 |
421 // The texture upload queue may reference textures that were just purged, | 415 // The texture upload queue may reference textures that were just purged, |
422 // clear them from the queue. | 416 // clear them from the queue. |
423 if (current_resource_update_controller_on_impl_thread_) { | 417 if (current_resource_update_controller_on_impl_thread_) { |
424 current_resource_update_controller_on_impl_thread_-> | 418 current_resource_update_controller_on_impl_thread_-> |
425 DiscardUploadsToEvictedResources(); | 419 DiscardUploadsToEvictedResources(); |
426 } | 420 } |
427 return true; | 421 return true; |
428 } | 422 } |
429 | 423 |
430 void ThreadProxy::ReduceWastedContentsTextureMemoryOnImplThread() { | 424 void ThreadProxy::ReduceWastedContentsTextureMemoryOnImplThread() { |
431 DCHECK(IsImplThread()); | 425 DCHECK(IsImplThread()); |
432 | 426 |
433 if (!layer_tree_host_->contents_texture_manager()) | 427 if (!layer_tree_host_->contents_texture_manager()) |
434 return; | 428 return; |
435 if (!layer_tree_host_impl_->resource_provider()) | |
436 return; | |
437 | 429 |
438 layer_tree_host_->contents_texture_manager()->ReduceWastedMemoryOnImplThread( | 430 layer_tree_host_->contents_texture_manager()->ReduceWastedMemoryOnImplThread( |
439 layer_tree_host_impl_->resource_provider()); | 431 layer_tree_host_impl_->resource_provider()); |
440 } | 432 } |
441 | 433 |
442 void ThreadProxy::SendManagedMemoryStats() { | 434 void ThreadProxy::SendManagedMemoryStats() { |
443 DCHECK(IsImplThread()); | 435 DCHECK(IsImplThread()); |
444 if (!layer_tree_host_impl_) | 436 if (!layer_tree_host_impl_) |
445 return; | 437 return; |
446 if (!layer_tree_host_->contents_texture_manager()) | 438 if (!layer_tree_host_->contents_texture_manager()) |
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
772 DCHECK(scheduler_on_impl_thread_->CommitPending()); | 764 DCHECK(scheduler_on_impl_thread_->CommitPending()); |
773 | 765 |
774 if (!layer_tree_host_impl_) { | 766 if (!layer_tree_host_impl_) { |
775 TRACE_EVENT0("cc", "EarlyOut_NoLayerTree"); | 767 TRACE_EVENT0("cc", "EarlyOut_NoLayerTree"); |
776 completion->Signal(); | 768 completion->Signal(); |
777 return; | 769 return; |
778 } | 770 } |
779 | 771 |
780 if (offscreen_context_provider.get()) | 772 if (offscreen_context_provider.get()) |
781 offscreen_context_provider->BindToCurrentThread(); | 773 offscreen_context_provider->BindToCurrentThread(); |
782 if (layer_tree_host_impl_->resource_provider()) { | 774 layer_tree_host_impl_->resource_provider()-> |
783 layer_tree_host_impl_->resource_provider()-> | 775 set_offscreen_context_provider(offscreen_context_provider); |
784 set_offscreen_context_provider(offscreen_context_provider); | |
785 } | |
786 | 776 |
787 if (layer_tree_host_->contents_texture_manager()) { | 777 if (layer_tree_host_->contents_texture_manager()) { |
788 if (layer_tree_host_->contents_texture_manager()-> | 778 if (layer_tree_host_->contents_texture_manager()-> |
789 LinkedEvictedBackingsExist()) { | 779 LinkedEvictedBackingsExist()) { |
790 // Clear any uploads we were making to textures linked to evicted | 780 // Clear any uploads we were making to textures linked to evicted |
791 // resources | 781 // resources |
792 queue->ClearUploadsToEvictedResources(); | 782 queue->ClearUploadsToEvictedResources(); |
793 // Some textures in the layer tree are invalid. Kick off another commit | 783 // Some textures in the layer tree are invalid. Kick off another commit |
794 // to fill them again. | 784 // to fill them again. |
795 SetNeedsCommitOnImplThread(); | 785 SetNeedsCommitOnImplThread(); |
796 } | 786 } |
797 | 787 |
798 layer_tree_host_->contents_texture_manager()-> | 788 layer_tree_host_->contents_texture_manager()-> |
799 PushTexturePrioritiesToBackings(); | 789 PushTexturePrioritiesToBackings(); |
800 } | 790 } |
801 | 791 |
802 commit_completion_event_on_impl_thread_ = completion; | 792 commit_completion_event_on_impl_thread_ = completion; |
803 if (layer_tree_host_impl_->resource_provider()) { | 793 current_resource_update_controller_on_impl_thread_ = |
804 current_resource_update_controller_on_impl_thread_ = | 794 ResourceUpdateController::Create( |
805 ResourceUpdateController::Create( | 795 this, |
806 this, | 796 Proxy::ImplThread()->TaskRunner(), |
807 Proxy::ImplThread()->TaskRunner(), | 797 queue.Pass(), |
808 queue.Pass(), | 798 layer_tree_host_impl_->resource_provider()); |
809 layer_tree_host_impl_->resource_provider()); | 799 current_resource_update_controller_on_impl_thread_->PerformMoreUpdates( |
810 current_resource_update_controller_on_impl_thread_->PerformMoreUpdates( | 800 scheduler_on_impl_thread_->AnticipatedDrawTime()); |
811 scheduler_on_impl_thread_->AnticipatedDrawTime()); | |
812 } else { | |
813 // Normally the ResourceUpdateController notifies when commit should | |
814 // finish, but in tile-free software rendering there is no resource | |
815 // update step so jump straight to the notification. | |
816 scheduler_on_impl_thread_->FinishCommit(); | |
817 } | |
818 } | 801 } |
819 | 802 |
820 void ThreadProxy::BeginFrameAbortedByMainThreadOnImplThread() { | 803 void ThreadProxy::BeginFrameAbortedByMainThreadOnImplThread() { |
821 TRACE_EVENT0("cc", "ThreadProxy::BeginFrameAbortedByMainThreadOnImplThread"); | 804 TRACE_EVENT0("cc", "ThreadProxy::BeginFrameAbortedByMainThreadOnImplThread"); |
822 DCHECK(IsImplThread()); | 805 DCHECK(IsImplThread()); |
823 DCHECK(scheduler_on_impl_thread_); | 806 DCHECK(scheduler_on_impl_thread_); |
824 DCHECK(scheduler_on_impl_thread_->CommitPending()); | 807 DCHECK(scheduler_on_impl_thread_->CommitPending()); |
825 | 808 |
826 scheduler_on_impl_thread_->BeginFrameAbortedByMainThread(); | 809 scheduler_on_impl_thread_->BeginFrameAbortedByMainThread(); |
827 } | 810 } |
828 | 811 |
829 void ThreadProxy::ScheduledActionCommit() { | 812 void ThreadProxy::ScheduledActionCommit() { |
830 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionCommit"); | 813 TRACE_EVENT0("cc", "ThreadProxy::ScheduledActionCommit"); |
831 DCHECK(IsImplThread()); | 814 DCHECK(IsImplThread()); |
832 DCHECK(commit_completion_event_on_impl_thread_); | 815 DCHECK(commit_completion_event_on_impl_thread_); |
833 if (current_resource_update_controller_on_impl_thread_) { | 816 DCHECK(current_resource_update_controller_on_impl_thread_); |
834 // Complete all remaining texture updates. | 817 |
835 current_resource_update_controller_on_impl_thread_->Finalize(); | 818 // Complete all remaining texture updates. |
836 current_resource_update_controller_on_impl_thread_.reset(); | 819 current_resource_update_controller_on_impl_thread_->Finalize(); |
837 } | 820 current_resource_update_controller_on_impl_thread_.reset(); |
838 | 821 |
839 layer_tree_host_impl_->BeginCommit(); | 822 layer_tree_host_impl_->BeginCommit(); |
840 layer_tree_host_->BeginCommitOnImplThread(layer_tree_host_impl_.get()); | 823 layer_tree_host_->BeginCommitOnImplThread(layer_tree_host_impl_.get()); |
841 layer_tree_host_->FinishCommitOnImplThread(layer_tree_host_impl_.get()); | 824 layer_tree_host_->FinishCommitOnImplThread(layer_tree_host_impl_.get()); |
842 layer_tree_host_impl_->CommitComplete(); | 825 layer_tree_host_impl_->CommitComplete(); |
843 | 826 |
844 layer_tree_host_impl_->UpdateBackgroundAnimateTicking( | 827 layer_tree_host_impl_->UpdateBackgroundAnimateTicking( |
845 !scheduler_on_impl_thread_->WillDrawIfNeeded()); | 828 !scheduler_on_impl_thread_->WillDrawIfNeeded()); |
846 | 829 |
847 next_frame_is_newly_committed_frame_on_impl_thread_ = true; | 830 next_frame_is_newly_committed_frame_on_impl_thread_ = true; |
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1199 void ThreadProxy::DidTryInitializeRendererOnImplThread( | 1182 void ThreadProxy::DidTryInitializeRendererOnImplThread( |
1200 bool success, | 1183 bool success, |
1201 scoped_refptr<ContextProvider> offscreen_context_provider) { | 1184 scoped_refptr<ContextProvider> offscreen_context_provider) { |
1202 DCHECK(IsImplThread()); | 1185 DCHECK(IsImplThread()); |
1203 DCHECK(!inside_draw_); | 1186 DCHECK(!inside_draw_); |
1204 | 1187 |
1205 if (offscreen_context_provider.get()) | 1188 if (offscreen_context_provider.get()) |
1206 offscreen_context_provider->BindToCurrentThread(); | 1189 offscreen_context_provider->BindToCurrentThread(); |
1207 | 1190 |
1208 if (success) { | 1191 if (success) { |
1209 if (layer_tree_host_impl_->resource_provider()) { | 1192 layer_tree_host_impl_->resource_provider()-> |
1210 layer_tree_host_impl_->resource_provider()-> | 1193 set_offscreen_context_provider(offscreen_context_provider); |
1211 set_offscreen_context_provider(offscreen_context_provider); | |
1212 } | |
1213 } else if (offscreen_context_provider.get()) { | 1194 } else if (offscreen_context_provider.get()) { |
1214 offscreen_context_provider->VerifyContexts(); | 1195 offscreen_context_provider->VerifyContexts(); |
1215 } | 1196 } |
1216 } | 1197 } |
1217 | 1198 |
1218 void ThreadProxy::FinishGLOnImplThread(CompletionEvent* completion) { | 1199 void ThreadProxy::FinishGLOnImplThread(CompletionEvent* completion) { |
1219 TRACE_EVENT0("cc", "ThreadProxy::FinishGLOnImplThread"); | 1200 TRACE_EVENT0("cc", "ThreadProxy::FinishGLOnImplThread"); |
1220 DCHECK(IsImplThread()); | 1201 DCHECK(IsImplThread()); |
1221 if (layer_tree_host_impl_->resource_provider()) | 1202 if (layer_tree_host_impl_->resource_provider()) |
1222 layer_tree_host_impl_->resource_provider()->Finish(); | 1203 layer_tree_host_impl_->resource_provider()->Finish(); |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1418 !layer_tree_host_impl_->pending_tree()) { | 1399 !layer_tree_host_impl_->pending_tree()) { |
1419 TRACE_EVENT_INSTANT0("cc", "ReleaseCommitbyActivation", | 1400 TRACE_EVENT_INSTANT0("cc", "ReleaseCommitbyActivation", |
1420 TRACE_EVENT_SCOPE_THREAD); | 1401 TRACE_EVENT_SCOPE_THREAD); |
1421 DCHECK(layer_tree_host_impl_->settings().impl_side_painting); | 1402 DCHECK(layer_tree_host_impl_->settings().impl_side_painting); |
1422 completion_event_for_commit_held_on_tree_activation_->Signal(); | 1403 completion_event_for_commit_held_on_tree_activation_->Signal(); |
1423 completion_event_for_commit_held_on_tree_activation_ = NULL; | 1404 completion_event_for_commit_held_on_tree_activation_ = NULL; |
1424 } | 1405 } |
1425 } | 1406 } |
1426 | 1407 |
1427 } // namespace cc | 1408 } // namespace cc |
OLD | NEW |