From b0309f6f905ad6732d10ab74e54306a3dbd2ea71 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Sat, 13 Mar 2021 03:20:42 +0100 Subject: [PATCH] vkd3d: Introduce d3d12_device_allocate_vkd3d_queue. Replaces d3d12_device_get_vkd3d_queue when mapping D3D12 command queues to Vulkan device queues. Signed-off-by: Philip Rebohle --- libs/vkd3d/command.c | 51 ++++++++++++++++++++++++-------------- libs/vkd3d/resource.c | 2 +- libs/vkd3d/vkd3d_private.h | 7 +++++- 3 files changed, 40 insertions(+), 20 deletions(-) diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index 9c83bd42..d14fe5c9 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -68,6 +68,7 @@ HRESULT vkd3d_queue_create(struct d3d12_device *device, object->vk_family_index = family_index; object->vk_queue_flags = properties->queueFlags; object->timestamp_bits = properties->timestampValidBits; + object->virtual_queue_count = 0; VK_CALL(vkGetDeviceQueue(device->vk_device, family_index, 0, &object->vk_queue)); @@ -1738,23 +1739,39 @@ struct vkd3d_queue_family_info *d3d12_device_get_vkd3d_queue_family(struct d3d12 } } -struct vkd3d_queue *d3d12_device_get_vkd3d_queue(struct d3d12_device *device, - D3D12_COMMAND_LIST_TYPE type) +struct vkd3d_queue *d3d12_device_allocate_vkd3d_queue(struct d3d12_device *device, + struct vkd3d_queue_family_info *queue_family) { - switch (type) + struct vkd3d_queue *queue; + unsigned int i; + + pthread_mutex_lock(&device->mutex); + + /* Select the queue that has the lowest number of virtual queues mapped + * to it, in order to avoid situations where we map multiple queues to + * the same vkd3d queue while others are unused */ + queue = queue_family->queues[0]; + + for (i = 1; i < queue_family->queue_count; i++) { - case D3D12_COMMAND_LIST_TYPE_DIRECT: - return device->queues[VKD3D_QUEUE_FAMILY_GRAPHICS]; - case D3D12_COMMAND_LIST_TYPE_COMPUTE: - return device->queues[VKD3D_QUEUE_FAMILY_COMPUTE]; - case D3D12_COMMAND_LIST_TYPE_COPY: - return device->queues[VKD3D_QUEUE_FAMILY_TRANSFER]; - default: - FIXME("Unhandled command list type %#x.\n", type); - return NULL; + if (queue_family->queues[i]->virtual_queue_count < queue->virtual_queue_count) + queue = queue_family->queues[i]; } + + queue->virtual_queue_count++; + pthread_mutex_unlock(&device->mutex); + return queue; } +void d3d12_device_unmap_vkd3d_queue(struct d3d12_device *device, + struct vkd3d_queue *queue) +{ + pthread_mutex_lock(&device->mutex); + queue->virtual_queue_count--; + pthread_mutex_unlock(&device->mutex); +} + + static HRESULT d3d12_command_allocator_init(struct d3d12_command_allocator *allocator, struct d3d12_device *device, D3D12_COMMAND_LIST_TYPE type) { @@ -8799,6 +8816,7 @@ static ULONG STDMETHODCALLTYPE d3d12_command_queue_Release(ID3D12CommandQueue *i vkd3d_private_store_destroy(&command_queue->private_store); d3d12_command_queue_submit_stop(command_queue); + d3d12_device_unmap_vkd3d_queue(device, command_queue->vkd3d_queue); pthread_join(command_queue->submission_thread, NULL); pthread_mutex_destroy(&command_queue->queue_lock); pthread_cond_destroy(&command_queue->queue_cond); @@ -10298,12 +10316,8 @@ static HRESULT d3d12_command_queue_init(struct d3d12_command_queue *queue, if (!queue->desc.NodeMask) queue->desc.NodeMask = 0x1; - if (!(queue->vkd3d_queue = d3d12_device_get_vkd3d_queue(device, desc->Type))) - { - hr = E_NOTIMPL; - goto fail; - } - + queue->vkd3d_queue = d3d12_device_allocate_vkd3d_queue(device, + d3d12_device_get_vkd3d_queue_family(device, desc->Type)); queue->submissions = NULL; queue->submissions_count = 0; queue->submissions_size = 0; @@ -10358,6 +10372,7 @@ fail_private_store: fail_pthread_cond: pthread_mutex_destroy(&queue->queue_lock); fail: + d3d12_device_unmap_vkd3d_queue(device, queue->vkd3d_queue); return hr; } diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c index 416ab25c..cfe6bd86 100644 --- a/libs/vkd3d/resource.c +++ b/libs/vkd3d/resource.c @@ -5633,7 +5633,7 @@ static HRESULT vkd3d_init_null_resources_data(struct vkd3d_null_resources *null_ VkQueue vk_queue; VkResult vr; - queue = d3d12_device_get_vkd3d_queue(device, D3D12_COMMAND_LIST_TYPE_DIRECT); + queue = d3d12_device_get_vkd3d_queue_family(device, D3D12_COMMAND_LIST_TYPE_DIRECT)->queues[0]; command_pool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; command_pool_info.pNext = NULL; diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index cadb2aca..3d41b3e6 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -1789,6 +1789,7 @@ struct vkd3d_queue uint32_t vk_family_index; VkQueueFlags vk_queue_flags; uint32_t timestamp_bits; + uint32_t virtual_queue_count; }; VkQueue vkd3d_queue_acquire(struct vkd3d_queue *queue); @@ -2551,8 +2552,12 @@ struct d3d12_device HRESULT d3d12_device_create(struct vkd3d_instance *instance, const struct vkd3d_device_create_info *create_info, struct d3d12_device **device); -struct vkd3d_queue *d3d12_device_get_vkd3d_queue(struct d3d12_device *device, +struct vkd3d_queue_family_info *d3d12_device_get_vkd3d_queue_family(struct d3d12_device *device, D3D12_COMMAND_LIST_TYPE type); +struct vkd3d_queue *d3d12_device_allocate_vkd3d_queue(struct d3d12_device *device, + struct vkd3d_queue_family_info *queue_family); +void d3d12_device_unmap_vkd3d_queue(struct d3d12_device *device, + struct vkd3d_queue *queue); bool d3d12_device_is_uma(struct d3d12_device *device, bool *coherent); void d3d12_device_mark_as_removed(struct d3d12_device *device, HRESULT reason, const char *message, ...) VKD3D_PRINTF_FUNC(3, 4);