using System;
using RefreshCS;
namespace MoonWorks.Graphics
{
	/// 
	/// Fences allow you to track the status of a submitted command buffer. 
	/// You should only acquire a Fence if you will need to track the command buffer. 
	/// You should make sure to call GraphicsDevice.ReleaseFence when done with a Fence to avoid memory growth. 
	/// The Fence object itself is basically just a wrapper for the Refresh_Fence. 
	/// The internal handle is replaced so that we can pool Fence objects to manage garbage.
	/// 
	public class Fence : GraphicsResource
	{
		protected override Action QueueDestroyFunction => Release;
		internal Fence(GraphicsDevice device) : base(device, true)
		{
		}
		internal void SetHandle(nint handle)
		{
			Handle = handle;
		}
		private void Release(nint deviceHandle, nint fenceHandle)
		{
			if (fenceHandle != IntPtr.Zero)
			{
				// This will only be called if the client forgot to release a handle. Oh no!
				Refresh.Refresh_ReleaseFence(deviceHandle, fenceHandle);
			}
		}
	}
}