[PATCH v2 6/7] wined3d: Protect wined3d_bo_slab_vk map fields with a mutex.

Zebediah Figura zfigura at codeweavers.com
Wed Nov 3 23:47:00 CDT 2021


So as to allow slabs to be mapped from the client thread.

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/wined3d/adapter_vk.c | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
index 8413429bd42..f8fa9b78811 100644
--- a/dlls/wined3d/adapter_vk.c
+++ b/dlls/wined3d/adapter_vk.c
@@ -845,28 +845,53 @@ static void wined3d_bo_vk_unmap(struct wined3d_bo_vk *bo, struct wined3d_context
     VK_CALL(vkUnmapMemory(device_vk->vk_device, bo->vk_memory));
 }
 
+static void wined3d_bo_slab_vk_lock(struct wined3d_bo_slab_vk *slab_vk, struct wined3d_context_vk *context_vk)
+{
+    wined3d_device_vk_allocator_lock(wined3d_device_vk(context_vk->c.device));
+}
+
+static void wined3d_bo_slab_vk_unlock(struct wined3d_bo_slab_vk *slab_vk, struct wined3d_context_vk *context_vk)
+{
+    wined3d_device_vk_allocator_unlock(wined3d_device_vk(context_vk->c.device));
+}
+
 void *wined3d_bo_slab_vk_map(struct wined3d_bo_slab_vk *slab_vk, struct wined3d_context_vk *context_vk)
 {
+    void *map_ptr;
+
     TRACE("slab_vk %p, context_vk %p.\n", slab_vk, context_vk);
 
+    wined3d_bo_slab_vk_lock(slab_vk, context_vk);
+
     if (!slab_vk->map_ptr && !(slab_vk->map_ptr = wined3d_bo_vk_map(&slab_vk->bo, context_vk)))
     {
+        wined3d_bo_slab_vk_unlock(slab_vk, context_vk);
         ERR("Failed to map slab.\n");
         return NULL;
     }
 
     ++slab_vk->map_count;
+    map_ptr = slab_vk->map_ptr;
 
-    return slab_vk->map_ptr;
+    wined3d_bo_slab_vk_unlock(slab_vk, context_vk);
+
+    return map_ptr;
 }
 
 void wined3d_bo_slab_vk_unmap(struct wined3d_bo_slab_vk *slab_vk, struct wined3d_context_vk *context_vk)
 {
+    wined3d_bo_slab_vk_lock(slab_vk, context_vk);
+
     if (--slab_vk->map_count)
+    {
+        wined3d_bo_slab_vk_unlock(slab_vk, context_vk);
         return;
+    }
 
     wined3d_bo_vk_unmap(&slab_vk->bo, context_vk);
     slab_vk->map_ptr = NULL;
+
+    wined3d_bo_slab_vk_unlock(slab_vk, context_vk);
 }
 
 VkAccessFlags vk_access_mask_from_buffer_usage(VkBufferUsageFlags usage)
-- 
2.33.0




More information about the wine-devel mailing list