From cb25e6feff2d9ac3f399b3a43cd11d374f90f127 Mon Sep 17 00:00:00 2001 From: cosmonaut Date: Fri, 18 Feb 2022 21:02:16 -0800 Subject: [PATCH] resource destroy now requires a CB --- lib/RefreshCS | 2 +- src/Game.cs | 2 ++ src/Graphics/GraphicsDevice.cs | 21 +++++++++++++++++++++ src/Graphics/GraphicsResource.cs | 4 ++-- src/Graphics/Resources/Buffer.cs | 2 +- src/Graphics/Resources/ComputePipeline.cs | 2 +- src/Graphics/Resources/Framebuffer.cs | 2 +- src/Graphics/Resources/GraphicsPipeline.cs | 2 +- src/Graphics/Resources/RenderPass.cs | 2 +- src/Graphics/Resources/RenderTarget.cs | 2 +- src/Graphics/Resources/Sampler.cs | 2 +- src/Graphics/Resources/ShaderModule.cs | 2 +- src/Graphics/Resources/Texture.cs | 2 +- 13 files changed, 35 insertions(+), 12 deletions(-) diff --git a/lib/RefreshCS b/lib/RefreshCS index 95cd22c4..1e8abe37 160000 --- a/lib/RefreshCS +++ b/lib/RefreshCS @@ -1 +1 @@ -Subproject commit 95cd22c48a68f93204b44bc508dec86b6be74e56 +Subproject commit 1e8abe379a0ccc891ce0f4d90793feac59d30948 diff --git a/src/Game.cs b/src/Game.cs index 74be1ac3..5dab4d75 100644 --- a/src/Game.cs +++ b/src/Game.cs @@ -133,6 +133,8 @@ namespace MoonWorks var alpha = accumulatedElapsedTime / timestep; Draw(timestep, alpha); + + GraphicsDevice.SubmitDestroyCommandBuffer(); } } } diff --git a/src/Graphics/GraphicsDevice.cs b/src/Graphics/GraphicsDevice.cs index 7890f7a9..ee2566f0 100644 --- a/src/Graphics/GraphicsDevice.cs +++ b/src/Graphics/GraphicsDevice.cs @@ -11,6 +11,7 @@ namespace MoonWorks.Graphics public bool IsDisposed { get; private set; } private readonly List> resources = new List>(); + private Dictionary> resourcesToDestroy = new Dictionary>(); public GraphicsDevice( IntPtr deviceWindowHandle, @@ -56,6 +57,26 @@ namespace MoonWorks.Graphics Refresh.Refresh_Wait(Handle); } + internal void SubmitDestroyCommandBuffer() + { + if (resourcesToDestroy.Count > 0) + { + var commandBuffer = AcquireCommandBuffer(); + + foreach (var kv in resourcesToDestroy) + { + kv.Value.Invoke(Handle, commandBuffer.Handle, kv.Key); + } + + Submit(commandBuffer); + } + } + + internal void PrepareDestroyResource(GraphicsResource resource, Action destroyFunction) + { + resourcesToDestroy.Add(resource.Handle, destroyFunction); + } + internal void AddResourceReference(WeakReference resourceReference) { lock (resources) diff --git a/src/Graphics/GraphicsResource.cs b/src/Graphics/GraphicsResource.cs index d35183c8..a39aa0e9 100644 --- a/src/Graphics/GraphicsResource.cs +++ b/src/Graphics/GraphicsResource.cs @@ -8,7 +8,7 @@ namespace MoonWorks.Graphics public IntPtr Handle { get; protected set; } public bool IsDisposed { get; private set; } - protected abstract Action QueueDestroyFunction { get; } + protected abstract Action QueueDestroyFunction { get; } private WeakReference selfReference; @@ -24,7 +24,7 @@ namespace MoonWorks.Graphics { if (!IsDisposed) { - QueueDestroyFunction(Device.Handle, Handle); + Device.PrepareDestroyResource(this, QueueDestroyFunction); if (selfReference != null) { diff --git a/src/Graphics/Resources/Buffer.cs b/src/Graphics/Resources/Buffer.cs index 4b638ff2..61ef5f1f 100644 --- a/src/Graphics/Resources/Buffer.cs +++ b/src/Graphics/Resources/Buffer.cs @@ -9,7 +9,7 @@ namespace MoonWorks.Graphics /// public class Buffer : GraphicsResource { - protected override Action QueueDestroyFunction => Refresh.Refresh_QueueDestroyBuffer; + protected override Action QueueDestroyFunction => Refresh.Refresh_QueueDestroyBuffer; /// /// Creates a buffer. diff --git a/src/Graphics/Resources/ComputePipeline.cs b/src/Graphics/Resources/ComputePipeline.cs index 8cb6a5db..9f74804d 100644 --- a/src/Graphics/Resources/ComputePipeline.cs +++ b/src/Graphics/Resources/ComputePipeline.cs @@ -6,7 +6,7 @@ namespace MoonWorks.Graphics { public class ComputePipeline : GraphicsResource { - protected override Action QueueDestroyFunction => Refresh.Refresh_QueueDestroyComputePipeline; + protected override Action QueueDestroyFunction => Refresh.Refresh_QueueDestroyComputePipeline; public ShaderStageState ComputeShaderState { get; } diff --git a/src/Graphics/Resources/Framebuffer.cs b/src/Graphics/Resources/Framebuffer.cs index 2ed1cf20..9040551e 100644 --- a/src/Graphics/Resources/Framebuffer.cs +++ b/src/Graphics/Resources/Framebuffer.cs @@ -9,7 +9,7 @@ namespace MoonWorks.Graphics /// public class Framebuffer : GraphicsResource { - protected override Action QueueDestroyFunction => Refresh.Refresh_QueueDestroyFramebuffer; + protected override Action QueueDestroyFunction => Refresh.Refresh_QueueDestroyFramebuffer; public RenderTarget DepthStencilTarget { get; } diff --git a/src/Graphics/Resources/GraphicsPipeline.cs b/src/Graphics/Resources/GraphicsPipeline.cs index 78752076..a1c545e4 100644 --- a/src/Graphics/Resources/GraphicsPipeline.cs +++ b/src/Graphics/Resources/GraphicsPipeline.cs @@ -10,7 +10,7 @@ namespace MoonWorks.Graphics /// public class GraphicsPipeline : GraphicsResource { - protected override Action QueueDestroyFunction => Refresh.Refresh_QueueDestroyGraphicsPipeline; + protected override Action QueueDestroyFunction => Refresh.Refresh_QueueDestroyGraphicsPipeline; public ShaderStageState VertexShaderState { get; } public ShaderStageState FragmentShaderState { get; } diff --git a/src/Graphics/Resources/RenderPass.cs b/src/Graphics/Resources/RenderPass.cs index fc5e142a..1dadc481 100644 --- a/src/Graphics/Resources/RenderPass.cs +++ b/src/Graphics/Resources/RenderPass.cs @@ -8,7 +8,7 @@ namespace MoonWorks.Graphics /// public class RenderPass : GraphicsResource { - protected override Action QueueDestroyFunction => Refresh.Refresh_QueueDestroyRenderPass; + protected override Action QueueDestroyFunction => Refresh.Refresh_QueueDestroyRenderPass; /// /// Creates a render pass using color target descriptions. diff --git a/src/Graphics/Resources/RenderTarget.cs b/src/Graphics/Resources/RenderTarget.cs index 6a0c3490..fc20f45f 100644 --- a/src/Graphics/Resources/RenderTarget.cs +++ b/src/Graphics/Resources/RenderTarget.cs @@ -11,7 +11,7 @@ namespace MoonWorks.Graphics public TextureSlice TextureSlice { get; } public TextureFormat Format => TextureSlice.Texture.Format; - protected override Action QueueDestroyFunction => Refresh.Refresh_QueueDestroyRenderTarget; + protected override Action QueueDestroyFunction => Refresh.Refresh_QueueDestroyRenderTarget; /// /// Creates a render target backed by a texture. diff --git a/src/Graphics/Resources/Sampler.cs b/src/Graphics/Resources/Sampler.cs index e313f691..ffa4d60e 100644 --- a/src/Graphics/Resources/Sampler.cs +++ b/src/Graphics/Resources/Sampler.cs @@ -8,7 +8,7 @@ namespace MoonWorks.Graphics /// public class Sampler : GraphicsResource { - protected override Action QueueDestroyFunction => Refresh.Refresh_QueueDestroySampler; + protected override Action QueueDestroyFunction => Refresh.Refresh_QueueDestroySampler; public Sampler( GraphicsDevice device, diff --git a/src/Graphics/Resources/ShaderModule.cs b/src/Graphics/Resources/ShaderModule.cs index 63c7eaf1..59fd171a 100644 --- a/src/Graphics/Resources/ShaderModule.cs +++ b/src/Graphics/Resources/ShaderModule.cs @@ -8,7 +8,7 @@ namespace MoonWorks.Graphics /// public class ShaderModule : GraphicsResource { - protected override Action QueueDestroyFunction => Refresh.Refresh_QueueDestroyShaderModule; + protected override Action QueueDestroyFunction => Refresh.Refresh_QueueDestroyShaderModule; public unsafe ShaderModule(GraphicsDevice device, string filePath) : base(device) { diff --git a/src/Graphics/Resources/Texture.cs b/src/Graphics/Resources/Texture.cs index dc9eeb63..d537e43a 100644 --- a/src/Graphics/Resources/Texture.cs +++ b/src/Graphics/Resources/Texture.cs @@ -17,7 +17,7 @@ namespace MoonWorks.Graphics public SampleCount SampleCount { get; } public TextureUsageFlags UsageFlags { get; } - protected override Action QueueDestroyFunction => Refresh.Refresh_QueueDestroyTexture; + protected override Action QueueDestroyFunction => Refresh.Refresh_QueueDestroyTexture; /// /// Loads a PNG from a file path.