This commit is contained in:
cdozdil
2024-08-16 12:07:49 +03:00
parent 7de8d6b50e
commit 30e34e2b34
5 changed files with 103 additions and 53 deletions
+7 -5
View File
@@ -276,7 +276,7 @@ NVSDK_NGX_API NVSDK_NGX_Result NVSDK_NGX_VULKAN_GetFeatureInstanceExtensionRequi
}
}
if (FeatureDiscoveryInfo->FeatureID == NVSDK_NGX_Feature_SuperSampling)
if (FeatureDiscoveryInfo->FeatureID == NVSDK_NGX_Feature_SuperSampling || FeatureDiscoveryInfo->FeatureID == NVSDK_NGX_Feature_FrameGeneration)
{
if (NVNGXProxy::NVNGXModule() != nullptr)
{
@@ -338,14 +338,14 @@ NVSDK_NGX_API NVSDK_NGX_Result NVSDK_NGX_VULKAN_GetFeatureDeviceExtensionRequire
}
}
if (FeatureDiscoveryInfo->FeatureID == NVSDK_NGX_Feature_SuperSampling)
if (FeatureDiscoveryInfo->FeatureID == NVSDK_NGX_Feature_SuperSampling || FeatureDiscoveryInfo->FeatureID == NVSDK_NGX_Feature_FrameGeneration)
{
if (OutExtensionProperties == nullptr)
{
LOG_INFO("returning no extensions are needed!");
*OutExtensionCount = 0;
}
// Only Nvidia hardware should reach here, so in any case returning known extensions for DLSS
//if (OutExtensionProperties == nullptr)
//{
@@ -733,7 +733,9 @@ NVSDK_NGX_API NVSDK_NGX_Result NVSDK_NGX_VULKAN_EvaluateFeature(VkCommandBuffer
if (Config::Instance()->OverlayMenu.value_or(true) && Config::Instance()->CurrentFeature != nullptr && !ImGuiOverlayVk::IsInitedVk() &&
Config::Instance()->CurrentFeature->FrameCount() > Config::Instance()->MenuInitDelay.value_or(75))
{
ImGuiOverlayDx12::ShutdownDx12();
if (ImGuiOverlayDx12::IsInitedDx12())
ImGuiOverlayDx12::ShutdownDx12();
auto hwnd = Util::GetProcessWindow();
ImGuiOverlayVk::InitVk(hwnd, vkDevice, vkInstance, vkPD);
}
@@ -757,7 +759,7 @@ NVSDK_NGX_API NVSDK_NGX_Result NVSDK_NGX_VULKAN_EvaluateFeature(VkCommandBuffer
Config::Instance()->newBackend = Config::Instance()->VulkanUpscaler.value_or("fsr21");
changeBackendCounter++;
LOG_INFO("changeBackend is true, counter: {0}", changeBackendCounter);
// first release everything
+1 -1
View File
@@ -82,7 +82,7 @@
<IncludePath>$(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)</IncludePath>
<LibraryPath>$(ProjectDir)fsr2\lib;$(ProjectDir)fsr2_212\lib;$(ProjectDir)vulkan;$(ProjectDir)d3dx;$(ProjectDir)detours;$(SolutionDir)external\xess\lib;$(LibraryPath)</LibraryPath>
<TargetName>dlss-enabler-upscaler</TargetName>
<OutDir>D:\Folders\Games\Banishers Ghosts of New Eden\NWD\Binaries\Win64\</OutDir>
<OutDir>D:\Folders\Games\Streamline_Sample\_bin\</OutDir>
<IntDir>.\x64\Debug</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+2
View File
@@ -7,6 +7,7 @@
#include "NVNGX_Proxy.h"
#include "imgui/imgui_overlay_dx12.h"
#include "imgui/imgui_overlay_vk.h"
#include <vulkan/vulkan_core.h>
@@ -1465,6 +1466,7 @@ static void CheckWorkingMode()
if ((!isNvngxMode || isWorkingWithEnabler) && !Config::Instance()->DisableEarlyHooking.value_or(false) && Config::Instance()->OverlayMenu.value_or(true))
{
ImGuiOverlayDx12::Dx12Bind();
ImGuiOverlayVk::HookVK();
//ImGuiOverlayDx12::FSR3Bind();
}
+92 -47
View File
@@ -30,6 +30,19 @@ struct ImGui_ImplVulkan_InitInfo g_ImVulkan_Info = { };
struct ImGui_ImplVulkanH_Frame* g_ImVulkan_Frames = NULL;
static VkSemaphore* g_ImVulkan_Semaphores = NULL;
typedef VkResult(__fastcall* PFN_QueuePresentKHR)(VkQueue, const VkPresentInfoKHR*);
typedef VkResult(__fastcall* PFN_CreateSwapchainKHR)(VkDevice, const VkSwapchainCreateInfoKHR*, const VkAllocationCallbacks*, VkSwapchainKHR*);
PFN_vkCreateDevice o_vkCreateDevice = nullptr;
PFN_vkCreateInstance o_vkCreateInstance = nullptr;
PFN_vkCreateDevice o_SL_vkCreateDevice = nullptr;
PFN_QueuePresentKHR oQueuePresentKHR = nullptr;
PFN_CreateSwapchainKHR oCreateSwapchainKHR = nullptr;
static VkResult hkvkCreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDevice* pDevice);
static VkResult VKAPI_CALL hkQueuePresentKHR(VkQueue queue, VkPresentInfoKHR* pPresentInfo);
static VkResult VKAPI_CALL hkCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchain);
static int createCounter = 0;
static void DestroyVulkanObjects(bool shutdown)
@@ -73,7 +86,12 @@ static void CreateVulkanObjects(VkDevice device, const VkSwapchainCreateInfoKHR*
{
if (g_bInitialized)
{
if (ImGui::GetIO().BackendRendererUserData != nullptr)
ImGui_ImplVulkan_Shutdown();
DestroyVulkanObjects(false);
g_bInitialized = false;
}
// Initialize ImGui for IO.
@@ -118,6 +136,7 @@ static void CreateVulkanObjects(VkDevice device, const VkSwapchainCreateInfoKHR*
vkGetPhysicalDeviceQueueFamilyProperties(_PD, &count, NULL);
VkQueueFamilyProperties queues[8];
vkGetPhysicalDeviceQueueFamilyProperties(_PD, &count, queues);
for (uint32_t i = 0; i < count; i++)
{
if (queues[i].queueFlags & VK_QUEUE_GRAPHICS_BIT)
@@ -341,43 +360,65 @@ static void CreateVulkanObjects(VkDevice device, const VkSwapchainCreateInfoKHR*
g_bEnabled = true;
}
typedef VkResult(__fastcall* PFN_AcquireNextImageKHR)(VkDevice, VkSwapchainKHR, uint64_t, VkSemaphore, VkFence, uint32_t*);
PFN_AcquireNextImageKHR oAcquireNextImageKHR = nullptr;
static VkResult VKAPI_CALL hkAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout, VkSemaphore semaphore,
VkFence fence, uint32_t* pImageIndex)
static void HookDevice(VkDevice InDevice)
{
return oAcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
if (oCreateSwapchainKHR != nullptr)
return;
oQueuePresentKHR = (PFN_QueuePresentKHR)(vkGetDeviceProcAddr(InDevice, "vkQueuePresentKHR"));
oCreateSwapchainKHR = (PFN_CreateSwapchainKHR)(vkGetDeviceProcAddr(InDevice, "vkCreateSwapchainKHR"));
if (oCreateSwapchainKHR)
{
// Hook
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)oQueuePresentKHR, hkQueuePresentKHR);
DetourAttach(&(PVOID&)oCreateSwapchainKHR, hkCreateSwapchainKHR);
DetourTransactionCommit();
}
}
typedef VkResult(__fastcall* PFN_AcquireNextImage2KHR)(VkDevice, const VkAcquireNextImageInfoKHR*, uint32_t*);
PFN_AcquireNextImage2KHR oAcquireNextImage2KHR = nullptr;
static VkResult VKAPI_CALL hkAcquireNextImage2KHR(VkDevice device, const VkAcquireNextImageInfoKHR* pAcquireInfo, uint32_t* pImageIndex)
static VkResult hkvkCreateInstance(const VkInstanceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkInstance* pInstance)
{
return oAcquireNextImage2KHR(device, pAcquireInfo, pImageIndex);
auto result = o_vkCreateInstance(pCreateInfo, pAllocator, pInstance);
if (result == VK_SUCCESS)
_instance = *pInstance;
return result;
}
static VkResult hkvkCreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator, VkDevice* pDevice)
{
auto result = o_vkCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
if (result == VK_SUCCESS)
{
_PD = physicalDevice;
_device = *pDevice;
HookDevice(_device);
}
return result;
}
typedef VkResult(__fastcall* PFN_QueuePresentKHR)(VkQueue, const VkPresentInfoKHR*);
PFN_QueuePresentKHR oQueuePresentKHR = nullptr;
static VkResult VKAPI_CALL hkQueuePresentKHR(VkQueue queue, VkPresentInfoKHR* pPresentInfo)
{
if (!g_bInitialized)
{
if (createCounter == 0)
if (pPresentInfo->swapchainCount > 0)
{
createCounter++;
return VK_ERROR_OUT_OF_DATE_KHR;
auto sc = pPresentInfo->pSwapchains[0];
CreateVulkanObjects(_device, nullptr, &sc);
}
else
{
if (pPresentInfo->swapchainCount > 0)
{
auto sc = pPresentInfo->pSwapchains[0];
CreateVulkanObjects(_device, nullptr, &sc);
}
else
{
createCounter = 0;
}
return oQueuePresentKHR(queue, pPresentInfo);
}
}
@@ -458,9 +499,6 @@ static VkResult VKAPI_CALL hkQueuePresentKHR(VkQueue queue, VkPresentInfoKHR* pP
return oQueuePresentKHR(queue, pPresentInfo);
}
typedef VkResult(__fastcall* PFN_CreateSwapchainKHR)(VkDevice, const VkSwapchainCreateInfoKHR*, const VkAllocationCallbacks*, VkSwapchainKHR*);
PFN_CreateSwapchainKHR oCreateSwapchainKHR = nullptr;
static VkResult VKAPI_CALL hkCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, VkAllocationCallbacks* pAllocator,
VkSwapchainKHR* pSwapchain)
{
@@ -488,30 +526,39 @@ HWND ImGuiOverlayVk::Handle()
void ImGuiOverlayVk::InitVk(HWND InHwnd, VkDevice InDevice, VkInstance InInstance, VkPhysicalDevice InPD)
{
_hwnd = InHwnd;
_device = InDevice;
_instance = InInstance;
_PD = InPD;
oAcquireNextImageKHR = (PFN_AcquireNextImageKHR)(vkGetDeviceProcAddr(InDevice, "vkAcquireNextImageKHR"));
oAcquireNextImage2KHR = (PFN_AcquireNextImage2KHR)(vkGetDeviceProcAddr(InDevice, "vkAcquireNextImage2KHR"));
oQueuePresentKHR = (PFN_QueuePresentKHR)(vkGetDeviceProcAddr(InDevice, "vkQueuePresentKHR"));
oCreateSwapchainKHR = (PFN_CreateSwapchainKHR)(vkGetDeviceProcAddr(InDevice, "vkCreateSwapchainKHR"));
if (_instance == nullptr)
_instance = InInstance;
if (oAcquireNextImageKHR)
{
// Hook
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
if (_device == nullptr)
_device = InDevice;
DetourAttach(&(PVOID&)oAcquireNextImageKHR, hkAcquireNextImageKHR);
DetourAttach(&(PVOID&)oAcquireNextImage2KHR, hkAcquireNextImage2KHR);
DetourAttach(&(PVOID&)oQueuePresentKHR, hkQueuePresentKHR);
DetourAttach(&(PVOID&)oCreateSwapchainKHR, hkCreateSwapchainKHR);
if (_PD == nullptr)
_PD = InPD;
DetourTransactionCommit();
HookDevice(InDevice);
_isInited = true;
}
_isInited = true;
}
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");
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
if (o_vkCreateDevice != nullptr)
DetourAttach(&(PVOID&)o_vkCreateDevice, hkvkCreateDevice);
if (o_vkCreateInstance != nullptr)
DetourAttach(&(PVOID&)o_vkCreateInstance, hkvkCreateInstance);
DetourTransactionCommit();
}
void ImGuiOverlayVk::ShutdownVk()
@@ -529,8 +576,6 @@ void ImGuiOverlayVk::ShutdownVk()
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)oAcquireNextImageKHR, hkAcquireNextImageKHR);
DetourDetach(&(PVOID&)oAcquireNextImage2KHR, hkAcquireNextImage2KHR);
DetourDetach(&(PVOID&)oQueuePresentKHR, hkQueuePresentKHR);
DetourDetach(&(PVOID&)oCreateSwapchainKHR, hkCreateSwapchainKHR);
+1
View File
@@ -9,6 +9,7 @@ namespace ImGuiOverlayVk
HWND Handle();
void InitVk(HWND InHwnd, VkDevice InDevice, VkInstance InInstance, VkPhysicalDevice InPD);
void HookVK();
void ShutdownVk();
void ReInitVk(HWND InNewHwnd);
}