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:
parent
7359686609
commit
b0309f6f90
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue