using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.Rendering;
namespace FidelityFX
{
///
/// Convenience class for handling a constants buffer containing a single struct item.
/// This wraps the compute buffer and the value array, as well as providing easy access to both.
///
public class ConstantsBuffer
where TConst: struct
{
private ComputeBuffer _computeBuffer;
private readonly TConst[] _constArray = { new TConst() };
public ref TConst Value => ref _constArray[0];
public static ConstantsBuffer Create()
{
ConstantsBuffer buffer = new();
buffer.Init();
return buffer;
}
public void Init()
{
_computeBuffer = new ComputeBuffer(1, Marshal.SizeOf(), ComputeBufferType.Constant);
}
public void UpdateBufferData(CommandBuffer commandBuffer)
{
commandBuffer.SetBufferData(_computeBuffer, _constArray);
}
public void Destroy()
{
if (_computeBuffer == null)
return;
_computeBuffer.Release();
_computeBuffer = null;
}
public static implicit operator ComputeBuffer(ConstantsBuffer constants)
{
return constants._computeBuffer;
}
}
}