Mesa (main): radv: Refactor queue state to separate structure.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue May 24 16:12:31 UTC 2022
Module: Mesa
Branch: main
Commit: 84089d8c8dea4872f09a08a1f379aada17bfdc92
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=84089d8c8dea4872f09a08a1f379aada17bfdc92
Author: Timur Kristóf <timur.kristof at gmail.com>
Date: Sun May 8 20:11:49 2022 +0200
radv: Refactor queue state to separate structure.
In the future we'll need a 1:N mapping between radv_queue objects and
HW queues, meaning that 1 radv_queue object will need to be able to
submit to multiple queues. To do that, we'll must also maintain a different
state for each HW queue.
Signed-off-by: Timur Kristóf <timur.kristof at gmail.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16395>
---
src/amd/vulkan/radv_device.c | 25 ++++++++++++++-----------
src/amd/vulkan/radv_private.h | 18 +++++++++++-------
src/amd/vulkan/radv_sqtt.c | 4 ++--
3 files changed, 27 insertions(+), 20 deletions(-)
diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
index cff91a08015..ee40dbbe1b6 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -2698,7 +2698,7 @@ radv_queue_init(struct radv_device *device, struct radv_queue *queue, int idx,
queue->device = device;
queue->priority = radv_get_queue_global_priority(global_priority);
queue->hw_ctx = device->hw_ctx[queue->priority];
- queue->qf = vk_queue_to_radv(device->physical_device, create_info->queueFamilyIndex);
+ queue->state.qf = vk_queue_to_radv(device->physical_device, create_info->queueFamilyIndex);
VkResult result = vk_queue_init(&queue->vk, &device->vk, create_info, idx);
if (result != VK_SUCCESS)
@@ -2710,10 +2710,8 @@ radv_queue_init(struct radv_device *device, struct radv_queue *queue, int idx,
}
static void
-radv_queue_finish(struct radv_queue *queue)
+radv_queue_state_finish(struct radv_queue_state *queue, struct radeon_winsys *ws)
{
- struct radeon_winsys *ws = queue->device->ws;
-
if (queue->initial_full_flush_preamble_cs)
ws->cs_destroy(queue->initial_full_flush_preamble_cs);
if (queue->initial_preamble_cs)
@@ -2736,7 +2734,12 @@ radv_queue_finish(struct radv_queue *queue)
ws->buffer_destroy(ws, queue->gds_oa_bo);
if (queue->compute_scratch_bo)
ws->buffer_destroy(ws, queue->compute_scratch_bo);
+}
+static void
+radv_queue_finish(struct radv_queue *queue)
+{
+ radv_queue_state_finish(&queue->state, queue->device->ws);
vk_queue_finish(&queue->vk);
}
@@ -3983,7 +3986,7 @@ radv_init_compute_state(struct radeon_cmdbuf *cs, struct radv_device *device)
}
static VkResult
-radv_update_preamble_cs(struct radv_queue *queue, struct radv_device *device,
+radv_update_preamble_cs(struct radv_queue_state *queue, struct radv_device *device,
const struct radv_queue_ring_info *needs)
{
struct radeon_winsys *ws = device->ws;
@@ -4126,7 +4129,7 @@ radv_update_preamble_cs(struct radv_queue *queue, struct radv_device *device,
enum rgp_flush_bits sqtt_flush_bits = 0;
struct radeon_cmdbuf *cs = NULL;
- cs = ws->cs_create(ws, radv_queue_ring(queue));
+ cs = ws->cs_create(ws, radv_queue_family_to_ring(device->physical_device, queue->qf));
if (!cs) {
result = VK_ERROR_OUT_OF_HOST_MEMORY;
goto fail;
@@ -4383,7 +4386,7 @@ radv_sparse_image_bind_memory(struct radv_device *device, const VkSparseImageMem
}
static VkResult
-radv_update_preambles(struct radv_queue *queue, struct radv_device *device,
+radv_update_preambles(struct radv_queue_state *queue, struct radv_device *device,
struct vk_command_buffer *const *cmd_buffers, uint32_t cmd_buffer_count)
{
if (queue->qf == RADV_QUEUE_TRANSFER)
@@ -4522,7 +4525,7 @@ radv_queue_submit_normal(struct radv_queue *queue, struct vk_queue_submit *submi
uint32_t advance;
VkResult result;
- result = radv_update_preambles(queue, queue->device, submission->command_buffers,
+ result = radv_update_preambles(&queue->state, queue->device, submission->command_buffers,
submission->command_buffer_count);
if (result != VK_SUCCESS)
return result;
@@ -4556,8 +4559,8 @@ radv_queue_submit_normal(struct radv_queue *queue, struct vk_queue_submit *submi
.cs_array = cs_array,
.cs_count = 0,
.initial_preamble_cs =
- need_wait ? queue->initial_full_flush_preamble_cs : queue->initial_preamble_cs,
- .continue_preamble_cs = queue->continue_preamble_cs,
+ need_wait ? queue->state.initial_full_flush_preamble_cs : queue->state.initial_preamble_cs,
+ .continue_preamble_cs = queue->state.continue_preamble_cs,
};
for (uint32_t j = 0; j < submission->command_buffer_count; j += advance) {
@@ -4585,7 +4588,7 @@ radv_queue_submit_normal(struct radv_queue *queue, struct vk_queue_submit *submi
}
submit.cs_array += advance;
- submit.initial_preamble_cs = queue->initial_preamble_cs;
+ submit.initial_preamble_cs = queue->state.initial_preamble_cs;
}
fail:
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 07353d28e43..4b402a29f00 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -717,12 +717,7 @@ struct radv_queue_ring_info {
bool sample_positions;
};
-struct radv_queue {
- struct vk_queue vk;
- struct radv_device *device;
- struct radeon_winsys_ctx *hw_ctx;
- enum radeon_ctx_priority priority;
-
+struct radv_queue_state {
enum radv_queue_family qf;
struct radv_queue_ring_info ring_info;
@@ -734,11 +729,20 @@ struct radv_queue {
struct radeon_winsys_bo *tess_rings_bo;
struct radeon_winsys_bo *gds_bo;
struct radeon_winsys_bo *gds_oa_bo;
+
struct radeon_cmdbuf *initial_preamble_cs;
struct radeon_cmdbuf *initial_full_flush_preamble_cs;
struct radeon_cmdbuf *continue_preamble_cs;
};
+struct radv_queue {
+ struct vk_queue vk;
+ struct radv_device *device;
+ struct radeon_winsys_ctx *hw_ctx;
+ enum radeon_ctx_priority priority;
+ struct radv_queue_state state;
+};
+
#define RADV_BORDER_COLOR_COUNT 4096
#define RADV_BORDER_COLOR_BUFFER_SIZE (sizeof(VkClearColorValue) * RADV_BORDER_COLOR_COUNT)
@@ -3000,7 +3004,7 @@ si_translate_blend_logic_op(VkLogicOp op)
static inline enum amd_ip_type
radv_queue_ring(struct radv_queue *queue)
{
- return radv_queue_family_to_ring(queue->device->physical_device, queue->qf);
+ return radv_queue_family_to_ring(queue->device->physical_device, queue->state.qf);
}
/**
diff --git a/src/amd/vulkan/radv_sqtt.c b/src/amd/vulkan/radv_sqtt.c
index b132ef67c5d..3e98a489e99 100644
--- a/src/amd/vulkan/radv_sqtt.c
+++ b/src/amd/vulkan/radv_sqtt.c
@@ -543,7 +543,7 @@ bool
radv_begin_thread_trace(struct radv_queue *queue)
{
struct radv_device *device = queue->device;
- enum radv_queue_family family = queue->qf;
+ enum radv_queue_family family = queue->state.qf;
struct radeon_winsys *ws = device->ws;
struct radeon_cmdbuf *cs;
VkResult result;
@@ -612,7 +612,7 @@ bool
radv_end_thread_trace(struct radv_queue *queue)
{
struct radv_device *device = queue->device;
- enum radv_queue_family family = queue->qf;
+ enum radv_queue_family family = queue->state.qf;
struct radeon_winsys *ws = device->ws;
struct radeon_cmdbuf *cs;
VkResult result;
More information about the mesa-commit
mailing list