From 2dd0a6fd022bf52e6ca6338745cec1a26763f511 Mon Sep 17 00:00:00 2001 From: Shawn Wallace Date: Fri, 19 Jan 2024 13:57:23 -0500 Subject: [PATCH] wineopenxr: change instance type to session type Graphics in OpenXR are bound by their sessions, not by their instances. https://github.com/ValveSoftware/Proton/pull/7424 --- wineopenxr/openxr.c | 24 +++++++++--------------- wineopenxr/openxr_private.h | 10 +++++----- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/wineopenxr/openxr.c b/wineopenxr/openxr.c index 0a4b9c18..2a1f44a6 100644 --- a/wineopenxr/openxr.c +++ b/wineopenxr/openxr.c @@ -763,7 +763,7 @@ XrResult WINAPI wine_xrCreateInstance(const XrInstanceCreateInfo *createInfo, Xr { XrResult res; struct wine_XrInstance *wine_instance; - uint32_t i, j, count, type = 0; + uint32_t i, j, count = 0; XrInstanceCreateInfo our_createInfo; const char *ext_name; char **new_list; @@ -773,15 +773,6 @@ XrResult WINAPI wine_xrCreateInstance(const XrInstanceCreateInfo *createInfo, Xr WINE_TRACE("Incoming extensions:\n"); for(i = 0; i < createInfo->enabledExtensionCount; ++i){ WINE_TRACE(" -%s\n", createInfo->enabledExtensionNames[i]); - if(!strcmp(createInfo->enabledExtensionNames[i], "XR_KHR_D3D11_enable")){ - type = INSTANCE_TYPE_D3D11; - }else if(!strcmp(createInfo->enabledExtensionNames[i], "XR_KHR_D3D12_enable")){ - type = INSTANCE_TYPE_D3D12; - }else if(!strcmp(createInfo->enabledExtensionNames[i], "XR_KHR_vulkan_enable")){ - type = INSTANCE_TYPE_VULKAN; - }else if(!strcmp(createInfo->enabledExtensionNames[i], "XR_KHR_opengl_enable")){ - type = INSTANCE_TYPE_OPENGL; - } } new_list = heap_alloc(createInfo->enabledExtensionCount * sizeof(*new_list)); @@ -833,7 +824,6 @@ XrResult WINAPI wine_xrCreateInstance(const XrInstanceCreateInfo *createInfo, Xr ALL_XR_INSTANCE_FUNCS() #undef USE_XR_FUNC - wine_instance->instance_type = type; *instance = (XrInstance)wine_instance; cleanup: @@ -934,6 +924,7 @@ XrResult WINAPI wine_xrCreateSession(XrInstance instance, const XrSessionCreateI XrResult res; XrSessionCreateInfo our_create_info; XrGraphicsBindingVulkanKHR our_vk_binding; + uint32_t session_type = 0; WINE_TRACE("%p, %p, %p\n", instance, createInfo, session); @@ -951,6 +942,7 @@ XrResult WINAPI wine_xrCreateSession(XrInstance instance, const XrSessionCreateI our_create_info = *createInfo; our_create_info.next = &our_vk_binding; createInfo = &our_create_info; + session_type = SESSION_TYPE_VULKAN; break; } @@ -988,6 +980,7 @@ XrResult WINAPI wine_xrCreateSession(XrInstance instance, const XrSessionCreateI our_create_info = *createInfo; our_create_info.next = &our_vk_binding; createInfo = &our_create_info; + session_type = SESSION_TYPE_D3D11; break; } @@ -1007,6 +1000,7 @@ XrResult WINAPI wine_xrCreateSession(XrInstance instance, const XrSessionCreateI } wine_session->wine_instance = wine_instance; + wine_session->session_type = session_type; EnterCriticalSection(&session_list_lock); @@ -1964,7 +1958,7 @@ XrResult WINAPI wine_xrEnumerateSwapchainFormats(XrSession session, uint32_t for WINE_TRACE("%p, %u, %p, %p\n", session, formatCapacityInput, formatCountOutput, formats); - if (wine_session->wine_instance->instance_type != INSTANCE_TYPE_D3D11) + if (wine_session->session_type != SESSION_TYPE_D3D11) return xrEnumerateSwapchainFormats(wine_session->session, formatCapacityInput, formatCountOutput, formats); res = xrEnumerateSwapchainFormats(wine_session->session, 0, &real_format_count, NULL); @@ -2012,7 +2006,7 @@ XrResult WINAPI wine_xrCreateSwapchain(XrSession session, const XrSwapchainCreat wine_swapchain = heap_alloc_zero(sizeof(*wine_swapchain)); wine_swapchain->create_info = *createInfo; - if(wine_session->wine_instance->instance_type == INSTANCE_TYPE_D3D11){ + if(wine_session->session_type == SESSION_TYPE_D3D11){ our_createInfo = *createInfo; our_createInfo.format = map_format_dxgi_to_vulkan(createInfo->format); if(our_createInfo.format == VK_FORMAT_UNDEFINED){ @@ -2091,7 +2085,7 @@ XrResult WINAPI wine_xrEnumerateSwapchainImages(XrSwapchain swapchain, uint32_t WINE_TRACE("%p, %u, %p, %p\n", swapchain, imageCapacityInput, imageCountOutput, images); if(images){ - if(wine_instance->instance_type == INSTANCE_TYPE_D3D11){ + if(wine_swapchain->wine_session->session_type == SESSION_TYPE_D3D11){ our_images = heap_alloc(sizeof(*our_images) * imageCapacityInput); for(i = 0; i < imageCapacityInput; ++i){ our_images[i].type = XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR; @@ -2103,7 +2097,7 @@ XrResult WINAPI wine_xrEnumerateSwapchainImages(XrSwapchain swapchain, uint32_t res = xrEnumerateSwapchainImages(wine_swapchain->swapchain, imageCapacityInput, imageCountOutput, images); if(images && res == XR_SUCCESS){ - if(wine_instance->instance_type == INSTANCE_TYPE_D3D11){ + if(wine_swapchain->wine_session->session_type == SESSION_TYPE_D3D11){ XrSwapchainImageD3D11KHR *their_d3d11; D3D11_TEXTURE2D_DESC1 desc; diff --git a/wineopenxr/openxr_private.h b/wineopenxr/openxr_private.h index f7e41f2d..68fec298 100644 --- a/wineopenxr/openxr_private.h +++ b/wineopenxr/openxr_private.h @@ -2,10 +2,10 @@ #include "wine/list.h" -#define INSTANCE_TYPE_VULKAN 1 -#define INSTANCE_TYPE_OPENGL 2 -#define INSTANCE_TYPE_D3D11 3 -#define INSTANCE_TYPE_D3D12 4 +#define SESSION_TYPE_VULKAN 1 +#define SESSION_TYPE_OPENGL 2 +#define SESSION_TYPE_D3D11 3 +#define SESSION_TYPE_D3D12 4 struct IDXGIVkInteropDevice2; typedef struct IDXGIVkInteropDevice2 IDXGIVkInteropDevice2; @@ -17,7 +17,6 @@ typedef struct wine_XrInstance { VkInstance vk_instance; VkPhysicalDevice vk_phys_dev; - uint32_t instance_type; XrSystemId systemId; IDXGIVkInteropDevice2 *dxvk_device; @@ -36,6 +35,7 @@ typedef struct wine_XrSession { XrSession session; struct wine_XrInstance *wine_instance; + uint32_t session_type; struct list entry; uint32_t composition_layer_count;