diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index ac7c1e39..2f114171 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -3212,6 +3212,9 @@ static HRESULT d3d12_command_queue_init(struct d3d12_command_queue *queue, case D3D12_COMMAND_LIST_TYPE_COPY: queue_family_index = device->copy_queue_family_index; break; + case D3D12_COMMAND_LIST_TYPE_COMPUTE: + queue_family_index = device->compute_queue_family_index; + break; default: FIXME("Unhandled command list type %#x.\n", desc->Type); return E_NOTIMPL; diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index 00e0b486..d3ae149e 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -360,7 +360,7 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device) }; const struct vkd3d_vk_instance_procs *vk_procs = &device->vkd3d_instance.vk_procs; - unsigned int direct_queue_family_index, copy_queue_family_index; + unsigned int direct_queue_family_index, copy_queue_family_index, compute_queue_family_index; VkQueueFamilyProperties *queue_properties; VkPhysicalDeviceFeatures device_features; VkDeviceQueueCreateInfo *queue_info; @@ -393,6 +393,7 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device) direct_queue_family_index = ~0u; copy_queue_family_index = ~0u; + compute_queue_family_index = ~0u; for (i = 0; i < queue_family_count; ++i) { static float priorities[] = {1.0f}; @@ -409,6 +410,8 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device) direct_queue_family_index = i; if (queue_properties[i].queueFlags & VK_QUEUE_TRANSFER_BIT) copy_queue_family_index = i; + if ((queue_properties[i].queueFlags & VK_QUEUE_COMPUTE_BIT) == VK_QUEUE_COMPUTE_BIT) + compute_queue_family_index = i; } vkd3d_free(queue_properties); @@ -424,6 +427,11 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device) vkd3d_free(queue_info); return E_FAIL; } + if (compute_queue_family_index == ~0u) + { + /* No compute-only queue family, reuse the direct queue family with graphics and compute. */ + compute_queue_family_index = direct_queue_family_index; + } device->direct_queue_family_index = direct_queue_family_index; device->copy_queue_family_index = copy_queue_family_index; diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h index ba1248e6..8520a77c 100644 --- a/libs/vkd3d/vkd3d_private.h +++ b/libs/vkd3d/vkd3d_private.h @@ -394,6 +394,7 @@ struct d3d12_device unsigned int direct_queue_family_index; unsigned int copy_queue_family_index; + unsigned int compute_queue_family_index; VkPhysicalDeviceMemoryProperties memory_properties; struct vkd3d_instance vkd3d_instance;