mirror of
https://github.com/optiscaler/OptiScaler.git
synced 2026-08-27 08:36:44 +00:00
seperate ffxapi to proxy
This commit is contained in:
@@ -0,0 +1,255 @@
|
||||
#pragma once
|
||||
|
||||
#include "pch.h"
|
||||
#include "Util.h"
|
||||
#include "Config.h"
|
||||
#include "Logger.h"
|
||||
|
||||
#include "ffx_api.h"
|
||||
|
||||
#include "detours/detours.h"
|
||||
|
||||
class FfxApiProxy
|
||||
{
|
||||
private:
|
||||
inline static HMODULE _dllDx12 = nullptr;
|
||||
inline static feature_version _versionDx12{ 0, 0, 0 };
|
||||
inline static PfnFfxCreateContext _D3D12_CreateContext = nullptr;
|
||||
inline static PfnFfxDestroyContext _D3D12_DestroyContext = nullptr;
|
||||
inline static PfnFfxConfigure _D3D12_Configure = nullptr;
|
||||
inline static PfnFfxQuery _D3D12_Query = nullptr;
|
||||
inline static PfnFfxDispatch _D3D12_Dispatch = nullptr;
|
||||
|
||||
inline static HMODULE _dllVk = nullptr;
|
||||
inline static feature_version _versionVk{ 0, 0, 0 };
|
||||
inline static PfnFfxCreateContext _VULKAN_CreateContext = nullptr;
|
||||
inline static PfnFfxDestroyContext _VULKAN_DestroyContext = nullptr;
|
||||
inline static PfnFfxConfigure _VULKAN_Configure = nullptr;
|
||||
inline static PfnFfxQuery _VULKAN_Query = nullptr;
|
||||
inline static PfnFfxDispatch _VULKAN_Dispatch = nullptr;
|
||||
|
||||
static inline void parse_version(const char* version_str, feature_version* _version)
|
||||
{
|
||||
if (sscanf_s(version_str, "%u.%u.%u", &_version->major, &_version->minor, &_version->patch) != 3)
|
||||
LOG_WARN("can't parse {0}", version_str);
|
||||
}
|
||||
|
||||
public:
|
||||
static bool InitFfxDx12()
|
||||
{
|
||||
// if dll already loaded
|
||||
if (_dllDx12 != nullptr || _D3D12_CreateContext != nullptr)
|
||||
return true;
|
||||
|
||||
spdlog::info("");
|
||||
|
||||
Config::Instance()->upscalerDisableHook = true;
|
||||
Config::Instance()->dxgiSkipSpoofing = true;
|
||||
|
||||
LOG_DEBUG("Loading amd_fidelityfx_dx12.dll methods");
|
||||
|
||||
auto file = Util::DllPath().parent_path() / "amd_fidelityfx_dx12.dll";
|
||||
LOG_INFO("Trying to load {}", file.string());
|
||||
|
||||
_dllDx12 = LoadLibrary(file.wstring().c_str());
|
||||
if (_dllDx12 != nullptr)
|
||||
{
|
||||
_D3D12_Configure = (PfnFfxConfigure)GetProcAddress(_dllDx12, "ffxConfigure");
|
||||
_D3D12_CreateContext = (PfnFfxCreateContext)GetProcAddress(_dllDx12, "ffxCreateContext");
|
||||
_D3D12_DestroyContext = (PfnFfxDestroyContext)GetProcAddress(_dllDx12, "ffxDestroyContext");
|
||||
_D3D12_Dispatch = (PfnFfxDispatch)GetProcAddress(_dllDx12, "ffxDispatch");
|
||||
_D3D12_Query = (PfnFfxQuery)GetProcAddress(_dllDx12, "ffxQuery");
|
||||
}
|
||||
|
||||
if (_D3D12_CreateContext == nullptr)
|
||||
{
|
||||
LOG_INFO("Trying to load amd_fidelityfx_dx12.dll with detours");
|
||||
|
||||
_D3D12_Configure = (PfnFfxConfigure)DetourFindFunction("amd_fidelityfx_dx12.dll", "ffxConfigure");
|
||||
_D3D12_CreateContext = (PfnFfxCreateContext)DetourFindFunction("amd_fidelityfx_dx12.dll", "ffxCreateContext");
|
||||
_D3D12_DestroyContext = (PfnFfxDestroyContext)DetourFindFunction("amd_fidelityfx_dx12.dll", "ffxDestroyContext");
|
||||
_D3D12_Dispatch = (PfnFfxDispatch)DetourFindFunction("amd_fidelityfx_dx12.dll", "ffxDispatch");
|
||||
_D3D12_Query = (PfnFfxQuery)DetourFindFunction("amd_fidelityfx_dx12.dll", "ffxQuery");
|
||||
}
|
||||
|
||||
Config::Instance()->dxgiSkipSpoofing = false;
|
||||
Config::Instance()->upscalerDisableHook = false;
|
||||
|
||||
bool loadResult = _D3D12_CreateContext != nullptr;
|
||||
|
||||
LOG_INFO("LoadResult: {}", loadResult);
|
||||
|
||||
if (loadResult)
|
||||
VersionDx12();
|
||||
|
||||
return loadResult;
|
||||
}
|
||||
|
||||
static feature_version VersionDx12()
|
||||
{
|
||||
if (_versionDx12.major == 0 && _D3D12_Query != nullptr/* && device != nullptr*/)
|
||||
{
|
||||
ffxQueryDescGetVersions versionQuery{};
|
||||
versionQuery.header.type = FFX_API_QUERY_DESC_TYPE_GET_VERSIONS;
|
||||
versionQuery.createDescType = 0x00010000u; // FFX_API_CREATE_CONTEXT_DESC_TYPE_UPSCALE
|
||||
uint64_t versionCount = 0;
|
||||
versionQuery.outputCount = &versionCount;
|
||||
|
||||
auto queryResult = _D3D12_Query(nullptr, &versionQuery.header);
|
||||
|
||||
// get number of versions for allocation
|
||||
if (versionCount > 0 && queryResult == FFX_API_RETURN_OK)
|
||||
{
|
||||
|
||||
std::vector<uint64_t> versionIds;
|
||||
std::vector<const char*> versionNames;
|
||||
versionIds.resize(versionCount);
|
||||
versionNames.resize(versionCount);
|
||||
versionQuery.versionIds = versionIds.data();
|
||||
versionQuery.versionNames = versionNames.data();
|
||||
|
||||
// fill version ids and names arrays.
|
||||
queryResult = _D3D12_Query(nullptr, &versionQuery.header);
|
||||
|
||||
if (queryResult == FFX_API_RETURN_OK)
|
||||
{
|
||||
parse_version(versionNames[0], &_versionDx12);
|
||||
LOG_INFO("FfxApi Dx12 version: {}.{}.{}", _versionDx12.major, _versionDx12.minor, _versionDx12.patch);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_WARN("_D3D12_Query 2 result: {}", (UINT)queryResult);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_WARN("_D3D12_Query result: {}", (UINT)queryResult);
|
||||
}
|
||||
}
|
||||
|
||||
return _versionDx12;
|
||||
}
|
||||
|
||||
static PfnFfxCreateContext D3D12_CreateContext() { return _D3D12_CreateContext; }
|
||||
static PfnFfxDestroyContext D3D12_DestroyContext() { return _D3D12_DestroyContext; }
|
||||
static PfnFfxConfigure D3D12_Configure() { return _D3D12_Configure; }
|
||||
static PfnFfxQuery D3D12_Query() { return _D3D12_Query; }
|
||||
static PfnFfxDispatch D3D12_Dispatch() { return _D3D12_Dispatch; }
|
||||
|
||||
static bool InitFfxVk()
|
||||
{
|
||||
// if dll already loaded
|
||||
if (_dllVk != nullptr || _VULKAN_CreateContext != nullptr)
|
||||
return true;
|
||||
|
||||
spdlog::info("");
|
||||
|
||||
Config::Instance()->upscalerDisableHook = true;
|
||||
Config::Instance()->dxgiSkipSpoofing = true;
|
||||
|
||||
LOG_DEBUG("Loading amd_fidelityfx_vk.dll methods");
|
||||
|
||||
auto file = Util::DllPath().parent_path() / "amd_fidelityfx_vk.dll";
|
||||
LOG_INFO("Trying to load {}", file.string());
|
||||
|
||||
_dllVk = LoadLibrary(file.wstring().c_str());
|
||||
if (_dllVk != nullptr)
|
||||
{
|
||||
_VULKAN_Configure = (PfnFfxConfigure)GetProcAddress(_dllVk, "ffxConfigure");
|
||||
_VULKAN_CreateContext = (PfnFfxCreateContext)GetProcAddress(_dllVk, "ffxCreateContext");
|
||||
_VULKAN_DestroyContext = (PfnFfxDestroyContext)GetProcAddress(_dllVk, "ffxDestroyContext");
|
||||
_VULKAN_Dispatch = (PfnFfxDispatch)GetProcAddress(_dllVk, "ffxDispatch");
|
||||
_VULKAN_Query = (PfnFfxQuery)GetProcAddress(_dllVk, "ffxQuery");
|
||||
}
|
||||
|
||||
if (_VULKAN_CreateContext == nullptr)
|
||||
{
|
||||
LOG_INFO("Trying to load amd_fidelityfx_vk.dll with detours");
|
||||
|
||||
_VULKAN_Configure = (PfnFfxConfigure)DetourFindFunction("amd_fidelityfx_vk.dll", "ffxConfigure");
|
||||
_VULKAN_CreateContext = (PfnFfxCreateContext)DetourFindFunction("amd_fidelityfx_vk.dll", "ffxCreateContext");
|
||||
_VULKAN_DestroyContext = (PfnFfxDestroyContext)DetourFindFunction("amd_fidelityfx_vk.dll", "ffxDestroyContext");
|
||||
_VULKAN_Dispatch = (PfnFfxDispatch)DetourFindFunction("amd_fidelityfx_vk.dll", "ffxDispatch");
|
||||
_VULKAN_Query = (PfnFfxQuery)DetourFindFunction("amd_fidelityfx_vk.dll", "ffxQuery");
|
||||
}
|
||||
|
||||
Config::Instance()->dxgiSkipSpoofing = false;
|
||||
Config::Instance()->upscalerDisableHook = false;
|
||||
|
||||
bool loadResult = _VULKAN_CreateContext != nullptr;
|
||||
|
||||
LOG_INFO("LoadResult: {}", loadResult);
|
||||
|
||||
if (loadResult)
|
||||
VersionVk();
|
||||
|
||||
return loadResult;
|
||||
}
|
||||
|
||||
static feature_version VersionVk()
|
||||
{
|
||||
if (_versionVk.major == 0 && _VULKAN_Query != nullptr)
|
||||
{
|
||||
ffxQueryDescGetVersions versionQuery{};
|
||||
versionQuery.header.type = FFX_API_QUERY_DESC_TYPE_GET_VERSIONS;
|
||||
versionQuery.createDescType = 0x00010000u; // FFX_API_CREATE_CONTEXT_DESC_TYPE_UPSCALE
|
||||
uint64_t versionCount = 0;
|
||||
versionQuery.outputCount = &versionCount;
|
||||
|
||||
auto queryResult = _VULKAN_Query(nullptr, &versionQuery.header);
|
||||
|
||||
// get number of versions for allocation
|
||||
if (versionCount > 0 && queryResult == FFX_API_RETURN_OK)
|
||||
{
|
||||
|
||||
std::vector<uint64_t> versionIds;
|
||||
std::vector<const char*> versionNames;
|
||||
versionIds.resize(versionCount);
|
||||
versionNames.resize(versionCount);
|
||||
versionQuery.versionIds = versionIds.data();
|
||||
versionQuery.versionNames = versionNames.data();
|
||||
|
||||
queryResult = _VULKAN_Query(nullptr, &versionQuery.header);
|
||||
|
||||
if (queryResult == FFX_API_RETURN_OK)
|
||||
{
|
||||
parse_version(versionNames[0], &_versionVk);
|
||||
LOG_INFO("FfxApi Vulkan version: {}.{}.{}", _versionVk.major, _versionVk.minor, _versionVk.patch);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_WARN("_VULKAN_Query 2 result: {}", (UINT)queryResult);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_WARN("_VULKAN_Query result: {}", (UINT)queryResult);
|
||||
}
|
||||
}
|
||||
|
||||
return _versionVk;
|
||||
}
|
||||
|
||||
static PfnFfxCreateContext VULKAN_CreateContext() { return _VULKAN_CreateContext; }
|
||||
static PfnFfxDestroyContext VULKAN_DestroyContext() { return _VULKAN_DestroyContext; }
|
||||
static PfnFfxConfigure VULKAN_Configure() { return _VULKAN_Configure; }
|
||||
static PfnFfxQuery VULKAN_Query() { return _VULKAN_Query; }
|
||||
static PfnFfxDispatch VULKAN_Dispatch() { return _VULKAN_Dispatch; }
|
||||
|
||||
static std::string ReturnCodeToString(ffxReturnCode_t result)
|
||||
{
|
||||
switch (result)
|
||||
{
|
||||
case FFX_API_RETURN_OK: return "The oparation was successful.";
|
||||
case FFX_API_RETURN_ERROR: return "An error occurred that is not further specified.";
|
||||
case FFX_API_RETURN_ERROR_UNKNOWN_DESCTYPE: return "The structure type given was not recognized for the function or context with which it was used. This is likely a programming error.";
|
||||
case FFX_API_RETURN_ERROR_RUNTIME_ERROR: return "The underlying runtime (e.g. D3D12, Vulkan) or effect returned an error code.";
|
||||
case FFX_API_RETURN_NO_PROVIDER: return "No provider was found for the given structure type. This is likely a programming error.";
|
||||
case FFX_API_RETURN_ERROR_MEMORY: return "A memory allocation failed.";
|
||||
case FFX_API_RETURN_ERROR_PARAMETER: return "A parameter was invalid, e.g. a null pointer, empty resource or out-of-bounds enum value.";
|
||||
default: return "Unknown";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
@@ -18,7 +18,7 @@
|
||||
#include <ankerl/unordered_dense.h>
|
||||
#include <dxgi1_4.h>
|
||||
|
||||
#include <ffx_api.h>
|
||||
#include "FfxApi_Proxy.h"
|
||||
#include <ffx_framegeneration.h>
|
||||
|
||||
#include "depth_upscale/DU_Dx12.h"
|
||||
@@ -29,11 +29,6 @@
|
||||
#define DONT_USE_DEPTH_MV_COPIES
|
||||
#endif
|
||||
|
||||
static PfnFfxCreateContext _createContext = nullptr;
|
||||
static PfnFfxDestroyContext _destroyContext = nullptr;
|
||||
static PfnFfxConfigure _configure = nullptr;
|
||||
static PfnFfxQuery _query = nullptr;
|
||||
static PfnFfxDispatch _dispatch = nullptr;
|
||||
static UINT64 fgLastFrameTime = 0;
|
||||
static UINT64 fgLastFGFrame = 0;
|
||||
|
||||
@@ -107,50 +102,13 @@ static bool CreateBufferResource(LPCWSTR Name, ID3D12Device* InDevice, ID3D12Res
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
static void LoadFSR31Funcs()
|
||||
{
|
||||
LOG_DEBUG("Loading amd_fidelityfx_dx12.dll methods");
|
||||
|
||||
auto file = Util::DllPath().parent_path() / "amd_fidelityfx_dx12.dll";
|
||||
LOG_INFO("Trying to load {}", file.string());
|
||||
|
||||
auto _dll = LoadLibrary(file.wstring().c_str());
|
||||
if (_dll != nullptr)
|
||||
{
|
||||
_configure = (PfnFfxConfigure)GetProcAddress(_dll, "ffxConfigure");
|
||||
_createContext = (PfnFfxCreateContext)GetProcAddress(_dll, "ffxCreateContext");
|
||||
_destroyContext = (PfnFfxDestroyContext)GetProcAddress(_dll, "ffxDestroyContext");
|
||||
_dispatch = (PfnFfxDispatch)GetProcAddress(_dll, "ffxDispatch");
|
||||
_query = (PfnFfxQuery)GetProcAddress(_dll, "ffxQuery");
|
||||
}
|
||||
|
||||
if (_configure == nullptr)
|
||||
{
|
||||
LOG_INFO("Trying to load amd_fidelityfx_dx12.dll with detours");
|
||||
|
||||
_configure = (PfnFfxConfigure)DetourFindFunction("amd_fidelityfx_dx12.dll", "ffxConfigure");
|
||||
_createContext = (PfnFfxCreateContext)DetourFindFunction("amd_fidelityfx_dx12.dll", "ffxCreateContext");
|
||||
_destroyContext = (PfnFfxDestroyContext)DetourFindFunction("amd_fidelityfx_dx12.dll", "ffxDestroyContext");
|
||||
_dispatch = (PfnFfxDispatch)DetourFindFunction("amd_fidelityfx_dx12.dll", "ffxDispatch");
|
||||
_query = (PfnFfxQuery)DetourFindFunction("amd_fidelityfx_dx12.dll", "ffxQuery");
|
||||
}
|
||||
|
||||
if (_configure != nullptr)
|
||||
LOG_INFO("amd_fidelityfx_dx12.dll methods loaded!");
|
||||
else
|
||||
LOG_ERROR("can't load amd_fidelityfx_dx12.dll methods!");
|
||||
}
|
||||
|
||||
|
||||
#pragma region Hooks
|
||||
|
||||
typedef void(__fastcall* PFN_SetComputeRootSignature)(ID3D12GraphicsCommandList* commandList, ID3D12RootSignature* pRootSignature);
|
||||
typedef void(__fastcall* PFN_CreateSampler)(ID3D12Device* device, const D3D12_SAMPLER_DESC* pDesc, D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor);
|
||||
typedef void(*PFN_SetComputeRootSignature)(ID3D12GraphicsCommandList* commandList, ID3D12RootSignature* pRootSignature);
|
||||
typedef void(*PFN_CreateSampler)(ID3D12Device* device, const D3D12_SAMPLER_DESC* pDesc, D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor);
|
||||
|
||||
static PFN_SetComputeRootSignature orgSetComputeRootSignature = nullptr;
|
||||
static PFN_SetComputeRootSignature orgSetGraphicRootSignature = nullptr;
|
||||
static PFN_CreateSampler orgCreateSampler = nullptr;
|
||||
|
||||
static ID3D12RootSignature* rootSigCompute = nullptr;
|
||||
static ID3D12RootSignature* rootSigGraphic = nullptr;
|
||||
@@ -196,56 +154,6 @@ static void hkSetGraphicRootSignature(ID3D12GraphicsCommandList* commandList, ID
|
||||
return orgSetGraphicRootSignature(commandList, pRootSignature);
|
||||
}
|
||||
|
||||
static void hkCreateSampler(ID3D12Device* device, const D3D12_SAMPLER_DESC* pDesc, D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor)
|
||||
{
|
||||
if (pDesc == nullptr || device == nullptr)
|
||||
return;
|
||||
|
||||
D3D12_SAMPLER_DESC newDesc{};
|
||||
|
||||
newDesc.AddressU = pDesc->AddressU;
|
||||
newDesc.AddressV = pDesc->AddressV;
|
||||
newDesc.AddressW = pDesc->AddressW;
|
||||
newDesc.BorderColor[0] = pDesc->BorderColor[0];
|
||||
newDesc.BorderColor[1] = pDesc->BorderColor[1];
|
||||
newDesc.BorderColor[2] = pDesc->BorderColor[2];
|
||||
newDesc.BorderColor[3] = pDesc->BorderColor[3];
|
||||
newDesc.ComparisonFunc = pDesc->ComparisonFunc;
|
||||
|
||||
if (Config::Instance()->AnisotropyOverride.has_value() &&
|
||||
(pDesc->Filter == D3D12_FILTER_MIN_LINEAR_MAG_MIP_POINT ||
|
||||
pDesc->Filter == D3D12_FILTER_MIN_MAG_LINEAR_MIP_POINT ||
|
||||
pDesc->Filter == D3D12_FILTER_MIN_MAG_MIP_LINEAR ||
|
||||
pDesc->Filter == D3D12_FILTER_ANISOTROPIC))
|
||||
{
|
||||
LOG_INFO("Overriding Anisotrpic ({2}) filtering {0} -> {1}", pDesc->MaxAnisotropy, Config::Instance()->AnisotropyOverride.value(), (UINT)pDesc->Filter);
|
||||
newDesc.Filter = D3D12_FILTER_ANISOTROPIC;
|
||||
newDesc.MaxAnisotropy = Config::Instance()->AnisotropyOverride.value();
|
||||
}
|
||||
else
|
||||
{
|
||||
newDesc.Filter = pDesc->Filter;
|
||||
newDesc.MaxAnisotropy = pDesc->MaxAnisotropy;
|
||||
}
|
||||
|
||||
newDesc.MaxLOD = pDesc->MaxLOD;
|
||||
newDesc.MinLOD = pDesc->MinLOD;
|
||||
newDesc.MipLODBias = pDesc->MipLODBias;
|
||||
|
||||
if (newDesc.MipLODBias < 0.0f)
|
||||
{
|
||||
if (Config::Instance()->MipmapBiasOverride.has_value())
|
||||
{
|
||||
LOG_INFO("Overriding mipmap bias {0} -> {1}", pDesc->MipLODBias, Config::Instance()->MipmapBiasOverride.value());
|
||||
newDesc.MipLODBias = Config::Instance()->MipmapBiasOverride.value();
|
||||
}
|
||||
|
||||
Config::Instance()->lastMipBias = newDesc.MipLODBias;
|
||||
}
|
||||
|
||||
return orgCreateSampler(device, &newDesc, DestDescriptor);
|
||||
}
|
||||
|
||||
void HookToCommandList(ID3D12GraphicsCommandList* InCmdList)
|
||||
{
|
||||
if (orgSetComputeRootSignature != nullptr || orgSetGraphicRootSignature != nullptr)
|
||||
@@ -271,26 +179,6 @@ void HookToCommandList(ID3D12GraphicsCommandList* InCmdList)
|
||||
}
|
||||
}
|
||||
|
||||
//void HookToDevice(ID3D12Device* InDevice)
|
||||
//{
|
||||
// //if (!ImGuiOverlayDx12::IsEarlyBind() && orgCreateSampler != nullptr || InDevice == nullptr)
|
||||
// // return;
|
||||
//
|
||||
// PVOID* pVTable = *(PVOID**)InDevice;
|
||||
//
|
||||
// orgCreateSampler = (PFN_CreateSampler)pVTable[22];
|
||||
//
|
||||
// if (orgCreateSampler != nullptr)
|
||||
// {
|
||||
// DetourTransactionBegin();
|
||||
// DetourUpdateThread(GetCurrentThread());
|
||||
//
|
||||
// DetourAttach(&(PVOID&)orgCreateSampler, hkCreateSampler);
|
||||
//
|
||||
// DetourTransactionCommit();
|
||||
// }
|
||||
//}
|
||||
|
||||
void UnhookAll()
|
||||
{
|
||||
DetourTransactionBegin();
|
||||
@@ -308,12 +196,6 @@ void UnhookAll()
|
||||
orgSetGraphicRootSignature = nullptr;
|
||||
}
|
||||
|
||||
if (orgCreateSampler != nullptr)
|
||||
{
|
||||
DetourDetach(&(PVOID&)orgCreateSampler, hkCreateSampler);
|
||||
orgCreateSampler = nullptr;
|
||||
}
|
||||
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
|
||||
@@ -398,9 +280,6 @@ NVSDK_NGX_API NVSDK_NGX_Result NVSDK_NGX_D3D12_Init_Ext(unsigned long long InApp
|
||||
heapProps.Type = D3D12_HEAP_TYPE_READBACK;
|
||||
result = InDevice->CreateCommittedResource(&heapProps, D3D12_HEAP_FLAG_NONE, &bufferDesc, D3D12_RESOURCE_STATE_COPY_DEST, nullptr, IID_PPV_ARGS(&HooksDx::readbackBuffer));
|
||||
|
||||
if (_createContext == nullptr)
|
||||
LoadFSR31Funcs();
|
||||
|
||||
return NVSDK_NGX_Result_Success;
|
||||
}
|
||||
|
||||
@@ -1298,7 +1177,7 @@ NVSDK_NGX_API NVSDK_NGX_Result NVSDK_NGX_D3D12_EvaluateFeature(ID3D12GraphicsCom
|
||||
if (Config::Instance()->FGUseFGSwapChain.value_or(true) && Config::Instance()->OverlayMenu.value_or(true))
|
||||
{
|
||||
if (!Config::Instance()->FGChanged && HooksDx::fgTarget < deviceContext->FrameCount() && Config::Instance()->FGEnabled.value_or(false) &&
|
||||
_createContext != nullptr && !HooksDx::fgIsActive && HooksDx::currentSwapchain != nullptr &&
|
||||
FfxApiProxy::InitFfxDx12() && !HooksDx::fgIsActive && HooksDx::currentSwapchain != nullptr &&
|
||||
HooksDx::swapchainFormat != DXGI_FORMAT_UNKNOWN)
|
||||
{
|
||||
HooksDx::CreateFGObjects(D3D12Device);
|
||||
@@ -1472,7 +1351,7 @@ NVSDK_NGX_API NVSDK_NGX_Result NVSDK_NGX_D3D12_EvaluateFeature(ID3D12GraphicsCom
|
||||
if (Config::Instance()->CurrentFeature != nullptr)
|
||||
fgLastFGFrame = Config::Instance()->CurrentFeature->FrameCount();
|
||||
|
||||
auto result = _dispatch(reinterpret_cast<ffxContext*>(pUserCtx), ¶ms->header);
|
||||
auto result = FfxApiProxy::D3D12_Dispatch()(reinterpret_cast<ffxContext*>(pUserCtx), ¶ms->header);
|
||||
|
||||
ID3D12CommandList* cl[1] = { nullptr };
|
||||
result = HooksDx::fgCopyCommandList->Close();
|
||||
@@ -1501,7 +1380,7 @@ NVSDK_NGX_API NVSDK_NGX_Result NVSDK_NGX_D3D12_EvaluateFeature(ID3D12GraphicsCom
|
||||
m_FrameGenerationConfig.header.pNext = &debugDesc.header;
|
||||
|
||||
Config::Instance()->dxgiSkipSpoofing = true;
|
||||
ffxReturnCode_t retCode = _configure(&HooksDx::fgContext, &m_FrameGenerationConfig.header);
|
||||
ffxReturnCode_t retCode = FfxApiProxy::D3D12_Configure()(&HooksDx::fgContext, &m_FrameGenerationConfig.header);
|
||||
Config::Instance()->dxgiSkipSpoofing = false;
|
||||
LOG_DEBUG(" FG _configure result: {0:X}", retCode);
|
||||
|
||||
@@ -1591,7 +1470,7 @@ NVSDK_NGX_API NVSDK_NGX_Result NVSDK_NGX_D3D12_EvaluateFeature(ID3D12GraphicsCom
|
||||
dfgPrepare.frameTimeDelta = msDelta;
|
||||
|
||||
Config::Instance()->dxgiSkipSpoofing = true;
|
||||
retCode = _dispatch(&HooksDx::fgContext, &dfgPrepare.header);
|
||||
retCode = FfxApiProxy::D3D12_Dispatch()(&HooksDx::fgContext, &dfgPrepare.header);
|
||||
Config::Instance()->dxgiSkipSpoofing = false;
|
||||
LOG_DEBUG(" FG _dispatch result: {0}", retCode);
|
||||
}
|
||||
|
||||
@@ -379,7 +379,6 @@ public:
|
||||
return;
|
||||
|
||||
LOG_INFO("");
|
||||
LOG_FUNC();
|
||||
|
||||
Config::Instance()->upscalerDisableHook = true;
|
||||
|
||||
|
||||
@@ -81,8 +81,8 @@
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<IncludePath>$(SolutionDir)external\vulkan\include;$(SolutionDir)external\nvngx_dlss_sdk;$(SolutionDir)external\xess\inc\xess;$(SolutionDir)external\FidelityFX-SDK\ffx-api\include\ffx_api;$(SolutionDir)external\simpleini;$(SolutionDir)external\unordered_dense\include;$(SolutionDir)external\spdlog\include;$(IncludePath)</IncludePath>
|
||||
<LibraryPath>$(ProjectDir)fsr2\lib;$(ProjectDir)fsr2_212\lib;$(ProjectDir)fsr31\lib;$(ProjectDir)vulkan;$(ProjectDir)d3dx;$(ProjectDir)detours;$(SolutionDir)external\xess\lib;$(LibraryPath)</LibraryPath>
|
||||
<TargetName>version</TargetName>
|
||||
<OutDir>D:\Folders\Games\No Man%27s Sky\Binaries\</OutDir>
|
||||
<TargetName>dxgi</TargetName>
|
||||
<OutDir>D:\Folders\Games\Deep Rock Galactic\FSD\Binaries\Win64\</OutDir>
|
||||
<IntDir>.\x64\Debug</IntDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
@@ -208,6 +208,7 @@ copy $(SolutionDir)nvngx.ini $(SolutionDir)x64\Release\a\</Command>
|
||||
<ClInclude Include="bias\precompile\Bias_Shader.h" />
|
||||
<ClInclude Include="format_transfer\FT_Common.h" />
|
||||
<ClInclude Include="format_transfer\FT_Dx12.h" />
|
||||
<ClInclude Include="FfxApi_Proxy.h" />
|
||||
<ClInclude Include="hooks\HooksDx.h" />
|
||||
<ClInclude Include="hooks\HooksVk.h" />
|
||||
<ClInclude Include="output_scaling\OS_Common.h" />
|
||||
|
||||
@@ -139,7 +139,7 @@ public:
|
||||
static bool InitXeSS()
|
||||
{
|
||||
// if dll already loaded
|
||||
if (_dll != nullptr && _xessD3D12CreateContext != nullptr)
|
||||
if (_dll != nullptr || _xessD3D12CreateContext != nullptr)
|
||||
return true;
|
||||
|
||||
spdlog::info("");
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#pragma once
|
||||
#include "../pch.h"
|
||||
#include <nvsdk_ngx.h>
|
||||
#include <nvsdk_ngx_defs.h>
|
||||
|
||||
@@ -43,13 +44,6 @@ protected:
|
||||
virtual void SetInit(bool InValue) { _isInited = InValue; }
|
||||
|
||||
public:
|
||||
typedef struct _feature_version
|
||||
{
|
||||
unsigned int major;
|
||||
unsigned int minor;
|
||||
unsigned int patch;
|
||||
} feature_version;
|
||||
|
||||
NVSDK_NGX_Handle* Handle() const { return _handle; };
|
||||
static unsigned int GetNextHandleId() { return handleCounter++; }
|
||||
|
||||
|
||||
@@ -46,8 +46,6 @@ FSR31Feature::~FSR31Feature()
|
||||
if (!IsInited())
|
||||
return;
|
||||
|
||||
_destroyContext(&_context, NULL);
|
||||
|
||||
SetInit(false);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,25 +1,10 @@
|
||||
#pragma once
|
||||
#include "ffx_api.h"
|
||||
#include "../../FfxApi_Proxy.h"
|
||||
#include "ffx_upscale.h"
|
||||
|
||||
#include "../IFeature.h"
|
||||
#include "../../detours/detours.h"
|
||||
|
||||
inline static std::string ResultToString(ffxReturnCode_t result)
|
||||
{
|
||||
switch (result)
|
||||
{
|
||||
case FFX_API_RETURN_OK: return "The oparation was successful.";
|
||||
case FFX_API_RETURN_ERROR: return "An error occurred that is not further specified.";
|
||||
case FFX_API_RETURN_ERROR_UNKNOWN_DESCTYPE: return "The structure type given was not recognized for the function or context with which it was used. This is likely a programming error.";
|
||||
case FFX_API_RETURN_ERROR_RUNTIME_ERROR: return "The underlying runtime (e.g. D3D12, Vulkan) or effect returned an error code.";
|
||||
case FFX_API_RETURN_NO_PROVIDER: return "No provider was found for the given structure type. This is likely a programming error.";
|
||||
case FFX_API_RETURN_ERROR_MEMORY: return "A memory allocation failed.";
|
||||
case FFX_API_RETURN_ERROR_PARAMETER: return "A parameter was invalid, e.g. a null pointer, empty resource or out-of-bounds enum value.";
|
||||
default: return "Unknown";
|
||||
}
|
||||
}
|
||||
|
||||
inline static void FfxLogCallback(uint32_t type, const wchar_t* message)
|
||||
{
|
||||
std::wstring string(message);
|
||||
@@ -47,12 +32,6 @@ protected:
|
||||
ffxContext _context = nullptr;
|
||||
ffxCreateContextDescUpscale _contextDesc = {};
|
||||
|
||||
PfnFfxCreateContext _createContext = nullptr;
|
||||
PfnFfxDestroyContext _destroyContext = nullptr;
|
||||
PfnFfxConfigure _configure = nullptr;
|
||||
PfnFfxQuery _query = nullptr;
|
||||
PfnFfxDispatch _dispatch = nullptr;
|
||||
|
||||
virtual bool InitFSR3(const NVSDK_NGX_Parameter* InParameters) = 0;
|
||||
|
||||
double MillisecondsNow();
|
||||
|
||||
@@ -15,6 +15,7 @@ do { \
|
||||
(p) = nullptr; \
|
||||
} \
|
||||
} while((void)0, 0);
|
||||
|
||||
FSR31FeatureDx11::FSR31FeatureDx11(unsigned int InHandleId, NVSDK_NGX_Parameter * InParameters) : FSR31Feature(InHandleId, InParameters), IFeature_Dx11(InHandleId, InParameters), IFeature(InHandleId, InParameters)
|
||||
{
|
||||
_moduleLoaded = true;
|
||||
|
||||
@@ -7,35 +7,7 @@
|
||||
|
||||
FSR31FeatureDx11on12::FSR31FeatureDx11on12(unsigned int InHandleId, NVSDK_NGX_Parameter* InParameters) : FSR31Feature(InHandleId, InParameters), IFeature_Dx11wDx12(InHandleId, InParameters), IFeature_Dx11(InHandleId, InParameters), IFeature(InHandleId, InParameters)
|
||||
{
|
||||
LOG_DEBUG("Loading amd_fidelityfx_dx12.dll methods");
|
||||
|
||||
auto file = Util::DllPath().parent_path() / "amd_fidelityfx_dx12.dll";
|
||||
LOG_INFO("Trying to load {}", file.string());
|
||||
|
||||
auto _dll = LoadLibrary(file.wstring().c_str());
|
||||
if (_dll != nullptr)
|
||||
{
|
||||
_configure = (PfnFfxConfigure)GetProcAddress(_dll, "ffxConfigure");
|
||||
_createContext = (PfnFfxCreateContext)GetProcAddress(_dll, "ffxCreateContext");
|
||||
_destroyContext = (PfnFfxDestroyContext)GetProcAddress(_dll, "ffxDestroyContext");
|
||||
_dispatch = (PfnFfxDispatch)GetProcAddress(_dll, "ffxDispatch");
|
||||
_query = (PfnFfxQuery)GetProcAddress(_dll, "ffxQuery");
|
||||
|
||||
_moduleLoaded = _configure != nullptr;
|
||||
}
|
||||
|
||||
if (!_moduleLoaded)
|
||||
{
|
||||
LOG_INFO("Trying to load amd_fidelityfx_dx12.dll with detours");
|
||||
|
||||
_configure = (PfnFfxConfigure)DetourFindFunction("amd_fidelityfx_dx12.dll", "ffxConfigure");
|
||||
_createContext = (PfnFfxCreateContext)DetourFindFunction("amd_fidelityfx_dx12.dll", "ffxCreateContext");
|
||||
_destroyContext = (PfnFfxDestroyContext)DetourFindFunction("amd_fidelityfx_dx12.dll", "ffxDestroyContext");
|
||||
_dispatch = (PfnFfxDispatch)DetourFindFunction("amd_fidelityfx_dx12.dll", "ffxDispatch");
|
||||
_query = (PfnFfxQuery)DetourFindFunction("amd_fidelityfx_dx12.dll", "ffxQuery");
|
||||
|
||||
_moduleLoaded = _configure != nullptr;
|
||||
}
|
||||
_moduleLoaded = FfxApiProxy::InitFfxDx12();
|
||||
|
||||
if (_moduleLoaded)
|
||||
LOG_INFO("amd_fidelityfx_dx12.dll methods loaded!");
|
||||
@@ -353,18 +325,18 @@ bool FSR31FeatureDx11on12::Evaluate(ID3D11DeviceContext* InDeviceContext, NVSDK_
|
||||
m_upscalerKeyValueConfig.header.type = FFX_API_CONFIGURE_DESC_TYPE_UPSCALE_KEYVALUE;
|
||||
m_upscalerKeyValueConfig.key = FFX_API_CONFIGURE_UPSCALE_KEY_FVELOCITYFACTOR;
|
||||
m_upscalerKeyValueConfig.ptr = &_velocity;
|
||||
auto result = _configure(&_context, &m_upscalerKeyValueConfig.header);
|
||||
auto result = FfxApiProxy::D3D12_Configure()(&_context, &m_upscalerKeyValueConfig.header);
|
||||
|
||||
if (result != FFX_API_RETURN_OK)
|
||||
LOG_WARN("Velocity configure result: {}", (UINT)result);
|
||||
}
|
||||
|
||||
LOG_DEBUG("Dispatch!!");
|
||||
auto ffxresult = _dispatch(&_context, ¶ms.header);
|
||||
auto ffxresult = FfxApiProxy::D3D12_Dispatch()(&_context, ¶ms.header);
|
||||
|
||||
if (ffxresult != FFX_API_RETURN_OK)
|
||||
{
|
||||
LOG_ERROR("ffxFsr2ContextDispatch error: {0}", ResultToString(ffxresult));
|
||||
LOG_ERROR("ffxFsr2ContextDispatch error: {0}", FfxApiProxy::ReturnCodeToString(ffxresult));
|
||||
|
||||
Dx12CommandList->Close();
|
||||
ID3D12CommandList* ppCommandLists[] = { Dx12CommandList };
|
||||
@@ -549,10 +521,6 @@ bool FSR31FeatureDx11on12::Evaluate(ID3D11DeviceContext* InDeviceContext, NVSDK_
|
||||
return true;
|
||||
}
|
||||
|
||||
FSR31FeatureDx11on12::~FSR31FeatureDx11on12()
|
||||
{
|
||||
}
|
||||
|
||||
bool FSR31FeatureDx11on12::InitFSR3(const NVSDK_NGX_Parameter* InParameters)
|
||||
{
|
||||
LOG_FUNC();
|
||||
@@ -578,14 +546,14 @@ bool FSR31FeatureDx11on12::InitFSR3(const NVSDK_NGX_Parameter* InParameters)
|
||||
uint64_t versionCount = 0;
|
||||
versionQuery.outputCount = &versionCount;
|
||||
// get number of versions for allocation
|
||||
_query(nullptr, &versionQuery.header);
|
||||
FfxApiProxy::D3D12_Query()(nullptr, &versionQuery.header);
|
||||
|
||||
Config::Instance()->fsr3xVersionIds.resize(versionCount);
|
||||
Config::Instance()->fsr3xVersionNames.resize(versionCount);
|
||||
versionQuery.versionIds = Config::Instance()->fsr3xVersionIds.data();
|
||||
versionQuery.versionNames = Config::Instance()->fsr3xVersionNames.data();
|
||||
// fill version ids and names arrays.
|
||||
_query(nullptr, &versionQuery.header);
|
||||
FfxApiProxy::D3D12_Query()(nullptr, &versionQuery.header);
|
||||
|
||||
|
||||
_contextDesc.flags = 0;
|
||||
@@ -728,12 +696,12 @@ bool FSR31FeatureDx11on12::InitFSR3(const NVSDK_NGX_Parameter* InParameters)
|
||||
LOG_DEBUG("_createContext!");
|
||||
|
||||
Config::Instance()->SkipHeapCapture = true;
|
||||
auto ret = _createContext(&_context, &_contextDesc.header, NULL);
|
||||
auto ret = FfxApiProxy::D3D12_CreateContext()(&_context, &_contextDesc.header, NULL);
|
||||
Config::Instance()->SkipHeapCapture = false;
|
||||
|
||||
if (ret != FFX_API_RETURN_OK)
|
||||
{
|
||||
LOG_ERROR("_createContext error: {0}", ResultToString(ret));
|
||||
LOG_ERROR("_createContext error: {0}", FfxApiProxy::ReturnCodeToString(ret));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -21,5 +21,9 @@ public:
|
||||
bool Init(ID3D11Device* InDevice, ID3D11DeviceContext* InContext, NVSDK_NGX_Parameter* InParameters) override;
|
||||
bool Evaluate(ID3D11DeviceContext* InDeviceContext, NVSDK_NGX_Parameter* InParameters) override;
|
||||
|
||||
~FSR31FeatureDx11on12();
|
||||
~FSR31FeatureDx11on12()
|
||||
{
|
||||
if (_context != nullptr)
|
||||
FfxApiProxy::D3D12_DestroyContext()(&_context, NULL);
|
||||
}
|
||||
};
|
||||
@@ -7,35 +7,7 @@
|
||||
|
||||
FSR31FeatureDx12::FSR31FeatureDx12(unsigned int InHandleId, NVSDK_NGX_Parameter* InParameters) : FSR31Feature(InHandleId, InParameters), IFeature_Dx12(InHandleId, InParameters), IFeature(InHandleId, InParameters)
|
||||
{
|
||||
LOG_DEBUG("Loading amd_fidelityfx_dx12.dll methods");
|
||||
|
||||
auto file = Util::DllPath().parent_path() / "amd_fidelityfx_dx12.dll";
|
||||
LOG_INFO("Trying to load {}", file.string());
|
||||
|
||||
auto _dll = LoadLibrary(file.wstring().c_str());
|
||||
if (_dll != nullptr)
|
||||
{
|
||||
_configure = (PfnFfxConfigure)GetProcAddress(_dll, "ffxConfigure");
|
||||
_createContext = (PfnFfxCreateContext)GetProcAddress(_dll, "ffxCreateContext");
|
||||
_destroyContext = (PfnFfxDestroyContext)GetProcAddress(_dll, "ffxDestroyContext");
|
||||
_dispatch = (PfnFfxDispatch)GetProcAddress(_dll, "ffxDispatch");
|
||||
_query = (PfnFfxQuery)GetProcAddress(_dll, "ffxQuery");
|
||||
|
||||
_moduleLoaded = _configure != nullptr;
|
||||
}
|
||||
|
||||
if (!_moduleLoaded)
|
||||
{
|
||||
LOG_INFO("Trying to load amd_fidelityfx_dx12.dll with detours");
|
||||
|
||||
_configure = (PfnFfxConfigure)DetourFindFunction("amd_fidelityfx_dx12.dll", "ffxConfigure");
|
||||
_createContext = (PfnFfxCreateContext)DetourFindFunction("amd_fidelityfx_dx12.dll", "ffxCreateContext");
|
||||
_destroyContext = (PfnFfxDestroyContext)DetourFindFunction("amd_fidelityfx_dx12.dll", "ffxDestroyContext");
|
||||
_dispatch = (PfnFfxDispatch)DetourFindFunction("amd_fidelityfx_dx12.dll", "ffxDispatch");
|
||||
_query = (PfnFfxQuery)DetourFindFunction("amd_fidelityfx_dx12.dll", "ffxQuery");
|
||||
|
||||
_moduleLoaded = _configure != nullptr;
|
||||
}
|
||||
_moduleLoaded = FfxApiProxy::InitFfxDx12();
|
||||
|
||||
if (_moduleLoaded)
|
||||
LOG_INFO("amd_fidelityfx_dx12.dll methods loaded!");
|
||||
@@ -378,18 +350,18 @@ bool FSR31FeatureDx12::Evaluate(ID3D12GraphicsCommandList* InCommandList, NVSDK_
|
||||
m_upscalerKeyValueConfig.header.type = FFX_API_CONFIGURE_DESC_TYPE_UPSCALE_KEYVALUE;
|
||||
m_upscalerKeyValueConfig.key = FFX_API_CONFIGURE_UPSCALE_KEY_FVELOCITYFACTOR;
|
||||
m_upscalerKeyValueConfig.ptr = &_velocity;
|
||||
auto result = _configure(&_context, &m_upscalerKeyValueConfig.header);
|
||||
auto result = FfxApiProxy::D3D12_Configure()(&_context, &m_upscalerKeyValueConfig.header);
|
||||
|
||||
if (result != FFX_API_RETURN_OK)
|
||||
LOG_WARN("Velocity configure result: {}", (UINT)result);
|
||||
}
|
||||
|
||||
LOG_DEBUG("Dispatch!!");
|
||||
auto result = _dispatch(&_context, ¶ms.header);
|
||||
auto result = FfxApiProxy::D3D12_Dispatch()(&_context, ¶ms.header);
|
||||
|
||||
if (result != FFX_API_RETURN_OK)
|
||||
{
|
||||
LOG_ERROR("_dispatch error: {0}", ResultToString(result));
|
||||
LOG_ERROR("_dispatch error: {0}", FfxApiProxy::ReturnCodeToString(result));
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -502,10 +474,6 @@ bool FSR31FeatureDx12::Evaluate(ID3D12GraphicsCommandList* InCommandList, NVSDK_
|
||||
return true;
|
||||
}
|
||||
|
||||
FSR31FeatureDx12::~FSR31FeatureDx12()
|
||||
{
|
||||
}
|
||||
|
||||
bool FSR31FeatureDx12::InitFSR3(const NVSDK_NGX_Parameter* InParameters)
|
||||
{
|
||||
LOG_FUNC();
|
||||
@@ -531,14 +499,14 @@ bool FSR31FeatureDx12::InitFSR3(const NVSDK_NGX_Parameter* InParameters)
|
||||
uint64_t versionCount = 0;
|
||||
versionQuery.outputCount = &versionCount;
|
||||
// get number of versions for allocation
|
||||
_query(nullptr, &versionQuery.header);
|
||||
FfxApiProxy::D3D12_Query()(nullptr, &versionQuery.header);
|
||||
|
||||
Config::Instance()->fsr3xVersionIds.resize(versionCount);
|
||||
Config::Instance()->fsr3xVersionNames.resize(versionCount);
|
||||
versionQuery.versionIds = Config::Instance()->fsr3xVersionIds.data();
|
||||
versionQuery.versionNames = Config::Instance()->fsr3xVersionNames.data();
|
||||
// fill version ids and names arrays.
|
||||
_query(nullptr, &versionQuery.header);
|
||||
FfxApiProxy::D3D12_Query()(nullptr, &versionQuery.header);
|
||||
|
||||
_contextDesc.header.type = FFX_API_CREATE_CONTEXT_DESC_TYPE_UPSCALE;
|
||||
|
||||
@@ -680,12 +648,12 @@ bool FSR31FeatureDx12::InitFSR3(const NVSDK_NGX_Parameter* InParameters)
|
||||
LOG_DEBUG("_createContext!");
|
||||
|
||||
Config::Instance()->SkipHeapCapture = true;
|
||||
auto ret = _createContext(&_context, &_contextDesc.header, NULL);
|
||||
auto ret = FfxApiProxy::D3D12_CreateContext()(&_context, &_contextDesc.header, NULL);
|
||||
Config::Instance()->SkipHeapCapture = false;
|
||||
|
||||
if (ret != FFX_API_RETURN_OK)
|
||||
{
|
||||
LOG_ERROR("_createContext error: {0}", ResultToString(ret));
|
||||
LOG_ERROR("_createContext error: {0}", FfxApiProxy::ReturnCodeToString(ret));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -17,5 +17,9 @@ public:
|
||||
bool Init(ID3D12Device* InDevice, ID3D12GraphicsCommandList* InCommandList, NVSDK_NGX_Parameter* InParameters) override;
|
||||
bool Evaluate(ID3D12GraphicsCommandList* InCommandList, NVSDK_NGX_Parameter* InParameters) override;
|
||||
|
||||
~FSR31FeatureDx12();
|
||||
~FSR31FeatureDx12()
|
||||
{
|
||||
if(_context != nullptr)
|
||||
FfxApiProxy::D3D12_DestroyContext()(&_context, NULL);
|
||||
}
|
||||
};
|
||||
@@ -41,41 +41,12 @@ static inline FfxApiResourceDescription ffxApiGetImageResourceDescriptionVKLocal
|
||||
|
||||
FSR31FeatureVk::FSR31FeatureVk(unsigned int InHandleId, NVSDK_NGX_Parameter* InParameters) : FSR31Feature(InHandleId, InParameters), IFeature_Vk(InHandleId, InParameters), IFeature(InHandleId, InParameters)
|
||||
{
|
||||
LOG_DEBUG("Loading amd_fidelityfx_vk.dll methods");
|
||||
|
||||
auto file = Util::DllPath().parent_path() / "amd_fidelityfx_vk.dll";
|
||||
LOG_INFO("Trying to load {}", file.string());
|
||||
|
||||
auto _dll = LoadLibrary(file.wstring().c_str());
|
||||
|
||||
if (_dll != nullptr)
|
||||
{
|
||||
_configure = (PfnFfxConfigure)GetProcAddress(_dll, "ffxConfigure");
|
||||
_createContext = (PfnFfxCreateContext)GetProcAddress(_dll, "ffxCreateContext");
|
||||
_destroyContext = (PfnFfxDestroyContext)GetProcAddress(_dll, "ffxDestroyContext");
|
||||
_dispatch = (PfnFfxDispatch)GetProcAddress(_dll, "ffxDispatch");
|
||||
_query = (PfnFfxQuery)GetProcAddress(_dll, "ffxQuery");
|
||||
|
||||
_moduleLoaded = _configure != nullptr;
|
||||
}
|
||||
|
||||
if (!_moduleLoaded)
|
||||
{
|
||||
LOG_INFO("Trying to load amd_fidelityfx_vk.dll with detours");
|
||||
|
||||
_configure = (PfnFfxConfigure)DetourFindFunction("amd_fidelityfx_vk.dll", "ffxConfigure");
|
||||
_createContext = (PfnFfxCreateContext)DetourFindFunction("amd_fidelityfx_vk.dll", "ffxCreateContext");
|
||||
_destroyContext = (PfnFfxDestroyContext)DetourFindFunction("amd_fidelityfx_vk.dll", "ffxDestroyContext");
|
||||
_dispatch = (PfnFfxDispatch)DetourFindFunction("amd_fidelityfx_vk.dll", "ffxDispatch");
|
||||
_query = (PfnFfxQuery)DetourFindFunction("amd_fidelityfx_vk.dll", "ffxQuery");
|
||||
|
||||
_moduleLoaded = _configure != nullptr;
|
||||
}
|
||||
_moduleLoaded = FfxApiProxy::InitFfxVk();
|
||||
|
||||
if (_moduleLoaded)
|
||||
LOG_INFO("amd_fidelityfx_vk.dll methods loaded!");
|
||||
else
|
||||
LOG_ERROR("can't load amd_fidelityfx_vk.dll methods!");
|
||||
LOG_ERROR("Can't load amd_fidelityfx_vk.dll methods!");
|
||||
}
|
||||
|
||||
bool FSR31FeatureVk::InitFSR3(const NVSDK_NGX_Parameter* InParameters)
|
||||
@@ -103,14 +74,14 @@ bool FSR31FeatureVk::InitFSR3(const NVSDK_NGX_Parameter* InParameters)
|
||||
uint64_t versionCount = 0;
|
||||
versionQuery.outputCount = &versionCount;
|
||||
// get number of versions for allocation
|
||||
_query(nullptr, &versionQuery.header);
|
||||
FfxApiProxy::VULKAN_Query()(nullptr, &versionQuery.header);
|
||||
|
||||
Config::Instance()->fsr3xVersionIds.resize(versionCount);
|
||||
Config::Instance()->fsr3xVersionNames.resize(versionCount);
|
||||
versionQuery.versionIds = Config::Instance()->fsr3xVersionIds.data();
|
||||
versionQuery.versionNames = Config::Instance()->fsr3xVersionNames.data();
|
||||
// fill version ids and names arrays.
|
||||
_query(nullptr, &versionQuery.header);
|
||||
FfxApiProxy::VULKAN_Query()(nullptr, &versionQuery.header);
|
||||
|
||||
_contextDesc.header.type = FFX_API_CREATE_CONTEXT_DESC_TYPE_UPSCALE;
|
||||
_contextDesc.fpMessage = FfxLogCallback;
|
||||
@@ -213,13 +184,13 @@ bool FSR31FeatureVk::InitFSR3(const NVSDK_NGX_Parameter* InParameters)
|
||||
backendDesc.header.pNext = &ov.header;
|
||||
|
||||
LOG_DEBUG("_createContext!");
|
||||
auto ret = _createContext(&_context, &_contextDesc.header, NULL);
|
||||
auto ret = FfxApiProxy::VULKAN_CreateContext()(&_context, &_contextDesc.header, NULL);
|
||||
|
||||
Config::Instance()->dxgiSkipSpoofing = false;
|
||||
|
||||
if (ret != FFX_API_RETURN_OK)
|
||||
{
|
||||
LOG_ERROR("_createContext error: {0}", ResultToString(ret));
|
||||
LOG_ERROR("_createContext error: {0}", FfxApiProxy::ReturnCodeToString(ret));
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -484,18 +455,18 @@ bool FSR31FeatureVk::Evaluate(VkCommandBuffer InCmdBuffer, NVSDK_NGX_Parameter*
|
||||
m_upscalerKeyValueConfig.header.type = FFX_API_CONFIGURE_DESC_TYPE_UPSCALE_KEYVALUE;
|
||||
m_upscalerKeyValueConfig.key = FFX_API_CONFIGURE_UPSCALE_KEY_FVELOCITYFACTOR;
|
||||
m_upscalerKeyValueConfig.ptr = &_velocity;
|
||||
auto result = _configure(&_context, &m_upscalerKeyValueConfig.header);
|
||||
auto result = FfxApiProxy::VULKAN_Configure()(&_context, &m_upscalerKeyValueConfig.header);
|
||||
|
||||
if (result != FFX_API_RETURN_OK)
|
||||
LOG_WARN("Velocity configure result: {}", (UINT)result);
|
||||
}
|
||||
|
||||
LOG_DEBUG("Dispatch!!");
|
||||
auto result = _dispatch(&_context, ¶ms.header);
|
||||
auto result = FfxApiProxy::VULKAN_Dispatch()(&_context, ¶ms.header);
|
||||
|
||||
if (result != FFX_API_RETURN_OK)
|
||||
{
|
||||
LOG_ERROR("ffxFsr2ContextDispatch error: {0}", ResultToString(result));
|
||||
LOG_ERROR("ffxFsr2ContextDispatch error: {0}", FfxApiProxy::ReturnCodeToString(result));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -16,4 +16,10 @@ public:
|
||||
|
||||
bool Init(VkInstance InInstance, VkPhysicalDevice InPD, VkDevice InDevice, VkCommandBuffer InCmdList, PFN_vkGetInstanceProcAddr InGIPA, PFN_vkGetDeviceProcAddr InGDPA, NVSDK_NGX_Parameter* InParameters) override;
|
||||
bool Evaluate(VkCommandBuffer InCmdBuffer, NVSDK_NGX_Parameter* InParameters) override;
|
||||
|
||||
~FSR31FeatureVk()
|
||||
{
|
||||
if (_context != nullptr)
|
||||
FfxApiProxy::VULKAN_DestroyContext()(&_context, NULL);
|
||||
}
|
||||
};
|
||||
|
||||
+12
-4
@@ -6,6 +6,7 @@
|
||||
#include "Util.h"
|
||||
#include "NVNGX_Proxy.h"
|
||||
#include "XeSS_Proxy.h"
|
||||
#include "FfxApi_Proxy.h"
|
||||
|
||||
#include "hooks/HooksDx.h"
|
||||
#include "hooks/HooksVk.h"
|
||||
@@ -1595,6 +1596,8 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv
|
||||
switch (ul_reason_for_call)
|
||||
{
|
||||
case DLL_PROCESS_ATTACH:
|
||||
DisableThreadLibraryCalls(hModule);
|
||||
|
||||
if (loadCount > 1)
|
||||
{
|
||||
LOG_INFO("DLL_PROCESS_ATTACH from module: {0:X}, count: {1}", (UINT64)hModule, loadCount);
|
||||
@@ -1605,8 +1608,6 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv
|
||||
dllModule = hModule;
|
||||
processId = GetCurrentProcessId();
|
||||
|
||||
DisableThreadLibraryCalls(hModule);
|
||||
|
||||
loadCount++;
|
||||
|
||||
#ifdef VER_PRE_RELEASE
|
||||
@@ -1671,6 +1672,13 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv
|
||||
if (!XeSSProxy::InitXeSS())
|
||||
spdlog::warn("Can't init XeSS!");
|
||||
|
||||
// Init FfxApi proxy
|
||||
if (!FfxApiProxy::InitFfxDx12())
|
||||
spdlog::warn("Can't init Dx12 FfxApi!");
|
||||
|
||||
if (!FfxApiProxy::InitFfxVk())
|
||||
spdlog::warn("Can't init Vulkan FfxApi!");
|
||||
|
||||
// Check for working mode and attach hooks
|
||||
spdlog::info("");
|
||||
CheckWorkingMode();
|
||||
@@ -1704,11 +1712,11 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserv
|
||||
break;
|
||||
|
||||
case DLL_THREAD_ATTACH:
|
||||
LOG_TRACE("DLL_THREAD_ATTACH from module: {0:X}, count: {1}", (UINT64)hModule, loadCount);
|
||||
LOG_DEBUG_ONLY("DLL_THREAD_ATTACH from module: {0:X}, count: {1}", (UINT64)hModule, loadCount);
|
||||
break;
|
||||
|
||||
case DLL_THREAD_DETACH:
|
||||
LOG_TRACE("DLL_THREAD_DETACH from module: {0:X}, count: {1}", (UINT64)hModule, loadCount);
|
||||
LOG_DEBUG_ONLY("DLL_THREAD_DETACH from module: {0:X}, count: {1}", (UINT64)hModule, loadCount);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
@@ -149,13 +149,6 @@ static PFN_Dispatch o_Dispatch = nullptr;
|
||||
static PFN_DiscardResource o_DiscardResource = nullptr;
|
||||
#endif
|
||||
|
||||
// FSR 3.x methods
|
||||
static PfnFfxCreateContext _createContext = nullptr;
|
||||
static PfnFfxDestroyContext _destroyContext = nullptr;
|
||||
static PfnFfxConfigure _configure = nullptr;
|
||||
static PfnFfxQuery _query = nullptr;
|
||||
static PfnFfxDispatch _dispatch = nullptr;
|
||||
|
||||
// swapchains variables
|
||||
static ankerl::unordered_dense::map <HWND, SwapChainInfo> fgSwapChains;
|
||||
static bool fgSkipSCWrapping = false;
|
||||
@@ -271,45 +264,6 @@ static HRESULT hkEnumAdapters1(IDXGIFactory1* This, UINT Adapter, IUnknown** ppA
|
||||
static HRESULT hkEnumAdapterByLuid(IDXGIFactory4* This, LUID AdapterLuid, REFIID riid, IUnknown** ppvAdapter);
|
||||
static HRESULT hkEnumAdapterByGpuPreference(IDXGIFactory6* This, UINT Adapter, DXGI_GPU_PREFERENCE GpuPreference, REFIID riid, IUnknown** ppvAdapter);
|
||||
|
||||
static void LoadFSR31Funcs()
|
||||
{
|
||||
|
||||
ID3D12Resource* textureResource;
|
||||
ID3D12DescriptorHeap* srvHeap;
|
||||
D3D12_GPU_DESCRIPTOR_HANDLE srvGpuHandle;
|
||||
|
||||
LOG_DEBUG("Loading amd_fidelityfx_dx12.dll methods");
|
||||
|
||||
auto file = Util::DllPath().parent_path() / "amd_fidelityfx_dx12.dll";
|
||||
LOG_INFO("Trying to load {}", file.string());
|
||||
|
||||
auto _dll = LoadLibrary(file.wstring().c_str());
|
||||
if (_dll != nullptr)
|
||||
{
|
||||
_configure = (PfnFfxConfigure)GetProcAddress(_dll, "ffxConfigure");
|
||||
_createContext = (PfnFfxCreateContext)GetProcAddress(_dll, "ffxCreateContext");
|
||||
_destroyContext = (PfnFfxDestroyContext)GetProcAddress(_dll, "ffxDestroyContext");
|
||||
_dispatch = (PfnFfxDispatch)GetProcAddress(_dll, "ffxDispatch");
|
||||
_query = (PfnFfxQuery)GetProcAddress(_dll, "ffxQuery");
|
||||
}
|
||||
|
||||
if (_configure == nullptr)
|
||||
{
|
||||
LOG_INFO("Trying to load amd_fidelityfx_dx12.dll with detours");
|
||||
|
||||
_configure = (PfnFfxConfigure)DetourFindFunction("amd_fidelityfx_dx12.dll", "ffxConfigure");
|
||||
_createContext = (PfnFfxCreateContext)DetourFindFunction("amd_fidelityfx_dx12.dll", "ffxCreateContext");
|
||||
_destroyContext = (PfnFfxDestroyContext)DetourFindFunction("amd_fidelityfx_dx12.dll", "ffxDestroyContext");
|
||||
_dispatch = (PfnFfxDispatch)DetourFindFunction("amd_fidelityfx_dx12.dll", "ffxDispatch");
|
||||
_query = (PfnFfxQuery)DetourFindFunction("amd_fidelityfx_dx12.dll", "ffxQuery");
|
||||
}
|
||||
|
||||
if (_configure != nullptr)
|
||||
LOG_INFO("amd_fidelityfx_dx12.dll methods loaded!");
|
||||
else
|
||||
LOG_ERROR("can't load amd_fidelityfx_dx12.dll methods!");
|
||||
}
|
||||
|
||||
static void FfxFgLogCallback(uint32_t type, const wchar_t* message)
|
||||
{
|
||||
std::wstring string(message);
|
||||
@@ -524,7 +478,7 @@ static void GetHudless(ID3D12GraphicsCommandList* This)
|
||||
if (Config::Instance()->CurrentFeature != nullptr)
|
||||
fgLastFGFrame = Config::Instance()->CurrentFeature->FrameCount();
|
||||
|
||||
dispatchResult = _dispatch(reinterpret_cast<ffxContext*>(pUserCtx), ¶ms->header);
|
||||
dispatchResult = FfxApiProxy::D3D12_Dispatch()(reinterpret_cast<ffxContext*>(pUserCtx), ¶ms->header);
|
||||
ID3D12CommandList* cl[1] = { nullptr };
|
||||
result = HooksDx::fgCopyCommandList->Close();
|
||||
cl[0] = HooksDx::fgCopyCommandList;
|
||||
@@ -551,7 +505,7 @@ static void GetHudless(ID3D12GraphicsCommandList* This)
|
||||
m_FrameGenerationConfig.header.pNext = &debugDesc.header;
|
||||
|
||||
Config::Instance()->dxgiSkipSpoofing = true;
|
||||
ffxReturnCode_t retCode = _configure(&HooksDx::fgContext, &m_FrameGenerationConfig.header);
|
||||
ffxReturnCode_t retCode = FfxApiProxy::D3D12_Configure()(&HooksDx::fgContext, &m_FrameGenerationConfig.header);
|
||||
Config::Instance()->dxgiSkipSpoofing = false;
|
||||
LOG_DEBUG("_configure result: {0:X}, frame: {1}", retCode, frame);
|
||||
|
||||
@@ -605,7 +559,7 @@ static void GetHudless(ID3D12GraphicsCommandList* This)
|
||||
}
|
||||
|
||||
Config::Instance()->dxgiSkipSpoofing = true;
|
||||
retCode = _dispatch(&HooksDx::fgContext, &dfgPrepare.header);
|
||||
retCode = FfxApiProxy::D3D12_Dispatch()(&HooksDx::fgContext, &dfgPrepare.header);
|
||||
fgDispatchCalled = true;
|
||||
Config::Instance()->dxgiSkipSpoofing = false;
|
||||
LOG_DEBUG("_dispatch result: {0}, frame: {1}", retCode, frame);
|
||||
@@ -1724,7 +1678,7 @@ static HRESULT hkCreateSwapChain(IDXGIFactory* pFactory, IUnknown* pDevice, DXGI
|
||||
}
|
||||
|
||||
ID3D12CommandQueue* cq = nullptr;
|
||||
if (Config::Instance()->FGUseFGSwapChain.value_or(true) && !fgSkipSCWrapping && _createContext != nullptr && pDevice->QueryInterface(IID_PPV_ARGS(&cq)) == S_OK)
|
||||
if (Config::Instance()->FGUseFGSwapChain.value_or(true) && !fgSkipSCWrapping && FfxApiProxy::InitFfxDx12() && pDevice->QueryInterface(IID_PPV_ARGS(&cq)) == S_OK)
|
||||
{
|
||||
cq->SetName(L"GameQueue");
|
||||
SwapChainInfo scInfo{};
|
||||
@@ -1744,7 +1698,7 @@ static HRESULT hkCreateSwapChain(IDXGIFactory* pFactory, IUnknown* pDevice, DXGI
|
||||
Config::Instance()->dxgiSkipSpoofing = true;
|
||||
Config::Instance()->SkipHeapCapture = true;
|
||||
|
||||
auto result = _createContext(&HooksDx::fgSwapChainContext, &createSwapChainDesc.header, nullptr);
|
||||
auto result = FfxApiProxy::D3D12_CreateContext()(&HooksDx::fgSwapChainContext, &createSwapChainDesc.header, nullptr);
|
||||
|
||||
Config::Instance()->SkipHeapCapture = false;
|
||||
Config::Instance()->dxgiSkipSpoofing = false;
|
||||
@@ -1756,10 +1710,12 @@ static HRESULT hkCreateSwapChain(IDXGIFactory* pFactory, IUnknown* pDevice, DXGI
|
||||
scInfo.swapChainBufferCount = pDesc->BufferCount;
|
||||
scInfo.swapChain = (IDXGISwapChain4*)*ppSwapChain;
|
||||
fgSwapChains.insert_or_assign(pDesc->OutputWindow, scInfo);
|
||||
|
||||
LOG_DEBUG("Created FSR-FG swapchain");
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
LOG_ERROR("_createContext error: {}", result);
|
||||
LOG_ERROR("D3D12_CreateContext error: {}", result);
|
||||
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
@@ -1830,7 +1786,7 @@ static HRESULT hkCreateSwapChainForHwnd(IDXGIFactory* This, IUnknown* pDevice, H
|
||||
}
|
||||
|
||||
ID3D12CommandQueue* cq = nullptr;
|
||||
if (Config::Instance()->FGUseFGSwapChain.value_or(true) && !fgSkipSCWrapping && _createContext != nullptr && pDevice->QueryInterface(IID_PPV_ARGS(&cq)) == S_OK)
|
||||
if (Config::Instance()->FGUseFGSwapChain.value_or(true) && !fgSkipSCWrapping && FfxApiProxy::InitFfxDx12() && pDevice->QueryInterface(IID_PPV_ARGS(&cq)) == S_OK)
|
||||
{
|
||||
SwapChainInfo scInfo{};
|
||||
scInfo.gameCommandQueue = cq;
|
||||
@@ -1854,7 +1810,7 @@ static HRESULT hkCreateSwapChainForHwnd(IDXGIFactory* This, IUnknown* pDevice, H
|
||||
fgSkipSCWrapping = true;
|
||||
Config::Instance()->SkipHeapCapture = true;
|
||||
|
||||
auto result = _createContext(&HooksDx::fgSwapChainContext, &createSwapChainDesc.header, nullptr);
|
||||
auto result = FfxApiProxy::D3D12_CreateContext()(&HooksDx::fgSwapChainContext, &createSwapChainDesc.header, nullptr);
|
||||
|
||||
Config::Instance()->SkipHeapCapture = false;
|
||||
fgSkipSCWrapping = false;
|
||||
@@ -1866,6 +1822,8 @@ static HRESULT hkCreateSwapChainForHwnd(IDXGIFactory* This, IUnknown* pDevice, H
|
||||
scInfo.swapChainBufferCount = pDesc->BufferCount;
|
||||
scInfo.swapChain = (IDXGISwapChain4*)*ppSwapChain;
|
||||
fgSwapChains.insert_or_assign(hWnd, scInfo);
|
||||
|
||||
LOG_DEBUG("Created FSR-FG swapchain");
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
@@ -2622,8 +2580,6 @@ void HooksDx::HookDx()
|
||||
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
|
||||
LoadFSR31Funcs();
|
||||
}
|
||||
|
||||
UINT HooksDx::ClearFrameResources()
|
||||
@@ -2768,10 +2724,10 @@ void HooksDx::CreateFGContext(ID3D12Device* InDevice, IFeature* deviceContext)
|
||||
m_FrameGenerationConfig.header.type = FFX_API_CONFIGURE_DESC_TYPE_FRAMEGENERATION;
|
||||
m_FrameGenerationConfig.frameGenerationEnabled = true;
|
||||
m_FrameGenerationConfig.swapChain = HooksDx::currentSwapchain;
|
||||
//m_FrameGenerationConfig.presentCallback = nullptr;
|
||||
m_FrameGenerationConfig.presentCallback = nullptr;
|
||||
m_FrameGenerationConfig.HUDLessColor = FfxApiResource({});
|
||||
|
||||
auto result = _configure(&HooksDx::fgContext, &m_FrameGenerationConfig.header);
|
||||
auto result = FfxApiProxy::D3D12_Configure()(&HooksDx::fgContext, &m_FrameGenerationConfig.header);
|
||||
|
||||
HooksDx::fgIsActive = (result == FFX_API_RETURN_OK);
|
||||
|
||||
@@ -2810,7 +2766,7 @@ void HooksDx::CreateFGContext(ID3D12Device* InDevice, IFeature* deviceContext)
|
||||
|
||||
Config::Instance()->dxgiSkipSpoofing = true;
|
||||
Config::Instance()->SkipHeapCapture = true;
|
||||
ffxReturnCode_t retCode = _createContext(&HooksDx::fgContext, &createFg.header, nullptr);
|
||||
ffxReturnCode_t retCode = FfxApiProxy::D3D12_CreateContext()(&HooksDx::fgContext, &createFg.header, nullptr);
|
||||
Config::Instance()->SkipHeapCapture = false;
|
||||
Config::Instance()->dxgiSkipSpoofing = false;
|
||||
LOG_INFO("_createContext result: {0:X}", retCode);
|
||||
@@ -2836,7 +2792,7 @@ void HooksDx::StopAndDestroyFGContext(bool destroy, bool shutDown)
|
||||
m_FrameGenerationConfig.presentCallback = nullptr;
|
||||
m_FrameGenerationConfig.HUDLessColor = FfxApiResource({});
|
||||
|
||||
auto result = _configure(&HooksDx::fgContext, &m_FrameGenerationConfig.header);
|
||||
auto result = FfxApiProxy::D3D12_Configure()(&HooksDx::fgContext, &m_FrameGenerationConfig.header);
|
||||
|
||||
HooksDx::fgIsActive = false;
|
||||
|
||||
@@ -2846,7 +2802,7 @@ void HooksDx::StopAndDestroyFGContext(bool destroy, bool shutDown)
|
||||
|
||||
if (destroy && HooksDx::fgContext != nullptr)
|
||||
{
|
||||
auto result = _destroyContext(&HooksDx::fgContext, nullptr);
|
||||
auto result = FfxApiProxy::D3D12_DestroyContext()(&HooksDx::fgContext, nullptr);
|
||||
|
||||
if (!shutDown)
|
||||
LOG_INFO(" FG _destroyContext result: {0:X}", result);
|
||||
|
||||
@@ -4,12 +4,11 @@
|
||||
#include "../format_transfer/FT_Dx12.h"
|
||||
#include "../backends/IFeature.h"
|
||||
|
||||
|
||||
#include <d3d11_4.h>
|
||||
#include <d3d12.h>
|
||||
#include <dxgi1_6.h>
|
||||
|
||||
#include <ffx_api.h>
|
||||
#include "../FfxApi_Proxy.h"
|
||||
#include <dx12/ffx_api_dx12.h>
|
||||
#include <ffx_framegeneration.h>
|
||||
|
||||
|
||||
@@ -67,6 +67,13 @@ inline DWORD processId;
|
||||
#define LOG_FUNC_RESULT(result) \
|
||||
spdlog::trace(__FUNCTION__ " result: {0:X}" , (UINT64)result)
|
||||
|
||||
typedef struct _feature_version
|
||||
{
|
||||
unsigned int major;
|
||||
unsigned int minor;
|
||||
unsigned int patch;
|
||||
} feature_version;
|
||||
|
||||
inline static std::string wstring_to_string(const std::wstring& wide_str)
|
||||
{
|
||||
std::string str(wide_str.length(), 0);
|
||||
|
||||
Reference in New Issue
Block a user