From d20624b32f41971183da003c460fc9baedc73742 Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 4 Sep 2018 15:55:17 +0100 Subject: [PATCH] Add fallback logic for locating MoltenVK & loader on macOS --- renderdoc/driver/vulkan/vk_android.cpp | 5 +++- renderdoc/driver/vulkan/vk_apple.cpp | 30 ++++++++++++++++++- renderdoc/driver/vulkan/vk_common.h | 2 +- renderdoc/driver/vulkan/vk_linux.cpp | 5 +++- renderdoc/driver/vulkan/vk_replay.cpp | 2 +- renderdoc/driver/vulkan/vk_win32.cpp | 5 +++- .../vulkan/wrappers/vk_device_funcs.cpp | 2 +- 7 files changed, 44 insertions(+), 7 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_android.cpp b/renderdoc/driver/vulkan/vk_android.cpp index e0ac8fc38..cdf6b0955 100644 --- a/renderdoc/driver/vulkan/vk_android.cpp +++ b/renderdoc/driver/vulkan/vk_android.cpp @@ -81,7 +81,10 @@ void VulkanReplay::GetOutputWindowDimensions(uint64_t id, int32_t &w, int32_t &h h = ANativeWindow_getHeight(outw.wnd); } -const char *VulkanLibraryName = "libvulkan.so"; +void *LoadVulkanLibrary() +{ + return Process::LoadModule("libvulkan.so"); +} bool VulkanReplay::CheckVulkanLayer(VulkanLayerFlags &flags, std::vector &myJSONs, std::vector &otherJSONs) diff --git a/renderdoc/driver/vulkan/vk_apple.cpp b/renderdoc/driver/vulkan/vk_apple.cpp index 8387d7c2d..386c49fd3 100644 --- a/renderdoc/driver/vulkan/vk_apple.cpp +++ b/renderdoc/driver/vulkan/vk_apple.cpp @@ -22,6 +22,7 @@ * THE SOFTWARE. ******************************************************************************/ +#include "strings/string_utils.h" #include "vk_core.h" #include "vk_replay.h" @@ -86,7 +87,7 @@ void VulkanReplay::GetOutputWindowDimensions(uint64_t id, int32_t &w, int32_t &h h = getCALayerHeight(outw.wnd); } -const char *VulkanLibraryName = "libvulkan.1.dylib"; +static const char *VulkanLibraryName = "libvulkan.1.dylib"; string GetThisLibPath() { @@ -97,4 +98,31 @@ string GetThisLibPath() return info.dli_fname; } return ""; +} + +void *LoadVulkanLibrary() +{ + // first try to load the module globally. If so we assume the user has a global (or at least + // user-wide) configuration that we should use. + void *ret = Process::LoadModule(VulkanLibraryName); + + if(ret) + { + RDCLOG("Loaded global libvulkan.1.dylib, using default MoltenVK environment"); + return ret; + } + + // if not, we fall back to our embedded libvulkan and also force use of our embedded ICD. + std::string libpath = GetThisLibPath(); + libpath = dirname(libpath) + "/../MoltenVK/"; + + RDCLOG("Couldn't load global libvulkan.1.dylib, falling back to bundled MoltenVK in %s", + libpath.c_str()); + + Process::RegisterEnvironmentModification(EnvironmentModification( + EnvMod::Set, EnvSep::NoSep, "VK_ICD_FILENAMES", (libpath + "MoltenVK_icd.json").c_str())); + + Process::ApplyEnvironmentModification(); + + return Process::LoadModule((libpath + VulkanLibraryName).c_str()); } \ No newline at end of file diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index fd6c5b419..84de52d85 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -176,7 +176,7 @@ struct GPUBuffer }; // in vk_.cpp -extern const char *VulkanLibraryName; +extern void *LoadVulkanLibrary(); class VkDriverInfo { diff --git a/renderdoc/driver/vulkan/vk_linux.cpp b/renderdoc/driver/vulkan/vk_linux.cpp index 370cc3380..ad409a3ec 100644 --- a/renderdoc/driver/vulkan/vk_linux.cpp +++ b/renderdoc/driver/vulkan/vk_linux.cpp @@ -235,7 +235,10 @@ void VulkanReplay::GetOutputWindowDimensions(uint64_t id, int32_t &w, int32_t &h RDCERR("Unrecognised/unsupported window system %d", outw.m_WindowSystem); } -const char *VulkanLibraryName = "libvulkan.so.1"; +void *LoadVulkanLibrary() +{ + return Process::LoadModule("libvulkan.so.1"); +} string GetThisLibPath() { diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index b2394aec8..3666c1c40 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -3405,7 +3405,7 @@ ReplayStatus Vulkan_CreateReplayDevice(RDCFile *rdc, IReplayDriver **driver) Process::ApplyEnvironmentModification(); - void *module = Process::LoadModule(VulkanLibraryName); + void *module = LoadVulkanLibrary(); if(module == NULL) { diff --git a/renderdoc/driver/vulkan/vk_win32.cpp b/renderdoc/driver/vulkan/vk_win32.cpp index e6fddebff..16d5fde2b 100644 --- a/renderdoc/driver/vulkan/vk_win32.cpp +++ b/renderdoc/driver/vulkan/vk_win32.cpp @@ -156,7 +156,10 @@ VkBool32 WrappedVulkan::vkGetPhysicalDeviceWin32PresentationSupportKHR(VkPhysica ->GetPhysicalDeviceWin32PresentationSupportKHR(Unwrap(physicalDevice), queueFamilyIndex); } -const char *VulkanLibraryName = "vulkan-1.dll"; +void *LoadVulkanLibrary() +{ + return Process::LoadModule("vulkan-1.dll"); +} std::wstring GetJSONPath(bool wow6432) { diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index 42d817825..6240cda52 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -430,7 +430,7 @@ VkResult WrappedVulkan::vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo std::vector supportedExts; // enumerate what instance extensions are available - void *module = Process::LoadModule(VulkanLibraryName); + void *module = LoadVulkanLibrary(); if(module) { PFN_vkEnumerateInstanceExtensionProperties enumInstExts =