From 719bcd4bbe1b3c399ee1fd374bde08e6c9f6887f Mon Sep 17 00:00:00 2001 From: Connor Smith Date: Tue, 6 Aug 2024 20:36:31 -0700 Subject: [PATCH] st/oxr: Use the vkGetInstanceProcAddr provided through OpenXR calls. Use the vkGetInstanceProcAddr passed to xrCreateVulkanInstanceKHR to load functions required by xrGetVulkanGraphicsDevice2KHR. This fixes a crash when loading Vulkan into a process that has already Vulkan loaded. Part-of: --- src/xrt/state_trackers/oxr/oxr_api_system.c | 8 +++++++- src/xrt/state_trackers/oxr/oxr_objects.h | 8 +++++++- src/xrt/state_trackers/oxr/oxr_system.c | 1 + 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/xrt/state_trackers/oxr/oxr_api_system.c b/src/xrt/state_trackers/oxr/oxr_api_system.c index a6d9cdea8..d6ee6bd12 100644 --- a/src/xrt/state_trackers/oxr/oxr_api_system.c +++ b/src/xrt/state_trackers/oxr/oxr_api_system.c @@ -1,4 +1,5 @@ // Copyright 2018-2020, Collabora, Ltd. +// Copyright 2024-2025, NVIDIA CORPORATION. // SPDX-License-Identifier: BSL-1.0 /*! * @file @@ -328,9 +329,10 @@ oxr_xrGetVulkanGraphicsDevice2KHR(XrInstance instance, OXR_VERIFY_SYSTEM_AND_GET(&log, inst, getInfo->systemId, sys); OXR_VERIFY_ARG_NOT_NULL(&log, vkPhysicalDevice); + OXR_VERIFY_ARG_NOT_NULL(&log, sys->vk_get_instance_proc_addr); OXR_VERIFY_XSYSC(&log, sys); - return oxr_vk_get_physical_device(&log, inst, sys, getInfo->vulkanInstance, vkGetInstanceProcAddr, + return oxr_vk_get_physical_device(&log, inst, sys, getInfo->vulkanInstance, sys->vk_get_instance_proc_addr, vkPhysicalDevice); } @@ -393,6 +395,8 @@ oxr_xrCreateVulkanInstanceKHR(XrInstance instance, // createInfo->vulkanAllocator can be NULL + sys->vk_get_instance_proc_addr = createInfo->pfnGetInstanceProcAddr; + if (createInfo->vulkanCreateInfo->sType != VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO) { return oxr_error(&log, XR_ERROR_VALIDATION_FAILURE, "createInfo->vulkanCreateInfo->sType must be " @@ -429,6 +433,8 @@ oxr_xrCreateVulkanDeviceKHR(XrInstance instance, OXR_VERIFY_ARG_NOT_NULL(&log, sys->vulkan_enable2_instance); OXR_VERIFY_XSYSC(&log, sys); + sys->vk_get_instance_proc_addr = createInfo->pfnGetInstanceProcAddr; + if (sys->suggested_vulkan_physical_device != createInfo->vulkanPhysicalDevice) { return oxr_error(&log, XR_ERROR_HANDLE_INVALID, "createInfo->vulkanPhysicalDevice must be the device " diff --git a/src/xrt/state_trackers/oxr/oxr_objects.h b/src/xrt/state_trackers/oxr/oxr_objects.h index 8a49e36e0..4649a7e5b 100644 --- a/src/xrt/state_trackers/oxr/oxr_objects.h +++ b/src/xrt/state_trackers/oxr/oxr_objects.h @@ -1,5 +1,5 @@ // Copyright 2018-2024, Collabora, Ltd. -// Copyright 2023, NVIDIA CORPORATION. +// Copyright 2023-2025, NVIDIA CORPORATION. // SPDX-License-Identifier: BSL-1.0 /*! * @file @@ -1530,6 +1530,12 @@ struct oxr_system //! XR_NULL_HANDLE if neither has been called. VkPhysicalDevice suggested_vulkan_physical_device; + /*! + * Stores the vkGetInstanceProcAddr passed to xrCreateVulkanInstanceKHR to be + * used when looking up Vulkan functions used by xrGetVulkanGraphicsDevice2KHR. + */ + PFN_vkGetInstanceProcAddr vk_get_instance_proc_addr; + struct { // No better place to keep this state. diff --git a/src/xrt/state_trackers/oxr/oxr_system.c b/src/xrt/state_trackers/oxr/oxr_system.c index 71aa5785a..3f3ce1df5 100644 --- a/src/xrt/state_trackers/oxr/oxr_system.c +++ b/src/xrt/state_trackers/oxr/oxr_system.c @@ -121,6 +121,7 @@ oxr_system_fill_in( #ifdef XR_USE_GRAPHICS_API_VULKAN sys->vulkan_enable2_instance = VK_NULL_HANDLE; sys->suggested_vulkan_physical_device = VK_NULL_HANDLE; + sys->vk_get_instance_proc_addr = VK_NULL_HANDLE; #endif #if defined(XR_USE_GRAPHICS_API_D3D11) || defined(XR_USE_GRAPHICS_API_D3D12) U_ZERO(&(sys->suggested_d3d_luid)); -- 2.51.2