163 lines
4.5 KiB
C++

// This file is part of the FidelityFX Super Resolution 3.1 Unreal Engine Plugin.
//
// Copyright (c) 2023-2025 Advanced Micro Devices, Inc. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#include "FFXSharedBackend.h"
#include "PixelFormat.h"
#include "RHI.h"
#if UE_VERSION_OLDER_THAN(5, 0, 0)
#include "RenderGraphBuilder.h"
FRDGBuilder* IFFXSharedBackend::GraphBuilder;
#endif
FFXSHARED_API FfxApiSurfaceFormat GetFFXApiFormat(EPixelFormat UEFormat, bool bSRGB)
{
FfxApiSurfaceFormat Format = FFX_API_SURFACE_FORMAT_UNKNOWN;
switch (UEFormat)
{
case PF_R32G32B32A32_UINT:
Format = FFX_API_SURFACE_FORMAT_R32G32B32A32_UINT;
break;
case PF_A32B32G32R32F:
Format = FFX_API_SURFACE_FORMAT_R32G32B32A32_FLOAT;
break;
case PF_FloatRGBA:
Format = FFX_API_SURFACE_FORMAT_R16G16B16A16_FLOAT;
break;
case PF_A2B10G10R10:
Format = FFX_API_SURFACE_FORMAT_R10G10B10A2_UNORM;
break;
case PF_G32R32F:
Format = FFX_API_SURFACE_FORMAT_R32G32_FLOAT;
break;
case PF_R32_UINT:
Format = FFX_API_SURFACE_FORMAT_R32_UINT;
break;
case PF_R8G8B8A8_UINT:
Format = FFX_API_SURFACE_FORMAT_R8G8B8A8_TYPELESS;
break;
case PF_R8G8B8A8:
if (bSRGB)
{
Format = FFX_API_SURFACE_FORMAT_R8G8B8A8_SRGB;
break;
}
case PF_B8G8R8A8:
Format = FFX_API_SURFACE_FORMAT_R8G8B8A8_UNORM;
break;
case PF_FloatR11G11B10:
case PF_FloatRGB:
Format = FFX_API_SURFACE_FORMAT_R11G11B10_FLOAT;
break;
case PF_G16R16F:
Format = FFX_API_SURFACE_FORMAT_R16G16_FLOAT;
break;
case PF_R16G16_UINT:
Format = FFX_API_SURFACE_FORMAT_R16G16_UINT;
break;
case PF_R16F:
Format = FFX_API_SURFACE_FORMAT_R16_FLOAT;
break;
case PF_R16_UINT:
Format = FFX_API_SURFACE_FORMAT_R16_UINT;
break;
case PF_G16:
Format = FFX_API_SURFACE_FORMAT_R16_UNORM;
break;
case PF_R16G16B16A16_SNORM:
Format = FFX_API_SURFACE_FORMAT_R16_SNORM;
break;
case PF_R8:
Format = FFX_API_SURFACE_FORMAT_R8_UNORM;
break;
case PF_R32_FLOAT:
Format = FFX_API_SURFACE_FORMAT_R32_FLOAT;
break;
case PF_DepthStencil:
Format = FFX_API_SURFACE_FORMAT_R32_FLOAT;
break;
case PF_R8G8:
Format = FFX_API_SURFACE_FORMAT_R8G8_UNORM;
break;
case PF_R8_UINT:
Format = FFX_API_SURFACE_FORMAT_R8_UINT;
break;
case PF_R16G16B16A16_SINT:
Format = FFX_API_SURFACE_FORMAT_R16G16_SINT;
break;
case PF_A16B16G16R16:
Format = FFX_API_SURFACE_FORMAT_R16G16B16A16_FLOAT;
break;
default:
check(false);
break;
}
return Format;
}
FFXSHARED_API ERHIAccess GetUEAccessState(FfxResourceStates State)
{
ERHIAccess Access = ERHIAccess::Unknown;
switch (State)
{
case FFX_RESOURCE_STATE_UNORDERED_ACCESS:
Access = ERHIAccess::UAVMask;
break;
case FFX_RESOURCE_STATE_PIXEL_READ:
Access = ERHIAccess::SRVGraphics;
break;
case FFX_RESOURCE_STATE_COMPUTE_READ:
Access = ERHIAccess::SRVCompute;
break;
case FFX_RESOURCE_STATE_PIXEL_COMPUTE_READ:
Access = ERHIAccess::SRVMask;
break;
case FFX_RESOURCE_STATE_COPY_SRC:
Access = ERHIAccess::CopySrc;
break;
case FFX_RESOURCE_STATE_COPY_DEST:
Access = ERHIAccess::CopyDest;
break;
case FFX_RESOURCE_STATE_PRESENT:
Access = ERHIAccess::Present;
break;
case FFX_RESOURCE_STATE_COMMON:
Access = ERHIAccess::SRVMask;
break;
case FFX_RESOURCE_STATE_GENERIC_READ:
#if UE_VERSION_AT_LEAST(5, 1, 0)
Access = ERHIAccess::ReadOnlyExclusiveComputeMask;
#else
Access = ERHIAccess::ReadOnlyExclusiveMask;
#endif
break;
case FFX_RESOURCE_STATE_INDIRECT_ARGUMENT:
Access = ERHIAccess::IndirectArgs;
break;
default:
Access = ERHIAccess::Unknown;
break;
}
return Access;
}