You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

64 lines
3.7 KiB

using System;
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.Experimental.Rendering;
namespace FidelityFX.FrameGen
{
internal class FrameInterpolationResources: FfxResourcesBase
{
public RenderTexture ReconstructedDepthInterpolatedFrame;
public RenderTexture GameMotionVectorFieldX;
public RenderTexture GameMotionVectorFieldY;
public RenderTexture InpaintingPyramid;
public ComputeBuffer Counters;
public RenderTexture OpticalFlowMotionVectorFieldX;
public RenderTexture OpticalFlowMotionVectorFieldY;
public RenderTexture PreviousInterpolationSource;
public RenderTexture DisocclusionMask;
public readonly RenderTexture[] DilatedDepth = new RenderTexture[2];
public readonly RenderTexture[] DilatedMotionVectors = new RenderTexture[2];
public readonly RenderTexture[] ReconstructedDepth = new RenderTexture[2];
public void Create(in FrameInterpolation.ContextDescription contextDescription)
{
Vector2Int displaySize = contextDescription.displaySize;
Vector2Int displaySizeDiv2 = new Vector2Int(displaySize.x / 2, displaySize.y / 2);
Vector2Int maxRenderSize = contextDescription.maxRenderSize;
ReconstructedDepthInterpolatedFrame = CreateResource("FI_ReconstructedDepthInterpolatedFrame", maxRenderSize, GraphicsFormat.R32_UInt);
GameMotionVectorFieldX = CreateResource("FI_GameMotionVectorFieldX", maxRenderSize, GraphicsFormat.R32_UInt);
GameMotionVectorFieldY = CreateResource("FI_GameMotionVectorFieldY", maxRenderSize, GraphicsFormat.R32_UInt);
InpaintingPyramid = CreateResourceMips("FI_InpaintingPyramid", displaySizeDiv2, GraphicsFormat.R16G16B16A16_SFloat);
Counters = CreateBuffer<uint>("FI_Counters", 2); // structured buffer containing 2 UINT values
OpticalFlowMotionVectorFieldX = CreateResource("FI_OpticalFlowMotionVectorFieldX", maxRenderSize, GraphicsFormat.R32_UInt);
OpticalFlowMotionVectorFieldY = CreateResource("FI_OpticalFlowMotionVectorFieldY", maxRenderSize, GraphicsFormat.R32_UInt);
PreviousInterpolationSource = CreateResource("FI_PreviousInterpolationSource", displaySize, contextDescription.backBufferFormat);
DisocclusionMask = CreateResource("FI_DisocclusionMask", maxRenderSize, GraphicsFormat.R8G8_UNorm);
// Double buffering is used only when async support is enabled
int numBuffers = (contextDescription.flags & FrameInterpolation.InitializationFlags.EnableAsyncSupport) != 0 ? 2 : 1;
CreateDoubleBufferedResource(DilatedDepth, "FI_DilatedDepth_", maxRenderSize, GraphicsFormat.R32_SFloat, numBuffers);
CreateDoubleBufferedResource(DilatedMotionVectors, "FI_DilatedMVs_", maxRenderSize, GraphicsFormat.R16G16_SFloat, numBuffers);
CreateDoubleBufferedResource(ReconstructedDepth, "FI_ReconstructedDepth_", maxRenderSize, GraphicsFormat.R32_UInt, numBuffers);
}
public void Destroy()
{
DestroyResource(ReconstructedDepth);
DestroyResource(DilatedMotionVectors);
DestroyResource(DilatedDepth);
DestroyResource(ref DisocclusionMask);
DestroyResource(ref PreviousInterpolationSource);
DestroyResource(ref OpticalFlowMotionVectorFieldY);
DestroyResource(ref OpticalFlowMotionVectorFieldX);
DestroyResource(ref Counters);
DestroyResource(ref InpaintingPyramid);
DestroyResource(ref GameMotionVectorFieldY);
DestroyResource(ref GameMotionVectorFieldX);
DestroyResource(ref ReconstructedDepthInterpolatedFrame);
}
}
}