@ -6,49 +6,34 @@ using UnityEngine.Rendering;
namespace FidelityFX.FrameGen
{
internal abstract class OpticalFlowPass : IDisposable
internal abstract class OpticalFlowPass : FfxPassBase < OpticalFlow . DispatchDescription >
{
protected readonly OpticalFlowResources Resources ;
protected readonly ComputeBuffer Constants ;
protected ComputeShader ComputeShader ;
protected int KernelIndex ;
private CustomSampler _sampler ;
protected OpticalFlowPass ( OpticalFlowResources resources , ComputeBuffer constants )
: base ( "Optical Flow" )
{
Resources = resources ;
Constants = constants ;
}
public virtual void Dispose ( )
{
}
public void ScheduleDispatch ( CommandBuffer commandBuffer , OpticalFlow . DispatchDescription dispatchParams , int frame Index , int level , int dispatchX , int dispatchY , int dispatchZ = 1 )
public void ScheduleDispatch ( CommandBuffer commandBuffer , in OpticalFlow . DispatchDescription dispatchParams , int bufferIndex , int level , int dispatchX , int dispatchY , int dispatchZ = 1 )
{
commandBuffer . BeginSample ( _s ampler) ;
DoScheduleDispatch ( commandBuffer , dispatchParams , frame Index , level , dispatchX , dispatchY , dispatchZ ) ;
commandBuffer . EndSample ( _s ampler) ;
commandBuffer . BeginSample ( Sampler ) ;
DoScheduleDispatch ( commandBuffer , dispatchParams , bu ffe rIndex, level , dispatchX , dispatchY , dispatchZ ) ;
commandBuffer . EndSample ( S ampler) ;
}
protected abstract void DoScheduleDispatch ( CommandBuffer commandBuffer , in OpticalFlow . DispatchDescription dispatchParams , int bufferIndex , int level , int dispatchX , int dispatchY , int dispatchZ ) ;
protected abstract void DoScheduleDispatch ( CommandBuffer commandBuffer , OpticalFlow . DispatchDescription dispatchParams , int frameIndex , int level , int dispatchX , int dispatchY , int dispatchZ ) ;
protected void InitComputeShader ( string passName , ComputeShader shader )
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , in OpticalFlow . DispatchDescription dispatchParams , int bufferIndex , int dispatchX , int dispatchY , int dispatchZ )
{
if ( shader = = null )
{
throw new MissingReferenceException ( $"Shader for Optical Flow 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 ) ;
// Optical Flow dispatch requires an extra `level` parameter, so we don't use this overload
}
}
internal class OpticalFlowPrepareLumaPass : OpticalFlowPass
internal sealed class OpticalFlowPrepareLumaPass : OpticalFlowPass
{
public OpticalFlowPrepareLumaPass ( in OpticalFlow . ContextDescription contextDescription , OpticalFlowResources resources , ComputeBuffer constants )
: base ( resources , constants )
@ -56,11 +41,11 @@ namespace FidelityFX.FrameGen
InitComputeShader ( "Prepare Luma" , contextDescription . shaders . prepareLuma ) ;
}
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , OpticalFlow . DispatchDescription dispatchParams , int frame Index , int level , int dispatchX , int dispatchY , int dispatchZ )
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , in OpticalFlow . DispatchDescription dispatchParams , int bu ffe rIndex, int level , int dispatchX , int dispatchY , int dispatchZ )
{
commandBuffer . SetComputeResourceParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . SrvInputColor , dispatchParams . Color ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . UavOpticalFlowInput , Resources . OpticalFlowInputLevels [ 0 ] [ frame Index ] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . UavOpticalFlowInput , Resources . OpticalFlowInputLevels [ 0 ] [ bu ffe rIndex] ) ;
commandBuffer . SetComputeConstantBufferParam < OpticalFlow . OpticalFlowConstants > ( ComputeShader , OpticalFlowShaderIDs . CbOpticalFlow , Constants ) ;
@ -68,7 +53,7 @@ namespace FidelityFX.FrameGen
}
}
internal class OpticalFlowGenerateInputPyramidPass : OpticalFlowPass
internal sealed class OpticalFlowGenerateInputPyramidPass : OpticalFlowPass
{
private ComputeBuffer _spdConstants ;
@ -79,15 +64,15 @@ namespace FidelityFX.FrameGen
InitComputeShader ( "Generate Optical Flow Input Pyramid" , contextDescription . shaders . generateOpticalFlowInputPyramid ) ;
}
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , OpticalFlow . DispatchDescription dispatchParams , int frame Index , int level , int dispatchX , int dispatchY , int dispatchZ )
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , in OpticalFlow . DispatchDescription dispatchParams , int bu ffe rIndex, int level , int dispatchX , int dispatchY , int dispatchZ )
{
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . UavOpticalFlowInput , Resources . OpticalFlowInputLevels [ 0 ] [ frame Index ] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . UavOpticalFlowInputLevel1 , Resources . OpticalFlowInputLevels [ 1 ] [ frame Index ] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . UavOpticalFlowInputLevel2 , Resources . OpticalFlowInputLevels [ 2 ] [ frame Index ] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . UavOpticalFlowInputLevel3 , Resources . OpticalFlowInputLevels [ 3 ] [ frame Index ] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . UavOpticalFlowInputLevel4 , Resources . OpticalFlowInputLevels [ 4 ] [ frame Index ] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . UavOpticalFlowInputLevel5 , Resources . OpticalFlowInputLevels [ 5 ] [ frame Index ] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . UavOpticalFlowInputLevel6 , Resources . OpticalFlowInputLevels [ 6 ] [ frame Index ] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . UavOpticalFlowInput , Resources . OpticalFlowInputLevels [ 0 ] [ bu ffe rIndex] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . UavOpticalFlowInputLevel1 , Resources . OpticalFlowInputLevels [ 1 ] [ bu ffe rIndex] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . UavOpticalFlowInputLevel2 , Resources . OpticalFlowInputLevels [ 2 ] [ bu ffe rIndex] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . UavOpticalFlowInputLevel3 , Resources . OpticalFlowInputLevels [ 3 ] [ bu ffe rIndex] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . UavOpticalFlowInputLevel4 , Resources . OpticalFlowInputLevels [ 4 ] [ bu ffe rIndex] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . UavOpticalFlowInputLevel5 , Resources . OpticalFlowInputLevels [ 5 ] [ bu ffe rIndex] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . UavOpticalFlowInputLevel6 , Resources . OpticalFlowInputLevels [ 6 ] [ bu ffe rIndex] ) ;
commandBuffer . SetComputeConstantBufferParam < OpticalFlow . OpticalFlowConstants > ( ComputeShader , OpticalFlowShaderIDs . CbOpticalFlow , Constants ) ;
commandBuffer . SetComputeConstantBufferParam < OpticalFlow . SpdConstants > ( ComputeShader , OpticalFlowShaderIDs . CbSpd , _spdConstants ) ;
@ -96,7 +81,7 @@ namespace FidelityFX.FrameGen
}
}
internal class OpticalFlowGenerateSCDHistogramPass : OpticalFlowPass
internal sealed class OpticalFlowGenerateSCDHistogramPass : OpticalFlowPass
{
public OpticalFlowGenerateSCDHistogramPass ( in OpticalFlow . ContextDescription contextDescription , OpticalFlowResources resources , ComputeBuffer constants )
: base ( resources , constants )
@ -104,9 +89,9 @@ namespace FidelityFX.FrameGen
InitComputeShader ( "Generate SCD Histogram" , contextDescription . shaders . generateScdHistogram ) ;
}
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , OpticalFlow . DispatchDescription dispatchParams , int frame Index , int level , int dispatchX , int dispatchY , int dispatchZ )
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , in OpticalFlow . DispatchDescription dispatchParams , int bu ffe rIndex, int level , int dispatchX , int dispatchY , int dispatchZ )
{
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . SrvOpticalFlowInput , Resources . OpticalFlowInputLevels [ 0 ] [ frame Index ] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . SrvOpticalFlowInput , Resources . OpticalFlowInputLevels [ 0 ] [ bu ffe rIndex] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . UavOpticalFlowScdHistogram , Resources . OpticalFlowSCDHistogram ) ;
commandBuffer . SetComputeConstantBufferParam < OpticalFlow . OpticalFlowConstants > ( ComputeShader , OpticalFlowShaderIDs . CbOpticalFlow , Constants ) ;
@ -115,7 +100,7 @@ namespace FidelityFX.FrameGen
}
}
internal class OpticalFlowComputeSCDDivergencePass : OpticalFlowPass
internal sealed class OpticalFlowComputeSCDDivergencePass : OpticalFlowPass
{
public OpticalFlowComputeSCDDivergencePass ( in OpticalFlow . ContextDescription contextDescription , OpticalFlowResources resources , ComputeBuffer constants )
: base ( resources , constants )
@ -123,7 +108,7 @@ namespace FidelityFX.FrameGen
InitComputeShader ( "Compute SCD Divergence" , contextDescription . shaders . computeScdDivergence ) ;
}
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , OpticalFlow . DispatchDescription dispatchParams , int frame Index , int level , int dispatchX , int dispatchY , int dispatchZ )
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , in OpticalFlow . DispatchDescription dispatchParams , int bu ffe rIndex, int level , int dispatchX , int dispatchY , int dispatchZ )
{
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . UavOpticalFlowScdHistogram , Resources . OpticalFlowSCDHistogram ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . UavOpticalFlowScdPreviousHistogram , Resources . OpticalFlowSCDPreviousHistogram ) ;
@ -136,7 +121,7 @@ namespace FidelityFX.FrameGen
}
}
internal class OpticalFlowComputePass : OpticalFlowPass
internal sealed class OpticalFlowComputePass : OpticalFlowPass
{
public OpticalFlowComputePass ( in OpticalFlow . ContextDescription contextDescription , OpticalFlowResources resources , ComputeBuffer constants )
: base ( resources , constants )
@ -144,12 +129,12 @@ namespace FidelityFX.FrameGen
InitComputeShader ( "Optical Flow Search" , contextDescription . shaders . computeOpticalFlow ) ;
}
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , OpticalFlow . DispatchDescription dispatchParams , int frame Index , int level , int dispatchX , int dispatchY , int dispatchZ )
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , in OpticalFlow . DispatchDescription dispatchParams , int bu ffe rIndex, int level , int dispatchX , int dispatchY , int dispatchZ )
{
int levelIndex = frame Index ^ ( level & 1 ) ;
int levelIndex = bu ffe rIndex ^ ( level & 1 ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . SrvOpticalFlowInput , Resources . OpticalFlowInputLevels [ level ] [ frame Index ] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . SrvOpticalFlowPreviousInput , Resources . OpticalFlowInputLevels [ level ] [ frame Index ^ 1 ] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . SrvOpticalFlowInput , Resources . OpticalFlowInputLevels [ level ] [ bu ffe rIndex] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . SrvOpticalFlowPreviousInput , Resources . OpticalFlowInputLevels [ level ] [ bu ffe rIndex ^ 1 ] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . UavOpticalFlow , Resources . OpticalFlowLevels [ level ] [ levelIndex ] ) ;
commandBuffer . SetComputeResourceParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . UavOpticalFlowScdOutput , dispatchParams . OpticalFlowSCD ) ;
@ -159,7 +144,7 @@ namespace FidelityFX.FrameGen
}
}
internal class OpticalFlowFilterPass : OpticalFlowPass
internal sealed class OpticalFlowFilterPass : OpticalFlowPass
{
public OpticalFlowFilterPass ( in OpticalFlow . ContextDescription contextDescription , OpticalFlowResources resources , ComputeBuffer constants )
: base ( resources , constants )
@ -167,9 +152,9 @@ namespace FidelityFX.FrameGen
InitComputeShader ( "Optical Flow Filter" , contextDescription . shaders . filterOpticalFlow ) ;
}
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , OpticalFlow . DispatchDescription dispatchParams , int frame Index , int level , int dispatchX , int dispatchY , int dispatchZ )
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , in OpticalFlow . DispatchDescription dispatchParams , int bu ffe rIndex, int level , int dispatchX , int dispatchY , int dispatchZ )
{
int levelIndex = frame Index ^ ( level & 1 ) ;
int levelIndex = bu ffe rIndex ^ ( level & 1 ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . SrvOpticalFlowPrevious , Resources . OpticalFlowLevels [ level ] [ levelIndex ] ) ;
@ -189,7 +174,7 @@ namespace FidelityFX.FrameGen
}
}
internal class OpticalFlowScalePass : OpticalFlowPass
internal sealed class OpticalFlowScalePass : OpticalFlowPass
{
public OpticalFlowScalePass ( in OpticalFlow . ContextDescription contextDescription , OpticalFlowResources resources , ComputeBuffer constants )
: base ( resources , constants )
@ -197,15 +182,15 @@ namespace FidelityFX.FrameGen
InitComputeShader ( "Optical Flow Scale" , contextDescription . shaders . scaleOpticalFlow ) ;
}
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , OpticalFlow . DispatchDescription dispatchParams , int frame Index , int level , int dispatchX , int dispatchY , int dispatchZ )
protected override void DoScheduleDispatch ( CommandBuffer commandBuffer , in OpticalFlow . DispatchDescription dispatchParams , int bu ffe rIndex, int level , int dispatchX , int dispatchY , int dispatchZ )
{
if ( level < = 0 )
return ;
int levelIndex = frame Index ^ ( level & 1 ) ;
int levelIndex = bu ffe rIndex ^ ( level & 1 ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . SrvOpticalFlowInput , Resources . OpticalFlowInputLevels [ level ] [ frame Index ] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . SrvOpticalFlowPreviousInput , Resources . OpticalFlowInputLevels [ level ] [ frame Index ^ 1 ] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . SrvOpticalFlowInput , Resources . OpticalFlowInputLevels [ level ] [ bu ffe rIndex] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . SrvOpticalFlowPreviousInput , Resources . OpticalFlowInputLevels [ level ] [ bu ffe rIndex ^ 1 ] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . SrvOpticalFlow , Resources . OpticalFlowLevels [ level ] [ levelIndex ^ 1 ] ) ;
commandBuffer . SetComputeTextureParam ( ComputeShader , KernelIndex , OpticalFlowShaderIDs . UavOpticalFlowNextLevel , Resources . OpticalFlowLevels [ level - 1 ] [ levelIndex ^ 1 ] ) ;