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("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); } } }