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",
|
"xrGetD3D12GraphicsRequirementsKHR",
|
||||||
"xrGetVulkanGraphicsDeviceKHR",
|
"xrGetVulkanGraphicsDeviceKHR",
|
||||||
"xrGetVulkanGraphicsDevice2KHR",
|
"xrGetVulkanGraphicsDevice2KHR",
|
||||||
"xrGetVulkanDeviceExtensionsKHR",
|
|
||||||
"xrGetVulkanInstanceExtensionsKHR",
|
"xrGetVulkanInstanceExtensionsKHR",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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, ¶ms);
|
_status = UNIX_CALL(xrGetVulkanDeviceExtensionsKHR, ¶ms);
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 */
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user