forked from MoonsideGames/MoonWorks
resource destroy now requires a CB
parent
4acc2588e1
commit
cb25e6feff
|
@ -1 +1 @@
|
||||||
Subproject commit 95cd22c48a68f93204b44bc508dec86b6be74e56
|
Subproject commit 1e8abe379a0ccc891ce0f4d90793feac59d30948
|
|
@ -133,6 +133,8 @@ namespace MoonWorks
|
||||||
var alpha = accumulatedElapsedTime / timestep;
|
var alpha = accumulatedElapsedTime / timestep;
|
||||||
|
|
||||||
Draw(timestep, alpha);
|
Draw(timestep, alpha);
|
||||||
|
|
||||||
|
GraphicsDevice.SubmitDestroyCommandBuffer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ namespace MoonWorks.Graphics
|
||||||
public bool IsDisposed { get; private set; }
|
public bool IsDisposed { get; private set; }
|
||||||
|
|
||||||
private readonly List<WeakReference<GraphicsResource>> resources = new List<WeakReference<GraphicsResource>>();
|
private readonly List<WeakReference<GraphicsResource>> resources = new List<WeakReference<GraphicsResource>>();
|
||||||
|
private Dictionary<IntPtr, Action<IntPtr, IntPtr, IntPtr>> resourcesToDestroy = new Dictionary<IntPtr, Action<IntPtr, IntPtr, IntPtr>>();
|
||||||
|
|
||||||
public GraphicsDevice(
|
public GraphicsDevice(
|
||||||
IntPtr deviceWindowHandle,
|
IntPtr deviceWindowHandle,
|
||||||
|
@ -56,6 +57,26 @@ namespace MoonWorks.Graphics
|
||||||
Refresh.Refresh_Wait(Handle);
|
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<IntPtr, IntPtr, IntPtr> destroyFunction)
|
||||||
|
{
|
||||||
|
resourcesToDestroy.Add(resource.Handle, destroyFunction);
|
||||||
|
}
|
||||||
|
|
||||||
internal void AddResourceReference(WeakReference<GraphicsResource> resourceReference)
|
internal void AddResourceReference(WeakReference<GraphicsResource> resourceReference)
|
||||||
{
|
{
|
||||||
lock (resources)
|
lock (resources)
|
||||||
|
|
|
@ -8,7 +8,7 @@ namespace MoonWorks.Graphics
|
||||||
public IntPtr Handle { get; protected set; }
|
public IntPtr Handle { get; protected set; }
|
||||||
|
|
||||||
public bool IsDisposed { get; private set; }
|
public bool IsDisposed { get; private set; }
|
||||||
protected abstract Action<IntPtr, IntPtr> QueueDestroyFunction { get; }
|
protected abstract Action<IntPtr, IntPtr, IntPtr> QueueDestroyFunction { get; }
|
||||||
|
|
||||||
private WeakReference<GraphicsResource> selfReference;
|
private WeakReference<GraphicsResource> selfReference;
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ namespace MoonWorks.Graphics
|
||||||
{
|
{
|
||||||
if (!IsDisposed)
|
if (!IsDisposed)
|
||||||
{
|
{
|
||||||
QueueDestroyFunction(Device.Handle, Handle);
|
Device.PrepareDestroyResource(this, QueueDestroyFunction);
|
||||||
|
|
||||||
if (selfReference != null)
|
if (selfReference != null)
|
||||||
{
|
{
|
||||||
|
|
|
@ -9,7 +9,7 @@ namespace MoonWorks.Graphics
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class Buffer : GraphicsResource
|
public class Buffer : GraphicsResource
|
||||||
{
|
{
|
||||||
protected override Action<IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyBuffer;
|
protected override Action<IntPtr, IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyBuffer;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a buffer.
|
/// Creates a buffer.
|
||||||
|
|
|
@ -6,7 +6,7 @@ namespace MoonWorks.Graphics
|
||||||
{
|
{
|
||||||
public class ComputePipeline : GraphicsResource
|
public class ComputePipeline : GraphicsResource
|
||||||
{
|
{
|
||||||
protected override Action<IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyComputePipeline;
|
protected override Action<IntPtr, IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyComputePipeline;
|
||||||
|
|
||||||
public ShaderStageState ComputeShaderState { get; }
|
public ShaderStageState ComputeShaderState { get; }
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ namespace MoonWorks.Graphics
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class Framebuffer : GraphicsResource
|
public class Framebuffer : GraphicsResource
|
||||||
{
|
{
|
||||||
protected override Action<IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyFramebuffer;
|
protected override Action<IntPtr, IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyFramebuffer;
|
||||||
|
|
||||||
public RenderTarget DepthStencilTarget { get; }
|
public RenderTarget DepthStencilTarget { get; }
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ namespace MoonWorks.Graphics
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class GraphicsPipeline : GraphicsResource
|
public class GraphicsPipeline : GraphicsResource
|
||||||
{
|
{
|
||||||
protected override Action<IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyGraphicsPipeline;
|
protected override Action<IntPtr, IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyGraphicsPipeline;
|
||||||
|
|
||||||
public ShaderStageState VertexShaderState { get; }
|
public ShaderStageState VertexShaderState { get; }
|
||||||
public ShaderStageState FragmentShaderState { get; }
|
public ShaderStageState FragmentShaderState { get; }
|
||||||
|
|
|
@ -8,7 +8,7 @@ namespace MoonWorks.Graphics
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class RenderPass : GraphicsResource
|
public class RenderPass : GraphicsResource
|
||||||
{
|
{
|
||||||
protected override Action<IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyRenderPass;
|
protected override Action<IntPtr, IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyRenderPass;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a render pass using color target descriptions.
|
/// Creates a render pass using color target descriptions.
|
||||||
|
|
|
@ -11,7 +11,7 @@ namespace MoonWorks.Graphics
|
||||||
public TextureSlice TextureSlice { get; }
|
public TextureSlice TextureSlice { get; }
|
||||||
public TextureFormat Format => TextureSlice.Texture.Format;
|
public TextureFormat Format => TextureSlice.Texture.Format;
|
||||||
|
|
||||||
protected override Action<IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyRenderTarget;
|
protected override Action<IntPtr, IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyRenderTarget;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a render target backed by a texture.
|
/// Creates a render target backed by a texture.
|
||||||
|
|
|
@ -8,7 +8,7 @@ namespace MoonWorks.Graphics
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class Sampler : GraphicsResource
|
public class Sampler : GraphicsResource
|
||||||
{
|
{
|
||||||
protected override Action<IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroySampler;
|
protected override Action<IntPtr, IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroySampler;
|
||||||
|
|
||||||
public Sampler(
|
public Sampler(
|
||||||
GraphicsDevice device,
|
GraphicsDevice device,
|
||||||
|
|
|
@ -8,7 +8,7 @@ namespace MoonWorks.Graphics
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class ShaderModule : GraphicsResource
|
public class ShaderModule : GraphicsResource
|
||||||
{
|
{
|
||||||
protected override Action<IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyShaderModule;
|
protected override Action<IntPtr, IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyShaderModule;
|
||||||
|
|
||||||
public unsafe ShaderModule(GraphicsDevice device, string filePath) : base(device)
|
public unsafe ShaderModule(GraphicsDevice device, string filePath) : base(device)
|
||||||
{
|
{
|
||||||
|
|
|
@ -17,7 +17,7 @@ namespace MoonWorks.Graphics
|
||||||
public SampleCount SampleCount { get; }
|
public SampleCount SampleCount { get; }
|
||||||
public TextureUsageFlags UsageFlags { get; }
|
public TextureUsageFlags UsageFlags { get; }
|
||||||
|
|
||||||
protected override Action<IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyTexture;
|
protected override Action<IntPtr, IntPtr, IntPtr> QueueDestroyFunction => Refresh.Refresh_QueueDestroyTexture;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Loads a PNG from a file path.
|
/// Loads a PNG from a file path.
|
||||||
|
|
Loading…
Reference in New Issue