[PATCH vkd3d 2/2] vkd3d: Map copy queues to compute queues if necessary and supported.
Conor McCarthy
cmccarthy at codeweavers.com
Fri Jan 21 08:38:09 CST 2022
In cases where there is only one or a small number of direct queues,
mapping copy to compute may prevent a fence deadlock caused by sending a
wait and signal to the same Vk queue.
Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
---
libs/vkd3d/device.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index ce570ffe..6d2f30ea 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -1767,8 +1767,18 @@ 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->vk_properties[VKD3D_QUEUE_FAMILY_COMPUTE].queueCount
+ >= info->vk_properties[VKD3D_QUEUE_FAMILY_DIRECT].queueCount)
+ {
+ 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. */
--
2.34.1
More information about the wine-devel
mailing list