From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/vulkan.c | 8 +++ dlls/winevulkan/make_vulkan | 1 - dlls/winevulkan/vulkan_thunks.c | 116 ++++++++++++++++++++++++++++++++ include/wine/vulkan.h | 16 +++++ include/wine/vulkan_driver.h | 2 +- 5 files changed, 141 insertions(+), 2 deletions(-)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index e049d7f2d4b..6e5f81966b8 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -1069,6 +1069,10 @@ static VkResult win32u_vkQueueSubmit( VkQueue client_queue, uint32_t count, cons case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR: break; case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO: break; case VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO: break; + case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR: + FIXME( "VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR not implemented!\n" ); + *next = (*next)->pNext; next = &prev; + break; default: FIXME( "Unhandled sType %u.\n", (*next)->sType ); break; } } @@ -1103,6 +1107,10 @@ static VkResult win32u_vkQueueSubmit2( VkQueue client_queue, uint32_t count, con case VK_STRUCTURE_TYPE_FRAME_BOUNDARY_TENSORS_ARM: break; case VK_STRUCTURE_TYPE_LATENCY_SUBMISSION_PRESENT_ID_NV: break; case VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR: break; + case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR: + FIXME( "VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR not implemented!\n" ); + *next = (*next)->pNext; next = &prev; + break; default: FIXME( "Unhandled sType %u.\n", (*next)->sType ); break; } } diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 2e71d01d1a8..47b3acef9cc 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -104,7 +104,6 @@ UNSUPPORTED_EXTENSIONS = [ "VK_KHR_video_encode_h265", # StdVideoH265HrdParameters cannot be handled "VK_KHR_video_decode_h265", # by struct conversions. "VK_KHR_video_maintenance2", # Also affected by StdVideoH265HrdParameters. - "VK_KHR_win32_keyed_mutex", "VK_NV_external_memory_rdma", # Needs shared resources work. "VK_NV_external_compute_queue", # Has a new dispatchable handle
diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c index 9edf176e8d6..7d2ddc5be4c 100644 --- a/dlls/winevulkan/vulkan_thunks.c +++ b/dlls/winevulkan/vulkan_thunks.c @@ -9449,6 +9449,19 @@ typedef struct VkVideoSessionParametersUpdateInfoKHR32 uint32_t updateSequenceCount; } VkVideoSessionParametersUpdateInfoKHR32;
+typedef struct VkWin32KeyedMutexAcquireReleaseInfoKHR32 +{ + VkStructureType sType; + PTR32 pNext; + uint32_t acquireCount; + PTR32 pAcquireSyncs; + PTR32 pAcquireKeys; + PTR32 pAcquireTimeouts; + uint32_t releaseCount; + PTR32 pReleaseSyncs; + PTR32 pReleaseKeys; +} VkWin32KeyedMutexAcquireReleaseInfoKHR32; + typedef struct VkWin32SurfaceCreateInfoKHR32 { VkStructureType sType; @@ -39534,6 +39547,24 @@ static const VkCommandBuffer *convert_VkCommandBuffer_array_win64_to_unwrapped_h } #endif /* _WIN64 */
+#ifdef _WIN64 +static const VkDeviceMemory *convert_VkDeviceMemory_array_win64_to_host(struct conversion_context *ctx, const VkDeviceMemory *in, uint32_t count) +{ + VkDeviceMemory *out; + unsigned int i; + + if (!in || !count) return NULL; + + out = conversion_context_alloc(ctx, count * sizeof(*out)); + for (i = 0; i < count; i++) + { + out[i] = vulkan_device_memory_from_handle(in[i])->host.device_memory; + } + + return out; +} +#endif /* _WIN64 */ + #ifdef _WIN64 static void convert_VkSubmitInfo_win64_to_unwrapped_host(struct conversion_context *ctx, const VkSubmitInfo *in, VkSubmitInfo *out) { @@ -39650,6 +39681,23 @@ static void convert_VkSubmitInfo_win64_to_unwrapped_host(struct conversion_conte out_header = (void *)out_ext; break; } + case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR: + { + VkWin32KeyedMutexAcquireReleaseInfoKHR *out_ext = conversion_context_alloc(ctx, sizeof(*out_ext)); + const VkWin32KeyedMutexAcquireReleaseInfoKHR *in_ext = (const VkWin32KeyedMutexAcquireReleaseInfoKHR *)in_header; + out_ext->sType = VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR; + out_ext->pNext = NULL; + out_ext->acquireCount = in_ext->acquireCount; + out_ext->pAcquireSyncs = convert_VkDeviceMemory_array_win64_to_host(ctx, in_ext->pAcquireSyncs, in_ext->acquireCount); + out_ext->pAcquireKeys = in_ext->pAcquireKeys; + out_ext->pAcquireTimeouts = in_ext->pAcquireTimeouts; + out_ext->releaseCount = in_ext->releaseCount; + out_ext->pReleaseSyncs = convert_VkDeviceMemory_array_win64_to_host(ctx, in_ext->pReleaseSyncs, in_ext->releaseCount); + out_ext->pReleaseKeys = in_ext->pReleaseKeys; + out_header->pNext = (void *)out_ext; + out_header = (void *)out_ext; + break; + } default: FIXME("Unhandled sType %u.\n", in_header->sType); break; @@ -39676,6 +39724,22 @@ static const VkSubmitInfo *convert_VkSubmitInfo_array_win64_to_unwrapped_host(st } #endif /* _WIN64 */
+static const VkDeviceMemory *convert_VkDeviceMemory_array_win32_to_host(struct conversion_context *ctx, const VkDeviceMemory *in, uint32_t count) +{ + VkDeviceMemory *out; + unsigned int i; + + if (!in || !count) return NULL; + + out = conversion_context_alloc(ctx, count * sizeof(*out)); + for (i = 0; i < count; i++) + { + out[i] = vulkan_device_memory_from_handle(in[i])->host.device_memory; + } + + return out; +} + static void convert_VkSubmitInfo_win32_to_unwrapped_host(struct conversion_context *ctx, const VkSubmitInfo32 *in, VkSubmitInfo *out) { const VkBaseInStructure32 *in_header; @@ -39791,6 +39855,23 @@ static void convert_VkSubmitInfo_win32_to_unwrapped_host(struct conversion_conte out_header = (void *)out_ext; break; } + case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR: + { + VkWin32KeyedMutexAcquireReleaseInfoKHR *out_ext = conversion_context_alloc(ctx, sizeof(*out_ext)); + const VkWin32KeyedMutexAcquireReleaseInfoKHR32 *in_ext = (const VkWin32KeyedMutexAcquireReleaseInfoKHR32 *)in_header; + out_ext->sType = VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR; + out_ext->pNext = NULL; + out_ext->acquireCount = in_ext->acquireCount; + out_ext->pAcquireSyncs = convert_VkDeviceMemory_array_win32_to_host(ctx, (const VkDeviceMemory *)UlongToPtr(in_ext->pAcquireSyncs), in_ext->acquireCount); + out_ext->pAcquireKeys = UlongToPtr(in_ext->pAcquireKeys); + out_ext->pAcquireTimeouts = UlongToPtr(in_ext->pAcquireTimeouts); + out_ext->releaseCount = in_ext->releaseCount; + out_ext->pReleaseSyncs = convert_VkDeviceMemory_array_win32_to_host(ctx, (const VkDeviceMemory *)UlongToPtr(in_ext->pReleaseSyncs), in_ext->releaseCount); + out_ext->pReleaseKeys = UlongToPtr(in_ext->pReleaseKeys); + out_header->pNext = (void *)out_ext; + out_header = (void *)out_ext; + break; + } default: FIXME("Unhandled sType %u.\n", in_header->sType); break; @@ -39944,6 +40025,23 @@ static void convert_VkSubmitInfo2_win64_to_unwrapped_host(struct conversion_cont out_header = (void *)out_ext; break; } + case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR: + { + VkWin32KeyedMutexAcquireReleaseInfoKHR *out_ext = conversion_context_alloc(ctx, sizeof(*out_ext)); + const VkWin32KeyedMutexAcquireReleaseInfoKHR *in_ext = (const VkWin32KeyedMutexAcquireReleaseInfoKHR *)in_header; + out_ext->sType = VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR; + out_ext->pNext = NULL; + out_ext->acquireCount = in_ext->acquireCount; + out_ext->pAcquireSyncs = convert_VkDeviceMemory_array_win64_to_host(ctx, in_ext->pAcquireSyncs, in_ext->acquireCount); + out_ext->pAcquireKeys = in_ext->pAcquireKeys; + out_ext->pAcquireTimeouts = in_ext->pAcquireTimeouts; + out_ext->releaseCount = in_ext->releaseCount; + out_ext->pReleaseSyncs = convert_VkDeviceMemory_array_win64_to_host(ctx, in_ext->pReleaseSyncs, in_ext->releaseCount); + out_ext->pReleaseKeys = in_ext->pReleaseKeys; + out_header->pNext = (void *)out_ext; + out_header = (void *)out_ext; + break; + } default: FIXME("Unhandled sType %u.\n", in_header->sType); break; @@ -40125,6 +40223,23 @@ static void convert_VkSubmitInfo2_win32_to_unwrapped_host(struct conversion_cont out_header = (void *)out_ext; break; } + case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR: + { + VkWin32KeyedMutexAcquireReleaseInfoKHR *out_ext = conversion_context_alloc(ctx, sizeof(*out_ext)); + const VkWin32KeyedMutexAcquireReleaseInfoKHR32 *in_ext = (const VkWin32KeyedMutexAcquireReleaseInfoKHR32 *)in_header; + out_ext->sType = VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR; + out_ext->pNext = NULL; + out_ext->acquireCount = in_ext->acquireCount; + out_ext->pAcquireSyncs = convert_VkDeviceMemory_array_win32_to_host(ctx, (const VkDeviceMemory *)UlongToPtr(in_ext->pAcquireSyncs), in_ext->acquireCount); + out_ext->pAcquireKeys = UlongToPtr(in_ext->pAcquireKeys); + out_ext->pAcquireTimeouts = UlongToPtr(in_ext->pAcquireTimeouts); + out_ext->releaseCount = in_ext->releaseCount; + out_ext->pReleaseSyncs = convert_VkDeviceMemory_array_win32_to_host(ctx, (const VkDeviceMemory *)UlongToPtr(in_ext->pReleaseSyncs), in_ext->releaseCount); + out_ext->pReleaseKeys = UlongToPtr(in_ext->pReleaseKeys); + out_header->pNext = (void *)out_ext; + out_header = (void *)out_ext; + break; + } default: FIXME("Unhandled sType %u.\n", in_header->sType); break; @@ -59941,6 +60056,7 @@ static const char * const vk_device_extensions[] = "VK_KHR_video_maintenance1", "VK_KHR_video_queue", "VK_KHR_vulkan_memory_model", + "VK_KHR_win32_keyed_mutex", "VK_KHR_workgroup_memory_explicit_layout", "VK_KHR_zero_initialize_workgroup_memory", "VK_MESA_image_alignment_control", diff --git a/include/wine/vulkan.h b/include/wine/vulkan.h index 4336a154ecc..d156dca58c1 100644 --- a/include/wine/vulkan.h +++ b/include/wine/vulkan.h @@ -180,6 +180,8 @@ typedef struct _XDisplay Display; #define VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME "VK_KHR_external_memory_win32" #define VK_KHR_EXTERNAL_MEMORY_FD_SPEC_VERSION 1 #define VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME "VK_KHR_external_memory_fd" +#define VK_KHR_WIN32_KEYED_MUTEX_SPEC_VERSION 1 +#define VK_KHR_WIN32_KEYED_MUTEX_EXTENSION_NAME "VK_KHR_win32_keyed_mutex" #define VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_SPEC_VERSION 1 #define VK_KHR_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME "VK_KHR_external_semaphore_capabilities" #define VK_KHR_EXTERNAL_SEMAPHORE_SPEC_VERSION 1 @@ -5450,6 +5452,7 @@ typedef enum VkStructureType VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR = 1000074000, VK_STRUCTURE_TYPE_MEMORY_FD_PROPERTIES_KHR = 1000074001, VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR = 1000074002, + VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR = 1000075000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO = 1000076000, VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES = 1000076001, VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO = 1000077000, @@ -18644,6 +18647,19 @@ typedef struct VkWaylandSurfaceCreateInfoKHR struct wl_surface *surface; } VkWaylandSurfaceCreateInfoKHR;
+typedef struct VkWin32KeyedMutexAcquireReleaseInfoKHR +{ + VkStructureType sType; + const void *pNext; + uint32_t acquireCount; + const VkDeviceMemory *pAcquireSyncs; + const uint64_t *pAcquireKeys; + const uint32_t *pAcquireTimeouts; + uint32_t releaseCount; + const VkDeviceMemory *pReleaseSyncs; + const uint64_t *pReleaseKeys; +} VkWin32KeyedMutexAcquireReleaseInfoKHR; + typedef struct VkWin32SurfaceCreateInfoKHR { VkStructureType sType; diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index 32947caa96a..d3d1ecf0c71 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -47,7 +47,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 41 +#define WINE_VULKAN_DRIVER_VERSION 42
struct vulkan_object {