From 74a127a40dcd04e7c81f1369da1388629d09a053 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Sat, 3 Aug 2024 17:41:10 +0200 Subject: [PATCH] Further generalized SPD constants and setup --- Runtime/Common/FfxSpd.cs | 21 +++++++++++++++++++++ Runtime/FSR2/Fsr2.cs | 4 +--- Runtime/FSR2/Fsr2Context.cs | 8 +------- Runtime/FSR3/Fsr3Upscaler.cs | 4 +--- Runtime/FSR3/Fsr3UpscalerContext.cs | 8 +------- 5 files changed, 25 insertions(+), 20 deletions(-) diff --git a/Runtime/Common/FfxSpd.cs b/Runtime/Common/FfxSpd.cs index 41882ac..cd2138e 100644 --- a/Runtime/Common/FfxSpd.cs +++ b/Runtime/Common/FfxSpd.cs @@ -1,10 +1,22 @@ using System; +using System.Runtime.InteropServices; using UnityEngine; namespace FidelityFX { public static class FfxSpd { + public static void SetupSpdConstants(Vector2Int resolution, ref SpdConstants spdConstants, out Vector2Int dispatchThreadGroupCount, int mips = -1) + { + RectInt rectInfo = new RectInt(0, 0, resolution.x, resolution.y); + SpdSetup(rectInfo, out dispatchThreadGroupCount, out Vector2Int workGroupOffset, out Vector2Int numWorkGroupsAndMips, mips); + + spdConstants.numWorkGroups = (uint)numWorkGroupsAndMips.x; + spdConstants.mips = (uint)numWorkGroupsAndMips.y; + spdConstants.workGroupOffsetX = (uint)workGroupOffset.x; + spdConstants.workGroupOffsetY = (uint)workGroupOffset.y; + } + public static void SpdSetup(RectInt rectInfo, out Vector2Int dispatchThreadGroupCount, out Vector2Int workGroupOffset, out Vector2Int numWorkGroupsAndMips, int mips = -1) { workGroupOffset = new Vector2Int(rectInfo.x / 64, rectInfo.y / 64); @@ -21,5 +33,14 @@ namespace FidelityFX numWorkGroupsAndMips.y = Math.Min(Mathf.FloorToInt(Mathf.Log(resolution, 2.0f)), 12); } } + + [Serializable, StructLayout(LayoutKind.Sequential)] + public struct SpdConstants + { + public uint mips; + public uint numWorkGroups; + public uint workGroupOffsetX; + public uint workGroupOffsetY; + } } } diff --git a/Runtime/FSR2/Fsr2.cs b/Runtime/FSR2/Fsr2.cs index 85dccf4..db979c4 100644 --- a/Runtime/FSR2/Fsr2.cs +++ b/Runtime/FSR2/Fsr2.cs @@ -214,9 +214,7 @@ namespace FidelityFX.FSR2 [Serializable, StructLayout(LayoutKind.Sequential)] internal struct SpdConstants { - public uint mips; - public uint numWorkGroups; - public uint workGroupOffsetX, workGroupOffsetY; + public FfxSpd.SpdConstants spd; public uint renderSizeX, renderSizeY; } diff --git a/Runtime/FSR2/Fsr2Context.cs b/Runtime/FSR2/Fsr2Context.cs index 6a7cf19..af06b52 100644 --- a/Runtime/FSR2/Fsr2Context.cs +++ b/Runtime/FSR2/Fsr2Context.cs @@ -409,15 +409,9 @@ namespace FidelityFX.FSR2 private void SetupSpdConstants(Fsr2.DispatchDescription dispatchParams, out Vector2Int dispatchThreadGroupCount) { - RectInt rectInfo = new RectInt(0, 0, dispatchParams.RenderSize.x, dispatchParams.RenderSize.y); - FfxSpd.SpdSetup(rectInfo, out dispatchThreadGroupCount, out var workGroupOffset, out var numWorkGroupsAndMips); - // Downsample ref Fsr2.SpdConstants spdConstants = ref _spdConstants.Value; - spdConstants.numWorkGroups = (uint)numWorkGroupsAndMips.x; - spdConstants.mips = (uint)numWorkGroupsAndMips.y; - spdConstants.workGroupOffsetX = (uint)workGroupOffset.x; - spdConstants.workGroupOffsetY = (uint)workGroupOffset.y; + FfxSpd.SetupSpdConstants(dispatchParams.RenderSize, ref spdConstants.spd, out dispatchThreadGroupCount); spdConstants.renderSizeX = (uint)dispatchParams.RenderSize.x; spdConstants.renderSizeY = (uint)dispatchParams.RenderSize.y; } diff --git a/Runtime/FSR3/Fsr3Upscaler.cs b/Runtime/FSR3/Fsr3Upscaler.cs index 6547305..20282fb 100644 --- a/Runtime/FSR3/Fsr3Upscaler.cs +++ b/Runtime/FSR3/Fsr3Upscaler.cs @@ -225,9 +225,7 @@ namespace FidelityFX.FSR3 [Serializable, StructLayout(LayoutKind.Sequential)] internal struct SpdConstants { - public uint mips; - public uint numWorkGroups; - public uint workGroupOffsetX, workGroupOffsetY; + public FfxSpd.SpdConstants spd; public uint renderSizeX, renderSizeY; } diff --git a/Runtime/FSR3/Fsr3UpscalerContext.cs b/Runtime/FSR3/Fsr3UpscalerContext.cs index 3cda429..8c5b4c3 100644 --- a/Runtime/FSR3/Fsr3UpscalerContext.cs +++ b/Runtime/FSR3/Fsr3UpscalerContext.cs @@ -446,15 +446,9 @@ namespace FidelityFX.FSR3 private void SetupSpdConstants(Fsr3Upscaler.DispatchDescription dispatchParams, out Vector2Int dispatchThreadGroupCount) { - RectInt rectInfo = new RectInt(0, 0, dispatchParams.RenderSize.x, dispatchParams.RenderSize.y); - FfxSpd.SpdSetup(rectInfo, out dispatchThreadGroupCount, out var workGroupOffset, out var numWorkGroupsAndMips); - // Downsample ref Fsr3Upscaler.SpdConstants spdConstants = ref _spdConstants.Value; - spdConstants.numWorkGroups = (uint)numWorkGroupsAndMips.x; - spdConstants.mips = (uint)numWorkGroupsAndMips.y; - spdConstants.workGroupOffsetX = (uint)workGroupOffset.x; - spdConstants.workGroupOffsetY = (uint)workGroupOffset.y; + FfxSpd.SetupSpdConstants(dispatchParams.RenderSize, ref spdConstants.spd, out dispatchThreadGroupCount); spdConstants.renderSizeX = (uint)dispatchParams.RenderSize.x; spdConstants.renderSizeY = (uint)dispatchParams.RenderSize.y; }