37 static std::mutex mutex;
38 static std::weak_ptr<GPU_COMPUTE> instance;
39 static bool unavailable =
false;
40 std::lock_guard<std::mutex> lock( mutex );
41 std::shared_ptr<GPU_COMPUTE> service = instance.lock();
43 if( service && !service->m_lost )
52 if( !device || !device->SupportsCompute() )
58 service.reset(
new GPU_COMPUTE( std::move( device ) ) );
66 std::lock_guard<std::mutex> lock(
m_mutex );
67 return m_device->ComputePipelineLimits( aPipeline );
73 if( !aBytes || aBytes >
m_limits.maxStorageBufferRange )
76 std::lock_guard<std::mutex> lock(
m_mutex );
83 std::lock_guard<std::mutex> lock(
m_mutex );
84 return m_device->CreateComputePipeline( aDesc );
93 std::lock_guard<std::mutex> lock(
m_mutex );
94 return m_device->CreateBindGroupLayout( aDesc );
100 std::lock_guard<std::mutex> lock(
m_mutex );
101 return m_device->CreateBindGroup( aDesc );
108 std::lock_guard<std::mutex> lock(
m_mutex );
132 m_device->DestroyComputePipeline( aPipeline );
142 m_device->DestroyBindGroupLayout( aLayout );
152 m_device->DestroyBindGroup( aGroup );
159 std::lock_guard<std::mutex> lock(
m_mutex );
void DestroyBindGroupLayout(RHI_BindGroupLayoutHandle aLayout)
GPU_COMPUTE(const GPU_COMPUTE &)=delete
RHI_ComputePipelineHandle CreatePipeline(const RHI_COMPUTE_PIPELINE_DESC &aDesc)
RHI_COMPUTE_RESULT Submit(const RHI_COMPUTE_JOB &aJob)
Run the whole job and copy its readbacks before returning.
static std::shared_ptr< GPU_COMPUTE > Get()
Return nullptr if compute is unavailable; replace a lost instance on the next call.
void DestroyPipeline(RHI_ComputePipelineHandle aPipeline)
std::atomic< bool > m_lost
RHI_COMPUTE_DEVICE_LIMITS m_limits
RHI_BindGroupLayoutHandle CreateBindGroupLayout(const RHI_BIND_GROUP_LAYOUT_DESC &aDesc)
std::unique_ptr< RHI_DEVICE > m_device
void DestroyBuffer(RHI_BufferHandle aBuffer)
RHI_COMPUTE_PIPELINE_LIMITS PipelineLimits(RHI_ComputePipelineHandle aPipeline)
void DestroyBindGroup(RHI_BindGroupHandle aGroup)
RHI_BindGroupHandle CreateBindGroup(const RHI_BIND_GROUP_DESC &aDesc)
RHI_BufferHandle CreateStorageBuffer(size_t aBytes)
void destroy(F aDestroy)
Destroy under the lock, then retire the release at once since no job can still be using it.
Plain owning command data, recordable on any thread without device access.
bool RhiValidateComputeBindGroupLayout(const RHI_BIND_GROUP_LAYOUT_DESC &aLayout)
Validate a compute bind group layout.
constexpr uint64_t RHI_FRAMES_IN_FLIGHT
RHI_HANDLE< RHI_TAG_BUFFER > RHI_BufferHandle
RHI_HANDLE< RHI_TAG_BIND_GROUP > RHI_BindGroupHandle
RHI_HANDLE< RHI_TAG_COMPUTE_PIPELINE > RHI_ComputePipelineHandle
RHI_HANDLE< RHI_TAG_BIND_GROUP_LAYOUT > RHI_BindGroupLayoutHandle
wxString result
Test unit parsing edge cases and error handling.