diff --git a/src/dawn_native/d3d12/BindGroupD3D12.cpp b/src/dawn_native/d3d12/BindGroupD3D12.cpp index f002ece353..485d220049 100644 --- a/src/dawn_native/d3d12/BindGroupD3D12.cpp +++ b/src/dawn_native/d3d12/BindGroupD3D12.cpp @@ -205,7 +205,9 @@ namespace dawn_native { namespace d3d12 { } } - 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 43b54c14dc..7ffda1ddfe 100644 --- a/src/dawn_native/d3d12/BindGroupD3D12.h +++ b/src/dawn_native/d3d12/BindGroupD3D12.h @@ -48,6 +48,8 @@ namespace dawn_native { namespace d3d12 { private: ~BindGroup() override; + void DestroyApiObjectImpl() override; + Ref mSamplerAllocationEntry; GPUDescriptorHeapAllocation mGPUViewAllocation; diff --git a/src/dawn_native/d3d12/ComputePipelineD3D12.cpp b/src/dawn_native/d3d12/ComputePipelineD3D12.cpp index 54ddc7e143..1cbbdc5112 100644 --- a/src/dawn_native/d3d12/ComputePipelineD3D12.cpp +++ b/src/dawn_native/d3d12/ComputePipelineD3D12.cpp @@ -62,7 +62,9 @@ namespace dawn_native { namespace d3d12 { 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 b652026013..0bf9254d56 100644 --- a/src/dawn_native/d3d12/ComputePipelineD3D12.h +++ b/src/dawn_native/d3d12/ComputePipelineD3D12.h @@ -44,6 +44,9 @@ namespace dawn_native { namespace d3d12 { private: ~ComputePipeline() override; + + void DestroyApiObjectImpl() override; + using ComputePipelineBase::ComputePipelineBase; ComPtr mPipelineState; }; diff --git a/src/dawn_native/d3d12/RenderPipelineD3D12.cpp b/src/dawn_native/d3d12/RenderPipelineD3D12.cpp index ee2fde6b4e..6718e7918f 100644 --- a/src/dawn_native/d3d12/RenderPipelineD3D12.cpp +++ b/src/dawn_native/d3d12/RenderPipelineD3D12.cpp @@ -417,7 +417,9 @@ namespace dawn_native { namespace d3d12 { 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 be0efef500..251b16e056 100644 --- a/src/dawn_native/d3d12/RenderPipelineD3D12.h +++ b/src/dawn_native/d3d12/RenderPipelineD3D12.h @@ -45,6 +45,9 @@ namespace dawn_native { namespace d3d12 { private: ~RenderPipeline() override; + + void DestroyApiObjectImpl() override; + using RenderPipelineBase::RenderPipelineBase; D3D12_INPUT_LAYOUT_DESC ComputeInputLayout( std::array* inputElementDescriptors); diff --git a/src/dawn_native/d3d12/SwapChainD3D12.cpp b/src/dawn_native/d3d12/SwapChainD3D12.cpp index efc0a02187..9fe83de64d 100644 --- a/src/dawn_native/d3d12/SwapChainD3D12.cpp +++ b/src/dawn_native/d3d12/SwapChainD3D12.cpp @@ -141,7 +141,9 @@ namespace dawn_native { namespace d3d12 { 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 bc476d1193..9f951e45e9 100644 --- a/src/dawn_native/d3d12/SwapChainD3D12.h +++ b/src/dawn_native/d3d12/SwapChainD3D12.h @@ -48,6 +48,8 @@ namespace dawn_native { namespace d3d12 { 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 29a3f4e82c..da142509bc 100644 --- a/src/dawn_native/metal/BindGroupMTL.h +++ b/src/dawn_native/metal/BindGroupMTL.h @@ -30,6 +30,8 @@ namespace dawn_native { namespace metal { 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 48571ecbb7..aba142903b 100644 --- a/src/dawn_native/metal/BindGroupMTL.mm +++ b/src/dawn_native/metal/BindGroupMTL.mm @@ -22,7 +22,9 @@ namespace dawn_native { namespace metal { : 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 6a7216ecb0..2d76043326 100644 --- a/src/dawn_native/metal/SwapChainMTL.h +++ b/src/dawn_native/metal/SwapChainMTL.h @@ -47,6 +47,8 @@ namespace dawn_native { namespace metal { ~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 17851abf33..9ba8696c29 100644 --- a/src/dawn_native/metal/SwapChainMTL.mm +++ b/src/dawn_native/metal/SwapChainMTL.mm @@ -73,7 +73,9 @@ namespace dawn_native { namespace metal { 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 c726f295e4..0a43de2118 100644 --- a/src/dawn_native/opengl/BindGroupGL.cpp +++ b/src/dawn_native/opengl/BindGroupGL.cpp @@ -50,7 +50,9 @@ namespace dawn_native { namespace opengl { : 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 0619cf185d..39c990e848 100644 --- a/src/dawn_native/opengl/BindGroupGL.h +++ b/src/dawn_native/opengl/BindGroupGL.h @@ -32,6 +32,8 @@ namespace dawn_native { namespace opengl { 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 086ca7aea0..42b3d7278b 100644 --- a/src/dawn_native/opengl/ComputePipelineGL.cpp +++ b/src/dawn_native/opengl/ComputePipelineGL.cpp @@ -25,7 +25,9 @@ namespace dawn_native { namespace opengl { 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 444a28958a..cba762c522 100644 --- a/src/dawn_native/opengl/ComputePipelineGL.h +++ b/src/dawn_native/opengl/ComputePipelineGL.h @@ -38,6 +38,7 @@ namespace dawn_native { namespace opengl { 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 1b4b5cee74..7a56927bbf 100644 --- a/src/dawn_native/opengl/RenderPipelineGL.cpp +++ b/src/dawn_native/opengl/RenderPipelineGL.cpp @@ -234,7 +234,9 @@ namespace dawn_native { namespace opengl { 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 cd3290fa1c..ce2cce37e6 100644 --- a/src/dawn_native/opengl/RenderPipelineGL.h +++ b/src/dawn_native/opengl/RenderPipelineGL.h @@ -43,6 +43,7 @@ namespace dawn_native { namespace opengl { 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 81fdd46da2..b4c7c26581 100644 --- a/src/dawn_native/opengl/SamplerGL.cpp +++ b/src/dawn_native/opengl/SamplerGL.cpp @@ -76,7 +76,9 @@ namespace dawn_native { namespace opengl { 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 0644890747..ab5562664c 100644 --- a/src/dawn_native/opengl/SamplerGL.h +++ b/src/dawn_native/opengl/SamplerGL.h @@ -32,6 +32,7 @@ namespace dawn_native { namespace opengl { 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 85bd151dd9..7704d9b1fb 100644 --- a/src/dawn_native/vulkan/BindGroupVk.cpp +++ b/src/dawn_native/vulkan/BindGroupVk.cpp @@ -158,7 +158,9 @@ namespace dawn_native { namespace vulkan { 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 dac780bf0b..de69ef6420 100644 --- a/src/dawn_native/vulkan/BindGroupVk.h +++ b/src/dawn_native/vulkan/BindGroupVk.h @@ -40,6 +40,8 @@ namespace dawn_native { namespace vulkan { 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 c6c3278b3d..adeb793d69 100644 --- a/src/dawn_native/vulkan/ComputePipelineVk.cpp +++ b/src/dawn_native/vulkan/ComputePipelineVk.cpp @@ -89,7 +89,9 @@ namespace dawn_native { namespace vulkan { reinterpret_cast(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 1f2d20db7c..6c0466018b 100644 --- a/src/dawn_native/vulkan/ComputePipelineVk.h +++ b/src/dawn_native/vulkan/ComputePipelineVk.h @@ -42,6 +42,7 @@ namespace dawn_native { namespace vulkan { 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 6f7ab54115..11d21d0321 100644 --- a/src/dawn_native/vulkan/PipelineLayoutVk.cpp +++ b/src/dawn_native/vulkan/PipelineLayoutVk.cpp @@ -57,7 +57,9 @@ namespace dawn_native { namespace vulkan { "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 c96215f6b7..6d3144e1fa 100644 --- a/src/dawn_native/vulkan/PipelineLayoutVk.h +++ b/src/dawn_native/vulkan/PipelineLayoutVk.h @@ -34,6 +34,8 @@ namespace dawn_native { namespace vulkan { 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 ff96ec1df0..abb1462aeb 100644 --- a/src/dawn_native/vulkan/RenderPipelineVk.cpp +++ b/src/dawn_native/vulkan/RenderPipelineVk.cpp @@ -599,7 +599,9 @@ namespace dawn_native { namespace vulkan { 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 0efd8680b7..b883aad759 100644 --- a/src/dawn_native/vulkan/RenderPipelineVk.h +++ b/src/dawn_native/vulkan/RenderPipelineVk.h @@ -41,6 +41,7 @@ namespace dawn_native { namespace vulkan { 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 c056515a5c..d859f35199 100644 --- a/src/dawn_native/vulkan/SamplerVk.cpp +++ b/src/dawn_native/vulkan/SamplerVk.cpp @@ -105,7 +105,9 @@ namespace dawn_native { namespace vulkan { "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 ac7b886a3e..ce00667fb9 100644 --- a/src/dawn_native/vulkan/SamplerVk.h +++ b/src/dawn_native/vulkan/SamplerVk.h @@ -33,6 +33,7 @@ namespace dawn_native { namespace vulkan { 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 95ba482d13..13a649023e 100644 --- a/src/dawn_native/vulkan/SwapChainVk.cpp +++ b/src/dawn_native/vulkan/SwapChainVk.cpp @@ -223,7 +223,9 @@ namespace dawn_native { namespace vulkan { 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 2210379090..6ab3f21374 100644 --- a/src/dawn_native/vulkan/SwapChainVk.h +++ b/src/dawn_native/vulkan/SwapChainVk.h @@ -53,6 +53,7 @@ namespace dawn_native { namespace vulkan { private: using NewSwapChainBase::NewSwapChainBase; MaybeError Initialize(NewSwapChainBase* previousSwapChain); + void DestroyApiObjectImpl() override; struct Config { // Information that's passed to vulkan swapchain creation.