diff options
Diffstat (limited to 'src/gpu')
| -rw-r--r-- | src/gpu/effect.cc | 8 | ||||
| -rw-r--r-- | src/gpu/effect.h | 7 | ||||
| -rw-r--r-- | src/gpu/wgpu_resource.h | 45 |
3 files changed, 53 insertions, 7 deletions
diff --git a/src/gpu/effect.cc b/src/gpu/effect.cc index cd4bc16..d0693ec 100644 --- a/src/gpu/effect.cc +++ b/src/gpu/effect.cc @@ -62,15 +62,15 @@ void Effect::init_uniforms_buffer() { } void Effect::create_linear_sampler() { - sampler_ = gpu_create_linear_sampler(ctx_.device); + sampler_.set(gpu_create_linear_sampler(ctx_.device)); } void Effect::create_nearest_sampler() { - sampler_ = gpu_create_nearest_sampler(ctx_.device); + sampler_.set(gpu_create_nearest_sampler(ctx_.device)); } void Effect::create_dummy_scene_texture() { TextureWithView dummy = gpu_create_dummy_scene_texture(ctx_.device); - dummy_texture_ = dummy.texture; - dummy_texture_view_ = dummy.view; + dummy_texture_.set(dummy.texture); + dummy_texture_view_.set(dummy.view); } diff --git a/src/gpu/effect.h b/src/gpu/effect.h index 82aa6e1..d47a8b7 100644 --- a/src/gpu/effect.h +++ b/src/gpu/effect.h @@ -7,6 +7,7 @@ #include "gpu/gpu.h" #include "gpu/sequence.h" #include "gpu/uniform_helper.h" +#include "gpu/wgpu_resource.h" #include <string> #include <vector> @@ -54,9 +55,9 @@ class Effect { // Common resources for most effects UniformBuffer<UniformsSequenceParams> uniforms_buffer_; - WGPUSampler sampler_ = nullptr; - WGPUTexture dummy_texture_ = nullptr; - WGPUTextureView dummy_texture_view_ = nullptr; + Sampler sampler_; + Texture dummy_texture_; + TextureView dummy_texture_view_; // Helper: Initialize uniforms buffer (call in subclass constructor) void init_uniforms_buffer(); 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>; |
