}
static int
-radv_queue_init(struct radv_device *device, struct radv_queue *queue, uint32_t queue_family_index,
- int idx, VkDeviceQueueCreateFlags flags,
+radv_queue_init(struct radv_device *device, struct radv_queue *queue,
+ int idx, const VkDeviceQueueCreateInfo *create_info,
const VkDeviceQueueGlobalPriorityCreateInfoEXT *global_priority)
{
queue->device = device;
- queue->queue_family_index = queue_family_index;
+ queue->queue_family_index = create_info->queueFamilyIndex;
queue->queue_idx = idx;
queue->priority = radv_get_queue_global_priority(global_priority);
- queue->flags = flags;
+ queue->flags = create_info->flags;
queue->hw_ctx = device->hw_ctx[queue->priority];
- VkResult result = vk_queue_init(&queue->vk, &device->vk);
+ VkResult result = vk_queue_init(&queue->vk, &device->vk, create_info, idx);
if (result != VK_SUCCESS)
return result;
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, queue_create->flags,
- global_priority);
+ result = radv_queue_init(device, &device->queues[qfi][q], q, queue_create, global_priority);
if (result != VK_SUCCESS)
goto fail;
}
}
static VkResult
-queue_init(struct v3dv_device *device, struct v3dv_queue *queue)
+queue_init(struct v3dv_device *device, struct v3dv_queue *queue,
+ const VkDeviceQueueCreateInfo *create_info,
+ uint32_t index_in_family)
{
- VkResult result = vk_queue_init(&queue->vk, &device->vk);
+ VkResult result = vk_queue_init(&queue->vk, &device->vk, create_info,
+ index_in_family);
if (result != VK_SUCCESS)
return result;
queue->device = device;
pthread_mutex_init(&device->mutex, NULL);
- result = queue_init(device, &device->queue);
+ result = queue_init(device, &device->queue,
+ pCreateInfo->pQueueCreateInfos, 0);
if (result != VK_SUCCESS)
goto fail;
static VkResult
tu_queue_init(struct tu_device *device,
struct tu_queue *queue,
- uint32_t queue_family_index,
int idx,
- VkDeviceQueueCreateFlags flags)
+ const VkDeviceQueueCreateInfo *create_info)
{
- VkResult result = vk_queue_init(&queue->vk, &device->vk);
+ VkResult result = vk_queue_init(&queue->vk, &device->vk, create_info, idx);
if (result != VK_SUCCESS)
return result;
queue->device = device;
- queue->queue_family_index = queue_family_index;
+ queue->queue_family_index = create_info->queueFamilyIndex;
queue->queue_idx = idx;
- queue->flags = flags;
+ queue->flags = create_info->flags;
list_inithead(&queue->queued_submits);
device->queue_count[qfi] = queue_create->queueCount;
for (unsigned q = 0; q < queue_create->queueCount; q++) {
- result = tu_queue_init(device, &device->queues[qfi][q], qfi, q,
- queue_create->flags);
+ result = tu_queue_init(device, &device->queues[qfi][q], q,
+ queue_create);
if (result != VK_SUCCESS)
goto fail_queues;
}
}
static VkResult
-lvp_queue_init(struct lvp_device *device, struct lvp_queue *queue)
+lvp_queue_init(struct lvp_device *device, struct lvp_queue *queue,
+ const VkDeviceQueueCreateInfo *create_info,
+ uint32_t index_in_family)
{
- VkResult result = vk_queue_init(&queue->vk, &device->vk);
+ VkResult result = vk_queue_init(&queue->vk, &device->vk, create_info,
+ index_in_family);
if (result != VK_SUCCESS)
return result;
device->pscreen = physical_device->pscreen;
- lvp_queue_init(device, &device->queue);
+ assert(pCreateInfo->queueCreateInfoCount == 1);
+ assert(pCreateInfo->pQueueCreateInfos[0].queueFamilyIndex == 0);
+ assert(pCreateInfo->pQueueCreateInfos[0].queueCount == 1);
+ lvp_queue_init(device, &device->queue, pCreateInfo->pQueueCreateInfos, 0);
*pDevice = lvp_device_to_handle(device);
device->queue_count : I915_EXEC_RENDER;
result = anv_queue_init(device, &device->queues[device->queue_count],
- exec_flags, queueCreateInfo);
+ exec_flags, queueCreateInfo, j);
if (result != VK_SUCCESS)
goto fail_queues;
VkResult anv_queue_init(struct anv_device *device, struct anv_queue *queue,
uint32_t exec_flags,
- const VkDeviceQueueCreateInfo *pCreateInfo);
+ const VkDeviceQueueCreateInfo *pCreateInfo,
+ uint32_t index_in_family);
void anv_queue_finish(struct anv_queue *queue);
VkResult anv_queue_execbuf_locked(struct anv_queue *queue, struct anv_queue_submit *submit);
VkResult
anv_queue_init(struct anv_device *device, struct anv_queue *queue,
uint32_t exec_flags,
- const VkDeviceQueueCreateInfo *pCreateInfo)
+ const VkDeviceQueueCreateInfo *pCreateInfo,
+ uint32_t index_in_family)
{
struct anv_physical_device *pdevice = device->physical;
VkResult result;
- result = vk_queue_init(&queue->vk, &device->vk);
+ result = vk_queue_init(&queue->vk, &device->vk, pCreateInfo,
+ index_in_family);
if (result != VK_SUCCESS)
return result;
static VkResult
panvk_queue_init(struct panvk_device *device,
struct panvk_queue *queue,
- uint32_t queue_family_index,
int idx,
- VkDeviceQueueCreateFlags flags)
+ const VkDeviceQueueCreateInfo *create_info)
{
const struct panfrost_device *pdev = &device->physical_device->pdev;
- VkResult result = vk_queue_init(&queue->vk, &device->vk);
+ VkResult result = vk_queue_init(&queue->vk, &device->vk, create_info, idx);
if (result != VK_SUCCESS)
return result;
queue->device = device;
- queue->queue_family_index = queue_family_index;
- queue->flags = flags;
+ queue->queue_family_index = create_info->queueFamilyIndex;
+ queue->flags = create_info->flags;
struct drm_syncobj_create create = {
.flags = DRM_SYNCOBJ_CREATE_SIGNALED,
device->queue_count[qfi] = queue_create->queueCount;
for (unsigned q = 0; q < queue_create->queueCount; q++) {
- result = panvk_queue_init(device, &device->queues[qfi][q], qfi, q,
- queue_create->flags);
+ result = panvk_queue_init(device, &device->queues[qfi][q], q,
+ queue_create);
if (result != VK_SUCCESS)
goto fail;
}
#include "vk_queue.h"
VkResult
-vk_queue_init(struct vk_queue *queue, struct vk_device *device)
+vk_queue_init(struct vk_queue *queue, struct vk_device *device,
+ const VkDeviceQueueCreateInfo *pCreateInfo,
+ uint32_t index_in_family)
{
memset(queue, 0, sizeof(*queue));
vk_object_base_init(device, &queue->base, VK_OBJECT_TYPE_QUEUE);
+ queue->flags = pCreateInfo->flags;
+ queue->queue_family_index = pCreateInfo->queueFamilyIndex;
+
+ assert(index_in_family < pCreateInfo->queueCount);
+ queue->index_in_family = index_in_family;
+
util_dynarray_init(&queue->labels, NULL);
queue->region_begin = true;
struct vk_queue {
struct vk_object_base base;
+ /* VkDeviceQueueCreateInfo::flags */
+ VkDeviceQueueCreateFlags flags;
+
+ /* VkDeviceQueueCreateInfo::queueFamilyIndex */
+ uint32_t queue_family_index;
+
+ /* Which queue this is within the queue family */
+ uint32_t index_in_family;
+
/**
* VK_EXT_debug_utils
*
VK_DEFINE_HANDLE_CASTS(vk_queue, base, VkQueue, VK_OBJECT_TYPE_QUEUE)
VkResult MUST_CHECK
-vk_queue_init(struct vk_queue *queue, struct vk_device *device);
+vk_queue_init(struct vk_queue *queue, struct vk_device *device,
+ const VkDeviceQueueCreateInfo *pCreateInfo,
+ uint32_t index_in_family);
void
vk_queue_finish(struct vk_queue *queue);