From 2e67acb8596171a6396c08144e51bdc92d9b9c52 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Tue, 6 Jun 2023 20:04:55 +0200 Subject: [PATCH] Eliminated unnecessary blit to an intermediate temp RT by allowing PPV2 screen space RTs to be created with random write access. This way FSR2 can output directly to the PPV2 effects chain. --- .../Runtime/Effects/SuperResolution.cs | 14 +++++--------- .../PostProcessing/Runtime/PostProcessLayer.cs | 2 +- .../Runtime/PostProcessRenderContext.cs | 6 +++++- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/SuperResolution.cs b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/SuperResolution.cs index e80ab93..a6a9f0c 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/SuperResolution.cs +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/Effects/SuperResolution.cs @@ -107,7 +107,7 @@ namespace UnityEngine.Rendering.PostProcessing private Fsr2Context _fsrContext; private Vector2Int _renderSize; private Vector2Int _displaySize; - private bool _reset; + private bool _resetHistory; private IFsr2Callbacks _callbacks; private float _appliedBiasOffset; @@ -138,7 +138,7 @@ namespace UnityEngine.Rendering.PostProcessing public void ResetHistory() { - _reset = true; + _resetHistory = true; } public void ConfigureJitteredProjectionMatrix(PostProcessRenderContext context) @@ -192,15 +192,11 @@ namespace UnityEngine.Rendering.PostProcessing _dispatchDescription.Reactive = Fsr2ShaderIDs.UavAutoReactive; } - cmd.GetTemporaryRT(Fsr2ShaderIDs.UavUpscaledOutput, _displaySize.x, _displaySize.y, 0, default, context.sourceFormat, default, 1, true); - _fsrContext.Dispatch(_dispatchDescription, cmd); - cmd.BlitFullscreenTriangle(Fsr2ShaderIDs.UavUpscaledOutput, context.destination); - cmd.ReleaseTemporaryRT(Fsr2ShaderIDs.UavUpscaledOutput); cmd.EndSample("FSR2"); - _reset = false; + _resetHistory = false; } private void CreateFsrContext(PostProcessRenderContext context) @@ -282,7 +278,7 @@ namespace UnityEngine.Rendering.PostProcessing if (reactiveMask != null) _dispatchDescription.Reactive = reactiveMask; if (transparencyAndCompositionMask != null) _dispatchDescription.TransparencyAndComposition = transparencyAndCompositionMask; - _dispatchDescription.Output = null; + _dispatchDescription.Output = context.destination; _dispatchDescription.PreExposure = preExposure; _dispatchDescription.EnableSharpening = performSharpenPass; _dispatchDescription.Sharpness = sharpness; @@ -295,7 +291,7 @@ namespace UnityEngine.Rendering.PostProcessing _dispatchDescription.CameraFar = camera.farClipPlane; _dispatchDescription.CameraFovAngleVertical = camera.fieldOfView * Mathf.Deg2Rad; _dispatchDescription.ViewSpaceToMetersFactor = 1.0f; // 1 unit is 1 meter in Unity - _dispatchDescription.Reset = _reset; + _dispatchDescription.Reset = _resetHistory; _dispatchDescription.EnableAutoReactive = autoGenerateTransparencyAndComposition; if (autoGenerateTransparencyAndComposition) diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/PostProcessLayer.cs b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/PostProcessLayer.cs index 1b3ac4b..b01f276 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/PostProcessLayer.cs +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/PostProcessLayer.cs @@ -1181,7 +1181,7 @@ namespace UnityEngine.Rendering.PostProcessing var fsrTarget = m_TargetPool.Get(); var finalDestination = context.destination; - context.GetScreenSpaceTemporaryRT(cmd, fsrTarget, 0, context.sourceFormat); + context.GetScreenSpaceTemporaryRT(cmd, fsrTarget, 0, context.sourceFormat, enableRandomWrite: true); context.destination = fsrTarget; superResolution.colorOpaqueOnly = m_opaqueOnly; superResolution.Render(context); diff --git a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/PostProcessRenderContext.cs b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/PostProcessRenderContext.cs index 76db951..bc6f560 100644 --- a/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/PostProcessRenderContext.cs +++ b/Packages/com.unity.postprocessing@3.2.2/PostProcessing/Runtime/PostProcessRenderContext.cs @@ -372,9 +372,10 @@ namespace UnityEngine.Rendering.PostProcessing /// The texture filtering mode /// Override the display width; use 0 to disable the override /// Override the display height; use 0 to disable the override + /// Enable random access write into this render texture public void GetScreenSpaceTemporaryRT(CommandBuffer cmd, int nameID, int depthBufferBits = 0, RenderTextureFormat colorFormat = RenderTextureFormat.Default, RenderTextureReadWrite readWrite = RenderTextureReadWrite.Default, - FilterMode filter = FilterMode.Bilinear, int widthOverride = 0, int heightOverride = 0) + FilterMode filter = FilterMode.Bilinear, int widthOverride = 0, int heightOverride = 0, bool enableRandomWrite = false) { var desc = GetDescriptor(depthBufferBits, colorFormat, readWrite); if (widthOverride > 0) @@ -386,6 +387,9 @@ namespace UnityEngine.Rendering.PostProcessing if (stereoActive && desc.dimension == Rendering.TextureDimension.Tex2DArray) desc.dimension = Rendering.TextureDimension.Tex2D; + if (enableRandomWrite) + desc.enableRandomWrite = true; + #if UNITY_2019_1_OR_NEWER cmd.GetTemporaryRT(nameID, desc, filter); #elif UNITY_2017_3_OR_NEWER