mirror of
https://github.com/ValveSoftware/Proton.git
synced 2025-03-27 04:39:09 +03:00
wineopenxr: Call extra init-related functions from wine_xrCreateSession().
Based on a patch by Andrew Eikum.
This commit is contained in:
parent
832c366ac3
commit
5c1f2bc209
@ -453,6 +453,7 @@ XrResult load_host_openxr_loader(void)
|
|||||||
res = pxrGetVulkanGraphicsDeviceKHR(instance, system, vk_instance, &vk_physdev);
|
res = pxrGetVulkanGraphicsDeviceKHR(instance, system, vk_instance, &vk_physdev);
|
||||||
if(res != XR_SUCCESS){
|
if(res != XR_SUCCESS){
|
||||||
WINE_WARN("xrGetVulkanGraphicsDeviceKHR failed: %d\n", res);
|
WINE_WARN("xrGetVulkanGraphicsDeviceKHR failed: %d\n", res);
|
||||||
|
vkDestroyInstance(vk_instance, NULL);
|
||||||
xrDestroyInstance(instance);
|
xrDestroyInstance(instance);
|
||||||
heap_free(g_instance_extensions);
|
heap_free(g_instance_extensions);
|
||||||
g_instance_extensions = NULL;
|
g_instance_extensions = NULL;
|
||||||
@ -466,6 +467,7 @@ XrResult load_host_openxr_loader(void)
|
|||||||
res = pxrGetVulkanDeviceExtensionsKHR(instance, system, 0, &len, NULL);
|
res = pxrGetVulkanDeviceExtensionsKHR(instance, system, 0, &len, NULL);
|
||||||
if(res != XR_SUCCESS){
|
if(res != XR_SUCCESS){
|
||||||
WINE_WARN("pxrGetVulkanDeviceExtensionsKHR fail: %d\n", res);
|
WINE_WARN("pxrGetVulkanDeviceExtensionsKHR fail: %d\n", res);
|
||||||
|
vkDestroyInstance(vk_instance, NULL);
|
||||||
xrDestroyInstance(instance);
|
xrDestroyInstance(instance);
|
||||||
heap_free(g_instance_extensions);
|
heap_free(g_instance_extensions);
|
||||||
g_instance_extensions = NULL;
|
g_instance_extensions = NULL;
|
||||||
@ -475,6 +477,7 @@ XrResult load_host_openxr_loader(void)
|
|||||||
res = pxrGetVulkanDeviceExtensionsKHR(instance, system, len, &len, g_device_extensions);
|
res = pxrGetVulkanDeviceExtensionsKHR(instance, system, len, &len, g_device_extensions);
|
||||||
if(res != XR_SUCCESS){
|
if(res != XR_SUCCESS){
|
||||||
WINE_WARN("pxrGetVulkanDeviceExtensionsKHR fail: %d\n", res);
|
WINE_WARN("pxrGetVulkanDeviceExtensionsKHR fail: %d\n", res);
|
||||||
|
vkDestroyInstance(vk_instance, NULL);
|
||||||
xrDestroyInstance(instance);
|
xrDestroyInstance(instance);
|
||||||
heap_free(g_instance_extensions);
|
heap_free(g_instance_extensions);
|
||||||
g_instance_extensions = NULL;
|
g_instance_extensions = NULL;
|
||||||
@ -738,6 +741,68 @@ XrResult WINAPI wine_xrDestroyInstance(XrInstance instance)
|
|||||||
return XR_SUCCESS;
|
return XR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* SteamVR does some internal init during these functions. */
|
||||||
|
static XrResult do_vulkan_init(wine_XrInstance *wine_instance, VkInstance vk_instance)
|
||||||
|
{
|
||||||
|
char *instance_extensions, *device_extensions;
|
||||||
|
XrGraphicsRequirementsVulkanKHR vk_reqs;
|
||||||
|
XrResult res;
|
||||||
|
uint32_t len;
|
||||||
|
|
||||||
|
vk_reqs.type = XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN_KHR;
|
||||||
|
vk_reqs.next = NULL;
|
||||||
|
res = wine_instance->funcs.p_xrGetVulkanGraphicsRequirementsKHR(wine_instance->instance,
|
||||||
|
wine_instance->systemId, &vk_reqs);
|
||||||
|
if(res != XR_SUCCESS)
|
||||||
|
{
|
||||||
|
WINE_WARN("xrGetVulkanGraphicsRequirementsKHR failed: %d\n", res);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = wine_instance->funcs.p_xrGetVulkanInstanceExtensionsKHR(wine_instance->instance,
|
||||||
|
wine_instance->systemId, 0, &len, NULL);
|
||||||
|
if(res != XR_SUCCESS)
|
||||||
|
{
|
||||||
|
WINE_WARN("xrGetVulkanInstanceExtensionsKHR failed: %d\n", res);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
instance_extensions = heap_alloc(len);
|
||||||
|
res = wine_instance->funcs.p_xrGetVulkanInstanceExtensionsKHR(wine_instance->instance, wine_instance->systemId,
|
||||||
|
len, &len, instance_extensions);
|
||||||
|
if(res != XR_SUCCESS)
|
||||||
|
{
|
||||||
|
WINE_WARN("xrGetVulkanInstanceExtensionsKHR failed: %d\n", res);
|
||||||
|
heap_free(instance_extensions);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = wine_instance->funcs.p_xrGetVulkanGraphicsDeviceKHR(wine_instance->instance, wine_instance->systemId,
|
||||||
|
vk_instance, &wine_instance->vk_phys_dev);
|
||||||
|
if(res != XR_SUCCESS)
|
||||||
|
{
|
||||||
|
WINE_WARN("xrGetVulkanGraphicsDeviceKHR failed: %d\n", res);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = wine_instance->funcs.p_xrGetVulkanDeviceExtensionsKHR(wine_instance->instance, wine_instance->systemId, 0, &len, NULL);
|
||||||
|
if(res != XR_SUCCESS)
|
||||||
|
{
|
||||||
|
WINE_WARN("pxrGetVulkanDeviceExtensionsKHR fail: %d\n", res);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
device_extensions = heap_alloc(len);
|
||||||
|
res = wine_instance->funcs.p_xrGetVulkanDeviceExtensionsKHR(wine_instance->instance, wine_instance->systemId, len, &len, device_extensions);
|
||||||
|
if(res != XR_SUCCESS)
|
||||||
|
{
|
||||||
|
WINE_WARN("pxrGetVulkanDeviceExtensionsKHR fail: %d\n", res);
|
||||||
|
heap_free(device_extensions);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
heap_free(device_extensions);
|
||||||
|
|
||||||
|
return XR_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
XrResult WINAPI wine_xrCreateSession(XrInstance instance, const XrSessionCreateInfo *createInfo, XrSession *session)
|
XrResult WINAPI wine_xrCreateSession(XrInstance instance, const XrSessionCreateInfo *createInfo, XrSession *session)
|
||||||
{
|
{
|
||||||
wine_XrInstance *wine_instance = (wine_XrInstance *)instance;
|
wine_XrInstance *wine_instance = (wine_XrInstance *)instance;
|
||||||
@ -786,7 +851,14 @@ XrResult WINAPI wine_xrCreateSession(XrInstance instance, const XrSessionCreateI
|
|||||||
NULL, &our_vk_binding.queueIndex, &our_vk_binding.queueFamilyIndex);
|
NULL, &our_vk_binding.queueIndex, &our_vk_binding.queueFamilyIndex);
|
||||||
|
|
||||||
our_vk_binding.instance = get_native_VkInstance(our_vk_binding.instance);
|
our_vk_binding.instance = get_native_VkInstance(our_vk_binding.instance);
|
||||||
our_vk_binding.physicalDevice = get_native_VkPhysicalDevice(our_vk_binding.physicalDevice);
|
|
||||||
|
if ((res = do_vulkan_init(wine_instance, our_vk_binding.instance)) != XR_SUCCESS)
|
||||||
|
return res;
|
||||||
|
|
||||||
|
if (wine_instance->vk_phys_dev != our_vk_binding.physicalDevice)
|
||||||
|
WINE_WARN("VK physical device does not match that from xrGetVulkanGraphicsDeviceKHR.\n");
|
||||||
|
|
||||||
|
our_vk_binding.physicalDevice = wine_instance->vk_phys_dev;
|
||||||
our_vk_binding.device = get_native_VkDevice(our_vk_binding.device);
|
our_vk_binding.device = get_native_VkDevice(our_vk_binding.device);
|
||||||
|
|
||||||
our_create_info = *createInfo;
|
our_create_info = *createInfo;
|
||||||
@ -1124,20 +1196,10 @@ XrResult WINAPI wine_xrGetSystem(XrInstance instance, const XrSystemGetInfo *get
|
|||||||
WINE_TRACE("%p, %p, %p\n", instance, getInfo, systemId);
|
WINE_TRACE("%p, %p, %p\n", instance, getInfo, systemId);
|
||||||
|
|
||||||
res = wine_instance->funcs.p_xrGetSystem(wine_instance->instance, getInfo, systemId);
|
res = wine_instance->funcs.p_xrGetSystem(wine_instance->instance, getInfo, systemId);
|
||||||
if(res == XR_SUCCESS){
|
if(res != XR_SUCCESS)
|
||||||
XrGraphicsRequirementsVulkanKHR vk_reqs;
|
return res;
|
||||||
|
|
||||||
wine_instance->systemId = *systemId;
|
|
||||||
|
|
||||||
/* required to call before graphics init stuff happens, so i stuck it here. */
|
|
||||||
vk_reqs.type = XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN_KHR;
|
|
||||||
res = wine_instance->funcs.p_xrGetVulkanGraphicsRequirementsKHR(wine_instance->instance, *systemId, &vk_reqs);
|
|
||||||
if(res != XR_SUCCESS){
|
|
||||||
WINE_WARN("xrGetVulkanGraphicsRequirementsKHR failed: %d\n", res);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
wine_instance->systemId = *systemId;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user