Mesa (master): anv: Turn device->queue into an array
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Jan 28 18:34:22 UTC 2021
Module: Mesa
Branch: master
Commit: 9fd080662157db0a682bcc27420789d7cbc3310c
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9fd080662157db0a682bcc27420789d7cbc3310c
Author: Jordan Justen <jordan.l.justen at intel.com>
Date: Tue Aug 14 02:34:16 2018 -0700
anv: Turn device->queue into an array
Rework: Lionel
Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8667>
---
src/intel/vulkan/anv_device.c | 93 +++++++++++++++++++++++++++++++++---------
src/intel/vulkan/anv_private.h | 3 +-
src/intel/vulkan/anv_queue.c | 16 +++++++-
src/intel/vulkan/genX_state.c | 29 +++++++++++--
4 files changed, 115 insertions(+), 26 deletions(-)
diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
index 299c869a1cb..43e81ece144 100644
--- a/src/intel/vulkan/anv_device.c
+++ b/src/intel/vulkan/anv_device.c
@@ -2869,15 +2869,37 @@ VkResult anv_CreateDevice(
device->has_thread_submit = physical_device->has_thread_submit;
- result = anv_queue_init(device, &device->queue, I915_EXEC_RENDER,
- &pCreateInfo->pQueueCreateInfos[0]);
- if (result != VK_SUCCESS)
+ uint32_t num_queues = 0;
+ for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; i++)
+ num_queues += pCreateInfo->pQueueCreateInfos[i].queueCount;
+
+ device->queues =
+ vk_zalloc(&device->vk.alloc, num_queues * sizeof(*device->queues), 8,
+ VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
+ if (device->queues == NULL) {
+ result = vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
goto fail_context_id;
+ }
+
+ device->queue_count = 0;
+ for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; i++) {
+ const VkDeviceQueueCreateInfo *queueCreateInfo =
+ &pCreateInfo->pQueueCreateInfos[i];
+
+ for (uint32_t j = 0; j < queueCreateInfo->queueCount; j++) {
+ result = anv_queue_init(device, &device->queues[device->queue_count],
+ I915_EXEC_RENDER, queueCreateInfo);
+ if (result != VK_SUCCESS)
+ goto fail_queues;
+
+ device->queue_count++;
+ }
+ }
if (physical_device->use_softpin) {
if (pthread_mutex_init(&device->vma_mutex, NULL) != 0) {
result = vk_error(VK_ERROR_INITIALIZATION_FAILED);
- goto fail_queue;
+ goto fail_queues;
}
/* keep the page with address zero out of the allocator */
@@ -2943,7 +2965,7 @@ VkResult anv_CreateDevice(
if (pthread_mutex_init(&device->mutex, NULL) != 0) {
result = vk_error(VK_ERROR_INITIALIZATION_FAILED);
- goto fail_queue;
+ goto fail_queues;
}
pthread_condattr_t condattr;
@@ -3150,8 +3172,10 @@ VkResult anv_CreateDevice(
util_vma_heap_finish(&device->vma_cva);
util_vma_heap_finish(&device->vma_lo);
}
- fail_queue:
- anv_queue_finish(&device->queue);
+ fail_queues:
+ for (uint32_t i = 0; i < device->queue_count; i++)
+ anv_queue_finish(&device->queues[i]);
+ vk_free(&device->vk.alloc, device->queues);
fail_context_id:
anv_gem_destroy_context(device, device->context_id);
fail_fd:
@@ -3171,8 +3195,6 @@ void anv_DestroyDevice(
if (!device)
return;
- anv_queue_finish(&device->queue);
-
anv_device_finish_blorp(device);
anv_pipeline_cache_finish(&device->default_pipeline_cache);
@@ -3219,6 +3241,10 @@ void anv_DestroyDevice(
pthread_cond_destroy(&device->queue_submit);
pthread_mutex_destroy(&device->mutex);
+ for (uint32_t i = 0; i < device->queue_count; i++)
+ anv_queue_finish(&device->queues[i]);
+ vk_free(&device->vk.alloc, device->queues);
+
anv_gem_destroy_context(device, device->context_id);
if (INTEL_DEBUG & DEBUG_BATCH)
@@ -3280,11 +3306,29 @@ void anv_GetDeviceQueue2(
VkQueue* pQueue)
{
ANV_FROM_HANDLE(anv_device, device, _device);
+ struct anv_physical_device *pdevice = device->physical;
- assert(pQueueInfo->queueIndex == 0);
+ assert(pQueueInfo->queueFamilyIndex < pdevice->queue.family_count);
+ struct anv_queue_family *queue_family =
+ &pdevice->queue.families[pQueueInfo->queueFamilyIndex];
- if (pQueueInfo->flags == device->queue.flags)
- *pQueue = anv_queue_to_handle(&device->queue);
+ int idx_in_family = 0;
+ struct anv_queue *queue = NULL;
+ for (uint32_t i = 0; i < device->queue_count; i++) {
+ if (device->queues[i].family != queue_family)
+ continue;
+
+ if (idx_in_family == pQueueInfo->queueIndex) {
+ queue = &device->queues[i];
+ break;
+ }
+
+ idx_in_family++;
+ }
+ assert(queue != NULL);
+
+ if (queue && queue->flags == pQueueInfo->flags)
+ *pQueue = anv_queue_to_handle(queue);
else
*pQueue = NULL;
}
@@ -3296,13 +3340,16 @@ _anv_device_report_lost(struct anv_device *device)
device->lost_reported = true;
- struct anv_queue *queue = &device->queue;
-
- __vk_errorf(device->physical->instance, device,
- VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT,
- VK_ERROR_DEVICE_LOST,
- queue->error_file, queue->error_line,
- "%s", queue->error_msg);
+ for (uint32_t i = 0; i < device->queue_count; i++) {
+ struct anv_queue *queue = &device->queues[i];
+ if (queue->lost) {
+ __vk_errorf(device->physical->instance, device,
+ VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT,
+ VK_ERROR_DEVICE_LOST,
+ queue->error_file, queue->error_line,
+ "%s", queue->error_msg);
+ }
+ }
}
VkResult
@@ -3437,7 +3484,13 @@ VkResult anv_DeviceWaitIdle(
if (anv_device_is_lost(device))
return VK_ERROR_DEVICE_LOST;
- return anv_queue_submit_simple_batch(&device->queue, NULL);
+ for (uint32_t i = 0; i < device->queue_count; i++) {
+ VkResult res = anv_queue_submit_simple_batch(&device->queues[i], NULL);
+ if (res != VK_SUCCESS)
+ return res;
+ }
+
+ return VK_SUCCESS;
}
uint64_t
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index 183e5a3ec89..c36ba42aa98 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -1425,7 +1425,8 @@ struct anv_device {
struct anv_state slice_hash;
- struct anv_queue queue;
+ uint32_t queue_count;
+ struct anv_queue * queues;
struct anv_scratch_pool scratch_pool;
diff --git a/src/intel/vulkan/anv_queue.c b/src/intel/vulkan/anv_queue.c
index 2dfb2c1a550..c378cccd614 100644
--- a/src/intel/vulkan/anv_queue.c
+++ b/src/intel/vulkan/anv_queue.c
@@ -350,8 +350,20 @@ anv_queue_submit_deferred_locked(struct anv_queue *queue, uint32_t *advance)
static VkResult
anv_device_submit_deferred_locked(struct anv_device *device)
{
- uint32_t advance = 0;
- return anv_queue_submit_deferred_locked(&device->queue, &advance);
+ VkResult result = VK_SUCCESS;
+
+ uint32_t advance;
+ do {
+ advance = 0;
+ for (uint32_t i = 0; i < device->queue_count; i++) {
+ struct anv_queue *queue = &device->queues[i];
+ VkResult qres = anv_queue_submit_deferred_locked(queue, &advance);
+ if (qres != VK_SUCCESS)
+ result = qres;
+ }
+ } while (advance);
+
+ return result;
}
static void
diff --git a/src/intel/vulkan/genX_state.c b/src/intel/vulkan/genX_state.c
index 5e67e7adc7d..17e81dc6f77 100644
--- a/src/intel/vulkan/genX_state.c
+++ b/src/intel/vulkan/genX_state.c
@@ -109,9 +109,10 @@ genX(emit_slice_hashing_state)(struct anv_device *device,
#endif
}
-VkResult
-genX(init_device_state)(struct anv_device *device)
+static VkResult
+init_render_queue_state(struct anv_queue *queue)
{
+ struct anv_device *device = queue->device;
struct anv_batch batch;
uint32_t cmds[64];
@@ -306,7 +307,29 @@ genX(init_device_state)(struct anv_device *device)
assert(batch.next <= batch.end);
- return anv_queue_submit_simple_batch(&device->queue, &batch);
+ return anv_queue_submit_simple_batch(queue, &batch);
+}
+
+VkResult
+genX(init_device_state)(struct anv_device *device)
+{
+ VkResult res;
+
+ for (uint32_t i = 0; i < device->queue_count; i++) {
+ struct anv_queue *queue = &device->queues[i];
+ switch (queue->family->engine_class) {
+ case I915_ENGINE_CLASS_RENDER:
+ res = init_render_queue_state(queue);
+ break;
+ default:
+ res = vk_error(VK_ERROR_INITIALIZATION_FAILED);
+ break;
+ }
+ if (res != VK_SUCCESS)
+ return res;
+ }
+
+ return res;
}
void
More information about the mesa-commit
mailing list