Skip to content

Commit

Permalink
Undocumented / not specified Streamline: need to intercept vkEnumerat…
Browse files Browse the repository at this point in the history
…ePhysicalDevices, otherwise null access at vkCreateDevice, as it uses mapping from VkPhysicalDevice to VkInstance
  • Loading branch information
sultim-t committed Aug 5, 2023
1 parent c7a75ce commit 6950ee7
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 63 deletions.
7 changes: 4 additions & 3 deletions Source/Common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
14 changes: 8 additions & 6 deletions Source/Common.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down
4 changes: 2 additions & 2 deletions Source/PhysicalDevice.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 );
}

Expand All @@ -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 );
}

Expand Down
76 changes: 29 additions & 47 deletions Source/Streamline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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 "<unknown>";
}
};

if( !FetchFeatureFunctions( pfn, ft ) )
{
debug::Warning( "(NVIDIA Streamline) Failed to fetch {} functions", ftName( ft ) );
}
}

return proxies;
Expand Down Expand Up @@ -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,
Expand All @@ -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;
Expand Down
9 changes: 4 additions & 5 deletions Source/Streamline.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@

#include <sl.h>
#include <sl_dlss.h>
#include <sl_helpers_vk.h>

#include <filesystem>
#include <regex>
Expand All @@ -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
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 6950ee7

Please sign in to comment.