From 6c024407cbc64a3684d18cfec2d76b67a9eea9ec Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Tue, 9 Jul 2024 20:12:36 +0200 Subject: [PATCH] Defined all of the resources needed for FSR 3.1, left the old stuff intact for now so it still compiles. --- Assets/Scripts/Core/Fsr3ShaderIDs.cs | 53 ++++-- Assets/Scripts/Core/Fsr3UpscalerResources.cs | 177 ++++++++++++------- 2 files changed, 151 insertions(+), 79 deletions(-) diff --git a/Assets/Scripts/Core/Fsr3ShaderIDs.cs b/Assets/Scripts/Core/Fsr3ShaderIDs.cs index 3a28843..7a03832 100644 --- a/Assets/Scripts/Core/Fsr3ShaderIDs.cs +++ b/Assets/Scripts/Core/Fsr3ShaderIDs.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Nico de Poel +// Copyright (c) 2024 Nico de Poel // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -30,23 +30,33 @@ namespace FidelityFX internal static readonly int SrvInputMotionVectors = Shader.PropertyToID("r_input_motion_vectors"); internal static readonly int SrvInputDepth = Shader.PropertyToID("r_input_depth"); internal static readonly int SrvInputExposure = Shader.PropertyToID("r_input_exposure"); - internal static readonly int SrvAutoExposure = Shader.PropertyToID("r_auto_exposure"); + internal static readonly int SrvFrameInfo = Shader.PropertyToID("r_frame_info"); + internal static readonly int SrvAutoExposure = Shader.PropertyToID("r_auto_exposure"); // obsolete internal static readonly int SrvReactiveMask = Shader.PropertyToID("r_reactive_mask"); internal static readonly int SrvTransparencyAndCompositionMask = Shader.PropertyToID("r_transparency_and_composition_mask"); internal static readonly int SrvReconstructedPrevNearestDepth = Shader.PropertyToID("r_reconstructed_previous_nearest_depth"); internal static readonly int SrvDilatedMotionVectors = Shader.PropertyToID("r_dilated_motion_vectors"); - internal static readonly int SrvPrevDilatedMotionVectors = Shader.PropertyToID("r_previous_dilated_motion_vectors"); + internal static readonly int SrvPrevDilatedMotionVectors = Shader.PropertyToID("r_previous_dilated_motion_vectors"); // obsolete internal static readonly int SrvDilatedDepth = Shader.PropertyToID("r_dilated_depth"); internal static readonly int SrvInternalUpscaled = Shader.PropertyToID("r_internal_upscaled_color"); - internal static readonly int SrvLockStatus = Shader.PropertyToID("r_lock_status"); - internal static readonly int SrvLockInputLuma = Shader.PropertyToID("r_lock_input_luma"); - internal static readonly int SrvPreparedInputColor = Shader.PropertyToID("r_prepared_input_color"); + internal static readonly int SrvAccumulation = Shader.PropertyToID("r_accumulation"); + internal static readonly int SrvLockStatus = Shader.PropertyToID("r_lock_status"); // obsolete + internal static readonly int SrvLockInputLuma = Shader.PropertyToID("r_lock_input_luma"); // obsolete + internal static readonly int SrvPreparedInputColor = Shader.PropertyToID("r_prepared_input_color"); // obsolete internal static readonly int SrvLumaHistory = Shader.PropertyToID("r_luma_history"); internal static readonly int SrvRcasInput = Shader.PropertyToID("r_rcas_input"); internal static readonly int SrvLanczosLut = Shader.PropertyToID("r_lanczos_lut"); - internal static readonly int SrvSceneLuminanceMips = Shader.PropertyToID("r_imgMips"); - internal static readonly int SrvUpscaleMaximumBiasLut = Shader.PropertyToID("r_upsample_maximum_bias_lut"); + internal static readonly int SrvSpdMips = Shader.PropertyToID("r_spd_mips"); + internal static readonly int SrvSceneLuminanceMips = Shader.PropertyToID("r_imgMips"); // obsolete + internal static readonly int SrvUpscaleMaximumBiasLut = Shader.PropertyToID("r_upsample_maximum_bias_lut"); // obsolete internal static readonly int SrvDilatedReactiveMasks = Shader.PropertyToID("r_dilated_reactive_masks"); + internal static readonly int SrvNewLocks = Shader.PropertyToID("r_new_locks"); + internal static readonly int SrvFarthestDepth = Shader.PropertyToID("r_farthest_depth"); + internal static readonly int SrvFarthestDepthMip1 = Shader.PropertyToID("r_farthest_depth_mip1"); + internal static readonly int SrvShadingChange = Shader.PropertyToID("r_shading_change"); + internal static readonly int SrvCurrentLuma = Shader.PropertyToID("r_current_luma"); + internal static readonly int SrvPreviousLuma = Shader.PropertyToID("r_previous_luma"); + internal static readonly int SrvLumaInstability = Shader.PropertyToID("r_luma_instability"); internal static readonly int SrvPrevColorPreAlpha = Shader.PropertyToID("r_input_prev_color_pre_alpha"); internal static readonly int SrvPrevColorPostAlpha = Shader.PropertyToID("r_input_prev_color_post_alpha"); @@ -55,18 +65,31 @@ namespace FidelityFX internal static readonly int UavDilatedMotionVectors = Shader.PropertyToID("rw_dilated_motion_vectors"); internal static readonly int UavDilatedDepth = Shader.PropertyToID("rw_dilated_depth"); internal static readonly int UavInternalUpscaled = Shader.PropertyToID("rw_internal_upscaled_color"); - internal static readonly int UavLockStatus = Shader.PropertyToID("rw_lock_status"); - internal static readonly int UavLockInputLuma = Shader.PropertyToID("rw_lock_input_luma"); - internal static readonly int UavNewLocks = Shader.PropertyToID("rw_new_locks"); - internal static readonly int UavPreparedInputColor = Shader.PropertyToID("rw_prepared_input_color"); + internal static readonly int UavAccumulation = Shader.PropertyToID("rw_accumulation"); + internal static readonly int UavLockStatus = Shader.PropertyToID("rw_lock_status"); // obsolete + internal static readonly int UavLockInputLuma = Shader.PropertyToID("rw_lock_input_luma"); // obsolete + internal static readonly int UavPreparedInputColor = Shader.PropertyToID("rw_prepared_input_color"); // obsolete internal static readonly int UavLumaHistory = Shader.PropertyToID("rw_luma_history"); internal static readonly int UavUpscaledOutput = Shader.PropertyToID("rw_upscaled_output"); - internal static readonly int UavExposureMipLumaChange = Shader.PropertyToID("rw_img_mip_shading_change"); - internal static readonly int UavExposureMip5 = Shader.PropertyToID("rw_img_mip_5"); + internal static readonly int UavExposureMipLumaChange = Shader.PropertyToID("rw_img_mip_shading_change"); // obsolete + internal static readonly int UavExposureMip5 = Shader.PropertyToID("rw_img_mip_5"); // obsolete internal static readonly int UavDilatedReactiveMasks = Shader.PropertyToID("rw_dilated_reactive_masks"); - internal static readonly int UavAutoExposure = Shader.PropertyToID("rw_auto_exposure"); + internal static readonly int UavFrameInfo = Shader.PropertyToID("rw_frame_info"); + internal static readonly int UavAutoExposure = Shader.PropertyToID("rw_auto_exposure"); // obsolete internal static readonly int UavSpdAtomicCount = Shader.PropertyToID("rw_spd_global_atomic"); + internal static readonly int UavNewLocks = Shader.PropertyToID("rw_new_locks"); internal static readonly int UavAutoReactive = Shader.PropertyToID("rw_output_autoreactive"); + internal static readonly int UavShadingChange = Shader.PropertyToID("rw_shading_change"); + internal static readonly int UavFarthestDepth = Shader.PropertyToID("rw_farthest_depth"); + internal static readonly int UavFarthestDepthMip1 = Shader.PropertyToID("rw_farthest_depth_mip1"); + internal static readonly int UavCurrentLuma = Shader.PropertyToID("rw_current_luma"); + internal static readonly int UavLumaInstability = Shader.PropertyToID("rw_luma_instability"); + internal static readonly int UavSpdMip0 = Shader.PropertyToID("rw_spd_mip0"); + internal static readonly int UavSpdMip1 = Shader.PropertyToID("rw_spd_mip1"); + internal static readonly int UavSpdMip2 = Shader.PropertyToID("rw_spd_mip2"); + internal static readonly int UavSpdMip3 = Shader.PropertyToID("rw_spd_mip3"); + internal static readonly int UavSpdMip4 = Shader.PropertyToID("rw_spd_mip4"); + internal static readonly int UavSpdMip5 = Shader.PropertyToID("rw_spd_mip5"); internal static readonly int UavAutoComposition = Shader.PropertyToID("rw_output_autocomposition"); internal static readonly int UavPrevColorPreAlpha = Shader.PropertyToID("rw_output_prev_color_pre_alpha"); internal static readonly int UavPrevColorPostAlpha = Shader.PropertyToID("rw_output_prev_color_post_alpha"); diff --git a/Assets/Scripts/Core/Fsr3UpscalerResources.cs b/Assets/Scripts/Core/Fsr3UpscalerResources.cs index 7ee03cc..a753670 100644 --- a/Assets/Scripts/Core/Fsr3UpscalerResources.cs +++ b/Assets/Scripts/Core/Fsr3UpscalerResources.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2023 Nico de Poel +// Copyright (c) 2024 Nico de Poel // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -31,21 +31,33 @@ namespace FidelityFX /// internal class Fsr3UpscalerResources { + public Texture2D LanczosLut; public Texture2D DefaultExposure; public Texture2D DefaultReactive; - public Texture2D LanczosLut; - public Texture2D MaximumBiasLut; + public RenderTexture SpdAtomicCounter; - public RenderTexture AutoExposure; - public RenderTexture SceneLuminance; + public RenderTexture SpdMips; + public RenderTexture DilatedVelocity; + public RenderTexture DilatedDepth; + public RenderTexture ReconstructedPrevNearestDepth; + public RenderTexture FrameInfo; public RenderTexture AutoReactive; public RenderTexture AutoComposition; - public readonly RenderTexture[] DilatedMotionVectors = new RenderTexture[2]; - public readonly RenderTexture[] LockStatus = new RenderTexture[2]; + + public readonly RenderTexture[] Accumulation = new RenderTexture[2]; + public readonly RenderTexture[] Luma = new RenderTexture[2]; public readonly RenderTexture[] InternalUpscaled = new RenderTexture[2]; public readonly RenderTexture[] LumaHistory = new RenderTexture[2]; public readonly RenderTexture[] PrevPreAlpha = new RenderTexture[2]; public readonly RenderTexture[] PrevPostAlpha = new RenderTexture[2]; + + // OLD + public Texture2D MaximumBiasLut; + public RenderTexture AutoExposure; + public RenderTexture SceneLuminance; + + public readonly RenderTexture[] DilatedMotionVectors = new RenderTexture[2]; + public readonly RenderTexture[] LockStatus = new RenderTexture[2]; public void Create(Fsr3Upscaler.ContextDescription contextDescription) { @@ -59,47 +71,76 @@ namespace FidelityFX lanczos2Weights[currentLanczosWidthIndex] = y; } - float[] maximumBias = new float[MaximumBiasTextureWidth * MaximumBiasTextureHeight]; - for (int i = 0; i < maximumBias.Length; ++i) - { - maximumBias[i] = MaximumBias[i] / 2.0f; - } - + Vector2Int maxRenderSize = contextDescription.MaxRenderSize; + Vector2Int maxRenderSizeDiv2 = maxRenderSize / 2; + // Resource FSR3UPSCALER_LanczosLutData: FFX_RESOURCE_USAGE_READ_ONLY, FFX_SURFACE_FORMAT_R16_SNORM, FFX_RESOURCE_FLAGS_NONE // R16_SNorm textures are not supported by Unity on most platforms, strangely enough. So instead we use R32_SFloat and upload pre-normalized float data. LanczosLut = new Texture2D(lanczos2LutWidth, 1, GraphicsFormat.R32_SFloat, TextureCreationFlags.None) { name = "FSR3UPSCALER_LanczosLutData" }; LanczosLut.SetPixelData(lanczos2Weights, 0); LanczosLut.Apply(); - // Resource FSR3UPSCALER_MaximumUpsampleBias: FFX_RESOURCE_USAGE_READ_ONLY, FFX_SURFACE_FORMAT_R16_SNORM, FFX_RESOURCE_FLAGS_NONE - MaximumBiasLut = new Texture2D(MaximumBiasTextureWidth, MaximumBiasTextureHeight, GraphicsFormat.R32_SFloat, TextureCreationFlags.None) { name = "FSR3UPSCALER_MaximumUpsampleBias" }; - MaximumBiasLut.SetPixelData(maximumBias, 0); - MaximumBiasLut.Apply(); + // Resource FSR3UPSCALER_DefaultReactivityMask: FFX_RESOURCE_USAGE_READ_ONLY, FFX_SURFACE_FORMAT_R8_UNORM, FFX_RESOURCE_FLAGS_NONE + DefaultReactive = new Texture2D(1, 1, GraphicsFormat.R8_UNorm, TextureCreationFlags.None) { name = "FSR3UPSCALER_DefaultReactivityMask" }; + DefaultReactive.SetPixel(0, 0, Color.clear); + DefaultReactive.Apply(); // Resource FSR3UPSCALER_DefaultExposure: FFX_RESOURCE_USAGE_READ_ONLY, FFX_SURFACE_FORMAT_R32G32_FLOAT, FFX_RESOURCE_FLAGS_NONE DefaultExposure = new Texture2D(1, 1, GraphicsFormat.R32G32_SFloat, TextureCreationFlags.None) { name = "FSR3UPSCALER_DefaultExposure" }; DefaultExposure.SetPixel(0, 0, Color.clear); DefaultExposure.Apply(); - - // Resource FSR3UPSCALER_DefaultReactivityMask: FFX_RESOURCE_USAGE_READ_ONLY, FFX_SURFACE_FORMAT_R8_UNORM, FFX_RESOURCE_FLAGS_NONE - DefaultReactive = new Texture2D(1, 1, GraphicsFormat.R8_UNorm, TextureCreationFlags.None) { name = "FSR3UPSCALER_DefaultReactivityMask" }; - DefaultReactive.SetPixel(0, 0, Color.clear); - DefaultReactive.Apply(); // Resource FSR3UPSCALER_SpdAtomicCounter: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R32_UINT, FFX_RESOURCE_FLAGS_ALIASABLE // Despite what the original FSR3 codebase says, this resource really isn't aliasable. Resetting this counter to 0 every frame breaks auto-exposure on MacOS Metal. SpdAtomicCounter = new RenderTexture(1, 1, 0, GraphicsFormat.R32_UInt) { name = "FSR3UPSCALER_SpdAtomicCounter", enableRandomWrite = true }; SpdAtomicCounter.Create(); + + // Resource FSR3UPSCALER_SpdMips: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16G16_FLOAT, FFX_RESOURCE_FLAGS_ALIASABLE + // This is a rather special case: it's an aliasable resource, but because we require a mipmap chain and bind specific mip levels per shader, we can't easily use temporary RTs for this. + int mipCount = 1 + Mathf.FloorToInt(Mathf.Log(Math.Max(maxRenderSizeDiv2.x, maxRenderSizeDiv2.y), 2.0f)); + SpdMips = new RenderTexture(maxRenderSizeDiv2.x, maxRenderSizeDiv2.y, 0, GraphicsFormat.R16G16_SFloat, mipCount) { name = "FSR3UPSCALER_SpdMips", enableRandomWrite = true, useMipMap = true, autoGenerateMips = false }; + SpdMips.Create(); + + // Resource FSR3UPSCALER_DilatedVelocity: FFX_RESOURCE_USAGE_RENDERTARGET | FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16G16_FLOAT, FFX_RESOURCE_FLAGS_NONE + DilatedVelocity = new RenderTexture(maxRenderSize.x, maxRenderSize.y, 0, GraphicsFormat.R16G16_SFloat) { name = "FSR3UPSCALER_DilatedVelocity", enableRandomWrite = true }; + DilatedVelocity.Create(); + + // Resource FSR3UPSCALER_DilatedDepth: FFX_RESOURCE_USAGE_RENDERTARGET | FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R32_FLOAT, FFX_RESOURCE_FLAGS_NONE + DilatedDepth = new RenderTexture(maxRenderSize.x, maxRenderSize.y, 0, GraphicsFormat.R32_SFloat) { name = "FSR3UPSCALER_DilatedDepth", enableRandomWrite = true }; + DilatedDepth.Create(); + + // Resource FSR3UPSCALER_ReconstructedPrevNearestDepth: FFX_RESOURCE_USAGE_RENDERTARGET | FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R32_UINT, FFX_RESOURCE_FLAGS_NONE + ReconstructedPrevNearestDepth = new RenderTexture(maxRenderSize.x, maxRenderSize.y, 0, GraphicsFormat.R32_UInt) { name = "FSR3UPSCALER_ReconstructedPrevNearestDepth", enableRandomWrite = true }; + ReconstructedPrevNearestDepth.Create(); + + // Resource FSR3UPSCALER_FrameInfo: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R32G32B32A32_FLOAT, FFX_RESOURCE_FLAGS_NONE + FrameInfo = new RenderTexture(1, 1, 0, GraphicsFormat.R32G32B32A32_SFloat) { name = "FSR3UPSCALER_FrameInfo", enableRandomWrite = true }; + FrameInfo.Create(); + // Resources FSR3UPSCALER_Accumulation1/2: FFX_RESOURCE_USAGE_RENDERTARGET | FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R8_UNORM, FFX_RESOURCE_FLAGS_NONE + CreateDoubleBufferedResource(Accumulation, "FSR3UPSCALER_Accumulation", maxRenderSize, GraphicsFormat.R8_UNorm); + + // Resources FSR3UPSCALER_Luma1/2: FFX_RESOURCE_USAGE_RENDERTARGET | FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16_FLOAT, FFX_RESOURCE_FLAGS_NONE + CreateDoubleBufferedResource(Luma, "FSR3UPSCALER_Luma", maxRenderSize, GraphicsFormat.R16_SFloat); + + // Resources FSR3UPSCALER_InternalUpscaled1/2: FFX_RESOURCE_USAGE_RENDERTARGET | FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16G16B16A16_FLOAT, FFX_RESOURCE_FLAGS_NONE + CreateDoubleBufferedResource(InternalUpscaled, "FSR3UPSCALER_InternalUpscaled", contextDescription.MaxUpscaleSize, GraphicsFormat.R16G16B16A16_SFloat); + + // Resources FSR3UPSCALER_LumaHistory1/2: FFX_RESOURCE_USAGE_RENDERTARGET | FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16G16B16A16_FLOAT, FFX_RESOURCE_FLAGS_NONE + CreateDoubleBufferedResource(LumaHistory, "FSR3UPSCALER_LumaHistory", contextDescription.MaxUpscaleSize, GraphicsFormat.R16G16B16A16_SFloat); + + // + // OLD + // + // Resource FSR3UPSCALER_AutoExposure: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R32G32_FLOAT, FFX_RESOURCE_FLAGS_NONE AutoExposure = new RenderTexture(1, 1, 0, GraphicsFormat.R32G32_SFloat) { name = "FSR3UPSCALER_AutoExposure", enableRandomWrite = true }; AutoExposure.Create(); // Resource FSR3UPSCALER_ExposureMips: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16_FLOAT, FFX_RESOURCE_FLAGS_ALIASABLE // This is a rather special case: it's an aliasable resource, but because we require a mipmap chain and bind specific mip levels per shader, we can't easily use temporary RTs for this. - int w = contextDescription.MaxRenderSize.x / 2, h = contextDescription.MaxRenderSize.y / 2; - int mipCount = 1 + Mathf.FloorToInt(Mathf.Log(Math.Max(w, h), 2.0f)); - SceneLuminance = new RenderTexture(w, h, 0, GraphicsFormat.R16_SFloat, mipCount) { name = "FSR3UPSCALER_ExposureMips", enableRandomWrite = true, useMipMap = true, autoGenerateMips = false }; + mipCount = 1 + Mathf.FloorToInt(Mathf.Log(Math.Max(maxRenderSizeDiv2.x, maxRenderSizeDiv2.y), 2.0f)); + SceneLuminance = new RenderTexture(maxRenderSizeDiv2.x, maxRenderSizeDiv2.y, 0, GraphicsFormat.R16_SFloat, mipCount) { name = "FSR3UPSCALER_ExposureMips", enableRandomWrite = true, useMipMap = true, autoGenerateMips = false }; SceneLuminance.Create(); // Resources FSR3UPSCALER_InternalDilatedVelocity1/2: FFX_RESOURCE_USAGE_RENDERTARGET | FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16G16_FLOAT, FFX_RESOURCE_FLAGS_NONE @@ -107,12 +148,6 @@ namespace FidelityFX // Resources FSR3UPSCALER_LockStatus1/2: FFX_RESOURCE_USAGE_RENDERTARGET | FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16G16_FLOAT, FFX_RESOURCE_FLAGS_NONE CreateDoubleBufferedResource(LockStatus, "FSR3UPSCALER_LockStatus", contextDescription.MaxUpscaleSize, GraphicsFormat.R16G16_SFloat); - - // Resources FSR3UPSCALER_InternalUpscaled1/2: FFX_RESOURCE_USAGE_RENDERTARGET | FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16G16B16A16_FLOAT, FFX_RESOURCE_FLAGS_NONE - CreateDoubleBufferedResource(InternalUpscaled, "FSR3UPSCALER_InternalUpscaled", contextDescription.MaxUpscaleSize, GraphicsFormat.R16G16B16A16_SFloat); - - // Resources FSR3UPSCALER_LumaHistory1/2: FFX_RESOURCE_USAGE_RENDERTARGET | FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R8G8B8A8_UNORM, FFX_RESOURCE_FLAGS_NONE - CreateDoubleBufferedResource(LumaHistory, "FSR3UPSCALER_LumaHistory", contextDescription.MaxUpscaleSize, GraphicsFormat.R8G8B8A8_UNorm); } public void CreateTcrAutogenResources(Fsr3Upscaler.ContextDescription contextDescription) @@ -136,8 +171,32 @@ namespace FidelityFX // These do not need to persist between frames, but they do need to be available between passes public static void CreateAliasableResources(CommandBuffer commandBuffer, Fsr3Upscaler.ContextDescription contextDescription, Fsr3Upscaler.DispatchDescription dispatchParams) { - Vector2Int displaySize = contextDescription.MaxUpscaleSize; + Vector2Int maxUpscaleSize = contextDescription.MaxUpscaleSize; Vector2Int maxRenderSize = contextDescription.MaxRenderSize; + Vector2Int maxRenderSizeDiv2 = maxRenderSize / 2; + + // TODO Aliasable: FSR3UPSCALER_IntermediateFp16x1, FSR3UPSCALER_ShadingChange, FSR3UPSCALER_NewLocks, FSR3UPSCALER_DilatedReactiveMasks + // TODO Aliasable but probably not: FSR3UPSCALER_SpdMips, FSR3UPSCALER_FarthestDepthMip1 + + // FSR3UPSCALER_IntermediateFp16x1: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16_FLOAT, FFX_RESOURCE_FLAGS_ALIASABLE + commandBuffer.GetTemporaryRT(Fsr3ShaderIDs.UavFarthestDepth, maxRenderSize.x, maxRenderSize.y, 0, default, GraphicsFormat.R16_SFloat, 1, true); + commandBuffer.GetTemporaryRT(Fsr3ShaderIDs.UavLumaInstability, maxRenderSize.x, maxRenderSize.y, 0, default, GraphicsFormat.R16_SFloat, 1, true); + + // FSR3UPSCALER_ShadingChange: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R8_UNORM, FFX_RESOURCE_FLAGS_ALIASABLE + commandBuffer.GetTemporaryRT(Fsr3ShaderIDs.UavShadingChange, maxRenderSizeDiv2.x, maxRenderSizeDiv2.y, 0, default, GraphicsFormat.R8_UNorm, 1, true); + + // FSR3UPSCALER_NewLocks: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R8_UNORM, FFX_RESOURCE_FLAGS_ALIASABLE + commandBuffer.GetTemporaryRT(Fsr3ShaderIDs.UavNewLocks, maxUpscaleSize.x, maxUpscaleSize.y, 0, default, GraphicsFormat.R8_UNorm, 1, true); + + // FSR3UPSCALER_FarthestDepthMip1: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16_FLOAT, FFX_RESOURCE_FLAGS_ALIASABLE + commandBuffer.GetTemporaryRT(Fsr3ShaderIDs.UavFarthestDepthMip1, maxRenderSizeDiv2.x, maxRenderSizeDiv2.y, 0, default, GraphicsFormat.R16_SFloat, 1, true); + + // FSR3UPSCALER_DilatedReactiveMasks: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R8G8B8A8_UNORM, FFX_RESOURCE_FLAGS_ALIASABLE + commandBuffer.GetTemporaryRT(Fsr3ShaderIDs.UavDilatedReactiveMasks, maxRenderSize.x, maxRenderSize.y, 0, default, GraphicsFormat.R8G8B8A8_UNorm, 1, true); + + // + // OLD + // // FSR3UPSCALER_ReconstructedPrevNearestDepth: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R32_UINT, FFX_RESOURCE_FLAGS_ALIASABLE commandBuffer.GetTemporaryRT(Fsr3ShaderIDs.UavReconstructedPrevNearestDepth, maxRenderSize.x, maxRenderSize.y, 0, default, GraphicsFormat.R32_UInt, 1, true); @@ -148,14 +207,8 @@ namespace FidelityFX // FSR3UPSCALER_LockInputLuma: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16_FLOAT, FFX_RESOURCE_FLAGS_ALIASABLE commandBuffer.GetTemporaryRT(Fsr3ShaderIDs.UavLockInputLuma, maxRenderSize.x, maxRenderSize.y, 0, default, GraphicsFormat.R16_SFloat, 1, true); - // FSR3UPSCALER_DilatedReactiveMasks: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R8G8_UNORM, FFX_RESOURCE_FLAGS_ALIASABLE - commandBuffer.GetTemporaryRT(Fsr3ShaderIDs.UavDilatedReactiveMasks, maxRenderSize.x, maxRenderSize.y, 0, default, GraphicsFormat.R8G8_UNorm, 1, true); - // FSR3UPSCALER_PreparedInputColor: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16G16B16A16_FLOAT, FFX_RESOURCE_FLAGS_ALIASABLE commandBuffer.GetTemporaryRT(Fsr3ShaderIDs.UavPreparedInputColor, maxRenderSize.x, maxRenderSize.y, 0, default, GraphicsFormat.R16G16B16A16_SFloat, 1, true); - - // FSR3UPSCALER_NewLocks: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R8_UNORM, FFX_RESOURCE_FLAGS_ALIASABLE - commandBuffer.GetTemporaryRT(Fsr3ShaderIDs.UavNewLocks, displaySize.x, displaySize.y, 0, default, GraphicsFormat.R8_UNorm, 1, true); } public static void DestroyAliasableResources(CommandBuffer commandBuffer) @@ -164,9 +217,14 @@ namespace FidelityFX commandBuffer.ReleaseTemporaryRT(Fsr3ShaderIDs.UavReconstructedPrevNearestDepth); commandBuffer.ReleaseTemporaryRT(Fsr3ShaderIDs.UavDilatedDepth); commandBuffer.ReleaseTemporaryRT(Fsr3ShaderIDs.UavLockInputLuma); - commandBuffer.ReleaseTemporaryRT(Fsr3ShaderIDs.UavDilatedReactiveMasks); commandBuffer.ReleaseTemporaryRT(Fsr3ShaderIDs.UavPreparedInputColor); + + commandBuffer.ReleaseTemporaryRT(Fsr3ShaderIDs.UavDilatedReactiveMasks); + commandBuffer.ReleaseTemporaryRT(Fsr3ShaderIDs.UavFarthestDepthMip1); commandBuffer.ReleaseTemporaryRT(Fsr3ShaderIDs.UavNewLocks); + commandBuffer.ReleaseTemporaryRT(Fsr3ShaderIDs.UavShadingChange); + commandBuffer.ReleaseTemporaryRT(Fsr3ShaderIDs.UavLumaInstability); + commandBuffer.ReleaseTemporaryRT(Fsr3ShaderIDs.UavFarthestDepth); } private static void CreateDoubleBufferedResource(RenderTexture[] resource, string name, Vector2Int size, GraphicsFormat format) @@ -182,15 +240,28 @@ namespace FidelityFX { DestroyTcrAutogenResources(); - DestroyResource(LumaHistory); - DestroyResource(InternalUpscaled); + // OLD DestroyResource(LockStatus); DestroyResource(DilatedMotionVectors); DestroyResource(ref SceneLuminance); DestroyResource(ref AutoExposure); + DestroyResource(ref MaximumBiasLut); + + // NEW + DestroyResource(LumaHistory); + DestroyResource(InternalUpscaled); + DestroyResource(Luma); + DestroyResource(Accumulation); + + DestroyResource(ref FrameInfo); + DestroyResource(ref ReconstructedPrevNearestDepth); + DestroyResource(ref DilatedDepth); + DestroyResource(ref DilatedVelocity); + DestroyResource(ref SpdMips); + DestroyResource(ref SpdAtomicCounter); + DestroyResource(ref DefaultReactive); DestroyResource(ref DefaultExposure); - DestroyResource(ref MaximumBiasLut); DestroyResource(ref LanczosLut); } @@ -232,27 +303,5 @@ namespace FidelityFX for (int i = 0; i < resource.Length; ++i) DestroyResource(ref resource[i]); } - - private const int MaximumBiasTextureWidth = 16; - private const int MaximumBiasTextureHeight = 16; - private static readonly float[] MaximumBias = - { - 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 1.876f, 1.809f, 1.772f, 1.753f, 1.748f, - 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 1.869f, 1.801f, 1.764f, 1.745f, 1.739f, - 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 1.976f, 1.841f, 1.774f, 1.737f, 1.716f, 1.71f, - 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 1.914f, 1.784f, 1.716f, 1.673f, 1.649f, 1.641f, - 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 1.793f, 1.676f, 1.604f, 1.562f, 1.54f, 1.533f, - 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 1.802f, 1.619f, 1.536f, 1.492f, 1.467f, 1.454f, 1.449f, - 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 1.812f, 1.575f, 1.496f, 1.456f, 1.432f, 1.416f, 1.408f, 1.405f, - 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 1.555f, 1.479f, 1.438f, 1.413f, 1.398f, 1.387f, 1.381f, 1.379f, - 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 1.812f, 1.555f, 1.474f, 1.43f, 1.404f, 1.387f, 1.376f, 1.368f, 1.363f, 1.362f, - 2.0f, 2.0f, 2.0f, 2.0f, 2.0f, 1.802f, 1.575f, 1.479f, 1.43f, 1.401f, 1.382f, 1.369f, 1.36f, 1.354f, 1.351f, 1.35f, - 2.0f, 2.0f, 1.976f, 1.914f, 1.793f, 1.619f, 1.496f, 1.438f, 1.404f, 1.382f, 1.367f, 1.357f, 1.349f, 1.344f, 1.341f, 1.34f, - 1.876f, 1.869f, 1.841f, 1.784f, 1.676f, 1.536f, 1.456f, 1.413f, 1.387f, 1.369f, 1.357f, 1.347f, 1.341f, 1.336f, 1.333f, 1.332f, - 1.809f, 1.801f, 1.774f, 1.716f, 1.604f, 1.492f, 1.432f, 1.398f, 1.376f, 1.36f, 1.349f, 1.341f, 1.335f, 1.33f, 1.328f, 1.327f, - 1.772f, 1.764f, 1.737f, 1.673f, 1.562f, 1.467f, 1.416f, 1.387f, 1.368f, 1.354f, 1.344f, 1.336f, 1.33f, 1.326f, 1.323f, 1.323f, - 1.753f, 1.745f, 1.716f, 1.649f, 1.54f, 1.454f, 1.408f, 1.381f, 1.363f, 1.351f, 1.341f, 1.333f, 1.328f, 1.323f, 1.321f, 1.32f, - 1.748f, 1.739f, 1.71f, 1.641f, 1.533f, 1.449f, 1.405f, 1.379f, 1.362f, 1.35f, 1.34f, 1.332f, 1.327f, 1.323f, 1.32f, 1.319f, - }; } }