From 2b2f67aa2b01204d92ba9178667dbf8aba8d3288 Mon Sep 17 00:00:00 2001 From: Konstantin Date: Sat, 20 Apr 2024 11:28:54 +0200 Subject: [PATCH] radv: Use a struct for the trace_bo layout Now we can use the members on the CPU side and offsetof on the GPU side instead of magic offsets. Reviewed-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_cmd_buffer.c | 18 ++++++------ src/amd/vulkan/radv_debug.c | 49 +++++++++----------------------- src/amd/vulkan/radv_debug.h | 10 +++++++ src/amd/vulkan/radv_device.h | 2 +- src/amd/vulkan/radv_queue.c | 2 +- 5 files changed, 34 insertions(+), 47 deletions(-) diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c index 4299ab72356..53808f12041 100644 --- a/src/amd/vulkan/radv_cmd_buffer.c +++ b/src/amd/vulkan/radv_cmd_buffer.c @@ -572,8 +572,10 @@ radv_cmd_buffer_trace_emit(struct radv_cmd_buffer *cmd_buffer) return; va = radv_buffer_get_va(device->trace_bo); - if (cmd_buffer->vk.level == VK_COMMAND_BUFFER_LEVEL_SECONDARY) - va += 4; + if (cmd_buffer->vk.level == VK_COMMAND_BUFFER_LEVEL_PRIMARY) + va += offsetof(struct radv_trace_data, primary_id); + else + va += offsetof(struct radv_trace_data, secondary_id); ++cmd_buffer->state.trace_id; radv_write_data(cmd_buffer, V_370_ME, va, 1, &cmd_buffer->state.trace_id, false); @@ -830,10 +832,10 @@ radv_save_pipeline(struct radv_cmd_buffer *cmd_buffer, struct radv_pipeline *pip switch (ring) { case AMD_IP_GFX: - va += 8; + va += offsetof(struct radv_trace_data, gfx_ring_pipeline); break; case AMD_IP_COMPUTE: - va += 16; + va += offsetof(struct radv_trace_data, comp_ring_pipeline); break; default: assert(!"invalid IP type"); @@ -853,8 +855,7 @@ radv_save_vertex_descriptors(struct radv_cmd_buffer *cmd_buffer, uint64_t vb_ptr uint32_t data[2]; uint64_t va; - va = radv_buffer_get_va(device->trace_bo); - va += 24; + va = radv_buffer_get_va(device->trace_bo) + offsetof(struct radv_trace_data, vertex_descriptors); data[0] = vb_ptr; data[1] = vb_ptr >> 32; @@ -869,8 +870,7 @@ radv_save_vs_prolog(struct radv_cmd_buffer *cmd_buffer, const struct radv_shader uint32_t data[2]; uint64_t va; - va = radv_buffer_get_va(device->trace_bo); - va += 32; + va = radv_buffer_get_va(device->trace_bo) + offsetof(struct radv_trace_data, vertex_prolog); uint64_t prolog_address = (uintptr_t)prolog; data[0] = prolog_address; @@ -898,7 +898,7 @@ radv_save_descriptors(struct radv_cmd_buffer *cmd_buffer, VkPipelineBindPoint bi struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); uint32_t data[MAX_SETS * 2] = {0}; uint64_t va; - va = radv_buffer_get_va(device->trace_bo) + 40; + va = radv_buffer_get_va(device->trace_bo) + offsetof(struct radv_trace_data, descriptor_sets); u_foreach_bit (i, descriptors_state->valid) { struct radv_descriptor_set *set = descriptors_state->sets[i]; diff --git a/src/amd/vulkan/radv_debug.c b/src/amd/vulkan/radv_debug.c index c62abe4236c..0d214342c4d 100644 --- a/src/amd/vulkan/radv_debug.c +++ b/src/amd/vulkan/radv_debug.c @@ -27,8 +27,7 @@ #include "radv_shader.h" #include "sid.h" -#define TRACE_BO_SIZE 4096 -#define TMA_BO_SIZE 4096 +#define TMA_BO_SIZE 4096 #define COLOR_RESET "\033[0m" #define COLOR_RED "\033[31m" @@ -38,19 +37,6 @@ #define RADV_DUMP_DIR "radv_dumps" -/* Trace BO layout (offsets are 4 bytes): - * - * [0]: primary trace ID - * [1]: secondary trace ID - * [2-3]: 64-bit GFX ring pipeline pointer - * [4-5]: 64-bit COMPUTE ring pipeline pointer - * [6-7]: Vertex descriptors pointer - * [8-9]: 64-bit Vertex prolog pointer - * [10-11]: 64-bit descriptor set #0 pointer - * ... - * [72-73]: 64-bit descriptor set #31 pointer - */ - bool radv_init_trace(struct radv_device *device) { @@ -58,7 +44,7 @@ radv_init_trace(struct radv_device *device) VkResult result; result = radv_bo_create( - device, NULL, TRACE_BO_SIZE, 8, RADEON_DOMAIN_VRAM, + device, NULL, sizeof(struct radv_trace_data), 8, RADEON_DOMAIN_VRAM, RADEON_FLAG_CPU_ACCESS | RADEON_FLAG_NO_INTERPROCESS_SHARING | RADEON_FLAG_ZERO_VRAM | RADEON_FLAG_VA_UNCACHED, RADV_BO_PRIORITY_UPLOAD_BUFFER, 0, true, &device->trace_bo); if (result != VK_SUCCESS) @@ -68,8 +54,8 @@ radv_init_trace(struct radv_device *device) if (result != VK_SUCCESS) return false; - device->trace_id_ptr = radv_buffer_map(ws, device->trace_bo); - if (!device->trace_id_ptr) + device->trace_data = radv_buffer_map(ws, device->trace_bo); + if (!device->trace_data) return false; return true; @@ -89,8 +75,8 @@ radv_finish_trace(struct radv_device *device) static void radv_dump_trace(const struct radv_device *device, struct radeon_cmdbuf *cs, FILE *f) { - fprintf(f, "Trace ID: %x\n", *device->trace_id_ptr); - device->ws->cs_dump(cs, f, (const int *)device->trace_id_ptr, 2, RADV_CS_DUMP_TYPE_IBS); + fprintf(f, "Trace ID: %x\n", device->trace_data->primary_id); + device->ws->cs_dump(cs, f, (const int *)&device->trace_data->primary_id, 2, RADV_CS_DUMP_TYPE_IBS); } static void @@ -231,12 +217,11 @@ radv_dump_descriptor_set(const struct radv_device *device, const struct radv_des static void radv_dump_descriptors(struct radv_device *device, FILE *f) { - uint64_t *ptr = (uint64_t *)device->trace_id_ptr; int i; fprintf(f, "Descriptors:\n"); for (i = 0; i < MAX_SETS; i++) { - struct radv_descriptor_set *set = *(struct radv_descriptor_set **)(ptr + i + 5); + struct radv_descriptor_set *set = (struct radv_descriptor_set *)(uintptr_t)device->trace_data->descriptor_sets[i]; radv_dump_descriptor_set(device, set, i, f); } @@ -405,9 +390,8 @@ static void radv_dump_vertex_descriptors(const struct radv_device *device, const struct radv_graphics_pipeline *pipeline, FILE *f) { struct radv_shader *vs = radv_get_shader(pipeline->base.shaders, MESA_SHADER_VERTEX); - uint64_t *ptr = (uint64_t *)device->trace_id_ptr; uint32_t count = util_bitcount(vs->info.vs.vb_desc_usage_mask); - uint32_t *vb_ptr = *(uint32_t **)(ptr + 3); + uint32_t *vb_ptr = (uint32_t *)(uintptr_t)device->trace_data->vertex_descriptors; if (!count) return; @@ -427,17 +411,10 @@ radv_dump_vertex_descriptors(const struct radv_device *device, const struct radv } } -static struct radv_shader_part * -radv_get_saved_vs_prolog(const struct radv_device *device) -{ - uint64_t *ptr = (uint64_t *)device->trace_id_ptr; - return *(struct radv_shader_part **)(ptr + 4); -} - static void radv_dump_vs_prolog(const struct radv_device *device, const struct radv_graphics_pipeline *pipeline, FILE *f) { - struct radv_shader_part *vs_prolog = radv_get_saved_vs_prolog(device); + struct radv_shader_part *vs_prolog = (struct radv_shader_part *)(uintptr_t)device->trace_data->vertex_prolog; struct radv_shader *vs_shader = radv_get_shader(pipeline->base.shaders, MESA_SHADER_VERTEX); if (!vs_prolog || !vs_shader || !vs_shader->info.vs.has_prolog) @@ -450,10 +427,10 @@ radv_dump_vs_prolog(const struct radv_device *device, const struct radv_graphics static struct radv_pipeline * radv_get_saved_pipeline(struct radv_device *device, enum amd_ip_type ring) { - uint64_t *ptr = (uint64_t *)device->trace_id_ptr; - int offset = ring == AMD_IP_GFX ? 1 : 2; - - return *(struct radv_pipeline **)(ptr + offset); + if (ring == AMD_IP_GFX) + return (struct radv_pipeline *)(uintptr_t)device->trace_data->gfx_ring_pipeline; + else + return (struct radv_pipeline *)(uintptr_t)device->trace_data->comp_ring_pipeline; } static void diff --git a/src/amd/vulkan/radv_debug.h b/src/amd/vulkan/radv_debug.h index fa1ff5e9f77..f9930f3c295 100644 --- a/src/amd/vulkan/radv_debug.h +++ b/src/amd/vulkan/radv_debug.h @@ -107,4 +107,14 @@ radv_device_fault_detection_enabled(const struct radv_device *device) return instance->debug_flags & RADV_DEBUG_HANG; } +struct radv_trace_data { + uint32_t primary_id; + uint32_t secondary_id; + uint64_t gfx_ring_pipeline; + uint64_t comp_ring_pipeline; + uint64_t vertex_descriptors; + uint64_t vertex_prolog; + uint64_t descriptor_sets[MAX_SETS]; +}; + #endif /* RADV_DEBUG_H */ diff --git a/src/amd/vulkan/radv_device.h b/src/amd/vulkan/radv_device.h index 19e170695f8..95690d9fa96 100644 --- a/src/amd/vulkan/radv_device.h +++ b/src/amd/vulkan/radv_device.h @@ -413,7 +413,7 @@ struct radv_device { struct radeon_winsys_bo *gfx_init; struct radeon_winsys_bo *trace_bo; - uint32_t *trace_id_ptr; + struct radv_trace_data *trace_data; /* Whether to keep shader debug info, for debugging. */ bool keep_shader_info; diff --git a/src/amd/vulkan/radv_queue.c b/src/amd/vulkan/radv_queue.c index 20cba4a8361..c2b576599e5 100644 --- a/src/amd/vulkan/radv_queue.c +++ b/src/amd/vulkan/radv_queue.c @@ -2197,7 +2197,7 @@ radv_queue_submit_normal(struct radv_queue *queue, struct vk_queue_submit *submi unsigned num_submitted_cs = 0; if (radv_device_fault_detection_enabled(device)) - *device->trace_id_ptr = 0; + device->trace_data->primary_id = 0; struct radeon_cmdbuf *chainable = NULL; struct radeon_cmdbuf *chainable_ace = NULL;