mirror of
https://github.com/ValveSoftware/Proton.git
synced 2025-06-20 17:40:03 +03:00
wineopenxr: Handle Vulkan device extension substitution on the PE side.
CW-Bug-Id: #25451
This commit is contained in:
parent
60a86f4792
commit
d8fdf091df
@ -143,7 +143,6 @@ MANUAL_UNIX_THUNKS = {
|
||||
"xrGetD3D12GraphicsRequirementsKHR",
|
||||
"xrGetVulkanGraphicsDeviceKHR",
|
||||
"xrGetVulkanGraphicsDevice2KHR",
|
||||
"xrGetVulkanDeviceExtensionsKHR",
|
||||
"xrGetVulkanInstanceExtensionsKHR",
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user