From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winevulkan/make_vulkan | 1 + dlls/winevulkan/vulkan.c | 28 ++++++++++++++ dlls/winevulkan/vulkan_thunks.c | 66 +++------------------------------ dlls/winevulkan/vulkan_thunks.h | 1 + 4 files changed, 35 insertions(+), 61 deletions(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 7e3a7d04b19..7990336706e 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -260,6 +260,7 @@ MANUAL_UNIX_THUNKS = { "vkGetPhysicalDeviceSurfaceFormats2KHR", "vkMapMemory", "vkMapMemory2KHR", + "vkQueuePresentKHR", "vkUnmapMemory", "vkUnmapMemory2KHR", } diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 571c1d54575..e906734a506 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -1680,6 +1680,34 @@ void wine_vkDestroySwapchainKHR(VkDevice device_handle, VkSwapchainKHR swapchain free(swapchain); }
+VkResult wine_vkQueuePresentKHR(VkQueue queue_handle, const VkPresentInfoKHR *present_info) +{ + VkSwapchainKHR swapchains_buffer[16], *swapchains = swapchains_buffer; + struct wine_queue *queue = wine_queue_from_handle(queue_handle); + VkPresentInfoKHR present_info_host = *present_info; + struct wine_device *device = queue->device; + VkResult res; + UINT i; + + if (present_info->swapchainCount > ARRAY_SIZE(swapchains_buffer) && + !(swapchains = malloc(present_info->swapchainCount * sizeof(*swapchains)))) + return VK_ERROR_OUT_OF_HOST_MEMORY; + + for (i = 0; i < present_info->swapchainCount; i++) + { + struct wine_swapchain *swapchain = wine_swapchain_from_handle(present_info->pSwapchains[i]); + swapchains[i] = swapchain->host_swapchain; + } + + present_info_host.pSwapchains = swapchains; + + res = device->funcs.p_vkQueuePresentKHR(queue->host_queue, &present_info_host); + + if (swapchains != swapchains_buffer) free(swapchains); + + return res; +} + VkResult wine_vkAllocateMemory(VkDevice handle, const VkMemoryAllocateInfo *alloc_info, const VkAllocationCallbacks *allocator, VkDeviceMemory *ret) { diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c index 9075b5ff11f..7ec0300e8cb 100644 --- a/dlls/winevulkan/vulkan_thunks.c +++ b/dlls/winevulkan/vulkan_thunks.c @@ -29299,57 +29299,7 @@ static inline const VkPresentRegionKHR *convert_VkPresentRegionKHR_array_win32_t return out; }
-#ifdef _WIN64 -static inline const VkSwapchainKHR *convert_VkSwapchainKHR_array_win64_to_driver(struct conversion_context *ctx, const VkSwapchainKHR *in, uint32_t count) -{ - VkSwapchainKHR *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] = wine_swapchain_from_handle(in[i])->host_swapchain; - } - - return out; -} -#endif /* _WIN64 */ - -static inline const VkSwapchainKHR *convert_VkSwapchainKHR_array_win32_to_driver(struct conversion_context *ctx, const VkSwapchainKHR *in, uint32_t count) -{ - VkSwapchainKHR *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] = wine_swapchain_from_handle(in[i])->host_swapchain; - } - - return out; -} - -#ifdef _WIN64 -static inline void convert_VkPresentInfoKHR_win64_to_driver(struct conversion_context *ctx, const VkPresentInfoKHR *in, VkPresentInfoKHR *out) -{ - if (!in) return; - - out->sType = in->sType; - out->pNext = in->pNext; - out->waitSemaphoreCount = in->waitSemaphoreCount; - out->pWaitSemaphores = in->pWaitSemaphores; - out->swapchainCount = in->swapchainCount; - out->pSwapchains = convert_VkSwapchainKHR_array_win64_to_driver(ctx, in->pSwapchains, in->swapchainCount); - out->pImageIndices = in->pImageIndices; - out->pResults = in->pResults; -} -#endif /* _WIN64 */ - -static inline void convert_VkPresentInfoKHR_win32_to_driver(struct conversion_context *ctx, const VkPresentInfoKHR32 *in, VkPresentInfoKHR *out) +static inline void convert_VkPresentInfoKHR_win32_to_unwrapped_host(struct conversion_context *ctx, const VkPresentInfoKHR32 *in, VkPresentInfoKHR *out) { const VkBaseInStructure32 *in_header; VkBaseOutStructure *out_header = (void *)out; @@ -29361,7 +29311,7 @@ static inline void convert_VkPresentInfoKHR_win32_to_driver(struct conversion_co out->waitSemaphoreCount = in->waitSemaphoreCount; out->pWaitSemaphores = (const VkSemaphore *)UlongToPtr(in->pWaitSemaphores); out->swapchainCount = in->swapchainCount; - out->pSwapchains = convert_VkSwapchainKHR_array_win32_to_driver(ctx, (const VkSwapchainKHR *)UlongToPtr(in->pSwapchains), in->swapchainCount); + out->pSwapchains = (const VkSwapchainKHR *)UlongToPtr(in->pSwapchains); out->pImageIndices = (const uint32_t *)UlongToPtr(in->pImageIndices); out->pResults = (VkResult *)UlongToPtr(in->pResults);
@@ -45145,16 +45095,10 @@ static NTSTATUS thunk32_vkQueueNotifyOutOfBandNV(void *args) static NTSTATUS thunk64_vkQueuePresentKHR(void *args) { struct vkQueuePresentKHR_params *params = args; - VkPresentInfoKHR pPresentInfo_host; - struct conversion_context local_ctx; - struct conversion_context *ctx = &local_ctx;
TRACE("%p, %p\n", params->queue, params->pPresentInfo);
- init_conversion_context(ctx); - convert_VkPresentInfoKHR_win64_to_driver(ctx, params->pPresentInfo, &pPresentInfo_host); - params->result = wine_queue_from_handle(params->queue)->device->funcs.p_vkQueuePresentKHR(wine_queue_from_handle(params->queue)->host_queue, &pPresentInfo_host); - free_conversion_context(ctx); + params->result = wine_vkQueuePresentKHR(params->queue, params->pPresentInfo); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -45174,8 +45118,8 @@ static NTSTATUS thunk32_vkQueuePresentKHR(void *args) TRACE("%#x, %#x\n", params->queue, params->pPresentInfo);
init_conversion_context(ctx); - convert_VkPresentInfoKHR_win32_to_driver(ctx, (const VkPresentInfoKHR32 *)UlongToPtr(params->pPresentInfo), &pPresentInfo_host); - params->result = wine_queue_from_handle((VkQueue)UlongToPtr(params->queue))->device->funcs.p_vkQueuePresentKHR(wine_queue_from_handle((VkQueue)UlongToPtr(params->queue))->host_queue, &pPresentInfo_host); + convert_VkPresentInfoKHR_win32_to_unwrapped_host(ctx, (const VkPresentInfoKHR32 *)UlongToPtr(params->pPresentInfo), &pPresentInfo_host); + params->result = wine_vkQueuePresentKHR((VkQueue)UlongToPtr(params->queue), &pPresentInfo_host); free_conversion_context(ctx); return STATUS_SUCCESS; } diff --git a/dlls/winevulkan/vulkan_thunks.h b/dlls/winevulkan/vulkan_thunks.h index 5fe178d52b5..699a21c580e 100644 --- a/dlls/winevulkan/vulkan_thunks.h +++ b/dlls/winevulkan/vulkan_thunks.h @@ -64,6 +64,7 @@ VkResult wine_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice physica VkResult wine_vkGetPhysicalDeviceSurfaceFormats2KHR(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo, uint32_t *pSurfaceFormatCount, VkSurfaceFormat2KHR *pSurfaceFormats); VkResult wine_vkMapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void **ppData); VkResult wine_vkMapMemory2KHR(VkDevice device, const VkMemoryMapInfoKHR *pMemoryMapInfo, void **ppData); +VkResult wine_vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo); void wine_vkUnmapMemory(VkDevice device, VkDeviceMemory memory); VkResult wine_vkUnmapMemory2KHR(VkDevice device, const VkMemoryUnmapInfoKHR *pMemoryUnmapInfo);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winemac.drv/vulkan.c | 27 +-------------------------- dlls/winevulkan/vulkan.c | 23 +++++++++++++++++++++++ dlls/winex11.drv/vulkan.c | 29 +---------------------------- 3 files changed, 25 insertions(+), 54 deletions(-)
diff --git a/dlls/winemac.drv/vulkan.c b/dlls/winemac.drv/vulkan.c index 288bd9af4b1..9cb026076f3 100644 --- a/dlls/winemac.drv/vulkan.c +++ b/dlls/winemac.drv/vulkan.c @@ -46,8 +46,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
#ifdef SONAME_LIBVULKAN
-WINE_DECLARE_DEBUG_CHANNEL(fps); - typedef VkFlags VkMacOSSurfaceCreateFlagsMVK; #define VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK 1000123000
@@ -248,30 +246,7 @@ static VkResult macdrv_vkGetSwapchainImagesKHR(VkDevice device, static VkResult macdrv_vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *present_info) { TRACE("%p, %p\n", queue, present_info); - VkResult res = pvkQueuePresentKHR(queue, present_info); - - if (TRACE_ON(fps)) - { - static unsigned long frames, frames_total; - static long prev_time, start_time; - DWORD time; - - time = NtGetTickCount(); - frames++; - frames_total++; - if (time - prev_time > 1500) - { - TRACE_(fps)("%p @ approx %.2ffps, total %.2ffps\n", - queue, 1000.0 * frames / (time - prev_time), - 1000.0 * frames_total / (time - start_time)); - prev_time = time; - frames = 0; - if (!start_time) - start_time = time; - } - } - - return res; + return pvkQueuePresentKHR(queue, present_info); }
static const char *macdrv_get_host_surface_extension(void) diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index e906734a506..21e5952caf4 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -31,6 +31,7 @@ #include "ntuser.h"
WINE_DEFAULT_DEBUG_CHANNEL(vulkan); +WINE_DECLARE_DEBUG_CHANNEL(fps);
static PFN_vkCreateInstance p_vkCreateInstance; static PFN_vkEnumerateInstanceVersion p_vkEnumerateInstanceVersion; @@ -1705,6 +1706,28 @@ VkResult wine_vkQueuePresentKHR(VkQueue queue_handle, const VkPresentInfoKHR *pr
if (swapchains != swapchains_buffer) free(swapchains);
+ if (TRACE_ON(fps)) + { + static unsigned long frames, frames_total; + static long prev_time, start_time; + DWORD time; + + time = NtGetTickCount(); + frames++; + frames_total++; + + if (time - prev_time > 1500) + { + TRACE_(fps)("%p @ approx %.2ffps, total %.2ffps\n", queue, + 1000.0 * frames / (time - prev_time), + 1000.0 * frames_total / (time - start_time)); + prev_time = time; + frames = 0; + + if (!start_time) start_time = time; + } + } + return res; }
diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index edd4553f7f7..cc317df6dd6 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -47,7 +47,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
#ifdef SONAME_LIBVULKAN -WINE_DECLARE_DEBUG_CHANNEL(fps);
static pthread_mutex_t vulkan_mutex;
@@ -279,34 +278,8 @@ static VkResult X11DRV_vkGetSwapchainImagesKHR(VkDevice device,
static VkResult X11DRV_vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *present_info) { - VkResult res; - TRACE("%p, %p\n", queue, present_info); - - res = pvkQueuePresentKHR(queue, present_info); - - if (TRACE_ON(fps)) - { - static unsigned long frames, frames_total; - static long prev_time, start_time; - DWORD time; - - time = NtGetTickCount(); - frames++; - frames_total++; - if (time - prev_time > 1500) - { - TRACE_(fps)("%p @ approx %.2ffps, total %.2ffps\n", - queue, 1000.0 * frames / (time - prev_time), - 1000.0 * frames_total / (time - start_time)); - prev_time = time; - frames = 0; - if (!start_time) - start_time = time; - } - } - - return res; + return pvkQueuePresentKHR(queue, present_info); }
static const char *X11DRV_get_host_surface_extension(void)
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/vulkan-1/tests/vulkan.c | 3 --- dlls/winevulkan/vulkan.c | 34 ++++++++++++++++++++++++++++++++ dlls/winevulkan/vulkan_private.h | 2 ++ 3 files changed, 36 insertions(+), 3 deletions(-)
diff --git a/dlls/vulkan-1/tests/vulkan.c b/dlls/vulkan-1/tests/vulkan.c index 716a524e796..71ad2c4cf34 100644 --- a/dlls/vulkan-1/tests/vulkan.c +++ b/dlls/vulkan-1/tests/vulkan.c @@ -762,11 +762,8 @@ static void test_win32_surface_swapchain_hwnd(VkDevice device, VkSwapchainKHR sw
vr = vkQueuePresentKHR(queue, &present_info); if (expect_suboptimal) - { - todo_wine ok(vr == VK_SUBOPTIMAL_KHR || broken(vr == VK_ERROR_OUT_OF_DATE_KHR) /* Nvidia */, "Got unexpected vr %d.\n", vr); - } else if (IsWindow(hwnd)) ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr); else diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 21e5952caf4..5f513b96480 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -1624,6 +1624,12 @@ void wine_vkDestroySurfaceKHR(VkInstance handle, VkSurfaceKHR surface, free(object); }
+static BOOL extents_equals(const VkExtent2D *extents, const RECT *rect) +{ + return extents->width == rect->right - rect->left && + extents->height == rect->bottom - rect->top; +} + VkResult wine_vkCreateSwapchainKHR(VkDevice device_handle, const VkSwapchainCreateInfoKHR *create_info, const VkAllocationCallbacks *allocator, VkSwapchainKHR *swapchain_handle) { @@ -1661,6 +1667,9 @@ VkResult wine_vkCreateSwapchainKHR(VkDevice device_handle, const VkSwapchainCrea return res; }
+ object->surface = surface; + object->extents = create_info->imageExtent; + *swapchain_handle = wine_swapchain_to_handle(object); add_handle_mapping(instance, *swapchain_handle, object->host_swapchain, &object->wrapper_entry); return VK_SUCCESS; @@ -1704,6 +1713,31 @@ VkResult wine_vkQueuePresentKHR(VkQueue queue_handle, const VkPresentInfoKHR *pr
res = device->funcs.p_vkQueuePresentKHR(queue->host_queue, &present_info_host);
+ for (i = 0; i < present_info->swapchainCount; i++) + { + struct wine_swapchain *swapchain = wine_swapchain_from_handle(present_info->pSwapchains[i]); + VkResult swapchain_res = present_info->pResults ? present_info->pResults[i] : res; + struct wine_surface *surface = swapchain->surface; + RECT client_rect; + + if (swapchain_res < VK_SUCCESS) continue; + if (!NtUserGetClientRect(surface->hwnd, &client_rect)) + { + WARN("Swapchain window %p is invalid, returning VK_ERROR_OUT_OF_DATE_KHR\n", surface->hwnd); + if (present_info->pResults) present_info->pResults[i] = VK_ERROR_OUT_OF_DATE_KHR; + if (res >= VK_SUCCESS) res = VK_ERROR_OUT_OF_DATE_KHR; + } + else if (swapchain_res != VK_SUCCESS) + WARN("Present returned status %d for swapchain %p\n", swapchain_res, swapchain); + else if (!extents_equals(&swapchain->extents, &client_rect)) + { + WARN("Swapchain size %dx%d does not match client rect %s, returning VK_SUBOPTIMAL_KHR\n", + swapchain->extents.width, swapchain->extents.height, wine_dbgstr_rect(&client_rect)); + if (present_info->pResults) present_info->pResults[i] = VK_SUBOPTIMAL_KHR; + if (res == VK_SUCCESS) res = VK_SUBOPTIMAL_KHR; + } + } + if (swapchains != swapchains_buffer) free(swapchains);
if (TRACE_ON(fps)) diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h index f5109aa6377..5e66a6c9670 100644 --- a/dlls/winevulkan/vulkan_private.h +++ b/dlls/winevulkan/vulkan_private.h @@ -253,7 +253,9 @@ static inline VkSurfaceKHR wine_surface_to_handle(struct wine_surface *surface)
struct wine_swapchain { + struct wine_surface *surface; /* parent */ VkSwapchainKHR host_swapchain; + VkExtent2D extents;
struct wrapper_entry wrapper_entry; };
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winevulkan/make_vulkan | 2 ++ dlls/winevulkan/vulkan.c | 47 +++++++++++++++++++++++++++++++++ dlls/winevulkan/vulkan_thunks.c | 31 +++++----------------- dlls/winevulkan/vulkan_thunks.h | 2 ++ 4 files changed, 58 insertions(+), 24 deletions(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 7990336706e..7500d31d56a 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -208,6 +208,8 @@ USER_DRIVER_FUNCS = {
# functions for which the unix thunk is manually implemented MANUAL_UNIX_THUNKS = { + "vkAcquireNextImage2KHR", + "vkAcquireNextImageKHR", "vkAllocateCommandBuffers", "vkAllocateMemory", "vkCreateBuffer", diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 5f513b96480..972de3cedaf 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -1630,6 +1630,53 @@ static BOOL extents_equals(const VkExtent2D *extents, const RECT *rect) extents->height == rect->bottom - rect->top; }
+VkResult wine_vkAcquireNextImage2KHR(VkDevice device_handle, const VkAcquireNextImageInfoKHR *acquire_info, + uint32_t *image_index) +{ + struct wine_swapchain *swapchain = wine_swapchain_from_handle(acquire_info->swapchain); + struct wine_device *device = wine_device_from_handle(device_handle); + VkAcquireNextImageInfoKHR acquire_info_host = *acquire_info; + struct wine_surface *surface = swapchain->surface; + RECT client_rect; + VkResult res; + + acquire_info_host.swapchain = swapchain->host_swapchain; + res = device->funcs.p_vkAcquireNextImage2KHR(device->host_device, &acquire_info_host, image_index); + + if (res == VK_SUCCESS && NtUserGetClientRect(surface->hwnd, &client_rect) && + !extents_equals(&swapchain->extents, &client_rect)) + { + WARN("Swapchain size %dx%d does not match client rect %s, returning VK_SUBOPTIMAL_KHR\n", + swapchain->extents.width, swapchain->extents.height, wine_dbgstr_rect(&client_rect)); + return VK_SUBOPTIMAL_KHR; + } + + return res; +} + +VkResult wine_vkAcquireNextImageKHR(VkDevice device_handle, VkSwapchainKHR swapchain_handle, uint64_t timeout, + VkSemaphore semaphore, VkFence fence, uint32_t *image_index) +{ + struct wine_swapchain *swapchain = wine_swapchain_from_handle(swapchain_handle); + struct wine_device *device = wine_device_from_handle(device_handle); + struct wine_surface *surface = swapchain->surface; + RECT client_rect; + VkResult res; + + res = device->funcs.p_vkAcquireNextImageKHR(device->host_device, swapchain->host_swapchain, timeout, + semaphore, fence, image_index); + + if (res == VK_SUCCESS && NtUserGetClientRect(surface->hwnd, &client_rect) && + !extents_equals(&swapchain->extents, &client_rect)) + { + WARN("Swapchain size %dx%d does not match client rect %s, returning VK_SUBOPTIMAL_KHR\n", + swapchain->extents.width, swapchain->extents.height, wine_dbgstr_rect(&client_rect)); + return VK_SUBOPTIMAL_KHR; + } + + return res; +} + VkResult wine_vkCreateSwapchainKHR(VkDevice device_handle, const VkSwapchainCreateInfoKHR *create_info, const VkAllocationCallbacks *allocator, VkSwapchainKHR *swapchain_handle) { diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c index 7ec0300e8cb..5c1d6b1685d 100644 --- a/dlls/winevulkan/vulkan_thunks.c +++ b/dlls/winevulkan/vulkan_thunks.c @@ -7112,28 +7112,13 @@ static uint64_t wine_vk_unwrap_handle(uint32_t type, uint64_t handle) } }
-#ifdef _WIN64 -static inline void convert_VkAcquireNextImageInfoKHR_win64_to_host(const VkAcquireNextImageInfoKHR *in, VkAcquireNextImageInfoKHR *out) -{ - if (!in) return; - - out->sType = in->sType; - out->pNext = in->pNext; - out->swapchain = wine_swapchain_from_handle(in->swapchain)->host_swapchain; - out->timeout = in->timeout; - out->semaphore = in->semaphore; - out->fence = in->fence; - out->deviceMask = in->deviceMask; -} -#endif /* _WIN64 */ - -static inline void convert_VkAcquireNextImageInfoKHR_win32_to_host(const VkAcquireNextImageInfoKHR32 *in, VkAcquireNextImageInfoKHR *out) +static inline void convert_VkAcquireNextImageInfoKHR_win32_to_unwrapped_host(const VkAcquireNextImageInfoKHR32 *in, VkAcquireNextImageInfoKHR *out) { if (!in) return;
out->sType = in->sType; out->pNext = NULL; - out->swapchain = wine_swapchain_from_handle(in->swapchain)->host_swapchain; + out->swapchain = in->swapchain; out->timeout = in->timeout; out->semaphore = in->semaphore; out->fence = in->fence; @@ -30193,12 +30178,10 @@ static inline void convert_VkSemaphoreWaitInfo_win32_to_host(const VkSemaphoreWa static NTSTATUS thunk64_vkAcquireNextImage2KHR(void *args) { struct vkAcquireNextImage2KHR_params *params = args; - VkAcquireNextImageInfoKHR pAcquireInfo_host;
TRACE("%p, %p, %p\n", params->device, params->pAcquireInfo, params->pImageIndex);
- convert_VkAcquireNextImageInfoKHR_win64_to_host(params->pAcquireInfo, &pAcquireInfo_host); - params->result = wine_device_from_handle(params->device)->funcs.p_vkAcquireNextImage2KHR(wine_device_from_handle(params->device)->host_device, &pAcquireInfo_host, params->pImageIndex); + params->result = wine_vkAcquireNextImage2KHR(params->device, params->pAcquireInfo, params->pImageIndex); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -30216,8 +30199,8 @@ static NTSTATUS thunk32_vkAcquireNextImage2KHR(void *args)
TRACE("%#x, %#x, %#x\n", params->device, params->pAcquireInfo, params->pImageIndex);
- convert_VkAcquireNextImageInfoKHR_win32_to_host((const VkAcquireNextImageInfoKHR32 *)UlongToPtr(params->pAcquireInfo), &pAcquireInfo_host); - params->result = wine_device_from_handle((VkDevice)UlongToPtr(params->device))->funcs.p_vkAcquireNextImage2KHR(wine_device_from_handle((VkDevice)UlongToPtr(params->device))->host_device, &pAcquireInfo_host, (uint32_t *)UlongToPtr(params->pImageIndex)); + convert_VkAcquireNextImageInfoKHR_win32_to_unwrapped_host((const VkAcquireNextImageInfoKHR32 *)UlongToPtr(params->pAcquireInfo), &pAcquireInfo_host); + params->result = wine_vkAcquireNextImage2KHR((VkDevice)UlongToPtr(params->device), &pAcquireInfo_host, (uint32_t *)UlongToPtr(params->pImageIndex)); return STATUS_SUCCESS; }
@@ -30228,7 +30211,7 @@ static NTSTATUS thunk64_vkAcquireNextImageKHR(void *args)
TRACE("%p, 0x%s, 0x%s, 0x%s, 0x%s, %p\n", params->device, wine_dbgstr_longlong(params->swapchain), wine_dbgstr_longlong(params->timeout), wine_dbgstr_longlong(params->semaphore), wine_dbgstr_longlong(params->fence), params->pImageIndex);
- params->result = wine_device_from_handle(params->device)->funcs.p_vkAcquireNextImageKHR(wine_device_from_handle(params->device)->host_device, wine_swapchain_from_handle(params->swapchain)->host_swapchain, params->timeout, params->semaphore, params->fence, params->pImageIndex); + params->result = wine_vkAcquireNextImageKHR(params->device, params->swapchain, params->timeout, params->semaphore, params->fence, params->pImageIndex); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -30248,7 +30231,7 @@ static NTSTATUS thunk32_vkAcquireNextImageKHR(void *args)
TRACE("%#x, 0x%s, 0x%s, 0x%s, 0x%s, %#x\n", params->device, wine_dbgstr_longlong(params->swapchain), wine_dbgstr_longlong(params->timeout), wine_dbgstr_longlong(params->semaphore), wine_dbgstr_longlong(params->fence), params->pImageIndex);
- params->result = wine_device_from_handle((VkDevice)UlongToPtr(params->device))->funcs.p_vkAcquireNextImageKHR(wine_device_from_handle((VkDevice)UlongToPtr(params->device))->host_device, wine_swapchain_from_handle(params->swapchain)->host_swapchain, params->timeout, params->semaphore, params->fence, (uint32_t *)UlongToPtr(params->pImageIndex)); + params->result = wine_vkAcquireNextImageKHR((VkDevice)UlongToPtr(params->device), params->swapchain, params->timeout, params->semaphore, params->fence, (uint32_t *)UlongToPtr(params->pImageIndex)); return STATUS_SUCCESS; }
diff --git a/dlls/winevulkan/vulkan_thunks.h b/dlls/winevulkan/vulkan_thunks.h index 699a21c580e..f27fae3f07c 100644 --- a/dlls/winevulkan/vulkan_thunks.h +++ b/dlls/winevulkan/vulkan_thunks.h @@ -15,6 +15,8 @@ #define WINE_VK_VERSION VK_API_VERSION_1_3
/* Functions for which we have custom implementations outside of the thunks. */ +VkResult wine_vkAcquireNextImage2KHR(VkDevice device, const VkAcquireNextImageInfoKHR *pAcquireInfo, uint32_t *pImageIndex); +VkResult wine_vkAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout, VkSemaphore semaphore, VkFence fence, uint32_t *pImageIndex); VkResult wine_vkAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers); VkResult wine_vkAllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo, const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory); VkResult wine_vkCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/vulkan.c | 2 -- dlls/winemac.drv/vulkan.c | 10 ---------- dlls/winevulkan/make_vulkan | 1 - dlls/winewayland.drv/vulkan.c | 11 ----------- dlls/winex11.drv/vulkan.c | 10 ---------- include/wine/vulkan_driver.h | 3 +-- 6 files changed, 1 insertion(+), 36 deletions(-)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index eac6793fea5..6866dbcb076 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -53,7 +53,6 @@ static void *win32u_vkGetDeviceProcAddr( VkDevice device, const char *name ) if (!strcmp( name, "vkCreateSwapchainKHR" )) return vulkan_funcs.p_vkCreateSwapchainKHR; if (!strcmp( name, "vkDestroySwapchainKHR" )) return vulkan_funcs.p_vkDestroySwapchainKHR; if (!strcmp( name, "vkGetDeviceProcAddr" )) return win32u_vkGetDeviceProcAddr; - if (!strcmp( name, "vkGetSwapchainImagesKHR" )) return vulkan_funcs.p_vkGetSwapchainImagesKHR; if (!strcmp( name, "vkQueuePresentKHR" )) return vulkan_funcs.p_vkQueuePresentKHR;
return p_vkGetDeviceProcAddr( device, name ); @@ -74,7 +73,6 @@ static void *win32u_vkGetInstanceProcAddr( VkInstance instance, const char *name if (!strcmp( name, "vkCreateSwapchainKHR" )) return vulkan_funcs.p_vkCreateSwapchainKHR; if (!strcmp( name, "vkDestroySwapchainKHR" )) return vulkan_funcs.p_vkDestroySwapchainKHR; if (!strcmp( name, "vkGetDeviceProcAddr" )) return win32u_vkGetDeviceProcAddr; - if (!strcmp( name, "vkGetSwapchainImagesKHR" )) return vulkan_funcs.p_vkGetSwapchainImagesKHR; if (!strcmp( name, "vkQueuePresentKHR" )) return vulkan_funcs.p_vkQueuePresentKHR;
return p_vkGetInstanceProcAddr( instance, name ); diff --git a/dlls/winemac.drv/vulkan.c b/dlls/winemac.drv/vulkan.c index 9cb026076f3..f32269c7237 100644 --- a/dlls/winemac.drv/vulkan.c +++ b/dlls/winemac.drv/vulkan.c @@ -81,7 +81,6 @@ static VkResult (*pvkCreateMetalSurfaceEXT)(VkInstance, const VkMetalSurfaceCrea static void (*pvkDestroySurfaceKHR)(VkInstance, VkSurfaceKHR, const VkAllocationCallbacks *); static void (*pvkDestroySwapchainKHR)(VkDevice, VkSwapchainKHR, const VkAllocationCallbacks *); static VkResult (*pvkGetPhysicalDeviceSurfaceCapabilities2KHR)(VkPhysicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *, VkSurfaceCapabilities2KHR *); -static VkResult (*pvkGetSwapchainImagesKHR)(VkDevice, VkSwapchainKHR, uint32_t *, VkImage *); static VkResult (*pvkQueuePresentKHR)(VkQueue, const VkPresentInfoKHR *);
static const struct vulkan_funcs vulkan_funcs; @@ -236,13 +235,6 @@ static VkBool32 macdrv_vkGetPhysicalDeviceWin32PresentationSupportKHR(VkPhysical return VK_TRUE; }
-static VkResult macdrv_vkGetSwapchainImagesKHR(VkDevice device, - VkSwapchainKHR swapchain, uint32_t *count, VkImage *images) -{ - TRACE("%p, 0x%s %p %p\n", device, wine_dbgstr_longlong(swapchain), count, images); - return pvkGetSwapchainImagesKHR(device, swapchain, count, images); -} - static VkResult macdrv_vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *present_info) { TRACE("%p, %p\n", queue, present_info); @@ -272,7 +264,6 @@ static const struct vulkan_funcs vulkan_funcs = NULL, NULL, macdrv_vkGetPhysicalDeviceWin32PresentationSupportKHR, - macdrv_vkGetSwapchainImagesKHR, macdrv_vkQueuePresentKHR,
macdrv_get_host_surface_extension, @@ -293,7 +284,6 @@ UINT macdrv_VulkanInit(UINT version, void *vulkan_handle, struct vulkan_funcs *d LOAD_FUNCPTR(vkCreateMetalSurfaceEXT) LOAD_FUNCPTR(vkDestroySurfaceKHR) LOAD_FUNCPTR(vkDestroySwapchainKHR) - LOAD_FUNCPTR(vkGetSwapchainImagesKHR) LOAD_FUNCPTR(vkQueuePresentKHR) #undef LOAD_FUNCPTR
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 7500d31d56a..2f7dec229ba 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -202,7 +202,6 @@ USER_DRIVER_FUNCS = { "vkGetDeviceProcAddr", "vkGetInstanceProcAddr", "vkGetPhysicalDeviceWin32PresentationSupportKHR", - "vkGetSwapchainImagesKHR", "vkQueuePresentKHR", }
diff --git a/dlls/winewayland.drv/vulkan.c b/dlls/winewayland.drv/vulkan.c index 1d7492fae36..8fd13fa7761 100644 --- a/dlls/winewayland.drv/vulkan.c +++ b/dlls/winewayland.drv/vulkan.c @@ -58,7 +58,6 @@ static VkResult (*pvkCreateWaylandSurfaceKHR)(VkInstance, const VkWaylandSurface static void (*pvkDestroySurfaceKHR)(VkInstance, VkSurfaceKHR, const VkAllocationCallbacks *); static void (*pvkDestroySwapchainKHR)(VkDevice, VkSwapchainKHR, const VkAllocationCallbacks *); static VkBool32 (*pvkGetPhysicalDeviceWaylandPresentationSupportKHR)(VkPhysicalDevice, uint32_t, struct wl_display *); -static VkResult (*pvkGetSwapchainImagesKHR)(VkDevice, VkSwapchainKHR, uint32_t *, VkImage *); static VkResult (*pvkQueuePresentKHR)(VkQueue, const VkPresentInfoKHR *);
static const struct vulkan_funcs vulkan_funcs; @@ -366,14 +365,6 @@ static VkBool32 wayland_vkGetPhysicalDeviceWin32PresentationSupportKHR(VkPhysica process_wayland.wl_display); }
-static VkResult wayland_vkGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, - uint32_t *count, VkImage *images) -{ - TRACE("%p, 0x%s %p %p\n", device, wine_dbgstr_longlong(swapchain), count, images); - - return pvkGetSwapchainImagesKHR(device, swapchain, count, images); -} - static VkResult wayland_vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *present_info) { VkResult res; @@ -402,7 +393,6 @@ static const struct vulkan_funcs vulkan_funcs = .p_vkDestroySurfaceKHR = wayland_vkDestroySurfaceKHR, .p_vkDestroySwapchainKHR = wayland_vkDestroySwapchainKHR, .p_vkGetPhysicalDeviceWin32PresentationSupportKHR = wayland_vkGetPhysicalDeviceWin32PresentationSupportKHR, - .p_vkGetSwapchainImagesKHR = wayland_vkGetSwapchainImagesKHR, .p_vkQueuePresentKHR = wayland_vkQueuePresentKHR, .p_get_host_surface_extension = wayland_get_host_surface_extension, .p_wine_get_host_surface = wayland_wine_get_host_surface, @@ -425,7 +415,6 @@ UINT WAYLAND_VulkanInit(UINT version, void *vulkan_handle, struct vulkan_funcs * LOAD_FUNCPTR(vkDestroySurfaceKHR); LOAD_FUNCPTR(vkDestroySwapchainKHR); LOAD_FUNCPTR(vkGetPhysicalDeviceWaylandPresentationSupportKHR); - LOAD_FUNCPTR(vkGetSwapchainImagesKHR); LOAD_FUNCPTR(vkQueuePresentKHR); #undef LOAD_FUNCPTR
diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index cc317df6dd6..1ab214493ae 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -80,7 +80,6 @@ static VkResult (*pvkCreateXlibSurfaceKHR)(VkInstance, const VkXlibSurfaceCreate static void (*pvkDestroySurfaceKHR)(VkInstance, VkSurfaceKHR, const VkAllocationCallbacks *); static void (*pvkDestroySwapchainKHR)(VkDevice, VkSwapchainKHR, const VkAllocationCallbacks *); static VkBool32 (*pvkGetPhysicalDeviceXlibPresentationSupportKHR)(VkPhysicalDevice, uint32_t, Display *, VisualID); -static VkResult (*pvkGetSwapchainImagesKHR)(VkDevice, VkSwapchainKHR, uint32_t *, VkImage *); static VkResult (*pvkQueuePresentKHR)(VkQueue, const VkPresentInfoKHR *);
static const struct vulkan_funcs vulkan_funcs; @@ -269,13 +268,6 @@ static VkBool32 X11DRV_vkGetPhysicalDeviceWin32PresentationSupportKHR(VkPhysical default_visual.visual->visualid); }
-static VkResult X11DRV_vkGetSwapchainImagesKHR(VkDevice device, - VkSwapchainKHR swapchain, uint32_t *count, VkImage *images) -{ - TRACE("%p, 0x%s %p %p\n", device, wine_dbgstr_longlong(swapchain), count, images); - return pvkGetSwapchainImagesKHR(device, swapchain, count, images); -} - static VkResult X11DRV_vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *present_info) { TRACE("%p, %p\n", queue, present_info); @@ -305,7 +297,6 @@ static const struct vulkan_funcs vulkan_funcs = NULL, NULL, X11DRV_vkGetPhysicalDeviceWin32PresentationSupportKHR, - X11DRV_vkGetSwapchainImagesKHR, X11DRV_vkQueuePresentKHR,
X11DRV_get_host_surface_extension, @@ -328,7 +319,6 @@ UINT X11DRV_VulkanInit( UINT version, void *vulkan_handle, struct vulkan_funcs * LOAD_FUNCPTR( vkDestroySurfaceKHR ); LOAD_FUNCPTR( vkDestroySwapchainKHR ); LOAD_FUNCPTR( vkGetPhysicalDeviceXlibPresentationSupportKHR ); - LOAD_FUNCPTR( vkGetSwapchainImagesKHR ); LOAD_FUNCPTR( vkQueuePresentKHR ); #undef LOAD_FUNCPTR
diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index 3dfa63de952..e707a56269c 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -21,7 +21,7 @@ #define __WINE_VULKAN_DRIVER_H
/* Wine internal vulkan driver version, needs to be bumped upon vulkan_funcs changes. */ -#define WINE_VULKAN_DRIVER_VERSION 22 +#define WINE_VULKAN_DRIVER_VERSION 23
struct vulkan_funcs { @@ -36,7 +36,6 @@ struct vulkan_funcs void * (*p_vkGetDeviceProcAddr)(VkDevice, const char *); void * (*p_vkGetInstanceProcAddr)(VkInstance, const char *); VkBool32 (*p_vkGetPhysicalDeviceWin32PresentationSupportKHR)(VkPhysicalDevice, uint32_t); - VkResult (*p_vkGetSwapchainImagesKHR)(VkDevice, VkSwapchainKHR, uint32_t *, VkImage *); VkResult (*p_vkQueuePresentKHR)(VkQueue, const VkPresentInfoKHR *);
/* winevulkan specific functions */
This merge request was approved by Jacek Caban.