From c4b59c7dc3a92aeacd9bc34c7b6e337c1c0a1c2b Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Sun, 23 Mar 2025 22:38:28 +0100 Subject: [PATCH 01/14] Bunch of fixes to make ASR Quality somewhat work on PS5, without reactive mask still: - Define macros for various VS/FS binding intrinsics - Use pragmas to set output formats for render targets that aren't normal RGBA - Added alpha channel to color output targets, so that they're 4-channel instead of 3 - Pass FSR2 constant buffer to reactive mask shader (may not matter) --- .../Effects/Upscaling/ASR/Runtime/AsrContext.cs | 2 +- .../Runtime/Effects/Upscaling/ASR/Runtime/AsrPass.cs | 5 +++-- .../Upscaling/ASR/Shaders/ffxm_fsr2_common.cginc | 9 +++++++++ .../shaders/ffxm_fsr2_accumulate_pass_fs.hlsl | 12 +++++++----- .../shaders/ffxm_fsr2_autogen_reactive_pass_fs.hlsl | 2 ++ .../shaders/ffxm_fsr2_depth_clip_pass_fs.hlsl | 2 ++ .../ASR/Shaders/shaders/ffxm_fsr2_rcas_pass_fs.hlsl | 4 ++-- ...ffxm_fsr2_reconstruct_previous_depth_pass_fs.hlsl | 4 ++++ 8 files changed, 30 insertions(+), 10 deletions(-) diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrContext.cs b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrContext.cs index 9bd1cc0..d178599 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrContext.cs +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrContext.cs @@ -96,7 +96,7 @@ namespace ArmASR _lockPass = new AsrLockPass(_contextDescription, _resources, _upscalerConstantsBuffer); _accumulatePass = new AsrAccumulatePass(_contextDescription, _resources, _upscalerConstantsBuffer); _sharpenPass = new AsrSharpenPass(_contextDescription, _resources, _upscalerConstantsBuffer, _rcasConstantsBuffer); - _generateReactivePass = new AsrGenerateReactivePass(_contextDescription, _resources, _generateReactiveConstantsBuffer); + _generateReactivePass = new AsrGenerateReactivePass(_contextDescription, _resources, _upscalerConstantsBuffer, _generateReactiveConstantsBuffer); } public void Destroy() diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrPass.cs b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrPass.cs index 7c7d191..d04be56 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrPass.cs +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrPass.cs @@ -328,8 +328,8 @@ namespace ArmASR { private readonly ComputeBuffer _generateReactiveConstants; - public AsrGenerateReactivePass(Asr.ContextDescription contextDescription, AsrResources resources, ComputeBuffer generateReactiveConstants) - : base(contextDescription, resources, null) + public AsrGenerateReactivePass(Asr.ContextDescription contextDescription, AsrResources resources, ComputeBuffer constants, ComputeBuffer generateReactiveConstants) + : base(contextDescription, resources, constants) { _generateReactiveConstants = generateReactiveConstants; @@ -347,6 +347,7 @@ namespace ArmASR commandBuffer.SetGlobalResource(AsrShaderIDs.SrvOpaqueOnly, dispatchParams.ColorOpaqueOnly); commandBuffer.SetGlobalResource(AsrShaderIDs.SrvInputColor, dispatchParams.ColorPreUpscale); + FragmentProperties.SetConstantBuffer(AsrShaderIDs.CbFsr2, Constants, 0, Constants.stride); FragmentProperties.SetConstantBuffer(AsrShaderIDs.CbGenReactive, _generateReactiveConstants, 0, _generateReactiveConstants.stride); BlitFragment(commandBuffer, dispatchParams.OutReactive.RenderTarget); diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_common.cginc b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_common.cginc index 895e4cf..a583e19 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_common.cginc +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_common.cginc @@ -31,3 +31,12 @@ #define InterlockedMin(dest, val) { (dest) = min((dest), (val)); } #define InterlockedMax(dest, val) { (dest) = max((dest), (val)); } #endif + +#if defined(SHADER_API_PSSL) +#define SV_VERTEXID S_VERTEX_ID +#define SV_POSITION S_POSITION +#define SV_TARGET0 S_TARGET_OUTPUT0 +#define SV_TARGET1 S_TARGET_OUTPUT1 +#define SV_TARGET2 S_TARGET_OUTPUT2 +#define SV_TARGET3 S_TARGET_OUTPUT3 +#endif diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_accumulate_pass_fs.hlsl b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_accumulate_pass_fs.hlsl index 5e846c4..4038324 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_accumulate_pass_fs.hlsl +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_accumulate_pass_fs.hlsl @@ -56,6 +56,8 @@ #include "fsr2/ffxm_fsr2_reproject.h" #include "fsr2/ffxm_fsr2_accumulate.h" +#pragma PSSL_target_output_format(target 1 FMT_FP16_ABGR) + struct AccumulateOutputsFS { #if !FFXM_SHADER_QUALITY_BALANCED_OR_PERFORMANCE @@ -63,14 +65,14 @@ struct AccumulateOutputsFS FfxFloat32x2 fLockStatus : SV_TARGET1; FfxFloat32x4 fLumaHistory : SV_TARGET2; #if FFXM_FSR2_OPTION_APPLY_SHARPENING == 0 - FfxFloat32x3 fColor : SV_TARGET3; + FfxFloat32x4 fColor : SV_TARGET3; #endif #else // FFXM_SHADER_QUALITY_BALANCED_OR_PERFORMANCE - FfxFloat32x3 fUpscaledColor : SV_TARGET0; + FfxFloat32x4 fUpscaledColor : SV_TARGET0; FfxFloat32 fTemporalReactive : SV_TARGET1; FfxFloat32x2 fLockStatus : SV_TARGET2; #if FFXM_FSR2_OPTION_APPLY_SHARPENING == 0 - FfxFloat32x3 fColor : SV_TARGET3; + FfxFloat32x4 fColor : SV_TARGET3; #endif #endif }; @@ -84,12 +86,12 @@ AccumulateOutputsFS main(float4 SvPosition : SV_POSITION) output.fColorAndWeight = result.fColorAndWeight; output.fLumaHistory = result.fLumaHistory; #else - output.fUpscaledColor = result.fUpscaledColor; + output.fUpscaledColor = FfxFloat32x4(result.fUpscaledColor, 1.0f); output.fTemporalReactive = result.fTemporalReactive; #endif output.fLockStatus = result.fLockStatus; #if FFXM_FSR2_OPTION_APPLY_SHARPENING == 0 - output.fColor = result.fColor; + output.fColor = FfxFloat32x4(result.fColor, 1.0f); #endif return output; } \ No newline at end of file diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_autogen_reactive_pass_fs.hlsl b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_autogen_reactive_pass_fs.hlsl index 34fa02f..d87abd8 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_autogen_reactive_pass_fs.hlsl +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_autogen_reactive_pass_fs.hlsl @@ -36,6 +36,8 @@ #include "fsr2/ffxm_fsr2_callbacks_hlsl.h" #include "fsr2/ffxm_fsr2_common.h" +#pragma PSSL_target_output_format(default FMT_32_R) + struct GenReactiveMaskOutputs { FfxFloat32 fReactiveMask : SV_TARGET0; diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_depth_clip_pass_fs.hlsl b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_depth_clip_pass_fs.hlsl index 60c4dfa..ed78125 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_depth_clip_pass_fs.hlsl +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_depth_clip_pass_fs.hlsl @@ -45,6 +45,8 @@ #include "fsr2/ffxm_fsr2_sample.h" #include "fsr2/ffxm_fsr2_depth_clip.h" +#pragma PSSL_target_output_format(target 0 FMT_FP16_ABGR) + struct DepthClipOutputsFS { FfxFloat32x2 fDilatedReactiveMasks : SV_TARGET0; diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_rcas_pass_fs.hlsl b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_rcas_pass_fs.hlsl index 6031679..b5585ec 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_rcas_pass_fs.hlsl +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_rcas_pass_fs.hlsl @@ -39,7 +39,7 @@ struct RCASOutputsFS { - FfxFloat32x3 fUpscaledColor : SV_TARGET0; + FfxFloat32x4 fUpscaledColor : SV_TARGET0; }; RCASOutputsFS main(float4 SvPosition : SV_POSITION) @@ -47,6 +47,6 @@ RCASOutputsFS main(float4 SvPosition : SV_POSITION) uint2 uPixelCoord = uint2(SvPosition.xy); RCASOutputs result = RCAS(uPixelCoord); RCASOutputsFS output = (RCASOutputsFS)0; - output.fUpscaledColor = result.fUpscaledColor; + output.fUpscaledColor = FfxFloat32x4(result.fUpscaledColor, 1.0f); return output; } diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_reconstruct_previous_depth_pass_fs.hlsl b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_reconstruct_previous_depth_pass_fs.hlsl index 57e3e68..b67ff65 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_reconstruct_previous_depth_pass_fs.hlsl +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_reconstruct_previous_depth_pass_fs.hlsl @@ -41,6 +41,10 @@ #include "fsr2/ffxm_fsr2_sample.h" #include "fsr2/ffxm_fsr2_reconstruct_dilated_velocity_and_previous_depth.h" +#pragma PSSL_target_output_format(target 0 FMT_32_R) +#pragma PSSL_target_output_format(target 1 FMT_FP16_ABGR) +#pragma PSSL_target_output_format(target 2 FMT_32_R) + struct ReconstructPrevDepthOutputsFS { FfxFloat32 fDepth : SV_TARGET0; From c0cf3de36435b9da744652fdd78f2057dcc89ed2 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Mon, 24 Mar 2025 11:22:26 +0100 Subject: [PATCH 02/14] Temporarily disable FP16 altogether, which makes PSSL shader compilation a lot happier. Need to figure out how to make the FP16 utility function definitions work without the shader compiler complaining about duplicate declarations. --- .../ffxm_fsr2_compute_luminance_pyramid_pass.compute | 2 +- .../Effects/Upscaling/ASR/Shaders/ffxm_fsr2_fs.shader | 8 ++++---- .../Upscaling/ASR/Shaders/ffxm_fsr2_lock_pass.compute | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_compute_luminance_pyramid_pass.compute b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_compute_luminance_pyramid_pass.compute index 5d4044b..34e0436 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_compute_luminance_pyramid_pass.compute +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_compute_luminance_pyramid_pass.compute @@ -1,6 +1,6 @@ #pragma kernel main -#pragma multi_compile __ FFXM_HALF +//#pragma multi_compile __ FFXM_HALF #pragma multi_compile __ FFXM_FSR2_OPTION_LOW_RESOLUTION_MOTION_VECTORS #pragma multi_compile __ FFXM_FSR2_OPTION_JITTERED_MOTION_VECTORS #pragma multi_compile __ FFXM_FSR2_OPTION_INVERTED_DEPTH diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_fs.shader b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_fs.shader index 5be5aae..ce41e15 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_fs.shader +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_fs.shader @@ -14,7 +14,7 @@ Shader "TND/ASR/ffx_fsr2_fs" #pragma target 4.5 //#pragma enable_d3d11_debug_symbols - #pragma multi_compile __ FFXM_HALF + //#pragma multi_compile __ FFXM_HALF #pragma multi_compile __ UNITY_FFXM_TEXTURE2D_X_ARRAY #include "ffxm_fsr2_common.cginc" @@ -34,7 +34,7 @@ Shader "TND/ASR/ffx_fsr2_fs" #pragma target 4.5 //#pragma enable_d3d11_debug_symbols - #pragma multi_compile __ FFXM_HALF + //#pragma multi_compile __ FFXM_HALF #pragma multi_compile __ FFXM_FSR2_OPTION_HDR_COLOR_INPUT #pragma multi_compile __ FFXM_FSR2_OPTION_LOW_RESOLUTION_MOTION_VECTORS #pragma multi_compile __ FFXM_FSR2_OPTION_JITTERED_MOTION_VECTORS @@ -58,7 +58,7 @@ Shader "TND/ASR/ffx_fsr2_fs" #pragma target 4.5 //#pragma enable_d3d11_debug_symbols - #pragma multi_compile __ FFXM_HALF + //#pragma multi_compile __ FFXM_HALF #pragma multi_compile __ FFXM_FSR2_OPTION_SHADER_OPT_BALANCED #pragma multi_compile __ FFXM_FSR2_OPTION_SHADER_OPT_PERFORMANCE #pragma multi_compile __ FFXM_FSR2_OPTION_LOW_RESOLUTION_MOTION_VECTORS @@ -83,7 +83,7 @@ Shader "TND/ASR/ffx_fsr2_fs" #pragma target 4.5 //#pragma enable_d3d11_debug_symbols - #pragma multi_compile __ FFXM_HALF + //#pragma multi_compile __ FFXM_HALF #pragma multi_compile __ FFXM_FSR2_OPTION_SHADER_OPT_BALANCED #pragma multi_compile __ FFXM_FSR2_OPTION_SHADER_OPT_PERFORMANCE #pragma multi_compile __ FFXM_FSR2_OPTION_REPROJECT_USE_LANCZOS_TYPE diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_lock_pass.compute b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_lock_pass.compute index 660b922..c4c47e5 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_lock_pass.compute +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_lock_pass.compute @@ -1,6 +1,6 @@ #pragma kernel main -#pragma multi_compile __ FFXM_HALF +//#pragma multi_compile __ FFXM_HALF #pragma multi_compile __ FFXM_FSR2_OPTION_LOW_RESOLUTION_MOTION_VECTORS #pragma multi_compile __ FFXM_FSR2_OPTION_JITTERED_MOTION_VECTORS #pragma multi_compile __ FFXM_FSR2_OPTION_INVERTED_DEPTH From e4ad05a4143a6ad7ca9fbd8103b5bdbfd4f44310 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Mon, 24 Mar 2025 16:40:23 +0100 Subject: [PATCH 03/14] Made PSSL pragmas only get included for PSSL to prevent compiler warnings, and require native 16-bit compilation for PSSL. --- .../Effects/Upscaling/ASR/Shaders/ffxm_fsr2_common.cginc | 2 +- .../ASR/Shaders/shaders/ffxm_fsr2_accumulate_pass_fs.hlsl | 2 ++ .../ASR/Shaders/shaders/ffxm_fsr2_autogen_reactive_pass_fs.hlsl | 2 ++ .../ASR/Shaders/shaders/ffxm_fsr2_depth_clip_pass_fs.hlsl | 2 ++ .../shaders/ffxm_fsr2_reconstruct_previous_depth_pass_fs.hlsl | 2 ++ 5 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_common.cginc b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_common.cginc index b0fa3da..8b8a686 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_common.cginc +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_common.cginc @@ -6,7 +6,7 @@ // Doesn't work for: // - DX11: forces use of DXC which is not supported // - XB1: native FP16 seems to be unsupported -#if defined(SHADER_API_VULKAN) +#if defined(SHADER_API_VULKAN) || defined(SHADER_API_PSSL) #pragma require Native16Bit #endif diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_accumulate_pass_fs.hlsl b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_accumulate_pass_fs.hlsl index 4038324..a5959f7 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_accumulate_pass_fs.hlsl +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_accumulate_pass_fs.hlsl @@ -56,7 +56,9 @@ #include "fsr2/ffxm_fsr2_reproject.h" #include "fsr2/ffxm_fsr2_accumulate.h" +#if defined(SHADER_API_PSSL) #pragma PSSL_target_output_format(target 1 FMT_FP16_ABGR) +#endif struct AccumulateOutputsFS { diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_autogen_reactive_pass_fs.hlsl b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_autogen_reactive_pass_fs.hlsl index d87abd8..24172a5 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_autogen_reactive_pass_fs.hlsl +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_autogen_reactive_pass_fs.hlsl @@ -36,7 +36,9 @@ #include "fsr2/ffxm_fsr2_callbacks_hlsl.h" #include "fsr2/ffxm_fsr2_common.h" +#if defined(SHADER_API_PSSL) #pragma PSSL_target_output_format(default FMT_32_R) +#endif struct GenReactiveMaskOutputs { diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_depth_clip_pass_fs.hlsl b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_depth_clip_pass_fs.hlsl index ed78125..d9db178 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_depth_clip_pass_fs.hlsl +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_depth_clip_pass_fs.hlsl @@ -45,7 +45,9 @@ #include "fsr2/ffxm_fsr2_sample.h" #include "fsr2/ffxm_fsr2_depth_clip.h" +#if defined(SHADER_API_PSSL) #pragma PSSL_target_output_format(target 0 FMT_FP16_ABGR) +#endif struct DepthClipOutputsFS { diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_reconstruct_previous_depth_pass_fs.hlsl b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_reconstruct_previous_depth_pass_fs.hlsl index b67ff65..c07b3c2 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_reconstruct_previous_depth_pass_fs.hlsl +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_reconstruct_previous_depth_pass_fs.hlsl @@ -41,9 +41,11 @@ #include "fsr2/ffxm_fsr2_sample.h" #include "fsr2/ffxm_fsr2_reconstruct_dilated_velocity_and_previous_depth.h" +#if defined(SHADER_API_PSSL) #pragma PSSL_target_output_format(target 0 FMT_32_R) #pragma PSSL_target_output_format(target 1 FMT_FP16_ABGR) #pragma PSSL_target_output_format(target 2 FMT_32_R) +#endif struct ReconstructPrevDepthOutputsFS { From 884ca840715346a5a5a1117da316b8c022ca5a9d Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Mon, 24 Mar 2025 16:43:32 +0100 Subject: [PATCH 04/14] Moved unorm and globallycoherent definitions to the common cginc, rather than stuffing them somewhere in between all the types --- .../Effects/Upscaling/ASR/Shaders/ffxm_fsr2_common.cginc | 3 +++ .../Effects/Upscaling/ASR/Shaders/shaders/ffxm_common_types.h | 3 --- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_common.cginc b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_common.cginc index 8b8a686..b7143ef 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_common.cginc +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_common.cginc @@ -39,6 +39,7 @@ #define InterlockedMax(dest, val) { (dest) = max((dest), (val)); } #endif +// PSSL uses different semantics and doesn't support certain type qualifiers #if defined(SHADER_API_PSSL) #define SV_VERTEXID S_VERTEX_ID #define SV_POSITION S_POSITION @@ -46,4 +47,6 @@ #define SV_TARGET1 S_TARGET_OUTPUT1 #define SV_TARGET2 S_TARGET_OUTPUT2 #define SV_TARGET3 S_TARGET_OUTPUT3 +#define unorm +#define globallycoherent #endif diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_common_types.h b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_common_types.h index be29d6c..bdef206 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_common_types.h +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_common_types.h @@ -472,9 +472,6 @@ typedef FfxUInt32x4 Prefix##_U4; #if defined(SHADER_API_PSSL) -#define unorm -#define globallycoherent - #if FFX_HALF #define FFXM_MIN16_F half From 5f4d4b37ad4540125f228c62bb6d04e65ae13152 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Mon, 24 Mar 2025 17:18:30 +0100 Subject: [PATCH 05/14] Fixed a big derp in the PSSL type definitions, copy-pasted code still contained FFX_HALF instead of FFXM_HALF, which caused 16-bit types to be compiled as 32-bit, causing a bunch of duplicate function definitions. --- .../ffxm_fsr2_compute_luminance_pyramid_pass.compute | 2 +- .../Effects/Upscaling/ASR/Shaders/ffxm_fsr2_fs.shader | 8 ++++---- .../Upscaling/ASR/Shaders/ffxm_fsr2_lock_pass.compute | 2 +- .../Upscaling/ASR/Shaders/shaders/ffxm_common_types.h | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_compute_luminance_pyramid_pass.compute b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_compute_luminance_pyramid_pass.compute index 34e0436..5d4044b 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_compute_luminance_pyramid_pass.compute +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_compute_luminance_pyramid_pass.compute @@ -1,6 +1,6 @@ #pragma kernel main -//#pragma multi_compile __ FFXM_HALF +#pragma multi_compile __ FFXM_HALF #pragma multi_compile __ FFXM_FSR2_OPTION_LOW_RESOLUTION_MOTION_VECTORS #pragma multi_compile __ FFXM_FSR2_OPTION_JITTERED_MOTION_VECTORS #pragma multi_compile __ FFXM_FSR2_OPTION_INVERTED_DEPTH diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_fs.shader b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_fs.shader index ce41e15..5be5aae 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_fs.shader +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_fs.shader @@ -14,7 +14,7 @@ Shader "TND/ASR/ffx_fsr2_fs" #pragma target 4.5 //#pragma enable_d3d11_debug_symbols - //#pragma multi_compile __ FFXM_HALF + #pragma multi_compile __ FFXM_HALF #pragma multi_compile __ UNITY_FFXM_TEXTURE2D_X_ARRAY #include "ffxm_fsr2_common.cginc" @@ -34,7 +34,7 @@ Shader "TND/ASR/ffx_fsr2_fs" #pragma target 4.5 //#pragma enable_d3d11_debug_symbols - //#pragma multi_compile __ FFXM_HALF + #pragma multi_compile __ FFXM_HALF #pragma multi_compile __ FFXM_FSR2_OPTION_HDR_COLOR_INPUT #pragma multi_compile __ FFXM_FSR2_OPTION_LOW_RESOLUTION_MOTION_VECTORS #pragma multi_compile __ FFXM_FSR2_OPTION_JITTERED_MOTION_VECTORS @@ -58,7 +58,7 @@ Shader "TND/ASR/ffx_fsr2_fs" #pragma target 4.5 //#pragma enable_d3d11_debug_symbols - //#pragma multi_compile __ FFXM_HALF + #pragma multi_compile __ FFXM_HALF #pragma multi_compile __ FFXM_FSR2_OPTION_SHADER_OPT_BALANCED #pragma multi_compile __ FFXM_FSR2_OPTION_SHADER_OPT_PERFORMANCE #pragma multi_compile __ FFXM_FSR2_OPTION_LOW_RESOLUTION_MOTION_VECTORS @@ -83,7 +83,7 @@ Shader "TND/ASR/ffx_fsr2_fs" #pragma target 4.5 //#pragma enable_d3d11_debug_symbols - //#pragma multi_compile __ FFXM_HALF + #pragma multi_compile __ FFXM_HALF #pragma multi_compile __ FFXM_FSR2_OPTION_SHADER_OPT_BALANCED #pragma multi_compile __ FFXM_FSR2_OPTION_SHADER_OPT_PERFORMANCE #pragma multi_compile __ FFXM_FSR2_OPTION_REPROJECT_USE_LANCZOS_TYPE diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_lock_pass.compute b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_lock_pass.compute index c4c47e5..660b922 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_lock_pass.compute +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/ffxm_fsr2_lock_pass.compute @@ -1,6 +1,6 @@ #pragma kernel main -//#pragma multi_compile __ FFXM_HALF +#pragma multi_compile __ FFXM_HALF #pragma multi_compile __ FFXM_FSR2_OPTION_LOW_RESOLUTION_MOTION_VECTORS #pragma multi_compile __ FFXM_FSR2_OPTION_JITTERED_MOTION_VECTORS #pragma multi_compile __ FFXM_FSR2_OPTION_INVERTED_DEPTH diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_common_types.h b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_common_types.h index bdef206..8628721 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_common_types.h +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_common_types.h @@ -472,7 +472,7 @@ typedef FfxUInt32x4 Prefix##_U4; #if defined(SHADER_API_PSSL) -#if FFX_HALF +#if FFXM_HALF #define FFXM_MIN16_F half #define FFXM_MIN16_F2 half2 @@ -504,7 +504,7 @@ typedef FfxUInt32x4 Prefix##_U4; #define FFXM_16BIT_U3 ushort3 #define FFXM_16BIT_U4 ushort4 -#else // FFX_HALF +#else // FFXM_HALF #define FFXM_MIN16_F float #define FFXM_MIN16_F2 float2 @@ -536,7 +536,7 @@ typedef FfxUInt32x4 Prefix##_U4; #define FFXM_16BIT_U3 uint3 #define FFXM_16BIT_U4 uint4 -#endif // FFX_HALF +#endif // FFXM_HALF #endif // #if defined(SHADER_API_PSSL) From bd18c12408495a2b88df7c05f6b675c6d56c0db9 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Mon, 24 Mar 2025 18:40:07 +0100 Subject: [PATCH 06/14] Updated PSSL target output format pragmas with what *should* be the correct values, though the PS5 still disagrees with this --- .../ASR/Shaders/shaders/ffxm_fsr2_accumulate_pass_fs.hlsl | 2 ++ .../ASR/Shaders/shaders/ffxm_fsr2_autogen_reactive_pass_fs.hlsl | 2 +- .../ASR/Shaders/shaders/ffxm_fsr2_depth_clip_pass_fs.hlsl | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_accumulate_pass_fs.hlsl b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_accumulate_pass_fs.hlsl index a5959f7..10d9508 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_accumulate_pass_fs.hlsl +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_accumulate_pass_fs.hlsl @@ -57,7 +57,9 @@ #include "fsr2/ffxm_fsr2_accumulate.h" #if defined(SHADER_API_PSSL) +#pragma PSSL_target_output_format(target 0 FMT_FP16_ABGR) #pragma PSSL_target_output_format(target 1 FMT_FP16_ABGR) +#pragma PSSL_target_output_format(target 2 FMT_FP16_ABGR) #endif struct AccumulateOutputsFS diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_autogen_reactive_pass_fs.hlsl b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_autogen_reactive_pass_fs.hlsl index 24172a5..64b5b29 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_autogen_reactive_pass_fs.hlsl +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_autogen_reactive_pass_fs.hlsl @@ -37,7 +37,7 @@ #include "fsr2/ffxm_fsr2_common.h" #if defined(SHADER_API_PSSL) -#pragma PSSL_target_output_format(default FMT_32_R) +#pragma PSSL_target_output_format(default FMT_FP16_ABGR) #endif struct GenReactiveMaskOutputs diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_depth_clip_pass_fs.hlsl b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_depth_clip_pass_fs.hlsl index d9db178..86f042a 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_depth_clip_pass_fs.hlsl +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_depth_clip_pass_fs.hlsl @@ -47,6 +47,7 @@ #if defined(SHADER_API_PSSL) #pragma PSSL_target_output_format(target 0 FMT_FP16_ABGR) +#pragma PSSL_target_output_format(target 1 FMT_FP16_ABGR) #endif struct DepthClipOutputsFS From 9aee5758b6bfedf6a6bd0c17291ea9da177f572e Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Mon, 24 Mar 2025 19:36:25 +0100 Subject: [PATCH 07/14] Made some progress towards making ASR FP16 work on PS5: - Auto-gen reactive mask & Reconstruct previous depth & Depth Clip passes now verified correct and working - Changed dilated reactive masks texture format to R16G16_SFloat, which Agc seems to like better as an output format than R8G8_UNorm - Accumulate pass is the only real (big) problem left --- .../Runtime/Effects/Upscaling/ASR/Runtime/AsrResources.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrResources.cs b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrResources.cs index 89ab6f8..0ad7ef5 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrResources.cs +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrResources.cs @@ -141,7 +141,7 @@ namespace ArmASR commandBuffer.GetTemporaryRT(AsrShaderIDs.UavLockInputLuma, maxRenderSize.x, maxRenderSize.y, 0, default, GraphicsFormat.R16_SFloat, 1, true); // FSR2_DilatedReactiveMasks: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R8G8_UNORM, FFX_RESOURCE_FLAGS_ALIASABLE - commandBuffer.GetTemporaryRT(AsrShaderIDs.UavDilatedReactiveMasks, maxRenderSize.x, maxRenderSize.y, 0, default, GraphicsFormat.R8G8_UNorm, 1, true); + commandBuffer.GetTemporaryRT(AsrShaderIDs.UavDilatedReactiveMasks, maxRenderSize.x, maxRenderSize.y, 0, default, GraphicsFormat.R16G16_SFloat, 1, true); // FSR2_PreparedInputColor: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16G16B16A16_FLOAT, FFX_RESOURCE_FLAGS_ALIASABLE commandBuffer.GetTemporaryRT(AsrShaderIDs.UavPreparedInputColor, maxRenderSize.x, maxRenderSize.y, 0, default, preparedInputColorNeedsFp16 ? GraphicsFormat.R16G16B16A16_SFloat : GraphicsFormat.R8G8B8A8_UNorm, 1, true); From 2f8a0ca595280cad8082d00b9d32c432a8e55962 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Mon, 24 Mar 2025 19:59:23 +0100 Subject: [PATCH 08/14] Added output target pragmas for random write targets. Not sure if these are necessary but it's something to keep an eye on. --- .../ASR/Shaders/shaders/ffxm_fsr2_accumulate_pass_fs.hlsl | 1 + .../shaders/ffxm_fsr2_reconstruct_previous_depth_pass_fs.hlsl | 1 + 2 files changed, 2 insertions(+) diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_accumulate_pass_fs.hlsl b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_accumulate_pass_fs.hlsl index 10d9508..e3ba114 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_accumulate_pass_fs.hlsl +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_accumulate_pass_fs.hlsl @@ -60,6 +60,7 @@ #pragma PSSL_target_output_format(target 0 FMT_FP16_ABGR) #pragma PSSL_target_output_format(target 1 FMT_FP16_ABGR) #pragma PSSL_target_output_format(target 2 FMT_FP16_ABGR) +#pragma PSSL_target_output_format(target 4 FMT_32_R) #endif struct AccumulateOutputsFS diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_reconstruct_previous_depth_pass_fs.hlsl b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_reconstruct_previous_depth_pass_fs.hlsl index c07b3c2..1c27721 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_reconstruct_previous_depth_pass_fs.hlsl +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_reconstruct_previous_depth_pass_fs.hlsl @@ -45,6 +45,7 @@ #pragma PSSL_target_output_format(target 0 FMT_32_R) #pragma PSSL_target_output_format(target 1 FMT_FP16_ABGR) #pragma PSSL_target_output_format(target 2 FMT_32_R) +#pragma PSSL_target_output_format(target 3 FMT_32_R) #endif struct ReconstructPrevDepthOutputsFS From cc74a9cd2fb7af3dd0a3335aee12f9c8f7a09315 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Tue, 25 Mar 2025 11:00:30 +0100 Subject: [PATCH 09/14] Use implicit register binding for fragment shader random write targets. Fixes UAVs not binding properly on PS5. --- .../ASR/Shaders/shaders/fsr2/ffxm_fsr2_callbacks_hlsl.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_callbacks_hlsl.h b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_callbacks_hlsl.h index 6159912..1963bd8 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_callbacks_hlsl.h +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_callbacks_hlsl.h @@ -379,7 +379,11 @@ SamplerState s_LinearClamp : register(s1); // UAV declarations #if defined FSR2_BIND_UAV_RECONSTRUCTED_PREV_NEAREST_DEPTH + #if defined(SHADER_API_PSSL) + RWTexture2D rw_reconstructed_previous_nearest_depth; // Need to use implicit register binding for random write targets on PS4/5 + #else RWTexture2D rw_reconstructed_previous_nearest_depth : FFXM_FSR2_DECLARE_UAV(FSR2_BIND_UAV_RECONSTRUCTED_PREV_NEAREST_DEPTH); + #endif #endif #if defined FSR2_BIND_UAV_DILATED_MOTION_VECTORS RWTexture2D rw_dilated_motion_vectors : FFXM_FSR2_DECLARE_UAV(FSR2_BIND_UAV_DILATED_MOTION_VECTORS); From c52a40f706f7498f38ca558a8abee2371b03c0ec Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Tue, 25 Mar 2025 12:07:08 +0100 Subject: [PATCH 10/14] Use implicit register binding when using UAVs in fragment shaders. Fixes remaining issues with reconstruct and accumulate passes on PS5 CGGC. Also disable writing to locks UAV at the end of Accumulate pass, as it doesn't actually do anything and it might cause issues with reading & writing to the same texture. --- .../ASR/Shaders/shaders/fsr2/ffxm_fsr2_accumulate.h | 2 +- .../ASR/Shaders/shaders/fsr2/ffxm_fsr2_callbacks_hlsl.h | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_accumulate.h b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_accumulate.h index 1120019..73404b5 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_accumulate.h +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_accumulate.h @@ -372,7 +372,7 @@ AccumulateOutputs Accumulate(FfxInt32x2 iPxHrPos) #if FFXM_FSR2_OPTION_APPLY_SHARPENING == 0 results.fColor = fHistoryColor; #endif - StoreNewLocks(iPxHrPos, 0); + //StoreNewLocks(iPxHrPos, 0); return results; } diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_callbacks_hlsl.h b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_callbacks_hlsl.h index 1963bd8..77b235d 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_callbacks_hlsl.h +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_callbacks_hlsl.h @@ -379,7 +379,7 @@ SamplerState s_LinearClamp : register(s1); // UAV declarations #if defined FSR2_BIND_UAV_RECONSTRUCTED_PREV_NEAREST_DEPTH - #if defined(SHADER_API_PSSL) + #if defined(SHADER_API_PSSL) && defined(SHADER_STAGE_FRAGMENT) RWTexture2D rw_reconstructed_previous_nearest_depth; // Need to use implicit register binding for random write targets on PS4/5 #else RWTexture2D rw_reconstructed_previous_nearest_depth : FFXM_FSR2_DECLARE_UAV(FSR2_BIND_UAV_RECONSTRUCTED_PREV_NEAREST_DEPTH); @@ -401,7 +401,11 @@ SamplerState s_LinearClamp : register(s1); RWTexture2D rw_lock_input_luma : FFXM_FSR2_DECLARE_UAV(FSR2_BIND_UAV_LOCK_INPUT_LUMA); #endif #if defined FSR2_BIND_UAV_NEW_LOCKS + #if defined(SHADER_API_PSSL) && defined(SHADER_STAGE_FRAGMENT) + RWTexture2D rw_new_locks; // Need to use implicit register binding for random write targets on PS4/5 + #else RWTexture2D rw_new_locks : FFXM_FSR2_DECLARE_UAV(FSR2_BIND_UAV_NEW_LOCKS); + #endif #endif #if defined FSR2_BIND_UAV_PREPARED_INPUT_COLOR RWTexture2D rw_prepared_input_color : FFXM_FSR2_DECLARE_UAV(FSR2_BIND_UAV_PREPARED_INPUT_COLOR); From 51e5a86112942bc0312912527ad683ce3c3c5f20 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Tue, 25 Mar 2025 12:18:34 +0100 Subject: [PATCH 11/14] Reverted dilated reactive masks format back to R8G8_UNorm, as that works correctly now --- .../Runtime/Effects/Upscaling/ASR/Runtime/AsrResources.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrResources.cs b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrResources.cs index 0ad7ef5..89ab6f8 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrResources.cs +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrResources.cs @@ -141,7 +141,7 @@ namespace ArmASR commandBuffer.GetTemporaryRT(AsrShaderIDs.UavLockInputLuma, maxRenderSize.x, maxRenderSize.y, 0, default, GraphicsFormat.R16_SFloat, 1, true); // FSR2_DilatedReactiveMasks: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R8G8_UNORM, FFX_RESOURCE_FLAGS_ALIASABLE - commandBuffer.GetTemporaryRT(AsrShaderIDs.UavDilatedReactiveMasks, maxRenderSize.x, maxRenderSize.y, 0, default, GraphicsFormat.R16G16_SFloat, 1, true); + commandBuffer.GetTemporaryRT(AsrShaderIDs.UavDilatedReactiveMasks, maxRenderSize.x, maxRenderSize.y, 0, default, GraphicsFormat.R8G8_UNorm, 1, true); // FSR2_PreparedInputColor: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16G16B16A16_FLOAT, FFX_RESOURCE_FLAGS_ALIASABLE commandBuffer.GetTemporaryRT(AsrShaderIDs.UavPreparedInputColor, maxRenderSize.x, maxRenderSize.y, 0, default, preparedInputColorNeedsFp16 ? GraphicsFormat.R16G16B16A16_SFloat : GraphicsFormat.R8G8B8A8_UNorm, 1, true); From 16cf41493a7da3e2f3a8b83a699159803ee105cd Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Tue, 25 Mar 2025 13:11:33 +0100 Subject: [PATCH 12/14] Swapped the order of the render targets around for the depth clip pass. Fixes prepared input color being black in NGGC because... I don't know, probably an alignment issue of some sort? PS5 is being really stupid here. --- .../Runtime/Effects/Upscaling/ASR/Runtime/AsrPass.cs | 4 ++-- .../ASR/Shaders/shaders/ffxm_fsr2_depth_clip_pass_fs.hlsl | 6 +++--- .../ASR/Shaders/shaders/fsr2/ffxm_fsr2_depth_clip.h | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrPass.cs b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrPass.cs index f8ef944..4ad1628 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrPass.cs +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrPass.cs @@ -215,8 +215,8 @@ namespace ArmASR commandBuffer.SetGlobalTexture(AsrShaderIDs.SrvDilatedDepth, AsrShaderIDs.UavDilatedDepth); commandBuffer.SetGlobalTexture(AsrShaderIDs.SrvPrevDilatedMotionVectors, Resources.DilatedMotionVectors[frameIndex ^ 1]); - _mrt[0] = AsrShaderIDs.RtDilatedReactiveMasks; // fDilatedReactiveMasks - _mrt[1] = AsrShaderIDs.RtPreparedInputColor; // fTonemapped + _mrt[0] = AsrShaderIDs.RtPreparedInputColor; // fTonemapped + _mrt[1] = AsrShaderIDs.RtDilatedReactiveMasks; // fDilatedReactiveMasks FragmentProperties.SetConstantBuffer(AsrShaderIDs.CbFsr2, Constants, 0, Constants.stride); BlitFragment(commandBuffer, _mrt); diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_depth_clip_pass_fs.hlsl b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_depth_clip_pass_fs.hlsl index 86f042a..dd80fa0 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_depth_clip_pass_fs.hlsl +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_depth_clip_pass_fs.hlsl @@ -52,8 +52,8 @@ struct DepthClipOutputsFS { - FfxFloat32x2 fDilatedReactiveMasks : SV_TARGET0; - FfxFloat32x4 fTonemapped : SV_TARGET1; + FfxFloat32x4 fTonemapped : SV_TARGET0; + FfxFloat32x2 fDilatedReactiveMasks : SV_TARGET1; }; DepthClipOutputsFS main(float4 SvPosition : SV_POSITION) @@ -61,7 +61,7 @@ DepthClipOutputsFS main(float4 SvPosition : SV_POSITION) uint2 uPixelCoord = uint2(SvPosition.xy); DepthClipOutputs result = DepthClip(uPixelCoord); DepthClipOutputsFS output = (DepthClipOutputsFS)0; - output.fDilatedReactiveMasks = result.fDilatedReactiveMasks; output.fTonemapped = result.fTonemapped; + output.fDilatedReactiveMasks = result.fDilatedReactiveMasks; return output; } diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_depth_clip.h b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_depth_clip.h index 2ef4152..0b4a00d 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_depth_clip.h +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_depth_clip.h @@ -27,8 +27,8 @@ struct DepthClipOutputs { - FfxFloat32x2 fDilatedReactiveMasks; FfxFloat32x4 fTonemapped; + FfxFloat32x2 fDilatedReactiveMasks; }; FFXM_STATIC const FfxFloat32 DepthClipBaseScale = 4.0f; From 3912c66b0d2f77926a1ea858c933974c58364b55 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Tue, 25 Mar 2025 13:58:41 +0100 Subject: [PATCH 13/14] Bind new locks to the accumulate shader as a regular SRV (read-only), and clear the locks buffer ahead of time instead of at the end of the accumulate shader. This simplifies the shader binding setup, as well as being "more correct" because we're using a temporary RT for the locks buffer, meaning it makes no sense to clear it for the next frame. --- .../Runtime/Effects/Upscaling/ASR/Runtime/AsrContext.cs | 3 +++ .../Runtime/Effects/Upscaling/ASR/Runtime/AsrPass.cs | 4 +--- .../ASR/Shaders/shaders/ffxm_fsr2_accumulate_pass_fs.hlsl | 4 +--- .../Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_accumulate.h | 1 - .../Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_reproject.h | 4 ++-- 5 files changed, 7 insertions(+), 9 deletions(-) diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrContext.cs b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrContext.cs index c180165..0d50ed9 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrContext.cs +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrContext.cs @@ -198,6 +198,9 @@ namespace ArmASR commandBuffer.SetRenderTarget(AsrShaderIDs.UavReconstructedPrevNearestDepth); commandBuffer.ClearRenderTarget(false, true, depthInverted ? Color.clear : Color.white); + commandBuffer.SetRenderTarget(AsrShaderIDs.UavNewLocks); + commandBuffer.ClearRenderTarget(false, true, Color.clear); + // Auto exposure SetupSpdConstants(dispatchParams, out var dispatchThreadGroupCount); diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrPass.cs b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrPass.cs index 4ad1628..764e02b 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrPass.cs +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/AsrPass.cs @@ -277,9 +277,7 @@ namespace ArmASR commandBuffer.SetGlobalTexture(AsrShaderIDs.SrvAutoExposure, Resources.AutoExposure[frameIndex]); commandBuffer.SetGlobalTexture(AsrShaderIDs.SrvLumaHistory, Resources.LumaHistory[frameIndex ^ 1]); commandBuffer.SetGlobalTexture(AsrShaderIDs.SrvInternalTemporalReactive, Resources.InternalReactive[frameIndex ^ 1]); - - // UAV binding in fragment shader, index needs to match the register binding in HLSL - commandBuffer.SetRandomWriteTarget(4, AsrShaderIDs.UavNewLocks); + commandBuffer.SetGlobalTexture(AsrShaderIDs.SrvNewLocks, AsrShaderIDs.UavNewLocks); if (ContextDescription.Variant == Asr.Variant.Quality) { diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_accumulate_pass_fs.hlsl b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_accumulate_pass_fs.hlsl index e3ba114..8c23aab 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_accumulate_pass_fs.hlsl +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/ffxm_fsr2_accumulate_pass_fs.hlsl @@ -35,8 +35,7 @@ #define FSR2_BIND_SRV_AUTO_EXPOSURE 9 #define FSR2_BIND_SRV_LUMA_HISTORY 10 #define FSR2_BIND_SRV_TEMPORAL_REACTIVE 11 - -#define FSR2_BIND_UAV_NEW_LOCKS 4 +#define FSR2_BIND_SRV_NEW_LOCKS 12 #define FSR2_BIND_CB_FSR2 0 @@ -60,7 +59,6 @@ #pragma PSSL_target_output_format(target 0 FMT_FP16_ABGR) #pragma PSSL_target_output_format(target 1 FMT_FP16_ABGR) #pragma PSSL_target_output_format(target 2 FMT_FP16_ABGR) -#pragma PSSL_target_output_format(target 4 FMT_32_R) #endif struct AccumulateOutputsFS diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_accumulate.h b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_accumulate.h index 73404b5..35769f0 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_accumulate.h +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_accumulate.h @@ -372,7 +372,6 @@ AccumulateOutputs Accumulate(FfxInt32x2 iPxHrPos) #if FFXM_FSR2_OPTION_APPLY_SHARPENING == 0 results.fColor = fHistoryColor; #endif - //StoreNewLocks(iPxHrPos, 0); return results; } diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_reproject.h b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_reproject.h index 752a39a..b6d20b6 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_reproject.h +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Shaders/shaders/fsr2/ffxm_fsr2_reproject.h @@ -331,7 +331,7 @@ void ReprojectHistoryColor(const AccumulationPassCommonParams params, FFXM_PARAM LockState ReprojectHistoryLockStatus(const AccumulationPassCommonParams params, FFXM_PARAMETER_OUT FfxFloat32x2 fReprojectedLockStatus) { LockState state = { FFXM_FALSE, FFXM_FALSE }; - const FfxFloat32 fNewLockIntensity = LoadRwNewLocks(params.iPxHrPos); + const FfxFloat32 fNewLockIntensity = LoadNewLocks(params.iPxHrPos); state.NewLock = fNewLockIntensity > (127.0f / 255.0f); FfxFloat32 fInPlaceLockLifetime = state.NewLock ? fNewLockIntensity : 0; @@ -368,7 +368,7 @@ void ReprojectHistoryColor(const AccumulationPassCommonParams params, FFXM_PARAM LockState ReprojectHistoryLockStatus(const AccumulationPassCommonParams params, FFXM_PARAMETER_OUT FfxFloat16x2 fReprojectedLockStatus) { LockState state = { FFXM_FALSE, FFXM_FALSE }; - const FfxFloat16 fNewLockIntensity = FfxFloat16(LoadRwNewLocks(params.iPxHrPos)); + const FfxFloat16 fNewLockIntensity = FfxFloat16(LoadNewLocks(params.iPxHrPos)); state.NewLock = fNewLockIntensity > (127.0f / 255.0f); FfxFloat16 fInPlaceLockLifetime = state.NewLock ? fNewLockIntensity : FfxFloat16(0); From 3293533bf9d8d9327ccf4f2cce9c347d0c816c3f Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Tue, 25 Mar 2025 14:57:04 +0100 Subject: [PATCH 14/14] Minor: print the ASR variant to the log when creating the context, makes for easier readback of the log --- .../PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/Asr.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/Asr.cs b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/Asr.cs index 1074a9c..c9a5511 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/Asr.cs +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/Upscaling/ASR/Runtime/Asr.cs @@ -44,7 +44,7 @@ namespace ArmASR flags |= InitializationFlags.EnableDebugChecking; #endif - Debug.Log($"Setting up ASR with render size: {maxRenderSize.x}x{maxRenderSize.y}, display size: {displaySize.x}x{displaySize.y}, flags: {flags}"); + Debug.Log($"Setting up ASR {variant} with render size: {maxRenderSize.x}x{maxRenderSize.y}, display size: {displaySize.x}x{displaySize.y}, flags: {flags}"); var contextDescription = new ContextDescription {