@ -65,71 +65,71 @@ namespace FidelityFX.FSR2
maximumBias [ i ] = MaximumBias [ i ] / 2.0f ;
maximumBias [ i ] = MaximumBias [ i ] / 2.0f ;
}
}
// Resource FSR3UPSCALER _LanczosLutData: FFX_RESOURCE_USAGE_READ_ONLY, FFX_SURFACE_FORMAT_R16_SNORM, FFX_RESOURCE_FLAGS_NONE
// Resource FSR2 _LanczosLutData: FFX_RESOURCE_USAGE_READ_ONLY, FFX_SURFACE_FORMAT_R16_SNORM, FFX_RESOURCE_FLAGS_NONE
// R16_SNorm textures are not supported by Unity on most platforms, strangely enough. So instead we use R32_SFloat and upload pre-normalized float data.
// R16_SNorm textures are not supported by Unity on most platforms, strangely enough. So instead we use R32_SFloat and upload pre-normalized float data.
LanczosLut = new Texture2D ( lanczos2LutWidth , 1 , GraphicsFormat . R32_SFloat , TextureCreationFlags . None ) { name = "FSR3UPSCALER _LanczosLutData" } ;
LanczosLut = new Texture2D ( lanczos2LutWidth , 1 , GraphicsFormat . R32_SFloat , TextureCreationFlags . None ) { name = "FSR2 _LanczosLutData" } ;
LanczosLut . SetPixelData ( lanczos2Weights , 0 ) ;
LanczosLut . SetPixelData ( lanczos2Weights , 0 ) ;
LanczosLut . Apply ( ) ;
LanczosLut . Apply ( ) ;
// Resource FSR3UPSCALER _MaximumUpsampleBias: FFX_RESOURCE_USAGE_READ_ONLY, FFX_SURFACE_FORMAT_R16_SNORM, FFX_RESOURCE_FLAGS_NONE
MaximumBiasLut = new Texture2D ( MaximumBiasTextureWidth , MaximumBiasTextureHeight , GraphicsFormat . R32_SFloat , TextureCreationFlags . None ) { name = "FSR3UPSCALER _MaximumUpsampleBias" } ;
// Resource FSR2 _MaximumUpsampleBias: FFX_RESOURCE_USAGE_READ_ONLY, FFX_SURFACE_FORMAT_R16_SNORM, FFX_RESOURCE_FLAGS_NONE
MaximumBiasLut = new Texture2D ( MaximumBiasTextureWidth , MaximumBiasTextureHeight , GraphicsFormat . R32_SFloat , TextureCreationFlags . None ) { name = "FSR2 _MaximumUpsampleBias" } ;
MaximumBiasLut . SetPixelData ( maximumBias , 0 ) ;
MaximumBiasLut . SetPixelData ( maximumBias , 0 ) ;
MaximumBiasLut . Apply ( ) ;
MaximumBiasLut . Apply ( ) ;
// Resource FSR3UPSCALER _DefaultExposure: FFX_RESOURCE_USAGE_READ_ONLY, FFX_SURFACE_FORMAT_R32G32_FLOAT, FFX_RESOURCE_FLAGS_NONE
DefaultExposure = new Texture2D ( 1 , 1 , GraphicsFormat . R32G32_SFloat , TextureCreationFlags . None ) { name = "FSR3UPSCALER _DefaultExposure" } ;
// Resource FSR2 _DefaultExposure: FFX_RESOURCE_USAGE_READ_ONLY, FFX_SURFACE_FORMAT_R32G32_FLOAT, FFX_RESOURCE_FLAGS_NONE
DefaultExposure = new Texture2D ( 1 , 1 , GraphicsFormat . R32G32_SFloat , TextureCreationFlags . None ) { name = "FSR2 _DefaultExposure" } ;
DefaultExposure . SetPixel ( 0 , 0 , Color . clear ) ;
DefaultExposure . SetPixel ( 0 , 0 , Color . clear ) ;
DefaultExposure . Apply ( ) ;
DefaultExposure . Apply ( ) ;
// Resource FSR3UPSCALER _DefaultReactivityMask: FFX_RESOURCE_USAGE_READ_ONLY, FFX_SURFACE_FORMAT_R8_UNORM, FFX_RESOURCE_FLAGS_NONE
DefaultReactive = new Texture2D ( 1 , 1 , GraphicsFormat . R8_UNorm , TextureCreationFlags . None ) { name = "FSR3UPSCALER _DefaultReactivityMask" } ;
// Resource FSR2 _DefaultReactivityMask: FFX_RESOURCE_USAGE_READ_ONLY, FFX_SURFACE_FORMAT_R8_UNORM, FFX_RESOURCE_FLAGS_NONE
DefaultReactive = new Texture2D ( 1 , 1 , GraphicsFormat . R8_UNorm , TextureCreationFlags . None ) { name = "FSR2 _DefaultReactivityMask" } ;
DefaultReactive . SetPixel ( 0 , 0 , Color . clear ) ;
DefaultReactive . SetPixel ( 0 , 0 , Color . clear ) ;
DefaultReactive . Apply ( ) ;
DefaultReactive . Apply ( ) ;
// Resource FSR3UPSCALER _SpdAtomicCounter: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R32_UINT, FFX_RESOURCE_FLAGS_ALIASABLE
// Despite what the original FSR3 codebase says, this resource really isn't aliasable. Resetting this counter to 0 every frame breaks auto-exposure on MacOS Metal.
SpdAtomicCounter = new RenderTexture ( 1 , 1 , 0 , GraphicsFormat . R32_UInt ) { name = "FSR3UPSCALER _SpdAtomicCounter" , enableRandomWrite = true } ;
// Resource FSR2 _SpdAtomicCounter: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R32_UINT, FFX_RESOURCE_FLAGS_ALIASABLE
// Despite what the original FSR2 codebase says, this resource really isn't aliasable. Resetting this counter to 0 every frame breaks auto-exposure on MacOS Metal.
SpdAtomicCounter = new RenderTexture ( 1 , 1 , 0 , GraphicsFormat . R32_UInt ) { name = "FSR2 _SpdAtomicCounter" , enableRandomWrite = true } ;
SpdAtomicCounter . Create ( ) ;
SpdAtomicCounter . Create ( ) ;
// Resource FSR3UPSCALER _AutoExposure: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R32G32_FLOAT, FFX_RESOURCE_FLAGS_NONE
AutoExposure = new RenderTexture ( 1 , 1 , 0 , GraphicsFormat . R32G32_SFloat ) { name = "FSR3UPSCALER _AutoExposure" , enableRandomWrite = true } ;
// Resource FSR2 _AutoExposure: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R32G32_FLOAT, FFX_RESOURCE_FLAGS_NONE
AutoExposure = new RenderTexture ( 1 , 1 , 0 , GraphicsFormat . R32G32_SFloat ) { name = "FSR2 _AutoExposure" , enableRandomWrite = true } ;
AutoExposure . Create ( ) ;
AutoExposure . Create ( ) ;
// Resource FSR3UPSCALER _ExposureMips: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16_FLOAT, FFX_RESOURCE_FLAGS_ALIASABLE
// Resource FSR2 _ExposureMips: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16_FLOAT, FFX_RESOURCE_FLAGS_ALIASABLE
// This is a rather special case: it's an aliasable resource, but because we require a mipmap chain and bind specific mip levels per shader, we can't easily use temporary RTs for this.
// This is a rather special case: it's an aliasable resource, but because we require a mipmap chain and bind specific mip levels per shader, we can't easily use temporary RTs for this.
int w = contextDescription . MaxRenderSize . x / 2 , h = contextDescription . MaxRenderSize . y / 2 ;
int w = contextDescription . MaxRenderSize . x / 2 , h = contextDescription . MaxRenderSize . y / 2 ;
int mipCount = 1 + Mathf . FloorToInt ( Mathf . Log ( Math . Max ( w , h ) , 2.0f ) ) ;
int mipCount = 1 + Mathf . FloorToInt ( Mathf . Log ( Math . Max ( w , h ) , 2.0f ) ) ;
SceneLuminance = new RenderTexture ( w , h , 0 , GraphicsFormat . R16_SFloat , mipCount ) { name = "FSR3UPSCALER _ExposureMips" , enableRandomWrite = true , useMipMap = true , autoGenerateMips = false } ;
SceneLuminance = new RenderTexture ( w , h , 0 , GraphicsFormat . R16_SFloat , mipCount ) { name = "FSR2 _ExposureMips" , enableRandomWrite = true , useMipMap = true , autoGenerateMips = false } ;
SceneLuminance . Create ( ) ;
SceneLuminance . Create ( ) ;
// Resources FSR3UPSCALER _InternalDilatedVelocity1/2: FFX_RESOURCE_USAGE_RENDERTARGET | FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16G16_FLOAT, FFX_RESOURCE_FLAGS_NONE
CreateDoubleBufferedResource ( DilatedMotionVectors , "FSR3UPSCALER _InternalDilatedVelocity" , contextDescription . MaxRenderSize , GraphicsFormat . R16G16_SFloat ) ;
// Resources FSR2 _InternalDilatedVelocity1/2: FFX_RESOURCE_USAGE_RENDERTARGET | FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16G16_FLOAT, FFX_RESOURCE_FLAGS_NONE
CreateDoubleBufferedResource ( DilatedMotionVectors , "FSR2 _InternalDilatedVelocity" , contextDescription . MaxRenderSize , GraphicsFormat . R16G16_SFloat ) ;
// Resources FSR3UPSCALER _LockStatus1/2: FFX_RESOURCE_USAGE_RENDERTARGET | FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16G16_FLOAT, FFX_RESOURCE_FLAGS_NONE
CreateDoubleBufferedResource ( LockStatus , "FSR3UPSCALER _LockStatus" , contextDescription . DisplaySize , GraphicsFormat . R16G16_SFloat ) ;
// Resources FSR2 _LockStatus1/2: FFX_RESOURCE_USAGE_RENDERTARGET | FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16G16_FLOAT, FFX_RESOURCE_FLAGS_NONE
CreateDoubleBufferedResource ( LockStatus , "FSR2 _LockStatus" , contextDescription . DisplaySize , GraphicsFormat . R16G16_SFloat ) ;
// Resources FSR3UPSCALER _InternalUpscaled1/2: FFX_RESOURCE_USAGE_RENDERTARGET | FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16G16B16A16_FLOAT, FFX_RESOURCE_FLAGS_NONE
CreateDoubleBufferedResource ( InternalUpscaled , "FSR3UPSCALER _InternalUpscaled" , contextDescription . DisplaySize , GraphicsFormat . R16G16B16A16_SFloat ) ;
// Resources FSR2 _InternalUpscaled1/2: FFX_RESOURCE_USAGE_RENDERTARGET | FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16G16B16A16_FLOAT, FFX_RESOURCE_FLAGS_NONE
CreateDoubleBufferedResource ( InternalUpscaled , "FSR2 _InternalUpscaled" , contextDescription . DisplaySize , GraphicsFormat . R16G16B16A16_SFloat ) ;
// Resources FSR3UPSCALER _LumaHistory1/2: FFX_RESOURCE_USAGE_RENDERTARGET | FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R8G8B8A8_UNORM, FFX_RESOURCE_FLAGS_NONE
CreateDoubleBufferedResource ( LumaHistory , "FSR3UPSCALER _LumaHistory" , contextDescription . DisplaySize , GraphicsFormat . R8G8B8A8_UNorm ) ;
// Resources FSR2 _LumaHistory1/2: FFX_RESOURCE_USAGE_RENDERTARGET | FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R8G8B8A8_UNORM, FFX_RESOURCE_FLAGS_NONE
CreateDoubleBufferedResource ( LumaHistory , "FSR2 _LumaHistory" , contextDescription . DisplaySize , GraphicsFormat . R8G8B8A8_UNorm ) ;
}
}
public void CreateTcrAutogenResources ( Fsr2 . ContextDescription contextDescription )
public void CreateTcrAutogenResources ( Fsr2 . ContextDescription contextDescription )
{
{
// Resource FSR3UPSCALER _AutoReactive: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R8_UNORM, FFX_RESOURCE_FLAGS_NONE
AutoReactive = new RenderTexture ( contextDescription . MaxRenderSize . x , contextDescription . MaxRenderSize . y , 0 , GraphicsFormat . R8_UNorm ) { name = "FSR3UPSCALER _AutoReactive" , enableRandomWrite = true } ;
// Resource FSR2 _AutoReactive: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R8_UNORM, FFX_RESOURCE_FLAGS_NONE
AutoReactive = new RenderTexture ( contextDescription . MaxRenderSize . x , contextDescription . MaxRenderSize . y , 0 , GraphicsFormat . R8_UNorm ) { name = "FSR2 _AutoReactive" , enableRandomWrite = true } ;
AutoReactive . Create ( ) ;
AutoReactive . Create ( ) ;
// Resource FSR3UPSCALER _AutoComposition: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R8_UNORM, FFX_RESOURCE_FLAGS_NONE
AutoComposition = new RenderTexture ( contextDescription . MaxRenderSize . x , contextDescription . MaxRenderSize . y , 0 , GraphicsFormat . R8_UNorm ) { name = "FSR3UPSCALER _AutoComposition" , enableRandomWrite = true } ;
// Resource FSR2 _AutoComposition: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R8_UNORM, FFX_RESOURCE_FLAGS_NONE
AutoComposition = new RenderTexture ( contextDescription . MaxRenderSize . x , contextDescription . MaxRenderSize . y , 0 , GraphicsFormat . R8_UNorm ) { name = "FSR2 _AutoComposition" , enableRandomWrite = true } ;
AutoComposition . Create ( ) ;
AutoComposition . Create ( ) ;
// Resources FSR3UPSCALER _PrevPreAlpha0/1: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R11G11B10_FLOAT, FFX_RESOURCE_FLAGS_NONE
CreateDoubleBufferedResource ( PrevPreAlpha , "FSR3UPSCALER _PrevPreAlpha" , contextDescription . MaxRenderSize , GraphicsFormat . B10G11R11_UFloatPack32 ) ;
// Resources FSR2 _PrevPreAlpha0/1: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R11G11B10_FLOAT, FFX_RESOURCE_FLAGS_NONE
CreateDoubleBufferedResource ( PrevPreAlpha , "FSR2 _PrevPreAlpha" , contextDescription . MaxRenderSize , GraphicsFormat . B10G11R11_UFloatPack32 ) ;
// Resources FSR3UPSCALER _PrevPostAlpha0/1: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R11G11B10_FLOAT, FFX_RESOURCE_FLAGS_NONE
CreateDoubleBufferedResource ( PrevPostAlpha , "FSR3UPSCALER _PrevPostAlpha" , contextDescription . MaxRenderSize , GraphicsFormat . B10G11R11_UFloatPack32 ) ;
// Resources FSR2 _PrevPostAlpha0/1: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R11G11B10_FLOAT, FFX_RESOURCE_FLAGS_NONE
CreateDoubleBufferedResource ( PrevPostAlpha , "FSR2 _PrevPostAlpha" , contextDescription . MaxRenderSize , GraphicsFormat . B10G11R11_UFloatPack32 ) ;
}
}
// Set up shared aliasable resources, i.e. temporary render textures
// Set up shared aliasable resources, i.e. temporary render textures
@ -139,22 +139,22 @@ namespace FidelityFX.FSR2
Vector2Int displaySize = contextDescription . DisplaySize ;
Vector2Int displaySize = contextDescription . DisplaySize ;
Vector2Int maxRenderSize = contextDescription . MaxRenderSize ;
Vector2Int maxRenderSize = contextDescription . MaxRenderSize ;
// FSR3UPSCALER _ReconstructedPrevNearestDepth: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R32_UINT, FFX_RESOURCE_FLAGS_ALIASABLE
// FSR2 _ReconstructedPrevNearestDepth: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R32_UINT, FFX_RESOURCE_FLAGS_ALIASABLE
commandBuffer . GetTemporaryRT ( Fsr2ShaderIDs . UavReconstructedPrevNearestDepth , maxRenderSize . x , maxRenderSize . y , 0 , default , GraphicsFormat . R32_UInt , 1 , true ) ;
commandBuffer . GetTemporaryRT ( Fsr2ShaderIDs . UavReconstructedPrevNearestDepth , maxRenderSize . x , maxRenderSize . y , 0 , default , GraphicsFormat . R32_UInt , 1 , true ) ;
// FSR3UPSCALER _DilatedDepth: FFX_RESOURCE_USAGE_RENDERTARGET | FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R32_FLOAT, FFX_RESOURCE_FLAGS_ALIASABLE
// FSR2 _DilatedDepth: FFX_RESOURCE_USAGE_RENDERTARGET | FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R32_FLOAT, FFX_RESOURCE_FLAGS_ALIASABLE
commandBuffer . GetTemporaryRT ( Fsr2ShaderIDs . UavDilatedDepth , maxRenderSize . x , maxRenderSize . y , 0 , default , GraphicsFormat . R32_SFloat , 1 , true ) ;
commandBuffer . GetTemporaryRT ( Fsr2ShaderIDs . UavDilatedDepth , maxRenderSize . x , maxRenderSize . y , 0 , default , GraphicsFormat . R32_SFloat , 1 , true ) ;
// FSR3UPSCALER _LockInputLuma: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16_FLOAT, FFX_RESOURCE_FLAGS_ALIASABLE
// FSR2 _LockInputLuma: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16_FLOAT, FFX_RESOURCE_FLAGS_ALIASABLE
commandBuffer . GetTemporaryRT ( Fsr2ShaderIDs . UavLockInputLuma , maxRenderSize . x , maxRenderSize . y , 0 , default , GraphicsFormat . R16_SFloat , 1 , true ) ;
commandBuffer . GetTemporaryRT ( Fsr2ShaderIDs . UavLockInputLuma , maxRenderSize . x , maxRenderSize . y , 0 , default , GraphicsFormat . R16_SFloat , 1 , true ) ;
// FSR3UPSCALER _DilatedReactiveMasks: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R8G8_UNORM, FFX_RESOURCE_FLAGS_ALIASABLE
// FSR2 _DilatedReactiveMasks: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R8G8_UNORM, FFX_RESOURCE_FLAGS_ALIASABLE
commandBuffer . GetTemporaryRT ( Fsr2ShaderIDs . UavDilatedReactiveMasks , maxRenderSize . x , maxRenderSize . y , 0 , default , GraphicsFormat . R8G8_UNorm , 1 , true ) ;
commandBuffer . GetTemporaryRT ( Fsr2ShaderIDs . UavDilatedReactiveMasks , maxRenderSize . x , maxRenderSize . y , 0 , default , GraphicsFormat . R8G8_UNorm , 1 , true ) ;
// FSR3UPSCALER _PreparedInputColor: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16G16B16A16_FLOAT, FFX_RESOURCE_FLAGS_ALIASABLE
// FSR2 _PreparedInputColor: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R16G16B16A16_FLOAT, FFX_RESOURCE_FLAGS_ALIASABLE
commandBuffer . GetTemporaryRT ( Fsr2ShaderIDs . UavPreparedInputColor , maxRenderSize . x , maxRenderSize . y , 0 , default , GraphicsFormat . R16G16B16A16_SFloat , 1 , true ) ;
commandBuffer . GetTemporaryRT ( Fsr2ShaderIDs . UavPreparedInputColor , maxRenderSize . x , maxRenderSize . y , 0 , default , GraphicsFormat . R16G16B16A16_SFloat , 1 , true ) ;
// FSR3UPSCALER _NewLocks: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R8_UNORM, FFX_RESOURCE_FLAGS_ALIASABLE
// FSR2 _NewLocks: FFX_RESOURCE_USAGE_UAV, FFX_SURFACE_FORMAT_R8_UNORM, FFX_RESOURCE_FLAGS_ALIASABLE
commandBuffer . GetTemporaryRT ( Fsr2ShaderIDs . UavNewLocks , displaySize . x , displaySize . y , 0 , default , GraphicsFormat . R8_UNorm , 1 , true ) ;
commandBuffer . GetTemporaryRT ( Fsr2ShaderIDs . UavNewLocks , displaySize . x , displaySize . y , 0 , default , GraphicsFormat . R8_UNorm , 1 , true ) ;
}
}