[PATCH 3/5] wined3d: Map Vulkan adapter bo's persistently on 64-bit architectures.

Henri Verbeet hverbeet at codeweavers.com
Fri May 29 11:03:33 CDT 2020


Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
 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;
-- 
2.20.1




More information about the wine-devel mailing list