From 1f51b7c07547dcf27d217e96076f221973b32bcf Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Wed, 5 Jun 2024 14:18:42 +0200 Subject: [PATCH] Cache and reuse dispatch description object, as it is a class and will generate a lot of garbage when reallocated every frame. --- .../Upscalers/FSR3UpscalerPlugin.cs | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/Upscalers/FSR3UpscalerPlugin.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/Upscalers/FSR3UpscalerPlugin.cs index 3655235a..e16180cb 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/Upscalers/FSR3UpscalerPlugin.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/Upscalers/FSR3UpscalerPlugin.cs @@ -121,7 +121,8 @@ namespace UnityEngine.Rendering.HighDefinition.AMD.FSR3 private FSR2CommandExecutionData _executeData; public override ref FSR2CommandExecutionData executeData => ref _executeData; - private readonly Fsr3UpscalerContext _context = new Fsr3UpscalerContext(); + private readonly Fsr3UpscalerContext _context = new(); + private readonly Fsr3Upscaler.DispatchDescription _dispatchDescription = new(); internal void Init(in FSR2CommandInitializationData initSettings, Fsr3UpscalerAssets assets) { @@ -136,6 +137,8 @@ namespace UnityEngine.Rendering.HighDefinition.AMD.FSR3 if (initSettings.GetFlag(FfxFsr2InitializationFlags.EnableAutoExposure)) flags |= Fsr3Upscaler.InitializationFlags.EnableAutoExposure; if (initSettings.GetFlag(FfxFsr2InitializationFlags.EnableDynamicResolution)) flags |= Fsr3Upscaler.InitializationFlags.EnableDynamicResolution; + //Debug.Log($"Initializing FSR3 with max render size: {initSettings.maxRenderSizeWidth}x{initSettings.maxRenderSizeHeight}, display size: {initSettings.displaySizeWidth}x{initSettings.displaySizeHeight}, flags: {flags}"); + _context.Create(new Fsr3Upscaler.ContextDescription { DisplaySize = new Vector2Int((int)initSettings.displaySizeWidth, (int)initSettings.displaySizeHeight), @@ -155,32 +158,29 @@ namespace UnityEngine.Rendering.HighDefinition.AMD.FSR3 internal void Draw(CommandBuffer cmd, in FSR2TextureTable textures) { - var dispatchDescription = new Fsr3Upscaler.DispatchDescription - { - Color = new ResourceView(textures.colorInput), - Depth = new ResourceView(textures.depth), - MotionVectors = new ResourceView(textures.motionVectors), - Exposure = new ResourceView(textures.exposureTexture), - Reactive = new ResourceView(textures.biasColorMask), - TransparencyAndComposition = new ResourceView(textures.transparencyMask), - Output = new ResourceView(textures.colorOutput), - - JitterOffset = new Vector2(_executeData.jitterOffsetX, _executeData.jitterOffsetY), - MotionVectorScale = new Vector2(_executeData.MVScaleX, _executeData.MVScaleY), - RenderSize = new Vector2Int((int)_executeData.renderSizeWidth, (int)_executeData.renderSizeHeight), - InputResourceSize = new Vector2Int((int)_executeData.renderSizeWidth, (int)_executeData.renderSizeHeight), - EnableSharpening = _executeData.enableSharpening != 0, - Sharpness = _executeData.sharpness, - FrameTimeDelta = _executeData.frameTimeDelta / 1000f, - PreExposure = _executeData.preExposure, - Reset = _executeData.reset != 0, - CameraNear = _executeData.cameraNear, - CameraFar = _executeData.cameraFar, - CameraFovAngleVertical = _executeData.cameraFovAngleVertical, - ViewSpaceToMetersFactor = 1.0f, // 1 unit is 1 meter in Unity - }; + _dispatchDescription.Color = new ResourceView(textures.colorInput); + _dispatchDescription.Depth = new ResourceView(textures.depth); + _dispatchDescription.MotionVectors = new ResourceView(textures.motionVectors); + _dispatchDescription.Exposure = new ResourceView(textures.exposureTexture); + _dispatchDescription.Reactive = new ResourceView(textures.biasColorMask); + _dispatchDescription.TransparencyAndComposition = new ResourceView(textures.transparencyMask); + _dispatchDescription.Output = new ResourceView(textures.colorOutput); + + _dispatchDescription.JitterOffset = new Vector2(_executeData.jitterOffsetX, _executeData.jitterOffsetY); + _dispatchDescription.MotionVectorScale = new Vector2(_executeData.MVScaleX, _executeData.MVScaleY); + _dispatchDescription.RenderSize = new Vector2Int((int)_executeData.renderSizeWidth, (int)_executeData.renderSizeHeight); + _dispatchDescription.InputResourceSize = new Vector2Int((int)_executeData.renderSizeWidth, (int)_executeData.renderSizeHeight); + _dispatchDescription.EnableSharpening = _executeData.enableSharpening != 0; + _dispatchDescription.Sharpness = _executeData.sharpness; + _dispatchDescription.FrameTimeDelta = _executeData.frameTimeDelta / 1000f; + _dispatchDescription.PreExposure = _executeData.preExposure; + _dispatchDescription.Reset = _executeData.reset != 0; + _dispatchDescription.CameraNear = _executeData.cameraNear; + _dispatchDescription.CameraFar = _executeData.cameraFar; + _dispatchDescription.CameraFovAngleVertical = _executeData.cameraFovAngleVertical; + _dispatchDescription.ViewSpaceToMetersFactor = 1.0f; // 1 unit is 1 meter in Unity - _context.Dispatch(dispatchDescription, cmd); + _context.Dispatch(_dispatchDescription, cmd); } } }