The open source OpenXR runtime

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: <https://gitlab.freedesktop.org/monado/monado/-/merge_requests/2619>

authored by

Connor Smith and committed by
Marge Bot
719bcd4b 9a5907dc

+15 -2
+7 -1
src/xrt/state_trackers/oxr/oxr_api_system.c
··· 1 1 // Copyright 2018-2020, Collabora, Ltd. 2 + // Copyright 2024-2025, NVIDIA CORPORATION. 2 3 // SPDX-License-Identifier: BSL-1.0 3 4 /*! 4 5 * @file ··· 328 329 329 330 OXR_VERIFY_SYSTEM_AND_GET(&log, inst, getInfo->systemId, sys); 330 331 OXR_VERIFY_ARG_NOT_NULL(&log, vkPhysicalDevice); 332 + OXR_VERIFY_ARG_NOT_NULL(&log, sys->vk_get_instance_proc_addr); 331 333 OXR_VERIFY_XSYSC(&log, sys); 332 334 333 - return oxr_vk_get_physical_device(&log, inst, sys, getInfo->vulkanInstance, vkGetInstanceProcAddr, 335 + return oxr_vk_get_physical_device(&log, inst, sys, getInfo->vulkanInstance, sys->vk_get_instance_proc_addr, 334 336 vkPhysicalDevice); 335 337 } 336 338 ··· 393 395 394 396 // createInfo->vulkanAllocator can be NULL 395 397 398 + sys->vk_get_instance_proc_addr = createInfo->pfnGetInstanceProcAddr; 399 + 396 400 if (createInfo->vulkanCreateInfo->sType != VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO) { 397 401 return oxr_error(&log, XR_ERROR_VALIDATION_FAILURE, 398 402 "createInfo->vulkanCreateInfo->sType must be " ··· 428 432 OXR_VERIFY_ARG_NOT_NULL(&log, sys->suggested_vulkan_physical_device); 429 433 OXR_VERIFY_ARG_NOT_NULL(&log, sys->vulkan_enable2_instance); 430 434 OXR_VERIFY_XSYSC(&log, sys); 435 + 436 + sys->vk_get_instance_proc_addr = createInfo->pfnGetInstanceProcAddr; 431 437 432 438 if (sys->suggested_vulkan_physical_device != createInfo->vulkanPhysicalDevice) { 433 439 return oxr_error(&log, XR_ERROR_HANDLE_INVALID,
+7 -1
src/xrt/state_trackers/oxr/oxr_objects.h
··· 1 1 // Copyright 2018-2024, Collabora, Ltd. 2 - // Copyright 2023, NVIDIA CORPORATION. 2 + // Copyright 2023-2025, NVIDIA CORPORATION. 3 3 // SPDX-License-Identifier: BSL-1.0 4 4 /*! 5 5 * @file ··· 1529 1529 //! The device returned with the last xrGetVulkanGraphicsDeviceKHR or xrGetVulkanGraphicsDevice2KHR call. 1530 1530 //! XR_NULL_HANDLE if neither has been called. 1531 1531 VkPhysicalDevice suggested_vulkan_physical_device; 1532 + 1533 + /*! 1534 + * Stores the vkGetInstanceProcAddr passed to xrCreateVulkanInstanceKHR to be 1535 + * used when looking up Vulkan functions used by xrGetVulkanGraphicsDevice2KHR. 1536 + */ 1537 + PFN_vkGetInstanceProcAddr vk_get_instance_proc_addr; 1532 1538 1533 1539 struct 1534 1540 {
+1
src/xrt/state_trackers/oxr/oxr_system.c
··· 121 121 #ifdef XR_USE_GRAPHICS_API_VULKAN 122 122 sys->vulkan_enable2_instance = VK_NULL_HANDLE; 123 123 sys->suggested_vulkan_physical_device = VK_NULL_HANDLE; 124 + sys->vk_get_instance_proc_addr = VK_NULL_HANDLE; 124 125 #endif 125 126 #if defined(XR_USE_GRAPHICS_API_D3D11) || defined(XR_USE_GRAPHICS_API_D3D12) 126 127 U_ZERO(&(sys->suggested_d3d_luid));