OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "gpu/ipc/in_process_command_buffer.h" | 5 #include "gpu/ipc/in_process_command_buffer.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <queue> | 10 #include <queue> |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 program_cache_.reset(new gles2::MemoryProgramCache( | 173 program_cache_.reset(new gles2::MemoryProgramCache( |
174 gpu_preferences_.gpu_program_cache_size, | 174 gpu_preferences_.gpu_program_cache_size, |
175 disable_disk_cache, | 175 disable_disk_cache, |
176 workarounds.disable_program_caching_for_transform_feedback)); | 176 workarounds.disable_program_caching_for_transform_feedback)); |
177 } | 177 } |
178 return program_cache_.get(); | 178 return program_cache_.get(); |
179 } | 179 } |
180 | 180 |
181 InProcessCommandBuffer::InProcessCommandBuffer( | 181 InProcessCommandBuffer::InProcessCommandBuffer( |
182 const scoped_refptr<Service>& service) | 182 const scoped_refptr<Service>& service) |
183 : command_buffer_id_( | 183 : command_buffer_id_(CommandBufferId::FromUnsafeValue( |
184 CommandBufferId::FromUnsafeValue(g_next_command_buffer_id.GetNext())), | 184 g_next_command_buffer_id.GetNext() + 1)), |
185 delayed_work_pending_(false), | 185 delayed_work_pending_(false), |
186 image_factory_(nullptr), | 186 image_factory_(nullptr), |
187 gpu_control_client_(nullptr), | 187 gpu_control_client_(nullptr), |
188 #if DCHECK_IS_ON() | 188 #if DCHECK_IS_ON() |
189 context_lost_(false), | 189 context_lost_(false), |
190 #endif | 190 #endif |
191 last_put_offset_(-1), | 191 last_put_offset_(-1), |
192 gpu_memory_buffer_manager_(nullptr), | 192 gpu_memory_buffer_manager_(nullptr), |
193 next_fence_sync_release_(1), | 193 next_fence_sync_release_(1), |
194 flushed_fence_sync_release_(0), | 194 flushed_fence_sync_release_(0), |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 } | 340 } |
341 } | 341 } |
342 } | 342 } |
343 | 343 |
344 if (!surface_.get()) { | 344 if (!surface_.get()) { |
345 LOG(ERROR) << "Could not create GLSurface."; | 345 LOG(ERROR) << "Could not create GLSurface."; |
346 DestroyOnGpuThread(); | 346 DestroyOnGpuThread(); |
347 return false; | 347 return false; |
348 } | 348 } |
349 | 349 |
350 sync_point_order_data_ = SyncPointOrderData::Create(); | 350 sync_point_order_data_ = |
351 sync_point_client_ = base::MakeUnique<SyncPointClient>( | 351 service_->sync_point_manager()->CreateSyncPointOrderData(); |
352 service_->sync_point_manager(), sync_point_order_data_, GetNamespaceID(), | 352 sync_point_client_state_ = |
353 GetCommandBufferID()); | 353 service_->sync_point_manager()->CreateSyncPointClientState( |
| 354 GetNamespaceID(), GetCommandBufferID(), |
| 355 sync_point_order_data_->sequence_id()); |
354 | 356 |
355 if (service_->UseVirtualizedGLContexts() || | 357 if (service_->UseVirtualizedGLContexts() || |
356 decoder_->GetContextGroup() | 358 decoder_->GetContextGroup() |
357 ->feature_info() | 359 ->feature_info() |
358 ->workarounds() | 360 ->workarounds() |
359 .use_virtualized_gl_contexts) { | 361 .use_virtualized_gl_contexts) { |
360 context_ = gl_share_group_->GetSharedContext(surface_.get()); | 362 context_ = gl_share_group_->GetSharedContext(surface_.get()); |
361 if (!context_.get()) { | 363 if (!context_.get()) { |
362 context_ = gl::init::CreateGLContext( | 364 context_ = gl::init::CreateGLContext( |
363 gl_share_group_.get(), surface_.get(), | 365 gl_share_group_.get(), surface_.get(), |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
452 gpu_thread_weak_ptr_factory_.InvalidateWeakPtrs(); | 454 gpu_thread_weak_ptr_factory_.InvalidateWeakPtrs(); |
453 command_buffer_.reset(); | 455 command_buffer_.reset(); |
454 // Clean up GL resources if possible. | 456 // Clean up GL resources if possible. |
455 bool have_context = context_.get() && context_->MakeCurrent(surface_.get()); | 457 bool have_context = context_.get() && context_->MakeCurrent(surface_.get()); |
456 if (decoder_) { | 458 if (decoder_) { |
457 decoder_->Destroy(have_context); | 459 decoder_->Destroy(have_context); |
458 decoder_.reset(); | 460 decoder_.reset(); |
459 } | 461 } |
460 context_ = nullptr; | 462 context_ = nullptr; |
461 surface_ = nullptr; | 463 surface_ = nullptr; |
462 sync_point_client_ = nullptr; | |
463 if (sync_point_order_data_) { | 464 if (sync_point_order_data_) { |
464 sync_point_order_data_->Destroy(); | 465 sync_point_order_data_->Destroy(); |
465 sync_point_order_data_ = nullptr; | 466 sync_point_order_data_ = nullptr; |
466 } | 467 } |
| 468 if (sync_point_client_state_) { |
| 469 sync_point_client_state_->Destroy(); |
| 470 sync_point_client_state_ = nullptr; |
| 471 } |
467 gl_share_group_ = nullptr; | 472 gl_share_group_ = nullptr; |
468 context_group_ = nullptr; | 473 context_group_ = nullptr; |
469 | 474 |
470 base::AutoLock lock(task_queue_lock_); | 475 base::AutoLock lock(task_queue_lock_); |
471 std::queue<std::unique_ptr<GpuTask>> empty; | 476 std::queue<std::unique_ptr<GpuTask>> empty; |
472 task_queue_.swap(empty); | 477 task_queue_.swap(empty); |
473 | 478 |
474 return true; | 479 return true; |
475 } | 480 } |
476 | 481 |
(...skipping 23 matching lines...) Expand all Loading... |
500 } | 505 } |
501 | 506 |
502 void InProcessCommandBuffer::QueueTask(bool out_of_order, | 507 void InProcessCommandBuffer::QueueTask(bool out_of_order, |
503 const base::Closure& task) { | 508 const base::Closure& task) { |
504 if (out_of_order) { | 509 if (out_of_order) { |
505 service_->ScheduleTask(task); | 510 service_->ScheduleTask(task); |
506 return; | 511 return; |
507 } | 512 } |
508 // Release the |task_queue_lock_| before calling ScheduleTask because | 513 // Release the |task_queue_lock_| before calling ScheduleTask because |
509 // the callback may get called immediately and attempt to acquire the lock. | 514 // the callback may get called immediately and attempt to acquire the lock. |
510 SyncPointManager* sync_manager = service_->sync_point_manager(); | 515 uint32_t order_num = sync_point_order_data_->GenerateUnprocessedOrderNumber(); |
511 uint32_t order_num = | |
512 sync_point_order_data_->GenerateUnprocessedOrderNumber(sync_manager); | |
513 { | 516 { |
514 base::AutoLock lock(task_queue_lock_); | 517 base::AutoLock lock(task_queue_lock_); |
515 task_queue_.push(base::MakeUnique<GpuTask>(task, order_num)); | 518 task_queue_.push(base::MakeUnique<GpuTask>(task, order_num)); |
516 } | 519 } |
517 service_->ScheduleTask(base::Bind( | 520 service_->ScheduleTask(base::Bind( |
518 &InProcessCommandBuffer::ProcessTasksOnGpuThread, gpu_thread_weak_ptr_)); | 521 &InProcessCommandBuffer::ProcessTasksOnGpuThread, gpu_thread_weak_ptr_)); |
519 } | 522 } |
520 | 523 |
521 void InProcessCommandBuffer::ProcessTasksOnGpuThread() { | 524 void InProcessCommandBuffer::ProcessTasksOnGpuThread() { |
522 while (executor_->scheduled()) { | 525 while (executor_->scheduled()) { |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
795 LOG(ERROR) << "Failed to create image for buffer."; | 798 LOG(ERROR) << "Failed to create image for buffer."; |
796 return; | 799 return; |
797 } | 800 } |
798 | 801 |
799 image_manager->AddImage(image.get(), id); | 802 image_manager->AddImage(image.get(), id); |
800 break; | 803 break; |
801 } | 804 } |
802 } | 805 } |
803 | 806 |
804 if (fence_sync) | 807 if (fence_sync) |
805 sync_point_client_->ReleaseFenceSync(fence_sync); | 808 sync_point_client_state_->ReleaseFenceSync(fence_sync); |
806 } | 809 } |
807 | 810 |
808 void InProcessCommandBuffer::DestroyImage(int32_t id) { | 811 void InProcessCommandBuffer::DestroyImage(int32_t id) { |
809 CheckSequencedThread(); | 812 CheckSequencedThread(); |
810 | 813 |
811 QueueTask(false, base::Bind(&InProcessCommandBuffer::DestroyImageOnGpuThread, | 814 QueueTask(false, base::Bind(&InProcessCommandBuffer::DestroyImageOnGpuThread, |
812 base::Unretained(this), id)); | 815 base::Unretained(this), id)); |
813 } | 816 } |
814 | 817 |
815 void InProcessCommandBuffer::DestroyImageOnGpuThread(int32_t id) { | 818 void InProcessCommandBuffer::DestroyImageOnGpuThread(int32_t id) { |
(...skipping 11 matching lines...) Expand all Loading... |
827 } | 830 } |
828 | 831 |
829 void InProcessCommandBuffer::FenceSyncReleaseOnGpuThread(uint64_t release) { | 832 void InProcessCommandBuffer::FenceSyncReleaseOnGpuThread(uint64_t release) { |
830 SyncToken sync_token(GetNamespaceID(), GetExtraCommandBufferData(), | 833 SyncToken sync_token(GetNamespaceID(), GetExtraCommandBufferData(), |
831 GetCommandBufferID(), release); | 834 GetCommandBufferID(), release); |
832 | 835 |
833 gles2::MailboxManager* mailbox_manager = | 836 gles2::MailboxManager* mailbox_manager = |
834 decoder_->GetContextGroup()->mailbox_manager(); | 837 decoder_->GetContextGroup()->mailbox_manager(); |
835 mailbox_manager->PushTextureUpdates(sync_token); | 838 mailbox_manager->PushTextureUpdates(sync_token); |
836 | 839 |
837 sync_point_client_->ReleaseFenceSync(release); | 840 sync_point_client_state_->ReleaseFenceSync(release); |
838 } | 841 } |
839 | 842 |
840 bool InProcessCommandBuffer::WaitSyncTokenOnGpuThread( | 843 bool InProcessCommandBuffer::WaitSyncTokenOnGpuThread( |
841 const SyncToken& sync_token) { | 844 const SyncToken& sync_token) { |
842 DCHECK(!waiting_for_sync_point_); | 845 DCHECK(!waiting_for_sync_point_); |
843 gpu::SyncPointManager* sync_point_manager = service_->sync_point_manager(); | 846 gpu::SyncPointManager* sync_point_manager = service_->sync_point_manager(); |
844 DCHECK(sync_point_manager); | 847 DCHECK(sync_point_manager); |
845 | 848 |
846 gles2::MailboxManager* mailbox_manager = | 849 gles2::MailboxManager* mailbox_manager = |
847 decoder_->GetContextGroup()->mailbox_manager(); | 850 decoder_->GetContextGroup()->mailbox_manager(); |
848 DCHECK(mailbox_manager); | 851 DCHECK(mailbox_manager); |
849 | 852 |
850 if (service_->BlockThreadOnWaitSyncToken()) { | 853 if (service_->BlockThreadOnWaitSyncToken()) { |
851 // Wait if sync point wait is valid. | 854 // Wait if sync point wait is valid. |
852 if (sync_point_client_->Wait( | 855 if (sync_point_client_state_->Wait( |
853 sync_token, | 856 sync_token, |
854 base::Bind(&base::WaitableEvent::Signal, | 857 base::Bind(&base::WaitableEvent::Signal, |
855 base::Unretained(&fence_sync_wait_event_)))) { | 858 base::Unretained(&fence_sync_wait_event_)))) { |
856 fence_sync_wait_event_.Wait(); | 859 fence_sync_wait_event_.Wait(); |
857 } | 860 } |
858 | 861 |
859 mailbox_manager->PullTextureUpdates(sync_token); | 862 mailbox_manager->PullTextureUpdates(sync_token); |
860 return false; | 863 return false; |
861 } | 864 } |
862 | 865 |
863 waiting_for_sync_point_ = sync_point_client_->Wait( | 866 waiting_for_sync_point_ = sync_point_client_state_->Wait( |
864 sync_token, | 867 sync_token, |
865 base::Bind(&InProcessCommandBuffer::OnWaitSyncTokenCompleted, | 868 base::Bind(&InProcessCommandBuffer::OnWaitSyncTokenCompleted, |
866 gpu_thread_weak_ptr_factory_.GetWeakPtr(), sync_token)); | 869 gpu_thread_weak_ptr_factory_.GetWeakPtr(), sync_token)); |
867 if (!waiting_for_sync_point_) { | 870 if (!waiting_for_sync_point_) { |
868 mailbox_manager->PullTextureUpdates(sync_token); | 871 mailbox_manager->PullTextureUpdates(sync_token); |
869 return false; | 872 return false; |
870 } | 873 } |
871 | 874 |
872 executor_->SetScheduled(false); | 875 executor_->SetScheduled(false); |
873 return true; | 876 return true; |
(...skipping 25 matching lines...) Expand all Loading... |
899 DCHECK(!executor_->scheduled()); | 902 DCHECK(!executor_->scheduled()); |
900 | 903 |
901 executor_->SetScheduled(true); | 904 executor_->SetScheduled(true); |
902 ProcessTasksOnGpuThread(); | 905 ProcessTasksOnGpuThread(); |
903 } | 906 } |
904 } | 907 } |
905 | 908 |
906 void InProcessCommandBuffer::SignalSyncTokenOnGpuThread( | 909 void InProcessCommandBuffer::SignalSyncTokenOnGpuThread( |
907 const SyncToken& sync_token, | 910 const SyncToken& sync_token, |
908 const base::Closure& callback) { | 911 const base::Closure& callback) { |
909 if (!sync_point_client_->Wait(sync_token, WrapCallback(callback))) | 912 if (!sync_point_client_state_->Wait(sync_token, WrapCallback(callback))) |
910 callback.Run(); | 913 callback.Run(); |
911 } | 914 } |
912 | 915 |
913 void InProcessCommandBuffer::SignalQuery(unsigned query_id, | 916 void InProcessCommandBuffer::SignalQuery(unsigned query_id, |
914 const base::Closure& callback) { | 917 const base::Closure& callback) { |
915 CheckSequencedThread(); | 918 CheckSequencedThread(); |
916 QueueTask(false, base::Bind(&InProcessCommandBuffer::SignalQueryOnGpuThread, | 919 QueueTask(false, base::Bind(&InProcessCommandBuffer::SignalQueryOnGpuThread, |
917 base::Unretained(this), query_id, | 920 base::Unretained(this), query_id, |
918 WrapCallback(callback))); | 921 WrapCallback(callback))); |
919 } | 922 } |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1121 return wrapped_callback; | 1124 return wrapped_callback; |
1122 } | 1125 } |
1123 | 1126 |
1124 InProcessCommandBuffer::GpuTask::GpuTask(const base::Closure& callback, | 1127 InProcessCommandBuffer::GpuTask::GpuTask(const base::Closure& callback, |
1125 uint32_t order_number) | 1128 uint32_t order_number) |
1126 : callback(callback), order_number(order_number) {} | 1129 : callback(callback), order_number(order_number) {} |
1127 | 1130 |
1128 InProcessCommandBuffer::GpuTask::~GpuTask() {} | 1131 InProcessCommandBuffer::GpuTask::~GpuTask() {} |
1129 | 1132 |
1130 } // namespace gpu | 1133 } // namespace gpu |
OLD | NEW |