From: Rémi Bernon rbernon@codeweavers.com
--- configure.ac | 1 + dlls/winevulkan/make_vulkan | 10 ++++++++++ dlls/winex11.drv/vulkan.c | 38 ++++--------------------------------- include/wine/vulkan.h | 27 +++++++++++++++++++++++++- 4 files changed, 41 insertions(+), 35 deletions(-)
diff --git a/configure.ac b/configure.ac index 2cc5398d178..f5fbbe1bdb6 100644 --- a/configure.ac +++ b/configure.ac @@ -1253,6 +1253,7 @@ then WINE_CHECK_SONAME(Xext,XextCreateExtension,[X_LIBS="$X_LIBS -lXext"],,[$X_LIBS -lX11]) X_LIBS="$X_LIBS -lX11"
+ AC_CHECK_HEADERS([X11/Xlib.h]) xlib_includes="#include <X11/Xlib.h> #include <X11/Xutil.h>"
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 7dc64ce72d8..79cfc778e1b 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -138,6 +138,7 @@ UNEXPOSED_EXTENSIONS = { # Extensions for other platforms "VK_EXT_metal_surface", "VK_KHR_wayland_surface", + "VK_KHR_xlib_surface", "VK_MVK_macos_surface", }
@@ -145,6 +146,7 @@ UNEXPOSED_PLATFORMS = { "macos", "metal", "wayland", + "xlib", }
# The Vulkan loader provides entry-points for core functionality and important @@ -3024,6 +3026,14 @@ class VkGenerator(object): f.write("#define WINE_VK_ALIGN DECLSPEC_ALIGN\n") f.write("#endif\n\n")
+ f.write("#ifdef HAVE_X11_XLIB_H\n") + f.write("#include <X11/Xlib.h>\n") + f.write("#else\n") + f.write("typedef unsigned long Window;\n") + f.write("typedef unsigned long VisualID;\n") + f.write("typedef struct _XDisplay Display;\n") + f.write("#endif\n") + # The overall strategy is to define independent constants and datatypes, # prior to complex structures and function calls to avoid forward declarations. for const in self.registry.consts: diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index f482f41a1e4..86584e50c37 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -44,22 +44,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
-#ifdef SONAME_LIBVULKAN - -#define VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR 1000004000 - -typedef struct VkXlibSurfaceCreateInfoKHR -{ - VkStructureType sType; - const void *pNext; - VkXlibSurfaceCreateFlagsKHR flags; - Display *dpy; - Window window; -} VkXlibSurfaceCreateInfoKHR; - -static VkResult (*pvkCreateXlibSurfaceKHR)(VkInstance, const VkXlibSurfaceCreateInfoKHR *, const VkAllocationCallbacks *, VkSurfaceKHR *); -static VkBool32 (*pvkGetPhysicalDeviceXlibPresentationSupportKHR)(VkPhysicalDevice, uint32_t, Display *, VisualID); - static const struct vulkan_driver_funcs x11drv_vulkan_driver_funcs;
static VkResult X11DRV_vulkan_surface_create( HWND hwnd, const struct vulkan_instance *instance, VkSurfaceKHR *handle, @@ -74,7 +58,7 @@ static VkResult X11DRV_vulkan_surface_create( HWND hwnd, const struct vulkan_ins TRACE( "%p %p %p %p\n", hwnd, instance, handle, client );
if (!(info.window = x11drv_client_surface_create( hwnd, &default_visual, default_colormap, client ))) return VK_ERROR_OUT_OF_HOST_MEMORY; - if (pvkCreateXlibSurfaceKHR( instance->host.instance, &info, NULL /* allocator */, handle )) + if (instance->p_vkCreateXlibSurfaceKHR( instance->host.instance, &info, NULL /* allocator */, handle )) { ERR("Failed to create Xlib surface\n"); client_surface_release( *client ); @@ -87,9 +71,10 @@ static VkResult X11DRV_vulkan_surface_create( HWND hwnd, const struct vulkan_ins
static VkBool32 X11DRV_get_physical_device_presentation_support( struct vulkan_physical_device *physical_device, uint32_t index ) { + struct vulkan_instance *instance = physical_device->instance; TRACE( "%p %u\n", physical_device, index ); - return pvkGetPhysicalDeviceXlibPresentationSupportKHR( physical_device->host.physical_device, index, gdi_display, - default_visual.visual->visualid ); + return instance->p_vkGetPhysicalDeviceXlibPresentationSupportKHR( physical_device->host.physical_device, index, gdi_display, + default_visual.visual->visualid ); }
static const char *X11DRV_get_host_surface_extension(void) @@ -112,21 +97,6 @@ UINT X11DRV_VulkanInit( UINT version, void *vulkan_handle, const struct vulkan_d return STATUS_INVALID_PARAMETER; }
-#define LOAD_FUNCPTR( f ) if (!(p##f = dlsym( vulkan_handle, #f ))) return STATUS_PROCEDURE_NOT_FOUND; - LOAD_FUNCPTR( vkCreateXlibSurfaceKHR ); - LOAD_FUNCPTR( vkGetPhysicalDeviceXlibPresentationSupportKHR ); -#undef LOAD_FUNCPTR - *driver_funcs = &x11drv_vulkan_driver_funcs; return STATUS_SUCCESS; } - -#else /* No vulkan */ - -UINT X11DRV_VulkanInit( UINT version, void *vulkan_handle, const struct vulkan_driver_funcs **driver_funcs ) -{ - ERR( "Wine was built without Vulkan support.\n" ); - return STATUS_NOT_IMPLEMENTED; -} - -#endif /* SONAME_LIBVULKAN */ diff --git a/include/wine/vulkan.h b/include/wine/vulkan.h index c0b2d2fa4c2..af701d1fa46 100644 --- a/include/wine/vulkan.h +++ b/include/wine/vulkan.h @@ -39,6 +39,13 @@ #define WINE_VK_ALIGN DECLSPEC_ALIGN #endif
+#ifdef HAVE_X11_XLIB_H +#include <X11/Xlib.h> +#else +typedef unsigned long Window; +typedef unsigned long VisualID; +typedef struct _XDisplay Display; +#endif #define VK_MAX_PHYSICAL_DEVICE_NAME_SIZE 256 #define VK_UUID_SIZE 16 #define VK_LUID_SIZE 8 @@ -76,6 +83,8 @@ #define VK_KHR_SURFACE_EXTENSION_NAME "VK_KHR_surface" #define VK_KHR_SWAPCHAIN_SPEC_VERSION 70 #define VK_KHR_SWAPCHAIN_EXTENSION_NAME "VK_KHR_swapchain" +#define VK_KHR_XLIB_SURFACE_SPEC_VERSION 6 +#define VK_KHR_XLIB_SURFACE_EXTENSION_NAME "VK_KHR_xlib_surface" #define VK_KHR_WAYLAND_SURFACE_SPEC_VERSION 6 #define VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME "VK_KHR_wayland_surface" #define VK_KHR_WIN32_SURFACE_SPEC_VERSION 6 @@ -5301,6 +5310,7 @@ typedef enum VkStructureType VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_4_PROPERTIES = 56, VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR = 1000001000, VK_STRUCTURE_TYPE_PRESENT_INFO_KHR = 1000001001, + VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR = 1000004000, VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR = 1000006000, VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR = 1000009000, VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT = 1000011000, @@ -16187,6 +16197,15 @@ typedef struct VkXYColorEXT float y; } VkXYColorEXT;
+typedef struct VkXlibSurfaceCreateInfoKHR +{ + VkStructureType sType; + const void *pNext; + VkXlibSurfaceCreateFlagsKHR flags; + Display *dpy; + Window window; +} VkXlibSurfaceCreateInfoKHR; + typedef struct StdVideoAV1ColorConfig { StdVideoAV1ColorConfigFlags flags; @@ -18915,6 +18934,7 @@ typedef VkResult (VKAPI_PTR *PFN_vkCreateVideoSessionKHR)(VkDevice, const VkVide typedef VkResult (VKAPI_PTR *PFN_vkCreateVideoSessionParametersKHR)(VkDevice, const VkVideoSessionParametersCreateInfoKHR *, const VkAllocationCallbacks *, VkVideoSessionParametersKHR *); typedef VkResult (VKAPI_PTR *PFN_vkCreateWaylandSurfaceKHR)(VkInstance, const VkWaylandSurfaceCreateInfoKHR *, const VkAllocationCallbacks *, VkSurfaceKHR *); typedef VkResult (VKAPI_PTR *PFN_vkCreateWin32SurfaceKHR)(VkInstance, const VkWin32SurfaceCreateInfoKHR *, const VkAllocationCallbacks *, VkSurfaceKHR *); +typedef VkResult (VKAPI_PTR *PFN_vkCreateXlibSurfaceKHR)(VkInstance, const VkXlibSurfaceCreateInfoKHR *, const VkAllocationCallbacks *, VkSurfaceKHR *); typedef VkResult (VKAPI_PTR *PFN_vkDebugMarkerSetObjectNameEXT)(VkDevice, const VkDebugMarkerObjectNameInfoEXT *); typedef VkResult (VKAPI_PTR *PFN_vkDebugMarkerSetObjectTagEXT)(VkDevice, const VkDebugMarkerObjectTagInfoEXT *); typedef void (VKAPI_PTR *PFN_vkDebugReportMessageEXT)(VkInstance, VkDebugReportFlagsEXT, VkDebugReportObjectTypeEXT, uint64_t, size_t, int32_t, const char *, const char *); @@ -19120,6 +19140,7 @@ typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceVideoEncodeQualityLevelPrope typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceVideoFormatPropertiesKHR)(VkPhysicalDevice, const VkPhysicalDeviceVideoFormatInfoKHR *, uint32_t *, VkVideoFormatPropertiesKHR *); typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)(VkPhysicalDevice, uint32_t, struct wl_display *); typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)(VkPhysicalDevice, uint32_t); +typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)(VkPhysicalDevice, uint32_t, Display *, VisualID); typedef VkResult (VKAPI_PTR *PFN_vkGetPipelineBinaryDataKHR)(VkDevice, const VkPipelineBinaryDataInfoKHR *, VkPipelineBinaryKeyKHR *, size_t *, void *); typedef VkResult (VKAPI_PTR *PFN_vkGetPipelineCacheData)(VkDevice, VkPipelineCache, size_t *, void *); typedef VkResult (VKAPI_PTR *PFN_vkGetPipelineExecutableInternalRepresentationsKHR)(VkDevice, const VkPipelineExecutableInfoKHR *, uint32_t *, VkPipelineExecutableInternalRepresentationKHR *); @@ -19585,6 +19606,7 @@ VkResult VKAPI_CALL vkCreateVideoSessionKHR(VkDevice device, const VkVideoSessio VkResult VKAPI_CALL vkCreateVideoSessionParametersKHR(VkDevice device, const VkVideoSessionParametersCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkVideoSessionParametersKHR *pVideoSessionParameters); VkResult VKAPI_CALL vkCreateWaylandSurfaceKHR(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface); VkResult VKAPI_CALL vkCreateWin32SurfaceKHR(VkInstance instance, const VkWin32SurfaceCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface); +VkResult VKAPI_CALL vkCreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface); VkResult VKAPI_CALL vkDebugMarkerSetObjectNameEXT(VkDevice device, const VkDebugMarkerObjectNameInfoEXT *pNameInfo); VkResult VKAPI_CALL vkDebugMarkerSetObjectTagEXT(VkDevice device, const VkDebugMarkerObjectTagInfoEXT *pTagInfo); void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t object, size_t location, int32_t messageCode, const char *pLayerPrefix, const char *pMessage); @@ -19790,6 +19812,7 @@ VkResult VKAPI_CALL vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR(VkPh VkResult VKAPI_CALL vkGetPhysicalDeviceVideoFormatPropertiesKHR(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceVideoFormatInfoKHR *pVideoFormatInfo, uint32_t *pVideoFormatPropertyCount, VkVideoFormatPropertiesKHR *pVideoFormatProperties); VkBool32 VKAPI_CALL vkGetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, struct wl_display *display); VkBool32 VKAPI_CALL vkGetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex); +VkBool32 VKAPI_CALL vkGetPhysicalDeviceXlibPresentationSupportKHR(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, Display *dpy, VisualID visualID); VkResult VKAPI_CALL vkGetPipelineBinaryDataKHR(VkDevice device, const VkPipelineBinaryDataInfoKHR *pInfo, VkPipelineBinaryKeyKHR *pPipelineBinaryKey, size_t *pPipelineBinaryDataSize, void *pPipelineBinaryData); VkResult VKAPI_CALL vkGetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize, void *pData); VkResult VKAPI_CALL vkGetPipelineExecutableInternalRepresentationsKHR(VkDevice device, const VkPipelineExecutableInfoKHR *pExecutableInfo, uint32_t *pInternalRepresentationCount, VkPipelineExecutableInternalRepresentationKHR *pInternalRepresentations); @@ -20487,6 +20510,7 @@ VkResult VKAPI_CALL vkWriteMicromapsPropertiesEXT(VkDevice device, uint32_t micr USE_VK_FUNC(vkCreateMetalSurfaceEXT) \ USE_VK_FUNC(vkCreateWaylandSurfaceKHR) \ USE_VK_FUNC(vkCreateWin32SurfaceKHR) \ + USE_VK_FUNC(vkCreateXlibSurfaceKHR) \ USE_VK_FUNC(vkDebugReportMessageEXT) \ USE_VK_FUNC(vkDestroyDebugReportCallbackEXT) \ USE_VK_FUNC(vkDestroyDebugUtilsMessengerEXT) \ @@ -20548,6 +20572,7 @@ VkResult VKAPI_CALL vkWriteMicromapsPropertiesEXT(VkDevice device, uint32_t micr USE_VK_FUNC(vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR) \ USE_VK_FUNC(vkGetPhysicalDeviceVideoFormatPropertiesKHR) \ USE_VK_FUNC(vkGetPhysicalDeviceWaylandPresentationSupportKHR) \ - USE_VK_FUNC(vkGetPhysicalDeviceWin32PresentationSupportKHR) + USE_VK_FUNC(vkGetPhysicalDeviceWin32PresentationSupportKHR) \ + USE_VK_FUNC(vkGetPhysicalDeviceXlibPresentationSupportKHR)
#endif /* __WINE_VULKAN_H */