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; } } }