From 6e5b24cf1059fd080a640a57b4cfc5b84ab8a2bf Mon Sep 17 00:00:00 2001 From: FakeMichau <49685661+FakeMichau@users.noreply.github.com> Date: Sat, 16 May 2026 01:19:06 +0200 Subject: [PATCH] Remove separate vk hooks for fakenvapi --- OptiScaler/OptiScaler.vcxproj | 2 - OptiScaler/OptiScaler.vcxproj.filters | 6 -- OptiScaler/State.h | 1 + OptiScaler/hooks/Vulkan_Hooks.cpp | 44 +++++++++ OptiScaler/hooks/Vulkan_Hooks.h | 4 + OptiScaler/low_latency/ll_vulkan_hooks.cpp | 90 ------------------- OptiScaler/low_latency/ll_vulkan_hooks.h | 22 ----- .../low_latency_tech/ll_antilag_vk.cpp | 12 +-- OptiScaler/nvapi/fakenvapi.cpp | 25 ------ OptiScaler/nvapi/fakenvapi/nvapi_calls.cpp | 9 +- OptiScaler/nvapi/fakenvapi/nvapi_calls.h | 1 - OptiScaler/spoofing/Vulkan_Spoofing.cpp | 6 ++ 12 files changed, 66 insertions(+), 156 deletions(-) delete mode 100644 OptiScaler/low_latency/ll_vulkan_hooks.cpp delete mode 100644 OptiScaler/low_latency/ll_vulkan_hooks.h diff --git a/OptiScaler/OptiScaler.vcxproj b/OptiScaler/OptiScaler.vcxproj index e65ba061..5cec7850 100644 --- a/OptiScaler/OptiScaler.vcxproj +++ b/OptiScaler/OptiScaler.vcxproj @@ -338,7 +338,6 @@ copy NUL "$(SolutionDir)x64\Release\a\!! EXTRACT ALL FILES TO GAME FOLDER !!" /Y - @@ -592,7 +591,6 @@ copy NUL "$(SolutionDir)x64\Release\a\!! EXTRACT ALL FILES TO GAME FOLDER !!" /Y - diff --git a/OptiScaler/OptiScaler.vcxproj.filters b/OptiScaler/OptiScaler.vcxproj.filters index a5083b38..580c736a 100644 --- a/OptiScaler/OptiScaler.vcxproj.filters +++ b/OptiScaler/OptiScaler.vcxproj.filters @@ -776,9 +776,6 @@ Header Files - - Header Files - Header Files @@ -1280,9 +1277,6 @@ Source Files - - Source Files - Source Files diff --git a/OptiScaler/State.h b/OptiScaler/State.h index cf663bce..91ac95b5 100644 --- a/OptiScaler/State.h +++ b/OptiScaler/State.h @@ -172,6 +172,7 @@ class State bool usingUeLL = false; UINT64 reflexFrameId = 0; UINT64 frameCount = 0; + bool vkAntiLagSupported = false; // for realtime changes ankerl::unordered_dense::map changeBackend; diff --git a/OptiScaler/hooks/Vulkan_Hooks.cpp b/OptiScaler/hooks/Vulkan_Hooks.cpp index d6b0be20..6f970d99 100644 --- a/OptiScaler/hooks/Vulkan_Hooks.cpp +++ b/OptiScaler/hooks/Vulkan_Hooks.cpp @@ -38,6 +38,12 @@ PFN_vkCreateSwapchainKHR o_CreateSwapchainKHR = nullptr; static PFN_vkGetInstanceProcAddr o_vkGetInstanceProcAddr = nullptr; static PFN_vkGetDeviceProcAddr o_vkGetDeviceProcAddr = nullptr; +// Those aren't hooked, just grabbed for use +static PFN_vkGetPhysicalDeviceFeatures2 o_vkGetPhysicalDeviceFeatures2 = nullptr; +PFN_vkCreateSemaphore VulkanHooks::o_vkCreateSemaphore = nullptr; +PFN_vkSignalSemaphore VulkanHooks::o_vkSignalSemaphore = nullptr; +PFN_vkAntiLagUpdateAMD VulkanHooks::o_vkAntiLagUpdateAMD = nullptr; + // Forward declaration static VkResult hkvkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR* pPresentInfo); static VkResult hkvkCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, @@ -146,6 +152,21 @@ static VkResult hkvkCreateDevice(VkPhysicalDevice physicalDevice, const VkDevice VkDeviceCreateInfo localCreteInfo {}; memcpy(&localCreteInfo, pCreateInfo, sizeof(VkDeviceCreateInfo)); + // Check support for AntiLag before spoof + VkPhysicalDeviceFeatures2 features2 = {}; + features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; + + VkPhysicalDeviceAntiLagFeaturesAMD antiLagFeatures = {}; + antiLagFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ANTI_LAG_FEATURES_AMD; + + features2.pNext = &antiLagFeatures; + + if (o_vkGetPhysicalDeviceFeatures2) + { + o_vkGetPhysicalDeviceFeatures2(physicalDevice, &features2); + State::Instance().vkAntiLagSupported = antiLagFeatures.antiLag != 0; + } + VulkanSpoofing::hkvkCreateDevice(physicalDevice, &localCreteInfo, pAllocator, pDevice); auto result = o_vkCreateDevice(physicalDevice, &localCreteInfo, pAllocator, pDevice); @@ -184,6 +205,20 @@ static VkResult hkvkCreateDevice(VkPhysicalDevice physicalDevice, const VkDevice } } + if (State::Instance().vkAntiLagSupported) + { + if (result == VK_SUCCESS && o_vkGetDeviceProcAddr) + { + VulkanHooks::o_vkAntiLagUpdateAMD = + (PFN_vkAntiLagUpdateAMD) o_vkGetDeviceProcAddr(*pDevice, "vkAntiLagUpdateAMD"); + } + else + { + State::Instance().vkAntiLagSupported = false; + LOG_WARN("Vulkan AntiLag can't be enabled"); + } + } + #ifdef USE_QUEUE_SUBMIT_2_KHR if (result == VK_SUCCESS) hkvkGetDeviceProcAddr(*pDevice, "vkQueueSubmit2KHR"); @@ -364,6 +399,15 @@ void VulkanHooks::Hook(HMODULE vulkan1) // address = KernelBaseProxy::GetProcAddress_()(vulkan1, "vkCmdPipelineBarrier"); // o_vkCmdPipelineBarrier = (PFN_vkCmdPipelineBarrier) address; + address = KernelBaseProxy::GetProcAddress_()(vulkan1, "vkGetPhysicalDeviceFeatures2"); + o_vkGetPhysicalDeviceFeatures2 = (PFN_vkGetPhysicalDeviceFeatures2) address; + + address = KernelBaseProxy::GetProcAddress_()(vulkan1, "vkCreateSemaphore"); + o_vkCreateSemaphore = (PFN_vkCreateSemaphore) address; + + address = KernelBaseProxy::GetProcAddress_()(vulkan1, "vkSignalSemaphore"); + o_vkSignalSemaphore = (PFN_vkSignalSemaphore) address; + DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); diff --git a/OptiScaler/hooks/Vulkan_Hooks.h b/OptiScaler/hooks/Vulkan_Hooks.h index 2a30a120..a05a6fcd 100644 --- a/OptiScaler/hooks/Vulkan_Hooks.h +++ b/OptiScaler/hooks/Vulkan_Hooks.h @@ -4,6 +4,10 @@ class VulkanHooks { public: + static PFN_vkCreateSemaphore o_vkCreateSemaphore; + static PFN_vkSignalSemaphore o_vkSignalSemaphore; + static PFN_vkAntiLagUpdateAMD o_vkAntiLagUpdateAMD; + static void Hook(HMODULE vulkan1); static void Unhook(); }; diff --git a/OptiScaler/low_latency/ll_vulkan_hooks.cpp b/OptiScaler/low_latency/ll_vulkan_hooks.cpp deleted file mode 100644 index 84f6ea64..00000000 --- a/OptiScaler/low_latency/ll_vulkan_hooks.cpp +++ /dev/null @@ -1,90 +0,0 @@ -#include "pch.h" -#include "ll_vulkan_hooks.h" - -#include -#include -#include - -PFN_vkCreateDevice LLVulkanHooks::o_vkCreateDevice = nullptr; -PFN_vkGetPhysicalDeviceFeatures2 LLVulkanHooks::o_vkGetPhysicalDeviceFeatures2 = nullptr; -PFN_vkGetDeviceProcAddr LLVulkanHooks::o_vkGetDeviceProcAddr = nullptr; -PFN_vkCreateSemaphore LLVulkanHooks::o_vkCreateSemaphore = nullptr; -PFN_vkSignalSemaphore LLVulkanHooks::o_vkSignalSemaphore = nullptr; -PFN_vkAntiLagUpdateAMD LLVulkanHooks::o_vkAntiLagUpdateAMD = nullptr; - -VkResult LLVulkanHooks::hkvkCreateDevice(VkPhysicalDevice physicalDevice, VkDeviceCreateInfo* pCreateInfo, - const VkAllocationCallbacks* pAllocator, VkDevice* pDevice) -{ - LOG_DEBUG("hkvkCreateDevice"); - - std::vector extensions(pCreateInfo->ppEnabledExtensionNames, - pCreateInfo->ppEnabledExtensionNames + pCreateInfo->enabledExtensionCount); - - // AntiLag - bool antiLagSupported = false; - VkPhysicalDeviceFeatures2 features2 = {}; - features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; - - VkPhysicalDeviceAntiLagFeaturesAMD antiLagFeatures = {}; - antiLagFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ANTI_LAG_FEATURES_AMD; - - features2.pNext = &antiLagFeatures; - - if (o_vkGetPhysicalDeviceFeatures2) - { - o_vkGetPhysicalDeviceFeatures2(physicalDevice, &features2); - - if (antiLagFeatures.antiLag) - { - antiLagSupported = true; - LOG_INFO("Adding AntiLag extension"); - extensions.push_back(VK_AMD_ANTI_LAG_EXTENSION_NAME); - } - } - - // TODO add check for VK_KHR_DEVICE_GROUP_CREATION_EXTENSION_NAME as AntiLag doesn't support it - - pCreateInfo->enabledExtensionCount = static_cast(extensions.size()); - pCreateInfo->ppEnabledExtensionNames = extensions.data(); - - VkDeviceCreateInfo modifiedCreateInfo = *pCreateInfo; - - antiLagFeatures.pNext = (void*) modifiedCreateInfo.pNext; - modifiedCreateInfo.pNext = &antiLagFeatures; - - auto result = o_vkCreateDevice(physicalDevice, &modifiedCreateInfo, pAllocator, pDevice); - - // Can ask for a function from an extension after the device creation - if (antiLagSupported && o_vkGetDeviceProcAddr) - { - o_vkAntiLagUpdateAMD = (PFN_vkAntiLagUpdateAMD) o_vkGetDeviceProcAddr(*pDevice, "vkAntiLagUpdateAMD"); - } - else - { - LOG_INFO("Vulkan AntiLag can't be enabled"); - } - - return result; -} -void LLVulkanHooks::hook_vulkan(HMODULE vulkanModule) -{ - LOG_DEBUG("Trying to hook Vulkan"); - - if (o_vkCreateDevice) - return; - - o_vkCreateDevice = (PFN_vkCreateDevice) GetProcAddress(vulkanModule, "vkCreateDevice"); - o_vkGetPhysicalDeviceFeatures2 = - (PFN_vkGetPhysicalDeviceFeatures2) GetProcAddress(vulkanModule, "vkGetPhysicalDeviceFeatures2"); - o_vkGetDeviceProcAddr = (PFN_vkGetDeviceProcAddr) GetProcAddress(vulkanModule, "vkGetDeviceProcAddr"); - o_vkCreateSemaphore = (PFN_vkCreateSemaphore) GetProcAddress(vulkanModule, "vkCreateSemaphore"); - o_vkSignalSemaphore = (PFN_vkSignalSemaphore) GetProcAddress(vulkanModule, "vkSignalSemaphore"); - - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - - if (o_vkCreateDevice) - DetourAttach(&(PVOID&) o_vkCreateDevice, hkvkCreateDevice); - - DetourTransactionCommit(); -} \ No newline at end of file diff --git a/OptiScaler/low_latency/ll_vulkan_hooks.h b/OptiScaler/low_latency/ll_vulkan_hooks.h deleted file mode 100644 index b4284884..00000000 --- a/OptiScaler/low_latency/ll_vulkan_hooks.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include -#include -#include - -class LLVulkanHooks -{ - private: - static PFN_vkCreateDevice o_vkCreateDevice; - static PFN_vkGetPhysicalDeviceFeatures2 o_vkGetPhysicalDeviceFeatures2; - static PFN_vkGetDeviceProcAddr o_vkGetDeviceProcAddr; - - public: - static PFN_vkAntiLagUpdateAMD o_vkAntiLagUpdateAMD; - static PFN_vkCreateSemaphore o_vkCreateSemaphore; - static PFN_vkSignalSemaphore o_vkSignalSemaphore; - - static void hook_vulkan(HMODULE vulkanModule); - static VkResult hkvkCreateDevice(VkPhysicalDevice physicalDevice, VkDeviceCreateInfo* pCreateInfo, - const VkAllocationCallbacks* pAllocator, VkDevice* pDevice); -}; diff --git a/OptiScaler/low_latency/low_latency_tech/ll_antilag_vk.cpp b/OptiScaler/low_latency/low_latency_tech/ll_antilag_vk.cpp index fa31a36a..e03d1639 100644 --- a/OptiScaler/low_latency/low_latency_tech/ll_antilag_vk.cpp +++ b/OptiScaler/low_latency/low_latency_tech/ll_antilag_vk.cpp @@ -1,8 +1,8 @@ #include "pch.h" #include "ll_antilag_vk.h" -#include "low_latency/ll_vulkan_hooks.h" +#include -bool AntiLagVk::init(IUnknown* pDevice) { return LLVulkanHooks::o_vkAntiLagUpdateAMD != nullptr; } +bool AntiLagVk::init(IUnknown* pDevice) { return VulkanHooks::o_vkAntiLagUpdateAMD != nullptr; } // Unsupported bool AntiLagVk::init_using_ctx(void* context) @@ -79,11 +79,11 @@ void AntiLagVk::set_marker(IUnknown* pDevice, MarkerParams* marker_params) antiLagDataInput.pPresentationInfo = &inputInfo; antiLagDataInput.maxFPS = max_fps; - if (LLVulkanHooks::o_vkAntiLagUpdateAMD) + if (VulkanHooks::o_vkAntiLagUpdateAMD) { LOG_TRACE_LOWLATENCY("AntiLag Input: {}, status: {}", marker_params->frame_id, is_enabled()); - LLVulkanHooks::o_vkAntiLagUpdateAMD((VkDevice) pDevice, &antiLagDataInput); + VulkanHooks::o_vkAntiLagUpdateAMD((VkDevice) pDevice, &antiLagDataInput); } } @@ -102,11 +102,11 @@ void AntiLagVk::set_marker(IUnknown* pDevice, MarkerParams* marker_params) antiLagDataPresent.pPresentationInfo = &presentInfo; antiLagDataPresent.maxFPS = max_fps; - if (LLVulkanHooks::o_vkAntiLagUpdateAMD) + if (VulkanHooks::o_vkAntiLagUpdateAMD) { LOG_TRACE_LOWLATENCY("AntiLag Present: {}, status: {}", marker_params->frame_id, is_enabled()); - LLVulkanHooks::o_vkAntiLagUpdateAMD((VkDevice) pDevice, &antiLagDataPresent); + VulkanHooks::o_vkAntiLagUpdateAMD((VkDevice) pDevice, &antiLagDataPresent); } } } diff --git a/OptiScaler/nvapi/fakenvapi.cpp b/OptiScaler/nvapi/fakenvapi.cpp index d22c3d12..6b66c806 100644 --- a/OptiScaler/nvapi/fakenvapi.cpp +++ b/OptiScaler/nvapi/fakenvapi.cpp @@ -6,7 +6,6 @@ #include "fakenvapi.h" #include "NvApiTypes.h" #include "fakenvapi/nvapi_calls.h" -#include #define nvapi_interface_table nvapi_interface_table_extern #include @@ -20,30 +19,6 @@ void fakenvapi::init(bool onlyContext) if (onlyContext) return; - - auto exe_path = State::Instance().GameExe; - to_lower_in_place(exe_path); - - // TODO: won't work for late loaded vulkan-1.dll - auto vulkan_module = GetModuleHandleA("vulkan-1.dll"); - - // HACK: Force load vulkan-1 in rtx remix - // Avoids having to wait for the game to load it - const bool force_load = exe_path.contains("nvremixbridge.exe"); - if (!vulkan_module && force_load) - { - vulkan_module = LoadLibraryA("vulkan-1.dll"); - if (!vulkan_module) - { - LOG_WARN("Failed to load vulkan-1.dll"); - } - else - { - LOG_INFO("vulkan-1.dll loaded"); - } - } - - LLVulkanHooks::hook_vulkan(vulkan_module); } void fakenvapi::deinit() diff --git a/OptiScaler/nvapi/fakenvapi/nvapi_calls.cpp b/OptiScaler/nvapi/fakenvapi/nvapi_calls.cpp index 899b5f3e..5eab7ec8 100644 --- a/OptiScaler/nvapi/fakenvapi/nvapi_calls.cpp +++ b/OptiScaler/nvapi/fakenvapi/nvapi_calls.cpp @@ -3,6 +3,7 @@ #include "proxies/Dxgi_Proxy.h" #include #include +#include using Microsoft::WRL::ComPtr; @@ -628,8 +629,8 @@ NvAPI_Status __cdecl NvAPI_Vulkan_InitLowLatencyDevice(HANDLE vkDevice, HANDLE* VkResult res = VK_ERROR_UNKNOWN; - if (LLVulkanHooks::o_vkCreateSemaphore && low_latency_semaphore == VK_NULL_HANDLE) - res = LLVulkanHooks::o_vkCreateSemaphore(device, &createInfo, nullptr, &low_latency_semaphore); + if (VulkanHooks::o_vkCreateSemaphore && low_latency_semaphore == VK_NULL_HANDLE) + res = VulkanHooks::o_vkCreateSemaphore(device, &createInfo, nullptr, &low_latency_semaphore); if (res != VK_SUCCESS) return NVAPI_ERROR; @@ -676,8 +677,8 @@ NvAPI_Status __cdecl NvAPI_Vulkan_Sleep(HANDLE vkDevice, NvU64 signalValue) VkDevice device = reinterpret_cast(vkDevice); - if (LLVulkanHooks::o_vkSignalSemaphore) - LLVulkanHooks::o_vkSignalSemaphore(device, &signalInfo); + if (VulkanHooks::o_vkSignalSemaphore) + VulkanHooks::o_vkSignalSemaphore(device, &signalInfo); return LowLatencyCtx::get()->Sleep(vkDevice); } diff --git a/OptiScaler/nvapi/fakenvapi/nvapi_calls.h b/OptiScaler/nvapi/fakenvapi/nvapi_calls.h index ed285707..1a7acf86 100644 --- a/OptiScaler/nvapi/fakenvapi/nvapi_calls.h +++ b/OptiScaler/nvapi/fakenvapi/nvapi_calls.h @@ -7,7 +7,6 @@ #include "low_latency.h" #include "low_latency/ll_util.h" -#include "low_latency/ll_vulkan_hooks.h" #include "log.h" namespace nvapi_calls diff --git a/OptiScaler/spoofing/Vulkan_Spoofing.cpp b/OptiScaler/spoofing/Vulkan_Spoofing.cpp index cbd880c0..af42862e 100644 --- a/OptiScaler/spoofing/Vulkan_Spoofing.cpp +++ b/OptiScaler/spoofing/Vulkan_Spoofing.cpp @@ -572,6 +572,12 @@ VkResult VulkanSpoofing::hkvkCreateDevice(VkPhysicalDevice physicalDevice, VkDev } #endif + if (State::Instance().vkAntiLagSupported) + { + LOG_INFO("Adding AntiLag extension"); + newExtensionList.push_back(VK_AMD_ANTI_LAG_EXTENSION_NAME); + } + pCreateInfo->enabledExtensionCount = static_cast(newExtensionList.size()); pCreateInfo->ppEnabledExtensionNames = newExtensionList.data();