mirror of
https://github.com/optiscaler/OptiScaler.git
synced 2026-08-23 22:56:52 +00:00
Remove separate vk hooks for fakenvapi
This commit is contained in:
@@ -338,7 +338,6 @@ copy NUL "$(SolutionDir)x64\Release\a\!! EXTRACT ALL FILES TO GAME FOLDER !!" /Y
|
||||
<ClInclude Include="shaders\rcas\precompile\lc_da_sharpen_Shader_Vk.h" />
|
||||
<ClInclude Include="hooks\Xell_Hooks.h" />
|
||||
<ClInclude Include="low_latency\ll_util.h" />
|
||||
<ClInclude Include="low_latency\ll_vulkan_hooks.h" />
|
||||
<ClInclude Include="nvapi\fakenvapi\log.h" />
|
||||
<ClInclude Include="nvapi\fakenvapi\low_latency.h" />
|
||||
<ClInclude Include="low_latency\low_latency_tech\ll_antilag2.h" />
|
||||
@@ -592,7 +591,6 @@ copy NUL "$(SolutionDir)x64\Release\a\!! EXTRACT ALL FILES TO GAME FOLDER !!" /Y
|
||||
<ClCompile Include="inputs\FSR2_Vk.cpp" />
|
||||
<ClCompile Include="inputs\XeSS_Dx11.cpp" />
|
||||
<ClCompile Include="low_latency\ll_util.cpp" />
|
||||
<ClCompile Include="low_latency\ll_vulkan_hooks.cpp" />
|
||||
<ClCompile Include="nvapi\fakenvapi\log.cpp" />
|
||||
<ClCompile Include="nvapi\fakenvapi\low_latency.cpp" />
|
||||
<ClCompile Include="nvapi\fakenvapi\low_latency_d3d.cpp" />
|
||||
|
||||
@@ -776,9 +776,6 @@
|
||||
<ClInclude Include="low_latency\ll_util.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="low_latency\ll_vulkan_hooks.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="hooks\Xell_Hooks.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
@@ -1280,9 +1277,6 @@
|
||||
<ClCompile Include="low_latency\ll_util.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="low_latency\ll_vulkan_hooks.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="hooks\Xell_Hooks.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
|
||||
@@ -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<unsigned int, bool> changeBackend;
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
@@ -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();
|
||||
};
|
||||
|
||||
@@ -1,90 +0,0 @@
|
||||
#include "pch.h"
|
||||
#include "ll_vulkan_hooks.h"
|
||||
|
||||
#include <detours/detours.h>
|
||||
#include <vulkan/vulkan_core.h>
|
||||
#include <vector>
|
||||
|
||||
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<const char*> 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<uint32_t>(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();
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <detours/detours.h>
|
||||
#include <vulkan/vulkan_core.h>
|
||||
#include <vector>
|
||||
|
||||
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);
|
||||
};
|
||||
@@ -1,8 +1,8 @@
|
||||
#include "pch.h"
|
||||
#include "ll_antilag_vk.h"
|
||||
#include "low_latency/ll_vulkan_hooks.h"
|
||||
#include <hooks/Vulkan_Hooks.h>
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
#include "fakenvapi.h"
|
||||
#include "NvApiTypes.h"
|
||||
#include "fakenvapi/nvapi_calls.h"
|
||||
#include <low_latency/ll_vulkan_hooks.h>
|
||||
|
||||
#define nvapi_interface_table nvapi_interface_table_extern
|
||||
#include <nvapi_interface.h>
|
||||
@@ -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()
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include "proxies/Dxgi_Proxy.h"
|
||||
#include <misc/IdentifyGpu.h>
|
||||
#include <NvApiDriverSettings.h>
|
||||
#include <hooks/Vulkan_Hooks.h>
|
||||
|
||||
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>(vkDevice);
|
||||
|
||||
if (LLVulkanHooks::o_vkSignalSemaphore)
|
||||
LLVulkanHooks::o_vkSignalSemaphore(device, &signalInfo);
|
||||
if (VulkanHooks::o_vkSignalSemaphore)
|
||||
VulkanHooks::o_vkSignalSemaphore(device, &signalInfo);
|
||||
|
||||
return LowLatencyCtx::get()->Sleep(vkDevice);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<uint32_t>(newExtensionList.size());
|
||||
pCreateInfo->ppEnabledExtensionNames = newExtensionList.data();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user