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