Zebediah Figura : wined3d: Protect wined3d_bo_slab_vk map fields with a mutex.
Alexandre Julliard
julliard at winehq.org
Thu Nov 4 17:04:21 CDT 2021
Module: wine
Branch: master
Commit: b1ae6fd3f4b80f4ef8de4a1e1f43fb7e8db17ee4
URL: https://source.winehq.org/git/wine.git/?a=commit;h=b1ae6fd3f4b80f4ef8de4a1e1f43fb7e8db17ee4
Author: Zebediah Figura <zfigura at codeweavers.com>
Date: Wed Nov 3 23:47:00 2021 -0500
wined3d: Protect wined3d_bo_slab_vk map fields with a mutex.
So as to allow slabs to be mapped from the client thread.
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
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 cbf7c94fd3a..a6b3df36002 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)
More information about the wine-cvs
mailing list