From d8fdf091dfafac106ccec1b8862f3e30f848a8b5 Mon Sep 17 00:00:00 2001 From: Paul Gofman Date: Mon, 26 May 2025 19:08:31 -0600 Subject: [PATCH] wineopenxr: Handle Vulkan device extension substitution on the PE side. CW-Bug-Id: #25451 --- wineopenxr/make_openxr | 1 - wineopenxr/openxr.c | 56 -------------------------------------- wineopenxr/openxr_loader.c | 15 ++++++++++ wineopenxr/openxr_thunks.c | 2 +- wineopenxr/openxr_thunks.h | 1 - 5 files changed, 16 insertions(+), 59 deletions(-) diff --git a/wineopenxr/make_openxr b/wineopenxr/make_openxr index 9569f99c..1f313d27 100755 --- a/wineopenxr/make_openxr +++ b/wineopenxr/make_openxr @@ -143,7 +143,6 @@ MANUAL_UNIX_THUNKS = { "xrGetD3D12GraphicsRequirementsKHR", "xrGetVulkanGraphicsDeviceKHR", "xrGetVulkanGraphicsDevice2KHR", - "xrGetVulkanDeviceExtensionsKHR", "xrGetVulkanInstanceExtensionsKHR", } diff --git a/wineopenxr/openxr.c b/wineopenxr/openxr.c index 05bf2820..f73d4d77 100644 --- a/wineopenxr/openxr.c +++ b/wineopenxr/openxr.c @@ -233,62 +233,6 @@ XrResult WINAPI wine_xrGetVulkanGraphicsDevice2KHR(XrInstance instance, return res; } -XrResult WINAPI wine_xrGetVulkanDeviceExtensionsKHR(XrInstance instance, - XrSystemId systemId, - uint32_t bufferCapacityInput, - uint32_t *bufferCountOutput, - char *buffer) { - wine_XrInstance *wine_instance = wine_instance_from_handle(instance); - XrResult res; - uint32_t buf_len = 0; - char *buf; - - TRACE("%p, 0x%s, %u, %p, %p\n", instance, wine_dbgstr_longlong(systemId), bufferCapacityInput, bufferCountOutput, - buffer); - - if (!getenv(WINE_VULKAN_DEVICE_EXTENSION_NAME)) { - return g_xr_host_instance_dispatch_table.p_xrGetVulkanDeviceExtensionsKHR( - wine_instance->host_instance, systemId, bufferCapacityInput, bufferCountOutput, buffer); - } - - if (bufferCapacityInput == 0) { - *bufferCountOutput = sizeof(WINE_VULKAN_DEVICE_EXTENSION_NAME); - return XR_SUCCESS; - } - - if (bufferCapacityInput < sizeof(WINE_VULKAN_DEVICE_EXTENSION_NAME)) { - *bufferCountOutput = sizeof(WINE_VULKAN_DEVICE_EXTENSION_NAME); - return XR_ERROR_SIZE_INSUFFICIENT; - } - - res = g_xr_host_instance_dispatch_table.p_xrGetVulkanDeviceExtensionsKHR(wine_instance->host_instance, systemId, 0, - &buf_len, NULL); - if (res != XR_SUCCESS) { - WARN("xrGetVulkanDeviceExtensionsKHR failed: %d\n", res); - return res; - } - - buf = malloc(buf_len); - - res = g_xr_host_instance_dispatch_table.p_xrGetVulkanDeviceExtensionsKHR(wine_instance->host_instance, systemId, - buf_len, &buf_len, buf); - if (res != XR_SUCCESS) { - WARN("xrGetVulkanDeviceExtensionsKHR failed: %d\n", res); - free(buf); - return res; - } - - TRACE("got device extensions: %s\n", buf); - setenv(WINE_VULKAN_DEVICE_VARIABLE, buf, 1); - - free(buf); - - memcpy(buffer, WINE_VULKAN_DEVICE_EXTENSION_NAME, sizeof(WINE_VULKAN_DEVICE_EXTENSION_NAME)); - *bufferCountOutput = sizeof(WINE_VULKAN_DEVICE_EXTENSION_NAME); - - return XR_SUCCESS; -} - XrResult WINAPI wine_xrGetVulkanInstanceExtensionsKHR(XrInstance instance, XrSystemId systemId, uint32_t bufferCapacityInput, diff --git a/wineopenxr/openxr_loader.c b/wineopenxr/openxr_loader.c index ad42dad2..721d3cb6 100644 --- a/wineopenxr/openxr_loader.c +++ b/wineopenxr/openxr_loader.c @@ -1885,6 +1885,8 @@ XrResult WINAPI xrGetVulkanDeviceExtensionsKHR(XrInstance instance, XrSystemId s struct xrGetVulkanDeviceExtensionsKHR_params params; NTSTATUS _status; + /* Even while returning fixed string still call the host function, that is a part of OpenXR over Vulkan + * expected initialization sequence. */ params.instance = instance; params.systemId = systemId; params.bufferCapacityInput = bufferCapacityInput; @@ -1893,6 +1895,19 @@ XrResult WINAPI xrGetVulkanDeviceExtensionsKHR(XrInstance instance, XrSystemId s _status = UNIX_CALL(xrGetVulkanDeviceExtensionsKHR, ¶ms); assert(!_status && "xrGetVulkanDeviceExtensionsKHR"); + if (params.result == XR_SUCCESS && bufferCapacityInput) + { + __wine_set_unix_env(WINE_VULKAN_DEVICE_VARIABLE, buffer); + strcpy(buffer, WINE_VULKAN_DEVICE_EXTENSION_NAME); + *bufferCountOutput = sizeof(WINE_VULKAN_DEVICE_EXTENSION_NAME); + TRACE("returning %s.\n", buffer); + } + else if ((params.result == XR_SUCCESS || params.result == XR_ERROR_SIZE_INSUFFICIENT) + && *bufferCountOutput < sizeof(WINE_VULKAN_DEVICE_EXTENSION_NAME)) + { + *bufferCountOutput = sizeof(WINE_VULKAN_DEVICE_EXTENSION_NAME); + } + return params.result; } diff --git a/wineopenxr/openxr_thunks.c b/wineopenxr/openxr_thunks.c index 20bb33b7..bb1c148a 100644 --- a/wineopenxr/openxr_thunks.c +++ b/wineopenxr/openxr_thunks.c @@ -2652,7 +2652,7 @@ static NTSTATUS thunk64_xrGetVulkanDeviceExtensionsKHR(void *args) TRACE("%p, 0x%s, %u, %p, %p\n", params->instance, wine_dbgstr_longlong(params->systemId), params->bufferCapacityInput, params->bufferCountOutput, params->buffer); - params->result = wine_xrGetVulkanDeviceExtensionsKHR(params->instance, params->systemId, params->bufferCapacityInput, params->bufferCountOutput, params->buffer); + params->result = g_xr_host_instance_dispatch_table.p_xrGetVulkanDeviceExtensionsKHR(wine_instance_from_handle(params->instance)->host_instance, params->systemId, params->bufferCapacityInput, params->bufferCountOutput, params->buffer); return STATUS_SUCCESS; } #endif /* _WIN64 */ diff --git a/wineopenxr/openxr_thunks.h b/wineopenxr/openxr_thunks.h index 270e5093..1d4474fc 100644 --- a/wineopenxr/openxr_thunks.h +++ b/wineopenxr/openxr_thunks.h @@ -29,7 +29,6 @@ XrResult wine_xrCreateInstance(const XrInstanceCreateInfo *createInfo, XrInstanc XrResult wine_xrCreateSession(XrInstance instance, const XrSessionCreateInfo *createInfo, XrSession *session); XrResult wine_xrCreateSwapchain(XrSession session, const XrSwapchainCreateInfo *createInfo, XrSwapchain *swapchain); XrResult wine_xrEnumerateInstanceExtensionProperties(const char *layerName, uint32_t propertyCapacityInput, uint32_t *propertyCountOutput, XrExtensionProperties *properties); -XrResult wine_xrGetVulkanDeviceExtensionsKHR(XrInstance instance, XrSystemId systemId, uint32_t bufferCapacityInput, uint32_t *bufferCountOutput, char *buffer); XrResult wine_xrGetVulkanGraphicsDevice2KHR(XrInstance instance, const XrVulkanGraphicsDeviceGetInfoKHR *getInfo, VkPhysicalDevice *vulkanPhysicalDevice); XrResult wine_xrGetVulkanGraphicsDeviceKHR(XrInstance instance, XrSystemId systemId, VkInstance vkInstance, VkPhysicalDevice *vkPhysicalDevice); XrResult wine_xrGetVulkanInstanceExtensionsKHR(XrInstance instance, XrSystemId systemId, uint32_t bufferCapacityInput, uint32_t *bufferCountOutput, char *buffer);