From b0d7e2a7d0dad73a00c5e3601ae22a6bcc6c87ab Mon Sep 17 00:00:00 2001 From: Sultim Tsyrendashiev Date: Sat, 5 Aug 2023 17:25:44 +0100 Subject: [PATCH] Undocumented / not specified Streamline: need to intercept vkEnumeratePhysicalDevices, otherwise null access at vkCreateDevice, as it uses mapping from VkPhysicalDevice to VkInstance --- Source/Common.cpp | 7 ++-- Source/Common.h | 14 ++++---- Source/PhysicalDevice.cpp | 4 +-- Source/Streamline.cpp | 76 +++++++++++++++------------------------ Source/Streamline.h | 9 +++-- 5 files changed, 47 insertions(+), 63 deletions(-) diff --git a/Source/Common.cpp b/Source/Common.cpp index 1c6accff..53510354 100644 --- a/Source/Common.cpp +++ b/Source/Common.cpp @@ -30,9 +30,10 @@ VK_DEVICE_FUNCTION_LIST VK_DEVICE_DEBUG_UTILS_FUNCTION_LIST #undef VK_EXTENSION_FUNCTION -PFN_vkCreateInstance svkCreateInstance = nullptr; -PFN_vkCreateWin32SurfaceKHR svkCreateWin32SurfaceKHR = nullptr; -PFN_vkDestroySurfaceKHR svkDestroySurfaceKHR = nullptr; +PFN_vkCreateInstance svkCreateInstance = nullptr; +PFN_vkCreateWin32SurfaceKHR svkCreateWin32SurfaceKHR = nullptr; +PFN_vkDestroySurfaceKHR svkDestroySurfaceKHR = nullptr; +PFN_vkEnumeratePhysicalDevices svkEnumeratePhysicalDevices = nullptr; PFN_vkCreateDevice svkCreateDevice = nullptr; PFN_vkQueuePresentKHR svkQueuePresentKHR = nullptr; diff --git a/Source/Common.h b/Source/Common.h index fd904efa..fdec72bb 100644 --- a/Source/Common.h +++ b/Source/Common.h @@ -73,9 +73,10 @@ void InitDeviceExtensionFunctions( VkDevice device ); void InitDeviceExtensionFunctions_DebugUtils( VkDevice device ); -extern PFN_vkCreateInstance svkCreateInstance; -extern PFN_vkCreateWin32SurfaceKHR svkCreateWin32SurfaceKHR; -extern PFN_vkDestroySurfaceKHR svkDestroySurfaceKHR; +extern PFN_vkCreateInstance svkCreateInstance; +extern PFN_vkCreateWin32SurfaceKHR svkCreateWin32SurfaceKHR; +extern PFN_vkDestroySurfaceKHR svkDestroySurfaceKHR; +extern PFN_vkEnumeratePhysicalDevices svkEnumeratePhysicalDevices; extern PFN_vkCreateDevice svkCreateDevice; extern PFN_vkQueuePresentKHR svkQueuePresentKHR; @@ -87,9 +88,10 @@ extern PFN_vkDeviceWaitIdle svkDeviceWaitIdle; inline void ResetVkFunctionsToDefault() { - svkCreateInstance = vkCreateInstance; - svkCreateWin32SurfaceKHR = vkCreateWin32SurfaceKHR; - svkDestroySurfaceKHR = vkDestroySurfaceKHR; + svkCreateInstance = vkCreateInstance; + svkCreateWin32SurfaceKHR = vkCreateWin32SurfaceKHR; + svkDestroySurfaceKHR = vkDestroySurfaceKHR; + svkEnumeratePhysicalDevices = vkEnumeratePhysicalDevices; svkCreateDevice = vkCreateDevice; svkQueuePresentKHR = vkQueuePresentKHR; diff --git a/Source/PhysicalDevice.cpp b/Source/PhysicalDevice.cpp index e61d84fd..3bc1d30c 100644 --- a/Source/PhysicalDevice.cpp +++ b/Source/PhysicalDevice.cpp @@ -34,7 +34,7 @@ PhysicalDevice::PhysicalDevice( VkInstance instance ) { uint32_t physCount = 0; { - VkResult r = vkEnumeratePhysicalDevices( instance, &physCount, nullptr ); + VkResult r = svkEnumeratePhysicalDevices( instance, &physCount, nullptr ); VK_CHECKERROR( r ); } @@ -45,7 +45,7 @@ PhysicalDevice::PhysicalDevice( VkInstance instance ) } physicalDevices.resize( physCount ); - VkResult r = vkEnumeratePhysicalDevices( instance, &physCount, physicalDevices.data() ); + VkResult r = svkEnumeratePhysicalDevices( instance, &physCount, physicalDevices.data() ); VK_CHECKERROR( r ); } diff --git a/Source/Streamline.cpp b/Source/Streamline.cpp index 68f54d3a..ca854f82 100644 --- a/Source/Streamline.cpp +++ b/Source/Streamline.cpp @@ -86,7 +86,6 @@ auto FetchFunctions( HMODULE interposerDll ) -> std::optional< RTGL1::Streamline if( !fetchInto( &pfn.slGetNativeInterface , "slGetNativeInterface" ) ) { return {}; } if( !fetchInto( &pfn.slGetFeatureFunction , "slGetFeatureFunction" ) ) { return {}; } if( !fetchInto( &pfn.slGetNewFrameToken , "slGetNewFrameToken" ) ) { return {}; } - if( !fetchInto( &pfn.slSetVulkanInfo , "slSetVulkanInfo" ) ) { return {}; } // clang-format on return pfn; @@ -145,9 +144,10 @@ auto FetchVkInstanceFunctions( RTGL1::Streamline::Proxies& proxies, VkInstance i // clang-format off auto instPfn = RTGL1::Streamline::ProxiesVkInstance{}; - if( !fetchVkInto( &instPfn.vkCreateWin32SurfaceKHR , "vkCreateWin32SurfaceKHR" ) ) { return {}; } - if( !fetchVkInto( &instPfn.vkDestroySurfaceKHR , "vkDestroySurfaceKHR" ) ) { return {}; } - if( !fetchVkInto( &instPfn.vkCreateDevice , "vkCreateDevice" ) ) { return {}; } + if( !fetchVkInto( &instPfn.vkCreateWin32SurfaceKHR , "vkCreateWin32SurfaceKHR" ) ) { return {}; } + if( !fetchVkInto( &instPfn.vkDestroySurfaceKHR , "vkDestroySurfaceKHR" ) ) { return {}; } + if( !fetchVkInto( &instPfn.vkCreateDevice , "vkCreateDevice" ) ) { return {}; } + if( !fetchVkInto( &instPfn.vkEnumeratePhysicalDevices , "vkEnumeratePhysicalDevices" ) ) { return {}; } // clang-format on return instPfn; @@ -278,9 +278,26 @@ auto InitStreamline( HMODULE interposerDll, return {}; } - if( !FetchFeatureFunctions( pfn, sl::kFeatureDLSS ) ) + for( auto ft : features ) { - debug::Warning( "(NVIDIA Streamline) Failed to fetch DLSS functions" ); + auto ftName = []( sl::Feature ft ) { + switch( ft ) + { + case sl::kFeatureDLSS: return "DLSS"; + case sl::kFeatureDLSS_G: return "DLFG"; + case sl::kFeatureNIS: return "NIS"; + case sl::kFeatureNRD: return "NRD"; + case sl::kFeatureImGUI: return "ImGUI"; + case sl::kFeatureReflex: return "Reflex"; + case sl::kFeatureCommon: return "Common"; + default: return ""; + } + }; + + if( !FetchFeatureFunctions( pfn, sl::kFeatureDLSS ) ) + { + debug::Warning( "(NVIDIA Streamline) Failed to fetch {} functions", ftName( ft ) ); + } } return proxies; @@ -336,56 +353,21 @@ bool RTGL1::Streamline::HookVkInstanceFunctions( VkInstance instance ) { if( auto f = FetchVkInstanceFunctions( *proxies, instance ) ) { - RTGL1::svkCreateWin32SurfaceKHR = f->vkCreateWin32SurfaceKHR; - RTGL1::svkDestroySurfaceKHR = f->vkDestroySurfaceKHR; - RTGL1::svkCreateDevice = f->vkCreateDevice; + RTGL1::svkCreateWin32SurfaceKHR = f->vkCreateWin32SurfaceKHR; + RTGL1::svkDestroySurfaceKHR = f->vkDestroySurfaceKHR; + RTGL1::svkCreateDevice = f->vkCreateDevice; + RTGL1::svkEnumeratePhysicalDevices = f->vkEnumeratePhysicalDevices; assert( RTGL1::svkCreateDevice ); assert( RTGL1::svkCreateWin32SurfaceKHR ); assert( RTGL1::svkDestroySurfaceKHR ); + assert( RTGL1::svkEnumeratePhysicalDevices ); return true; } } return false; } -namespace -{ - -[[nodiscard]] bool SetVk( VkInstance instance, - VkDevice device, - RTGL1::PhysicalDevice& physDevice, - RTGL1::Queues& queues, - std::optional< RTGL1::Streamline::Pfn >& pfn ) -{ - if( !pfn ) - { - return false; - } - - auto slvk = sl::VulkanInfo{}; - { - slvk.device = device; - slvk.instance = instance; - slvk.physicalDevice = physDevice.Get(); - slvk.computeQueueIndex = 0; - slvk.computeQueueFamily = queues.GetIndexCompute(); - slvk.graphicsQueueIndex = 0; - slvk.graphicsQueueFamily = queues.GetIndexGraphics(); - } - - if( SL_FAILED( slr, pfn->slSetVulkanInfo( slvk ) ) ) - { - RTGL1::debug::Error( "(NVIDIA Streamline) slSetVulkanInfo fail. Error code: {}", - uint32_t( slr ) ); - return false; - } - - return true; -} - -} - bool RTGL1::Streamline::HookVkDeviceFunctionsAndSetup( VkInstance instance, VkDevice device, PhysicalDevice& physDevice, @@ -408,7 +390,7 @@ bool RTGL1::Streamline::HookVkDeviceFunctionsAndSetup( VkInstance instance, assert( RTGL1::svkGetSwapchainImagesKHR ); assert( RTGL1::svkAcquireNextImageKHR ); assert( RTGL1::svkDeviceWaitIdle ); - return SetVk( instance, device, physDevice, queues, this->pfn ); + return true; } } return false; diff --git a/Source/Streamline.h b/Source/Streamline.h index 6ac03107..a53cc2c5 100644 --- a/Source/Streamline.h +++ b/Source/Streamline.h @@ -28,7 +28,6 @@ #include #include - #include #include #include @@ -55,9 +54,10 @@ struct Streamline struct ProxiesVkInstance { - PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR; - PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR; - PFN_vkCreateDevice vkCreateDevice; + PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR; + PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR; + PFN_vkCreateDevice vkCreateDevice; + PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices; }; struct ProxiesVkDevice @@ -95,7 +95,6 @@ struct Streamline PFun_slGetNativeInterface* slGetNativeInterface; PFun_slGetFeatureFunction* slGetFeatureFunction; PFun_slGetNewFrameToken* slGetNewFrameToken; - PFun_slSetVulkanInfo* slSetVulkanInfo; PFun_slDLSSGetOptimalSettings* slDLSSGetOptimalSettings; PFun_slDLSSGetState* slDLSSGetState; PFun_slDLSSSetOptions* slDLSSSetOptions;