Browse Source

Cache and reuse dispatch description object, as it is a class and will generate a lot of garbage when reallocated every frame.

master
Nico de Poel 2 years ago
parent
commit
1f51b7c075
  1. 52
      com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/Upscalers/FSR3UpscalerPlugin.cs

52
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; private FSR2CommandExecutionData _executeData;
public override ref FSR2CommandExecutionData executeData => ref _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) 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.EnableAutoExposure)) flags |= Fsr3Upscaler.InitializationFlags.EnableAutoExposure;
if (initSettings.GetFlag(FfxFsr2InitializationFlags.EnableDynamicResolution)) flags |= Fsr3Upscaler.InitializationFlags.EnableDynamicResolution; 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 _context.Create(new Fsr3Upscaler.ContextDescription
{ {
DisplaySize = new Vector2Int((int)initSettings.displaySizeWidth, (int)initSettings.displaySizeHeight), 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) 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);
} }
} }
} }
Loading…
Cancel
Save