Browse Source

Further generalized SPD constants and setup

framework
Nico de Poel 2 years ago
parent
commit
74a127a40d
  1. 21
      Runtime/Common/FfxSpd.cs
  2. 4
      Runtime/FSR2/Fsr2.cs
  3. 8
      Runtime/FSR2/Fsr2Context.cs
  4. 4
      Runtime/FSR3/Fsr3Upscaler.cs
  5. 8
      Runtime/FSR3/Fsr3UpscalerContext.cs

21
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;
}
}
}

4
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;
}

8
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;
}

4
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;
}

8
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;
}

Loading…
Cancel
Save