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 <philip.rebohle@tu-dortmund.de>
This commit is contained in:
Philip Rebohle 2021-03-13 03:20:42 +01:00 committed by Hans-Kristian Arntzen
parent 7359686609
commit b0309f6f90
3 changed files with 40 additions and 20 deletions

View File

@ -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;
}

View File

@ -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;

View File

@ -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);