Adds destruction handling for "simple objects" in device.destroy
Simple objects are defined as per https://dawn-review.googlesource.com/c/dawn/+/65864 and include:
- BindGroups
- ComputePipelines
- PipelineLayouts
- RenderPipelines
- Samplers
- ShaderModules
- SwapChains
Bug: dawn:628
Change-Id: I4ad74a2c4a223cf45acdbe6bdd0ec74332c9a14a
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/67740
Commit-Queue: Loko Kung <lokokung@google.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
diff --git a/src/dawn_native/d3d12/BindGroupD3D12.cpp b/src/dawn_native/d3d12/BindGroupD3D12.cpp
index f002ece..485d220 100644
--- a/src/dawn_native/d3d12/BindGroupD3D12.cpp
+++ b/src/dawn_native/d3d12/BindGroupD3D12.cpp
@@ -205,7 +205,9 @@
}
}
- BindGroup::~BindGroup() {
+ BindGroup::~BindGroup() = default;
+
+ void BindGroup::DestroyApiObjectImpl() {
ToBackend(GetLayout())->DeallocateBindGroup(this, &mCPUViewAllocation);
ASSERT(!mCPUViewAllocation.IsValid());
}
diff --git a/src/dawn_native/d3d12/BindGroupD3D12.h b/src/dawn_native/d3d12/BindGroupD3D12.h
index 43b54c1..7ffda1d 100644
--- a/src/dawn_native/d3d12/BindGroupD3D12.h
+++ b/src/dawn_native/d3d12/BindGroupD3D12.h
@@ -48,6 +48,8 @@
private:
~BindGroup() override;
+ void DestroyApiObjectImpl() override;
+
Ref<SamplerHeapCacheEntry> mSamplerAllocationEntry;
GPUDescriptorHeapAllocation mGPUViewAllocation;
diff --git a/src/dawn_native/d3d12/ComputePipelineD3D12.cpp b/src/dawn_native/d3d12/ComputePipelineD3D12.cpp
index 54ddc7e..1cbbdc5 100644
--- a/src/dawn_native/d3d12/ComputePipelineD3D12.cpp
+++ b/src/dawn_native/d3d12/ComputePipelineD3D12.cpp
@@ -62,7 +62,9 @@
return {};
}
- ComputePipeline::~ComputePipeline() {
+ ComputePipeline::~ComputePipeline() = default;
+
+ void ComputePipeline::DestroyApiObjectImpl() {
ToBackend(GetDevice())->ReferenceUntilUnused(mPipelineState);
}
diff --git a/src/dawn_native/d3d12/ComputePipelineD3D12.h b/src/dawn_native/d3d12/ComputePipelineD3D12.h
index b652026..0bf9254 100644
--- a/src/dawn_native/d3d12/ComputePipelineD3D12.h
+++ b/src/dawn_native/d3d12/ComputePipelineD3D12.h
@@ -44,6 +44,9 @@
private:
~ComputePipeline() override;
+
+ void DestroyApiObjectImpl() override;
+
using ComputePipelineBase::ComputePipelineBase;
ComPtr<ID3D12PipelineState> mPipelineState;
};
diff --git a/src/dawn_native/d3d12/RenderPipelineD3D12.cpp b/src/dawn_native/d3d12/RenderPipelineD3D12.cpp
index ee2fde6..6718e79 100644
--- a/src/dawn_native/d3d12/RenderPipelineD3D12.cpp
+++ b/src/dawn_native/d3d12/RenderPipelineD3D12.cpp
@@ -417,7 +417,9 @@
return {};
}
- RenderPipeline::~RenderPipeline() {
+ RenderPipeline::~RenderPipeline() = default;
+
+ void RenderPipeline::DestroyApiObjectImpl() {
ToBackend(GetDevice())->ReferenceUntilUnused(mPipelineState);
}
diff --git a/src/dawn_native/d3d12/RenderPipelineD3D12.h b/src/dawn_native/d3d12/RenderPipelineD3D12.h
index be0efef..251b16e 100644
--- a/src/dawn_native/d3d12/RenderPipelineD3D12.h
+++ b/src/dawn_native/d3d12/RenderPipelineD3D12.h
@@ -45,6 +45,9 @@
private:
~RenderPipeline() override;
+
+ void DestroyApiObjectImpl() override;
+
using RenderPipelineBase::RenderPipelineBase;
D3D12_INPUT_LAYOUT_DESC ComputeInputLayout(
std::array<D3D12_INPUT_ELEMENT_DESC, kMaxVertexAttributes>* inputElementDescriptors);
diff --git a/src/dawn_native/d3d12/SwapChainD3D12.cpp b/src/dawn_native/d3d12/SwapChainD3D12.cpp
index efc0a02..9fe83de 100644
--- a/src/dawn_native/d3d12/SwapChainD3D12.cpp
+++ b/src/dawn_native/d3d12/SwapChainD3D12.cpp
@@ -141,7 +141,9 @@
return swapchain;
}
- SwapChain::~SwapChain() {
+ SwapChain::~SwapChain() = default;
+
+ void SwapChain::DestroyApiObjectImpl() {
DetachFromSurface();
}
diff --git a/src/dawn_native/d3d12/SwapChainD3D12.h b/src/dawn_native/d3d12/SwapChainD3D12.h
index bc476d1..9f951e4 100644
--- a/src/dawn_native/d3d12/SwapChainD3D12.h
+++ b/src/dawn_native/d3d12/SwapChainD3D12.h
@@ -48,6 +48,8 @@
private:
~SwapChain() override;
+ void DestroyApiObjectImpl() override;
+
using NewSwapChainBase::NewSwapChainBase;
MaybeError Initialize(NewSwapChainBase* previousSwapChain);
diff --git a/src/dawn_native/metal/BindGroupMTL.h b/src/dawn_native/metal/BindGroupMTL.h
index 29a3f4e..da14250 100644
--- a/src/dawn_native/metal/BindGroupMTL.h
+++ b/src/dawn_native/metal/BindGroupMTL.h
@@ -30,6 +30,8 @@
private:
~BindGroup() override;
+
+ void DestroyApiObjectImpl() override;
};
}} // namespace dawn_native::metal
diff --git a/src/dawn_native/metal/BindGroupMTL.mm b/src/dawn_native/metal/BindGroupMTL.mm
index 48571ec..aba1429 100644
--- a/src/dawn_native/metal/BindGroupMTL.mm
+++ b/src/dawn_native/metal/BindGroupMTL.mm
@@ -22,7 +22,9 @@
: BindGroupBase(this, device, descriptor) {
}
- BindGroup::~BindGroup() {
+ BindGroup::~BindGroup() = default;
+
+ void BindGroup::DestroyApiObjectImpl() {
ToBackend(GetLayout())->DeallocateBindGroup(this);
}
diff --git a/src/dawn_native/metal/SwapChainMTL.h b/src/dawn_native/metal/SwapChainMTL.h
index 6a7216e..2d76043 100644
--- a/src/dawn_native/metal/SwapChainMTL.h
+++ b/src/dawn_native/metal/SwapChainMTL.h
@@ -47,6 +47,8 @@
~SwapChain() override;
private:
+ void DestroyApiObjectImpl() override;
+
using NewSwapChainBase::NewSwapChainBase;
MaybeError Initialize(NewSwapChainBase* previousSwapChain);
diff --git a/src/dawn_native/metal/SwapChainMTL.mm b/src/dawn_native/metal/SwapChainMTL.mm
index 17851ab..9ba8696 100644
--- a/src/dawn_native/metal/SwapChainMTL.mm
+++ b/src/dawn_native/metal/SwapChainMTL.mm
@@ -73,7 +73,9 @@
return swapchain;
}
- SwapChain::~SwapChain() {
+ SwapChain::~SwapChain() = default;
+
+ void SwapChain::DestroyApiObjectImpl() {
DetachFromSurface();
}
diff --git a/src/dawn_native/opengl/BindGroupGL.cpp b/src/dawn_native/opengl/BindGroupGL.cpp
index c726f29..0a43de2 100644
--- a/src/dawn_native/opengl/BindGroupGL.cpp
+++ b/src/dawn_native/opengl/BindGroupGL.cpp
@@ -50,7 +50,9 @@
: BindGroupBase(this, device, descriptor) {
}
- BindGroup::~BindGroup() {
+ BindGroup::~BindGroup() = default;
+
+ void BindGroup::DestroyApiObjectImpl() {
ToBackend(GetLayout())->DeallocateBindGroup(this);
}
diff --git a/src/dawn_native/opengl/BindGroupGL.h b/src/dawn_native/opengl/BindGroupGL.h
index 0619cf1..39c990e 100644
--- a/src/dawn_native/opengl/BindGroupGL.h
+++ b/src/dawn_native/opengl/BindGroupGL.h
@@ -32,6 +32,8 @@
private:
~BindGroup() override;
+
+ void DestroyApiObjectImpl() override;
};
}} // namespace dawn_native::opengl
diff --git a/src/dawn_native/opengl/ComputePipelineGL.cpp b/src/dawn_native/opengl/ComputePipelineGL.cpp
index 086ca7a..42b3d72 100644
--- a/src/dawn_native/opengl/ComputePipelineGL.cpp
+++ b/src/dawn_native/opengl/ComputePipelineGL.cpp
@@ -25,7 +25,9 @@
return AcquireRef(new ComputePipeline(device, descriptor));
}
- ComputePipeline::~ComputePipeline() {
+ ComputePipeline::~ComputePipeline() = default;
+
+ void ComputePipeline::DestroyApiObjectImpl() {
DeleteProgram(ToBackend(GetDevice())->gl);
}
diff --git a/src/dawn_native/opengl/ComputePipelineGL.h b/src/dawn_native/opengl/ComputePipelineGL.h
index 444a289..cba762c 100644
--- a/src/dawn_native/opengl/ComputePipelineGL.h
+++ b/src/dawn_native/opengl/ComputePipelineGL.h
@@ -38,6 +38,7 @@
private:
using ComputePipelineBase::ComputePipelineBase;
~ComputePipeline() override;
+ void DestroyApiObjectImpl() override;
};
}} // namespace dawn_native::opengl
diff --git a/src/dawn_native/opengl/RenderPipelineGL.cpp b/src/dawn_native/opengl/RenderPipelineGL.cpp
index 1b4b5ce..7a56927 100644
--- a/src/dawn_native/opengl/RenderPipelineGL.cpp
+++ b/src/dawn_native/opengl/RenderPipelineGL.cpp
@@ -234,7 +234,9 @@
return {};
}
- RenderPipeline::~RenderPipeline() {
+ RenderPipeline::~RenderPipeline() = default;
+
+ void RenderPipeline::DestroyApiObjectImpl() {
const OpenGLFunctions& gl = ToBackend(GetDevice())->gl;
gl.DeleteVertexArrays(1, &mVertexArrayObject);
gl.BindVertexArray(0);
diff --git a/src/dawn_native/opengl/RenderPipelineGL.h b/src/dawn_native/opengl/RenderPipelineGL.h
index cd3290f..ce2cce3 100644
--- a/src/dawn_native/opengl/RenderPipelineGL.h
+++ b/src/dawn_native/opengl/RenderPipelineGL.h
@@ -43,6 +43,7 @@
private:
RenderPipeline(Device* device, const RenderPipelineDescriptor* descriptor);
~RenderPipeline() override;
+ void DestroyApiObjectImpl() override;
void CreateVAOForVertexState();
diff --git a/src/dawn_native/opengl/SamplerGL.cpp b/src/dawn_native/opengl/SamplerGL.cpp
index 81fdd46..b4c7c26 100644
--- a/src/dawn_native/opengl/SamplerGL.cpp
+++ b/src/dawn_native/opengl/SamplerGL.cpp
@@ -76,7 +76,9 @@
SetupGLSampler(mNonFilteringHandle, descriptor, true);
}
- Sampler::~Sampler() {
+ Sampler::~Sampler() = default;
+
+ void Sampler::DestroyApiObjectImpl() {
const OpenGLFunctions& gl = ToBackend(GetDevice())->gl;
gl.DeleteSamplers(1, &mFilteringHandle);
gl.DeleteSamplers(1, &mNonFilteringHandle);
diff --git a/src/dawn_native/opengl/SamplerGL.h b/src/dawn_native/opengl/SamplerGL.h
index 0644890..ab55626 100644
--- a/src/dawn_native/opengl/SamplerGL.h
+++ b/src/dawn_native/opengl/SamplerGL.h
@@ -32,6 +32,7 @@
private:
~Sampler() override;
+ void DestroyApiObjectImpl() override;
void SetupGLSampler(GLuint sampler, const SamplerDescriptor* descriptor, bool forceNearest);
diff --git a/src/dawn_native/vulkan/BindGroupVk.cpp b/src/dawn_native/vulkan/BindGroupVk.cpp
index 85bd151..7704d9b 100644
--- a/src/dawn_native/vulkan/BindGroupVk.cpp
+++ b/src/dawn_native/vulkan/BindGroupVk.cpp
@@ -158,7 +158,9 @@
nullptr);
}
- BindGroup::~BindGroup() {
+ BindGroup::~BindGroup() = default;
+
+ void BindGroup::DestroyApiObjectImpl() {
ToBackend(GetLayout())->DeallocateBindGroup(this, &mDescriptorSetAllocation);
}
diff --git a/src/dawn_native/vulkan/BindGroupVk.h b/src/dawn_native/vulkan/BindGroupVk.h
index dac780b..de69ef6 100644
--- a/src/dawn_native/vulkan/BindGroupVk.h
+++ b/src/dawn_native/vulkan/BindGroupVk.h
@@ -40,6 +40,8 @@
private:
~BindGroup() override;
+ void DestroyApiObjectImpl() override;
+
// The descriptor set in this allocation outlives the BindGroup because it is owned by
// the BindGroupLayout which is referenced by the BindGroup.
DescriptorSetAllocation mDescriptorSetAllocation;
diff --git a/src/dawn_native/vulkan/ComputePipelineVk.cpp b/src/dawn_native/vulkan/ComputePipelineVk.cpp
index c6c3278..adeb793 100644
--- a/src/dawn_native/vulkan/ComputePipelineVk.cpp
+++ b/src/dawn_native/vulkan/ComputePipelineVk.cpp
@@ -89,7 +89,9 @@
reinterpret_cast<uint64_t&>(mHandle), "Dawn_ComputePipeline", GetLabel());
}
- ComputePipeline::~ComputePipeline() {
+ ComputePipeline::~ComputePipeline() = default;
+
+ void ComputePipeline::DestroyApiObjectImpl() {
if (mHandle != VK_NULL_HANDLE) {
ToBackend(GetDevice())->GetFencedDeleter()->DeleteWhenUnused(mHandle);
mHandle = VK_NULL_HANDLE;
diff --git a/src/dawn_native/vulkan/ComputePipelineVk.h b/src/dawn_native/vulkan/ComputePipelineVk.h
index 1f2d20d..6c04660 100644
--- a/src/dawn_native/vulkan/ComputePipelineVk.h
+++ b/src/dawn_native/vulkan/ComputePipelineVk.h
@@ -42,6 +42,7 @@
private:
~ComputePipeline() override;
+ void DestroyApiObjectImpl() override;
using ComputePipelineBase::ComputePipelineBase;
VkPipeline mHandle = VK_NULL_HANDLE;
diff --git a/src/dawn_native/vulkan/PipelineLayoutVk.cpp b/src/dawn_native/vulkan/PipelineLayoutVk.cpp
index 6f7ab54..11d21d0 100644
--- a/src/dawn_native/vulkan/PipelineLayoutVk.cpp
+++ b/src/dawn_native/vulkan/PipelineLayoutVk.cpp
@@ -57,7 +57,9 @@
"CreatePipelineLayout");
}
- PipelineLayout::~PipelineLayout() {
+ PipelineLayout::~PipelineLayout() = default;
+
+ void PipelineLayout::DestroyApiObjectImpl() {
if (mHandle != VK_NULL_HANDLE) {
ToBackend(GetDevice())->GetFencedDeleter()->DeleteWhenUnused(mHandle);
mHandle = VK_NULL_HANDLE;
diff --git a/src/dawn_native/vulkan/PipelineLayoutVk.h b/src/dawn_native/vulkan/PipelineLayoutVk.h
index c96215f..6d3144e 100644
--- a/src/dawn_native/vulkan/PipelineLayoutVk.h
+++ b/src/dawn_native/vulkan/PipelineLayoutVk.h
@@ -34,6 +34,8 @@
private:
~PipelineLayout() override;
+ void DestroyApiObjectImpl() override;
+
using PipelineLayoutBase::PipelineLayoutBase;
MaybeError Initialize();
diff --git a/src/dawn_native/vulkan/RenderPipelineVk.cpp b/src/dawn_native/vulkan/RenderPipelineVk.cpp
index ff96ec1..abb1462 100644
--- a/src/dawn_native/vulkan/RenderPipelineVk.cpp
+++ b/src/dawn_native/vulkan/RenderPipelineVk.cpp
@@ -599,7 +599,9 @@
return createInfo;
}
- RenderPipeline::~RenderPipeline() {
+ RenderPipeline::~RenderPipeline() = default;
+
+ void RenderPipeline::DestroyApiObjectImpl() {
if (mHandle != VK_NULL_HANDLE) {
ToBackend(GetDevice())->GetFencedDeleter()->DeleteWhenUnused(mHandle);
mHandle = VK_NULL_HANDLE;
diff --git a/src/dawn_native/vulkan/RenderPipelineVk.h b/src/dawn_native/vulkan/RenderPipelineVk.h
index 0efd868..b883aad 100644
--- a/src/dawn_native/vulkan/RenderPipelineVk.h
+++ b/src/dawn_native/vulkan/RenderPipelineVk.h
@@ -41,6 +41,7 @@
private:
~RenderPipeline() override;
+ void DestroyApiObjectImpl() override;
using RenderPipelineBase::RenderPipelineBase;
struct PipelineVertexInputStateCreateInfoTemporaryAllocations {
diff --git a/src/dawn_native/vulkan/SamplerVk.cpp b/src/dawn_native/vulkan/SamplerVk.cpp
index c056515..d859f35 100644
--- a/src/dawn_native/vulkan/SamplerVk.cpp
+++ b/src/dawn_native/vulkan/SamplerVk.cpp
@@ -105,7 +105,9 @@
"CreateSampler");
}
- Sampler::~Sampler() {
+ Sampler::~Sampler() = default;
+
+ void Sampler::DestroyApiObjectImpl() {
if (mHandle != VK_NULL_HANDLE) {
ToBackend(GetDevice())->GetFencedDeleter()->DeleteWhenUnused(mHandle);
mHandle = VK_NULL_HANDLE;
diff --git a/src/dawn_native/vulkan/SamplerVk.h b/src/dawn_native/vulkan/SamplerVk.h
index ac7b886..ce00667 100644
--- a/src/dawn_native/vulkan/SamplerVk.h
+++ b/src/dawn_native/vulkan/SamplerVk.h
@@ -33,6 +33,7 @@
private:
~Sampler() override;
+ void DestroyApiObjectImpl() override;
using SamplerBase::SamplerBase;
MaybeError Initialize(const SamplerDescriptor* descriptor);
diff --git a/src/dawn_native/vulkan/SwapChainVk.cpp b/src/dawn_native/vulkan/SwapChainVk.cpp
index 95ba482..13a6490 100644
--- a/src/dawn_native/vulkan/SwapChainVk.cpp
+++ b/src/dawn_native/vulkan/SwapChainVk.cpp
@@ -223,7 +223,9 @@
return swapchain;
}
- SwapChain::~SwapChain() {
+ SwapChain::~SwapChain() = default;
+
+ void SwapChain::DestroyApiObjectImpl() {
DetachFromSurface();
}
diff --git a/src/dawn_native/vulkan/SwapChainVk.h b/src/dawn_native/vulkan/SwapChainVk.h
index 2210379..6ab3f21 100644
--- a/src/dawn_native/vulkan/SwapChainVk.h
+++ b/src/dawn_native/vulkan/SwapChainVk.h
@@ -53,6 +53,7 @@
private:
using NewSwapChainBase::NewSwapChainBase;
MaybeError Initialize(NewSwapChainBase* previousSwapChain);
+ void DestroyApiObjectImpl() override;
struct Config {
// Information that's passed to vulkan swapchain creation.