The current implementation maps copy to direct unless a dedicated copy queue is present. Compute queues are often more lightly loaded and there is usually more than one available.
Signed-off-by: Conor McCarthy cmccarthy@codeweavers.com --- libs/vkd3d/device.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index 757d4ac..ad32ff2 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -1667,8 +1667,16 @@ static HRESULT vkd3d_select_queues(const struct vkd3d_instance *vkd3d_instance, } if (info->family_index[VKD3D_QUEUE_FAMILY_TRANSFER] == ~0u) { - info->family_index[VKD3D_QUEUE_FAMILY_TRANSFER] = info->family_index[VKD3D_QUEUE_FAMILY_DIRECT]; - info->vk_properties[VKD3D_QUEUE_FAMILY_TRANSFER] = info->vk_properties[VKD3D_QUEUE_FAMILY_DIRECT]; + if (info->vk_properties[VKD3D_QUEUE_FAMILY_COMPUTE].queueFlags & VK_QUEUE_TRANSFER_BIT) + { + info->family_index[VKD3D_QUEUE_FAMILY_TRANSFER] = info->family_index[VKD3D_QUEUE_FAMILY_COMPUTE]; + info->vk_properties[VKD3D_QUEUE_FAMILY_TRANSFER] = info->vk_properties[VKD3D_QUEUE_FAMILY_COMPUTE]; + } + else + { + info->family_index[VKD3D_QUEUE_FAMILY_TRANSFER] = info->family_index[VKD3D_QUEUE_FAMILY_DIRECT]; + info->vk_properties[VKD3D_QUEUE_FAMILY_TRANSFER] = info->vk_properties[VKD3D_QUEUE_FAMILY_DIRECT]; + } }
/* Compact the array. */