|
|
@ -27,16 +27,21 @@ namespace FidelityFX.FrameGen |
|
|
{ |
|
|
{ |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
public void ScheduleDispatch(CommandBuffer commandBuffer, OpticalFlow.DispatchDescription dispatchParams, int frameIndex, int dispatchX, int dispatchY, int dispatchZ = 1) |
|
|
|
|
|
|
|
|
public void ScheduleDispatch(CommandBuffer commandBuffer, FrameInterpolation.DispatchDescription dispatchParams, int frameIndex, int dispatchX, int dispatchY, int dispatchZ = 1) |
|
|
{ |
|
|
{ |
|
|
commandBuffer.BeginSample(_sampler); |
|
|
commandBuffer.BeginSample(_sampler); |
|
|
DoScheduleDispatch(commandBuffer, dispatchParams, frameIndex, dispatchX, dispatchY, dispatchZ); |
|
|
DoScheduleDispatch(commandBuffer, dispatchParams, frameIndex, dispatchX, dispatchY, dispatchZ); |
|
|
commandBuffer.EndSample(_sampler); |
|
|
commandBuffer.EndSample(_sampler); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
protected abstract void DoScheduleDispatch(CommandBuffer commandBuffer, OpticalFlow.DispatchDescription dispatchParams, int frameIndex, int dispatchX, int dispatchY, int dispatchZ); |
|
|
|
|
|
|
|
|
protected abstract void DoScheduleDispatch(CommandBuffer commandBuffer, FrameInterpolation.DispatchDescription dispatchParams, int frameIndex, int dispatchX, int dispatchY, int dispatchZ); |
|
|
|
|
|
|
|
|
protected void InitComputeShader(string passName, ComputeShader shader) |
|
|
protected void InitComputeShader(string passName, ComputeShader shader) |
|
|
|
|
|
{ |
|
|
|
|
|
InitComputeShader(passName, shader, ContextDescription.flags); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void InitComputeShader(string passName, ComputeShader shader, FrameInterpolation.InitializationFlags flags) |
|
|
{ |
|
|
{ |
|
|
if (shader == null) |
|
|
if (shader == null) |
|
|
{ |
|
|
{ |
|
|
@ -47,7 +52,163 @@ namespace FidelityFX.FrameGen |
|
|
KernelIndex = ComputeShader.FindKernel("CS"); |
|
|
KernelIndex = ComputeShader.FindKernel("CS"); |
|
|
_sampler = CustomSampler.Create(passName); |
|
|
_sampler = CustomSampler.Create(passName); |
|
|
|
|
|
|
|
|
// TODO: shader variants
|
|
|
|
|
|
|
|
|
if ((flags & FrameInterpolation.InitializationFlags.EnableDisplayResolutionMotionVectors) == 0) ComputeShader.EnableKeyword("FFX_FRAMEINTERPOLATION_OPTION_LOW_RES_MOTION_VECTORS"); |
|
|
|
|
|
if ((flags & FrameInterpolation.InitializationFlags.EnableJitterMotionVectors) != 0) ComputeShader.EnableKeyword("FFX_FRAMEINTERPOLATION_OPTION_JITTERED_MOTION_VECTORS"); |
|
|
|
|
|
if ((flags & FrameInterpolation.InitializationFlags.EnableDepthInverted) != 0) ComputeShader.EnableKeyword("FFX_FRAMEINTERPOLATION_OPTION_INVERTED_DEPTH"); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
internal class FrameInterpolationReconstructAndDilatePass : FrameInterpolationPass |
|
|
|
|
|
{ |
|
|
|
|
|
public FrameInterpolationReconstructAndDilatePass(FrameInterpolation.ContextDescription contextDescription, FrameInterpolationResources resources, ComputeBuffer constants) |
|
|
|
|
|
: base(contextDescription, resources, constants) |
|
|
|
|
|
{ |
|
|
|
|
|
InitComputeShader("Reconstruct and Dilate", contextDescription.shaders.reconstructAndDilate); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected override void DoScheduleDispatch(CommandBuffer commandBuffer, FrameInterpolation.DispatchDescription dispatchParams, int frameIndex, int dispatchX, int dispatchY, int dispatchZ) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new NotImplementedException(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
internal class FrameInterpolationSetupPass : FrameInterpolationPass |
|
|
|
|
|
{ |
|
|
|
|
|
public FrameInterpolationSetupPass(FrameInterpolation.ContextDescription contextDescription, FrameInterpolationResources resources, ComputeBuffer constants) |
|
|
|
|
|
: base(contextDescription, resources, constants) |
|
|
|
|
|
{ |
|
|
|
|
|
InitComputeShader("Setup", contextDescription.shaders.setup); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected override void DoScheduleDispatch(CommandBuffer commandBuffer, FrameInterpolation.DispatchDescription dispatchParams, int frameIndex, int dispatchX, int dispatchY, int dispatchZ) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new NotImplementedException(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
internal class FrameInterpolationReconstructPreviousDepthPass : FrameInterpolationPass |
|
|
|
|
|
{ |
|
|
|
|
|
public FrameInterpolationReconstructPreviousDepthPass(FrameInterpolation.ContextDescription contextDescription, FrameInterpolationResources resources, ComputeBuffer constants) |
|
|
|
|
|
: base(contextDescription, resources, constants) |
|
|
|
|
|
{ |
|
|
|
|
|
InitComputeShader("Reconstruct Previous Depth", contextDescription.shaders.reconstructPreviousDepth); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected override void DoScheduleDispatch(CommandBuffer commandBuffer, FrameInterpolation.DispatchDescription dispatchParams, int frameIndex, int dispatchX, int dispatchY, int dispatchZ) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new NotImplementedException(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
internal class FrameInterpolationGameMotionVectorFieldPass : FrameInterpolationPass |
|
|
|
|
|
{ |
|
|
|
|
|
public FrameInterpolationGameMotionVectorFieldPass(FrameInterpolation.ContextDescription contextDescription, FrameInterpolationResources resources, ComputeBuffer constants) |
|
|
|
|
|
: base(contextDescription, resources, constants) |
|
|
|
|
|
{ |
|
|
|
|
|
InitComputeShader("Game Motion Vector Field", contextDescription.shaders.gameMotionVectorField); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected override void DoScheduleDispatch(CommandBuffer commandBuffer, FrameInterpolation.DispatchDescription dispatchParams, int frameIndex, int dispatchX, int dispatchY, int dispatchZ) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new NotImplementedException(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
internal class FrameInterpolationOpticalFlowVectorFieldPass : FrameInterpolationPass |
|
|
|
|
|
{ |
|
|
|
|
|
public FrameInterpolationOpticalFlowVectorFieldPass(FrameInterpolation.ContextDescription contextDescription, FrameInterpolationResources resources, ComputeBuffer constants) |
|
|
|
|
|
: base(contextDescription, resources, constants) |
|
|
|
|
|
{ |
|
|
|
|
|
InitComputeShader("Optical Flow Vector Field", contextDescription.shaders.opticalFlowVectorField); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected override void DoScheduleDispatch(CommandBuffer commandBuffer, FrameInterpolation.DispatchDescription dispatchParams, int frameIndex, int dispatchX, int dispatchY, int dispatchZ) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new NotImplementedException(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
internal class FrameInterpolationDisocclusionMaskPass : FrameInterpolationPass |
|
|
|
|
|
{ |
|
|
|
|
|
public FrameInterpolationDisocclusionMaskPass(FrameInterpolation.ContextDescription contextDescription, FrameInterpolationResources resources, ComputeBuffer constants) |
|
|
|
|
|
: base(contextDescription, resources, constants) |
|
|
|
|
|
{ |
|
|
|
|
|
InitComputeShader("Disocclusion Mask", contextDescription.shaders.disocclusionMask); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected override void DoScheduleDispatch(CommandBuffer commandBuffer, FrameInterpolation.DispatchDescription dispatchParams, int frameIndex, int dispatchX, int dispatchY, int dispatchZ) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new NotImplementedException(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
internal class FrameInterpolationInterpolationPass : FrameInterpolationPass |
|
|
|
|
|
{ |
|
|
|
|
|
public FrameInterpolationInterpolationPass(FrameInterpolation.ContextDescription contextDescription, FrameInterpolationResources resources, ComputeBuffer constants) |
|
|
|
|
|
: base(contextDescription, resources, constants) |
|
|
|
|
|
{ |
|
|
|
|
|
InitComputeShader("Interpolation", contextDescription.shaders.interpolation); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected override void DoScheduleDispatch(CommandBuffer commandBuffer, FrameInterpolation.DispatchDescription dispatchParams, int frameIndex, int dispatchX, int dispatchY, int dispatchZ) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new NotImplementedException(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
internal class FrameInterpolationInpaintingPyramidPass : FrameInterpolationPass |
|
|
|
|
|
{ |
|
|
|
|
|
public FrameInterpolationInpaintingPyramidPass(FrameInterpolation.ContextDescription contextDescription, FrameInterpolationResources resources, ComputeBuffer constants) |
|
|
|
|
|
: base(contextDescription, resources, constants) |
|
|
|
|
|
{ |
|
|
|
|
|
InitComputeShader("Inpainting Pyramid", contextDescription.shaders.inpaintingPyramid); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected override void DoScheduleDispatch(CommandBuffer commandBuffer, FrameInterpolation.DispatchDescription dispatchParams, int frameIndex, int dispatchX, int dispatchY, int dispatchZ) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new NotImplementedException(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
internal class FrameInterpolationInpaintingPass : FrameInterpolationPass |
|
|
|
|
|
{ |
|
|
|
|
|
public FrameInterpolationInpaintingPass(FrameInterpolation.ContextDescription contextDescription, FrameInterpolationResources resources, ComputeBuffer constants) |
|
|
|
|
|
: base(contextDescription, resources, constants) |
|
|
|
|
|
{ |
|
|
|
|
|
InitComputeShader("Inpainting", contextDescription.shaders.inpainting); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected override void DoScheduleDispatch(CommandBuffer commandBuffer, FrameInterpolation.DispatchDescription dispatchParams, int frameIndex, int dispatchX, int dispatchY, int dispatchZ) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new NotImplementedException(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
internal class FrameInterpolationGameVectorFieldInpaintingPyramidPass : FrameInterpolationPass |
|
|
|
|
|
{ |
|
|
|
|
|
public FrameInterpolationGameVectorFieldInpaintingPyramidPass(FrameInterpolation.ContextDescription contextDescription, FrameInterpolationResources resources, ComputeBuffer constants) |
|
|
|
|
|
: base(contextDescription, resources, constants) |
|
|
|
|
|
{ |
|
|
|
|
|
InitComputeShader("Game Vector Field Inpainting Pyramid", contextDescription.shaders.gameVectorFieldInpaintingPyramid); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected override void DoScheduleDispatch(CommandBuffer commandBuffer, FrameInterpolation.DispatchDescription dispatchParams, int frameIndex, int dispatchX, int dispatchY, int dispatchZ) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new NotImplementedException(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
internal class FrameInterpolationDebugViewPass : FrameInterpolationPass |
|
|
|
|
|
{ |
|
|
|
|
|
public FrameInterpolationDebugViewPass(FrameInterpolation.ContextDescription contextDescription, FrameInterpolationResources resources, ComputeBuffer constants) |
|
|
|
|
|
: base(contextDescription, resources, constants) |
|
|
|
|
|
{ |
|
|
|
|
|
InitComputeShader("Debug View", contextDescription.shaders.debugView); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected override void DoScheduleDispatch(CommandBuffer commandBuffer, FrameInterpolation.DispatchDescription dispatchParams, int frameIndex, int dispatchX, int dispatchY, int dispatchZ) |
|
|
|
|
|
{ |
|
|
|
|
|
throw new NotImplementedException(); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |