diff options
Diffstat (limited to 'src/gpu/wgpu_resource.h')
| -rw-r--r-- | src/gpu/wgpu_resource.h | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/gpu/wgpu_resource.h b/src/gpu/wgpu_resource.h new file mode 100644 index 0000000..e448b18 --- /dev/null +++ b/src/gpu/wgpu_resource.h @@ -0,0 +1,45 @@ +// WGPU Resource RAII Wrapper +// Automatic release on destruction +// +// IMPORTANT: Field ordering matters for destruction order. +// Members are destroyed in reverse declaration order. +// Declare dependencies before dependents: +// RenderPipeline pipeline_; // Destroyed last +// BindGroup bind_group_; // Destroyed first (may reference pipeline) + +#pragma once +#include "platform/platform.h" +#include "util/fatal_error.h" + +template<typename T, void(*Release)(T)> +class WGPUResource { + public: + WGPUResource() : ptr_(nullptr) {} + ~WGPUResource() { if (ptr_) Release(ptr_); } + + void set(T ptr) { + FATAL_ASSERT(ptr_ == nullptr); + ptr_ = ptr; + } + + void replace(T ptr) { + if (ptr_) Release(ptr_); + ptr_ = ptr; + } + + T get() const { return ptr_; } + T* get_address() { return &ptr_; } + + private: + T ptr_; + WGPUResource(const WGPUResource&) = delete; + WGPUResource& operator=(const WGPUResource&) = delete; +}; + +using BindGroup = WGPUResource<WGPUBindGroup, wgpuBindGroupRelease>; +using RenderPipeline = WGPUResource<WGPURenderPipeline, wgpuRenderPipelineRelease>; +using ComputePipeline = WGPUResource<WGPUComputePipeline, wgpuComputePipelineRelease>; +using Sampler = WGPUResource<WGPUSampler, wgpuSamplerRelease>; +using Texture = WGPUResource<WGPUTexture, wgpuTextureRelease>; +using TextureView = WGPUResource<WGPUTextureView, wgpuTextureViewRelease>; +using Buffer = WGPUResource<WGPUBuffer, wgpuBufferRelease>; |
