From 3e47499d6f95c1f3606f4c04be440613f3a4f8f8 Mon Sep 17 00:00:00 2001 From: Paul Gofman Date: Tue, 5 Oct 2021 19:36:07 +0300 Subject: wineopenxr: Export __wineopenxr_get_extensions_internal() function. CW-Bug-ID: #19504 --- wineopenxr/openxr.c | 64 ++++++++++++++++++++++++---------------------- wineopenxr/wineopenxr.spec | 1 + 2 files changed, 35 insertions(+), 30 deletions(-) (limited to 'wineopenxr') diff --git a/wineopenxr/openxr.c b/wineopenxr/openxr.c index ea4a6dda..05198b20 100644 --- a/wineopenxr/openxr.c +++ b/wineopenxr/openxr.c @@ -319,7 +319,8 @@ done: return value == 1; } -XrResult load_host_openxr_loader(void) +int WINAPI __wineopenxr_get_extensions_internal(char **ret_instance_extensions, + char **ret_device_extensions) { PFN_xrGetVulkanInstanceExtensionsKHR pxrGetVulkanInstanceExtensionsKHR; PFN_xrGetSystem pxrGetSystem; @@ -328,6 +329,7 @@ XrResult load_host_openxr_loader(void) PFN_xrGetVulkanGraphicsRequirementsKHR pxrGetVulkanGraphicsRequirementsKHR; PFN_xrGetInstanceProperties pxrGetInstanceProperties; PFN_xrEnumerateViewConfigurations pxrEnumerateViewConfigurations; + char *instance_extensions, *device_extensions; uint32_t len, i; XrInstance instance; XrSystemId system; @@ -341,16 +343,6 @@ XrResult load_host_openxr_loader(void) "XR_KHR_vulkan_enable", }; - if(g_instance_extensions || g_device_extensions) - /* already done */ - return XR_SUCCESS; - - if(!HACK_does_openvr_work()){ - return XR_ERROR_INITIALIZATION_FAILED; - } - - load_vk_unwrappers(); - XrInstanceCreateInfo xrCreateInfo = { .type = XR_TYPE_INSTANCE_CREATE_INFO, .next = NULL, @@ -423,13 +415,12 @@ XrResult load_host_openxr_loader(void) xrDestroyInstance(instance); return res; } - g_instance_extensions = heap_alloc(len); - res = pxrGetVulkanInstanceExtensionsKHR(instance, system, len, &len, g_instance_extensions); + instance_extensions = heap_alloc(len); + res = pxrGetVulkanInstanceExtensionsKHR(instance, system, len, &len, instance_extensions); if(res != XR_SUCCESS){ WINE_WARN("xrGetVulkanInstanceExtensionsKHR failed: %d\n", res); xrDestroyInstance(instance); - heap_free(g_instance_extensions); - g_instance_extensions = NULL; + heap_free(instance_extensions); return res; } @@ -454,7 +445,7 @@ XrResult load_host_openxr_loader(void) .ppEnabledExtensionNames = NULL, }; - parse_extensions(g_instance_extensions, + parse_extensions(instance_extensions, &vk_createinfo.enabledExtensionCount, (char ***)&vk_createinfo.ppEnabledExtensionNames); @@ -465,8 +456,7 @@ XrResult load_host_openxr_loader(void) heap_free((void*)vk_createinfo.ppEnabledExtensionNames[i]); heap_free((void*)vk_createinfo.ppEnabledExtensionNames); xrDestroyInstance(instance); - heap_free(g_instance_extensions); - g_instance_extensions = NULL; + heap_free(instance_extensions); return XR_ERROR_INITIALIZATION_FAILED; } @@ -479,8 +469,7 @@ XrResult load_host_openxr_loader(void) WINE_WARN("xrGetVulkanGraphicsDeviceKHR failed: %d\n", res); vkDestroyInstance(vk_instance, NULL); xrDestroyInstance(instance); - heap_free(g_instance_extensions); - g_instance_extensions = NULL; + heap_free(instance_extensions); return res; } @@ -493,32 +482,47 @@ XrResult load_host_openxr_loader(void) WINE_WARN("pxrGetVulkanDeviceExtensionsKHR fail: %d\n", res); vkDestroyInstance(vk_instance, NULL); xrDestroyInstance(instance); - heap_free(g_instance_extensions); - g_instance_extensions = NULL; + heap_free(instance_extensions); return res; } - g_device_extensions = heap_alloc(len); - res = pxrGetVulkanDeviceExtensionsKHR(instance, system, len, &len, g_device_extensions); + device_extensions = heap_alloc(len); + res = pxrGetVulkanDeviceExtensionsKHR(instance, system, len, &len, device_extensions); if(res != XR_SUCCESS){ WINE_WARN("pxrGetVulkanDeviceExtensionsKHR fail: %d\n", res); vkDestroyInstance(vk_instance, NULL); xrDestroyInstance(instance); - heap_free(g_instance_extensions); - g_instance_extensions = NULL; - heap_free(g_device_extensions); - g_device_extensions = NULL; + heap_free(instance_extensions); + heap_free(device_extensions); return res; } vkDestroyInstance(vk_instance, NULL); xrDestroyInstance(instance); - WINE_TRACE("Got required instance extensions: %s\n", g_instance_extensions); - WINE_TRACE("Got required device extensions: %s\n", g_device_extensions); + WINE_TRACE("Got required instance extensions: %s\n", instance_extensions); + WINE_TRACE("Got required device extensions: %s\n", device_extensions); + + *ret_instance_extensions = instance_extensions; + *ret_device_extensions = device_extensions; return XR_SUCCESS; } +XrResult load_host_openxr_loader(void) +{ + if(g_instance_extensions || g_device_extensions) + /* already done */ + return XR_SUCCESS; + + if(!HACK_does_openvr_work()){ + return XR_ERROR_INITIALIZATION_FAILED; + } + + load_vk_unwrappers(); + + return __wineopenxr_get_extensions_internal(&g_instance_extensions, &g_device_extensions); +} + XrResult WINAPI wine_xrEnumerateInstanceExtensionProperties(const char *layerName, uint32_t propertyCapacityInput, uint32_t *propertyCountOutput, XrExtensionProperties *properties) { diff --git a/wineopenxr/wineopenxr.spec b/wineopenxr/wineopenxr.spec index b4460ea3..43c30f5e 100644 --- a/wineopenxr/wineopenxr.spec +++ b/wineopenxr/wineopenxr.spec @@ -1,3 +1,4 @@ @ stdcall xrNegotiateLoaderRuntimeInterface(ptr ptr) wine_xrNegotiateLoaderRuntimeInterface @ stdcall __wineopenxr_GetVulkanInstanceExtensions(long ptr ptr) @ stdcall __wineopenxr_GetVulkanDeviceExtensions(long ptr ptr) +@ stdcall __wineopenxr_get_extensions_internal(ptr ptr) -- cgit v1.2.3