[Mesa-dev] [PATCH] radv: fix vkGetDeviceQueue2() when create flags don't match

Samuel Pitoiset samuel.pitoiset at gmail.com
Tue Mar 13 20:54:53 UTC 2018


This fixes CTS:
dEQP-VK.api.device_init.create_device_queue2_unmatched_flags

Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
---
 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 439522585a7..35c3f411645 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.16.2



More information about the mesa-dev mailing list