summaryrefslogtreecommitdiff
path: root/src/gpu/wgpu_resource.h
blob: e448b1815c7e557c76a0479a3ed4c1d725902c16 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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>;