vkd3d: Create one vkd3d queue per Vulkan device queue.

Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
Philip Rebohle 2021-03-13 04:39:15 +01:00 committed by Hans-Kristian Arntzen
parent 3cd93781ff
commit 1e3c91579e
5 changed files with 62 additions and 70 deletions

View File

@ -42,8 +42,8 @@ static HRESULT vkd3d_create_binary_semaphore(struct d3d12_device *device, VkSema
return hresult_from_vk_result(vr); return hresult_from_vk_result(vr);
} }
HRESULT vkd3d_queue_create(struct d3d12_device *device, HRESULT vkd3d_queue_create(struct d3d12_device *device, uint32_t family_index, uint32_t queue_index,
uint32_t family_index, const VkQueueFamilyProperties *properties, struct vkd3d_queue **queue) const VkQueueFamilyProperties *properties, struct vkd3d_queue **queue)
{ {
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs; const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
VkCommandBufferAllocateInfo allocate_info; VkCommandBufferAllocateInfo allocate_info;
@ -70,7 +70,7 @@ HRESULT vkd3d_queue_create(struct d3d12_device *device,
object->timestamp_bits = properties->timestampValidBits; object->timestamp_bits = properties->timestampValidBits;
object->virtual_queue_count = 0; object->virtual_queue_count = 0;
VK_CALL(vkGetDeviceQueue(device->vk_device, family_index, 0, &object->vk_queue)); VK_CALL(vkGetDeviceQueue(device->vk_device, family_index, queue_index, &object->vk_queue));
TRACE("Created queue %p for queue family index %u.\n", object, family_index); TRACE("Created queue %p for queue family index %u.\n", object, family_index);
@ -10099,7 +10099,7 @@ static void d3d12_command_queue_bind_sparse(struct d3d12_command_queue *command_
queue = command_queue->vkd3d_queue; queue = command_queue->vkd3d_queue;
if (!(queue->vk_queue_flags & VK_QUEUE_SPARSE_BINDING_BIT)) if (!(queue->vk_queue_flags & VK_QUEUE_SPARSE_BINDING_BIT))
queue_sparse = command_queue->device->queues[VKD3D_QUEUE_FAMILY_SPARSE_BINDING]; queue_sparse = command_queue->device->queue_families[VKD3D_QUEUE_FAMILY_SPARSE_BINDING]->queues[0];
else else
queue_sparse = queue; queue_sparse = queue;

View File

@ -1772,62 +1772,29 @@ static void d3d12_device_destroy_vkd3d_queues(struct d3d12_device *device)
device->queue_families[j] = NULL; device->queue_families[j] = NULL;
} }
vkd3d_free(queue_family); for (i = 0; i < queue_family->queue_count; i++)
}
for (i = 0; i < VKD3D_QUEUE_FAMILY_COUNT; i++)
{
struct vkd3d_queue *queue = device->queues[i];
if (!queue)
continue;
/* Don't destroy the same queue twice */
for (j = i; j < VKD3D_QUEUE_FAMILY_COUNT; j++)
{ {
if (device->queues[j] == queue) if (queue_family->queues[i])
device->queues[j] = NULL; vkd3d_queue_destroy(queue_family->queues[i], device);
} }
vkd3d_queue_destroy(queue, device); vkd3d_free(queue_family->queues);
vkd3d_free(queue_family);
} }
} }
static HRESULT d3d12_device_create_vkd3d_queues(struct d3d12_device *device, static HRESULT d3d12_device_create_vkd3d_queues(struct d3d12_device *device,
const struct vkd3d_device_queue_info *queue_info) const struct vkd3d_device_queue_info *queue_info)
{ {
unsigned int i, j; unsigned int i, j, k;
HRESULT hr; HRESULT hr;
device->unique_queue_mask = 0; device->unique_queue_mask = 0;
device->queue_family_count = 0; device->queue_family_count = 0;
memset(device->queues, 0, sizeof(device->queues));
memset(device->queue_families, 0, sizeof(device->queue_families)); memset(device->queue_families, 0, sizeof(device->queue_families));
memset(device->queue_family_indices, 0, sizeof(device->queue_family_indices)); memset(device->queue_family_indices, 0, sizeof(device->queue_family_indices));
for (i = 0; i < VKD3D_QUEUE_FAMILY_COUNT; i++) for (i = 0, k = 0; i < VKD3D_QUEUE_FAMILY_COUNT; i++)
{
if (queue_info->family_index[i] == VK_QUEUE_FAMILY_IGNORED)
continue;
for (j = 0; j < i; j++)
{
if (queue_info->family_index[i] == queue_info->family_index[j])
device->queues[i] = device->queues[j];
}
if (device->queues[i])
continue;
if (FAILED((hr = vkd3d_queue_create(device, queue_info->family_index[i],
&queue_info->vk_properties[i], &device->queues[i]))))
goto out_destroy_queues;
if (i != VKD3D_QUEUE_FAMILY_INTERNAL_COMPUTE)
device->unique_queue_mask |= 1u << i;
}
for (i = 0; i < VKD3D_QUEUE_FAMILY_COUNT; i++)
{ {
struct vkd3d_queue_family_info *info; struct vkd3d_queue_family_info *info;
@ -1840,19 +1807,39 @@ static HRESULT d3d12_device_create_vkd3d_queues(struct d3d12_device *device,
if (device->queue_families[i]) if (device->queue_families[i])
continue; continue;
if (!(info = vkd3d_malloc(sizeof(*info)))) if (!(info = vkd3d_calloc(1, sizeof(*info))))
{ {
hr = E_OUTOFMEMORY; hr = E_OUTOFMEMORY;
goto out_destroy_queues; goto out_destroy_queues;
} }
info->queues = &device->queues[i]; if (queue_info->family_index[i] != VK_QUEUE_FAMILY_IGNORED)
info->queue_count = 1; {
info->queue_count = queue_info->vk_queue_create_info[k++].queueCount;
if (!(info->queues = vkd3d_calloc(info->queue_count, sizeof(*info->queues))))
{
hr = E_OUTOFMEMORY;
goto out_destroy_queues;
}
for (j = 0; j < info->queue_count; j++)
{
if (FAILED((hr = vkd3d_queue_create(device, queue_info->family_index[i],
j, &queue_info->vk_properties[i], &info->queues[j]))))
goto out_destroy_queues;
}
}
info->vk_family_index = queue_info->family_index[i]; info->vk_family_index = queue_info->family_index[i];
info->vk_queue_flags = queue_info->vk_properties[i].queueFlags; info->vk_queue_flags = queue_info->vk_properties[i].queueFlags;
info->timestamp_bits = queue_info->vk_properties[i].timestampValidBits;
device->queue_families[i] = info; device->queue_families[i] = info;
device->queue_family_indices[device->queue_family_count++] = info->vk_family_index; device->queue_family_indices[device->queue_family_count++] = info->vk_family_index;
if (info->queue_count && i != VKD3D_QUEUE_FAMILY_INTERNAL_COMPUTE)
device->unique_queue_mask |= 1u << i;
} }
return S_OK; return S_OK;
@ -4458,7 +4445,7 @@ static D3D12_TILED_RESOURCES_TIER d3d12_device_determine_tiled_resources_tier(st
if (!features->sparseBinding || !features->sparseResidencyAliased || if (!features->sparseBinding || !features->sparseResidencyAliased ||
!features->sparseResidencyBuffer || !features->sparseResidencyImage2D || !features->sparseResidencyBuffer || !features->sparseResidencyImage2D ||
!sparse_properties->residencyStandard2DBlockShape || !sparse_properties->residencyStandard2DBlockShape ||
!device->queues[VKD3D_QUEUE_FAMILY_SPARSE_BINDING]) !device->queue_families[VKD3D_QUEUE_FAMILY_SPARSE_BINDING]->queue_count)
return D3D12_TILED_RESOURCES_TIER_NOT_SUPPORTED; return D3D12_TILED_RESOURCES_TIER_NOT_SUPPORTED;
if (!features->shaderResourceResidency || !features->shaderResourceMinLod || if (!features->shaderResourceResidency || !features->shaderResourceMinLod ||
@ -4653,7 +4640,7 @@ static void d3d12_device_caps_init_feature_options3(struct d3d12_device *device)
{ {
D3D12_FEATURE_DATA_D3D12_OPTIONS3 *options3 = &device->d3d12_caps.options3; D3D12_FEATURE_DATA_D3D12_OPTIONS3 *options3 = &device->d3d12_caps.options3;
options3->CopyQueueTimestampQueriesSupported = !!device->queues[VKD3D_QUEUE_FAMILY_TRANSFER]->timestamp_bits; options3->CopyQueueTimestampQueriesSupported = !!device->queue_families[VKD3D_QUEUE_FAMILY_TRANSFER]->timestamp_bits;
options3->CastingFullyTypedFormatSupported = TRUE; options3->CastingFullyTypedFormatSupported = TRUE;
options3->WriteBufferImmediateSupportFlags = D3D12_COMMAND_LIST_SUPPORT_FLAG_DIRECT | options3->WriteBufferImmediateSupportFlags = D3D12_COMMAND_LIST_SUPPORT_FLAG_DIRECT |
D3D12_COMMAND_LIST_SUPPORT_FLAG_COMPUTE | D3D12_COMMAND_LIST_SUPPORT_FLAG_COPY; D3D12_COMMAND_LIST_SUPPORT_FLAG_COMPUTE | D3D12_COMMAND_LIST_SUPPORT_FLAG_COPY;

View File

@ -678,7 +678,7 @@ static HRESULT vkd3d_memory_allocator_init_clear_queue(struct vkd3d_memory_alloc
command_pool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; command_pool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
command_pool_info.pNext = NULL; command_pool_info.pNext = NULL;
command_pool_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; command_pool_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
command_pool_info.queueFamilyIndex = device->queues[VKD3D_QUEUE_FAMILY_INTERNAL_COMPUTE]->vk_family_index; command_pool_info.queueFamilyIndex = device->queue_families[VKD3D_QUEUE_FAMILY_INTERNAL_COMPUTE]->vk_family_index;
if ((vr = VK_CALL(vkCreateCommandPool(device->vk_device, &command_pool_info, if ((vr = VK_CALL(vkCreateCommandPool(device->vk_device, &command_pool_info,
NULL, &clear_queue->vk_command_pool))) < 0) NULL, &clear_queue->vk_command_pool))) < 0)
@ -743,6 +743,9 @@ HRESULT vkd3d_memory_allocator_init(struct vkd3d_memory_allocator *allocator, st
} }
vkd3d_va_map_init(&allocator->va_map); vkd3d_va_map_init(&allocator->va_map);
allocator->vkd3d_queue = d3d12_device_allocate_vkd3d_queue(device,
device->queue_families[VKD3D_QUEUE_FAMILY_INTERNAL_COMPUTE]);
return S_OK; return S_OK;
} }
@ -818,7 +821,7 @@ static HRESULT vkd3d_memory_allocator_flush_clears_locked(struct vkd3d_memory_al
struct vkd3d_memory_clear_queue *clear_queue = &allocator->clear_queue; struct vkd3d_memory_clear_queue *clear_queue = &allocator->clear_queue;
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs; const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
VkTimelineSemaphoreSubmitInfoKHR timeline_info; VkTimelineSemaphoreSubmitInfoKHR timeline_info;
struct vkd3d_queue *queue, *internal_queue; struct vkd3d_queue_family_info *queue_family;
VkCommandBufferBeginInfo begin_info; VkCommandBufferBeginInfo begin_info;
uint32_t queue_mask, queue_index; uint32_t queue_mask, queue_index;
VkCommandBuffer vk_cmd_buffer; VkCommandBuffer vk_cmd_buffer;
@ -833,7 +836,6 @@ static HRESULT vkd3d_memory_allocator_flush_clears_locked(struct vkd3d_memory_al
/* Record commands late so that we can simply remove allocations from /* Record commands late so that we can simply remove allocations from
* the queue if they got freed before the clear commands got dispatched, * the queue if they got freed before the clear commands got dispatched,
* rather than rewriting the command buffer or dispatching the clear */ * rather than rewriting the command buffer or dispatching the clear */
internal_queue = device->queues[VKD3D_QUEUE_FAMILY_INTERNAL_COMPUTE];
vk_cmd_buffer = clear_queue->vk_command_buffers[clear_queue->command_buffer_index]; vk_cmd_buffer = clear_queue->vk_command_buffers[clear_queue->command_buffer_index];
vkd3d_memory_allocator_wait_clear_semaphore(allocator, device, vkd3d_memory_allocator_wait_clear_semaphore(allocator, device,
@ -871,7 +873,7 @@ static HRESULT vkd3d_memory_allocator_flush_clears_locked(struct vkd3d_memory_al
} }
if (!(vk_queue = vkd3d_queue_acquire(internal_queue))) if (!(vk_queue = vkd3d_queue_acquire(allocator->vkd3d_queue)))
return E_FAIL; return E_FAIL;
memset(&timeline_info, 0, sizeof(timeline_info)); memset(&timeline_info, 0, sizeof(timeline_info));
@ -888,7 +890,7 @@ static HRESULT vkd3d_memory_allocator_flush_clears_locked(struct vkd3d_memory_al
submit_info.pSignalSemaphores = &clear_queue->vk_semaphore; submit_info.pSignalSemaphores = &clear_queue->vk_semaphore;
vr = VK_CALL(vkQueueSubmit(vk_queue, 1, &submit_info, VK_NULL_HANDLE)); vr = VK_CALL(vkQueueSubmit(vk_queue, 1, &submit_info, VK_NULL_HANDLE));
vkd3d_queue_release(internal_queue); vkd3d_queue_release(allocator->vkd3d_queue);
if (vr < 0) if (vr < 0)
{ {
@ -914,18 +916,21 @@ static HRESULT vkd3d_memory_allocator_flush_clears_locked(struct vkd3d_memory_al
while (queue_mask) while (queue_mask)
{ {
queue_index = vkd3d_bitmask_iter32(&queue_mask); queue_index = vkd3d_bitmask_iter32(&queue_mask);
queue = device->queues[queue_index]; queue_family = device->queue_families[queue_index];
if (!(vk_queue = vkd3d_queue_acquire(queue))) for (i = 0; i < queue_family->queue_count; i++)
return E_FAIL;
vr = VK_CALL(vkQueueSubmit(vk_queue, 1, &submit_info, VK_NULL_HANDLE));
vkd3d_queue_release(queue);
if (vr < 0)
{ {
ERR("Failed to submit semaphore wait, vr %d.\n", vr); if (!(vk_queue = vkd3d_queue_acquire(queue_family->queues[i])))
return hresult_from_vk_result(vr); return E_FAIL;
vr = VK_CALL(vkQueueSubmit(vk_queue, 1, &submit_info, VK_NULL_HANDLE));
vkd3d_queue_release(queue_family->queues[i]);
if (vr < 0)
{
ERR("Failed to submit semaphore wait, vr %d.\n", vr);
return hresult_from_vk_result(vr);
}
} }
} }

View File

@ -2056,7 +2056,7 @@ static HRESULT d3d12_resource_bind_sparse_metadata(struct d3d12_resource *resour
bind_info.signalSemaphoreCount = 0; bind_info.signalSemaphoreCount = 0;
bind_info.pSignalSemaphores = NULL; bind_info.pSignalSemaphores = NULL;
vkd3d_queue = device->queues[VKD3D_QUEUE_FAMILY_SPARSE_BINDING]; vkd3d_queue = device->queue_families[VKD3D_QUEUE_FAMILY_SPARSE_BINDING]->queues[0];
if (!(vk_queue = vkd3d_queue_acquire(vkd3d_queue))) if (!(vk_queue = vkd3d_queue_acquire(vkd3d_queue)))
{ {

View File

@ -704,6 +704,7 @@ struct vkd3d_memory_allocator
struct vkd3d_va_map va_map; struct vkd3d_va_map va_map;
struct vkd3d_queue *vkd3d_queue;
struct vkd3d_memory_clear_queue clear_queue; struct vkd3d_memory_clear_queue clear_queue;
}; };
@ -1793,9 +1794,8 @@ struct vkd3d_queue
}; };
VkQueue vkd3d_queue_acquire(struct vkd3d_queue *queue); VkQueue vkd3d_queue_acquire(struct vkd3d_queue *queue);
HRESULT vkd3d_queue_create(struct d3d12_device *device, HRESULT vkd3d_queue_create(struct d3d12_device *device, uint32_t family_index, uint32_t queue_index,
uint32_t family_index, const VkQueueFamilyProperties *properties, const VkQueueFamilyProperties *properties, struct vkd3d_queue **queue);
struct vkd3d_queue **queue);
void vkd3d_queue_destroy(struct vkd3d_queue *queue, struct d3d12_device *device); void vkd3d_queue_destroy(struct vkd3d_queue *queue, struct d3d12_device *device);
void vkd3d_queue_release(struct vkd3d_queue *queue); void vkd3d_queue_release(struct vkd3d_queue *queue);
@ -2482,6 +2482,7 @@ struct vkd3d_queue_family_info
struct vkd3d_queue **queues; struct vkd3d_queue **queues;
uint32_t queue_count; uint32_t queue_count;
uint32_t vk_family_index; uint32_t vk_family_index;
uint32_t timestamp_bits;
VkQueueFlags vk_queue_flags; VkQueueFlags vk_queue_flags;
}; };
@ -2509,10 +2510,9 @@ struct d3d12_device
struct vkd3d_vulkan_info vk_info; struct vkd3d_vulkan_info vk_info;
struct vkd3d_physical_device_info device_info; struct vkd3d_physical_device_info device_info;
struct vkd3d_queue *queues[VKD3D_QUEUE_FAMILY_COUNT];
struct vkd3d_queue_family_info *queue_families[VKD3D_QUEUE_FAMILY_COUNT]; struct vkd3d_queue_family_info *queue_families[VKD3D_QUEUE_FAMILY_COUNT];
uint32_t queue_family_indices[VKD3D_QUEUE_FAMILY_COUNT]; uint32_t queue_family_indices[VKD3D_QUEUE_FAMILY_COUNT];
unsigned int queue_family_count; uint32_t queue_family_count;
uint32_t unique_queue_mask; uint32_t unique_queue_mask;
struct vkd3d_instance *vkd3d_instance; struct vkd3d_instance *vkd3d_instance;