| 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/command_buffer/service/in_process_command_buffer.h" | 5 #include "gpu/command_buffer/service/in_process_command_buffer.h" |
| 6 | 6 |
| 7 #include <queue> | 7 #include <queue> |
| 8 #include <set> | 8 #include <set> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 688 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 699 DCHECK_EQ(fence_sync - 1, flushed_fence_sync_release_); | 699 DCHECK_EQ(fence_sync - 1, flushed_fence_sync_release_); |
| 700 } | 700 } |
| 701 | 701 |
| 702 QueueTask(base::Bind(&InProcessCommandBuffer::CreateImageOnGpuThread, | 702 QueueTask(base::Bind(&InProcessCommandBuffer::CreateImageOnGpuThread, |
| 703 base::Unretained(this), new_id, handle, | 703 base::Unretained(this), new_id, handle, |
| 704 gfx::Size(width, height), gpu_memory_buffer->GetFormat(), | 704 gfx::Size(width, height), gpu_memory_buffer->GetFormat(), |
| 705 internalformat, order_num, fence_sync)); | 705 internalformat, order_num, fence_sync)); |
| 706 | 706 |
| 707 if (fence_sync) { | 707 if (fence_sync) { |
| 708 flushed_fence_sync_release_ = fence_sync; | 708 flushed_fence_sync_release_ = fence_sync; |
| 709 SyncToken sync_token(GetNamespaceID(), GetExtraCommandBufferData(), | 709 SyncToken sync_token(GetNamespaceID(), GetCommandBufferID(), fence_sync); |
| 710 GetCommandBufferID(), fence_sync); | |
| 711 sync_token.SetVerifyFlush(); | 710 sync_token.SetVerifyFlush(); |
| 712 gpu_memory_buffer_manager_->SetDestructionSyncToken(gpu_memory_buffer, | 711 gpu_memory_buffer_manager_->SetDestructionSyncToken(gpu_memory_buffer, |
| 713 sync_token); | 712 sync_token); |
| 714 } | 713 } |
| 715 | 714 |
| 716 return new_id; | 715 return new_id; |
| 717 } | 716 } |
| 718 | 717 |
| 719 void InProcessCommandBuffer::CreateImageOnGpuThread( | 718 void InProcessCommandBuffer::CreateImageOnGpuThread( |
| 720 int32 id, | 719 int32 id, |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 846 bool make_current_success = false; | 845 bool make_current_success = false; |
| 847 { | 846 { |
| 848 base::AutoLock lock(command_buffer_lock_); | 847 base::AutoLock lock(command_buffer_lock_); |
| 849 make_current_success = MakeCurrent(); | 848 make_current_success = MakeCurrent(); |
| 850 } | 849 } |
| 851 if (make_current_success) { | 850 if (make_current_success) { |
| 852 // Old sync points are global and do not have a command buffer ID, | 851 // Old sync points are global and do not have a command buffer ID, |
| 853 // We can simply use the GPUIO namespace with 0 for the command buffer ID | 852 // We can simply use the GPUIO namespace with 0 for the command buffer ID |
| 854 // (under normal circumstances 0 is invalid so will not be used) until | 853 // (under normal circumstances 0 is invalid so will not be used) until |
| 855 // the old sync points are replaced. | 854 // the old sync points are replaced. |
| 856 SyncToken sync_token(gpu::CommandBufferNamespace::GPU_IO, 0, 0, | 855 SyncToken sync_token(gpu::CommandBufferNamespace::GPU_IO, 0, sync_point); |
| 857 sync_point); | |
| 858 mailbox_manager->PushTextureUpdates(sync_token); | 856 mailbox_manager->PushTextureUpdates(sync_token); |
| 859 } | 857 } |
| 860 } | 858 } |
| 861 service_->sync_point_manager()->RetireSyncPoint(sync_point); | 859 service_->sync_point_manager()->RetireSyncPoint(sync_point); |
| 862 } | 860 } |
| 863 | 861 |
| 864 void InProcessCommandBuffer::SignalSyncPoint(unsigned sync_point, | 862 void InProcessCommandBuffer::SignalSyncPoint(unsigned sync_point, |
| 865 const base::Closure& callback) { | 863 const base::Closure& callback) { |
| 866 service_->sync_point_manager()->AddSyncPointCallback(sync_point, | 864 service_->sync_point_manager()->AddSyncPointCallback(sync_point, |
| 867 WrapCallback(callback)); | 865 WrapCallback(callback)); |
| 868 } | 866 } |
| 869 | 867 |
| 870 bool InProcessCommandBuffer::WaitSyncPointOnGpuThread(unsigned sync_point) { | 868 bool InProcessCommandBuffer::WaitSyncPointOnGpuThread(unsigned sync_point) { |
| 871 service_->sync_point_manager()->WaitSyncPoint(sync_point); | 869 service_->sync_point_manager()->WaitSyncPoint(sync_point); |
| 872 gles2::MailboxManager* mailbox_manager = | 870 gles2::MailboxManager* mailbox_manager = |
| 873 decoder_->GetContextGroup()->mailbox_manager(); | 871 decoder_->GetContextGroup()->mailbox_manager(); |
| 874 // Old sync points are global and do not have a command buffer ID, | 872 // Old sync points are global and do not have a command buffer ID, |
| 875 // We can simply use the GPUIO namespace with 0 for the command buffer ID | 873 // We can simply use the GPUIO namespace with 0 for the command buffer ID |
| 876 // (under normal circumstances 0 is invalid so will not be used) until | 874 // (under normal circumstances 0 is invalid so will not be used) until |
| 877 // the old sync points are replaced. | 875 // the old sync points are replaced. |
| 878 SyncToken sync_token(gpu::CommandBufferNamespace::GPU_IO, 0, 0, sync_point); | 876 SyncToken sync_token(gpu::CommandBufferNamespace::GPU_IO, 0, sync_point); |
| 879 mailbox_manager->PullTextureUpdates(sync_token); | 877 mailbox_manager->PullTextureUpdates(sync_token); |
| 880 return true; | 878 return true; |
| 881 } | 879 } |
| 882 | 880 |
| 883 void InProcessCommandBuffer::FenceSyncReleaseOnGpuThread(uint64_t release) { | 881 void InProcessCommandBuffer::FenceSyncReleaseOnGpuThread(uint64_t release) { |
| 884 DCHECK(!sync_point_client_->client_state()->IsFenceSyncReleased(release)); | 882 DCHECK(!sync_point_client_->client_state()->IsFenceSyncReleased(release)); |
| 885 gles2::MailboxManager* mailbox_manager = | 883 gles2::MailboxManager* mailbox_manager = |
| 886 decoder_->GetContextGroup()->mailbox_manager(); | 884 decoder_->GetContextGroup()->mailbox_manager(); |
| 887 if (mailbox_manager->UsesSync()) { | 885 if (mailbox_manager->UsesSync()) { |
| 888 bool make_current_success = false; | 886 bool make_current_success = false; |
| 889 { | 887 { |
| 890 base::AutoLock lock(command_buffer_lock_); | 888 base::AutoLock lock(command_buffer_lock_); |
| 891 make_current_success = MakeCurrent(); | 889 make_current_success = MakeCurrent(); |
| 892 } | 890 } |
| 893 if (make_current_success) { | 891 if (make_current_success) { |
| 894 SyncToken sync_token(GetNamespaceID(), GetExtraCommandBufferData(), | 892 SyncToken sync_token(GetNamespaceID(), GetCommandBufferID(), release); |
| 895 GetCommandBufferID(), release); | |
| 896 mailbox_manager->PushTextureUpdates(sync_token); | 893 mailbox_manager->PushTextureUpdates(sync_token); |
| 897 } | 894 } |
| 898 } | 895 } |
| 899 | 896 |
| 900 sync_point_client_->ReleaseFenceSync(release); | 897 sync_point_client_->ReleaseFenceSync(release); |
| 901 } | 898 } |
| 902 | 899 |
| 903 bool InProcessCommandBuffer::WaitFenceSyncOnGpuThread( | 900 bool InProcessCommandBuffer::WaitFenceSyncOnGpuThread( |
| 904 gpu::CommandBufferNamespace namespace_id, | 901 gpu::CommandBufferNamespace namespace_id, |
| 905 uint64_t command_buffer_id, | 902 uint64_t command_buffer_id, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 918 // Use waitable event which is signalled when the release fence is released. | 915 // Use waitable event which is signalled when the release fence is released. |
| 919 sync_point_client_->Wait( | 916 sync_point_client_->Wait( |
| 920 release_state.get(), release, | 917 release_state.get(), release, |
| 921 base::Bind(&base::WaitableEvent::Signal, | 918 base::Bind(&base::WaitableEvent::Signal, |
| 922 base::Unretained(&fence_sync_wait_event_))); | 919 base::Unretained(&fence_sync_wait_event_))); |
| 923 fence_sync_wait_event_.Wait(); | 920 fence_sync_wait_event_.Wait(); |
| 924 } | 921 } |
| 925 | 922 |
| 926 gles2::MailboxManager* mailbox_manager = | 923 gles2::MailboxManager* mailbox_manager = |
| 927 decoder_->GetContextGroup()->mailbox_manager(); | 924 decoder_->GetContextGroup()->mailbox_manager(); |
| 928 SyncToken sync_token(namespace_id, 0, command_buffer_id, release); | 925 SyncToken sync_token(namespace_id, command_buffer_id, release); |
| 929 mailbox_manager->PullTextureUpdates(sync_token); | 926 mailbox_manager->PullTextureUpdates(sync_token); |
| 930 return true; | 927 return true; |
| 931 } | 928 } |
| 932 | 929 |
| 933 void InProcessCommandBuffer::SignalSyncTokenOnGpuThread( | 930 void InProcessCommandBuffer::SignalSyncTokenOnGpuThread( |
| 934 const SyncToken& sync_token, const base::Closure& callback) { | 931 const SyncToken& sync_token, const base::Closure& callback) { |
| 935 gpu::SyncPointManager* sync_point_manager = service_->sync_point_manager(); | 932 gpu::SyncPointManager* sync_point_manager = service_->sync_point_manager(); |
| 936 DCHECK(sync_point_manager); | 933 DCHECK(sync_point_manager); |
| 937 | 934 |
| 938 scoped_refptr<gpu::SyncPointClientState> release_state = | 935 scoped_refptr<gpu::SyncPointClientState> release_state = |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 980 } | 977 } |
| 981 | 978 |
| 982 CommandBufferNamespace InProcessCommandBuffer::GetNamespaceID() const { | 979 CommandBufferNamespace InProcessCommandBuffer::GetNamespaceID() const { |
| 983 return CommandBufferNamespace::IN_PROCESS; | 980 return CommandBufferNamespace::IN_PROCESS; |
| 984 } | 981 } |
| 985 | 982 |
| 986 uint64_t InProcessCommandBuffer::GetCommandBufferID() const { | 983 uint64_t InProcessCommandBuffer::GetCommandBufferID() const { |
| 987 return command_buffer_id_; | 984 return command_buffer_id_; |
| 988 } | 985 } |
| 989 | 986 |
| 990 int32_t InProcessCommandBuffer::GetExtraCommandBufferData() const { | |
| 991 return 0; | |
| 992 } | |
| 993 | |
| 994 uint64_t InProcessCommandBuffer::GenerateFenceSyncRelease() { | 987 uint64_t InProcessCommandBuffer::GenerateFenceSyncRelease() { |
| 995 return next_fence_sync_release_++; | 988 return next_fence_sync_release_++; |
| 996 } | 989 } |
| 997 | 990 |
| 998 bool InProcessCommandBuffer::IsFenceSyncRelease(uint64_t release) { | 991 bool InProcessCommandBuffer::IsFenceSyncRelease(uint64_t release) { |
| 999 return release != 0 && release < next_fence_sync_release_; | 992 return release != 0 && release < next_fence_sync_release_; |
| 1000 } | 993 } |
| 1001 | 994 |
| 1002 bool InProcessCommandBuffer::IsFenceSyncFlushed(uint64_t release) { | 995 bool InProcessCommandBuffer::IsFenceSyncFlushed(uint64_t release) { |
| 1003 return release <= flushed_fence_sync_release_; | 996 return release <= flushed_fence_sync_release_; |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1140 framebuffer_completeness_cache_ = | 1133 framebuffer_completeness_cache_ = |
| 1141 new gpu::gles2::FramebufferCompletenessCache; | 1134 new gpu::gles2::FramebufferCompletenessCache; |
| 1142 return framebuffer_completeness_cache_; | 1135 return framebuffer_completeness_cache_; |
| 1143 } | 1136 } |
| 1144 | 1137 |
| 1145 SyncPointManager* GpuInProcessThread::sync_point_manager() { | 1138 SyncPointManager* GpuInProcessThread::sync_point_manager() { |
| 1146 return sync_point_manager_; | 1139 return sync_point_manager_; |
| 1147 } | 1140 } |
| 1148 | 1141 |
| 1149 } // namespace gpu | 1142 } // namespace gpu |
| OLD | NEW |