diff --git a/OptiScaler/OptiScaler.vcxproj b/OptiScaler/OptiScaler.vcxproj index 79303c9a..261cb411 100644 --- a/OptiScaler/OptiScaler.vcxproj +++ b/OptiScaler/OptiScaler.vcxproj @@ -81,8 +81,8 @@ $(SolutionDir)external\vulkan\include;$(SolutionDir)external\nvngx_dlss_sdk;$(SolutionDir)external\xess\inc\xess;$(SolutionDir)external\FidelityFX-SDK\ffx-api\include\ffx_api;$(SolutionDir)external\simpleini;$(SolutionDir)external\unordered_dense\include;$(SolutionDir)external\spdlog\include;$(IncludePath) $(ProjectDir)fsr2\lib;$(ProjectDir)fsr2_212\lib;$(ProjectDir)vulkan;$(ProjectDir)d3dx;$(ProjectDir)detours;$(SolutionDir)external\xess\lib;$(LibraryPath) - nvngx - D:\Folders\Games\DOOM Eternal\ + dlss-enabler-upscaler + D:\Folders\Games\Banishers Ghosts of New Eden\NWD\Binaries\Win64\ .\x64\Debug diff --git a/OptiScaler/dllmain.cpp b/OptiScaler/dllmain.cpp index 540d8dab..f9debc1b 100644 --- a/OptiScaler/dllmain.cpp +++ b/OptiScaler/dllmain.cpp @@ -1462,10 +1462,10 @@ static void CheckWorkingMode() { AttachHooks(); - if (!isNvngxMode && !Config::Instance()->DisableEarlyHooking.value_or(false) && Config::Instance()->OverlayMenu.value_or(true)) + if ((!isNvngxMode || isWorkingWithEnabler) && !Config::Instance()->DisableEarlyHooking.value_or(false) && Config::Instance()->OverlayMenu.value_or(true)) { ImGuiOverlayDx12::Dx12Bind(); - ImGuiOverlayDx12::FSR3Bind(); + //ImGuiOverlayDx12::FSR3Bind(); } return; diff --git a/OptiScaler/imgui/imgui_overlay_base.h b/OptiScaler/imgui/imgui_overlay_base.h index 31f3fc59..2a84eb32 100644 --- a/OptiScaler/imgui/imgui_overlay_base.h +++ b/OptiScaler/imgui/imgui_overlay_base.h @@ -2,7 +2,9 @@ #include "../pch.h" -#include +#include +#include + // LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); diff --git a/OptiScaler/imgui/imgui_overlay_dx12.cpp b/OptiScaler/imgui/imgui_overlay_dx12.cpp index 42305ed6..421a897e 100644 --- a/OptiScaler/imgui/imgui_overlay_dx12.cpp +++ b/OptiScaler/imgui/imgui_overlay_dx12.cpp @@ -9,9 +9,6 @@ #include "ffx_framegeneration.h" #include "dx12/ffx_api_dx12.h" -#include -#include - #include "imgui/imgui_impl_dx12.h" #include "imgui/imgui_impl_win32.h" @@ -233,34 +230,38 @@ static bool IsActivePath(SwapchainSource source, bool justQuery = false) { case Dx12: // native need 2x more frames to be sure because of fg - result = (_nativeCounter > 170 || _nativeCounterEB > 170) && !IsActivePath(SL, true) && !IsActivePath(FSR3_Mod, true) && !IsActivePath(FSR3_Native, true) && _usingNative && _cqDx12 != nullptr; + result = (_nativeCounter > 170 || _nativeCounterEB > 170) && !IsActivePath(SL, true) && !IsActivePath(FSR3_Mod, true) && !IsActivePath(FSR3_Native, true) && _usingNative && g_pd3dCommandQueue != nullptr; + //result = (_nativeCounter > 170 || _nativeCounterEB > 170) && !IsActivePath(SL, true) && !IsActivePath(FSR3_Mod, true) && !IsActivePath(FSR3_Native, true) && _usingNative && _cqDx12 != nullptr; - if (result) - g_pd3dCommandQueue = _cqDx12; + //if (result) + // g_pd3dCommandQueue = _cqDx12; break; case SL: - result = _slCounter > 75 && !IsActivePath(FSR3_Native, true) && _usingDLSSG && _cqDx12 != nullptr; + result = _slCounter > 75 && !IsActivePath(FSR3_Native, true) && _usingDLSSG && g_pd3dCommandQueue != nullptr; + //result = _slCounter > 75 && !IsActivePath(FSR3_Native, true) && _usingDLSSG && _cqDx12 != nullptr; - if (result) - g_pd3dCommandQueue = _cqDx12; + //if (result) + // g_pd3dCommandQueue = _cqDx12; break; case FSR3_Mod: - result = _fsr3ModCounter > 65 && !IsActivePath(FSR3_Native, true) && _usingFSR3_Mod && _cqDx12 != nullptr; + result = _fsr3ModCounter > 65 && !IsActivePath(FSR3_Native, true) && _usingFSR3_Mod && g_pd3dCommandQueue != nullptr; + //result = _fsr3ModCounter > 65 && !IsActivePath(FSR3_Native, true) && _usingFSR3_Mod && _cqDx12 != nullptr; - if (result) - g_pd3dCommandQueue = _cqDx12; + //if (result) + // g_pd3dCommandQueue = _cqDx12; break; case FSR3_Native: - result = _fsr3NativeCounter > 30 && _usingFSR3_Native && _cqDx12 != nullptr; + result = _fsr3NativeCounter > 30 && _usingFSR3_Native && g_pd3dCommandQueue != nullptr; + //result = _fsr3NativeCounter > 30 && _usingFSR3_Native && _cqDx12 != nullptr; - if (result) - g_pd3dCommandQueue = _cqDx12; + //if (result) + // g_pd3dCommandQueue = _cqDx12; break; @@ -446,19 +447,20 @@ static HRESULT WINAPI hkPresent_EB(IDXGISwapChain3* pSwapChain, UINT SyncInterva if ((Flags & DXGI_PRESENT_TEST) || (Flags & DXGI_PRESENT_RESTART)) return S_OK; - if (IsActivePath(Dx12)) + //if (IsActivePath(Dx12)) + _lastActiveSource = Dx12; RenderImGui_DX12(pSwapChain); - if (IsBeingUsed(pSwapChain, Dx12)) - { - _nativeCounterEB++; - _usingNative = true; - } - else - { - _nativeCounterEB = 0; - _usingNative = false; - } + //if (IsBeingUsed(pSwapChain, Dx12)) + //{ + // _nativeCounterEB++; + // _usingNative = true; + //} + //else + //{ + // _nativeCounterEB = 0; + // _usingNative = false; + //} return S_OK; } @@ -468,19 +470,20 @@ static HRESULT WINAPI hkPresent1_EB(IDXGISwapChain3* pSwapChain, UINT SyncInterv if ((PresentFlags & DXGI_PRESENT_TEST) || (PresentFlags & DXGI_PRESENT_RESTART)) return S_OK; - if (IsActivePath(Dx12)) - RenderImGui_DX12(pSwapChain); + //if (IsActivePath(Dx12)) + _lastActiveSource = Dx12; + RenderImGui_DX12(pSwapChain); - if (IsBeingUsed(pSwapChain, Dx12)) - { - _nativeCounterEB++; - _usingNative = true; - } - else - { - _nativeCounterEB = 0; - _usingNative = false; - } + //if (IsBeingUsed(pSwapChain, Dx12)) + //{ + // _nativeCounterEB++; + // _usingNative = true; + //} + //else + //{ + // _nativeCounterEB = 0; + // _usingNative = false; + //} return S_OK; @@ -492,44 +495,44 @@ static HRESULT WINAPI hkPresent1_EB(IDXGISwapChain3* pSwapChain, UINT SyncInterv static HRESULT WINAPI hkPresent_Dx12(IDXGISwapChain3* pSwapChain, UINT SyncInterval, UINT Flags) { - if ((Flags & DXGI_PRESENT_TEST) || (Flags & DXGI_PRESENT_RESTART)) - return oPresent_Dx12(pSwapChain, SyncInterval, Flags); + //if ((Flags & DXGI_PRESENT_TEST) || (Flags & DXGI_PRESENT_RESTART)) + // return oPresent_Dx12(pSwapChain, SyncInterval, Flags); - if ((!_isEarlyBind || _nativeCounterEB == 0) && IsActivePath(Dx12)) - RenderImGui_DX12(pSwapChain); + //if ((!_isEarlyBind || _nativeCounterEB == 0) && IsActivePath(Dx12)) + // RenderImGui_DX12(pSwapChain); - if (IsBeingUsed(pSwapChain, Dx12)) - { - _nativeCounter++; - _usingNative = true; - } - else - { - _nativeCounter = 0; - _usingNative = false; - } + //if (IsBeingUsed(pSwapChain, Dx12)) + //{ + // _nativeCounter++; + // _usingNative = true; + //} + //else + //{ + // _nativeCounter = 0; + // _usingNative = false; + //} return oPresent_Dx12(pSwapChain, SyncInterval, Flags); } static HRESULT WINAPI hkPresent1_Dx12(IDXGISwapChain3* pSwapChain, UINT SyncInterval, UINT PresentFlags, const DXGI_PRESENT_PARAMETERS* pPresentParameters) { - if ((PresentFlags & DXGI_PRESENT_TEST) || (PresentFlags & DXGI_PRESENT_RESTART)) - return oPresent1_Dx12(pSwapChain, SyncInterval, PresentFlags, pPresentParameters); + //if ((PresentFlags & DXGI_PRESENT_TEST) || (PresentFlags & DXGI_PRESENT_RESTART)) + // return oPresent1_Dx12(pSwapChain, SyncInterval, PresentFlags, pPresentParameters); - if ((!_isEarlyBind || _nativeCounterEB == 0) && IsActivePath(Dx12)) - RenderImGui_DX12(pSwapChain); + //if ((!_isEarlyBind || _nativeCounterEB == 0) && IsActivePath(Dx12)) + // RenderImGui_DX12(pSwapChain); - if (IsBeingUsed(pSwapChain, Dx12)) - { - _nativeCounter++; - _usingNative = true; - } - else - { - _nativeCounter = 0; - _usingNative = false; - } + //if (IsBeingUsed(pSwapChain, Dx12)) + //{ + // _nativeCounter++; + // _usingNative = true; + //} + //else + //{ + // _nativeCounter = 0; + // _usingNative = false; + //} return oPresent1_Dx12(pSwapChain, SyncInterval, PresentFlags, pPresentParameters); } @@ -1089,7 +1092,7 @@ static void WINAPI hkExecuteCommandLists_SL(ID3D12CommandQueue* pCommandQueue, U #pragma region Hook for DXGIFactory for native DX12 -static HRESULT WINAPI hkCreateSwapChain_Dx12(IDXGIFactory* pFactory, IUnknown* pDevice, DXGI_SWAP_CHAIN_DESC* pDesc, IDXGISwapChain** ppSwapChain) +static HRESULT WINAPI hkCreateSwapChain_Dx12(IDXGIFactory* pCommandQueue, IUnknown* pDevice, DXGI_SWAP_CHAIN_DESC* pDesc, IDXGISwapChain** ppSwapChain) { if (_slBaseSwapChain != nullptr) { @@ -1098,11 +1101,11 @@ static HRESULT WINAPI hkCreateSwapChain_Dx12(IDXGIFactory* pFactory, IUnknown* p } CleanupRenderTarget(true); - auto result = oCreateSwapChain_Dx12(pFactory, pDevice, pDesc, ppSwapChain); + auto result = oCreateSwapChain_Dx12(pCommandQueue, pDevice, pDesc, ppSwapChain); return result; } -static HRESULT WINAPI hkCreateSwapChainForHwnd_Dx12(IDXGIFactory* pFactory, IUnknown* pDevice, HWND hWnd, const DXGI_SWAP_CHAIN_DESC1* pDesc, +static HRESULT WINAPI hkCreateSwapChainForHwnd_Dx12(IDXGIFactory* pCommandQueue, IUnknown* pDevice, HWND hWnd, const DXGI_SWAP_CHAIN_DESC1* pDesc, const DXGI_SWAP_CHAIN_FULLSCREEN_DESC* pFullscreenDesc, IDXGIOutput* pRestrictToOutput, IDXGISwapChain1** ppSwapChain) { if (_slBaseSwapChain != nullptr) @@ -1112,11 +1115,11 @@ static HRESULT WINAPI hkCreateSwapChainForHwnd_Dx12(IDXGIFactory* pFactory, IUnk } CleanupRenderTarget(true); - auto result = oCreateSwapChainForHwnd_Dx12(pFactory, pDevice, hWnd, pDesc, pFullscreenDesc, pRestrictToOutput, ppSwapChain); + auto result = oCreateSwapChainForHwnd_Dx12(pCommandQueue, pDevice, hWnd, pDesc, pFullscreenDesc, pRestrictToOutput, ppSwapChain); return result; } -static HRESULT WINAPI hkCreateSwapChainForCoreWindow_Dx12(IDXGIFactory* pFactory, IUnknown* pDevice, IUnknown* pWindow, const DXGI_SWAP_CHAIN_DESC1* pDesc, +static HRESULT WINAPI hkCreateSwapChainForCoreWindow_Dx12(IDXGIFactory* pCommandQueue, IUnknown* pDevice, IUnknown* pWindow, const DXGI_SWAP_CHAIN_DESC1* pDesc, IDXGIOutput* pRestrictToOutput, IDXGISwapChain1** ppSwapChain) { if (_slBaseSwapChain != nullptr) @@ -1126,11 +1129,11 @@ static HRESULT WINAPI hkCreateSwapChainForCoreWindow_Dx12(IDXGIFactory* pFactory } CleanupRenderTarget(true); - auto result = oCreateSwapChainForCoreWindow_Dx12(pFactory, pDevice, pWindow, pDesc, pRestrictToOutput, ppSwapChain); + auto result = oCreateSwapChainForCoreWindow_Dx12(pCommandQueue, pDevice, pWindow, pDesc, pRestrictToOutput, ppSwapChain); return result; } -static HRESULT WINAPI hkCreateSwapChainForComposition_Dx12(IDXGIFactory* pFactory, IUnknown* pDevice, const DXGI_SWAP_CHAIN_DESC1* pDesc, +static HRESULT WINAPI hkCreateSwapChainForComposition_Dx12(IDXGIFactory* pCommandQueue, IUnknown* pDevice, const DXGI_SWAP_CHAIN_DESC1* pDesc, IDXGIOutput* pRestrictToOutput, IDXGISwapChain1** ppSwapChain) { if (_slBaseSwapChain != nullptr) @@ -1140,7 +1143,7 @@ static HRESULT WINAPI hkCreateSwapChainForComposition_Dx12(IDXGIFactory* pFactor } CleanupRenderTarget(true); - auto result = oCreateSwapChainForComposition_Dx12(pFactory, pDevice, pDesc, pRestrictToOutput, ppSwapChain); + auto result = oCreateSwapChainForComposition_Dx12(pCommandQueue, pDevice, pDesc, pRestrictToOutput, ppSwapChain); return result; } @@ -1148,8 +1151,13 @@ static HRESULT WINAPI hkCreateSwapChainForComposition_Dx12(IDXGIFactory* pFactor #pragma region Hook for DXGIFactory for Early bindind -static HRESULT WINAPI hkCreateSwapChain_EB(IDXGIFactory* pFactory, IUnknown* pDevice, DXGI_SWAP_CHAIN_DESC* pDesc, IDXGISwapChain** ppSwapChain) +static HRESULT WINAPI hkCreateSwapChain_EB(IDXGIFactory* pCommandQueue, ID3D12CommandQueue* pDevice, DXGI_SWAP_CHAIN_DESC* pDesc, IDXGISwapChain** ppSwapChain) { + LOG_FUNC(); + + if (!_skipCleanup) + g_pd3dCommandQueue = pDevice; + if (_slBaseSwapChain != nullptr) { _slBaseSwapChain->Release(); @@ -1158,7 +1166,7 @@ static HRESULT WINAPI hkCreateSwapChain_EB(IDXGIFactory* pFactory, IUnknown* pDe CleanupRenderTarget(true); - auto result = oCreateSwapChain_EB(pFactory, pDevice, pDesc, ppSwapChain); + auto result = oCreateSwapChain_EB(pCommandQueue, pDevice, pDesc, ppSwapChain); if (result == S_OK && !_dx12BindingActive) { @@ -1169,9 +1177,14 @@ static HRESULT WINAPI hkCreateSwapChain_EB(IDXGIFactory* pFactory, IUnknown* pDe return result; } -static HRESULT WINAPI hkCreateSwapChainForHwnd_EB(IDXGIFactory* pFactory, IUnknown* pDevice, HWND hWnd, const DXGI_SWAP_CHAIN_DESC1* pDesc, +static HRESULT WINAPI hkCreateSwapChainForHwnd_EB(IDXGIFactory* pCommandQueue, ID3D12CommandQueue* pDevice, HWND hWnd, const DXGI_SWAP_CHAIN_DESC1* pDesc, const DXGI_SWAP_CHAIN_FULLSCREEN_DESC* pFullscreenDesc, IDXGIOutput* pRestrictToOutput, IDXGISwapChain1** ppSwapChain) { + LOG_FUNC(); + + if (!_skipCleanup) + g_pd3dCommandQueue = pDevice; + if (_slBaseSwapChain != nullptr) { _slBaseSwapChain->Release(); @@ -1180,7 +1193,7 @@ static HRESULT WINAPI hkCreateSwapChainForHwnd_EB(IDXGIFactory* pFactory, IUnkno CleanupRenderTarget(true); - auto result = oCreateSwapChainForHwnd_EB(pFactory, pDevice, hWnd, pDesc, pFullscreenDesc, pRestrictToOutput, ppSwapChain); + auto result = oCreateSwapChainForHwnd_EB(pCommandQueue, pDevice, hWnd, pDesc, pFullscreenDesc, pRestrictToOutput, ppSwapChain); if (result == S_OK && !_dx12BindingActive) { @@ -1191,9 +1204,14 @@ static HRESULT WINAPI hkCreateSwapChainForHwnd_EB(IDXGIFactory* pFactory, IUnkno return result; } -static HRESULT WINAPI hkCreateSwapChainForCoreWindow_EB(IDXGIFactory* pFactory, IUnknown* pDevice, IUnknown* pWindow, const DXGI_SWAP_CHAIN_DESC1* pDesc, +static HRESULT WINAPI hkCreateSwapChainForCoreWindow_EB(IDXGIFactory* pCommandQueue, ID3D12CommandQueue* pDevice, IUnknown* pWindow, const DXGI_SWAP_CHAIN_DESC1* pDesc, IDXGIOutput* pRestrictToOutput, IDXGISwapChain1** ppSwapChain) { + LOG_FUNC(); + + if (!_skipCleanup) + g_pd3dCommandQueue = pDevice; + if (_slBaseSwapChain != nullptr) { _slBaseSwapChain->Release(); @@ -1202,7 +1220,7 @@ static HRESULT WINAPI hkCreateSwapChainForCoreWindow_EB(IDXGIFactory* pFactory, CleanupRenderTarget(true); - auto result = oCreateSwapChainForCoreWindow_EB(pFactory, pDevice, pWindow, pDesc, pRestrictToOutput, ppSwapChain); + auto result = oCreateSwapChainForCoreWindow_EB(pCommandQueue, pDevice, pWindow, pDesc, pRestrictToOutput, ppSwapChain); if (result == S_OK && !_dx12BindingActive) { @@ -1213,9 +1231,14 @@ static HRESULT WINAPI hkCreateSwapChainForCoreWindow_EB(IDXGIFactory* pFactory, return result; } -static HRESULT WINAPI hkCreateSwapChainForComposition_EB(IDXGIFactory* pFactory, IUnknown* pDevice, const DXGI_SWAP_CHAIN_DESC1* pDesc, +static HRESULT WINAPI hkCreateSwapChainForComposition_EB(IDXGIFactory* pCommandQueue, ID3D12CommandQueue* pDevice, const DXGI_SWAP_CHAIN_DESC1* pDesc, IDXGIOutput* pRestrictToOutput, IDXGISwapChain1** ppSwapChain) { + LOG_FUNC(); + + if (!_skipCleanup) + g_pd3dCommandQueue = pDevice; + if (_slBaseSwapChain != nullptr) { _slBaseSwapChain->Release(); @@ -1224,7 +1247,7 @@ static HRESULT WINAPI hkCreateSwapChainForComposition_EB(IDXGIFactory* pFactory, CleanupRenderTarget(true); - auto result = oCreateSwapChainForComposition_EB(pFactory, pDevice, pDesc, pRestrictToOutput, ppSwapChain); + auto result = oCreateSwapChainForComposition_EB(pCommandQueue, pDevice, pDesc, pRestrictToOutput, ppSwapChain); if (result == S_OK && !_dx12BindingActive) { @@ -1239,7 +1262,7 @@ static HRESULT WINAPI hkCreateSwapChainForComposition_EB(IDXGIFactory* pFactory, #pragma region Hook for DXGIFactory for native StreamLine -static HRESULT WINAPI hkCreateSwapChain_SL(IDXGIFactory* pFactory, IUnknown* pDevice, DXGI_SWAP_CHAIN_DESC* pDesc, IDXGISwapChain** ppSwapChain) +static HRESULT WINAPI hkCreateSwapChain_SL(IDXGIFactory* pCommandQueue, ID3D12CommandQueue* pDevice, DXGI_SWAP_CHAIN_DESC* pDesc, IDXGISwapChain** ppSwapChain) { if (_slBaseSwapChain != nullptr) { @@ -1248,11 +1271,11 @@ static HRESULT WINAPI hkCreateSwapChain_SL(IDXGIFactory* pFactory, IUnknown* pDe } CleanupRenderTarget(true); - auto result = oCreateSwapChain_SL(pFactory, pDevice, pDesc, ppSwapChain); + auto result = oCreateSwapChain_SL(pCommandQueue, pDevice, pDesc, ppSwapChain); return result; } -static HRESULT WINAPI hkCreateSwapChainForHwnd_SL(IDXGIFactory* pFactory, IUnknown* pDevice, HWND hWnd, const DXGI_SWAP_CHAIN_DESC1* pDesc, +static HRESULT WINAPI hkCreateSwapChainForHwnd_SL(IDXGIFactory* pCommandQueue, IUnknown* pDevice, HWND hWnd, const DXGI_SWAP_CHAIN_DESC1* pDesc, const DXGI_SWAP_CHAIN_FULLSCREEN_DESC* pFullscreenDesc, IDXGIOutput* pRestrictToOutput, IDXGISwapChain1** ppSwapChain) { if (_slBaseSwapChain != nullptr) @@ -1262,11 +1285,11 @@ static HRESULT WINAPI hkCreateSwapChainForHwnd_SL(IDXGIFactory* pFactory, IUnkno } CleanupRenderTarget(true); - auto result = oCreateSwapChainForHwnd_SL(pFactory, pDevice, hWnd, pDesc, pFullscreenDesc, pRestrictToOutput, ppSwapChain); + auto result = oCreateSwapChainForHwnd_SL(pCommandQueue, pDevice, hWnd, pDesc, pFullscreenDesc, pRestrictToOutput, ppSwapChain); return result; } -static HRESULT WINAPI hkCreateSwapChainForCoreWindow_SL(IDXGIFactory* pFactory, IUnknown* pDevice, IUnknown* pWindow, const DXGI_SWAP_CHAIN_DESC1* pDesc, +static HRESULT WINAPI hkCreateSwapChainForCoreWindow_SL(IDXGIFactory* pCommandQueue, IUnknown* pDevice, IUnknown* pWindow, const DXGI_SWAP_CHAIN_DESC1* pDesc, IDXGIOutput* pRestrictToOutput, IDXGISwapChain1** ppSwapChain) { if (_slBaseSwapChain != nullptr) @@ -1276,11 +1299,11 @@ static HRESULT WINAPI hkCreateSwapChainForCoreWindow_SL(IDXGIFactory* pFactory, } CleanupRenderTarget(true); - auto result = oCreateSwapChainForCoreWindow_SL(pFactory, pDevice, pWindow, pDesc, pRestrictToOutput, ppSwapChain); + auto result = oCreateSwapChainForCoreWindow_SL(pCommandQueue, pDevice, pWindow, pDesc, pRestrictToOutput, ppSwapChain); return result; } -static HRESULT WINAPI hkCreateSwapChainForComposition_SL(IDXGIFactory* pFactory, IUnknown* pDevice, const DXGI_SWAP_CHAIN_DESC1* pDesc, +static HRESULT WINAPI hkCreateSwapChainForComposition_SL(IDXGIFactory* pCommandQueue, IUnknown* pDevice, const DXGI_SWAP_CHAIN_DESC1* pDesc, IDXGIOutput* pRestrictToOutput, IDXGISwapChain1** ppSwapChain) { if (_slBaseSwapChain != nullptr) @@ -1290,7 +1313,7 @@ static HRESULT WINAPI hkCreateSwapChainForComposition_SL(IDXGIFactory* pFactory, } CleanupRenderTarget(true); - auto result = oCreateSwapChainForComposition_SL(pFactory, pDevice, pDesc, pRestrictToOutput, ppSwapChain);; + auto result = oCreateSwapChainForComposition_SL(pCommandQueue, pDevice, pDesc, pRestrictToOutput, ppSwapChain);; return result; } @@ -1323,27 +1346,27 @@ static HRESULT WINAPI hkCreateCommandQueue(ID3D12Device* This, const D3D12_COMMA if (result == S_OK && oExecuteCommandLists_Dx12 == nullptr && pDesc->Type == D3D12_COMMAND_LIST_TYPE_DIRECT) { - auto cq = (ID3D12CommandQueue*)*ppCommandQueue; + //auto cq = (ID3D12CommandQueue*)*ppCommandQueue; - void** pCommandQueueVTable = *reinterpret_cast(cq); + //void** pCommandQueueVTable = *reinterpret_cast(cq); - oCommandQueueRelease = (PFN_Release)pCommandQueueVTable[2]; - oExecuteCommandLists_Dx12 = (PFN_ExecuteCommandLists)pCommandQueueVTable[10]; + //oCommandQueueRelease = (PFN_Release)pCommandQueueVTable[2]; + //oExecuteCommandLists_Dx12 = (PFN_ExecuteCommandLists)pCommandQueueVTable[10]; - if (oExecuteCommandLists_Dx12 != nullptr) - { - LOG_INFO("hooking CommandQueue"); + //if (oExecuteCommandLists_Dx12 != nullptr) + //{ + // LOG_INFO("hooking CommandQueue"); - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); + // DetourTransactionBegin(); + // DetourUpdateThread(GetCurrentThread()); - DetourAttach(&(PVOID&)oExecuteCommandLists_Dx12, hkExecuteCommandLists_Dx12); - DetourAttach(&(PVOID&)oCommandQueueRelease, hkCommandQueueRelease); + // DetourAttach(&(PVOID&)oCommandQueueRelease, hkCommandQueueRelease); + // DetourAttach(&(PVOID&)oExecuteCommandLists_Dx12, hkExecuteCommandLists_Dx12); - DetourTransactionCommit(); - } + // DetourTransactionCommit(); + //} - cq = nullptr; + //cq = nullptr; } return result; @@ -1388,7 +1411,6 @@ static HRESULT WINAPI hkCreateDXGIFactory(REFIID riid, void** ppFactory) { auto factory = (IDXGIFactory*)*ppFactory; - void** pFactoryVTable = *reinterpret_cast(factory); oCreateSwapChain_EB = (PFN_CreateSwapChain)pFactoryVTable[10]; @@ -1535,36 +1557,36 @@ static bool CheckDx12(ID3D12Device* InDevice) } // Create queue - ID3D12CommandQueue* cq = nullptr; - D3D12_COMMAND_QUEUE_DESC desc = { }; - result = device->CreateCommandQueue(&desc, IID_PPV_ARGS(&cq)); - if (result != S_OK) - { - LOG_ERROR("CreateCommandQueue: {0:X}", (UINT)result); - return false; - } + //ID3D12CommandQueue* cq = nullptr; + //D3D12_COMMAND_QUEUE_DESC desc = { }; + //result = device->CreateCommandQueue(&desc, IID_PPV_ARGS(&cq)); + //if (result != S_OK) + //{ + // LOG_ERROR("CreateCommandQueue: {0:X}", (UINT)result); + // return false; + //} - if (cq != nullptr) - { - void** pCommandQueueVTable = *reinterpret_cast(cq); + //if (cq != nullptr) + //{ + // void** pCommandQueueVTable = *reinterpret_cast(cq); - oExecuteCommandLists_Dx12 = (PFN_ExecuteCommandLists)pCommandQueueVTable[10]; + // oExecuteCommandLists_Dx12 = (PFN_ExecuteCommandLists)pCommandQueueVTable[10]; - if (oExecuteCommandLists_Dx12 != nullptr) - { - LOG_INFO("hooking CommandQueue"); + // if (oExecuteCommandLists_Dx12 != nullptr) + // { + // LOG_INFO("hooking CommandQueue"); - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); + // DetourTransactionBegin(); + // DetourUpdateThread(GetCurrentThread()); - DetourAttach(&(PVOID&)oExecuteCommandLists_Dx12, hkExecuteCommandLists_Dx12); + // DetourAttach(&(PVOID&)oExecuteCommandLists_Dx12, hkExecuteCommandLists_Dx12); - DetourTransactionCommit(); - } + // DetourTransactionCommit(); + // } - cq->Release(); - cq = nullptr; - } + // cq->Release(); + // cq = nullptr; + //} if (device != InDevice && device != nullptr) { @@ -1672,14 +1694,16 @@ static bool BindAll(HWND InHWnd, ID3D12Device* InDevice) { LOG_INFO("Handle: {0:X}", (ULONG64)InHWnd); + return true; + HRESULT result; _skipCleanup = true; do { - if (!CheckDx12(InDevice)) - break; + //if (!CheckDx12(InDevice)) + // break; // Check for Uniscaler, Nukem's & FSR3 Native CheckFSR3(); @@ -1687,163 +1711,163 @@ static bool BindAll(HWND InHWnd, ID3D12Device* InDevice) // Uniscaler captures and uses latest swapchain // Avoid creating and hooking swapchains to prevent crashes // If EarlyBind no need to bind again - if (oPresent_Dx12 == nullptr && Config::Instance()->HookD3D12.value_or(true)) - { - ID3D12Device* device = InDevice; + //if (oPresent_Dx12 == nullptr && Config::Instance()->HookD3D12.value_or(true)) + //{ + // ID3D12Device* device = InDevice; - if (device == nullptr) - { - D3D_FEATURE_LEVEL featureLevel = D3D_FEATURE_LEVEL_11_0; + // if (device == nullptr) + // { + // D3D_FEATURE_LEVEL featureLevel = D3D_FEATURE_LEVEL_11_0; - if (oD3D12CreateDevice == nullptr) - result = D3D12CreateDevice(NULL, featureLevel, IID_PPV_ARGS(&device)); - else - result = oD3D12CreateDevice(NULL, featureLevel, IID_PPV_ARGS(&device)); + // if (oD3D12CreateDevice == nullptr) + // result = D3D12CreateDevice(NULL, featureLevel, IID_PPV_ARGS(&device)); + // else + // result = oD3D12CreateDevice(NULL, featureLevel, IID_PPV_ARGS(&device)); - if (result != S_OK) - { - LOG_ERROR("Dx12 D3D12CreateDevice: {0:X}", (unsigned long)result); - break; - } - } + // if (result != S_OK) + // { + // LOG_ERROR("Dx12 D3D12CreateDevice: {0:X}", (unsigned long)result); + // break; + // } + // } - // Create queue - ID3D12CommandQueue* cq = nullptr; + // // Create queue + // ID3D12CommandQueue* cq = nullptr; - D3D12_COMMAND_QUEUE_DESC desc = { }; - result = device->CreateCommandQueue(&desc, IID_PPV_ARGS(&cq)); - if (result != S_OK) - { - LOG_ERROR("Dx12 CreateCommandQueue2: {0:X}", (unsigned long)result); - break; - } + // D3D12_COMMAND_QUEUE_DESC desc = { }; + // result = device->CreateCommandQueue(&desc, IID_PPV_ARGS(&cq)); + // if (result != S_OK) + // { + // LOG_ERROR("Dx12 CreateCommandQueue2: {0:X}", (unsigned long)result); + // break; + // } - IDXGIFactory4* factory = nullptr; - IDXGISwapChain1* swapChain1 = nullptr; - IDXGISwapChain3* swapChain3 = nullptr; + // IDXGIFactory4* factory = nullptr; + // IDXGISwapChain1* swapChain1 = nullptr; + // IDXGISwapChain3* swapChain3 = nullptr; - LOG_INFO("Dx12 Creating DXGIFactory for hooking"); - result = CreateDXGIFactory1(IID_PPV_ARGS(&factory)); + // LOG_INFO("Dx12 Creating DXGIFactory for hooking"); + // result = CreateDXGIFactory1(IID_PPV_ARGS(&factory)); - if (result != S_OK) - { - LOG_ERROR("Dx12 CreateDXGIFactory1: {0:X}", (unsigned long)result); - break; - } + // if (result != S_OK) + // { + // LOG_ERROR("Dx12 CreateDXGIFactory1: {0:X}", (unsigned long)result); + // break; + // } - if (!_isEarlyBind && oCreateSwapChain_Dx12 == nullptr) - { - void** pFactoryVTable = *reinterpret_cast(factory); + // if (!_isEarlyBind && oCreateSwapChain_Dx12 == nullptr) + // { + // void** pFactoryVTable = *reinterpret_cast(factory); - oCreateSwapChain_Dx12 = (PFN_CreateSwapChain)pFactoryVTable[10]; - oCreateSwapChainForHwnd_Dx12 = (PFN_CreateSwapChainForHwnd)pFactoryVTable[15]; - oCreateSwapChainForCoreWindow_Dx12 = (PFN_CreateSwapChainForCoreWindow)pFactoryVTable[16]; - oCreateSwapChainForComposition_Dx12 = (PFN_CreateSwapChainForComposition)pFactoryVTable[24]; + // oCreateSwapChain_Dx12 = (PFN_CreateSwapChain)pFactoryVTable[10]; + // oCreateSwapChainForHwnd_Dx12 = (PFN_CreateSwapChainForHwnd)pFactoryVTable[15]; + // oCreateSwapChainForCoreWindow_Dx12 = (PFN_CreateSwapChainForCoreWindow)pFactoryVTable[16]; + // oCreateSwapChainForComposition_Dx12 = (PFN_CreateSwapChainForComposition)pFactoryVTable[24]; - if (oCreateSwapChain_Dx12 != nullptr) - { - LOG_INFO("Hooking native DXGIFactory"); + // if (oCreateSwapChain_Dx12 != nullptr) + // { + // LOG_INFO("Hooking native DXGIFactory"); - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); + // DetourTransactionBegin(); + // DetourUpdateThread(GetCurrentThread()); - DetourAttach(&(PVOID&)oCreateSwapChain_Dx12, hkCreateSwapChain_Dx12); - DetourAttach(&(PVOID&)oCreateSwapChainForHwnd_Dx12, hkCreateSwapChainForHwnd_Dx12); - DetourAttach(&(PVOID&)oCreateSwapChainForCoreWindow_Dx12, hkCreateSwapChainForCoreWindow_Dx12); - DetourAttach(&(PVOID&)oCreateSwapChainForComposition_Dx12, hkCreateSwapChainForComposition_Dx12); - DetourTransactionCommit(); - } - } + // DetourAttach(&(PVOID&)oCreateSwapChain_Dx12, hkCreateSwapChain_Dx12); + // DetourAttach(&(PVOID&)oCreateSwapChainForHwnd_Dx12, hkCreateSwapChainForHwnd_Dx12); + // DetourAttach(&(PVOID&)oCreateSwapChainForCoreWindow_Dx12, hkCreateSwapChainForCoreWindow_Dx12); + // DetourAttach(&(PVOID&)oCreateSwapChainForComposition_Dx12, hkCreateSwapChainForComposition_Dx12); + // DetourTransactionCommit(); + // } + // } - // Hook DXGI Factory - if (!_bindedFSR3_Uniscaler && factory != nullptr && cq != nullptr && oPresent_Dx12 == nullptr) - { - // Setup swap chain - DXGI_SWAP_CHAIN_DESC1 sd = { }; - sd.BufferCount = 2; - sd.Format = DXGI_FORMAT_R8G8B8A8_UNORM; - sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; - sd.SampleDesc.Count = 1; - sd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; + // // Hook DXGI Factory + // if (!_bindedFSR3_Uniscaler && factory != nullptr && cq != nullptr && oPresent_Dx12 == nullptr) + // { + // // Setup swap chain + // DXGI_SWAP_CHAIN_DESC1 sd = { }; + // sd.BufferCount = 2; + // sd.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + // sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + // sd.SampleDesc.Count = 1; + // sd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; - // Create SwapChain - if (_isEarlyBind) - result = factory->CreateSwapChainForHwnd(cq, InHWnd, &sd, NULL, NULL, &swapChain1); - else - result = oCreateSwapChainForHwnd_Dx12(factory, cq, InHWnd, &sd, NULL, NULL, &swapChain1); + // // Create SwapChain + // if (_isEarlyBind) + // result = factory->CreateSwapChainForHwnd(cq, InHWnd, &sd, NULL, NULL, &swapChain1); + // else + // result = oCreateSwapChainForHwnd_Dx12(factory, cq, InHWnd, &sd, NULL, NULL, &swapChain1); - if (result != S_OK) - { - LOG_ERROR("Dx12 CreateSwapChainForHwnd: {0:X}", (unsigned long)result); - break; - } + // if (result != S_OK) + // { + // LOG_ERROR("Dx12 CreateSwapChainForHwnd: {0:X}", (unsigned long)result); + // break; + // } - result = swapChain1->QueryInterface(IID_PPV_ARGS(&swapChain3)); - if (result != S_OK) - { - LOG_ERROR("Dx12 QueryInterface: {0:X}", (unsigned long)result); - break; - } - } + // result = swapChain1->QueryInterface(IID_PPV_ARGS(&swapChain3)); + // if (result != S_OK) + // { + // LOG_ERROR("Dx12 QueryInterface: {0:X}", (unsigned long)result); + // break; + // } + // } - if (swapChain3 != nullptr && oPresent_Dx12 == nullptr) - { - void** pVTable = *reinterpret_cast(swapChain3); + // if (swapChain3 != nullptr && oPresent_Dx12 == nullptr) + // { + // void** pVTable = *reinterpret_cast(swapChain3); - oPresent_Dx12 = (PFN_Present)pVTable[8]; - oPresent1_Dx12 = (PFN_Present1)pVTable[22]; + // oPresent_Dx12 = (PFN_Present)pVTable[8]; + // oPresent1_Dx12 = (PFN_Present1)pVTable[22]; - oResizeBuffers_Dx12 = (PFN_ResizeBuffers)pVTable[13]; - oResizeBuffers1_Dx12 = (PFN_ResizeBuffers1)pVTable[39]; + // oResizeBuffers_Dx12 = (PFN_ResizeBuffers)pVTable[13]; + // oResizeBuffers1_Dx12 = (PFN_ResizeBuffers1)pVTable[39]; - if (oPresent_Dx12 != nullptr) - { - LOG_INFO("Dx12 Hooking native SwapChain"); + // if (oPresent_Dx12 != nullptr) + // { + // LOG_INFO("Dx12 Hooking native SwapChain"); - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); + // DetourTransactionBegin(); + // DetourUpdateThread(GetCurrentThread()); - DetourAttach(&(PVOID&)oPresent_Dx12, hkPresent_Dx12); - DetourAttach(&(PVOID&)oPresent1_Dx12, hkPresent1_Dx12); - DetourAttach(&(PVOID&)oResizeBuffers_Dx12, hkResizeBuffers_Dx12); - DetourAttach(&(PVOID&)oResizeBuffers1_Dx12, hkResizeBuffers1_Dx12); + // DetourAttach(&(PVOID&)oPresent_Dx12, hkPresent_Dx12); + // DetourAttach(&(PVOID&)oPresent1_Dx12, hkPresent1_Dx12); + // DetourAttach(&(PVOID&)oResizeBuffers_Dx12, hkResizeBuffers_Dx12); + // DetourAttach(&(PVOID&)oResizeBuffers1_Dx12, hkResizeBuffers1_Dx12); - DetourTransactionCommit(); - } - } + // DetourTransactionCommit(); + // } + // } - if (swapChain3 != nullptr) - { - swapChain3->Release(); - swapChain3 = nullptr; - } + // if (swapChain3 != nullptr) + // { + // swapChain3->Release(); + // swapChain3 = nullptr; + // } - if (swapChain1 != nullptr) - { - swapChain1->Release(); - swapChain1 = nullptr; - } + // if (swapChain1 != nullptr) + // { + // swapChain1->Release(); + // swapChain1 = nullptr; + // } - if (factory != nullptr) - { - factory->Release(); - factory = nullptr; - } + // if (factory != nullptr) + // { + // factory->Release(); + // factory = nullptr; + // } - if (cq != nullptr) - { - cq->Release(); - cq = nullptr; - } + // if (cq != nullptr) + // { + // cq->Release(); + // cq = nullptr; + // } - if (device != nullptr) - { - device->Release(); - device = nullptr; - } + // if (device != nullptr) + // { + // device->Release(); + // device = nullptr; + // } - } + //} // If not using uniscaler, attaching to sl is needed // Try to create SL DXGIFactory @@ -2337,7 +2361,7 @@ static void RenderImGui_DX12(IDXGISwapChain3* pSwapChain) } // If everything is ready render the frame - if (ImGui::GetCurrentContext() && g_pd3dCommandQueue && g_mainRenderTargetResource[0]) + if (ImGui::GetCurrentContext() && g_mainRenderTargetResource[0]) { _showRenderImGuiDebugOnce = true;