mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-08 10:40:11 +01:00
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 <samuel.pitoiset@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28838>
This commit is contained in:
parent
575565af58
commit
2b2f67aa2b
5 changed files with 34 additions and 47 deletions
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue