wineopenxr: Handle Vulkan device extension substitution on the PE side.

CW-Bug-Id: #25451
This commit is contained in:
Paul Gofman 2025-05-26 19:08:31 -06:00
parent 60a86f4792
commit d8fdf091df
5 changed files with 16 additions and 59 deletions

View File

@ -143,7 +143,6 @@ MANUAL_UNIX_THUNKS = {
"xrGetD3D12GraphicsRequirementsKHR", "xrGetD3D12GraphicsRequirementsKHR",
"xrGetVulkanGraphicsDeviceKHR", "xrGetVulkanGraphicsDeviceKHR",
"xrGetVulkanGraphicsDevice2KHR", "xrGetVulkanGraphicsDevice2KHR",
"xrGetVulkanDeviceExtensionsKHR",
"xrGetVulkanInstanceExtensionsKHR", "xrGetVulkanInstanceExtensionsKHR",
} }

View File

@ -233,62 +233,6 @@ XrResult WINAPI wine_xrGetVulkanGraphicsDevice2KHR(XrInstance instance,
return res; 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, XrResult WINAPI wine_xrGetVulkanInstanceExtensionsKHR(XrInstance instance,
XrSystemId systemId, XrSystemId systemId,
uint32_t bufferCapacityInput, uint32_t bufferCapacityInput,

View File

@ -1885,6 +1885,8 @@ XrResult WINAPI xrGetVulkanDeviceExtensionsKHR(XrInstance instance, XrSystemId s
struct xrGetVulkanDeviceExtensionsKHR_params params; struct xrGetVulkanDeviceExtensionsKHR_params params;
NTSTATUS _status; 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.instance = instance;
params.systemId = systemId; params.systemId = systemId;
params.bufferCapacityInput = bufferCapacityInput; params.bufferCapacityInput = bufferCapacityInput;
@ -1893,6 +1895,19 @@ XrResult WINAPI xrGetVulkanDeviceExtensionsKHR(XrInstance instance, XrSystemId s
_status = UNIX_CALL(xrGetVulkanDeviceExtensionsKHR, &params); _status = UNIX_CALL(xrGetVulkanDeviceExtensionsKHR, &params);
assert(!_status && "xrGetVulkanDeviceExtensionsKHR"); 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; return params.result;
} }

View File

@ -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); 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; return STATUS_SUCCESS;
} }
#endif /* _WIN64 */ #endif /* _WIN64 */

View File

@ -29,7 +29,6 @@ XrResult wine_xrCreateInstance(const XrInstanceCreateInfo *createInfo, XrInstanc
XrResult wine_xrCreateSession(XrInstance instance, const XrSessionCreateInfo *createInfo, XrSession *session); XrResult wine_xrCreateSession(XrInstance instance, const XrSessionCreateInfo *createInfo, XrSession *session);
XrResult wine_xrCreateSwapchain(XrSession session, const XrSwapchainCreateInfo *createInfo, XrSwapchain *swapchain); 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_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_xrGetVulkanGraphicsDevice2KHR(XrInstance instance, const XrVulkanGraphicsDeviceGetInfoKHR *getInfo, VkPhysicalDevice *vulkanPhysicalDevice);
XrResult wine_xrGetVulkanGraphicsDeviceKHR(XrInstance instance, XrSystemId systemId, VkInstance vkInstance, VkPhysicalDevice *vkPhysicalDevice); 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); XrResult wine_xrGetVulkanInstanceExtensionsKHR(XrInstance instance, XrSystemId systemId, uint32_t bufferCapacityInput, uint32_t *bufferCountOutput, char *buffer);