Module: vkd3d Branch: master Commit: 5366ca7001b51cca2d4ee485435b667b62d983ba URL: https://gitlab.winehq.org/wine/vkd3d/-/commit/5366ca7001b51cca2d4ee485435b66...
Author: Conor McCarthy cmccarthy@codeweavers.com Date: Thu Apr 27 15:05:58 2023 +1000
vkd3d: Synchronise concurrent descriptor heap binding by multiple command lists.
It is possible for multiple command lists to use the same heap, and submit it simultaneously to multiple d3d12 queues.
---
libs/vkd3d/command.c | 10 +++++++++- libs/vkd3d/resource.c | 4 +++- libs/vkd3d/vkd3d_private.h | 3 ++- 3 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index 094466d2..81ddccb4 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -3176,7 +3176,11 @@ static void command_list_flush_vk_heap_updates(struct d3d12_command_list *list) unsigned int i;
for (i = 0; i < list->descriptor_heap_count; ++i) - d3d12_desc_flush_vk_heap_updates(list->descriptor_heaps[i], device); + { + vkd3d_mutex_lock(&list->descriptor_heaps[i]->vk_sets_mutex); + d3d12_desc_flush_vk_heap_updates_locked(list->descriptor_heaps[i], device); + vkd3d_mutex_unlock(&list->descriptor_heaps[i]->vk_sets_mutex); + } list->descriptor_heap_count = 0; }
@@ -3215,6 +3219,8 @@ static void d3d12_command_list_bind_descriptor_heap(struct d3d12_command_list *l list->descriptor_heaps[list->descriptor_heap_count++] = heap; }
+ vkd3d_mutex_lock(&heap->vk_sets_mutex); + for (set = 0; set < ARRAY_SIZE(heap->vk_descriptor_sets); ++set) { VkDescriptorSet vk_descriptor_set = heap->vk_descriptor_sets[set].vk_set; @@ -3225,6 +3231,8 @@ static void d3d12_command_list_bind_descriptor_heap(struct d3d12_command_list *l VK_CALL(vkCmdBindDescriptorSets(list->vk_command_buffer, bindings->vk_bind_point, rs->vk_pipeline_layout, rs->vk_set_count + set, 1, &vk_descriptor_set, 0, NULL)); } + + vkd3d_mutex_unlock(&heap->vk_sets_mutex); }
static void d3d12_command_list_update_heap_descriptors(struct d3d12_command_list *list, diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c index d12191a9..213b2dbb 100644 --- a/libs/vkd3d/resource.c +++ b/libs/vkd3d/resource.c @@ -2323,7 +2323,7 @@ static void d3d12_desc_write_vk_heap(struct d3d12_descriptor_heap *descriptor_he writes->count = i; }
-void d3d12_desc_flush_vk_heap_updates(struct d3d12_descriptor_heap *descriptor_heap, struct d3d12_device *device) +void d3d12_desc_flush_vk_heap_updates_locked(struct d3d12_descriptor_heap *descriptor_heap, struct d3d12_device *device) { const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs; struct d3d12_desc *descriptors, *src; @@ -3724,6 +3724,7 @@ static ULONG STDMETHODCALLTYPE d3d12_descriptor_heap_Release(ID3D12DescriptorHea }
VK_CALL(vkDestroyDescriptorPool(device->vk_device, heap->vk_descriptor_pool, NULL)); + vkd3d_mutex_destroy(&heap->vk_sets_mutex);
vkd3d_free(heap);
@@ -3946,6 +3947,7 @@ static HRESULT d3d12_descriptor_heap_init(struct d3d12_descriptor_heap *descript return hr;
d3d12_descriptor_heap_vk_descriptor_sets_init(descriptor_heap, device, desc); + vkd3d_mutex_init(&descriptor_heap->vk_sets_mutex);
d3d12_device_add_ref(descriptor_heap->device = device);
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index 0af643b0..79474414 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -988,13 +988,14 @@ struct d3d12_descriptor_heap
VkDescriptorPool vk_descriptor_pool; struct d3d12_descriptor_heap_vk_set vk_descriptor_sets[VKD3D_SET_INDEX_COUNT]; + struct vkd3d_mutex vk_sets_mutex;
unsigned int volatile dirty_list_head;
uint8_t DECLSPEC_ALIGN(sizeof(void *)) descriptors[]; };
-void d3d12_desc_flush_vk_heap_updates(struct d3d12_descriptor_heap *descriptor_heap, struct d3d12_device *device); +void d3d12_desc_flush_vk_heap_updates_locked(struct d3d12_descriptor_heap *descriptor_heap, struct d3d12_device *device);
static inline struct d3d12_descriptor_heap *d3d12_desc_get_descriptor_heap(const struct d3d12_desc *descriptor) {