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;
using System.Runtime.InteropServices;
using UnityEngine; using UnityEngine;
namespace FidelityFX namespace FidelityFX
{ {
public static class FfxSpd 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) 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); 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); 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)] [Serializable, StructLayout(LayoutKind.Sequential)]
internal struct SpdConstants internal struct SpdConstants
{ {
public uint mips;
public uint numWorkGroups;
public uint workGroupOffsetX, workGroupOffsetY;
public FfxSpd.SpdConstants spd;
public uint renderSizeX, renderSizeY; 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) 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 // Downsample
ref Fsr2.SpdConstants spdConstants = ref _spdConstants.Value; 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.renderSizeX = (uint)dispatchParams.RenderSize.x;
spdConstants.renderSizeY = (uint)dispatchParams.RenderSize.y; spdConstants.renderSizeY = (uint)dispatchParams.RenderSize.y;
} }

4
Runtime/FSR3/Fsr3Upscaler.cs

@ -225,9 +225,7 @@ namespace FidelityFX.FSR3
[Serializable, StructLayout(LayoutKind.Sequential)] [Serializable, StructLayout(LayoutKind.Sequential)]
internal struct SpdConstants internal struct SpdConstants
{ {
public uint mips;
public uint numWorkGroups;
public uint workGroupOffsetX, workGroupOffsetY;
public FfxSpd.SpdConstants spd;
public uint renderSizeX, renderSizeY; 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) 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 // Downsample
ref Fsr3Upscaler.SpdConstants spdConstants = ref _spdConstants.Value; 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.renderSizeX = (uint)dispatchParams.RenderSize.x;
spdConstants.renderSizeY = (uint)dispatchParams.RenderSize.y; spdConstants.renderSizeY = (uint)dispatchParams.RenderSize.y;
} }

Loading…
Cancel
Save