libs/vkd3d: Create a compute queue family.

This commit is contained in:
Sven Hesse 2017-07-20 12:05:24 +02:00
parent c790aabb4d
commit dadce84a4b
3 changed files with 13 additions and 1 deletions

View File

@ -3212,6 +3212,9 @@ static HRESULT d3d12_command_queue_init(struct d3d12_command_queue *queue,
case D3D12_COMMAND_LIST_TYPE_COPY: case D3D12_COMMAND_LIST_TYPE_COPY:
queue_family_index = device->copy_queue_family_index; queue_family_index = device->copy_queue_family_index;
break; break;
case D3D12_COMMAND_LIST_TYPE_COMPUTE:
queue_family_index = device->compute_queue_family_index;
break;
default: default:
FIXME("Unhandled command list type %#x.\n", desc->Type); FIXME("Unhandled command list type %#x.\n", desc->Type);
return E_NOTIMPL; return E_NOTIMPL;

View File

@ -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; 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; VkQueueFamilyProperties *queue_properties;
VkPhysicalDeviceFeatures device_features; VkPhysicalDeviceFeatures device_features;
VkDeviceQueueCreateInfo *queue_info; VkDeviceQueueCreateInfo *queue_info;
@ -393,6 +393,7 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device)
direct_queue_family_index = ~0u; direct_queue_family_index = ~0u;
copy_queue_family_index = ~0u; copy_queue_family_index = ~0u;
compute_queue_family_index = ~0u;
for (i = 0; i < queue_family_count; ++i) for (i = 0; i < queue_family_count; ++i)
{ {
static float priorities[] = {1.0f}; static float priorities[] = {1.0f};
@ -409,6 +410,8 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device)
direct_queue_family_index = i; direct_queue_family_index = i;
if (queue_properties[i].queueFlags & VK_QUEUE_TRANSFER_BIT) if (queue_properties[i].queueFlags & VK_QUEUE_TRANSFER_BIT)
copy_queue_family_index = i; 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); vkd3d_free(queue_properties);
@ -424,6 +427,11 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device)
vkd3d_free(queue_info); vkd3d_free(queue_info);
return E_FAIL; 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->direct_queue_family_index = direct_queue_family_index;
device->copy_queue_family_index = copy_queue_family_index; device->copy_queue_family_index = copy_queue_family_index;

View File

@ -394,6 +394,7 @@ struct d3d12_device
unsigned int direct_queue_family_index; unsigned int direct_queue_family_index;
unsigned int copy_queue_family_index; unsigned int copy_queue_family_index;
unsigned int compute_queue_family_index;
VkPhysicalDeviceMemoryProperties memory_properties; VkPhysicalDeviceMemoryProperties memory_properties;
struct vkd3d_instance vkd3d_instance; struct vkd3d_instance vkd3d_instance;