From 3e91f84cf8c96cc089ba02eaad05f7ba25a3036d Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Sat, 3 Aug 2024 17:07:46 +0200 Subject: [PATCH] Simplified handling of compute buffer data by wrapping it inside a helper class --- Runtime/Common/FfxContextBase.cs | 53 ++++++++---- Runtime/FSR2/Fsr2Context.cs | 103 +++++++++++------------- Runtime/FSR3/Fsr3UpscalerContext.cs | 120 +++++++++++++--------------- 3 files changed, 138 insertions(+), 138 deletions(-) diff --git a/Runtime/Common/FfxContextBase.cs b/Runtime/Common/FfxContextBase.cs index 127cf4f..22595c2 100644 --- a/Runtime/Common/FfxContextBase.cs +++ b/Runtime/Common/FfxContextBase.cs @@ -1,26 +1,12 @@ using System; using System.Runtime.InteropServices; using UnityEngine; +using UnityEngine.Rendering; namespace FidelityFX { public abstract class FfxContextBase { - protected static ComputeBuffer CreateConstantBuffer() - where TBuf: struct - { - return new ComputeBuffer(1, Marshal.SizeOf(), ComputeBufferType.Constant); - } - - protected static void DestroyConstantBuffer(ref ComputeBuffer bufferRef) - { - if (bufferRef == null) - return; - - bufferRef.Release(); - bufferRef = null; - } - protected static void DestroyPass(ref TPass pass) where TPass: class, IDisposable { @@ -30,5 +16,42 @@ namespace FidelityFX pass.Dispose(); pass = null; } + + /// + /// 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. + /// + protected class ConstantsBuffer + where TConst: struct + { + private ComputeBuffer _computeBuffer; + + private readonly TConst[] _constArray = { new TConst() }; + public ref TConst Value => ref _constArray[0]; + + public void Create() + { + _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; + } + } } } diff --git a/Runtime/FSR2/Fsr2Context.cs b/Runtime/FSR2/Fsr2Context.cs index 8530c02..6020f29 100644 --- a/Runtime/FSR2/Fsr2Context.cs +++ b/Runtime/FSR2/Fsr2Context.cs @@ -19,7 +19,6 @@ // THE SOFTWARE. using System; -using System.Runtime.InteropServices; using UnityEngine; using UnityEngine.Rendering; @@ -49,26 +48,12 @@ namespace FidelityFX.FSR2 private readonly Fsr2Resources _resources = new Fsr2Resources(); - private ComputeBuffer _upscalerConstantsBuffer; - private readonly Fsr2.UpscalerConstants[] _upscalerConstantsArray = { new Fsr2.UpscalerConstants() }; - private ref Fsr2.UpscalerConstants UpscalerConsts => ref _upscalerConstantsArray[0]; - - private ComputeBuffer _spdConstantsBuffer; - private readonly Fsr2.SpdConstants[] _spdConstantsArray = { new Fsr2.SpdConstants() }; - private ref Fsr2.SpdConstants SpdConsts => ref _spdConstantsArray[0]; - - private ComputeBuffer _rcasConstantsBuffer; - private readonly Fsr2.RcasConstants[] _rcasConstantsArray = new Fsr2.RcasConstants[1]; - private ref Fsr2.RcasConstants RcasConsts => ref _rcasConstantsArray[0]; - - private ComputeBuffer _generateReactiveConstantsBuffer; - private readonly Fsr2.GenerateReactiveConstants[] _generateReactiveConstantsArray = { new Fsr2.GenerateReactiveConstants() }; - private ref Fsr2.GenerateReactiveConstants GenReactiveConsts => ref _generateReactiveConstantsArray[0]; - - private ComputeBuffer _tcrAutogenerateConstantsBuffer; - private readonly Fsr2.GenerateReactiveConstants2[] _tcrAutogenerateConstantsArray = { new Fsr2.GenerateReactiveConstants2() }; - private ref Fsr2.GenerateReactiveConstants2 TcrAutoGenConsts => ref _tcrAutogenerateConstantsArray[0]; - + private readonly ConstantsBuffer _upscalerConstants = new ConstantsBuffer(); + private readonly ConstantsBuffer _spdConstants = new ConstantsBuffer(); + private readonly ConstantsBuffer _rcasConstants = new ConstantsBuffer(); + private readonly ConstantsBuffer _generateReactiveConstants = new ConstantsBuffer(); + private readonly ConstantsBuffer _tcrAutogenerateConstants = new ConstantsBuffer(); + private bool _firstExecution; private Vector2 _previousJitterOffset; private int _resourceFrameIndex; @@ -78,17 +63,17 @@ namespace FidelityFX.FSR2 _contextDescription = contextDescription; _commandBuffer = new CommandBuffer { name = "FSR2" }; - _upscalerConstantsBuffer = CreateConstantBuffer(); - _spdConstantsBuffer = CreateConstantBuffer(); - _rcasConstantsBuffer = CreateConstantBuffer(); - _generateReactiveConstantsBuffer = CreateConstantBuffer(); - _tcrAutogenerateConstantsBuffer = CreateConstantBuffer(); + _upscalerConstants.Create(); + _spdConstants.Create(); + _rcasConstants.Create(); + _generateReactiveConstants.Create(); + _tcrAutogenerateConstants.Create(); // Set defaults _firstExecution = true; _resourceFrameIndex = 0; - UpscalerConsts.displaySize = _contextDescription.DisplaySize; + _upscalerConstants.Value.displaySize = _contextDescription.DisplaySize; _resources.Create(_contextDescription); CreatePasses(); @@ -96,14 +81,14 @@ namespace FidelityFX.FSR2 private void CreatePasses() { - _computeLuminancePyramidPass = new Fsr2ComputeLuminancePyramidPass(_contextDescription, _resources, _upscalerConstantsBuffer, _spdConstantsBuffer); - _reconstructPreviousDepthPass = new Fsr2ReconstructPreviousDepthPass(_contextDescription, _resources, _upscalerConstantsBuffer); - _depthClipPass = new Fsr2DepthClipPass(_contextDescription, _resources, _upscalerConstantsBuffer); - _lockPass = new Fsr2LockPass(_contextDescription, _resources, _upscalerConstantsBuffer); - _accumulatePass = new Fsr2AccumulatePass(_contextDescription, _resources, _upscalerConstantsBuffer); - _sharpenPass = new Fsr2SharpenPass(_contextDescription, _resources, _upscalerConstantsBuffer, _rcasConstantsBuffer); - _generateReactivePass = new Fsr2GenerateReactivePass(_contextDescription, _resources, _generateReactiveConstantsBuffer); - _tcrAutogeneratePass = new Fsr2TcrAutogeneratePass(_contextDescription, _resources, _upscalerConstantsBuffer, _tcrAutogenerateConstantsBuffer); + _computeLuminancePyramidPass = new Fsr2ComputeLuminancePyramidPass(_contextDescription, _resources, _upscalerConstants, _spdConstants); + _reconstructPreviousDepthPass = new Fsr2ReconstructPreviousDepthPass(_contextDescription, _resources, _upscalerConstants); + _depthClipPass = new Fsr2DepthClipPass(_contextDescription, _resources, _upscalerConstants); + _lockPass = new Fsr2LockPass(_contextDescription, _resources, _upscalerConstants); + _accumulatePass = new Fsr2AccumulatePass(_contextDescription, _resources, _upscalerConstants); + _sharpenPass = new Fsr2SharpenPass(_contextDescription, _resources, _upscalerConstants, _rcasConstants); + _generateReactivePass = new Fsr2GenerateReactivePass(_contextDescription, _resources, _generateReactiveConstants); + _tcrAutogeneratePass = new Fsr2TcrAutogeneratePass(_contextDescription, _resources, _upscalerConstants, _tcrAutogenerateConstants); } public void Destroy() @@ -119,11 +104,11 @@ namespace FidelityFX.FSR2 _resources.Destroy(); - DestroyConstantBuffer(ref _tcrAutogenerateConstantsBuffer); - DestroyConstantBuffer(ref _generateReactiveConstantsBuffer); - DestroyConstantBuffer(ref _rcasConstantsBuffer); - DestroyConstantBuffer(ref _spdConstantsBuffer); - DestroyConstantBuffer(ref _upscalerConstantsBuffer); + _tcrAutogenerateConstants.Destroy(); + _generateReactiveConstants.Destroy(); + _rcasConstants.Destroy(); + _spdConstants.Destroy(); + _upscalerConstants.Destroy(); if (_commandBuffer != null) { @@ -193,8 +178,8 @@ namespace FidelityFX.FSR2 // Reactive mask bias const int threadGroupWorkRegionDim = 8; - int dispatchSrcX = (UpscalerConsts.renderSize.x + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; - int dispatchSrcY = (UpscalerConsts.renderSize.y + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; + int dispatchSrcX = (_upscalerConstants.Value.renderSize.x + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; + int dispatchSrcY = (_upscalerConstants.Value.renderSize.y + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; int dispatchDstX = (_contextDescription.DisplaySize.x + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; int dispatchDstY = (_contextDescription.DisplaySize.y + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; @@ -228,8 +213,8 @@ namespace FidelityFX.FSR2 SetupSpdConstants(dispatchParams, out var dispatchThreadGroupCount); // Initialize constant buffers data - commandBuffer.SetBufferData(_upscalerConstantsBuffer, _upscalerConstantsArray); - commandBuffer.SetBufferData(_spdConstantsBuffer, _spdConstantsArray); + _upscalerConstants.UpdateBufferData(commandBuffer); + _spdConstants.UpdateBufferData(commandBuffer); // Auto reactive if (dispatchParams.EnableAutoReactive) @@ -258,7 +243,7 @@ namespace FidelityFX.FSR2 { // Compute the constants SetupRcasConstants(dispatchParams); - commandBuffer.SetBufferData(_rcasConstantsBuffer, _rcasConstantsArray); + _rcasConstants.UpdateBufferData(commandBuffer); // Dispatch RCAS const int threadGroupWorkRegionDimRcas = 16; @@ -287,11 +272,12 @@ namespace FidelityFX.FSR2 int dispatchSrcX = (dispatchParams.RenderSize.x + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; int dispatchSrcY = (dispatchParams.RenderSize.y + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; - GenReactiveConsts.scale = dispatchParams.Scale; - GenReactiveConsts.threshold = dispatchParams.CutoffThreshold; - GenReactiveConsts.binaryValue = dispatchParams.BinaryValue; - GenReactiveConsts.flags = (uint)dispatchParams.Flags; - commandBuffer.SetBufferData(_generateReactiveConstantsBuffer, _generateReactiveConstantsArray); + ref var genReactiveConsts = ref _generateReactiveConstants.Value; + genReactiveConsts.scale = dispatchParams.Scale; + genReactiveConsts.threshold = dispatchParams.CutoffThreshold; + genReactiveConsts.binaryValue = dispatchParams.BinaryValue; + genReactiveConsts.flags = (uint)dispatchParams.Flags; + _generateReactiveConstants.UpdateBufferData(commandBuffer); ((Fsr2GenerateReactivePass)_generateReactivePass).ScheduleDispatch(commandBuffer, dispatchParams, dispatchSrcX, dispatchSrcY); } @@ -302,18 +288,19 @@ namespace FidelityFX.FSR2 int dispatchSrcX = (dispatchParams.RenderSize.x + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; int dispatchSrcY = (dispatchParams.RenderSize.y + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; - TcrAutoGenConsts.autoTcThreshold = dispatchParams.AutoTcThreshold; - TcrAutoGenConsts.autoTcScale = dispatchParams.AutoTcScale; - TcrAutoGenConsts.autoReactiveScale = dispatchParams.AutoReactiveScale; - TcrAutoGenConsts.autoReactiveMax = dispatchParams.AutoReactiveMax; - commandBuffer.SetBufferData(_tcrAutogenerateConstantsBuffer, _tcrAutogenerateConstantsArray); + ref var tcrAutoGenConsts = ref _tcrAutogenerateConstants.Value; + tcrAutoGenConsts.autoTcThreshold = dispatchParams.AutoTcThreshold; + tcrAutoGenConsts.autoTcScale = dispatchParams.AutoTcScale; + tcrAutoGenConsts.autoReactiveScale = dispatchParams.AutoReactiveScale; + tcrAutoGenConsts.autoReactiveMax = dispatchParams.AutoReactiveMax; + _tcrAutogenerateConstants.UpdateBufferData(commandBuffer); _tcrAutogeneratePass.ScheduleDispatch(commandBuffer, dispatchParams, frameIndex, dispatchSrcX, dispatchSrcY); } private void SetupConstants(Fsr2.DispatchDescription dispatchParams, bool resetAccumulation) { - ref Fsr2.UpscalerConstants constants = ref UpscalerConsts; + ref Fsr2.UpscalerConstants constants = ref _upscalerConstants.Value; constants.jitterOffset = dispatchParams.JitterOffset; constants.renderSize = dispatchParams.RenderSize; @@ -411,7 +398,7 @@ namespace FidelityFX.FSR2 private void SetupRcasConstants(Fsr2.DispatchDescription dispatchParams) { int sharpnessIndex = Mathf.RoundToInt(Mathf.Clamp01(dispatchParams.Sharpness) * (RcasConfigs.Length - 1)); - RcasConsts = RcasConfigs[sharpnessIndex]; + _rcasConstants.Value = RcasConfigs[sharpnessIndex]; } private void SetupSpdConstants(Fsr2.DispatchDescription dispatchParams, out Vector2Int dispatchThreadGroupCount) @@ -420,7 +407,7 @@ namespace FidelityFX.FSR2 SpdSetup(rectInfo, out dispatchThreadGroupCount, out var workGroupOffset, out var numWorkGroupsAndMips); // Downsample - ref Fsr2.SpdConstants spdConstants = ref SpdConsts; + ref Fsr2.SpdConstants spdConstants = ref _spdConstants.Value; spdConstants.numWorkGroups = (uint)numWorkGroupsAndMips.x; spdConstants.mips = (uint)numWorkGroupsAndMips.y; spdConstants.workGroupOffsetX = (uint)workGroupOffset.x; diff --git a/Runtime/FSR3/Fsr3UpscalerContext.cs b/Runtime/FSR3/Fsr3UpscalerContext.cs index ccdab06..3daa249 100644 --- a/Runtime/FSR3/Fsr3UpscalerContext.cs +++ b/Runtime/FSR3/Fsr3UpscalerContext.cs @@ -54,25 +54,11 @@ namespace FidelityFX.FSR3 private readonly Fsr3UpscalerResources _resources = new Fsr3UpscalerResources(); - private ComputeBuffer _upscalerConstantsBuffer; - private readonly Fsr3Upscaler.UpscalerConstants[] _upscalerConstantsArray = { new Fsr3Upscaler.UpscalerConstants() }; - private ref Fsr3Upscaler.UpscalerConstants UpscalerConsts => ref _upscalerConstantsArray[0]; - - private ComputeBuffer _spdConstantsBuffer; - private readonly Fsr3Upscaler.SpdConstants[] _spdConstantsArray = { new Fsr3Upscaler.SpdConstants() }; - private ref Fsr3Upscaler.SpdConstants SpdConsts => ref _spdConstantsArray[0]; - - private ComputeBuffer _rcasConstantsBuffer; - private readonly Fsr3Upscaler.RcasConstants[] _rcasConstantsArray = new Fsr3Upscaler.RcasConstants[1]; - private ref Fsr3Upscaler.RcasConstants RcasConsts => ref _rcasConstantsArray[0]; - - private ComputeBuffer _generateReactiveConstantsBuffer; - private readonly Fsr3Upscaler.GenerateReactiveConstants[] _generateReactiveConstantsArray = { new Fsr3Upscaler.GenerateReactiveConstants() }; - private ref Fsr3Upscaler.GenerateReactiveConstants GenReactiveConsts => ref _generateReactiveConstantsArray[0]; - - private ComputeBuffer _tcrAutogenerateConstantsBuffer; - private readonly Fsr3Upscaler.GenerateReactiveConstants2[] _tcrAutogenerateConstantsArray = { new Fsr3Upscaler.GenerateReactiveConstants2() }; - private ref Fsr3Upscaler.GenerateReactiveConstants2 TcrAutoGenConsts => ref _tcrAutogenerateConstantsArray[0]; + private readonly ConstantsBuffer _upscalerConstants = new ConstantsBuffer(); + private readonly ConstantsBuffer _spdConstants = new ConstantsBuffer(); + private readonly ConstantsBuffer _rcasConstants = new ConstantsBuffer(); + private readonly ConstantsBuffer _generateReactiveConstants = new ConstantsBuffer(); + private readonly ConstantsBuffer _tcrAutogenerateConstants = new ConstantsBuffer(); private bool _firstExecution; private int _resourceFrameIndex; @@ -85,17 +71,17 @@ namespace FidelityFX.FSR3 _contextDescription = contextDescription; _commandBuffer = new CommandBuffer { name = "FSR3 Upscaler" }; - _upscalerConstantsBuffer = CreateConstantBuffer(); - _spdConstantsBuffer = CreateConstantBuffer(); - _rcasConstantsBuffer = CreateConstantBuffer(); - _generateReactiveConstantsBuffer = CreateConstantBuffer(); - _tcrAutogenerateConstantsBuffer = CreateConstantBuffer(); + _upscalerConstants.Create(); + _spdConstants.Create(); + _rcasConstants.Create(); + _generateReactiveConstants.Create(); + _tcrAutogenerateConstants.Create(); // Set defaults _firstExecution = true; _resourceFrameIndex = 0; - UpscalerConsts.maxUpscaleSize = _contextDescription.MaxUpscaleSize; + _upscalerConstants.Value.maxUpscaleSize = _contextDescription.MaxUpscaleSize; _resources.Create(_contextDescription); CreatePasses(); @@ -103,18 +89,18 @@ namespace FidelityFX.FSR3 private void CreatePasses() { - _prepareInputsPass = new Fsr3UpscalerPrepareInputsPass(_contextDescription, _resources, _upscalerConstantsBuffer); - _lumaPyramidPass = new Fsr3UpscalerLumaPyramidPass(_contextDescription, _resources, _upscalerConstantsBuffer, _spdConstantsBuffer); - _shadingChangePyramidPass = new Fsr3UpscalerShadingChangePyramidPass(_contextDescription, _resources, _upscalerConstantsBuffer, _spdConstantsBuffer); - _shadingChangePass = new Fsr3UpscalerShadingChangePass(_contextDescription, _resources, _upscalerConstantsBuffer); - _prepareReactivityPass = new Fsr3UpscalerPrepareReactivityPass(_contextDescription, _resources, _upscalerConstantsBuffer); - _lumaInstabilityPass = new Fsr3UpscalerLumaInstabilityPass(_contextDescription, _resources, _upscalerConstantsBuffer); - _accumulatePass = new Fsr3UpscalerAccumulatePass(_contextDescription, _resources, _upscalerConstantsBuffer); - _sharpenPass = new Fsr3UpscalerSharpenPass(_contextDescription, _resources, _upscalerConstantsBuffer, _rcasConstantsBuffer); - _generateReactivePass = new Fsr3UpscalerGenerateReactivePass(_contextDescription, _resources, _generateReactiveConstantsBuffer); - _tcrAutogeneratePass = new Fsr3UpscalerTcrAutogeneratePass(_contextDescription, _resources, _upscalerConstantsBuffer, _tcrAutogenerateConstantsBuffer); + _prepareInputsPass = new Fsr3UpscalerPrepareInputsPass(_contextDescription, _resources, _upscalerConstants); + _lumaPyramidPass = new Fsr3UpscalerLumaPyramidPass(_contextDescription, _resources, _upscalerConstants, _spdConstants); + _shadingChangePyramidPass = new Fsr3UpscalerShadingChangePyramidPass(_contextDescription, _resources, _upscalerConstants, _spdConstants); + _shadingChangePass = new Fsr3UpscalerShadingChangePass(_contextDescription, _resources, _upscalerConstants); + _prepareReactivityPass = new Fsr3UpscalerPrepareReactivityPass(_contextDescription, _resources, _upscalerConstants); + _lumaInstabilityPass = new Fsr3UpscalerLumaInstabilityPass(_contextDescription, _resources, _upscalerConstants); + _accumulatePass = new Fsr3UpscalerAccumulatePass(_contextDescription, _resources, _upscalerConstants); + _sharpenPass = new Fsr3UpscalerSharpenPass(_contextDescription, _resources, _upscalerConstants, _rcasConstants); + _generateReactivePass = new Fsr3UpscalerGenerateReactivePass(_contextDescription, _resources, _upscalerConstants); + _tcrAutogeneratePass = new Fsr3UpscalerTcrAutogeneratePass(_contextDescription, _resources, _upscalerConstants, _tcrAutogenerateConstants); #if UNITY_EDITOR || DEVELOPMENT_BUILD - _debugViewPass = new Fsr3UpscalerDebugViewPass(_contextDescription, _resources, _upscalerConstantsBuffer); + _debugViewPass = new Fsr3UpscalerDebugViewPass(_contextDescription, _resources, _upscalerConstants); #endif } @@ -136,11 +122,11 @@ namespace FidelityFX.FSR3 _resources.Destroy(); - DestroyConstantBuffer(ref _tcrAutogenerateConstantsBuffer); - DestroyConstantBuffer(ref _generateReactiveConstantsBuffer); - DestroyConstantBuffer(ref _rcasConstantsBuffer); - DestroyConstantBuffer(ref _spdConstantsBuffer); - DestroyConstantBuffer(ref _upscalerConstantsBuffer); + _tcrAutogenerateConstants.Destroy(); + _generateReactiveConstants.Destroy(); + _rcasConstants.Destroy(); + _spdConstants.Destroy(); + _upscalerConstants.Destroy(); if (_commandBuffer != null) { @@ -214,12 +200,14 @@ namespace FidelityFX.FSR3 // Reactive mask bias const int threadGroupWorkRegionDim = 8; - int dispatchSrcX = (UpscalerConsts.renderSize.x + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; - int dispatchSrcY = (UpscalerConsts.renderSize.y + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; - int dispatchDstX = (UpscalerConsts.upscaleSize.x + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; - int dispatchDstY = (UpscalerConsts.upscaleSize.y + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; - int dispatchShadingChangePassX = ((UpscalerConsts.renderSize.x / 2) + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; - int dispatchShadingChangePassY = ((UpscalerConsts.renderSize.y / 2) + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; + var renderSize = _upscalerConstants.Value.renderSize; + var upscaleSize = _upscalerConstants.Value.upscaleSize; + int dispatchSrcX = (renderSize.x + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; + int dispatchSrcY = (renderSize.y + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; + int dispatchDstX = (upscaleSize.x + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; + int dispatchDstY = (upscaleSize.y + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; + int dispatchShadingChangePassX = ((renderSize.x / 2) + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; + int dispatchShadingChangePassY = ((renderSize.y / 2) + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; // Clear reconstructed depth for max depth store if (resetAccumulation) @@ -248,8 +236,8 @@ namespace FidelityFX.FSR3 SetupSpdConstants(dispatchParams, out var dispatchThreadGroupCount); // Initialize constant buffers data - commandBuffer.SetBufferData(_upscalerConstantsBuffer, _upscalerConstantsArray); - commandBuffer.SetBufferData(_spdConstantsBuffer, _spdConstantsArray); + _upscalerConstants.UpdateBufferData(commandBuffer); + _spdConstants.UpdateBufferData(commandBuffer); // Auto reactive if (dispatchParams.EnableAutoReactive) @@ -272,12 +260,12 @@ namespace FidelityFX.FSR3 { // Compute the constants SetupRcasConstants(dispatchParams); - commandBuffer.SetBufferData(_rcasConstantsBuffer, _rcasConstantsArray); + _rcasConstants.UpdateBufferData(commandBuffer); // Dispatch RCAS const int threadGroupWorkRegionDimRcas = 16; - int threadGroupsX = (UpscalerConsts.upscaleSize.x + threadGroupWorkRegionDimRcas - 1) / threadGroupWorkRegionDimRcas; - int threadGroupsY = (UpscalerConsts.upscaleSize.y + threadGroupWorkRegionDimRcas - 1) / threadGroupWorkRegionDimRcas; + int threadGroupsX = (upscaleSize.x + threadGroupWorkRegionDimRcas - 1) / threadGroupWorkRegionDimRcas; + int threadGroupsY = (upscaleSize.y + threadGroupWorkRegionDimRcas - 1) / threadGroupWorkRegionDimRcas; _sharpenPass.ScheduleDispatch(commandBuffer, dispatchParams, frameIndex, threadGroupsX, threadGroupsY); } @@ -308,11 +296,12 @@ namespace FidelityFX.FSR3 int dispatchSrcX = (dispatchParams.RenderSize.x + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; int dispatchSrcY = (dispatchParams.RenderSize.y + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; - GenReactiveConsts.scale = dispatchParams.Scale; - GenReactiveConsts.threshold = dispatchParams.CutoffThreshold; - GenReactiveConsts.binaryValue = dispatchParams.BinaryValue; - GenReactiveConsts.flags = (uint)dispatchParams.Flags; - commandBuffer.SetBufferData(_generateReactiveConstantsBuffer, _generateReactiveConstantsArray); + ref var genReactiveConsts = ref _generateReactiveConstants.Value; + genReactiveConsts.scale = dispatchParams.Scale; + genReactiveConsts.threshold = dispatchParams.CutoffThreshold; + genReactiveConsts.binaryValue = dispatchParams.BinaryValue; + genReactiveConsts.flags = (uint)dispatchParams.Flags; + _generateReactiveConstants.UpdateBufferData(commandBuffer); ((Fsr3UpscalerGenerateReactivePass)_generateReactivePass).ScheduleDispatch(commandBuffer, dispatchParams, dispatchSrcX, dispatchSrcY); } @@ -323,18 +312,19 @@ namespace FidelityFX.FSR3 int dispatchSrcX = (dispatchParams.RenderSize.x + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; int dispatchSrcY = (dispatchParams.RenderSize.y + (threadGroupWorkRegionDim - 1)) / threadGroupWorkRegionDim; - TcrAutoGenConsts.autoTcThreshold = dispatchParams.AutoTcThreshold; - TcrAutoGenConsts.autoTcScale = dispatchParams.AutoTcScale; - TcrAutoGenConsts.autoReactiveScale = dispatchParams.AutoReactiveScale; - TcrAutoGenConsts.autoReactiveMax = dispatchParams.AutoReactiveMax; - commandBuffer.SetBufferData(_tcrAutogenerateConstantsBuffer, _tcrAutogenerateConstantsArray); + ref var tcrAutoGenConsts = ref _tcrAutogenerateConstants.Value; + tcrAutoGenConsts.autoTcThreshold = dispatchParams.AutoTcThreshold; + tcrAutoGenConsts.autoTcScale = dispatchParams.AutoTcScale; + tcrAutoGenConsts.autoReactiveScale = dispatchParams.AutoReactiveScale; + tcrAutoGenConsts.autoReactiveMax = dispatchParams.AutoReactiveMax; + _tcrAutogenerateConstants.UpdateBufferData(commandBuffer); _tcrAutogeneratePass.ScheduleDispatch(commandBuffer, dispatchParams, frameIndex, dispatchSrcX, dispatchSrcY); } private void SetupConstants(Fsr3Upscaler.DispatchDescription dispatchParams, bool resetAccumulation) { - ref Fsr3Upscaler.UpscalerConstants constants = ref UpscalerConsts; + ref Fsr3Upscaler.UpscalerConstants constants = ref _upscalerConstants.Value; constants.previousFrameJitterOffset = constants.jitterOffset; constants.jitterOffset = dispatchParams.JitterOffset; @@ -445,7 +435,7 @@ namespace FidelityFX.FSR3 private void SetupRcasConstants(Fsr3Upscaler.DispatchDescription dispatchParams) { int sharpnessIndex = Mathf.RoundToInt(Mathf.Clamp01(dispatchParams.Sharpness) * (RcasConfigs.Length - 1)); - RcasConsts = RcasConfigs[sharpnessIndex]; + _rcasConstants.Value = RcasConfigs[sharpnessIndex]; } private void SetupSpdConstants(Fsr3Upscaler.DispatchDescription dispatchParams, out Vector2Int dispatchThreadGroupCount) @@ -454,7 +444,7 @@ namespace FidelityFX.FSR3 SpdSetup(rectInfo, out dispatchThreadGroupCount, out var workGroupOffset, out var numWorkGroupsAndMips); // Downsample - ref Fsr3Upscaler.SpdConstants spdConstants = ref SpdConsts; + ref Fsr3Upscaler.SpdConstants spdConstants = ref _spdConstants.Value; spdConstants.numWorkGroups = (uint)numWorkGroupsAndMips.x; spdConstants.mips = (uint)numWorkGroupsAndMips.y; spdConstants.workGroupOffsetX = (uint)workGroupOffset.x;