From 859514a684a1ae3bef57d4adc913d49d7a4b438b Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Fri, 29 May 2020 20:33:33 +0430 Subject: [PATCH] wined3d: Map Vulkan adapter bo's persistently on 64-bit architectures. Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- dlls/wined3d/adapter_vk.c | 9 +++++++++ dlls/wined3d/context_vk.c | 5 +++++ dlls/wined3d/wined3d_private.h | 1 + 3 files changed, 15 insertions(+) diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c index 0cd77c4e6b3..cbde5d3683c 100644 --- a/dlls/wined3d/adapter_vk.c +++ b/dlls/wined3d/adapter_vk.c @@ -844,6 +844,9 @@ static void *wined3d_bo_vk_map(struct wined3d_bo_vk *bo, struct wined3d_context_ void *map_ptr; VkResult vr; + if (bo->map_ptr) + return bo->map_ptr; + vk_info = context_vk->vk_info; device_vk = wined3d_device_vk(context_vk->c.device); @@ -872,6 +875,9 @@ static void *wined3d_bo_vk_map(struct wined3d_bo_vk *bo, struct wined3d_context_ return NULL; } + if (sizeof(map_ptr) >= sizeof(uint64_t)) + bo->map_ptr = map_ptr; + return map_ptr; } @@ -881,6 +887,9 @@ static void wined3d_bo_vk_unmap(struct wined3d_bo_vk *bo, struct wined3d_context struct wined3d_device_vk *device_vk; struct wined3d_bo_slab_vk *slab; + if (bo->map_ptr) + return; + if ((slab = bo->slab)) { if (--slab->map_count) diff --git a/dlls/wined3d/context_vk.c b/dlls/wined3d/context_vk.c index 45924eb16b1..a7c77dd5a6b 100644 --- a/dlls/wined3d/context_vk.c +++ b/dlls/wined3d/context_vk.c @@ -483,6 +483,7 @@ BOOL wined3d_context_vk_create_bo(struct wined3d_context_vk *context_vk, VkDevic return FALSE; } + bo->map_ptr = NULL; bo->buffer_offset = 0; bo->size = size; bo->usage = usage; @@ -791,6 +792,8 @@ void wined3d_context_vk_destroy_sampler(struct wined3d_context_vk *context_vk, void wined3d_context_vk_destroy_bo(struct wined3d_context_vk *context_vk, const struct wined3d_bo_vk *bo) { + struct wined3d_device_vk *device_vk = wined3d_device_vk(context_vk->c.device); + const struct wined3d_vk_info *vk_info = context_vk->vk_info; size_t object_size, idx; TRACE("context_vk %p, bo %p.\n", context_vk, bo); @@ -810,6 +813,8 @@ void wined3d_context_vk_destroy_bo(struct wined3d_context_vk *context_vk, const return; } + if (bo->map_ptr) + VK_CALL(vkUnmapMemory(device_vk->vk_device, bo->vk_memory)); wined3d_context_vk_destroy_memory(context_vk, bo->vk_memory, bo->command_buffer_id); } diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 49379b3ca5d..8eee18ad17a 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1554,6 +1554,7 @@ struct wined3d_bo_vk struct wined3d_bo_slab_vk *slab; VkDeviceMemory vk_memory; + void *map_ptr; VkDeviceSize buffer_offset; VkDeviceSize memory_offset;