vkd3d: Introduce vkd3d_queue_family_info.
Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
parent
b4f48bf2d6
commit
4c0a0b0467
|
@ -1765,7 +1765,7 @@ static HRESULT d3d12_command_allocator_init(struct d3d12_command_allocator *allo
|
||||||
* Memory is owned by the pool and CommandBuffers become lightweight handles,
|
* Memory is owned by the pool and CommandBuffers become lightweight handles,
|
||||||
* assuming a half-decent driver implementation. */
|
* assuming a half-decent driver implementation. */
|
||||||
command_pool_info.flags = 0;
|
command_pool_info.flags = 0;
|
||||||
command_pool_info.queueFamilyIndex = queue->vk_family_index;
|
command_pool_info.queueFamilyIndex = queue_family->vk_family_index;
|
||||||
|
|
||||||
if ((vr = VK_CALL(vkCreateCommandPool(device->vk_device, &command_pool_info, NULL,
|
if ((vr = VK_CALL(vkCreateCommandPool(device->vk_device, &command_pool_info, NULL,
|
||||||
&allocator->vk_command_pool))) < 0)
|
&allocator->vk_command_pool))) < 0)
|
||||||
|
|
|
@ -1758,6 +1758,23 @@ static void d3d12_device_destroy_vkd3d_queues(struct d3d12_device *device)
|
||||||
{
|
{
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < VKD3D_QUEUE_FAMILY_COUNT; i++)
|
||||||
|
{
|
||||||
|
struct vkd3d_queue_family_info *queue_family = device->queue_families[i];
|
||||||
|
|
||||||
|
if (!queue_family)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Don't destroy the same queue family twice */
|
||||||
|
for (j = i; j < VKD3D_QUEUE_FAMILY_COUNT; j++)
|
||||||
|
{
|
||||||
|
if (device->queue_families[j] == queue_family)
|
||||||
|
device->queue_families[j] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
vkd3d_free(queue_family);
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < VKD3D_QUEUE_FAMILY_COUNT; i++)
|
for (i = 0; i < VKD3D_QUEUE_FAMILY_COUNT; i++)
|
||||||
{
|
{
|
||||||
struct vkd3d_queue *queue = device->queues[i];
|
struct vkd3d_queue *queue = device->queues[i];
|
||||||
|
@ -1785,6 +1802,7 @@ static HRESULT d3d12_device_create_vkd3d_queues(struct d3d12_device *device,
|
||||||
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->queues, 0, sizeof(device->queues));
|
||||||
|
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; i < VKD3D_QUEUE_FAMILY_COUNT; i++)
|
||||||
|
@ -1807,8 +1825,34 @@ static HRESULT d3d12_device_create_vkd3d_queues(struct d3d12_device *device,
|
||||||
|
|
||||||
if (i != VKD3D_QUEUE_FAMILY_INTERNAL_COMPUTE)
|
if (i != VKD3D_QUEUE_FAMILY_INTERNAL_COMPUTE)
|
||||||
device->unique_queue_mask |= 1u << i;
|
device->unique_queue_mask |= 1u << i;
|
||||||
|
}
|
||||||
|
|
||||||
device->queue_family_indices[device->queue_family_count++] = queue_info->family_index[i];
|
for (i = 0; i < VKD3D_QUEUE_FAMILY_COUNT; i++)
|
||||||
|
{
|
||||||
|
struct vkd3d_queue_family_info *info;
|
||||||
|
|
||||||
|
for (j = 0; j < i; j++)
|
||||||
|
{
|
||||||
|
if (queue_info->family_index[i] == queue_info->family_index[j])
|
||||||
|
device->queue_families[i] = device->queue_families[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (device->queue_families[i])
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!(info = vkd3d_malloc(sizeof(*info))))
|
||||||
|
{
|
||||||
|
hr = E_OUTOFMEMORY;
|
||||||
|
goto out_destroy_queues;
|
||||||
|
}
|
||||||
|
|
||||||
|
info->queues = &device->queues[i];
|
||||||
|
info->queue_count = 1;
|
||||||
|
info->vk_family_index = queue_info->family_index[i];
|
||||||
|
info->vk_queue_flags = queue_info->vk_properties[i].queueFlags;
|
||||||
|
|
||||||
|
device->queue_families[i] = info;
|
||||||
|
device->queue_family_indices[device->queue_family_count++] = info->vk_family_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|
|
@ -2476,6 +2476,14 @@ enum vkd3d_queue_family
|
||||||
VKD3D_QUEUE_FAMILY_COUNT
|
VKD3D_QUEUE_FAMILY_COUNT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct vkd3d_queue_family_info
|
||||||
|
{
|
||||||
|
struct vkd3d_queue **queues;
|
||||||
|
uint32_t queue_count;
|
||||||
|
uint32_t vk_family_index;
|
||||||
|
VkQueueFlags vk_queue_flags;
|
||||||
|
};
|
||||||
|
|
||||||
/* ID3D12Device */
|
/* ID3D12Device */
|
||||||
typedef ID3D12Device6 d3d12_device_iface;
|
typedef ID3D12Device6 d3d12_device_iface;
|
||||||
|
|
||||||
|
@ -2501,6 +2509,7 @@ struct d3d12_device
|
||||||
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 *queues[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;
|
unsigned int queue_family_count;
|
||||||
uint32_t unique_queue_mask;
|
uint32_t unique_queue_mask;
|
||||||
|
|
Loading…
Reference in New Issue