Allows running more tests with nulldrv, including some D3D tests with vulkan renderer.
-- v3: win32u: Use VK_EXT_headless_surface for nulldrv surface. win32u: Pass a vulkan_instance pointer to vulkan_surface_create. winevulkan: Enable the VK_EXT_headless_surface extension. winevulkan: Generate function pointers for required funcs.
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winevulkan/make_vulkan | 4 ++-- include/wine/vulkan.h | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 64233268cf1..4029a87c6a4 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -3117,7 +3117,7 @@ class VkGenerator(object): f.write("#define ALL_VK_DEVICE_FUNCS \\n") first = True for vk_func in self.registry.device_funcs: - if not vk_func.needs_exposing(): + if not vk_func.is_required(): continue
if not vk_func.needs_dispatch(): @@ -3134,7 +3134,7 @@ class VkGenerator(object): f.write("#define ALL_VK_INSTANCE_FUNCS \\n") first = True for vk_func in self.registry.instance_funcs + self.registry.phys_dev_funcs: - if not vk_func.needs_exposing(): + if not vk_func.is_required(): continue
if not vk_func.needs_dispatch(): diff --git a/include/wine/vulkan.h b/include/wine/vulkan.h index fc729251b44..f38f193cd5a 100644 --- a/include/wine/vulkan.h +++ b/include/wine/vulkan.h @@ -19407,6 +19407,8 @@ VkResult VKAPI_CALL vkWriteMicromapsPropertiesEXT(VkDevice device, uint32_t micr USE_VK_FUNC(vkGetImageViewOpaqueCaptureDescriptorDataEXT) \ USE_VK_FUNC(vkGetLatencyTimingsNV) \ USE_VK_FUNC(vkGetMemoryHostPointerPropertiesEXT) \ + USE_VK_FUNC(vkGetMemoryWin32HandleKHR) \ + USE_VK_FUNC(vkGetMemoryWin32HandlePropertiesKHR) \ USE_VK_FUNC(vkGetMicromapBuildSizesEXT) \ USE_VK_FUNC(vkGetPartitionedAccelerationStructuresBuildSizesNV) \ USE_VK_FUNC(vkGetPerformanceParameterINTEL) \
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winevulkan/make_vulkan | 2 +- include/wine/vulkan.h | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 4029a87c6a4..e8aa5c8c1c0 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -88,7 +88,6 @@ EXT_BLOCK_SIZE = 1000
UNSUPPORTED_EXTENSIONS = [ # Instance extensions - "VK_EXT_headless_surface", # Needs WSI work. "VK_KHR_display", # Needs WSI work. "VK_KHR_surface_protected_capabilities", "VK_LUNARG_direct_driver_loading", # Implemented in the Vulkan loader @@ -130,6 +129,7 @@ UNSUPPORTED_EXTENSIONS = [ UNEXPOSED_EXTENSIONS = { "VK_EXT_map_memory_placed", "VK_KHR_external_memory_win32", + "VK_EXT_headless_surface", }
# The Vulkan loader provides entry-points for core functionality and important diff --git a/include/wine/vulkan.h b/include/wine/vulkan.h index f38f193cd5a..3977590cc81 100644 --- a/include/wine/vulkan.h +++ b/include/wine/vulkan.h @@ -415,6 +415,8 @@ #define VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME "VK_KHR_uniform_buffer_standard_layout" #define VK_EXT_PROVOKING_VERTEX_SPEC_VERSION 1 #define VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME "VK_EXT_provoking_vertex" +#define VK_EXT_HEADLESS_SURFACE_SPEC_VERSION 1 +#define VK_EXT_HEADLESS_SURFACE_EXTENSION_NAME "VK_EXT_headless_surface" #define VK_KHR_BUFFER_DEVICE_ADDRESS_SPEC_VERSION 1 #define VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME "VK_KHR_buffer_device_address" #define VK_EXT_LINE_RASTERIZATION_SPEC_VERSION 1 @@ -5386,6 +5388,7 @@ typedef enum VkStructureType VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT = 1000254000, VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT = 1000254001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT = 1000254002, + VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT = 1000256000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES = 1000257000, VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO = 1000257002, VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO = 1000257003, @@ -8927,6 +8930,13 @@ typedef struct VkHdrVividDynamicMetadataHUAWEI const void *pDynamicMetadata; } VkHdrVividDynamicMetadataHUAWEI;
+typedef struct VkHeadlessSurfaceCreateInfoEXT +{ + VkStructureType sType; + const void *pNext; + VkHeadlessSurfaceCreateFlagsEXT flags; +} VkHeadlessSurfaceCreateInfoEXT; + typedef struct VkHostImageCopyDevicePerformanceQuery { VkStructureType sType; @@ -17973,6 +17983,7 @@ typedef VkResult (VKAPI_PTR *PFN_vkCreateEvent)(VkDevice, const VkEventCreateInf typedef VkResult (VKAPI_PTR *PFN_vkCreateFence)(VkDevice, const VkFenceCreateInfo *, const VkAllocationCallbacks *, VkFence *); typedef VkResult (VKAPI_PTR *PFN_vkCreateFramebuffer)(VkDevice, const VkFramebufferCreateInfo *, const VkAllocationCallbacks *, VkFramebuffer *); typedef VkResult (VKAPI_PTR *PFN_vkCreateGraphicsPipelines)(VkDevice, VkPipelineCache, uint32_t, const VkGraphicsPipelineCreateInfo *, const VkAllocationCallbacks *, VkPipeline *); +typedef VkResult (VKAPI_PTR *PFN_vkCreateHeadlessSurfaceEXT)(VkInstance, const VkHeadlessSurfaceCreateInfoEXT *, const VkAllocationCallbacks *, VkSurfaceKHR *); typedef VkResult (VKAPI_PTR *PFN_vkCreateImage)(VkDevice, const VkImageCreateInfo *, const VkAllocationCallbacks *, VkImage *); typedef VkResult (VKAPI_PTR *PFN_vkCreateImageView)(VkDevice, const VkImageViewCreateInfo *, const VkAllocationCallbacks *, VkImageView *); typedef VkResult (VKAPI_PTR *PFN_vkCreateIndirectCommandsLayoutEXT)(VkDevice, const VkIndirectCommandsLayoutCreateInfoEXT *, const VkAllocationCallbacks *, VkIndirectCommandsLayoutEXT *); @@ -18615,6 +18626,7 @@ VkResult VKAPI_CALL vkCreateEvent(VkDevice device, const VkEventCreateInfo *pCre VkResult VKAPI_CALL vkCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFence *pFence); VkResult VKAPI_CALL vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer); VkResult VKAPI_CALL vkCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines); +VkResult VKAPI_CALL vkCreateHeadlessSurfaceEXT(VkInstance instance, const VkHeadlessSurfaceCreateInfoEXT *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface); VkResult VKAPI_CALL vkCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkImage *pImage); VkResult VKAPI_CALL vkCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkImageView *pView); VkResult VKAPI_CALL vkCreateIndirectCommandsLayoutEXT(VkDevice device, const VkIndirectCommandsLayoutCreateInfoEXT *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkIndirectCommandsLayoutEXT *pIndirectCommandsLayout); @@ -19508,6 +19520,7 @@ VkResult VKAPI_CALL vkWriteMicromapsPropertiesEXT(VkDevice device, uint32_t micr #define ALL_VK_INSTANCE_FUNCS \ USE_VK_FUNC(vkCreateDebugReportCallbackEXT) \ USE_VK_FUNC(vkCreateDebugUtilsMessengerEXT) \ + USE_VK_FUNC(vkCreateHeadlessSurfaceEXT) \ USE_VK_FUNC(vkCreateWin32SurfaceKHR) \ USE_VK_FUNC(vkDebugReportMessageEXT) \ USE_VK_FUNC(vkDestroyDebugReportCallbackEXT) \
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/vulkan.c | 7 +++---- dlls/winemac.drv/vulkan.c | 6 +++--- dlls/winewayland.drv/vulkan.c | 4 ++-- dlls/winex11.drv/vulkan.c | 4 ++-- include/wine/vulkan_driver.h | 4 ++-- 5 files changed, 12 insertions(+), 13 deletions(-)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 6d8a5ef1b29..09a44e6b6f5 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -101,8 +101,7 @@ static VkResult win32u_vkCreateWin32SurfaceKHR( VkInstance client_instance, cons surface->hwnd = dummy; }
- if ((res = driver_funcs->p_vulkan_surface_create( surface->hwnd, instance->host.instance, - &host_surface, &surface->driver_private ))) + if ((res = driver_funcs->p_vulkan_surface_create( surface->hwnd, instance, &host_surface, &surface->driver_private ))) { if (dummy) NtUserDestroyWindow( dummy ); free( surface ); @@ -509,7 +508,7 @@ static struct vulkan_funcs vulkan_funcs = .p_get_host_surface_extension = win32u_get_host_surface_extension, };
-static VkResult nulldrv_vulkan_surface_create( HWND hwnd, VkInstance instance, VkSurfaceKHR *surface, void **private ) +static VkResult nulldrv_vulkan_surface_create( HWND hwnd, const struct vulkan_instance *instance, VkSurfaceKHR *surface, void **private ) { FIXME( "stub!\n" ); return VK_ERROR_INCOMPATIBLE_DRIVER; @@ -573,7 +572,7 @@ static void vulkan_driver_load(void) pthread_once( &init_once, vulkan_driver_init ); }
-static VkResult lazydrv_vulkan_surface_create( HWND hwnd, VkInstance instance, VkSurfaceKHR *surface, void **private ) +static VkResult lazydrv_vulkan_surface_create( HWND hwnd, const struct vulkan_instance *instance, VkSurfaceKHR *surface, void **private ) { vulkan_driver_load(); return driver_funcs->p_vulkan_surface_create( hwnd, instance, surface, private ); diff --git a/dlls/winemac.drv/vulkan.c b/dlls/winemac.drv/vulkan.c index 8b375b6a53c..d08b8ec12ab 100644 --- a/dlls/winemac.drv/vulkan.c +++ b/dlls/winemac.drv/vulkan.c @@ -88,7 +88,7 @@ static void wine_vk_surface_destroy(struct wine_vk_surface *surface) free(surface); }
-static VkResult macdrv_vulkan_surface_create(HWND hwnd, VkInstance instance, VkSurfaceKHR *surface, void **private) +static VkResult macdrv_vulkan_surface_create(HWND hwnd, const struct vulkan_instance *instance, VkSurfaceKHR *surface, void **private) { VkResult res; struct wine_vk_surface *mac_surface; @@ -135,7 +135,7 @@ static VkResult macdrv_vulkan_surface_create(HWND hwnd, VkInstance instance, VkS create_info_host.flags = 0; /* reserved */ create_info_host.pLayer = macdrv_view_get_metal_layer(mac_surface->view);
- res = pvkCreateMetalSurfaceEXT(instance, &create_info_host, NULL /* allocator */, surface); + res = pvkCreateMetalSurfaceEXT(instance->host.instance, &create_info_host, NULL /* allocator */, surface); } else { @@ -145,7 +145,7 @@ static VkResult macdrv_vulkan_surface_create(HWND hwnd, VkInstance instance, VkS create_info_host.flags = 0; /* reserved */ create_info_host.pView = macdrv_view_get_metal_layer(mac_surface->view);
- res = pvkCreateMacOSSurfaceMVK(instance, &create_info_host, NULL /* allocator */, surface); + res = pvkCreateMacOSSurfaceMVK(instance->host.instance, &create_info_host, NULL /* allocator */, surface); } if (res != VK_SUCCESS) { diff --git a/dlls/winewayland.drv/vulkan.c b/dlls/winewayland.drv/vulkan.c index 3ac23676f0d..4774f11771c 100644 --- a/dlls/winewayland.drv/vulkan.c +++ b/dlls/winewayland.drv/vulkan.c @@ -66,7 +66,7 @@ static void wine_vk_surface_destroy(struct wayland_client_surface *client) if (data) wayland_win_data_release(data); }
-static VkResult wayland_vulkan_surface_create(HWND hwnd, VkInstance instance, VkSurfaceKHR *surface, void **private) +static VkResult wayland_vulkan_surface_create(HWND hwnd, const struct vulkan_instance *instance, VkSurfaceKHR *surface, void **private) { VkResult res; VkWaylandSurfaceCreateInfoKHR create_info_host; @@ -86,7 +86,7 @@ static VkResult wayland_vulkan_surface_create(HWND hwnd, VkInstance instance, Vk create_info_host.display = process_wayland.wl_display; create_info_host.surface = client->wl_surface;
- res = pvkCreateWaylandSurfaceKHR(instance, &create_info_host, + res = pvkCreateWaylandSurfaceKHR(instance->host.instance, &create_info_host, NULL /* allocator */, surface); if (res != VK_SUCCESS) diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index e462559ea82..f4442803788 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -80,7 +80,7 @@ static void vulkan_surface_destroy( HWND hwnd, struct x11drv_vulkan_surface *sur free( surface ); }
-static VkResult X11DRV_vulkan_surface_create( HWND hwnd, VkInstance instance, VkSurfaceKHR *handle, void **private ) +static VkResult X11DRV_vulkan_surface_create( HWND hwnd, const struct vulkan_instance *instance, VkSurfaceKHR *handle, void **private ) { VkXlibSurfaceCreateInfoKHR info = { @@ -105,7 +105,7 @@ static VkResult X11DRV_vulkan_surface_create( HWND hwnd, VkInstance instance, Vk NtUserGetClientRect( hwnd, &surface->rect, NtUserGetDpiForWindow( hwnd ) );
info.window = surface->window; - if (pvkCreateXlibSurfaceKHR( instance, &info, NULL /* allocator */, handle )) + if (pvkCreateXlibSurfaceKHR( instance->host.instance, &info, NULL /* allocator */, handle )) { ERR("Failed to create Xlib surface\n"); vulkan_surface_destroy( hwnd, surface ); diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index 4b4908f201e..cef551cf670 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -46,7 +46,7 @@ struct vulkan_client_object #include "wine/rbtree.h"
/* Wine internal vulkan driver version, needs to be bumped upon vulkan_funcs changes. */ -#define WINE_VULKAN_DRIVER_VERSION 35 +#define WINE_VULKAN_DRIVER_VERSION 36
struct vulkan_object { @@ -175,7 +175,7 @@ struct vulkan_funcs /* interface between win32u and the user drivers */ struct vulkan_driver_funcs { - VkResult (*p_vulkan_surface_create)(HWND, VkInstance, VkSurfaceKHR *, void **); + VkResult (*p_vulkan_surface_create)(HWND, const struct vulkan_instance *, VkSurfaceKHR *, void **); void (*p_vulkan_surface_destroy)(HWND, void *); void (*p_vulkan_surface_detach)(HWND, void *); void (*p_vulkan_surface_update)(HWND, void *);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/vulkan.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 09a44e6b6f5..3cd6abede18 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -510,8 +510,8 @@ static struct vulkan_funcs vulkan_funcs =
static VkResult nulldrv_vulkan_surface_create( HWND hwnd, const struct vulkan_instance *instance, VkSurfaceKHR *surface, void **private ) { - FIXME( "stub!\n" ); - return VK_ERROR_INCOMPATIBLE_DRIVER; + VkHeadlessSurfaceCreateInfoEXT create_info = {.sType = VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT}; + return instance->p_vkCreateHeadlessSurfaceEXT( instance->host.instance, &create_info, NULL, surface ); }
static void nulldrv_vulkan_surface_destroy( HWND hwnd, void *private ) @@ -537,7 +537,7 @@ static VkBool32 nulldrv_vkGetPhysicalDeviceWin32PresentationSupportKHR( VkPhysic
static const char *nulldrv_get_host_surface_extension(void) { - return "VK_WINE_nulldrv_surface"; + return "VK_EXT_headless_surface"; }
static const struct vulkan_driver_funcs nulldrv_funcs =
This merge request was approved by Jacek Caban.