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();