@ -31,53 +31,27 @@ namespace FidelityFX.FSR3
/// This loosely matches the FfxPipelineState struct from the original FSR3 codebase, wrapped in an object-oriented blanket.
/// These classes are responsible for loading compute shaders, managing temporary resources, binding resources to shader kernels and dispatching said shaders.
/// </summary>
internal abstract class Fsr3UpscalerPass : IDisposable
internal abstract class Fsr3UpscalerPass : FfxPassBase < Fsr3Upscaler . DispatchDescription , Fsr3Upscaler . InitializationFlags >
{
protected readonly Fsr3Upscaler . ContextDescription ContextDescription ;
protected readonly Fsr3UpscalerResources Resources ;
protected readonly ComputeBuffer Constants ;
protected ComputeShader ComputeShader ;
protected int KernelIndex ;
protected CustomSampler Sampler ;
protected Fsr3UpscalerPass ( Fsr3Upscaler . ContextDescription contextDescription , Fsr3UpscalerResources resources , ComputeBuffer constants )
: base ( "FSR3 Upscaler" )
{
ContextDescription = contextDescription ;
Resources = resources ;
Constants = constants ;
}
public virtual void Dispose ( )
{
}
public void ScheduleDispatch ( CommandBuffer commandBuffer , Fsr3Upscaler . DispatchDescription dispatchParams , int frameIndex , int dispatchX , int dispatchY )
{
commandBuffer . BeginSample ( Sampler ) ;
DoScheduleDispatch ( commandBuffer , dispatchParams , frameIndex , dispatchX , dispatchY ) ;
commandBuffer . EndSample ( Sampler ) ;
}
protected abstract void DoScheduleDispatch ( CommandBuffer commandBuffer , Fsr3Upscaler . DispatchDescription dispatchParams , int frameIndex , int dispatchX , int dispatchY ) ;
protected void InitComputeShader ( string passName , ComputeShader shader )
{
InitComputeShader ( passName , shader , ContextDescription . Flags ) ;
}
private void InitComputeShader ( string passName , ComputeShader shader , Fsr3Upscaler . InitializationFlags flags )
{
if ( shader = = null )
protected override void SetupShaderKeywords ( Fsr3Upscaler . InitializationFlags flags )
{
throw new MissingReferenceException ( $"Shader for FSR3 Upscaler pass '{passName}' could not be loaded! Please ensure it is included in the project correctly." ) ;
}
ComputeShader = shader ;
KernelIndex = ComputeShader . FindKernel ( "CS" ) ;
Sampler = CustomSampler . Create ( passName ) ;
bool useLut = false ;
#if UNITY_2022_1_OR_NEWER // This will also work in 2020.3.43+ and 2021.3.14+
if ( SystemInfo . computeSubGroupSize = = 6 4 )
@ -104,7 +78,7 @@ namespace FidelityFX.FSR3
InitComputeShader ( "Prepare Inputs" , contextDescription . Shaders . prepareInputsPass ) ;
}
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , Fsr3Upscaler . DispatchDescription dispatchParams , int frameIndex , int dispatchX , int dispatchY )
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , in Fsr3Upscaler . DispatchDescription dispatchParams , int frameIndex , int dispatchX , int dispatchY , int dispatchZ )
{
ref var color = ref dispatchParams . Color ;
ref var depth = ref dispatchParams . Depth ;
@ -122,7 +96,7 @@ namespace FidelityFX.FSR3
commandBuffer . SetComputeConstantBufferParam ( ComputeShader , Fsr3ShaderIDs . CbFsr3Upscaler , Constants , 0 , Marshal . SizeOf < Fsr3Upscaler . UpscalerConstants > ( ) ) ;
commandBuffer . DispatchCompute ( ComputeShader , KernelIndex , dispatchX , dispatchY , 1 ) ;
commandBuffer . DispatchCompute ( ComputeShader , KernelIndex , dispatchX , dispatchY , dispatchZ ) ;
}
}
@ -138,7 +112,7 @@ namespace FidelityFX.FSR3
InitComputeShader ( "Compute Luminance Pyramid" , contextDescription . Shaders . lumaPyramidPass ) ;
}
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , Fsr3Upscaler . DispatchDescription dispatchParams , int frameIndex , int dispatchX , int dispatchY )
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , in Fsr3Upscaler . DispatchDescription dispatchParams , int frameIndex , int dispatchX , int dispatchY , int dispatchZ )
{
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , Fsr3ShaderIDs . SrvCurrentLuma , Resources . Luma [ frameIndex ] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , Fsr3ShaderIDs . SrvFarthestDepth , Fsr3ShaderIDs . UavIntermediate ) ;
@ -155,7 +129,7 @@ namespace FidelityFX.FSR3
commandBuffer . SetComputeConstantBufferParam ( ComputeShader , Fsr3ShaderIDs . CbFsr3Upscaler , Constants , 0 , Marshal . SizeOf < Fsr3Upscaler . UpscalerConstants > ( ) ) ;
commandBuffer . SetComputeConstantBufferParam ( ComputeShader , Fsr3ShaderIDs . CbSpd , _spdConstants , 0 , Marshal . SizeOf < Fsr3Upscaler . SpdConstants > ( ) ) ;
commandBuffer . DispatchCompute ( ComputeShader , KernelIndex , dispatchX , dispatchY , 1 ) ;
commandBuffer . DispatchCompute ( ComputeShader , KernelIndex , dispatchX , dispatchY , dispatchZ ) ;
}
}
@ -171,7 +145,7 @@ namespace FidelityFX.FSR3
InitComputeShader ( "Compute Shading Change Pyramid" , contextDescription . Shaders . shadingChangePyramidPass ) ;
}
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , Fsr3Upscaler . DispatchDescription dispatchParams , int frameIndex , int dispatchX , int dispatchY )
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , in Fsr3Upscaler . DispatchDescription dispatchParams , int frameIndex , int dispatchX , int dispatchY , int dispatchZ )
{
ref var exposure = ref dispatchParams . Exposure ;
@ -191,7 +165,7 @@ namespace FidelityFX.FSR3
commandBuffer . SetComputeConstantBufferParam ( ComputeShader , Fsr3ShaderIDs . CbFsr3Upscaler , Constants , 0 , Marshal . SizeOf < Fsr3Upscaler . UpscalerConstants > ( ) ) ;
commandBuffer . SetComputeConstantBufferParam ( ComputeShader , Fsr3ShaderIDs . CbSpd , _spdConstants , 0 , Marshal . SizeOf < Fsr3Upscaler . SpdConstants > ( ) ) ;
commandBuffer . DispatchCompute ( ComputeShader , KernelIndex , dispatchX , dispatchY , 1 ) ;
commandBuffer . DispatchCompute ( ComputeShader , KernelIndex , dispatchX , dispatchY , dispatchZ ) ;
}
}
@ -203,13 +177,13 @@ namespace FidelityFX.FSR3
InitComputeShader ( "Compute Shading Change" , contextDescription . Shaders . shadingChangePass ) ;
}
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , Fsr3Upscaler . DispatchDescription dispatchParams , int frameIndex , int dispatchX , int dispatchY )
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , in Fsr3Upscaler . DispatchDescription dispatchParams , int frameIndex , int dispatchX , int dispatchY , int dispatchZ )
{
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , Fsr3ShaderIDs . SrvSpdMips , Resources . SpdMips ) ;
commandBuffer . SetComputeConstantBufferParam ( ComputeShader , Fsr3ShaderIDs . CbFsr3Upscaler , Constants , 0 , Marshal . SizeOf < Fsr3Upscaler . UpscalerConstants > ( ) ) ;
commandBuffer . DispatchCompute ( ComputeShader , KernelIndex , dispatchX , dispatchY , 1 ) ;
commandBuffer . DispatchCompute ( ComputeShader , KernelIndex , dispatchX , dispatchY , dispatchZ ) ;
}
}
@ -221,7 +195,7 @@ namespace FidelityFX.FSR3
InitComputeShader ( "Prepare Reactivity" , contextDescription . Shaders . prepareReactivityPass ) ;
}
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , Fsr3Upscaler . DispatchDescription dispatchParams , int frameIndex , int dispatchX , int dispatchY )
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , in Fsr3Upscaler . DispatchDescription dispatchParams , int frameIndex , int dispatchX , int dispatchY , int dispatchZ )
{
ref var exposure = ref dispatchParams . Exposure ;
ref var reactive = ref dispatchParams . Reactive ;
@ -241,7 +215,7 @@ namespace FidelityFX.FSR3
commandBuffer . SetComputeConstantBufferParam ( ComputeShader , Fsr3ShaderIDs . CbFsr3Upscaler , Constants , 0 , Marshal . SizeOf < Fsr3Upscaler . UpscalerConstants > ( ) ) ;
commandBuffer . DispatchCompute ( ComputeShader , KernelIndex , dispatchX , dispatchY , 1 ) ;
commandBuffer . DispatchCompute ( ComputeShader , KernelIndex , dispatchX , dispatchY , dispatchZ ) ;
}
}
@ -253,7 +227,7 @@ namespace FidelityFX.FSR3
InitComputeShader ( "Compute Luminance Instability" , contextDescription . Shaders . lumaInstabilityPass ) ;
}
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , Fsr3Upscaler . DispatchDescription dispatchParams , int frameIndex , int dispatchX , int dispatchY )
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , in Fsr3Upscaler . DispatchDescription dispatchParams , int frameIndex , int dispatchX , int dispatchY , int dispatchZ )
{
ref var exposure = ref dispatchParams . Exposure ;
@ -270,7 +244,7 @@ namespace FidelityFX.FSR3
commandBuffer . SetComputeConstantBufferParam ( ComputeShader , Fsr3ShaderIDs . CbFsr3Upscaler , Constants , 0 , Marshal . SizeOf < Fsr3Upscaler . UpscalerConstants > ( ) ) ;
commandBuffer . DispatchCompute ( ComputeShader , KernelIndex , dispatchX , dispatchY , 1 ) ;
commandBuffer . DispatchCompute ( ComputeShader , KernelIndex , dispatchX , dispatchY , dispatchZ ) ;
}
}
@ -291,7 +265,7 @@ namespace FidelityFX.FSR3
#endif
}
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , Fsr3Upscaler . DispatchDescription dispatchParams , int frameIndex , int dispatchX , int dispatchY )
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , in Fsr3Upscaler . DispatchDescription dispatchParams , int frameIndex , int dispatchX , int dispatchY , int dispatchZ )
{
#if UNITY_2021_2_OR_NEWER
if ( dispatchParams . EnableSharpening )
@ -334,7 +308,7 @@ namespace FidelityFX.FSR3
commandBuffer . SetComputeConstantBufferParam ( ComputeShader , Fsr3ShaderIDs . CbFsr3Upscaler , Constants , 0 , Marshal . SizeOf < Fsr3Upscaler . UpscalerConstants > ( ) ) ;
commandBuffer . DispatchCompute ( ComputeShader , KernelIndex , dispatchX , dispatchY , 1 ) ;
commandBuffer . DispatchCompute ( ComputeShader , KernelIndex , dispatchX , dispatchY , dispatchZ ) ;
}
}
@ -350,7 +324,7 @@ namespace FidelityFX.FSR3
InitComputeShader ( "RCAS Sharpening" , contextDescription . Shaders . sharpenPass ) ;
}
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , Fsr3Upscaler . DispatchDescription dispatchParams , int frameIndex , int dispatchX , int dispatchY )
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , in Fsr3Upscaler . DispatchDescription dispatchParams , int frameIndex , int dispatchX , int dispatchY , int dispatchZ )
{
ref var exposure = ref dispatchParams . Exposure ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , Fsr3ShaderIDs . SrvInputExposure , exposure . RenderTarget , exposure . MipLevel , exposure . SubElement ) ;
@ -362,7 +336,7 @@ namespace FidelityFX.FSR3
commandBuffer . SetComputeConstantBufferParam ( ComputeShader , Fsr3ShaderIDs . CbFsr3Upscaler , Constants , 0 , Marshal . SizeOf < Fsr3Upscaler . UpscalerConstants > ( ) ) ;
commandBuffer . SetComputeConstantBufferParam ( ComputeShader , Fsr3ShaderIDs . CbRcas , _rcasConstants , 0 , Marshal . SizeOf < Fsr3Upscaler . RcasConstants > ( ) ) ;
commandBuffer . DispatchCompute ( ComputeShader , KernelIndex , dispatchX , dispatchY , 1 ) ;
commandBuffer . DispatchCompute ( ComputeShader , KernelIndex , dispatchX , dispatchY , dispatchZ ) ;
}
}
@ -378,7 +352,7 @@ namespace FidelityFX.FSR3
InitComputeShader ( "Auto-Generate Reactive Mask" , contextDescription . Shaders . autoGenReactivePass ) ;
}
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , Fsr3Upscaler . DispatchDescription dispatchParams , int frameIndex , int dispatchX , int dispatchY )
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , in Fsr3Upscaler . DispatchDescription dispatchParams , int frameIndex , int dispatchX , int dispatchY , int dispatchZ )
{
}
@ -414,7 +388,7 @@ namespace FidelityFX.FSR3
InitComputeShader ( "Auto-Generate Transparency & Composition Mask" , contextDescription . Shaders . tcrAutoGenPass ) ;
}
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , Fsr3Upscaler . DispatchDescription dispatchParams , int frameIndex , int dispatchX , int dispatchY )
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , in Fsr3Upscaler . DispatchDescription dispatchParams , int frameIndex , int dispatchX , int dispatchY , int dispatchZ )
{
ref var color = ref dispatchParams . Color ;
ref var motionVectors = ref dispatchParams . MotionVectors ;
@ -438,7 +412,7 @@ namespace FidelityFX.FSR3
commandBuffer . SetComputeConstantBufferParam ( ComputeShader , Fsr3ShaderIDs . CbFsr3Upscaler , Constants , 0 , Marshal . SizeOf < Fsr3Upscaler . UpscalerConstants > ( ) ) ;
commandBuffer . SetComputeConstantBufferParam ( ComputeShader , Fsr3ShaderIDs . CbGenReactive , _tcrAutogenerateConstants , 0 , Marshal . SizeOf < Fsr3Upscaler . GenerateReactiveConstants2 > ( ) ) ;
commandBuffer . DispatchCompute ( ComputeShader , KernelIndex , dispatchX , dispatchY , 1 ) ;
commandBuffer . DispatchCompute ( ComputeShader , KernelIndex , dispatchX , dispatchY , dispatchZ ) ;
}
}
@ -451,7 +425,7 @@ namespace FidelityFX.FSR3
InitComputeShader ( "Debug View" , contextDescription . Shaders . debugViewPass ) ;
}
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , Fsr3Upscaler . DispatchDescription dispatchParams , int frameIndex , int dispatchX , int dispatchY )
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , in Fsr3Upscaler . DispatchDescription dispatchParams , int frameIndex , int dispatchX , int dispatchY , int dispatchZ )
{
ref var exposure = ref dispatchParams . Exposure ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , Fsr3ShaderIDs . SrvDilatedReactiveMasks , Fsr3ShaderIDs . UavDilatedReactiveMasks ) ;
@ -465,7 +439,7 @@ namespace FidelityFX.FSR3
commandBuffer . SetComputeConstantBufferParam ( ComputeShader , Fsr3ShaderIDs . CbFsr3Upscaler , Constants , 0 , Marshal . SizeOf < Fsr3Upscaler . UpscalerConstants > ( ) ) ;
commandBuffer . DispatchCompute ( ComputeShader , KernelIndex , dispatchX , dispatchY , 1 ) ;
commandBuffer . DispatchCompute ( ComputeShader , KernelIndex , dispatchX , dispatchY , dispatchZ ) ;
}
}
#endif