From 38f34117dd11ec92e9fda0157b52fa215e310275 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Tue, 13 Mar 2018 21:54:53 +0100 Subject: [PATCH] radv: fix vkGetDeviceQueue2() when create flags don't match This fixes CTS: dEQP-VK.api.device_init.create_device_queue2_unmatched_flags Signed-off-by: Samuel Pitoiset Reviewed-by: Dave Airlie --- src/amd/vulkan/radv_device.c | 23 +++++++++++++++++++++-- src/amd/vulkan/radv_private.h | 1 + 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index 0ed3e27c7bc..13b2da584e5 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -1106,6 +1106,7 @@ radv_get_queue_global_priority(const VkDeviceQueueGlobalPriorityCreateInfoEXT *p static int radv_queue_init(struct radv_device *device, struct radv_queue *queue, uint32_t queue_family_index, int idx, + VkDeviceQueueCreateFlags flags, const VkDeviceQueueGlobalPriorityCreateInfoEXT *global_priority) { queue->_loader_data.loaderMagic = ICD_LOADER_MAGIC; @@ -1113,6 +1114,7 @@ radv_queue_init(struct radv_device *device, struct radv_queue *queue, queue->queue_family_index = queue_family_index; queue->queue_idx = idx; queue->priority = radv_get_queue_global_priority(global_priority); + queue->flags = flags; queue->hw_ctx = device->ws->ctx_create(device->ws, queue->priority); if (!queue->hw_ctx) @@ -1266,7 +1268,9 @@ VkResult radv_CreateDevice( device->queue_count[qfi] = queue_create->queueCount; for (unsigned q = 0; q < queue_create->queueCount; q++) { - result = radv_queue_init(device, &device->queues[qfi][q], qfi, q, global_priority); + result = radv_queue_init(device, &device->queues[qfi][q], + qfi, q, queue_create->flags, + global_priority); if (result != VK_SUCCESS) goto fail; } @@ -1454,8 +1458,23 @@ void radv_GetDeviceQueue2( VkQueue* pQueue) { RADV_FROM_HANDLE(radv_device, device, _device); + struct radv_queue *queue; + + queue = &device->queues[pQueueInfo->queueFamilyIndex][pQueueInfo->queueIndex]; + if (pQueueInfo->flags != queue->flags) { + /* From the Vulkan 1.1.70 spec: + * + * "The queue returned by vkGetDeviceQueue2 must have the same + * flags value from this structure as that used at device + * creation time in a VkDeviceQueueCreateInfo instance. If no + * matching flags were specified at device creation time then + * pQueue will return VK_NULL_HANDLE." + */ + *pQueue = VK_NULL_HANDLE; + return; + } - *pQueue = radv_queue_to_handle(&device->queues[pQueueInfo->queueFamilyIndex][pQueueInfo->queueIndex]); + *pQueue = radv_queue_to_handle(queue); } void radv_GetDeviceQueue( diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 0ff62aa7dea..6449c329002 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -573,6 +573,7 @@ struct radv_queue { enum radeon_ctx_priority priority; uint32_t queue_family_index; int queue_idx; + VkDeviceQueueCreateFlags flags; uint32_t scratch_size; uint32_t compute_scratch_size; -- 2.30.2