From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winevulkan/loader_thunks.c | 14 +++++++++ dlls/winevulkan/loader_thunks.h | 10 +++++++ dlls/winevulkan/make_vulkan | 3 +- dlls/winevulkan/vulkan_thunks.c | 52 +++++++++++++++++++++++++++++++++ include/wine/vulkan.h | 13 +++++++++ 5 files changed, 90 insertions(+), 2 deletions(-)
diff --git a/dlls/winevulkan/loader_thunks.c b/dlls/winevulkan/loader_thunks.c index 184d13fd977..0aab3aafdd9 100644 --- a/dlls/winevulkan/loader_thunks.c +++ b/dlls/winevulkan/loader_thunks.c @@ -3191,6 +3191,19 @@ VkResult WINAPI vkCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipel return params.result; }
+VkResult WINAPI vkCreateHeadlessSurfaceEXT(VkInstance instance, const VkHeadlessSurfaceCreateInfoEXT *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) +{ + struct vkCreateHeadlessSurfaceEXT_params params; + NTSTATUS status; + params.instance = instance; + params.pCreateInfo = pCreateInfo; + params.pAllocator = pAllocator; + params.pSurface = pSurface; + status = UNIX_CALL(vkCreateHeadlessSurfaceEXT, ¶ms); + assert(!status && "vkCreateHeadlessSurfaceEXT"); + return params.result; +} + VkResult WINAPI vkCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkImage *pImage) { struct vkCreateImage_params params; @@ -7435,6 +7448,7 @@ static const struct vulkan_func vk_instance_dispatch_table[] = { {"vkCreateDebugReportCallbackEXT", vkCreateDebugReportCallbackEXT}, {"vkCreateDebugUtilsMessengerEXT", vkCreateDebugUtilsMessengerEXT}, + {"vkCreateHeadlessSurfaceEXT", vkCreateHeadlessSurfaceEXT}, {"vkCreateWin32SurfaceKHR", vkCreateWin32SurfaceKHR}, {"vkDebugReportMessageEXT", vkDebugReportMessageEXT}, {"vkDestroyDebugReportCallbackEXT", vkDestroyDebugReportCallbackEXT}, diff --git a/dlls/winevulkan/loader_thunks.h b/dlls/winevulkan/loader_thunks.h index ec7b9645e5b..b85fd2890c8 100644 --- a/dlls/winevulkan/loader_thunks.h +++ b/dlls/winevulkan/loader_thunks.h @@ -344,6 +344,7 @@ enum unix_call unix_vkCreateFence, unix_vkCreateFramebuffer, unix_vkCreateGraphicsPipelines, + unix_vkCreateHeadlessSurfaceEXT, unix_vkCreateImage, unix_vkCreateImageView, unix_vkCreateIndirectCommandsLayoutEXT, @@ -3113,6 +3114,15 @@ struct vkCreateGraphicsPipelines_params VkResult result; };
+struct vkCreateHeadlessSurfaceEXT_params +{ + VkInstance instance; + const VkHeadlessSurfaceCreateInfoEXT *pCreateInfo; + const VkAllocationCallbacks *pAllocator; + VkSurfaceKHR *pSurface; + VkResult result; +}; + struct vkCreateImage_params { VkDevice device; diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 64233268cf1..b3a2eb29987 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 @@ -1976,7 +1975,7 @@ class VkParam(VkVariable): unwrap_handle = "wine_vk_unwrap_handle({0}{1}, {0}{2})".format( params_prefix, self.object_type, self.name)
- elif self.is_handle(): + elif self.is_handle() and not self.is_pointer(): # We need to pass the host handle to the host Vulkan calls and # the wine driver's handle to calls which are wrapped by the driver. unwrap_handle = self.handle.unwrap_handle(p, unwrap) diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c index d4e415fd056..ba83e28bfab 100644 --- a/dlls/winevulkan/vulkan_thunks.c +++ b/dlls/winevulkan/vulkan_thunks.c @@ -5063,6 +5063,13 @@ typedef struct VkGraphicsPipelineCreateInfo32 int32_t basePipelineIndex; } VkGraphicsPipelineCreateInfo32;
+typedef struct VkHeadlessSurfaceCreateInfoEXT32 +{ + VkStructureType sType; + PTR32 pNext; + VkHeadlessSurfaceCreateFlagsEXT flags; +} VkHeadlessSurfaceCreateInfoEXT32; + typedef struct VkDedicatedAllocationImageCreateInfoNV32 { VkStructureType sType; @@ -22319,6 +22326,17 @@ static inline void convert_VkGraphicsPipelineCreateInfo_array_host_to_win32(cons } }
+static inline void convert_VkHeadlessSurfaceCreateInfoEXT_win32_to_host(const VkHeadlessSurfaceCreateInfoEXT32 *in, VkHeadlessSurfaceCreateInfoEXT *out) +{ + if (!in) return; + + out->sType = in->sType; + out->pNext = NULL; + out->flags = in->flags; + if (in->pNext) + FIXME("Unexpected pNext\n"); +} + #ifdef _WIN64 static inline void convert_VkImageCreateInfo_win64_to_host(struct conversion_context *ctx, const VkImageCreateInfo *in, VkImageCreateInfo *out) { @@ -46136,6 +46154,37 @@ static NTSTATUS thunk32_vkCreateGraphicsPipelines(void *args) return STATUS_SUCCESS; }
+#ifdef _WIN64 +static NTSTATUS thunk64_vkCreateHeadlessSurfaceEXT(void *args) +{ + struct vkCreateHeadlessSurfaceEXT_params *params = args; + + TRACE("%p, %p, %p, %p\n", params->instance, params->pCreateInfo, params->pAllocator, params->pSurface); + + params->result = vulkan_instance_from_handle(params->instance)->p_vkCreateHeadlessSurfaceEXT(vulkan_instance_from_handle(params->instance)->host.instance, params->pCreateInfo, NULL, params->pSurface); + return STATUS_SUCCESS; +} +#endif /* _WIN64 */ + +static NTSTATUS thunk32_vkCreateHeadlessSurfaceEXT(void *args) +{ + struct + { + PTR32 instance; + PTR32 pCreateInfo; + PTR32 pAllocator; + PTR32 pSurface; + VkResult result; + } *params = args; + VkHeadlessSurfaceCreateInfoEXT pCreateInfo_host; + + TRACE("%#x, %#x, %#x, %#x\n", params->instance, params->pCreateInfo, params->pAllocator, params->pSurface); + + convert_VkHeadlessSurfaceCreateInfoEXT_win32_to_host((const VkHeadlessSurfaceCreateInfoEXT32 *)UlongToPtr(params->pCreateInfo), &pCreateInfo_host); + params->result = vulkan_instance_from_handle((VkInstance)UlongToPtr(params->instance))->p_vkCreateHeadlessSurfaceEXT(vulkan_instance_from_handle((VkInstance)UlongToPtr(params->instance))->host.instance, &pCreateInfo_host, NULL, (VkSurfaceKHR *)UlongToPtr(params->pSurface)); + return STATUS_SUCCESS; +} + #ifdef _WIN64 static NTSTATUS thunk64_vkCreateImage(void *args) { @@ -56450,6 +56499,7 @@ static const char * const vk_instance_extensions[] = { "VK_EXT_debug_report", "VK_EXT_debug_utils", + "VK_EXT_headless_surface", "VK_EXT_layer_settings", "VK_EXT_surface_maintenance1", "VK_EXT_swapchain_colorspace", @@ -56861,6 +56911,7 @@ const unixlib_entry_t __wine_unix_call_funcs[] = thunk64_vkCreateFence, thunk64_vkCreateFramebuffer, thunk64_vkCreateGraphicsPipelines, + thunk64_vkCreateHeadlessSurfaceEXT, thunk64_vkCreateImage, thunk64_vkCreateImageView, thunk64_vkCreateIndirectCommandsLayoutEXT, @@ -57510,6 +57561,7 @@ const unixlib_entry_t __wine_unix_call_funcs[] = thunk32_vkCreateFence, thunk32_vkCreateFramebuffer, thunk32_vkCreateGraphicsPipelines, + thunk32_vkCreateHeadlessSurfaceEXT, thunk32_vkCreateImage, thunk32_vkCreateImageView, thunk32_vkCreateIndirectCommandsLayoutEXT, diff --git a/include/wine/vulkan.h b/include/wine/vulkan.h index fc729251b44..4384fe49e22 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); @@ -19506,6 +19518,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) \