mirror of
https://github.com/optiscaler/OptiScaler.git
synced 2026-09-26 07:16:17 +00:00
stash 2
This commit is contained in:
@@ -193,6 +193,10 @@ public:
|
||||
std::optional<uint32_t> FN_LatencyFlexMode; // conservative - aggressive - reflex ids
|
||||
std::optional<uint32_t> FN_ForceReflex; // in-game - force disable - force enable
|
||||
|
||||
// framerate
|
||||
bool ReflexAvailable = false;
|
||||
std::optional<float> FramerateLimit;
|
||||
|
||||
// for realtime changes
|
||||
bool changeBackend = false;
|
||||
std::string newBackend = "";
|
||||
|
||||
@@ -194,6 +194,10 @@ copy $(SolutionDir)nvngx.ini $(SolutionDir)x64\Release\a\</Command>
|
||||
<ClInclude Include="hooks\Hooks.h" />
|
||||
<ClInclude Include="hooks\LoadLibrary.h" />
|
||||
<ClInclude Include="hooks\Vulkan.h" />
|
||||
<ClInclude Include="nvapi\fakenvapi.h" />
|
||||
<ClInclude Include="nvapi\NvApiHooks.h" />
|
||||
<ClInclude Include="nvapi\NvApiTypes.h" />
|
||||
<ClInclude Include="nvapi\ReflexHooks.h" />
|
||||
<ClInclude Include="proxies\FfxApi_Proxy.h" />
|
||||
<ClInclude Include="upscalers\dlssd\DLSSDFeature.h" />
|
||||
<ClInclude Include="upscalers\dlssd\DLSSDFeature_Dx11.h" />
|
||||
@@ -251,13 +255,13 @@ copy $(SolutionDir)nvngx.ini $(SolutionDir)x64\Release\a\</Command>
|
||||
<ClInclude Include="include\imgui\imstb_rectpack.h" />
|
||||
<ClInclude Include="include\imgui\imstb_textedit.h" />
|
||||
<ClInclude Include="include\imgui\imstb_truetype.h" />
|
||||
<ClInclude Include="menu\imgui_dx_base.h" />
|
||||
<ClInclude Include="menu\imgui_common.h" />
|
||||
<ClInclude Include="menu\imgui_dx11.h" />
|
||||
<ClInclude Include="menu\imgui_dx12.h" />
|
||||
<ClInclude Include="menu\imgui_overlay_base.h" />
|
||||
<ClInclude Include="menu\imgui_overlay_dx.h" />
|
||||
<ClInclude Include="menu\imgui_overlay_vk.h" />
|
||||
<ClInclude Include="menu\OldMenuBase.h" />
|
||||
<ClInclude Include="menu\MenuCommon.h" />
|
||||
<ClInclude Include="menu\OldMenuDx11.h" />
|
||||
<ClInclude Include="menu\OldMenuDx12.h" />
|
||||
<ClInclude Include="menu\MenuBase.h" />
|
||||
<ClInclude Include="menu\MenuDx.h" />
|
||||
<ClInclude Include="menu\MenuVulkan.h" />
|
||||
<ClInclude Include="menu\wrapped_swapchain.h" />
|
||||
<ClInclude Include="Logger.h" />
|
||||
<ClInclude Include="apis\NVNGX_Parameter.h" />
|
||||
@@ -318,13 +322,13 @@ copy $(SolutionDir)nvngx.ini $(SolutionDir)x64\Release\a\</Command>
|
||||
<ClCompile Include="include\imgui\imgui_impl_win32.cpp" />
|
||||
<ClCompile Include="include\imgui\imgui_tables.cpp" />
|
||||
<ClCompile Include="include\imgui\imgui_widgets.cpp" />
|
||||
<ClCompile Include="menu\imgui_common.cpp" />
|
||||
<ClCompile Include="menu\imgui_dx_base.cpp" />
|
||||
<ClCompile Include="menu\imgui_dx11.cpp" />
|
||||
<ClCompile Include="menu\imgui_dx12.cpp" />
|
||||
<ClCompile Include="menu\imgui_overlay_base.cpp" />
|
||||
<ClCompile Include="menu\imgui_overlay_dx.cpp" />
|
||||
<ClCompile Include="menu\imgui_overlay_vk.cpp" />
|
||||
<ClCompile Include="menu\MenuCommon.cpp" />
|
||||
<ClCompile Include="menu\OldMenuBase.cpp" />
|
||||
<ClCompile Include="menu\OldMenuDx11.cpp" />
|
||||
<ClCompile Include="menu\OldMenuDx12.cpp" />
|
||||
<ClCompile Include="menu\MenuBase.cpp" />
|
||||
<ClCompile Include="menu\MenuDx.cpp" />
|
||||
<ClCompile Include="menu\MenuVulkan.cpp" />
|
||||
<ClCompile Include="menu\wrapped_swapchain.cpp" />
|
||||
<ClCompile Include="Logger.cpp" />
|
||||
<ClCompile Include="apis\NVNGX.cpp" />
|
||||
|
||||
@@ -341,7 +341,10 @@ bool WorkingMode::Check()
|
||||
} while (false);
|
||||
|
||||
if (modeFound)
|
||||
{
|
||||
Config::Instance()->OverlayMenu = (!isNvngxMode || isWorkingWithEnabler) && Config::Instance()->OverlayMenu.value_or(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
LOG_ERROR("Unsupported dll name: {0}", filename);
|
||||
return false;
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#include "Config.h"
|
||||
#include "NVNGX_Parameter.h"
|
||||
#include "proxies/NVNGX_Proxy.h"
|
||||
#include <menu/imgui_overlay_dx.h>
|
||||
#include <menu/MenuDx.h>
|
||||
#include "upscalers/dlss/DLSSFeature_Dx12.h"
|
||||
#include "upscalers/dlssd/DLSSDFeature_Dx12.h"
|
||||
#include "upscalers/fsr2/FSR2Feature_Dx12.h"
|
||||
@@ -272,13 +272,13 @@ NVSDK_NGX_API NVSDK_NGX_Result NVSDK_NGX_D3D12_Init_Ext(unsigned long long InApp
|
||||
queryHeapDesc.Count = 2; // Start and End timestamps
|
||||
queryHeapDesc.NodeMask = 0;
|
||||
queryHeapDesc.Type = D3D12_QUERY_HEAP_TYPE_TIMESTAMP;
|
||||
auto result = InDevice->CreateQueryHeap(&queryHeapDesc, IID_PPV_ARGS(&ImGuiOverlayDx::queryHeap));
|
||||
auto result = InDevice->CreateQueryHeap(&queryHeapDesc, IID_PPV_ARGS(&MenuDx::queryHeap));
|
||||
|
||||
// Create a readback buffer to retrieve timestamp data
|
||||
D3D12_RESOURCE_DESC bufferDesc = CD3DX12_RESOURCE_DESC::Buffer(2 * sizeof(UINT64));
|
||||
D3D12_HEAP_PROPERTIES heapProps = {};
|
||||
heapProps.Type = D3D12_HEAP_TYPE_READBACK;
|
||||
result = InDevice->CreateCommittedResource(&heapProps, D3D12_HEAP_FLAG_NONE, &bufferDesc, D3D12_RESOURCE_STATE_COPY_DEST, nullptr, IID_PPV_ARGS(&ImGuiOverlayDx::readbackBuffer));
|
||||
result = InDevice->CreateCommittedResource(&heapProps, D3D12_HEAP_FLAG_NONE, &bufferDesc, D3D12_RESOURCE_STATE_COPY_DEST, nullptr, IID_PPV_ARGS(&MenuDx::readbackBuffer));
|
||||
|
||||
return NVSDK_NGX_Result_Success;
|
||||
}
|
||||
@@ -402,7 +402,7 @@ NVSDK_NGX_API NVSDK_NGX_Result NVSDK_NGX_D3D12_Shutdown(void)
|
||||
|
||||
// Unhooking and cleaning stuff causing issues during shutdown.
|
||||
// Disabled for now to check if it cause any issues
|
||||
//ImGuiOverlayDx::UnHookDx();
|
||||
//MenuDx::UnHookDx();
|
||||
|
||||
shutdown = false;
|
||||
|
||||
@@ -1161,17 +1161,17 @@ NVSDK_NGX_API NVSDK_NGX_Result NVSDK_NGX_D3D12_EvaluateFeature(ID3D12GraphicsCom
|
||||
}
|
||||
|
||||
// Record the first timestamp (before FSR2 upscaling)
|
||||
InCmdList->EndQuery(ImGuiOverlayDx::queryHeap, D3D12_QUERY_TYPE_TIMESTAMP, 0);
|
||||
InCmdList->EndQuery(MenuDx::queryHeap, D3D12_QUERY_TYPE_TIMESTAMP, 0);
|
||||
|
||||
bool evalResult = deviceContext->Evaluate(InCmdList, InParameters);
|
||||
|
||||
// Record the second timestamp (after FSR2 upscaling)
|
||||
InCmdList->EndQuery(ImGuiOverlayDx::queryHeap, D3D12_QUERY_TYPE_TIMESTAMP, 1);
|
||||
InCmdList->EndQuery(MenuDx::queryHeap, D3D12_QUERY_TYPE_TIMESTAMP, 1);
|
||||
|
||||
// Resolve the queries to the readback buffer
|
||||
InCmdList->ResolveQueryData(ImGuiOverlayDx::queryHeap, D3D12_QUERY_TYPE_TIMESTAMP, 0, 2, ImGuiOverlayDx::readbackBuffer, 0);
|
||||
InCmdList->ResolveQueryData(MenuDx::queryHeap, D3D12_QUERY_TYPE_TIMESTAMP, 0, 2, MenuDx::readbackBuffer, 0);
|
||||
|
||||
ImGuiOverlayDx::dx12UpscaleTrig = true;
|
||||
MenuDx::dx12UpscaleTrig = true;
|
||||
|
||||
if (deviceContext->Name() != "DLSSD" && (Config::Instance()->RestoreComputeSignature.value_or(false) || Config::Instance()->RestoreGraphicSignature.value_or(false)))
|
||||
{
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include "resource.h"
|
||||
#include "NVNGX_Parameter.h"
|
||||
#include "proxies/NVNGX_Proxy.h"
|
||||
#include "menu/imgui_overlay_vk.h"
|
||||
#include "menu/MenuVulkan.h"
|
||||
#include "upscalers/fsr2/FSR2Feature_Vk.h"
|
||||
#include "upscalers/dlss/DLSSFeature_Vk.h"
|
||||
#include "upscalers/dlssd/DLSSDFeature_Vk.h"
|
||||
|
||||
@@ -7,61 +7,6 @@
|
||||
#include "proxies/NVNGX_Proxy.h"
|
||||
#include "proxies/FfxApi_Proxy.h"
|
||||
#include "proxies/XeSS_Proxy.h"
|
||||
#include "menu/imgui_overlay_dx.h"
|
||||
#include "menu/imgui_overlay_vk.h"
|
||||
|
||||
#pragma warning (disable : 4996)
|
||||
|
||||
inline std::vector<std::string> upscalerNames =
|
||||
{
|
||||
"nvngx.dll",
|
||||
"nvngx",
|
||||
"libxess.dll",
|
||||
"libxess"
|
||||
};
|
||||
|
||||
inline std::vector<std::string> nvngxDlss =
|
||||
{
|
||||
"nvngx_dlss.dll",
|
||||
"nvngx_dlss",
|
||||
};
|
||||
|
||||
inline std::vector<std::string> nvapiNames =
|
||||
{
|
||||
"nvapi64.dll",
|
||||
"nvapi64",
|
||||
};
|
||||
|
||||
inline std::vector<std::string> dllNames;
|
||||
|
||||
inline std::vector<std::wstring> upscalerNamesW =
|
||||
{
|
||||
L"nvngx.dll",
|
||||
L"nvngx",
|
||||
L"libxess.dll",
|
||||
L"libxess"
|
||||
};
|
||||
|
||||
inline std::vector<std::wstring> nvngxDlssW =
|
||||
{
|
||||
L"nvngx_dlss.dll",
|
||||
L"nvngx_dlss",
|
||||
};
|
||||
|
||||
inline std::vector<std::wstring> nvapiNamesW =
|
||||
{
|
||||
L"nvapi64.dll",
|
||||
L"nvapi64",
|
||||
};
|
||||
|
||||
inline std::vector<std::wstring> dllNamesW;
|
||||
|
||||
static int loadCount = 0;
|
||||
static bool dontCount = false;
|
||||
|
||||
static bool isNvngxMode = false;
|
||||
static bool isWorkingWithEnabler = false;
|
||||
static bool isNvngxAvailable = false;
|
||||
|
||||
void AttachHooks();
|
||||
void DetachHooks();
|
||||
@@ -261,55 +206,6 @@ static void DetachHooks()
|
||||
}
|
||||
}
|
||||
|
||||
static void AttachHooks()
|
||||
{
|
||||
LOG_FUNC();
|
||||
|
||||
if (o_LoadLibraryA == nullptr || o_LoadLibraryW == nullptr)
|
||||
{
|
||||
// Detour the functions
|
||||
o_FreeLibrary = reinterpret_cast<PFN_FreeLibrary>(DetourFindFunction("kernel32.dll", "FreeLibrary"));
|
||||
o_LoadLibraryA = reinterpret_cast<PFN_LoadLibraryA>(DetourFindFunction("kernel32.dll", "LoadLibraryA"));
|
||||
o_LoadLibraryW = reinterpret_cast<PFN_LoadLibraryW>(DetourFindFunction("kernel32.dll", "LoadLibraryW"));
|
||||
o_LoadLibraryExA = reinterpret_cast<PFN_LoadLibraryExA>(DetourFindFunction("kernel32.dll", "LoadLibraryExA"));
|
||||
o_LoadLibraryExW = reinterpret_cast<PFN_LoadLibraryExW>(DetourFindFunction("kernel32.dll", "LoadLibraryExW"));
|
||||
#ifdef _DEBUG
|
||||
o_GetProcAddress = reinterpret_cast<PFN_GetProcAddress>(DetourFindFunction("kernel32.dll", "GetProcAddress"));
|
||||
#endif // DEBUG
|
||||
|
||||
if (o_LoadLibraryA != nullptr || o_LoadLibraryW != nullptr || o_LoadLibraryExA != nullptr || o_LoadLibraryExW != nullptr)
|
||||
{
|
||||
LOG_INFO("Attaching LoadLibrary hooks");
|
||||
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
|
||||
if (o_FreeLibrary)
|
||||
DetourAttach(&(PVOID&)o_FreeLibrary, hkFreeLibrary);
|
||||
|
||||
if (o_LoadLibraryA)
|
||||
DetourAttach(&(PVOID&)o_LoadLibraryA, hkLoadLibraryA);
|
||||
|
||||
if (o_LoadLibraryW)
|
||||
DetourAttach(&(PVOID&)o_LoadLibraryW, hkLoadLibraryW);
|
||||
|
||||
if (o_LoadLibraryExA)
|
||||
DetourAttach(&(PVOID&)o_LoadLibraryExA, hkLoadLibraryExA);
|
||||
|
||||
if (o_LoadLibraryExW)
|
||||
DetourAttach(&(PVOID&)o_LoadLibraryExW, hkLoadLibraryExW);
|
||||
|
||||
if (o_GetProcAddress)
|
||||
DetourAttach(&(PVOID&)o_GetProcAddress, hkGetProcAddress);
|
||||
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
|
||||
{
|
||||
switch (ul_reason_for_call)
|
||||
|
||||
+147
-124
@@ -4,6 +4,7 @@
|
||||
#include <Config.h>
|
||||
#include "Vulkan.h"
|
||||
#include <WorkingMode.h>
|
||||
#include <nvapi/NvApiHooks.h>
|
||||
|
||||
#include <include/detours/detours.h>
|
||||
|
||||
@@ -21,93 +22,20 @@ static PFN_LoadLibraryExA o_LoadLibraryExA = nullptr;
|
||||
static PFN_LoadLibraryExW o_LoadLibraryExW = nullptr;
|
||||
static PFN_GetProcAddress o_GetProcAddress = nullptr;
|
||||
|
||||
static std::vector<std::string> upscalerNames =
|
||||
{
|
||||
"nvngx.dll",
|
||||
"nvngx",
|
||||
"libxess.dll",
|
||||
"libxess"
|
||||
};
|
||||
|
||||
static std::vector<std::string> nvngxDlss =
|
||||
{
|
||||
"nvngx_dlss.dll",
|
||||
"nvngx_dlss",
|
||||
};
|
||||
|
||||
static std::vector<std::string> nvapiNames =
|
||||
{
|
||||
"nvapi64.dll",
|
||||
"nvapi64",
|
||||
};
|
||||
|
||||
static std::vector<std::wstring> upscalerNamesW =
|
||||
{
|
||||
L"nvngx.dll",
|
||||
L"nvngx",
|
||||
L"libxess.dll",
|
||||
L"libxess"
|
||||
};
|
||||
|
||||
static std::vector<std::wstring> nvngxDlssW =
|
||||
{
|
||||
L"nvngx_dlss.dll",
|
||||
L"nvngx_dlss",
|
||||
};
|
||||
|
||||
static std::vector<std::wstring> nvapiNamesW =
|
||||
{
|
||||
L"nvapi64.dll",
|
||||
L"nvapi64",
|
||||
};
|
||||
|
||||
static std::vector<std::wstring> dx11NamesW =
|
||||
{
|
||||
L"d3d11.dll",
|
||||
L"d3d11",
|
||||
};
|
||||
|
||||
static std::vector<std::string> dx11Names =
|
||||
{
|
||||
"d3d11.dll",
|
||||
"d3d11",
|
||||
};
|
||||
|
||||
static std::vector<std::wstring> dx12NamesW =
|
||||
{
|
||||
L"d3d12.dll",
|
||||
L"d3d12",
|
||||
};
|
||||
|
||||
static std::vector<std::string> dx12Names =
|
||||
{
|
||||
"d3d12.dll",
|
||||
"d3d12",
|
||||
};
|
||||
|
||||
inline std::vector<std::wstring> dxgiNamesW =
|
||||
{
|
||||
L"dxgi.dll",
|
||||
L"dxgi",
|
||||
};
|
||||
|
||||
static std::vector<std::string> dxgiNames =
|
||||
{
|
||||
"dxgi.dll",
|
||||
"dxgi",
|
||||
};
|
||||
|
||||
static std::vector<std::wstring> vkNamesW =
|
||||
{
|
||||
L"vulkan-1.dll",
|
||||
L"vulkan-1",
|
||||
};
|
||||
|
||||
static std::vector<std::string> vkNames =
|
||||
{
|
||||
"vulkan-1.dll",
|
||||
"vulkan-1",
|
||||
};
|
||||
static std::vector<std::string> upscalerNames = { "nvngx.dll", "nvngx", "libxess.dll", "libxess" };
|
||||
static std::vector<std::wstring> upscalerNamesW = { L"nvngx.dll", L"nvngx", L"libxess.dll", L"libxess" };
|
||||
static std::vector<std::string> nvngxDlss = { "nvngx_dlss.dll", "nvngx_dlss", };
|
||||
static std::vector<std::wstring> nvngxDlssW = { L"nvngx_dlss.dll", L"nvngx_dlss", };
|
||||
static std::vector<std::string> nvapiNames = { "nvapi64.dll", "nvapi64", };
|
||||
static std::vector<std::wstring> nvapiNamesW = { L"nvapi64.dll", L"nvapi64", };
|
||||
static std::vector<std::string> dx11Names = { "d3d11.dll", "d3d11", };
|
||||
static std::vector<std::wstring> dx11NamesW = { L"d3d11.dll", L"d3d11", };
|
||||
static std::vector<std::string> dx12Names = { "d3d12.dll", "d3d12", };
|
||||
static std::vector<std::wstring> dx12NamesW = { L"d3d12.dll", L"d3d12", };
|
||||
static std::vector<std::string> dxgiNames = { "dxgi.dll", "dxgi", };
|
||||
static std::vector<std::wstring> dxgiNamesW = { L"dxgi.dll", L"dxgi", };
|
||||
static std::vector<std::string> vkNames = { "vulkan-1.dll", "vulkan-1", };
|
||||
static std::vector<std::wstring> vkNamesW = { L"vulkan-1.dll", L"vulkan-1", };
|
||||
|
||||
static bool dontCount = false;
|
||||
static bool skipLoadChecks = false;
|
||||
@@ -228,14 +156,12 @@ inline static HMODULE LoadLibraryCheck(std::string lcaseLibName)
|
||||
{
|
||||
VulkanHooks::Hook();
|
||||
VulkanHooks::HookExtension();
|
||||
|
||||
if (Config::Instance()->OverlayMenu.value_or(true))
|
||||
HooksVk::HookVk();
|
||||
}
|
||||
|
||||
skipLoadChecks = false;
|
||||
|
||||
if (!WorkingMode::IsNvngxMode() && CheckDllName(&lcaseLibName, &WorkingMode::DllNames()))
|
||||
auto names = WorkingMode::DllNames();
|
||||
if (!WorkingMode::IsNvngxMode() && CheckDllName(&lcaseLibName, &names))
|
||||
{
|
||||
LOG_INFO("{0} call returning this dll!", lcaseLibName);
|
||||
|
||||
@@ -335,14 +261,12 @@ inline static HMODULE LoadLibraryCheckW(std::wstring lcaseLibName)
|
||||
{
|
||||
VulkanHooks::Hook();
|
||||
VulkanHooks::HookExtension();
|
||||
|
||||
if (Config::Instance()->OverlayMenu.value_or(true))
|
||||
HooksVk::HookVk();
|
||||
}
|
||||
|
||||
skipLoadChecks = false;
|
||||
|
||||
if (!WorkingMode::IsNvngxMode() && CheckDllNameW(&lcaseLibName, &WorkingMode::DllNamesW()))
|
||||
auto names = WorkingMode::DllNamesW();
|
||||
if (!WorkingMode::IsNvngxMode() && CheckDllNameW(&lcaseLibName, &names))
|
||||
{
|
||||
LOG_INFO("{0} call returning this dll!", lcaseLibNameA);
|
||||
|
||||
@@ -588,47 +512,146 @@ void LoadLibraryHooks::Hook()
|
||||
{
|
||||
LOG_FUNC();
|
||||
|
||||
if (o_LoadLibraryA == nullptr || o_LoadLibraryW == nullptr)
|
||||
{
|
||||
// Detour the functions
|
||||
o_FreeLibrary = reinterpret_cast<PFN_FreeLibrary>(DetourFindFunction("kernel32.dll", "FreeLibrary"));
|
||||
// Detour the functions
|
||||
o_FreeLibrary = reinterpret_cast<PFN_FreeLibrary>(DetourFindFunction("kernel32.dll", "FreeLibrary"));
|
||||
|
||||
o_LoadLibraryA = reinterpret_cast<PFN_LoadLibraryA>(DetourFindFunction("kernel32.dll", "LoadLibraryA"));
|
||||
o_LoadLibraryW = reinterpret_cast<PFN_LoadLibraryW>(DetourFindFunction("kernel32.dll", "LoadLibraryW"));
|
||||
o_LoadLibraryExA = reinterpret_cast<PFN_LoadLibraryExA>(DetourFindFunction("kernel32.dll", "LoadLibraryExA"));
|
||||
o_LoadLibraryExW = reinterpret_cast<PFN_LoadLibraryExW>(DetourFindFunction("kernel32.dll", "LoadLibraryExW"));
|
||||
o_LoadLibraryA = reinterpret_cast<PFN_LoadLibraryA>(DetourFindFunction("kernel32.dll", "LoadLibraryA"));
|
||||
o_LoadLibraryW = reinterpret_cast<PFN_LoadLibraryW>(DetourFindFunction("kernel32.dll", "LoadLibraryW"));
|
||||
o_LoadLibraryExA = reinterpret_cast<PFN_LoadLibraryExA>(DetourFindFunction("kernel32.dll", "LoadLibraryExA"));
|
||||
o_LoadLibraryExW = reinterpret_cast<PFN_LoadLibraryExW>(DetourFindFunction("kernel32.dll", "LoadLibraryExW"));
|
||||
|
||||
#ifdef _DEBUG
|
||||
//o_GetProcAddress = reinterpret_cast<PFN_GetProcAddress>(DetourFindFunction("kernel32.dll", "GetProcAddress"));
|
||||
//o_GetProcAddress = reinterpret_cast<PFN_GetProcAddress>(DetourFindFunction("kernel32.dll", "GetProcAddress"));
|
||||
#endif // DEBUG
|
||||
|
||||
if (o_LoadLibraryA != nullptr || o_LoadLibraryW != nullptr || o_LoadLibraryExA != nullptr || o_LoadLibraryExW != nullptr)
|
||||
{
|
||||
LOG_INFO("Attaching LoadLibrary hooks");
|
||||
if (o_LoadLibraryA != nullptr || o_LoadLibraryW != nullptr || o_LoadLibraryExA != nullptr || o_LoadLibraryExW != nullptr)
|
||||
{
|
||||
LOG_INFO("Attaching LoadLibrary hooks");
|
||||
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
|
||||
if (o_FreeLibrary)
|
||||
DetourAttach(&(PVOID&)o_FreeLibrary, hkFreeLibrary);
|
||||
if (o_FreeLibrary)
|
||||
DetourAttach(&(PVOID&)o_FreeLibrary, hkFreeLibrary);
|
||||
|
||||
if (o_LoadLibraryA)
|
||||
DetourAttach(&(PVOID&)o_LoadLibraryA, hkLoadLibraryA);
|
||||
if (o_LoadLibraryA)
|
||||
DetourAttach(&(PVOID&)o_LoadLibraryA, hkLoadLibraryA);
|
||||
|
||||
if (o_LoadLibraryW)
|
||||
DetourAttach(&(PVOID&)o_LoadLibraryW, hkLoadLibraryW);
|
||||
if (o_LoadLibraryW)
|
||||
DetourAttach(&(PVOID&)o_LoadLibraryW, hkLoadLibraryW);
|
||||
|
||||
if (o_LoadLibraryExA)
|
||||
DetourAttach(&(PVOID&)o_LoadLibraryExA, hkLoadLibraryExA);
|
||||
if (o_LoadLibraryExA)
|
||||
DetourAttach(&(PVOID&)o_LoadLibraryExA, hkLoadLibraryExA);
|
||||
|
||||
if (o_LoadLibraryExW)
|
||||
DetourAttach(&(PVOID&)o_LoadLibraryExW, hkLoadLibraryExW);
|
||||
if (o_LoadLibraryExW)
|
||||
DetourAttach(&(PVOID&)o_LoadLibraryExW, hkLoadLibraryExW);
|
||||
|
||||
if (o_GetProcAddress)
|
||||
DetourAttach(&(PVOID&)o_GetProcAddress, hkGetProcAddress);
|
||||
if (o_GetProcAddress)
|
||||
DetourAttach(&(PVOID&)o_GetProcAddress, hkGetProcAddress);
|
||||
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
|
||||
HMODULE dxgiModule = nullptr;
|
||||
dxgiModule = GetModuleHandle(L"dxgi.dll");
|
||||
if (dxgiModule != nullptr)
|
||||
{
|
||||
LOG_DEBUG("dxgi.dll already in memory");
|
||||
HookForDxgiSpoofing();
|
||||
}
|
||||
|
||||
HMODULE vulkanModule = nullptr;
|
||||
vulkanModule = GetModuleHandle(L"vulkan-1.dll");
|
||||
if (vulkanModule != nullptr)
|
||||
{
|
||||
LOG_DEBUG("vulkan-1.dll already in memory");
|
||||
VulkanHooks::Hook();
|
||||
VulkanHooks::HookExtension();
|
||||
}
|
||||
|
||||
HMODULE nvapi64 = nullptr;
|
||||
nvapi64 = GetModuleHandle(L"nvapi64.dll");
|
||||
if (nvapi64 != nullptr)
|
||||
{
|
||||
LOG_DEBUG("nvapi64.dll already in memory");
|
||||
NvApiHooks::Hook(nvapi64);
|
||||
}
|
||||
|
||||
// dx menu hooks
|
||||
HMODULE d3d11Module = nullptr;
|
||||
d3d11Module = GetModuleHandle(L"d3d11.dll");
|
||||
if (Config::Instance()->OverlayMenu.value() && d3d11Module != nullptr)
|
||||
{
|
||||
LOG_DEBUG("d3d11.dll already in memory");
|
||||
HooksDx::HookDx11();
|
||||
}
|
||||
|
||||
HMODULE d3d12Module = nullptr;
|
||||
d3d12Module = GetModuleHandle(L"d3d12.dll");
|
||||
if (Config::Instance()->OverlayMenu.value() && d3d12Module != nullptr)
|
||||
{
|
||||
LOG_DEBUG("d3d12.dll already in memory");
|
||||
HooksDx::HookDx12();
|
||||
}
|
||||
|
||||
if (Config::Instance()->OverlayMenu.value() && dxgiModule != nullptr)
|
||||
HooksDx::HookDxgi();
|
||||
}
|
||||
|
||||
void LoadLibraryHooks::Unhook()
|
||||
{
|
||||
VulkanHooks::UnhookExtension();
|
||||
VulkanHooks::Unhook();
|
||||
|
||||
DetourTransactionBegin();
|
||||
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
|
||||
if (o_FreeLibrary)
|
||||
{
|
||||
DetourDetach(&(PVOID&)o_FreeLibrary, hkFreeLibrary);
|
||||
o_FreeLibrary = nullptr;
|
||||
}
|
||||
|
||||
if (o_LoadLibraryA)
|
||||
{
|
||||
DetourDetach(&(PVOID&)o_LoadLibraryA, hkLoadLibraryA);
|
||||
o_LoadLibraryA = nullptr;
|
||||
}
|
||||
|
||||
if (o_LoadLibraryW)
|
||||
{
|
||||
DetourDetach(&(PVOID&)o_LoadLibraryW, hkLoadLibraryW);
|
||||
o_LoadLibraryW = nullptr;
|
||||
}
|
||||
|
||||
if (o_LoadLibraryExA)
|
||||
{
|
||||
DetourDetach(&(PVOID&)o_LoadLibraryExA, hkLoadLibraryExA);
|
||||
o_LoadLibraryExA = nullptr;
|
||||
}
|
||||
|
||||
if (o_LoadLibraryExW)
|
||||
{
|
||||
DetourDetach(&(PVOID&)o_LoadLibraryExW, hkLoadLibraryExW);
|
||||
o_LoadLibraryExW = nullptr;
|
||||
}
|
||||
|
||||
if (o_GetProcAddress)
|
||||
{
|
||||
DetourDetach(&(PVOID&)o_GetProcAddress, hkGetProcAddress);
|
||||
o_GetProcAddress = nullptr;
|
||||
}
|
||||
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
|
||||
void LoadLibraryHooks::AddLoad()
|
||||
{
|
||||
loadCount++;
|
||||
}
|
||||
|
||||
UINT LoadLibraryHooks::LoadCount()
|
||||
{
|
||||
return loadCount;
|
||||
}
|
||||
|
||||
@@ -5,6 +5,8 @@ class LoadLibraryHooks
|
||||
{
|
||||
private:
|
||||
public:
|
||||
void Hook();
|
||||
void Unhook();
|
||||
static void Hook();
|
||||
static void Unhook();
|
||||
static void AddLoad();
|
||||
static UINT LoadCount();
|
||||
};
|
||||
|
||||
+127
-5
@@ -1,7 +1,9 @@
|
||||
#include "Vulkan.h"
|
||||
|
||||
#include <Util.h>
|
||||
#include <Config.h>
|
||||
#include <WorkingMode.h>
|
||||
#include <menu/MenuVulkan.h>
|
||||
#include <include/detours/detours.h>
|
||||
|
||||
#include <vulkan/vulkan_core.h>
|
||||
@@ -12,6 +14,18 @@ typedef struct VkDummyProps
|
||||
void* pNext;
|
||||
} VkDummyProps;
|
||||
|
||||
typedef struct VkWin32SurfaceCreateInfoKHR {
|
||||
VkStructureType sType;
|
||||
const void* pNext;
|
||||
VkFlags flags;
|
||||
HINSTANCE hinstance;
|
||||
HWND hwnd;
|
||||
} VkWin32SurfaceCreateInfoKHR;
|
||||
|
||||
typedef VkResult(*PFN_QueuePresentKHR)(VkQueue, const VkPresentInfoKHR*);
|
||||
typedef VkResult(*PFN_CreateSwapchainKHR)(VkDevice, const VkSwapchainCreateInfoKHR*, const VkAllocationCallbacks*, VkSwapchainKHR*);
|
||||
typedef VkResult(*PFN_vkCreateWin32SurfaceKHR)(VkInstance, const VkWin32SurfaceCreateInfoKHR*, const VkAllocationCallbacks*, VkSurfaceKHR*);
|
||||
|
||||
static PFN_vkGetPhysicalDeviceProperties o_vkGetPhysicalDeviceProperties = nullptr;
|
||||
static PFN_vkGetPhysicalDeviceProperties2 o_vkGetPhysicalDeviceProperties2 = nullptr;
|
||||
static PFN_vkGetPhysicalDeviceProperties2KHR o_vkGetPhysicalDeviceProperties2KHR = nullptr;
|
||||
@@ -21,9 +35,106 @@ static PFN_vkEnumerateDeviceExtensionProperties o_vkEnumerateDeviceExtensionProp
|
||||
static PFN_vkCreateDevice o_vkCreateDevice = nullptr;
|
||||
static PFN_vkCreateInstance o_vkCreateInstance = nullptr;
|
||||
|
||||
static PFN_QueuePresentKHR o_QueuePresentKHR = nullptr;
|
||||
static PFN_CreateSwapchainKHR o_CreateSwapchainKHR = nullptr;
|
||||
static PFN_vkCreateWin32SurfaceKHR o_vkCreateWin32SurfaceKHR = nullptr;
|
||||
|
||||
static uint32_t vkEnumerateInstanceExtensionPropertiesCount = 0;
|
||||
static uint32_t vkEnumerateDeviceExtensionPropertiesCount = 0;
|
||||
|
||||
static VkResult hkvkQueuePresentKHR(VkQueue queue, VkPresentInfoKHR* pPresentInfo)
|
||||
{
|
||||
LOG_FUNC();
|
||||
|
||||
if (Config::Instance()->OverlayMenu.value_or(true))
|
||||
{
|
||||
auto menuResult = MenuVulkan::QueuePresent(queue, pPresentInfo);
|
||||
|
||||
if (menuResult == VK_INCOMPLETE)
|
||||
{
|
||||
Config::Instance()->VulkanCreatingSC = true;
|
||||
auto r0 = o_QueuePresentKHR(queue, pPresentInfo);
|
||||
Config::Instance()->VulkanCreatingSC = false;
|
||||
|
||||
if (r0 != VK_SUCCESS)
|
||||
LOG_ERROR("o_QueuePresentKHR(queue, pPresentInfo): {0:X}", (UINT)r0);
|
||||
|
||||
return r0;
|
||||
}
|
||||
|
||||
if (menuResult != VK_SUCCESS)
|
||||
return menuResult;
|
||||
}
|
||||
|
||||
// original call
|
||||
Config::Instance()->VulkanCreatingSC = true;
|
||||
auto result = o_QueuePresentKHR(queue, pPresentInfo);
|
||||
Config::Instance()->VulkanCreatingSC = false;
|
||||
|
||||
LOG_FUNC_RESULT(result);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static VkResult hkvkCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchain)
|
||||
{
|
||||
LOG_FUNC();
|
||||
|
||||
Config::Instance()->VulkanCreatingSC = true;
|
||||
auto result = o_CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
|
||||
Config::Instance()->VulkanCreatingSC = false;
|
||||
|
||||
if (Config::Instance()->OverlayMenu.value_or(true) && result == VK_SUCCESS &&
|
||||
device != VK_NULL_HANDLE && pCreateInfo != nullptr && *pSwapchain != VK_NULL_HANDLE && !Config::Instance()->VulkanSkipHooks)
|
||||
{
|
||||
MenuVulkan::CreateSwapchain(device, pCreateInfo, pSwapchain);
|
||||
}
|
||||
|
||||
LOG_FUNC_RESULT(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
static void HookDevice(VkDevice InDevice)
|
||||
{
|
||||
if (o_CreateSwapchainKHR != nullptr || Config::Instance()->VulkanSkipHooks)
|
||||
return;
|
||||
|
||||
LOG_FUNC();
|
||||
|
||||
o_QueuePresentKHR = (PFN_QueuePresentKHR)(vkGetDeviceProcAddr(InDevice, "vkQueuePresentKHR"));
|
||||
o_CreateSwapchainKHR = (PFN_CreateSwapchainKHR)(vkGetDeviceProcAddr(InDevice, "vkCreateSwapchainKHR"));
|
||||
|
||||
if (o_CreateSwapchainKHR)
|
||||
{
|
||||
LOG_DEBUG("Hooking VkDevice");
|
||||
|
||||
// Hook
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
|
||||
DetourAttach(&(PVOID&)o_QueuePresentKHR, hkvkQueuePresentKHR);
|
||||
DetourAttach(&(PVOID&)o_CreateSwapchainKHR, hkvkCreateSwapchainKHR);
|
||||
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
}
|
||||
|
||||
static VkResult hkvkCreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface)
|
||||
{
|
||||
LOG_FUNC();
|
||||
|
||||
auto result = o_vkCreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
|
||||
|
||||
if (Config::Instance()->OverlayMenu.value_or(true) && result == VK_SUCCESS && !Config::Instance()->VulkanSkipHooks)
|
||||
{
|
||||
MenuVulkan::CreateSurface(instance, pCreateInfo->hwnd);
|
||||
}
|
||||
|
||||
LOG_FUNC_RESULT(result);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static void hkvkGetPhysicalDeviceProperties(VkPhysicalDevice physical_device, VkPhysicalDeviceProperties* properties)
|
||||
{
|
||||
o_vkGetPhysicalDeviceProperties(physical_device, properties);
|
||||
@@ -127,12 +238,18 @@ static VkResult hkvkCreateInstance(const VkInstanceCreateInfo* pCreateInfo, cons
|
||||
|
||||
LOG_DEBUG("o_vkCreateInstance result: {0:X}", (INT)result);
|
||||
|
||||
auto head = (VkBaseInStructure*)pCreateInfo;
|
||||
|
||||
while (head->pNext != nullptr)
|
||||
if (result == VK_SUCCESS)
|
||||
{
|
||||
head = (VkBaseInStructure*)head->pNext;
|
||||
LOG_DEBUG("o_vkCreateInstance type: {0:X}", (UINT)head->sType);
|
||||
auto head = (VkBaseInStructure*)pCreateInfo;
|
||||
|
||||
while (head->pNext != nullptr)
|
||||
{
|
||||
head = (VkBaseInStructure*)head->pNext;
|
||||
LOG_DEBUG("o_vkCreateInstance type: {0:X}", (UINT)head->sType);
|
||||
}
|
||||
|
||||
if (Config::Instance()->OverlayMenu.value_or(true))
|
||||
MenuVulkan::CreateInstance(pInstance);
|
||||
}
|
||||
|
||||
return result;
|
||||
@@ -193,6 +310,11 @@ static VkResult hkvkCreateDevice(VkPhysicalDevice physicalDevice, VkDeviceCreate
|
||||
auto result = o_vkCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
|
||||
Config::Instance()->dxgiSkipSpoofing = false;
|
||||
|
||||
if (result == VK_SUCCESS && !Config::Instance()->VulkanSkipHooks)
|
||||
{
|
||||
HookDevice(*pDevice);
|
||||
}
|
||||
|
||||
LOG_FUNC_RESULT(result);
|
||||
|
||||
return result;
|
||||
|
||||
@@ -1,353 +0,0 @@
|
||||
#include "ImguiSpdLog.h"
|
||||
|
||||
class SinkLineContent
|
||||
{
|
||||
public:
|
||||
spdlog::level::level_enum LogLevel; // If n_levels, the message pushed counts to the previous pushed line
|
||||
|
||||
int32_t BeginIndex; // Base offset into the text buffer
|
||||
|
||||
struct ColorDataRanges {
|
||||
uint32_t SubStringBegin : 12;
|
||||
uint32_t SubStringEnd : 12;
|
||||
uint32_t FormatTag : 8;
|
||||
};
|
||||
|
||||
ImVector<ColorDataRanges> FormattedStringRanges;
|
||||
};
|
||||
|
||||
|
||||
// TODO: work on filters, they are really needed, did optimize the memory storage quite a bit tho
|
||||
class ImGuiSpdLogAdaptor : public spdlog::sinks::base_sink<std::mutex> {
|
||||
|
||||
using sink_t = spdlog::sinks::base_sink<std::mutex>;
|
||||
|
||||
public:
|
||||
void DrawLogWindow() {
|
||||
|
||||
if (ImGui::Begin("CyberXeSS Log", &ShowWindow)) {
|
||||
|
||||
// Options submenu menu
|
||||
if (ImGui::BeginPopup("Options")) {
|
||||
|
||||
ImGui::Checkbox("Auto-scroll", &EnableAutoScrolling);
|
||||
ImGui::EndPopup();
|
||||
}
|
||||
|
||||
if (ImGui::Button("Options"))
|
||||
ImGui::OpenPopup("Options");
|
||||
|
||||
ImGui::SameLine();
|
||||
ImGui::SameLine();
|
||||
|
||||
if (ImGui::Button("Clear"))
|
||||
ClearLogBuffers();
|
||||
|
||||
ImGui::SameLine();
|
||||
|
||||
ImGui::Text("%d messages logged, using %dmb memory", NumberOfLogEntries, (LoggedContent.size() + IndicesInBytes) / (1024 * 1024));
|
||||
|
||||
// Filter out physical messgaes through logger
|
||||
static const char* LogLevels[] = SPDLOG_LEVEL_NAMES;
|
||||
|
||||
static const auto LogSelectionWidth = []() -> float
|
||||
{
|
||||
float LongestTextWidth = 0;
|
||||
for (auto LogLevelText : LogLevels) {
|
||||
|
||||
auto TextWidth = ImGui::CalcTextSize(LogLevelText).x;
|
||||
if (TextWidth > LongestTextWidth)
|
||||
LongestTextWidth = TextWidth;
|
||||
}
|
||||
|
||||
return LongestTextWidth +
|
||||
ImGui::GetStyle().FramePadding.x * 2 +
|
||||
ImGui::GetFrameHeight();
|
||||
}();
|
||||
|
||||
auto ComboBoxRightAlignment = ImGui::GetWindowSize().x - (LogSelectionWidth + ImGui::GetStyle().WindowPadding.x);
|
||||
auto ActiveLogLevel = spdlog::get_level();
|
||||
|
||||
ImGui::SetNextItemWidth(LogSelectionWidth);
|
||||
ImGui::SameLine(ComboBoxRightAlignment);
|
||||
|
||||
ImGui::Combo("##ActiveLogLevel", reinterpret_cast<int32_t*>(&ActiveLogLevel), LogLevels, sizeof(LogLevels) / sizeof(LogLevels[0]));
|
||||
spdlog::set_level(ActiveLogLevel);
|
||||
|
||||
// Filter out messages on display
|
||||
FilterTextMatch.Draw("##LogFilter", ImGui::GetWindowSize().x - (LogSelectionWidth + ImGui::GetStyle().WindowPadding.x * 2 + ImGui::GetStyle().FramePadding.x));
|
||||
|
||||
ImGui::SetNextItemWidth(LogSelectionWidth);
|
||||
ImGui::SameLine(ComboBoxRightAlignment);
|
||||
ImGui::Combo("##FilterLogLevel", &FilterLogLevel, LogLevels, sizeof(LogLevels) / sizeof(LogLevels[0]));
|
||||
|
||||
// Draw main log window
|
||||
ImGui::Separator();
|
||||
ImGui::BeginChild("LogTextView", ImVec2(0, 0), false, ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar);
|
||||
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0));
|
||||
const std::lock_guard LogLock(sink_t::mutex_);
|
||||
|
||||
RebuildFilterWithPreviousStates();
|
||||
|
||||
ImGuiListClipper ViewClipper;
|
||||
ViewClipper.Begin(FilteredView.size());
|
||||
|
||||
while (ViewClipper.Step())
|
||||
{
|
||||
int32_t StylesPushedToStack = 0;
|
||||
for (auto ClipperLineNumber = ViewClipper.DisplayStart; ClipperLineNumber < ViewClipper.DisplayEnd; ++ClipperLineNumber)
|
||||
{
|
||||
auto& LogMetaDataEntry = LogMetaData[FilteredView[ClipperLineNumber]];
|
||||
|
||||
if (LogMetaDataEntry.LogLevel == spdlog::level::n_levels)
|
||||
ImGui::Indent();
|
||||
|
||||
for (auto i = 0; i < LogMetaDataEntry.FormattedStringRanges.size(); ++i)
|
||||
{
|
||||
static const ImVec4 BrightColorsToVec[]{
|
||||
{ 0, 0, 0, 1 }, // COLOR_BRIGHTBLACK
|
||||
{ 1, 0, 0, 1 }, // COLOR_BRIGHTRED
|
||||
{ 0, 1, 0, 1 }, // COLOR_BRIGHTGREEN
|
||||
{ 1, 1, 0, 1 }, // COLOR_BRIGHTYELLOW
|
||||
{ 0, 0, 1, 1 }, // COLOR_BRIGHTBLUE
|
||||
{ 1, 0, 1, 1 }, // COLOR_BRIGHTMAGENTA
|
||||
{ 0, 1, 1, 1 }, // COLOR_BRIGHTCYAN
|
||||
{ 1, 1, 1, 1 } // COLOR_BRIGHTWHITE
|
||||
};
|
||||
|
||||
ImGui::PushStyleColor(ImGuiCol_Text, BrightColorsToVec[LogMetaDataEntry.FormattedStringRanges[i].FormatTag]);
|
||||
++StylesPushedToStack;
|
||||
|
||||
|
||||
auto FormatRangeBegin = LoggedContent.begin() + LogMetaDataEntry.BeginIndex + LogMetaDataEntry.FormattedStringRanges[i].SubStringBegin;
|
||||
auto FormatRangeEnd = LoggedContent.begin() + LogMetaDataEntry.BeginIndex + LogMetaDataEntry.FormattedStringRanges[i].SubStringEnd;
|
||||
ImGui::TextUnformatted(FormatRangeBegin, FormatRangeEnd);
|
||||
|
||||
if (LogMetaDataEntry.FormattedStringRanges.size() - (i + 1))
|
||||
ImGui::SameLine();
|
||||
}
|
||||
|
||||
if (LogMetaDataEntry.LogLevel == spdlog::level::n_levels)
|
||||
ImGui::Unindent();
|
||||
}
|
||||
|
||||
ImGui::PopStyleColor(StylesPushedToStack);
|
||||
}
|
||||
|
||||
ViewClipper.End();
|
||||
ImGui::PopStyleVar();
|
||||
|
||||
if (EnableAutoScrolling && ImGui::GetScrollY() >= ImGui::GetScrollMaxY())
|
||||
ImGui::SetScrollHereY(1.0f);
|
||||
|
||||
ImGui::EndChild();
|
||||
}
|
||||
|
||||
ImGui::End();
|
||||
}
|
||||
|
||||
void ClearLogBuffers(IN bool DisableLock = false)
|
||||
{
|
||||
if (!DisableLock)
|
||||
sink_t::mutex_.lock();
|
||||
|
||||
LoggedContent.clear();
|
||||
LogMetaData.clear();
|
||||
NumberOfLogEntries = 0;
|
||||
IndicesInBytes = 0;
|
||||
|
||||
if (!DisableLock)
|
||||
sink_t::mutex_.unlock();
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
// Writing version 2, this will accept ansi escape sequences for colors
|
||||
void sink_it_(IN const spdlog::details::log_msg& LogMessage) final
|
||||
{
|
||||
// This is all protected by the base sink under a mutex
|
||||
++NumberOfLogEntries;
|
||||
|
||||
// Format the logged message and push it into the text buffer
|
||||
spdlog::memory_buf_t FormattedBuffer;
|
||||
|
||||
sink_t::formatter_->format(LogMessage, FormattedBuffer);
|
||||
|
||||
std::string FormattedText = FormattedBuffer;
|
||||
|
||||
// Process string by converting the color range passed to an escape sequence first,
|
||||
// yes may not be the nicest way of doing this but its way easier to process later.
|
||||
const char* ColorToEscapeSequence[]{ ESC_BRIGHTMAGENTA, ESC_CYAN, ESC_BRIGHTGREEN, ESC_BRIGHTYELLOW, ESC_BRIGHTRED, ESC_RED };
|
||||
|
||||
FormattedText.insert(LogMessage.color_range_start, ColorToEscapeSequence[LogMessage.level]);
|
||||
FormattedText.insert(LogMessage.color_range_end + 5, "\x1b[0m");
|
||||
|
||||
bool FilterPassing = LogMessage.level >= FilterLogLevel;
|
||||
FilterPassing &= FilterTextMatch.PassFilter(FormattedText.c_str(), FormattedText.c_str() + FormattedText.size());
|
||||
|
||||
// Parse formatted logged string for ansi escape sequences
|
||||
auto OldTextBufferSize = LoggedContent.size();
|
||||
SinkLineContent MessageData2{ LogMessage.level, OldTextBufferSize };
|
||||
|
||||
AnsiEscapeSequenceTag LastSequenceTagSinceBegin = FORMAT_RESET_COLORS;
|
||||
|
||||
// Prematurely filter out immediately starting non default formats,
|
||||
// and then enter the main processing loop
|
||||
switch (FormattedText[0])
|
||||
{
|
||||
case '\x1b':
|
||||
case '\n':
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
SinkLineContent::ColorDataRanges FormatPush{ 0, 0, LastSequenceTagSinceBegin };
|
||||
MessageData2.FormattedStringRanges.push_back(FormatPush);
|
||||
break;
|
||||
}
|
||||
|
||||
for (auto i = 0; i < FormattedText.size(); ++i)
|
||||
{
|
||||
switch (FormattedText[i]) {
|
||||
case '\n': {
|
||||
|
||||
// Handle new line bullshit, spdlog will terminate any logged message witha new line
|
||||
// we can also assume this may not be the last line, so we continue the previous sequence into
|
||||
// the next logically text line if necessary and reconfigure pushstate
|
||||
if (MessageData2.FormattedStringRanges.size())
|
||||
MessageData2.FormattedStringRanges.back().SubStringEnd = i;
|
||||
if (FilterPassing)
|
||||
FilteredView.push_back(LogMetaData.size());
|
||||
LogMetaData.push_back(MessageData2);
|
||||
|
||||
IndicesInBytes += MessageData2.FormattedStringRanges.size() *
|
||||
sizeof(SinkLineContent::ColorDataRanges) +
|
||||
sizeof(SinkLineContent);
|
||||
MessageData2.LogLevel = spdlog::level::n_levels;
|
||||
MessageData2.BeginIndex = OldTextBufferSize + i + 1;
|
||||
MessageData2.FormattedStringRanges.clear();
|
||||
|
||||
// Continue previous escape sequences pushed in the previous line
|
||||
SinkLineContent::ColorDataRanges FormatPush{
|
||||
i + 1, 0, LastSequenceTagSinceBegin
|
||||
};
|
||||
MessageData2.FormattedStringRanges.push_back(FormatPush);
|
||||
} break;
|
||||
case '\x1b': {
|
||||
|
||||
// Handle ansi escape sequence, convert textual to operand
|
||||
if (FormattedText[i + 1] != '[')
|
||||
throw std::runtime_error("Invalid ansi escape sequence passed");
|
||||
|
||||
size_t PositionProcessed = 0;
|
||||
auto EscapeSequenceCode = static_cast<AnsiEscapeSequenceTag>(
|
||||
std::stoi(&FormattedText[i + 2],
|
||||
&PositionProcessed)); // this may throw, in which case we let it pass down
|
||||
|
||||
if (FormattedText[i + 2 + PositionProcessed] != 'm')
|
||||
throw std::runtime_error("Invalid ansi escape sequence operand was passed");
|
||||
++PositionProcessed;
|
||||
LastSequenceTagSinceBegin = EscapeSequenceCode;
|
||||
|
||||
SinkLineContent::ColorDataRanges FormatPush{
|
||||
i, 0, EscapeSequenceCode
|
||||
};
|
||||
if (MessageData2.FormattedStringRanges.size())
|
||||
MessageData2.FormattedStringRanges.back().SubStringEnd = FormatPush.SubStringBegin;
|
||||
MessageData2.FormattedStringRanges.push_back(FormatPush);
|
||||
|
||||
// Now the escape code has to be removed from the string,
|
||||
// the iterator has to be kept stable, otherwise the next round could skip a char
|
||||
FormattedText.erase(FormattedText.begin() + i--,
|
||||
FormattedText.begin() + (i + 2 + PositionProcessed));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Append processed string to log text buffer
|
||||
LoggedContent.append(FormattedText.c_str(), FormattedText.c_str() + FormattedText.size());
|
||||
}
|
||||
|
||||
void flush_()
|
||||
{
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
// TODO: Need to implement double buffering for the filter
|
||||
void RebuildFilterWithPreviousStates()
|
||||
{
|
||||
int32_t RebuildType = PreviousFilterLevel != FilterLogLevel;
|
||||
|
||||
RebuildType |= memcmp(PreviousFilterText, FilterTextMatch.InputBuf, sizeof(PreviousFilterText));
|
||||
|
||||
if (RebuildType)
|
||||
{
|
||||
// Filter was completely changed, have to rebuild array (very expensive,
|
||||
// this may result in short freezes or stuttering on really large logs,
|
||||
// one way to solve this could be to defer the calculation of the filter view
|
||||
// to a thread pool and use a double buffering mechanism)
|
||||
|
||||
auto NewLinePasses = false;
|
||||
FilteredView.clear();
|
||||
|
||||
for (auto i = 0; i < LogMetaData.size(); ++i)
|
||||
{
|
||||
|
||||
if (LogMetaData[i].LogLevel == spdlog::level::n_levels&&)
|
||||
{
|
||||
FilteredView.push_back(i);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (LogMetaData[i].LogLevel < FilterLogLevel)
|
||||
{
|
||||
NewLinePasses = false;
|
||||
continue;
|
||||
}
|
||||
|
||||
auto LineBegin = LoggedContent.begin() + LogMetaData[i].BeginIndex + LogMetaData[i].FormattedStringRanges.front().SubStringBegin;
|
||||
auto LineEnd = LoggedContent.begin() + LogMetaData[i].BeginIndex + LogMetaData[i].FormattedStringRanges.back().SubStringEnd;
|
||||
|
||||
if (!FilterTextMatch.PassFilter(LineBegin, LineEnd))
|
||||
{
|
||||
NewLinePasses = false;
|
||||
continue;
|
||||
}
|
||||
|
||||
NewLinePasses = true;
|
||||
FilteredView.push_back(i);
|
||||
}
|
||||
}
|
||||
|
||||
PreviousFilterLevel = FilterLogLevel;
|
||||
memcpy(PreviousFilterText, FilterTextMatch.InputBuf, sizeof(PreviousFilterText));
|
||||
}
|
||||
|
||||
// Using faster more efficient replacements of stl types for rendering
|
||||
ImGuiTextBuffer LoggedContent;
|
||||
|
||||
// Cannot use ImVetctor here as the type is not trivially copyable
|
||||
std::vector<SinkLineContent> LogMetaData;
|
||||
|
||||
// the type has to be moved into, slightly more expensive
|
||||
// but overall totally fine, at least no weird hacks
|
||||
ImGuiTextFilter FilterTextMatch;
|
||||
|
||||
// A filtered array of indexes into the LogMetaData vector
|
||||
ImVector<int32_t> FilteredView;
|
||||
|
||||
// this view is calculated once any filter changes
|
||||
int32_t FilterLogLevel = spdlog::level::trace;
|
||||
|
||||
// Counts the number of entries logged
|
||||
uint32_t NumberOfLogEntries = 0;
|
||||
|
||||
// Keeps track of the amount of memory allocated by indices
|
||||
uint32_t IndicesInBytes = 0;
|
||||
bool EnableAutoScrolling = true;
|
||||
|
||||
// Previous Frame's filterdata, if any of these change to the new values the filter has to be recalculated
|
||||
int32_t PreviousFilterLevel = spdlog::level::trace;
|
||||
decltype(ImGuiTextFilter::InputBuf) PreviousFilterText{};
|
||||
};
|
||||
@@ -1,4 +0,0 @@
|
||||
#pragma once
|
||||
#include "../pch.h"
|
||||
#include "spdlog/sinks/base_sink.h"
|
||||
#include "imgui/imgui.h"
|
||||
@@ -0,0 +1,72 @@
|
||||
#include "MenuBase.h"
|
||||
|
||||
#include <Config.h>
|
||||
#include <Logger.h>
|
||||
#include <resource.h>
|
||||
#include "MenuCommon.h"
|
||||
|
||||
#include <include/imgui/imgui.h>
|
||||
#include <include/imgui/imgui_impl_win32.h>
|
||||
|
||||
|
||||
HWND MenuBase::Handle()
|
||||
{
|
||||
return MenuCommon::Handle();
|
||||
}
|
||||
|
||||
void MenuBase::Dx11Ready()
|
||||
{
|
||||
MenuCommon::Dx11Inited();
|
||||
}
|
||||
|
||||
void MenuBase::Dx12Ready()
|
||||
{
|
||||
MenuCommon::Dx12Inited();
|
||||
}
|
||||
|
||||
void MenuBase::VulkanReady()
|
||||
{
|
||||
MenuCommon::VulkanInited();
|
||||
}
|
||||
|
||||
bool MenuBase::IsInited()
|
||||
{
|
||||
return MenuCommon::IsInited();
|
||||
}
|
||||
|
||||
bool MenuBase::IsVisible()
|
||||
{
|
||||
return MenuCommon::IsVisible();
|
||||
}
|
||||
|
||||
bool MenuBase::IsResetRequested()
|
||||
{
|
||||
return MenuCommon::IsResetRequested();
|
||||
}
|
||||
|
||||
void MenuBase::Init(HWND InHandle)
|
||||
{
|
||||
if (!Config::Instance()->OverlayMenu.value_or(true))
|
||||
return;
|
||||
|
||||
LOG_FUNC();
|
||||
MenuCommon::Init(InHandle);
|
||||
}
|
||||
|
||||
void MenuBase::RenderMenu()
|
||||
{
|
||||
if (!Config::Instance()->OverlayMenu.value_or(true))
|
||||
return;
|
||||
|
||||
MenuCommon::RenderMenu();
|
||||
}
|
||||
|
||||
void MenuBase::Shutdown()
|
||||
{
|
||||
MenuCommon::Shutdown();
|
||||
}
|
||||
|
||||
void MenuBase::HideMenu()
|
||||
{
|
||||
MenuCommon::HideMenu();
|
||||
}
|
||||
@@ -5,9 +5,6 @@
|
||||
#include <d3d12.h>
|
||||
#include <dxgi1_6.h>
|
||||
|
||||
|
||||
// LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
typedef HRESULT(__fastcall* PFN_Present)(IDXGISwapChain*, UINT, UINT);
|
||||
typedef HRESULT(__fastcall* PFN_Present1)(IDXGISwapChain1*, UINT, UINT, const DXGI_PRESENT_PARAMETERS*);
|
||||
typedef HRESULT(__fastcall* PFN_ResizeBuffers)(IDXGISwapChain*, UINT, UINT, UINT, DXGI_FORMAT, UINT);
|
||||
@@ -17,7 +14,7 @@ typedef HRESULT(__fastcall* PFN_CreateSwapChainForHwnd)(IDXGIFactory*, IUnknown*
|
||||
typedef HRESULT(__fastcall* PFN_CreateSwapChainForCoreWindow)(IDXGIFactory*, IUnknown*, IUnknown*, const DXGI_SWAP_CHAIN_DESC1*, IDXGIOutput*, IDXGISwapChain1**);
|
||||
typedef HRESULT(__fastcall* PFN_CreateSwapChainForComposition)(IDXGIFactory*, IUnknown*, const DXGI_SWAP_CHAIN_DESC1*, IDXGIOutput*, IDXGISwapChain1**);
|
||||
|
||||
class ImGuiOverlayBase
|
||||
class MenuBase
|
||||
{
|
||||
public:
|
||||
static HWND Handle();
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "imgui_common.h"
|
||||
#include "MenuCommon.h"
|
||||
|
||||
void ImGuiCommon::ShowTooltip(const char* tip) {
|
||||
void MenuCommon::ShowTooltip(const char* tip) {
|
||||
if (ImGui::IsItemHovered())
|
||||
{
|
||||
ImGui::BeginTooltip();
|
||||
@@ -10,14 +10,14 @@ void ImGuiCommon::ShowTooltip(const char* tip) {
|
||||
}
|
||||
}
|
||||
|
||||
void ImGuiCommon::ShowHelpMarker(const char* tip)
|
||||
void MenuCommon::ShowHelpMarker(const char* tip)
|
||||
{
|
||||
ImGui::SameLine();
|
||||
ImGui::TextDisabled("(?)");
|
||||
ShowTooltip(tip);
|
||||
}
|
||||
|
||||
LRESULT __stdcall ImGuiCommon::hkSendMessageW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
|
||||
LRESULT __stdcall MenuCommon::hkSendMessageW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
if (_isVisible && Msg == 0x0020)
|
||||
return TRUE;
|
||||
@@ -25,7 +25,7 @@ LRESULT __stdcall ImGuiCommon::hkSendMessageW(HWND hWnd, UINT Msg, WPARAM wParam
|
||||
return pfn_SendMessageW(hWnd, Msg, wParam, lParam);
|
||||
}
|
||||
|
||||
BOOL __stdcall ImGuiCommon::hkSetPhysicalCursorPos(int x, int y)
|
||||
BOOL __stdcall MenuCommon::hkSetPhysicalCursorPos(int x, int y)
|
||||
{
|
||||
if (_isVisible)
|
||||
return TRUE;
|
||||
@@ -33,7 +33,7 @@ BOOL __stdcall ImGuiCommon::hkSetPhysicalCursorPos(int x, int y)
|
||||
return pfn_SetPhysicalCursorPos(x, y);
|
||||
}
|
||||
|
||||
BOOL __stdcall ImGuiCommon::hkSetCursorPos(int x, int y)
|
||||
BOOL __stdcall MenuCommon::hkSetCursorPos(int x, int y)
|
||||
{
|
||||
if (_isVisible)
|
||||
return TRUE;
|
||||
@@ -41,7 +41,7 @@ BOOL __stdcall ImGuiCommon::hkSetCursorPos(int x, int y)
|
||||
return pfn_SetCursorPos(x, y);
|
||||
}
|
||||
|
||||
BOOL __stdcall ImGuiCommon::hkClipCursor(RECT* lpRect)
|
||||
BOOL __stdcall MenuCommon::hkClipCursor(RECT* lpRect)
|
||||
{
|
||||
if (_isVisible)
|
||||
return TRUE;
|
||||
@@ -52,7 +52,7 @@ BOOL __stdcall ImGuiCommon::hkClipCursor(RECT* lpRect)
|
||||
}
|
||||
}
|
||||
|
||||
void __stdcall ImGuiCommon::hkmouse_event(DWORD dwFlags, DWORD dx, DWORD dy, DWORD dwData, ULONG_PTR dwExtraInfo)
|
||||
void __stdcall MenuCommon::hkmouse_event(DWORD dwFlags, DWORD dx, DWORD dy, DWORD dwData, ULONG_PTR dwExtraInfo)
|
||||
{
|
||||
if (_isVisible)
|
||||
return;
|
||||
@@ -60,7 +60,7 @@ void __stdcall ImGuiCommon::hkmouse_event(DWORD dwFlags, DWORD dx, DWORD dy, DWO
|
||||
pfn_mouse_event(dwFlags, dx, dy, dwData, dwExtraInfo);
|
||||
}
|
||||
|
||||
UINT __stdcall ImGuiCommon::hkSendInput(UINT cInputs, LPINPUT pInputs, int cbSize)
|
||||
UINT __stdcall MenuCommon::hkSendInput(UINT cInputs, LPINPUT pInputs, int cbSize)
|
||||
{
|
||||
if (_isVisible)
|
||||
return TRUE;
|
||||
@@ -68,7 +68,7 @@ UINT __stdcall ImGuiCommon::hkSendInput(UINT cInputs, LPINPUT pInputs, int cbSiz
|
||||
return pfn_SendInput(cInputs, pInputs, cbSize);
|
||||
}
|
||||
|
||||
void ImGuiCommon::AttachHooks()
|
||||
void MenuCommon::AttachHooks()
|
||||
{
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
@@ -102,7 +102,7 @@ void ImGuiCommon::AttachHooks()
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
|
||||
void ImGuiCommon::DetachHooks()
|
||||
void MenuCommon::DetachHooks()
|
||||
{
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
@@ -140,7 +140,7 @@ void ImGuiCommon::DetachHooks()
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
|
||||
ImGuiKey ImGuiCommon::ImGui_ImplWin32_VirtualKeyToImGuiKey(WPARAM wParam)
|
||||
ImGuiKey MenuCommon::ImGui_ImplWin32_VirtualKeyToImGuiKey(WPARAM wParam)
|
||||
{
|
||||
switch (wParam)
|
||||
{
|
||||
@@ -267,7 +267,7 @@ ImGuiKey ImGuiCommon::ImGui_ImplWin32_VirtualKeyToImGuiKey(WPARAM wParam)
|
||||
|
||||
//Win32 message handler
|
||||
|
||||
LRESULT __stdcall ImGuiCommon::WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
LRESULT __stdcall MenuCommon::WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
ImGuiIO& io = ImGui::GetIO(); (void)io;
|
||||
|
||||
@@ -482,7 +482,7 @@ LRESULT __stdcall ImGuiCommon::WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARA
|
||||
return CallWindowProc(_oWndProc, hWnd, msg, wParam, lParam);
|
||||
}
|
||||
|
||||
std::string ImGuiCommon::GetBackendName(std::string* code)
|
||||
std::string MenuCommon::GetBackendName(std::string* code)
|
||||
{
|
||||
if (*code == "fsr21")
|
||||
return "FSR 2.1.2";
|
||||
@@ -511,7 +511,7 @@ std::string ImGuiCommon::GetBackendName(std::string* code)
|
||||
return "????";
|
||||
}
|
||||
|
||||
std::string ImGuiCommon::GetBackendCode(const NVNGX_Api api)
|
||||
std::string MenuCommon::GetBackendCode(const NVNGX_Api api)
|
||||
{
|
||||
std::string code;
|
||||
|
||||
@@ -525,13 +525,13 @@ std::string ImGuiCommon::GetBackendCode(const NVNGX_Api api)
|
||||
return code;
|
||||
}
|
||||
|
||||
void ImGuiCommon::GetCurrentBackendInfo(const NVNGX_Api api, std::string* code, std::string* name)
|
||||
void MenuCommon::GetCurrentBackendInfo(const NVNGX_Api api, std::string* code, std::string* name)
|
||||
{
|
||||
*code = GetBackendCode(api);
|
||||
*name = GetBackendName(code);
|
||||
}
|
||||
|
||||
void ImGuiCommon::AddDx11Backends(std::string* code, std::string* name)
|
||||
void MenuCommon::AddDx11Backends(std::string* code, std::string* name)
|
||||
{
|
||||
std::string selectedUpscalerName = "";
|
||||
|
||||
@@ -579,7 +579,7 @@ void ImGuiCommon::AddDx11Backends(std::string* code, std::string* name)
|
||||
}
|
||||
}
|
||||
|
||||
void ImGuiCommon::AddDx12Backends(std::string* code, std::string* name)
|
||||
void MenuCommon::AddDx12Backends(std::string* code, std::string* name)
|
||||
{
|
||||
std::string selectedUpscalerName = "";
|
||||
|
||||
@@ -615,7 +615,7 @@ void ImGuiCommon::AddDx12Backends(std::string* code, std::string* name)
|
||||
}
|
||||
}
|
||||
|
||||
void ImGuiCommon::AddVulkanBackends(std::string* code, std::string* name)
|
||||
void MenuCommon::AddVulkanBackends(std::string* code, std::string* name)
|
||||
{
|
||||
std::string selectedUpscalerName = "";
|
||||
|
||||
@@ -646,7 +646,7 @@ void ImGuiCommon::AddVulkanBackends(std::string* code, std::string* name)
|
||||
}
|
||||
}
|
||||
|
||||
void ImGuiCommon::AddResourceBarrier(std::string name, std::optional<int>* value)
|
||||
void MenuCommon::AddResourceBarrier(std::string name, std::optional<int>* value)
|
||||
{
|
||||
const char* states[] = { "AUTO", "COMMON", "VERTEX_AND_CONSTANT_BUFFER", "INDEX_BUFFER", "RENDER_TARGET", "UNORDERED_ACCESS", "DEPTH_WRITE",
|
||||
"DEPTH_READ", "NON_PIXEL_SHADER_RESOURCE", "PIXEL_SHADER_RESOURCE", "STREAM_OUT", "INDIRECT_ARGUMENT", "COPY_DEST", "COPY_SOURCE",
|
||||
@@ -685,7 +685,7 @@ void ImGuiCommon::AddResourceBarrier(std::string name, std::optional<int>* value
|
||||
}
|
||||
}
|
||||
|
||||
void ImGuiCommon::AddRenderPreset(std::string name, std::optional<uint32_t>* value)
|
||||
void MenuCommon::AddRenderPreset(std::string name, std::optional<uint32_t>* value)
|
||||
{
|
||||
const char* presets[] = { "DEFAULT", "PRESET A", "PRESET B", "PRESET C", "PRESET D", "PRESET E", "PRESET F", "PRESET G" };
|
||||
const char* presetsDesc[] = { "Whatever the game uses",
|
||||
@@ -701,7 +701,7 @@ void ImGuiCommon::AddRenderPreset(std::string name, std::optional<uint32_t>* val
|
||||
PopulateCombo(name, value, presets, presetsDesc, 8);
|
||||
}
|
||||
|
||||
void ImGuiCommon::PopulateCombo(std::string name, std::optional<uint32_t>* value, const char* names[], const char* desc[], int length) {
|
||||
void MenuCommon::PopulateCombo(std::string name, std::optional<uint32_t>* value, const char* names[], const char* desc[], int length) {
|
||||
int selected = value->value_or(0);
|
||||
|
||||
const char* selectedName = "";
|
||||
@@ -735,7 +735,7 @@ void ImGuiCommon::PopulateCombo(std::string name, std::optional<uint32_t>* value
|
||||
}
|
||||
}
|
||||
|
||||
void ImGuiCommon::RenderMenu()
|
||||
void MenuCommon::RenderMenu()
|
||||
{
|
||||
if (!_isInited || !_isVisible)
|
||||
return;
|
||||
@@ -2095,7 +2095,7 @@ void ImGuiCommon::RenderMenu()
|
||||
}
|
||||
}
|
||||
|
||||
void ImGuiCommon::Init(HWND InHwnd)
|
||||
void MenuCommon::Init(HWND InHwnd)
|
||||
{
|
||||
_handle = InHwnd;
|
||||
_isVisible = false;
|
||||
@@ -2146,9 +2146,9 @@ void ImGuiCommon::Init(HWND InHwnd)
|
||||
}
|
||||
}
|
||||
|
||||
void ImGuiCommon::Shutdown()
|
||||
void MenuCommon::Shutdown()
|
||||
{
|
||||
if (!ImGuiCommon::_isInited)
|
||||
if (!MenuCommon::_isInited)
|
||||
return;
|
||||
|
||||
|
||||
@@ -2169,7 +2169,7 @@ void ImGuiCommon::Shutdown()
|
||||
_isResetRequested = false;
|
||||
}
|
||||
|
||||
void ImGuiCommon::HideMenu()
|
||||
void MenuCommon::HideMenu()
|
||||
{
|
||||
if (!_isVisible)
|
||||
return;
|
||||
@@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <pch.h>
|
||||
|
||||
#include <Config.h>
|
||||
#include <Logger.h>
|
||||
#include <resource.h>
|
||||
@@ -11,7 +12,7 @@
|
||||
|
||||
extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
class ImGuiCommon
|
||||
class MenuCommon
|
||||
{
|
||||
private:
|
||||
// internal values
|
||||
@@ -1,10 +1,10 @@
|
||||
#include "imgui_overlay_dx.h"
|
||||
#include "MenuDx.h"
|
||||
|
||||
#include <Util.h>
|
||||
#include <Logger.h>
|
||||
#include <Config.h>
|
||||
#include "wrapped_swapchain.h"
|
||||
#include "imgui_overlay_base.h"
|
||||
#include "MenuBase.h"
|
||||
|
||||
#include <dxgi1_6.h>
|
||||
#include <d3d11on12.h>
|
||||
@@ -13,9 +13,6 @@
|
||||
#include <include/imgui/imgui_impl_win32.h>
|
||||
#include <include/detours/detours.h>
|
||||
|
||||
|
||||
|
||||
|
||||
// dxgi stuff
|
||||
typedef HRESULT(*PFN_CreateDXGIFactory)(REFIID riid, IDXGIFactory** ppFactory);
|
||||
typedef HRESULT(*PFN_CreateDXGIFactory1)(REFIID riid, IDXGIFactory1** ppFactory);
|
||||
@@ -171,7 +168,7 @@ static void CleanupRenderTargetDx12(bool clearQueue)
|
||||
|
||||
if (clearQueue)
|
||||
{
|
||||
if (ImGuiOverlayBase::IsInited() && g_pd3dDeviceParam != nullptr && g_pd3dSrvDescHeap != nullptr && ImGui::GetIO().BackendRendererUserData)
|
||||
if (MenuBase::IsInited() && g_pd3dDeviceParam != nullptr && g_pd3dSrvDescHeap != nullptr && ImGui::GetIO().BackendRendererUserData)
|
||||
{
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
||||
ImGui_ImplDX12_Shutdown();
|
||||
@@ -323,7 +320,7 @@ static HRESULT Present(IDXGISwapChain* pSwapChain, UINT SyncInterval, UINT Flags
|
||||
LOG_DEBUG("D3D12CommandQueue captured");
|
||||
|
||||
currentSCCommandQueue = pDevice;
|
||||
ImGuiOverlayDx::GameCommandQueue = (ID3D12CommandQueue*)pDevice;
|
||||
MenuDx::GameCommandQueue = (ID3D12CommandQueue*)pDevice;
|
||||
|
||||
if (cq->GetDevice(IID_PPV_ARGS(&device12)) == S_OK)
|
||||
{
|
||||
@@ -356,12 +353,12 @@ static HRESULT Present(IDXGISwapChain* pSwapChain, UINT SyncInterval, UINT Flags
|
||||
}
|
||||
|
||||
// Upscaler GPU time computation
|
||||
if (ImGuiOverlayDx::dx12UpscaleTrig && ImGuiOverlayDx::readbackBuffer != nullptr && ImGuiOverlayDx::queryHeap != nullptr && cq != nullptr)
|
||||
if (MenuDx::dx12UpscaleTrig && MenuDx::readbackBuffer != nullptr && MenuDx::queryHeap != nullptr && cq != nullptr)
|
||||
{
|
||||
if (ImGuiOverlayBase::IsInited() && ImGuiOverlayBase::IsVisible())
|
||||
if (MenuBase::IsInited() && MenuBase::IsVisible())
|
||||
{
|
||||
UINT64* timestampData;
|
||||
ImGuiOverlayDx::readbackBuffer->Map(0, nullptr, reinterpret_cast<void**>(×tampData));
|
||||
MenuDx::readbackBuffer->Map(0, nullptr, reinterpret_cast<void**>(×tampData));
|
||||
|
||||
// Get the GPU timestamp frequency (ticks per second)
|
||||
UINT64 gpuFrequency;
|
||||
@@ -376,28 +373,28 @@ static HRESULT Present(IDXGISwapChain* pSwapChain, UINT SyncInterval, UINT Flags
|
||||
Config::Instance()->upscaleTimes.pop_front();
|
||||
|
||||
// Unmap the buffer
|
||||
ImGuiOverlayDx::readbackBuffer->Unmap(0, nullptr);
|
||||
MenuDx::readbackBuffer->Unmap(0, nullptr);
|
||||
}
|
||||
|
||||
ImGuiOverlayDx::dx12UpscaleTrig = false;
|
||||
MenuDx::dx12UpscaleTrig = false;
|
||||
}
|
||||
else if (ImGuiOverlayDx::dx11UpscaleTrig[ImGuiOverlayDx::currentFrameIndex] && device != nullptr && ImGuiOverlayDx::disjointQueries[0] != nullptr &&
|
||||
ImGuiOverlayDx::startQueries[0] != nullptr && ImGuiOverlayDx::endQueries[0] != nullptr)
|
||||
else if (MenuDx::dx11UpscaleTrig[MenuDx::currentFrameIndex] && device != nullptr && MenuDx::disjointQueries[0] != nullptr &&
|
||||
MenuDx::startQueries[0] != nullptr && MenuDx::endQueries[0] != nullptr)
|
||||
{
|
||||
if (g_pd3dDeviceContext == nullptr)
|
||||
device->GetImmediateContext(&g_pd3dDeviceContext);
|
||||
|
||||
if (ImGuiOverlayBase::IsInited() && ImGuiOverlayBase::IsVisible())
|
||||
if (MenuBase::IsInited() && MenuBase::IsVisible())
|
||||
{
|
||||
// Retrieve the results from the previous frame
|
||||
D3D11_QUERY_DATA_TIMESTAMP_DISJOINT disjointData;
|
||||
if (g_pd3dDeviceContext->GetData(ImGuiOverlayDx::disjointQueries[ImGuiOverlayDx::previousFrameIndex], &disjointData, sizeof(disjointData), 0) == S_OK)
|
||||
if (g_pd3dDeviceContext->GetData(MenuDx::disjointQueries[MenuDx::previousFrameIndex], &disjointData, sizeof(disjointData), 0) == S_OK)
|
||||
{
|
||||
if (!disjointData.Disjoint && disjointData.Frequency > 0)
|
||||
{
|
||||
UINT64 startTime = 0, endTime = 0;
|
||||
if (g_pd3dDeviceContext->GetData(ImGuiOverlayDx::startQueries[ImGuiOverlayDx::previousFrameIndex], &startTime, sizeof(UINT64), 0) == S_OK &&
|
||||
g_pd3dDeviceContext->GetData(ImGuiOverlayDx::endQueries[ImGuiOverlayDx::previousFrameIndex], &endTime, sizeof(UINT64), 0) == S_OK)
|
||||
if (g_pd3dDeviceContext->GetData(MenuDx::startQueries[MenuDx::previousFrameIndex], &startTime, sizeof(UINT64), 0) == S_OK &&
|
||||
g_pd3dDeviceContext->GetData(MenuDx::endQueries[MenuDx::previousFrameIndex], &endTime, sizeof(UINT64), 0) == S_OK)
|
||||
{
|
||||
double elapsedTimeMs = (endTime - startTime) / static_cast<double>(disjointData.Frequency) * 1000.0;
|
||||
Config::Instance()->upscaleTimes.push_back(elapsedTimeMs);
|
||||
@@ -408,19 +405,19 @@ static HRESULT Present(IDXGISwapChain* pSwapChain, UINT SyncInterval, UINT Flags
|
||||
}
|
||||
|
||||
|
||||
ImGuiOverlayDx::dx11UpscaleTrig[ImGuiOverlayDx::currentFrameIndex] = false;
|
||||
ImGuiOverlayDx::currentFrameIndex = (ImGuiOverlayDx::currentFrameIndex + 1) % ImGuiOverlayDx::QUERY_BUFFER_COUNT;
|
||||
MenuDx::dx11UpscaleTrig[MenuDx::currentFrameIndex] = false;
|
||||
MenuDx::currentFrameIndex = (MenuDx::currentFrameIndex + 1) % MenuDx::QUERY_BUFFER_COUNT;
|
||||
}
|
||||
|
||||
// Process window handle changed, update base
|
||||
if (ImGuiOverlayBase::Handle() != hWnd)
|
||||
if (MenuBase::Handle() != hWnd)
|
||||
{
|
||||
LOG_DEBUG("Handle changed");
|
||||
|
||||
if (ImGuiOverlayBase::IsInited())
|
||||
ImGuiOverlayBase::Shutdown();
|
||||
if (MenuBase::IsInited())
|
||||
MenuBase::Shutdown();
|
||||
|
||||
ImGuiOverlayBase::Init(hWnd);
|
||||
MenuBase::Init(hWnd);
|
||||
|
||||
_isInited = false;
|
||||
}
|
||||
@@ -436,7 +433,7 @@ static HRESULT Present(IDXGISwapChain* pSwapChain, UINT SyncInterval, UINT Flags
|
||||
g_pd3dDevice->AddRef();
|
||||
|
||||
CreateRenderTargetDx11(pSwapChain);
|
||||
ImGuiOverlayBase::Dx11Ready();
|
||||
MenuBase::Dx11Ready();
|
||||
_isInited = true;
|
||||
}
|
||||
else if (_dx12Device && (g_pd3dDeviceParam != nullptr || device12 != nullptr))
|
||||
@@ -452,7 +449,7 @@ static HRESULT Present(IDXGISwapChain* pSwapChain, UINT SyncInterval, UINT Flags
|
||||
g_pd3dCommandQueue->AddRef();
|
||||
g_pd3dDeviceParam->AddRef();
|
||||
|
||||
ImGuiOverlayBase::Dx12Ready();
|
||||
MenuBase::Dx12Ready();
|
||||
_isInited = true;
|
||||
}
|
||||
}
|
||||
@@ -1230,11 +1227,11 @@ static void RenderImGui_DX11(IDXGISwapChain* pSwapChain)
|
||||
|
||||
do
|
||||
{
|
||||
if (!ImGuiOverlayBase::IsInited())
|
||||
if (!MenuBase::IsInited())
|
||||
break;
|
||||
|
||||
// Draw only when menu activated
|
||||
if (!ImGuiOverlayBase::IsVisible())
|
||||
if (!MenuBase::IsVisible())
|
||||
break;
|
||||
|
||||
if (!_dx11Device || g_pd3dDevice == nullptr)
|
||||
@@ -1246,7 +1243,7 @@ static void RenderImGui_DX11(IDXGISwapChain* pSwapChain)
|
||||
|
||||
if (!drawMenu)
|
||||
{
|
||||
ImGuiOverlayBase::HideMenu();
|
||||
MenuBase::HideMenu();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1271,7 +1268,7 @@ static void RenderImGui_DX11(IDXGISwapChain* pSwapChain)
|
||||
ImGui_ImplDX11_NewFrame();
|
||||
ImGui_ImplWin32_NewFrame();
|
||||
|
||||
ImGuiOverlayBase::RenderMenu();
|
||||
MenuBase::RenderMenu();
|
||||
|
||||
ImGui::Render();
|
||||
|
||||
@@ -1291,11 +1288,11 @@ static void RenderImGui_DX12(IDXGISwapChain* pSwapChainPlain)
|
||||
if (pSwapChainPlain->QueryInterface(IID_PPV_ARGS(&pSwapChain)) != S_OK || pSwapChain == nullptr)
|
||||
return;
|
||||
|
||||
if (!ImGuiOverlayBase::IsInited())
|
||||
if (!MenuBase::IsInited())
|
||||
break;
|
||||
|
||||
// Draw only when menu activated
|
||||
if (!ImGuiOverlayBase::IsVisible())
|
||||
if (!MenuBase::IsVisible())
|
||||
break;
|
||||
|
||||
if (!_dx12Device || g_pd3dCommandQueue == nullptr || g_pd3dDeviceParam == nullptr)
|
||||
@@ -1307,7 +1304,7 @@ static void RenderImGui_DX12(IDXGISwapChain* pSwapChainPlain)
|
||||
|
||||
if (!drawMenu)
|
||||
{
|
||||
ImGuiOverlayBase::HideMenu();
|
||||
MenuBase::HideMenu();
|
||||
auto releaseResult = pSwapChain->Release();
|
||||
return;
|
||||
}
|
||||
@@ -1335,7 +1332,7 @@ static void RenderImGui_DX12(IDXGISwapChain* pSwapChainPlain)
|
||||
if (result != S_OK)
|
||||
{
|
||||
LOG_ERROR("CreateDescriptorHeap(g_pd3dRtvDescHeap): {0:X}", (unsigned long)result);
|
||||
ImGuiOverlayBase::HideMenu();
|
||||
MenuBase::HideMenu();
|
||||
CleanupRenderTargetDx12(true);
|
||||
pSwapChain->Release();
|
||||
return;
|
||||
@@ -1361,7 +1358,7 @@ static void RenderImGui_DX12(IDXGISwapChain* pSwapChainPlain)
|
||||
if (result != S_OK)
|
||||
{
|
||||
LOG_ERROR("CreateDescriptorHeap(g_pd3dSrvDescHeap): {0:X}", (unsigned long)result);
|
||||
ImGuiOverlayBase::HideMenu();
|
||||
MenuBase::HideMenu();
|
||||
CleanupRenderTargetDx12(true);
|
||||
pSwapChain->Release();
|
||||
return;
|
||||
@@ -1375,7 +1372,7 @@ static void RenderImGui_DX12(IDXGISwapChain* pSwapChainPlain)
|
||||
if (result != S_OK)
|
||||
{
|
||||
LOG_ERROR("CreateCommandAllocator[{0}]: {1:X}", i, (unsigned long)result);
|
||||
ImGuiOverlayBase::HideMenu();
|
||||
MenuBase::HideMenu();
|
||||
CleanupRenderTargetDx12(true);
|
||||
pSwapChain->Release();
|
||||
return;
|
||||
@@ -1386,7 +1383,7 @@ static void RenderImGui_DX12(IDXGISwapChain* pSwapChainPlain)
|
||||
if (result != S_OK)
|
||||
{
|
||||
LOG_ERROR("CreateCommandList: {0:X}", (unsigned long)result);
|
||||
ImGuiOverlayBase::HideMenu();
|
||||
MenuBase::HideMenu();
|
||||
CleanupRenderTargetDx12(true);
|
||||
pSwapChain->Release();
|
||||
return;
|
||||
@@ -1396,7 +1393,7 @@ static void RenderImGui_DX12(IDXGISwapChain* pSwapChainPlain)
|
||||
if (result != S_OK)
|
||||
{
|
||||
LOG_ERROR("g_pd3dCommandList->Close: {0:X}", (unsigned long)result);
|
||||
ImGuiOverlayBase::HideMenu();
|
||||
MenuBase::HideMenu();
|
||||
CleanupRenderTargetDx12(false);
|
||||
pSwapChain->Release();
|
||||
return;
|
||||
@@ -1427,7 +1424,7 @@ static void RenderImGui_DX12(IDXGISwapChain* pSwapChainPlain)
|
||||
ImGui_ImplDX12_NewFrame();
|
||||
ImGui_ImplWin32_NewFrame();
|
||||
|
||||
ImGuiOverlayBase::RenderMenu();
|
||||
MenuBase::RenderMenu();
|
||||
|
||||
ImGui::Render();
|
||||
|
||||
@@ -1488,7 +1485,7 @@ static void RenderImGui_DX12(IDXGISwapChain* pSwapChainPlain)
|
||||
if (_showRenderImGuiDebugOnce)
|
||||
LOG_INFO("!(ImGui::GetCurrentContext() && g_pd3dCommandQueue && g_mainRenderTargetResource[0])");
|
||||
|
||||
ImGuiOverlayBase::HideMenu();
|
||||
MenuBase::HideMenu();
|
||||
_showRenderImGuiDebugOnce = false;
|
||||
}
|
||||
}
|
||||
@@ -1552,7 +1549,7 @@ void DeatachAllHooks()
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
|
||||
void ImGuiOverlayDx::HookDx()
|
||||
void MenuDx::HookDx()
|
||||
{
|
||||
if (_isInited)
|
||||
return;
|
||||
@@ -1610,11 +1607,11 @@ void ImGuiOverlayDx::HookDx()
|
||||
}
|
||||
}
|
||||
|
||||
void ImGuiOverlayDx::UnHookDx()
|
||||
void MenuDx::UnHookDx()
|
||||
{
|
||||
if (!Config::Instance()->IsRunningOnDXVK)
|
||||
{
|
||||
if (_isInited && ImGuiOverlayBase::IsInited() && ImGui::GetIO().BackendRendererUserData)
|
||||
if (_isInited && MenuBase::IsInited() && ImGui::GetIO().BackendRendererUserData)
|
||||
{
|
||||
if (_dx11Device)
|
||||
ImGui_ImplDX11_Shutdown();
|
||||
@@ -1622,7 +1619,7 @@ void ImGuiOverlayDx::UnHookDx()
|
||||
ImGui_ImplDX12_Shutdown();
|
||||
}
|
||||
|
||||
ImGuiOverlayBase::Shutdown();
|
||||
MenuBase::Shutdown();
|
||||
|
||||
if (_isInited)
|
||||
{
|
||||
@@ -5,7 +5,7 @@
|
||||
#include <d3d12.h>
|
||||
#include <d3d11_4.h>
|
||||
|
||||
namespace ImGuiOverlayDx
|
||||
namespace MenuDx
|
||||
{
|
||||
inline ID3D12QueryHeap* queryHeap = nullptr;
|
||||
inline ID3D12Resource* readbackBuffer = nullptr;
|
||||
@@ -1,14 +1,13 @@
|
||||
#include "imgui_overlay_vk.h"
|
||||
#include "MenuVulkan.h"
|
||||
|
||||
#include <Util.h>
|
||||
#include <Config.h>
|
||||
#include "imgui_overlay_base.h"
|
||||
#include "MenuBase.h"
|
||||
|
||||
#include <include/detours/detours.h>
|
||||
#include <include/imgui/imgui_impl_vulkan.h>
|
||||
#include <include/imgui/imgui_impl_win32.h>
|
||||
|
||||
|
||||
// Vulkan overlay code adopted from here:
|
||||
// https://gist.github.com/mem99/0ec31ca302927457f86b1d6756aaa8c4
|
||||
// Need to check resize & recreate fixes
|
||||
@@ -39,21 +38,6 @@ struct ImGui_ImplVulkanH_Frame* _ImVulkan_Frames = VK_NULL_HANDLE;
|
||||
static VkSemaphore* _ImVulkan_Semaphores = VK_NULL_HANDLE;
|
||||
static VkRenderPass _vkRenderPass = VK_NULL_HANDLE;
|
||||
|
||||
// hooking
|
||||
typedef VkResult(*PFN_QueuePresentKHR)(VkQueue, const VkPresentInfoKHR*);
|
||||
typedef VkResult(*PFN_CreateSwapchainKHR)(VkDevice, const VkSwapchainCreateInfoKHR*, const VkAllocationCallbacks*, VkSwapchainKHR*);
|
||||
typedef VkResult(*PFN_vkCreateWin32SurfaceKHR)(VkInstance, const VkWin32SurfaceCreateInfoKHR*, const VkAllocationCallbacks*, VkSurfaceKHR*);
|
||||
|
||||
PFN_vkCreateDevice o_vkCreateDevice = nullptr;
|
||||
PFN_vkCreateInstance o_vkCreateInstance = nullptr;
|
||||
PFN_vkCreateWin32SurfaceKHR o_vkCreateWin32SurfaceKHR = nullptr;
|
||||
PFN_QueuePresentKHR o_QueuePresentKHR = nullptr;
|
||||
PFN_CreateSwapchainKHR o_CreateSwapchainKHR = nullptr;
|
||||
|
||||
static VkResult hkvkCreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDevice* pDevice);
|
||||
static VkResult hkvkQueuePresentKHR(VkQueue queue, VkPresentInfoKHR* pPresentInfo);
|
||||
static VkResult hkvkCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchain);
|
||||
|
||||
static void DestroyVulkanObjects(bool shutdown)
|
||||
{
|
||||
if (_ImVulkan_Info.Device == VK_NULL_HANDLE)
|
||||
@@ -146,13 +130,13 @@ static void CreateVulkanObjects(VkDevice device, const VkSwapchainCreateInfoKHR*
|
||||
}
|
||||
|
||||
// Initialize ImGui
|
||||
if (!ImGuiOverlayBase::IsInited() || ImGuiOverlayBase::Handle() != _hwnd)
|
||||
if (!MenuBase::IsInited() || MenuBase::Handle() != _hwnd)
|
||||
{
|
||||
if (ImGuiOverlayBase::IsInited())
|
||||
ImGuiOverlayBase::Shutdown();
|
||||
if (MenuBase::IsInited())
|
||||
MenuBase::Shutdown();
|
||||
|
||||
LOG_DEBUG("ImGuiOverlayBase::Init");
|
||||
ImGuiOverlayBase::Init(_hwnd);
|
||||
LOG_DEBUG("MenuBase::Init");
|
||||
MenuBase::Init(_hwnd);
|
||||
}
|
||||
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
@@ -470,137 +454,59 @@ static void CreateVulkanObjects(VkDevice device, const VkSwapchainCreateInfoKHR*
|
||||
LOG_FUNC_RESULT(_vulkanObjectsCreated);
|
||||
}
|
||||
|
||||
static void HookDevice(VkDevice InDevice)
|
||||
void MenuVulkan::CreateSurface(VkInstance instance, HWND hwnd)
|
||||
{
|
||||
if (o_CreateSwapchainKHR != nullptr || Config::Instance()->VulkanSkipHooks)
|
||||
return;
|
||||
DestroyVulkanObjects(false);
|
||||
|
||||
LOG_FUNC();
|
||||
|
||||
o_QueuePresentKHR = (PFN_QueuePresentKHR)(vkGetDeviceProcAddr(InDevice, "vkQueuePresentKHR"));
|
||||
o_CreateSwapchainKHR = (PFN_CreateSwapchainKHR)(vkGetDeviceProcAddr(InDevice, "vkCreateSwapchainKHR"));
|
||||
|
||||
if (o_CreateSwapchainKHR)
|
||||
{
|
||||
LOG_DEBUG("Hooking VkDevice");
|
||||
|
||||
// Hook
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
|
||||
DetourAttach(&(PVOID&)o_QueuePresentKHR, hkvkQueuePresentKHR);
|
||||
DetourAttach(&(PVOID&)o_CreateSwapchainKHR, hkvkCreateSwapchainKHR);
|
||||
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
_instance = instance;
|
||||
LOG_DEBUG("_instance captured: {0:X}", (UINT64)_instance);
|
||||
_hwnd = hwnd;
|
||||
LOG_DEBUG("_hwnd captured: {0:X}", (UINT64)_hwnd);
|
||||
}
|
||||
|
||||
static VkResult hkvkCreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface)
|
||||
void MenuVulkan::CreateInstance(VkInstance* pInstance)
|
||||
{
|
||||
LOG_FUNC();
|
||||
|
||||
auto result = o_vkCreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
|
||||
|
||||
auto procHwnd = Util::GetProcessWindow();
|
||||
LOG_DEBUG("procHwnd: {0:X}, swapchain hwnd: {1:X}", (UINT64)procHwnd, (UINT64)pCreateInfo->hwnd);
|
||||
|
||||
if (result == VK_SUCCESS && !Config::Instance()->VulkanSkipHooks && procHwnd == pCreateInfo->hwnd)
|
||||
{
|
||||
DestroyVulkanObjects(false);
|
||||
|
||||
_instance = instance;
|
||||
LOG_DEBUG("_instance captured: {0:X}", (UINT64)_instance);
|
||||
_hwnd = pCreateInfo->hwnd;
|
||||
LOG_DEBUG("_hwnd captured: {0:X}", (UINT64)_hwnd);
|
||||
}
|
||||
|
||||
LOG_FUNC_RESULT(result);
|
||||
|
||||
return result;
|
||||
DestroyVulkanObjects(false);
|
||||
|
||||
_instance = *pInstance;
|
||||
LOG_DEBUG("_instance captured: {0:X}", (UINT64)_instance);
|
||||
}
|
||||
|
||||
static VkResult hkvkCreateInstance(const VkInstanceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkInstance* pInstance)
|
||||
void MenuVulkan::CreateDevice(VkPhysicalDevice physicalDevice, VkDevice* pDevice)
|
||||
{
|
||||
LOG_FUNC();
|
||||
DestroyVulkanObjects(false);
|
||||
|
||||
auto result = o_vkCreateInstance(pCreateInfo, pAllocator, pInstance);
|
||||
|
||||
if (result == VK_SUCCESS && !Config::Instance()->VulkanSkipHooks)
|
||||
{
|
||||
DestroyVulkanObjects(false);
|
||||
|
||||
_instance = *pInstance;
|
||||
LOG_DEBUG("_instance captured: {0:X}", (UINT64)_instance);
|
||||
}
|
||||
|
||||
LOG_FUNC_RESULT(result);
|
||||
|
||||
return result;
|
||||
_PD = physicalDevice;
|
||||
LOG_DEBUG("_PD captured: {0:X}", (UINT64)_PD);
|
||||
_device = *pDevice;
|
||||
LOG_DEBUG("_device captured: {0:X}", (UINT64)_device);
|
||||
}
|
||||
|
||||
static VkResult hkvkCreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDevice* pDevice)
|
||||
{
|
||||
LOG_FUNC();
|
||||
|
||||
auto result = o_vkCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
|
||||
|
||||
if (result == VK_SUCCESS && !Config::Instance()->VulkanSkipHooks)
|
||||
{
|
||||
DestroyVulkanObjects(false);
|
||||
|
||||
_PD = physicalDevice;
|
||||
LOG_DEBUG("_PD captured: {0:X}", (UINT64)_PD);
|
||||
_device = *pDevice;
|
||||
LOG_DEBUG("_device captured: {0:X}", (UINT64)_device);
|
||||
HookDevice(_device);
|
||||
}
|
||||
|
||||
LOG_FUNC_RESULT(result);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static VkResult hkvkQueuePresentKHR(VkQueue queue, VkPresentInfoKHR* pPresentInfo)
|
||||
VkResult MenuVulkan::QueuePresent(VkQueue queue, VkPresentInfoKHR* pPresentInfo)
|
||||
{
|
||||
LOG_FUNC();
|
||||
|
||||
if (!_vulkanObjectsCreated)
|
||||
{
|
||||
LOG_TRACE("!_vulkanObjectsCreated return o_QueuePresentKHR");
|
||||
|
||||
Config::Instance()->VulkanCreatingSC = true;
|
||||
auto r0 = o_QueuePresentKHR(queue, pPresentInfo);
|
||||
Config::Instance()->VulkanCreatingSC = false;
|
||||
|
||||
if (r0 != VK_SUCCESS)
|
||||
LOG_ERROR("r0 = o_QueuePresentKHR(queue, pPresentInfo): {0:X}", (UINT)r0);
|
||||
|
||||
return r0;
|
||||
return VK_INCOMPLETE;
|
||||
}
|
||||
|
||||
if (!ImGuiOverlayBase::IsInited() || !ImGuiOverlayBase::IsVisible() || _ImVulkan_Info.Device == VK_NULL_HANDLE)
|
||||
if (!MenuBase::IsInited() || !MenuBase::IsVisible() || _ImVulkan_Info.Device == VK_NULL_HANDLE)
|
||||
{
|
||||
Config::Instance()->VulkanCreatingSC = true;
|
||||
auto r1 = o_QueuePresentKHR(queue, pPresentInfo);
|
||||
Config::Instance()->VulkanCreatingSC = false;
|
||||
|
||||
if (r1 != VK_SUCCESS)
|
||||
LOG_ERROR("r1 = o_QueuePresentKHR(queue, pPresentInfo): {0:X}", (UINT)r1);
|
||||
|
||||
return r1;
|
||||
return VK_INCOMPLETE;
|
||||
}
|
||||
|
||||
_vkPresentMutex.lock();
|
||||
|
||||
if (ImGuiOverlayVk::vkUpscaleTrig && ImGuiOverlayVk::queryPool != VK_NULL_HANDLE)
|
||||
if (MenuVulkan::vkUpscaleTrig && MenuVulkan::queryPool != VK_NULL_HANDLE)
|
||||
{
|
||||
// Retrieve timestamps
|
||||
uint64_t timestamps[2];
|
||||
vkGetQueryPoolResults(_device, ImGuiOverlayVk::queryPool, 0, 2, sizeof(timestamps), timestamps, sizeof(uint64_t), VK_QUERY_RESULT_64_BIT);
|
||||
vkGetQueryPoolResults(_device, MenuVulkan::queryPool, 0, 2, sizeof(timestamps), timestamps, sizeof(uint64_t), VK_QUERY_RESULT_64_BIT);
|
||||
|
||||
// Calculate elapsed time in milliseconds
|
||||
double elapsedTimeMs = (timestamps[1] - timestamps[0]) * ImGuiOverlayVk::timeStampPeriod / 1e6;
|
||||
double elapsedTimeMs = (timestamps[1] - timestamps[0]) * MenuVulkan::timeStampPeriod / 1e6;
|
||||
|
||||
if (elapsedTimeMs > 0.0 && elapsedTimeMs < 5000.0)
|
||||
{
|
||||
@@ -608,7 +514,7 @@ static VkResult hkvkQueuePresentKHR(VkQueue queue, VkPresentInfoKHR* pPresentInf
|
||||
Config::Instance()->upscaleTimes.pop_front();
|
||||
}
|
||||
|
||||
ImGuiOverlayVk::vkUpscaleTrig = false;
|
||||
MenuVulkan::vkUpscaleTrig = false;
|
||||
}
|
||||
|
||||
LOG_DEBUG("rendering menu, swapchain count: {0}", pPresentInfo->swapchainCount);
|
||||
@@ -621,7 +527,7 @@ static VkResult hkvkQueuePresentKHR(VkQueue queue, VkPresentInfoKHR* pPresentInf
|
||||
ImGui_ImplVulkan_NewFrame();
|
||||
ImGui_ImplWin32_NewFrame();
|
||||
|
||||
ImGuiOverlayBase::RenderMenu();
|
||||
MenuBase::RenderMenu();
|
||||
|
||||
uint32_t idx = pPresentInfo->pImageIndices[scIndex];
|
||||
ImGui_ImplVulkanH_Frame* fd = &_ImVulkan_Frames[idx];
|
||||
@@ -705,117 +611,40 @@ static VkResult hkvkQueuePresentKHR(VkQueue queue, VkPresentInfoKHR* pPresentInf
|
||||
return VK_ERROR_OUT_OF_DATE_KHR;
|
||||
}
|
||||
|
||||
// original call
|
||||
Config::Instance()->VulkanCreatingSC = true;
|
||||
auto result = o_QueuePresentKHR(queue, pPresentInfo);
|
||||
Config::Instance()->VulkanCreatingSC = false;
|
||||
LOG_FUNC_RESULT(result);
|
||||
_vkPresentMutex.unlock();
|
||||
return result;
|
||||
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
|
||||
static VkResult hkvkCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchain)
|
||||
void MenuVulkan::CreateSwapchain(VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, VkSwapchainKHR* pSwapchain)
|
||||
{
|
||||
LOG_FUNC();
|
||||
Config::Instance()->ScreenWidth = pCreateInfo->imageExtent.width;
|
||||
Config::Instance()->ScreenHeight = pCreateInfo->imageExtent.height;
|
||||
|
||||
Config::Instance()->VulkanCreatingSC = true;
|
||||
auto result = o_CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
|
||||
Config::Instance()->VulkanCreatingSC = false;
|
||||
LOG_DEBUG("if (result == VK_SUCCESS && device != VK_NULL_HANDLE && pCreateInfo != nullptr && pSwapchain != VK_NULL_HANDLE)");
|
||||
|
||||
if (result == VK_SUCCESS && device != VK_NULL_HANDLE && pCreateInfo != nullptr && *pSwapchain != VK_NULL_HANDLE && !Config::Instance()->VulkanSkipHooks)
|
||||
_device = device;
|
||||
LOG_DEBUG("_device captured: {0:X}", (UINT64)_device);
|
||||
|
||||
if (MenuBase::Handle() != _hwnd)
|
||||
{
|
||||
Config::Instance()->ScreenWidth = pCreateInfo->imageExtent.width;
|
||||
Config::Instance()->ScreenHeight = pCreateInfo->imageExtent.height;
|
||||
LOG_DEBUG("MenuBase::Handle() != _hwnd");
|
||||
|
||||
LOG_DEBUG("if (result == VK_SUCCESS && device != VK_NULL_HANDLE && pCreateInfo != nullptr && pSwapchain != VK_NULL_HANDLE)");
|
||||
|
||||
_device = device;
|
||||
LOG_DEBUG("_device captured: {0:X}", (UINT64)_device);
|
||||
|
||||
if (ImGuiOverlayBase::Handle() != _hwnd)
|
||||
if (MenuBase::IsInited())
|
||||
{
|
||||
LOG_DEBUG("ImGuiOverlayBase::Handle() != _hwnd");
|
||||
|
||||
if (ImGuiOverlayBase::IsInited())
|
||||
{
|
||||
LOG_DEBUG("ImGuiOverlayBase::Shutdown();");
|
||||
ImGuiOverlayBase::Shutdown();
|
||||
}
|
||||
|
||||
LOG_DEBUG("ImGuiOverlayBase::Init({0:X})", (UINT64)_hwnd);
|
||||
ImGuiOverlayBase::Init(_hwnd);
|
||||
LOG_DEBUG("MenuBase::Shutdown();");
|
||||
MenuBase::Shutdown();
|
||||
}
|
||||
|
||||
CreateVulkanObjects(_device, pCreateInfo, pSwapchain);
|
||||
|
||||
if (_ImVulkan_Info.Device != VK_NULL_HANDLE)
|
||||
{
|
||||
_isInited = true;
|
||||
ImGuiOverlayBase::VulkanReady();
|
||||
}
|
||||
LOG_DEBUG("MenuBase::Init({0:X})", (UINT64)_hwnd);
|
||||
MenuBase::Init(_hwnd);
|
||||
}
|
||||
|
||||
LOG_FUNC_RESULT(result);
|
||||
return result;
|
||||
}
|
||||
CreateVulkanObjects(_device, pCreateInfo, pSwapchain);
|
||||
|
||||
void ImGuiOverlayVk::HookVk()
|
||||
{
|
||||
if (o_vkCreateDevice != nullptr)
|
||||
return;
|
||||
|
||||
o_vkCreateDevice = (PFN_vkCreateDevice)DetourFindFunction("vulkan-1.dll", "vkCreateDevice");
|
||||
o_vkCreateInstance = (PFN_vkCreateInstance)DetourFindFunction("vulkan-1.dll", "vkCreateInstance");
|
||||
o_vkCreateWin32SurfaceKHR = (PFN_vkCreateWin32SurfaceKHR)DetourFindFunction("vulkan-1.dll", "vkCreateWin32SurfaceKHR");
|
||||
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
|
||||
if (o_vkCreateDevice != nullptr)
|
||||
DetourAttach(&(PVOID&)o_vkCreateDevice, hkvkCreateDevice);
|
||||
|
||||
if (o_vkCreateInstance != nullptr)
|
||||
DetourAttach(&(PVOID&)o_vkCreateInstance, hkvkCreateInstance);
|
||||
|
||||
if (o_vkCreateWin32SurfaceKHR != nullptr)
|
||||
DetourAttach(&(PVOID&)o_vkCreateWin32SurfaceKHR, hkvkCreateWin32SurfaceKHR);
|
||||
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
|
||||
void ImGuiOverlayVk::UnHookVk()
|
||||
{
|
||||
if (_isInited)
|
||||
ImGui_ImplVulkan_Shutdown();
|
||||
|
||||
ImGuiOverlayBase::Shutdown();
|
||||
|
||||
if (_vulkanObjectsCreated)
|
||||
DestroyVulkanObjects(true);
|
||||
|
||||
if (_isInited)
|
||||
if (_ImVulkan_Info.Device != VK_NULL_HANDLE)
|
||||
{
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
|
||||
if (o_QueuePresentKHR != nullptr)
|
||||
DetourDetach(&(PVOID&)o_QueuePresentKHR, hkvkQueuePresentKHR);
|
||||
|
||||
if (o_CreateSwapchainKHR != nullptr)
|
||||
DetourDetach(&(PVOID&)o_CreateSwapchainKHR, hkvkCreateSwapchainKHR);
|
||||
|
||||
if (o_vkCreateDevice != nullptr)
|
||||
DetourDetach(&(PVOID&)o_vkCreateDevice, hkvkCreateDevice);
|
||||
|
||||
if (o_vkCreateInstance != nullptr)
|
||||
DetourDetach(&(PVOID&)o_vkCreateInstance, hkvkCreateInstance);
|
||||
|
||||
if (o_vkCreateWin32SurfaceKHR != nullptr)
|
||||
DetourDetach(&(PVOID&)o_vkCreateWin32SurfaceKHR, hkvkCreateWin32SurfaceKHR);
|
||||
|
||||
DetourTransactionCommit();
|
||||
_isInited = true;
|
||||
MenuBase::VulkanReady();
|
||||
}
|
||||
|
||||
_isInited = false;
|
||||
_vulkanObjectsCreated = false;
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
#pragma once
|
||||
|
||||
#include <pch.h>
|
||||
|
||||
#include <vulkan/vulkan.hpp>
|
||||
|
||||
class MenuVulkan
|
||||
{
|
||||
private:
|
||||
inline static VkQueryPool queryPool = VK_NULL_HANDLE;
|
||||
inline static double timeStampPeriod = 1.0;
|
||||
inline static bool vkUpscaleTrig = false;
|
||||
|
||||
public:
|
||||
static void CreateSurface(VkInstance instance, HWND hwnd);
|
||||
static void CreateInstance(VkInstance* pInstance);
|
||||
static void CreateDevice(VkPhysicalDevice physicalDevice, VkDevice* pDevice);
|
||||
static VkResult QueuePresent(VkQueue queue, VkPresentInfoKHR* pPresentInfo);
|
||||
static void CreateSwapchain(VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, VkSwapchainKHR* pSwapchain);
|
||||
};
|
||||
@@ -1,23 +1,23 @@
|
||||
#include <menu/imgui_dx_base.h>
|
||||
#include "OldMenuBase.h"
|
||||
|
||||
#include <Util.h>
|
||||
#include <Config.h>
|
||||
#include <Logger.h>
|
||||
#include <resource.h>
|
||||
#include <menu/imgui_common.h>
|
||||
#include <menu/MenuCommon.h>
|
||||
|
||||
#include <include/imgui/imgui_impl_win32.h>
|
||||
|
||||
void ImguiDxBase::RenderMenu()
|
||||
void OldMenuBase::RenderMenu()
|
||||
{
|
||||
if (Config::Instance()->OverlayMenu.value_or(true))
|
||||
return;
|
||||
|
||||
ImGuiCommon::RenderMenu();
|
||||
MenuCommon::RenderMenu();
|
||||
ImGui::Render();
|
||||
}
|
||||
|
||||
bool ImguiDxBase::IsHandleDifferent()
|
||||
bool OldMenuBase::IsHandleDifferent()
|
||||
{
|
||||
if (Config::Instance()->OverlayMenu.value_or(true))
|
||||
return false;
|
||||
@@ -32,35 +32,35 @@ bool ImguiDxBase::IsHandleDifferent()
|
||||
return true;
|
||||
}
|
||||
|
||||
void ImguiDxBase::Dx11Ready()
|
||||
void OldMenuBase::Dx11Ready()
|
||||
{
|
||||
ImGuiCommon::Dx11Inited();
|
||||
MenuCommon::Dx11Inited();
|
||||
}
|
||||
|
||||
void ImguiDxBase::Dx12Ready()
|
||||
void OldMenuBase::Dx12Ready()
|
||||
{
|
||||
ImGuiCommon::Dx12Inited();
|
||||
MenuCommon::Dx12Inited();
|
||||
}
|
||||
|
||||
ImguiDxBase::ImguiDxBase(HWND handle) : _handle(handle)
|
||||
OldMenuBase::OldMenuBase(HWND handle) : _handle(handle)
|
||||
{
|
||||
if (Config::Instance()->OverlayMenu.value_or(true))
|
||||
return;
|
||||
|
||||
ImGuiCommon::Init(handle);
|
||||
MenuCommon::Init(handle);
|
||||
|
||||
_baseInit = ImGuiCommon::IsInited();
|
||||
_baseInit = MenuCommon::IsInited();
|
||||
}
|
||||
|
||||
ImguiDxBase::~ImguiDxBase()
|
||||
OldMenuBase::~OldMenuBase()
|
||||
{
|
||||
if (!_baseInit)
|
||||
return;
|
||||
|
||||
ImGuiCommon::Shutdown();
|
||||
MenuCommon::Shutdown();
|
||||
}
|
||||
|
||||
bool ImguiDxBase::IsVisible() const
|
||||
bool OldMenuBase::IsVisible() const
|
||||
{
|
||||
return ImGuiCommon::IsVisible();
|
||||
return MenuCommon::IsVisible();
|
||||
}
|
||||
@@ -2,11 +2,11 @@
|
||||
|
||||
#include <pch.h>
|
||||
|
||||
#include "imgui_common.h"
|
||||
#include "MenuCommon.h"
|
||||
|
||||
#include <dxgi.h>
|
||||
|
||||
class ImguiDxBase
|
||||
class OldMenuBase
|
||||
{
|
||||
private:
|
||||
HWND _handle = nullptr;
|
||||
@@ -56,7 +56,7 @@ public:
|
||||
void Dx11Ready();
|
||||
void Dx12Ready();
|
||||
|
||||
explicit ImguiDxBase(HWND handle);
|
||||
explicit OldMenuBase(HWND handle);
|
||||
|
||||
~ImguiDxBase();
|
||||
~OldMenuBase();
|
||||
};
|
||||
@@ -1,9 +1,9 @@
|
||||
#include "Imgui_Dx11.h"
|
||||
#include "OldMenuDx11.h"
|
||||
|
||||
#include <include/imgui/imgui_impl_dx11.h>
|
||||
#include <include/imgui/imgui_impl_win32.h>
|
||||
|
||||
void Imgui_Dx11::CreateRenderTarget(ID3D11Resource* out)
|
||||
void OldMenuDx11::CreateRenderTarget(ID3D11Resource* out)
|
||||
{
|
||||
ID3D11Texture2D* outTexture2D = nullptr;
|
||||
|
||||
@@ -67,7 +67,7 @@ void Imgui_Dx11::CreateRenderTarget(ID3D11Resource* out)
|
||||
}
|
||||
}
|
||||
|
||||
bool Imgui_Dx11::Render(ID3D11DeviceContext* pCmdList, ID3D11Resource* outTexture)
|
||||
bool OldMenuDx11::Render(ID3D11DeviceContext* pCmdList, ID3D11Resource* outTexture)
|
||||
{
|
||||
if (Config::Instance()->OverlayMenu.value_or(true))
|
||||
return false;
|
||||
@@ -93,7 +93,7 @@ bool Imgui_Dx11::Render(ID3D11DeviceContext* pCmdList, ID3D11Resource* outTextur
|
||||
ImGui_ImplDX11_NewFrame();
|
||||
ImGui_ImplWin32_NewFrame();
|
||||
|
||||
ImguiDxBase::RenderMenu();
|
||||
OldMenuBase::RenderMenu();
|
||||
|
||||
// Create RTV for out
|
||||
pCmdList->OMSetRenderTargets(1, &_renderTargetView, nullptr);
|
||||
@@ -117,17 +117,17 @@ bool Imgui_Dx11::Render(ID3D11DeviceContext* pCmdList, ID3D11Resource* outTextur
|
||||
return true;
|
||||
}
|
||||
|
||||
Imgui_Dx11::Imgui_Dx11(HWND handle, ID3D11Device* pDevice) : ImguiDxBase(handle), _device(pDevice)
|
||||
OldMenuDx11::OldMenuDx11(HWND handle, ID3D11Device* pDevice) : OldMenuBase(handle), _device(pDevice)
|
||||
{
|
||||
Dx11Ready();
|
||||
}
|
||||
|
||||
Imgui_Dx11::~Imgui_Dx11()
|
||||
OldMenuDx11::~OldMenuDx11()
|
||||
{
|
||||
if (!_dx11Init)
|
||||
return;
|
||||
|
||||
ImGuiCommon::Shutdown();
|
||||
MenuCommon::Shutdown();
|
||||
|
||||
// hackzor
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(250));
|
||||
@@ -1,10 +1,10 @@
|
||||
#pragma once
|
||||
|
||||
#include "imgui_dx_base.h"
|
||||
#include "OldMenuBase.h"
|
||||
|
||||
#include <d3d11.h>
|
||||
|
||||
class Imgui_Dx11 : public ImguiDxBase
|
||||
class OldMenuDx11 : public OldMenuBase
|
||||
{
|
||||
private:
|
||||
bool _dx11Init = false;
|
||||
@@ -18,7 +18,7 @@ private:
|
||||
public:
|
||||
bool Render(ID3D11DeviceContext* pCmdList, ID3D11Resource* outTexture);
|
||||
|
||||
Imgui_Dx11(HWND handle, ID3D11Device* pDevice);
|
||||
OldMenuDx11(HWND handle, ID3D11Device* pDevice);
|
||||
|
||||
~Imgui_Dx11();
|
||||
~OldMenuDx11();
|
||||
};
|
||||
@@ -1,4 +1,4 @@
|
||||
#include "Imgui_Dx12.h"
|
||||
#include "OldMenuDx12.h"
|
||||
|
||||
#include <include/d3dx/d3dx12.h>
|
||||
#include <include/imgui/imgui_impl_dx12.h>
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
long frameCounter = 0;
|
||||
|
||||
bool Imgui_Dx12::Render(ID3D12GraphicsCommandList* pCmdList, ID3D12Resource* outTexture)
|
||||
bool OldMenuDx12::Render(ID3D12GraphicsCommandList* pCmdList, ID3D12Resource* outTexture)
|
||||
{
|
||||
if (Config::Instance()->OverlayMenu.value_or(true))
|
||||
return false;
|
||||
@@ -61,7 +61,7 @@ bool Imgui_Dx12::Render(ID3D12GraphicsCommandList* pCmdList, ID3D12Resource* out
|
||||
ImGui_ImplWin32_NewFrame();
|
||||
|
||||
// Render
|
||||
ImguiDxBase::RenderMenu();
|
||||
OldMenuBase::RenderMenu();
|
||||
ImGui_ImplDX12_RenderDrawData(ImGui::GetDrawData(), pCmdList);
|
||||
|
||||
outBarrier.Transition.StateBefore = D3D12_RESOURCE_STATE_RENDER_TARGET;
|
||||
@@ -108,7 +108,7 @@ bool Imgui_Dx12::Render(ID3D12GraphicsCommandList* pCmdList, ID3D12Resource* out
|
||||
ImGui_ImplWin32_NewFrame();
|
||||
|
||||
// Render to buffer
|
||||
ImguiDxBase::RenderMenu();
|
||||
OldMenuBase::RenderMenu();
|
||||
|
||||
ImGui_ImplDX12_RenderDrawData(ImGui::GetDrawData(), pCmdList);
|
||||
|
||||
@@ -133,7 +133,7 @@ bool Imgui_Dx12::Render(ID3D12GraphicsCommandList* pCmdList, ID3D12Resource* out
|
||||
return true;
|
||||
}
|
||||
|
||||
Imgui_Dx12::Imgui_Dx12(HWND handle, ID3D12Device* pDevice) : ImguiDxBase(handle), _device(pDevice)
|
||||
OldMenuDx12::OldMenuDx12(HWND handle, ID3D12Device* pDevice) : OldMenuBase(handle), _device(pDevice)
|
||||
{
|
||||
if (Config::Instance()->OverlayMenu.value_or(true))
|
||||
return;
|
||||
@@ -170,7 +170,7 @@ Imgui_Dx12::Imgui_Dx12(HWND handle, ID3D12Device* pDevice) : ImguiDxBase(handle)
|
||||
_srvDescHeap->SetName(L"Imgui_Dx12_srvDescHeap");
|
||||
}
|
||||
|
||||
Imgui_Dx12::~Imgui_Dx12()
|
||||
OldMenuDx12::~OldMenuDx12()
|
||||
{
|
||||
if (!_dx12Init)
|
||||
return;
|
||||
@@ -216,7 +216,7 @@ Imgui_Dx12::~Imgui_Dx12()
|
||||
}
|
||||
}
|
||||
|
||||
void Imgui_Dx12::CreateRenderTarget(const D3D12_RESOURCE_DESC& InDesc)
|
||||
void OldMenuDx12::CreateRenderTarget(const D3D12_RESOURCE_DESC& InDesc)
|
||||
{
|
||||
if (_renderTargetResource[0] != nullptr)
|
||||
{
|
||||
@@ -1,10 +1,10 @@
|
||||
#pragma once
|
||||
|
||||
#include "imgui_dx_base.h"
|
||||
#include "OldMenuBase.h"
|
||||
|
||||
#include <d3d12.h>
|
||||
|
||||
class Imgui_Dx12 : public ImguiDxBase
|
||||
class OldMenuDx12 : public OldMenuBase
|
||||
{
|
||||
private:
|
||||
bool _dx12Init = false;
|
||||
@@ -21,7 +21,7 @@ private:
|
||||
public:
|
||||
bool Render(ID3D12GraphicsCommandList* pCmdList, ID3D12Resource* outTexture);
|
||||
|
||||
Imgui_Dx12(HWND handle, ID3D12Device* pDevice);
|
||||
OldMenuDx12(HWND handle, ID3D12Device* pDevice);
|
||||
|
||||
~Imgui_Dx12();
|
||||
~OldMenuDx12();
|
||||
};
|
||||
@@ -1,72 +0,0 @@
|
||||
#include "imgui_overlay_base.h"
|
||||
|
||||
#include <Config.h>
|
||||
#include <Logger.h>
|
||||
#include <resource.h>
|
||||
#include "imgui_common.h"
|
||||
|
||||
#include <include/imgui/imgui.h>
|
||||
#include <include/imgui/imgui_impl_win32.h>
|
||||
|
||||
|
||||
HWND ImGuiOverlayBase::Handle()
|
||||
{
|
||||
return ImGuiCommon::Handle();
|
||||
}
|
||||
|
||||
void ImGuiOverlayBase::Dx11Ready()
|
||||
{
|
||||
ImGuiCommon::Dx11Inited();
|
||||
}
|
||||
|
||||
void ImGuiOverlayBase::Dx12Ready()
|
||||
{
|
||||
ImGuiCommon::Dx12Inited();
|
||||
}
|
||||
|
||||
void ImGuiOverlayBase::VulkanReady()
|
||||
{
|
||||
ImGuiCommon::VulkanInited();
|
||||
}
|
||||
|
||||
bool ImGuiOverlayBase::IsInited()
|
||||
{
|
||||
return ImGuiCommon::IsInited();
|
||||
}
|
||||
|
||||
bool ImGuiOverlayBase::IsVisible()
|
||||
{
|
||||
return ImGuiCommon::IsVisible();
|
||||
}
|
||||
|
||||
bool ImGuiOverlayBase::IsResetRequested()
|
||||
{
|
||||
return ImGuiCommon::IsResetRequested();
|
||||
}
|
||||
|
||||
void ImGuiOverlayBase::Init(HWND InHandle)
|
||||
{
|
||||
if (!Config::Instance()->OverlayMenu.value_or(true))
|
||||
return;
|
||||
|
||||
LOG_FUNC();
|
||||
ImGuiCommon::Init(InHandle);
|
||||
}
|
||||
|
||||
void ImGuiOverlayBase::RenderMenu()
|
||||
{
|
||||
if (!Config::Instance()->OverlayMenu.value_or(true))
|
||||
return;
|
||||
|
||||
ImGuiCommon::RenderMenu();
|
||||
}
|
||||
|
||||
void ImGuiOverlayBase::Shutdown()
|
||||
{
|
||||
ImGuiCommon::Shutdown();
|
||||
}
|
||||
|
||||
void ImGuiOverlayBase::HideMenu()
|
||||
{
|
||||
ImGuiCommon::HideMenu();
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <pch.h>
|
||||
|
||||
#include <vulkan/vulkan.hpp>
|
||||
|
||||
namespace ImGuiOverlayVk
|
||||
{
|
||||
inline VkQueryPool queryPool = VK_NULL_HANDLE;
|
||||
inline double timeStampPeriod = 1.0;
|
||||
inline bool vkUpscaleTrig = false;
|
||||
|
||||
void HookVk();
|
||||
void UnHookVk();
|
||||
}
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
#include <pch.h>
|
||||
|
||||
#include "imgui_overlay_base.h"
|
||||
#include "MenuBase.h"
|
||||
|
||||
#include <dxgi1_6.h>
|
||||
|
||||
|
||||
@@ -0,0 +1,125 @@
|
||||
#pragma once
|
||||
|
||||
#include <pch.h>
|
||||
|
||||
#include "NvApiTypes.h"
|
||||
#include "ReflexHooks.h"
|
||||
#include "fakenvapi.h"
|
||||
|
||||
class NvApiHooks {
|
||||
public:
|
||||
// NvAPI_GPU_GetArchInfo hooking based on Nukem's spoofing code here
|
||||
// https://github.com/Nukem9/dlssg-to-fsr3/blob/89ddc8c1cce4593fb420e633a06605c3c4b9c3cf/source/wrapper_generic/nvapi.cpp#L50
|
||||
|
||||
inline static NvApiTypes::PFN_NvApi_QueryInterface OriginalNvAPI_QueryInterface = nullptr;
|
||||
inline static NvApiTypes::PfnNvAPI_GPU_GetArchInfo OriginalNvAPI_GPU_GetArchInfo = nullptr;
|
||||
|
||||
inline static uint32_t __stdcall HookedNvAPI_GPU_GetArchInfo(void* GPUHandle, NV_GPU_ARCH_INFO* ArchInfo)
|
||||
{
|
||||
if (OriginalNvAPI_GPU_GetArchInfo)
|
||||
{
|
||||
const auto status = OriginalNvAPI_GPU_GetArchInfo(GPUHandle, ArchInfo);
|
||||
|
||||
if (status == 0 && ArchInfo)
|
||||
{
|
||||
LOG_DEBUG("From api arch: {0:X} impl: {1:X} rev: {2:X}!", ArchInfo->architecture, ArchInfo->implementation, ArchInfo->revision);
|
||||
|
||||
// for 16xx cards
|
||||
if (ArchInfo->architecture == NV_GPU_ARCHITECTURE_TU100 && ArchInfo->implementation > NV_GPU_ARCH_IMPLEMENTATION_TU106)
|
||||
{
|
||||
ArchInfo->implementation = NV_GPU_ARCH_IMPLEMENTATION_TU106;
|
||||
ArchInfo->implementation_id = NV_GPU_ARCH_IMPLEMENTATION_TU106;
|
||||
|
||||
LOG_INFO("Spoofed arch: {0:X} impl: {1:X} rev: {2:X}!", ArchInfo->architecture, ArchInfo->implementation, ArchInfo->revision);
|
||||
}
|
||||
//else if (ArchInfo->architecture < NV_GPU_ARCHITECTURE_TU100 && ArchInfo->architecture >= NV_GPU_ARCHITECTURE_GP100)
|
||||
//{
|
||||
// LOG_INFO("Spoofing below 16xx arch: {0:X} impl: {1:X} rev: {2:X}!", ArchInfo->architecture, ArchInfo->implementation, ArchInfo->revision);
|
||||
|
||||
// ArchInfo->architecture = NV_GPU_ARCHITECTURE_TU100;
|
||||
// ArchInfo->architecture_id = NV_GPU_ARCHITECTURE_TU100;
|
||||
// ArchInfo->implementation = NV_GPU_ARCH_IMPLEMENTATION_TU106;
|
||||
// ArchInfo->implementation_id = NV_GPU_ARCH_IMPLEMENTATION_TU106;
|
||||
|
||||
// LOG_INFO("Spoofed arch: {0:X} impl: {1:X} rev: {2:X}!", ArchInfo->architecture, ArchInfo->implementation, ArchInfo->revision);
|
||||
//}
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
return 0xFFFFFFFF;
|
||||
}
|
||||
|
||||
inline static void* __stdcall HookedNvAPI_QueryInterface(NvApiTypes::NV_INTERFACE InterfaceId)
|
||||
{
|
||||
switch (InterfaceId) {
|
||||
case NvApiTypes::NV_INTERFACE::D3D_SetSleepMode:
|
||||
case NvApiTypes::NV_INTERFACE::D3D_Sleep:
|
||||
case NvApiTypes::NV_INTERFACE::D3D_GetLatency:
|
||||
case NvApiTypes::NV_INTERFACE::D3D_SetLatencyMarker:
|
||||
case NvApiTypes::NV_INTERFACE::D3D12_SetAsyncFrameMarker:
|
||||
return ReflexHooks::hookReflex(OriginalNvAPI_QueryInterface, InterfaceId);
|
||||
default:
|
||||
ReflexHooks::hookReflex(OriginalNvAPI_QueryInterface, InterfaceId);
|
||||
}
|
||||
|
||||
const auto functionPointer = OriginalNvAPI_QueryInterface(InterfaceId);
|
||||
|
||||
if (functionPointer)
|
||||
{
|
||||
switch (InterfaceId) {
|
||||
case NvApiTypes::NV_INTERFACE::GPU_GetArchInfo:
|
||||
if (!Config::Instance()->DE_Available) {
|
||||
OriginalNvAPI_GPU_GetArchInfo = static_cast<NvApiTypes::PfnNvAPI_GPU_GetArchInfo>(functionPointer);
|
||||
return &HookedNvAPI_GPU_GetArchInfo;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return functionPointer;
|
||||
}
|
||||
|
||||
// Requires HMODULE to make sure nvapi is loaded before calling this function
|
||||
inline static void Hook(HMODULE nvapiModule)
|
||||
{
|
||||
if (OriginalNvAPI_QueryInterface != nullptr)
|
||||
return;
|
||||
|
||||
if (nvapiModule == nullptr) {
|
||||
LOG_ERROR("Hook called with a nullptr nvapi module");
|
||||
return;
|
||||
}
|
||||
|
||||
LOG_DEBUG("Trying to hook NvApi");
|
||||
|
||||
OriginalNvAPI_QueryInterface = (NvApiTypes::PFN_NvApi_QueryInterface)GetProcAddress(nvapiModule, "nvapi_QueryInterface");
|
||||
|
||||
LOG_DEBUG("OriginalNvAPI_QueryInterface = {0:X}", (unsigned long long)OriginalNvAPI_QueryInterface);
|
||||
|
||||
if (OriginalNvAPI_QueryInterface != nullptr)
|
||||
{
|
||||
LOG_INFO("NvAPI_QueryInterface found, hooking!");
|
||||
fakenvapi::Init((fakenvapi::PFN_Fake_QueryInterface&)OriginalNvAPI_QueryInterface);
|
||||
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
DetourAttach(&(PVOID&)OriginalNvAPI_QueryInterface, HookedNvAPI_QueryInterface);
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
}
|
||||
|
||||
inline static void Unhook() {
|
||||
DetourTransactionBegin();
|
||||
DetourUpdateThread(GetCurrentThread());
|
||||
|
||||
if (OriginalNvAPI_QueryInterface != nullptr)
|
||||
{
|
||||
DetourDetach(&(PVOID&)OriginalNvAPI_QueryInterface, HookedNvAPI_QueryInterface);
|
||||
OriginalNvAPI_QueryInterface = nullptr;
|
||||
}
|
||||
|
||||
DetourTransactionCommit();
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,26 @@
|
||||
#pragma once
|
||||
|
||||
#include <pch.h>
|
||||
|
||||
#include <dxgi.h>
|
||||
#include <d3d12.h>
|
||||
#include <include/nvapi/nvapi.h>
|
||||
|
||||
// Separate to break up a circular dependency
|
||||
class NvApiTypes {
|
||||
public:
|
||||
enum class NV_INTERFACE : uint32_t
|
||||
{
|
||||
GPU_GetArchInfo = 0xD8265D24,
|
||||
D3D12_SetRawScgPriority = 0x5DB3048A,
|
||||
D3D_SetSleepMode = 0xac1ca9e0,
|
||||
D3D_Sleep = 0x852cd1d2,
|
||||
D3D_GetLatency = 0x1a587f9c,
|
||||
D3D_SetLatencyMarker = 0xd9984c05,
|
||||
D3D12_SetAsyncFrameMarker = 0x13c98f73,
|
||||
};
|
||||
|
||||
typedef void* (__stdcall* PFN_NvApi_QueryInterface)(NV_INTERFACE InterfaceId);
|
||||
|
||||
using PfnNvAPI_GPU_GetArchInfo = uint32_t(__stdcall*)(void* GPUHandle, NV_GPU_ARCH_INFO* ArchInfo);
|
||||
};
|
||||
@@ -0,0 +1,141 @@
|
||||
#pragma once
|
||||
|
||||
#include "NvApiTypes.h"
|
||||
|
||||
#include <include/detours/detours.h>
|
||||
|
||||
class ReflexHooks {
|
||||
inline static bool _inited = false;
|
||||
inline static uint32_t _minimumIntervalUs = 0;
|
||||
inline static NV_SET_SLEEP_MODE_PARAMS _lastSleepParams{};
|
||||
inline static IUnknown* _lastSleepDev = nullptr;
|
||||
inline static bool _markersPresent = false;
|
||||
|
||||
inline static decltype(&NvAPI_D3D_SetSleepMode) o_NvAPI_D3D_SetSleepMode = nullptr;
|
||||
inline static decltype(&NvAPI_D3D_Sleep) o_NvAPI_D3D_Sleep = nullptr;
|
||||
inline static decltype(&NvAPI_D3D_GetLatency) o_NvAPI_D3D_GetLatency = nullptr;
|
||||
inline static decltype(&NvAPI_D3D_SetLatencyMarker) o_NvAPI_D3D_SetLatencyMarker = nullptr;
|
||||
inline static decltype(&NvAPI_D3D12_SetAsyncFrameMarker) o_NvAPI_D3D12_SetAsyncFrameMarker = nullptr;
|
||||
|
||||
inline static NvAPI_Status hNvAPI_D3D_SetSleepMode(IUnknown* pDev, NV_SET_SLEEP_MODE_PARAMS* pSetSleepModeParams) {
|
||||
#ifdef _DEBUG
|
||||
LOG_FUNC();
|
||||
#endif
|
||||
// Store for later so we can adjust the fps whenever we want
|
||||
memcpy(&_lastSleepParams, pSetSleepModeParams, sizeof(NV_SET_SLEEP_MODE_PARAMS));
|
||||
_lastSleepDev = pDev;
|
||||
|
||||
if (_minimumIntervalUs != 0)
|
||||
pSetSleepModeParams->minimumIntervalUs = _minimumIntervalUs;
|
||||
|
||||
return o_NvAPI_D3D_SetSleepMode(pDev, pSetSleepModeParams);
|
||||
}
|
||||
|
||||
inline static NvAPI_Status hNvAPI_D3D_Sleep(IUnknown* pDev) {
|
||||
#ifdef _DEBUG
|
||||
LOG_FUNC();
|
||||
#endif
|
||||
|
||||
return o_NvAPI_D3D_Sleep(pDev);
|
||||
}
|
||||
|
||||
inline static NvAPI_Status hNvAPI_D3D_GetLatency(IUnknown* pDev, NV_LATENCY_RESULT_PARAMS* pGetLatencyParams) {
|
||||
#ifdef _DEBUG
|
||||
LOG_FUNC();
|
||||
#endif
|
||||
|
||||
return o_NvAPI_D3D_GetLatency(pDev, pGetLatencyParams);
|
||||
}
|
||||
|
||||
inline static NvAPI_Status hNvAPI_D3D_SetLatencyMarker(IUnknown* pDev, NV_LATENCY_MARKER_PARAMS* pSetLatencyMarkerParams) {
|
||||
#ifdef _DEBUG
|
||||
LOG_FUNC();
|
||||
#endif
|
||||
|
||||
_markersPresent = true;
|
||||
return o_NvAPI_D3D_SetLatencyMarker(pDev, pSetLatencyMarkerParams);
|
||||
}
|
||||
|
||||
inline static NvAPI_Status hNvAPI_D3D12_SetAsyncFrameMarker(ID3D12CommandQueue* pCommandQueue, NV_ASYNC_FRAME_MARKER_PARAMS* pSetAsyncFrameMarkerParams) {
|
||||
#ifdef _DEBUG
|
||||
LOG_FUNC();
|
||||
#endif
|
||||
|
||||
return o_NvAPI_D3D12_SetAsyncFrameMarker(pCommandQueue, pSetAsyncFrameMarkerParams);
|
||||
}
|
||||
|
||||
public:
|
||||
inline static void* hookReflex(NvApiTypes::PFN_NvApi_QueryInterface &queryInterface, NvApiTypes::NV_INTERFACE InterfaceId) {
|
||||
#ifdef _DEBUG
|
||||
LOG_FUNC();
|
||||
#endif
|
||||
|
||||
if (o_NvAPI_D3D_SetSleepMode == nullptr || o_NvAPI_D3D_Sleep == nullptr || o_NvAPI_D3D_GetLatency == nullptr || o_NvAPI_D3D_SetLatencyMarker == nullptr || o_NvAPI_D3D12_SetAsyncFrameMarker == nullptr) {
|
||||
o_NvAPI_D3D_SetSleepMode = static_cast<decltype(&NvAPI_D3D_SetSleepMode)>(queryInterface(NvApiTypes::NV_INTERFACE::D3D_SetSleepMode));
|
||||
o_NvAPI_D3D_Sleep = static_cast<decltype(&NvAPI_D3D_Sleep)>(queryInterface(NvApiTypes::NV_INTERFACE::D3D_Sleep));
|
||||
o_NvAPI_D3D_GetLatency = static_cast<decltype(&NvAPI_D3D_GetLatency)>(queryInterface(NvApiTypes::NV_INTERFACE::D3D_GetLatency));
|
||||
o_NvAPI_D3D_SetLatencyMarker = static_cast<decltype(&NvAPI_D3D_SetLatencyMarker)>(queryInterface(NvApiTypes::NV_INTERFACE::D3D_SetLatencyMarker));
|
||||
o_NvAPI_D3D12_SetAsyncFrameMarker = static_cast<decltype(&NvAPI_D3D12_SetAsyncFrameMarker)>(queryInterface(NvApiTypes::NV_INTERFACE::D3D12_SetAsyncFrameMarker));
|
||||
}
|
||||
|
||||
switch (InterfaceId) {
|
||||
case NvApiTypes::NV_INTERFACE::D3D_SetSleepMode:
|
||||
if (o_NvAPI_D3D_SetSleepMode != nullptr)
|
||||
return &hNvAPI_D3D_SetSleepMode;
|
||||
break;
|
||||
case NvApiTypes::NV_INTERFACE::D3D_Sleep:
|
||||
if (o_NvAPI_D3D_Sleep != nullptr)
|
||||
return &hNvAPI_D3D_Sleep;
|
||||
break;
|
||||
case NvApiTypes::NV_INTERFACE::D3D_GetLatency:
|
||||
if (o_NvAPI_D3D_GetLatency != nullptr)
|
||||
return &hNvAPI_D3D_GetLatency;
|
||||
break;
|
||||
case NvApiTypes::NV_INTERFACE::D3D_SetLatencyMarker:
|
||||
if (o_NvAPI_D3D_SetLatencyMarker != nullptr)
|
||||
return &hNvAPI_D3D_SetLatencyMarker;
|
||||
break;
|
||||
case NvApiTypes::NV_INTERFACE::D3D12_SetAsyncFrameMarker:
|
||||
if (o_NvAPI_D3D12_SetAsyncFrameMarker != nullptr)
|
||||
return &hNvAPI_D3D12_SetAsyncFrameMarker;
|
||||
break;
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// For updating information about Reflex hooks
|
||||
inline static void update(bool fgState) {
|
||||
// Not a perfect check, doesn't confirm that Reflex is actually currently enabled
|
||||
// This is intentional as fakenvapi might override what the game sends
|
||||
Config::Instance()->ReflexAvailable = _markersPresent;
|
||||
|
||||
static float lastFps = 0;
|
||||
float currentFps = Config::Instance()->FramerateLimit.value_or(0);
|
||||
|
||||
if (fgState)
|
||||
currentFps = currentFps / 2;
|
||||
|
||||
if (currentFps != lastFps) {
|
||||
setFPSLimit(currentFps);
|
||||
lastFps = currentFps;
|
||||
}
|
||||
}
|
||||
|
||||
// 0 - disables the fps cap
|
||||
inline static void setFPSLimit(float fps) {
|
||||
LOG_INFO("Set FPS Limit to: {}", fps);
|
||||
if (fps == 0.0)
|
||||
_minimumIntervalUs = 0;
|
||||
else
|
||||
_minimumIntervalUs = 1'000'000 / fps;
|
||||
|
||||
if (_lastSleepDev != nullptr) {
|
||||
NV_SET_SLEEP_MODE_PARAMS temp{};
|
||||
memcpy(&temp, &_lastSleepParams, sizeof(NV_SET_SLEEP_MODE_PARAMS));
|
||||
temp.minimumIntervalUs = _minimumIntervalUs;
|
||||
o_NvAPI_D3D_SetSleepMode(_lastSleepDev, &temp);
|
||||
}
|
||||
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,91 @@
|
||||
#pragma once
|
||||
|
||||
#include <proxies/FfxApi_Proxy.h>
|
||||
|
||||
#include <dxgi.h>
|
||||
|
||||
enum class FN_INTERFACE : uint32_t
|
||||
{
|
||||
Fake_InformFGState = 0x21382138,
|
||||
Fake_InformPresentFG = 0x21392139,
|
||||
Fake_GetAntiLagCtx = 0x21402140
|
||||
};
|
||||
|
||||
using PFN_Fake_InformFGState = uint32_t(__stdcall*)(bool fg_state);
|
||||
using PFN_Fake_InformPresentFG = uint32_t(__stdcall*)(bool frame_interpolated, uint64_t reflex_frame_id);
|
||||
using PFN_Fake_GetAntiLagCtx = uint32_t(__stdcall*)(void* al2_context);
|
||||
|
||||
class fakenvapi
|
||||
{
|
||||
private:
|
||||
inline static struct AntiLag2Data
|
||||
{
|
||||
void* context;
|
||||
bool enabled;
|
||||
} antilag2_data;
|
||||
|
||||
inline static PFN_Fake_InformFGState Fake_InformFGState = nullptr;
|
||||
inline static PFN_Fake_InformPresentFG Fake_InformPresentFG = nullptr;
|
||||
inline static PFN_Fake_GetAntiLagCtx Fake_GetAntiLagCtx = nullptr;
|
||||
|
||||
inline static bool _inited = false;
|
||||
public:
|
||||
typedef void* (__stdcall* PFN_Fake_QueryInterface)(FN_INTERFACE InterfaceId);
|
||||
|
||||
inline static const GUID IID_IFfxAntiLag2Data = { 0x5083ae5b, 0x8070, 0x4fca, {0x8e, 0xe5, 0x35, 0x82, 0xdd, 0x36, 0x7d, 0x13} };
|
||||
|
||||
inline static void Init(PFN_Fake_QueryInterface& queryInterface) {
|
||||
if (_inited) return;
|
||||
|
||||
LOG_INFO("Trying to get fakenvapi-specific functions");
|
||||
|
||||
Fake_InformFGState = static_cast<PFN_Fake_InformFGState>(queryInterface(FN_INTERFACE::Fake_InformFGState));
|
||||
Fake_InformPresentFG = static_cast<PFN_Fake_InformPresentFG>(queryInterface(FN_INTERFACE::Fake_InformPresentFG));
|
||||
Fake_GetAntiLagCtx = static_cast<PFN_Fake_GetAntiLagCtx>(queryInterface(FN_INTERFACE::Fake_GetAntiLagCtx));
|
||||
|
||||
if (Fake_InformFGState == nullptr)
|
||||
LOG_INFO("Couldn't get InformFGState");
|
||||
if (Fake_InformPresentFG == nullptr)
|
||||
LOG_INFO("Couldn't get InformPresentFG");
|
||||
if (Fake_GetAntiLagCtx == nullptr)
|
||||
LOG_INFO("Couldn't get GetAntiLagCtx");
|
||||
|
||||
_inited = true;
|
||||
}
|
||||
|
||||
// Inform AntiLag 2 when present of interpolated frames starts
|
||||
inline static void reportFGPresent(IDXGISwapChain* pSwapChain, bool fg_state, bool frame_interpolated) {
|
||||
if (Fake_InformFGState == nullptr || Fake_InformPresentFG == nullptr || Fake_GetAntiLagCtx == nullptr) return;
|
||||
|
||||
// Lets fakenvapi log and reset correctly
|
||||
Fake_InformFGState(fg_state);
|
||||
|
||||
if (fg_state) {
|
||||
// Starting with FSR 3.1.1 we can provide an AntiLag 2 context to FSR FG
|
||||
// and it will call SetFrameGenFrameType for us
|
||||
auto static ffxApiVersion = FfxApiProxy::VersionDx12();
|
||||
constexpr feature_version requiredVersion = { 3, 1, 1 };
|
||||
if (isVersionOrBetter(ffxApiVersion, requiredVersion)) {
|
||||
void* antilag2Context = nullptr;
|
||||
Fake_GetAntiLagCtx(&antilag2Context);
|
||||
|
||||
if (antilag2Context != nullptr) {
|
||||
antilag2_data.context = antilag2Context;
|
||||
antilag2_data.enabled = true;
|
||||
|
||||
pSwapChain->SetPrivateData(IID_IFfxAntiLag2Data, sizeof(antilag2_data), &antilag2_data);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Tell fakenvapi to call SetFrameGenFrameType by itself
|
||||
// Reflex frame id might get used in the future
|
||||
Fake_InformPresentFG(frame_interpolated, 0);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Remove it or other FG mods won't work with AL2
|
||||
pSwapChain->SetPrivateData(IID_IFfxAntiLag2Data, 0, nullptr);
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
#include "IFeature.h"
|
||||
|
||||
#include <menu/Imgui_Dx11.h>
|
||||
#include <menu/OldMenuDx11.h>
|
||||
#include <shaders/rcas/RCAS_Dx11.h>
|
||||
#include <shaders/output_scaling/OS_Dx11.h>
|
||||
#include <shaders/bias/Bias_Dx11.h>
|
||||
@@ -12,7 +12,7 @@ class IFeature_Dx11 : public virtual IFeature
|
||||
protected:
|
||||
ID3D11Device* Device = nullptr;
|
||||
ID3D11DeviceContext* DeviceContext = nullptr;
|
||||
inline static std::unique_ptr<Imgui_Dx11> Imgui = nullptr;
|
||||
inline static std::unique_ptr<OldMenuDx11> Imgui = nullptr;
|
||||
std::unique_ptr<OS_Dx11> OutputScaler = nullptr;
|
||||
std::unique_ptr<RCAS_Dx11> RCAS = nullptr;
|
||||
std::unique_ptr<Bias_Dx11> Bias = nullptr;
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
#include "IFeature_Dx11.h"
|
||||
|
||||
#include <menu/Imgui_Dx11.h>
|
||||
#include <menu/OldMenuDx11.h>
|
||||
#include <shaders/rcas/RCAS_Dx12.h>
|
||||
#include <shaders/bias/Bias_Dx12.h>
|
||||
#include <shaders/output_scaling/OS_Dx12.h>
|
||||
@@ -11,7 +11,6 @@
|
||||
#include <d3d11_4.h>
|
||||
#include <dxgi1_6.h>
|
||||
|
||||
|
||||
class IFeature_Dx11wDx12 : public virtual IFeature_Dx11
|
||||
{
|
||||
protected:
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#include "IFeature.h"
|
||||
|
||||
#include <Util.h>
|
||||
#include <menu/Imgui_Dx12.h>
|
||||
#include <menu/OldMenuDx12.h>
|
||||
#include <shaders/output_scaling/OS_Dx12.h>
|
||||
#include <shaders/rcas/RCAS_Dx12.h>
|
||||
#include <shaders/bias/Bias_Dx12.h>
|
||||
@@ -15,7 +15,7 @@ class IFeature_Dx12 : public virtual IFeature
|
||||
{
|
||||
protected:
|
||||
ID3D12Device* Device = nullptr;
|
||||
static inline std::unique_ptr<Imgui_Dx12> Imgui = nullptr;
|
||||
static inline std::unique_ptr<OldMenuDx12> Imgui = nullptr;
|
||||
std::unique_ptr<OS_Dx12> OutputScaler = nullptr;
|
||||
std::unique_ptr<RCAS_Dx12> RCAS = nullptr;
|
||||
std::unique_ptr<Bias_Dx12> Bias = nullptr;
|
||||
|
||||
@@ -68,7 +68,7 @@ bool DLSSFeatureDx11::Init(ID3D11Device* InDevice, ID3D11DeviceContext* InContex
|
||||
if (initResult)
|
||||
{
|
||||
if (!Config::Instance()->OverlayMenu.value_or(true) && (Imgui == nullptr || Imgui.get() == nullptr))
|
||||
Imgui = std::make_unique<Imgui_Dx11>(GetForegroundWindow(), InDevice);
|
||||
Imgui = std::make_unique<OldMenuDx11>(GetForegroundWindow(), InDevice);
|
||||
|
||||
OutputScaler = std::make_unique<OS_Dx11>("Output Scaling", InDevice, (TargetWidth() < DisplayWidth()));
|
||||
RCAS = std::make_unique<RCAS_Dx11>("RCAS", InDevice);
|
||||
@@ -209,7 +209,7 @@ bool DLSSFeatureDx11::Evaluate(ID3D11DeviceContext* InDeviceContext, NVSDK_NGX_P
|
||||
else
|
||||
{
|
||||
if (Imgui == nullptr || Imgui.get() == nullptr)
|
||||
Imgui = std::make_unique<Imgui_Dx11>(Util::GetProcessWindow(), Device);
|
||||
Imgui = std::make_unique<OldMenuDx11>(Util::GetProcessWindow(), Device);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -76,7 +76,7 @@ bool DLSSFeatureDx12::Init(ID3D12Device* InDevice, ID3D12GraphicsCommandList* In
|
||||
RCAS = std::make_unique<RCAS_Dx12>("RCAS", InDevice);
|
||||
|
||||
if (!Config::Instance()->OverlayMenu.value_or(true) && (Imgui == nullptr || Imgui.get() == nullptr))
|
||||
Imgui = std::make_unique<Imgui_Dx12>(Util::GetProcessWindow(), InDevice);
|
||||
Imgui = std::make_unique<OldMenuDx12>(Util::GetProcessWindow(), InDevice);
|
||||
|
||||
OutputScaler = std::make_unique<OS_Dx12>("OutputScaling", InDevice, (TargetWidth() < DisplayWidth()));
|
||||
}
|
||||
@@ -229,7 +229,7 @@ bool DLSSFeatureDx12::Evaluate(ID3D12GraphicsCommandList* InCommandList, NVSDK_N
|
||||
else
|
||||
{
|
||||
if (Imgui == nullptr || Imgui.get() == nullptr)
|
||||
Imgui = std::make_unique<Imgui_Dx12>(Util::GetProcessWindow(), Device);
|
||||
Imgui = std::make_unique<OldMenuDx12>(Util::GetProcessWindow(), Device);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ bool DLSSDFeatureDx11::Init(ID3D11Device* InDevice, ID3D11DeviceContext* InConte
|
||||
if (initResult)
|
||||
{
|
||||
if (!Config::Instance()->OverlayMenu.value_or(true) && (Imgui == nullptr || Imgui.get() == nullptr))
|
||||
Imgui = std::make_unique<Imgui_Dx11>(GetForegroundWindow(), InDevice);
|
||||
Imgui = std::make_unique<OldMenuDx11>(GetForegroundWindow(), InDevice);
|
||||
|
||||
OutputScaler = std::make_unique<OS_Dx11>("Output Scaling", InDevice, (TargetWidth() < DisplayWidth()));
|
||||
RCAS = std::make_unique<RCAS_Dx11>("RCAS", InDevice);
|
||||
@@ -213,7 +213,7 @@ bool DLSSDFeatureDx11::Evaluate(ID3D11DeviceContext* InDeviceContext, NVSDK_NGX_
|
||||
else
|
||||
{
|
||||
if (Imgui == nullptr || Imgui.get() == nullptr)
|
||||
Imgui = std::make_unique<Imgui_Dx11>(Util::GetProcessWindow(), Device);
|
||||
Imgui = std::make_unique<OldMenuDx11>(Util::GetProcessWindow(), Device);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -76,7 +76,7 @@ bool DLSSDFeatureDx12::Init(ID3D12Device* InDevice, ID3D12GraphicsCommandList* I
|
||||
RCAS = std::make_unique<RCAS_Dx12>("RCAS", InDevice);
|
||||
|
||||
if (!Config::Instance()->OverlayMenu.value_or(true) && (Imgui == nullptr || Imgui.get() == nullptr))
|
||||
Imgui = std::make_unique<Imgui_Dx12>(Util::GetProcessWindow(), InDevice);
|
||||
Imgui = std::make_unique<OldMenuDx12>(Util::GetProcessWindow(), InDevice);
|
||||
|
||||
OutputScaler = std::make_unique<OS_Dx12>("OutputScaling", InDevice, (TargetWidth() < DisplayWidth()));
|
||||
}
|
||||
@@ -231,7 +231,7 @@ bool DLSSDFeatureDx12::Evaluate(ID3D12GraphicsCommandList* InCommandList, NVSDK_
|
||||
else
|
||||
{
|
||||
if (Imgui == nullptr || Imgui.get() == nullptr)
|
||||
Imgui = std::make_unique<Imgui_Dx12>(Util::GetProcessWindow(), Device);
|
||||
Imgui = std::make_unique<OldMenuDx12>(Util::GetProcessWindow(), Device);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ bool FSR2FeatureDx11::Init(ID3D11Device* InDevice, ID3D11DeviceContext* InContex
|
||||
if (InitFSR2(InParameters))
|
||||
{
|
||||
if (!Config::Instance()->OverlayMenu.value_or(true) && (Imgui == nullptr || Imgui.get() == nullptr))
|
||||
Imgui = std::make_unique<Imgui_Dx11>(Util::GetProcessWindow(), Device);
|
||||
Imgui = std::make_unique<OldMenuDx11>(Util::GetProcessWindow(), Device);
|
||||
|
||||
OutputScaler = std::make_unique<OS_Dx11>("Output Scaling", InDevice, (TargetWidth() < DisplayWidth()));
|
||||
RCAS = std::make_unique<RCAS_Dx11>("RCAS", InDevice);
|
||||
@@ -604,7 +604,7 @@ bool FSR2FeatureDx11::Evaluate(ID3D11DeviceContext* InContext, NVSDK_NGX_Paramet
|
||||
else
|
||||
{
|
||||
if (Imgui == nullptr || Imgui.get() == nullptr)
|
||||
Imgui = std::make_unique<Imgui_Dx11>(GetForegroundWindow(), Device);
|
||||
Imgui = std::make_unique<OldMenuDx11>(GetForegroundWindow(), Device);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -103,7 +103,7 @@ bool FSR2FeatureDx11on12::Evaluate(ID3D11DeviceContext* InDeviceContext, NVSDK_N
|
||||
}
|
||||
|
||||
if (!Config::Instance()->OverlayMenu.value_or(true) && (Imgui == nullptr || Imgui.get() == nullptr))
|
||||
Imgui = std::make_unique<Imgui_Dx11>(GetForegroundWindow(), Device);
|
||||
Imgui = std::make_unique<OldMenuDx11>(GetForegroundWindow(), Device);
|
||||
|
||||
if (Config::Instance()->Dx11DelayedInit.value_or(false))
|
||||
{
|
||||
@@ -429,7 +429,7 @@ bool FSR2FeatureDx11on12::Evaluate(ID3D11DeviceContext* InDeviceContext, NVSDK_N
|
||||
else
|
||||
{
|
||||
if (Imgui == nullptr || Imgui.get() == nullptr)
|
||||
Imgui = std::make_unique<Imgui_Dx11>(GetForegroundWindow(), Device);
|
||||
Imgui = std::make_unique<OldMenuDx11>(GetForegroundWindow(), Device);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -474,7 +474,7 @@ bool FSR2FeatureDx11on12::Evaluate(ID3D11DeviceContext* InDeviceContext, NVSDK_N
|
||||
else
|
||||
{
|
||||
if (Imgui == nullptr || Imgui.get() == nullptr)
|
||||
Imgui = std::make_unique<Imgui_Dx11>(GetForegroundWindow(), Device);
|
||||
Imgui = std::make_unique<OldMenuDx11>(GetForegroundWindow(), Device);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ bool FSR2FeatureDx12::Init(ID3D12Device* InDevice, ID3D12GraphicsCommandList* In
|
||||
if (InitFSR2(InParameters))
|
||||
{
|
||||
if (!Config::Instance()->OverlayMenu.value_or(true) && (Imgui == nullptr || Imgui.get() == nullptr))
|
||||
Imgui = std::make_unique<Imgui_Dx12>(Util::GetProcessWindow(), InDevice);
|
||||
Imgui = std::make_unique<OldMenuDx12>(Util::GetProcessWindow(), InDevice);
|
||||
|
||||
OutputScaler = std::make_unique<OS_Dx12>("Output Scaling", InDevice, (TargetWidth() < DisplayWidth()));
|
||||
RCAS = std::make_unique<RCAS_Dx12>("RCAS", InDevice);
|
||||
@@ -394,7 +394,7 @@ bool FSR2FeatureDx12::Evaluate(ID3D12GraphicsCommandList* InCommandList, NVSDK_N
|
||||
else
|
||||
{
|
||||
if (Imgui == nullptr || Imgui.get() == nullptr)
|
||||
Imgui = std::make_unique<Imgui_Dx12>(GetForegroundWindow(), Device);
|
||||
Imgui = std::make_unique<OldMenuDx12>(GetForegroundWindow(), Device);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -106,7 +106,7 @@ bool FSR2FeatureDx11on12_212::Evaluate(ID3D11DeviceContext* InDeviceContext, NVS
|
||||
}
|
||||
|
||||
if (!Config::Instance()->OverlayMenu.value_or(true) && (Imgui == nullptr || Imgui.get() == nullptr))
|
||||
Imgui = std::make_unique<Imgui_Dx11>(GetForegroundWindow(), Device);
|
||||
Imgui = std::make_unique<OldMenuDx11>(GetForegroundWindow(), Device);
|
||||
|
||||
if (Config::Instance()->Dx11DelayedInit.value_or(false))
|
||||
{
|
||||
@@ -435,7 +435,7 @@ bool FSR2FeatureDx11on12_212::Evaluate(ID3D11DeviceContext* InDeviceContext, NVS
|
||||
else
|
||||
{
|
||||
if (Imgui == nullptr || Imgui.get() == nullptr)
|
||||
Imgui = std::make_unique<Imgui_Dx11>(GetForegroundWindow(), Device);
|
||||
Imgui = std::make_unique<OldMenuDx11>(GetForegroundWindow(), Device);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -480,7 +480,7 @@ bool FSR2FeatureDx11on12_212::Evaluate(ID3D11DeviceContext* InDeviceContext, NVS
|
||||
else
|
||||
{
|
||||
if (Imgui == nullptr || Imgui.get() == nullptr)
|
||||
Imgui = std::make_unique<Imgui_Dx11>(GetForegroundWindow(), Device);
|
||||
Imgui = std::make_unique<OldMenuDx11>(GetForegroundWindow(), Device);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ bool FSR2FeatureDx12_212::Init(ID3D12Device* InDevice, ID3D12GraphicsCommandList
|
||||
if (InitFSR2(InParameters))
|
||||
{
|
||||
if (!Config::Instance()->OverlayMenu.value_or(true) && (Imgui == nullptr || Imgui.get() == nullptr))
|
||||
Imgui = std::make_unique<Imgui_Dx12>(Util::GetProcessWindow(), InDevice);
|
||||
Imgui = std::make_unique<OldMenuDx12>(Util::GetProcessWindow(), InDevice);
|
||||
|
||||
OutputScaler = std::make_unique<OS_Dx12>("Output Scaling", InDevice, (TargetWidth() < DisplayWidth()));
|
||||
RCAS = std::make_unique<RCAS_Dx12>("RCAS", InDevice);
|
||||
@@ -401,7 +401,7 @@ bool FSR2FeatureDx12_212::Evaluate(ID3D12GraphicsCommandList* InCommandList, NVS
|
||||
else
|
||||
{
|
||||
if (Imgui == nullptr || Imgui.get() == nullptr)
|
||||
Imgui = std::make_unique<Imgui_Dx12>(GetForegroundWindow(), Device);
|
||||
Imgui = std::make_unique<OldMenuDx12>(GetForegroundWindow(), Device);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ bool FSR31FeatureDx11::Init(ID3D11Device* InDevice, ID3D11DeviceContext* InConte
|
||||
if (InitFSR3(InParameters))
|
||||
{
|
||||
if (!Config::Instance()->OverlayMenu.value_or(true) && (Imgui == nullptr || Imgui.get() == nullptr))
|
||||
Imgui = std::make_unique<Imgui_Dx11>(Util::GetProcessWindow(), Device);
|
||||
Imgui = std::make_unique<OldMenuDx11>(Util::GetProcessWindow(), Device);
|
||||
|
||||
OutputScaler = std::make_unique<OS_Dx11>("Output Scaling", InDevice, (TargetWidth() < DisplayWidth()));
|
||||
RCAS = std::make_unique<RCAS_Dx11>("RCAS", InDevice);
|
||||
@@ -484,7 +484,7 @@ bool FSR31FeatureDx11::Evaluate(ID3D11DeviceContext* DeviceContext, NVSDK_NGX_Pa
|
||||
else
|
||||
{
|
||||
if (Imgui == nullptr || Imgui.get() == nullptr)
|
||||
Imgui = std::make_unique<Imgui_Dx11>(GetForegroundWindow(), Device);
|
||||
Imgui = std::make_unique<OldMenuDx11>(GetForegroundWindow(), Device);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -118,7 +118,7 @@ bool FSR31FeatureDx11on12::Evaluate(ID3D11DeviceContext* InDeviceContext, NVSDK_
|
||||
}
|
||||
|
||||
if (!Config::Instance()->OverlayMenu.value_or(true) && (Imgui == nullptr || Imgui.get() == nullptr))
|
||||
Imgui = std::make_unique<Imgui_Dx11>(GetForegroundWindow(), Device);
|
||||
Imgui = std::make_unique<OldMenuDx11>(GetForegroundWindow(), Device);
|
||||
|
||||
if (Config::Instance()->Dx11DelayedInit.value_or(false))
|
||||
{
|
||||
@@ -464,7 +464,7 @@ bool FSR31FeatureDx11on12::Evaluate(ID3D11DeviceContext* InDeviceContext, NVSDK_
|
||||
else
|
||||
{
|
||||
if (Imgui == nullptr || Imgui.get() == nullptr)
|
||||
Imgui = std::make_unique<Imgui_Dx11>(GetForegroundWindow(), Device);
|
||||
Imgui = std::make_unique<OldMenuDx11>(GetForegroundWindow(), Device);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -509,7 +509,7 @@ bool FSR31FeatureDx11on12::Evaluate(ID3D11DeviceContext* InDeviceContext, NVSDK_
|
||||
else
|
||||
{
|
||||
if (Imgui == nullptr || Imgui.get() == nullptr)
|
||||
Imgui = std::make_unique<Imgui_Dx11>(GetForegroundWindow(), Device);
|
||||
Imgui = std::make_unique<OldMenuDx11>(GetForegroundWindow(), Device);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@ bool FSR31FeatureDx12::Init(ID3D12Device* InDevice, ID3D12GraphicsCommandList* I
|
||||
if (InitFSR3(InParameters))
|
||||
{
|
||||
if (!Config::Instance()->OverlayMenu.value_or(true) && (Imgui == nullptr || Imgui.get() == nullptr))
|
||||
Imgui = std::make_unique<Imgui_Dx12>(Util::GetProcessWindow(), InDevice);
|
||||
Imgui = std::make_unique<OldMenuDx12>(Util::GetProcessWindow(), InDevice);
|
||||
|
||||
OutputScaler = std::make_unique<OS_Dx12>("Output Scaling", InDevice, (TargetWidth() < DisplayWidth()));
|
||||
RCAS = std::make_unique<RCAS_Dx12>("RCAS", InDevice);
|
||||
@@ -436,7 +436,7 @@ bool FSR31FeatureDx12::Evaluate(ID3D12GraphicsCommandList* InCommandList, NVSDK_
|
||||
else
|
||||
{
|
||||
if (Imgui == nullptr || Imgui.get() == nullptr)
|
||||
Imgui = std::make_unique<Imgui_Dx12>(GetForegroundWindow(), Device);
|
||||
Imgui = std::make_unique<OldMenuDx12>(GetForegroundWindow(), Device);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -118,7 +118,7 @@ bool XeSSFeatureDx11::Evaluate(ID3D11DeviceContext* InDeviceContext, NVSDK_NGX_P
|
||||
if (!Config::Instance()->OverlayMenu.value_or(true) && (Imgui == nullptr || Imgui.get() == nullptr))
|
||||
{
|
||||
LOG_DEBUG("Create Imgui!");
|
||||
Imgui = std::make_unique<Imgui_Dx11>(GetForegroundWindow(), Device);
|
||||
Imgui = std::make_unique<OldMenuDx11>(GetForegroundWindow(), Device);
|
||||
}
|
||||
|
||||
if (Config::Instance()->Dx11DelayedInit.value_or(false))
|
||||
@@ -435,7 +435,7 @@ bool XeSSFeatureDx11::Evaluate(ID3D11DeviceContext* InDeviceContext, NVSDK_NGX_P
|
||||
else
|
||||
{
|
||||
if (Imgui == nullptr || Imgui.get() == nullptr)
|
||||
Imgui = std::make_unique<Imgui_Dx11>(GetForegroundWindow(), Device);
|
||||
Imgui = std::make_unique<OldMenuDx11>(GetForegroundWindow(), Device);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -480,7 +480,7 @@ bool XeSSFeatureDx11::Evaluate(ID3D11DeviceContext* InDeviceContext, NVSDK_NGX_P
|
||||
else
|
||||
{
|
||||
if (Imgui == nullptr || Imgui.get() == nullptr)
|
||||
Imgui = std::make_unique<Imgui_Dx11>(GetForegroundWindow(), Device);
|
||||
Imgui = std::make_unique<OldMenuDx11>(GetForegroundWindow(), Device);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ bool XeSSFeatureDx12::Init(ID3D12Device* InDevice, ID3D12GraphicsCommandList* In
|
||||
if (InitXeSS(InDevice, InParameters))
|
||||
{
|
||||
if (!Config::Instance()->OverlayMenu.value_or(true) && (Imgui == nullptr || Imgui.get() == nullptr))
|
||||
Imgui = std::make_unique<Imgui_Dx12>(Util::GetProcessWindow(), InDevice);
|
||||
Imgui = std::make_unique<OldMenuDx12>(Util::GetProcessWindow(), InDevice);
|
||||
|
||||
OutputScaler = std::make_unique<OS_Dx12>("Output Scaling", InDevice, (TargetWidth() < DisplayWidth()));
|
||||
RCAS = std::make_unique<RCAS_Dx12>("RCAS", InDevice);
|
||||
@@ -373,7 +373,7 @@ bool XeSSFeatureDx12::Evaluate(ID3D12GraphicsCommandList* InCommandList, NVSDK_N
|
||||
else
|
||||
{
|
||||
if (Imgui == nullptr || Imgui.get() == nullptr)
|
||||
Imgui = std::make_unique<Imgui_Dx12>(GetForegroundWindow(), Device);
|
||||
Imgui = std::make_unique<OldMenuDx12>(GetForegroundWindow(), Device);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user