280 lines
9.1 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 "FFXD3D12Includes.h"
#if PLATFORM_WINDOWS
#include "Windows/AllowWindowsPlatformTypes.h"
#undef InterlockedIncrement
#undef InterlockedDecrement
#define InterlockedIncrement ::_InterlockedIncrement
#define InterlockedDecrement ::_InterlockedDecrement
typedef LONG NTSTATUS;
#include <dwmapi.h>
#pragma warning(push)
#pragma warning(disable:4191)
#else
#define _countof(a) (sizeof(a)/sizeof(*(a)))
#define strcpy_s(a, b) strcpy(a, b)
#define FFX_GCC 1
#endif
THIRD_PARTY_INCLUDES_START
#define FFX_FSR3UPSCALER 1
#define FFX_FI 1
#define FFX_OF 1
#define FFX_BREADCRUMBS 1
#ifdef verify
#undef verify
#endif
#if defined(__cplusplus)
extern "C" {
#endif // #if defined(__cplusplus)
FFX_API FfxSurfaceFormat ffxGetSurfaceFormatDX12(DXGI_FORMAT format)
{
switch (format) {
case DXGI_FORMAT_R32G32B32A32_TYPELESS:
return FFX_SURFACE_FORMAT_R32G32B32A32_TYPELESS;
case DXGI_FORMAT_R32G32B32A32_FLOAT:
return FFX_SURFACE_FORMAT_R32G32B32A32_FLOAT;
case DXGI_FORMAT_R32G32B32_FLOAT:
return FFX_SURFACE_FORMAT_R32G32B32_FLOAT;
case DXGI_FORMAT_R32G32B32A32_UINT:
return FFX_SURFACE_FORMAT_R32G32B32A32_UINT;
case DXGI_FORMAT_R16G16B16A16_TYPELESS:
case DXGI_FORMAT_R16G16B16A16_FLOAT:
return FFX_SURFACE_FORMAT_R16G16B16A16_FLOAT;
case DXGI_FORMAT_R32G32_TYPELESS:
case DXGI_FORMAT_R32G32_FLOAT:
return FFX_SURFACE_FORMAT_R32G32_FLOAT;
case DXGI_FORMAT_R32G8X24_TYPELESS:
case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
return FFX_SURFACE_FORMAT_R32_FLOAT;
case DXGI_FORMAT_R24G8_TYPELESS:
case DXGI_FORMAT_D24_UNORM_S8_UINT:
case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
return FFX_SURFACE_FORMAT_R32_UINT;
case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
return FFX_SURFACE_FORMAT_R8_UINT;
case DXGI_FORMAT_R10G10B10A2_TYPELESS:
case DXGI_FORMAT_R10G10B10A2_UNORM:
return FFX_SURFACE_FORMAT_R10G10B10A2_UNORM;
case DXGI_FORMAT_R11G11B10_FLOAT:
return FFX_SURFACE_FORMAT_R11G11B10_FLOAT;
case DXGI_FORMAT_R8G8B8A8_TYPELESS:
return FFX_SURFACE_FORMAT_R8G8B8A8_TYPELESS;
case DXGI_FORMAT_R8G8B8A8_UNORM:
return FFX_SURFACE_FORMAT_R8G8B8A8_UNORM;
case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
return FFX_SURFACE_FORMAT_R8G8B8A8_SRGB;
case DXGI_FORMAT_R8G8B8A8_SNORM:
return FFX_SURFACE_FORMAT_R8G8B8A8_SNORM;
case DXGI_FORMAT_B8G8R8A8_TYPELESS:
return FFX_SURFACE_FORMAT_B8G8R8A8_TYPELESS;
case DXGI_FORMAT_B8G8R8A8_UNORM:
return FFX_SURFACE_FORMAT_B8G8R8A8_UNORM;
case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
return FFX_SURFACE_FORMAT_B8G8R8A8_SRGB;
case DXGI_FORMAT_R16G16_TYPELESS:
case DXGI_FORMAT_R16G16_FLOAT:
return FFX_SURFACE_FORMAT_R16G16_FLOAT;
case DXGI_FORMAT_R16G16_UINT:
return FFX_SURFACE_FORMAT_R16G16_UINT;
case DXGI_FORMAT_R16G16_SINT:
return FFX_SURFACE_FORMAT_R16G16_SINT;
case DXGI_FORMAT_R32_UINT:
return FFX_SURFACE_FORMAT_R32_UINT;
case DXGI_FORMAT_R32_TYPELESS:
case DXGI_FORMAT_D32_FLOAT:
case DXGI_FORMAT_R32_FLOAT:
return FFX_SURFACE_FORMAT_R32_FLOAT;
case DXGI_FORMAT_R8G8_TYPELESS:
case DXGI_FORMAT_R8G8_UINT:
return FFX_SURFACE_FORMAT_R8G8_UINT;
case DXGI_FORMAT_R8G8_UNORM:
return FFX_SURFACE_FORMAT_R8G8_UNORM;
case DXGI_FORMAT_R16_TYPELESS:
case DXGI_FORMAT_R16_FLOAT:
return FFX_SURFACE_FORMAT_R16_FLOAT;
case DXGI_FORMAT_R16_UINT:
return FFX_SURFACE_FORMAT_R16_UINT;
case DXGI_FORMAT_D16_UNORM:
case DXGI_FORMAT_R16_UNORM:
return FFX_SURFACE_FORMAT_R16_UNORM;
case DXGI_FORMAT_R16_SNORM:
return FFX_SURFACE_FORMAT_R16_SNORM;
case DXGI_FORMAT_R8_TYPELESS:
case DXGI_FORMAT_R8_UNORM:
case DXGI_FORMAT_A8_UNORM:
return FFX_SURFACE_FORMAT_R8_UNORM;
case DXGI_FORMAT_R8_UINT:
return FFX_SURFACE_FORMAT_R8_UINT;
case DXGI_FORMAT_UNKNOWN:
return FFX_SURFACE_FORMAT_UNKNOWN;
default:
return FFX_SURFACE_FORMAT_UNKNOWN;
}
}
FFX_API DXGI_FORMAT ffxGetDX12FormatFromSurfaceFormat(FfxSurfaceFormat surfaceFormat)
{
switch (surfaceFormat) {
case (FFX_SURFACE_FORMAT_R32G32B32A32_TYPELESS):
return DXGI_FORMAT_R32G32B32A32_TYPELESS;
case (FFX_SURFACE_FORMAT_R32G32B32A32_UINT):
return DXGI_FORMAT_R32G32B32A32_UINT;
case (FFX_SURFACE_FORMAT_R32G32B32A32_FLOAT):
return DXGI_FORMAT_R32G32B32A32_FLOAT;
case (FFX_SURFACE_FORMAT_R16G16B16A16_FLOAT):
return DXGI_FORMAT_R16G16B16A16_FLOAT;
case (FFX_SURFACE_FORMAT_R32G32B32_FLOAT):
return DXGI_FORMAT_R32G32B32_FLOAT;
case (FFX_SURFACE_FORMAT_R32G32_FLOAT):
return DXGI_FORMAT_R32G32_FLOAT;
case (FFX_SURFACE_FORMAT_R32_UINT):
return DXGI_FORMAT_R32_UINT;
case(FFX_SURFACE_FORMAT_R10G10B10A2_UNORM):
return DXGI_FORMAT_R10G10B10A2_UNORM;
case (FFX_SURFACE_FORMAT_R8G8B8A8_TYPELESS):
return DXGI_FORMAT_R8G8B8A8_TYPELESS;
case (FFX_SURFACE_FORMAT_R8G8B8A8_UNORM):
return DXGI_FORMAT_R8G8B8A8_UNORM;
case (FFX_SURFACE_FORMAT_R8G8B8A8_SRGB):
return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
case (FFX_SURFACE_FORMAT_R8G8B8A8_SNORM):
return DXGI_FORMAT_R8G8B8A8_SNORM;
case (FFX_SURFACE_FORMAT_B8G8R8A8_TYPELESS):
return DXGI_FORMAT_B8G8R8A8_TYPELESS;
case (FFX_SURFACE_FORMAT_B8G8R8A8_UNORM):
return DXGI_FORMAT_B8G8R8A8_UNORM;
case (FFX_SURFACE_FORMAT_B8G8R8A8_SRGB):
return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB;
case (FFX_SURFACE_FORMAT_R11G11B10_FLOAT):
return DXGI_FORMAT_R11G11B10_FLOAT;
case (FFX_SURFACE_FORMAT_R16G16_FLOAT):
return DXGI_FORMAT_R16G16_FLOAT;
case (FFX_SURFACE_FORMAT_R16G16_UINT):
return DXGI_FORMAT_R16G16_UINT;
case (FFX_SURFACE_FORMAT_R16G16_SINT):
return DXGI_FORMAT_R16G16_SINT;
case (FFX_SURFACE_FORMAT_R16_FLOAT):
return DXGI_FORMAT_R16_FLOAT;
case (FFX_SURFACE_FORMAT_R16_UINT):
return DXGI_FORMAT_R16_UINT;
case (FFX_SURFACE_FORMAT_R16_UNORM):
return DXGI_FORMAT_R16_UNORM;
case (FFX_SURFACE_FORMAT_R16_SNORM):
return DXGI_FORMAT_R16_SNORM;
case (FFX_SURFACE_FORMAT_R8_UNORM):
return DXGI_FORMAT_R8_UNORM;
case (FFX_SURFACE_FORMAT_R8_UINT):
return DXGI_FORMAT_R8_UINT;
case (FFX_SURFACE_FORMAT_R8G8_UINT):
return DXGI_FORMAT_R8G8_UINT;
case (FFX_SURFACE_FORMAT_R8G8_UNORM):
return DXGI_FORMAT_R8G8_UNORM;
case (FFX_SURFACE_FORMAT_R32_FLOAT):
return DXGI_FORMAT_R32_FLOAT;
case (FFX_SURFACE_FORMAT_UNKNOWN):
return DXGI_FORMAT_UNKNOWN;
default:
return DXGI_FORMAT_UNKNOWN;
}
}
FFX_API D3D12_RESOURCE_STATES ffxGetDX12StateFromResourceState(FfxResourceStates state)
{
switch (state) {
case FFX_RESOURCE_STATE_GENERIC_READ:
return D3D12_RESOURCE_STATE_GENERIC_READ;
case FFX_RESOURCE_STATE_UNORDERED_ACCESS:
return D3D12_RESOURCE_STATE_UNORDERED_ACCESS;
case FFX_RESOURCE_STATE_PIXEL_COMPUTE_READ:
return D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE | D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
case FFX_RESOURCE_STATE_COMPUTE_READ:
return D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE;
case FFX_RESOURCE_STATE_PIXEL_READ:
return D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
case FFX_RESOURCE_STATE_COPY_SRC:
return D3D12_RESOURCE_STATE_COPY_SOURCE;
case FFX_RESOURCE_STATE_COPY_DEST:
return D3D12_RESOURCE_STATE_COPY_DEST;
case FFX_RESOURCE_STATE_INDIRECT_ARGUMENT:
return D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT;
case FFX_RESOURCE_STATE_PRESENT:
return D3D12_RESOURCE_STATE_PRESENT;
case FFX_RESOURCE_STATE_COMMON:
return D3D12_RESOURCE_STATE_COMMON;
case FFX_RESOURCE_STATE_RENDER_TARGET:
return D3D12_RESOURCE_STATE_RENDER_TARGET;
default:
return D3D12_RESOURCE_STATE_COMMON;
}
}
#if defined(__cplusplus)
}
#endif // #if defined(__cplusplus)
#include "backends/dx12/FrameInterpolationSwapchain/FrameInterpolationSwapchainDX12_UiComposition.cpp"
#undef FFX_FSR3UPSCALER
#undef FFX_FI
#undef FFX_OF
#undef FFX_BREADCRUMBS
THIRD_PARTY_INCLUDES_END
#if PLATFORM_WINDOWS
#pragma warning(pop)
#undef InterlockedIncrement
#undef InterlockedDecrement
#include "Windows/HideWindowsPlatformTypes.h"
#else
#undef _countof
#undef strcpy_s
#undef FFX_GCC
#endif