radv: fix allocating/uploading the trap handler shader
Since shaders are allocated per pipeline, the trap handler shader was not uploaded at all. Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14950>
This commit is contained in:
@@ -891,7 +891,7 @@ radv_trap_handler_finish(struct radv_device *device)
|
|||||||
struct radeon_winsys *ws = device->ws;
|
struct radeon_winsys *ws = device->ws;
|
||||||
|
|
||||||
if (unlikely(device->trap_handler_shader)) {
|
if (unlikely(device->trap_handler_shader)) {
|
||||||
radv_shader_destroy(device, device->trap_handler_shader);
|
radv_trap_handler_shader_destroy(device, device->trap_handler_shader);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unlikely(device->tma_bo)) {
|
if (unlikely(device->tma_bo)) {
|
||||||
|
@@ -840,7 +840,7 @@ struct radv_device {
|
|||||||
struct ac_perfcounters perfcounters;
|
struct ac_perfcounters perfcounters;
|
||||||
|
|
||||||
/* Trap handler. */
|
/* Trap handler. */
|
||||||
struct radv_shader *trap_handler_shader;
|
struct radv_trap_handler_shader *trap_handler_shader;
|
||||||
struct radeon_winsys_bo *tma_bo; /* Trap Memory Address */
|
struct radeon_winsys_bo *tma_bo; /* Trap Memory Address */
|
||||||
uint32_t *tma_ptr;
|
uint32_t *tma_ptr;
|
||||||
|
|
||||||
|
@@ -2061,13 +2061,18 @@ radv_create_gs_copy_shader(struct radv_device *device, struct nir_shader *shader
|
|||||||
keep_shader_info, keep_statistic_info, binary_out);
|
keep_shader_info, keep_statistic_info, binary_out);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct radv_shader *
|
struct radv_trap_handler_shader *
|
||||||
radv_create_trap_handler_shader(struct radv_device *device)
|
radv_create_trap_handler_shader(struct radv_device *device)
|
||||||
{
|
{
|
||||||
struct radv_nir_compiler_options options = {0};
|
struct radv_nir_compiler_options options = {0};
|
||||||
struct radv_shader *shader = NULL;
|
struct radv_shader *shader = NULL;
|
||||||
struct radv_shader_binary *binary = NULL;
|
struct radv_shader_binary *binary = NULL;
|
||||||
struct radv_shader_info info = {0};
|
struct radv_shader_info info = {0};
|
||||||
|
struct radv_trap_handler_shader *trap;
|
||||||
|
|
||||||
|
trap = malloc(sizeof(struct radv_trap_handler_shader));
|
||||||
|
if (!trap)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
nir_builder b = radv_meta_init_shader(MESA_SHADER_COMPUTE, "meta_trap_handler");
|
nir_builder b = radv_meta_init_shader(MESA_SHADER_COMPUTE, "meta_trap_handler");
|
||||||
|
|
||||||
@@ -2078,10 +2083,34 @@ radv_create_trap_handler_shader(struct radv_device *device)
|
|||||||
shader = shader_compile(device, NULL, &b.shader, 1, MESA_SHADER_COMPUTE, &info, &options, false,
|
shader = shader_compile(device, NULL, &b.shader, 1, MESA_SHADER_COMPUTE, &info, &options, false,
|
||||||
true, true, false, &binary);
|
true, true, false, &binary);
|
||||||
|
|
||||||
|
trap->alloc = radv_alloc_shader_memory(device, shader->code_size, NULL);
|
||||||
|
|
||||||
|
trap->bo = trap->alloc->arena->bo;
|
||||||
|
char *dest_ptr = trap->alloc->arena->ptr + trap->alloc->offset;
|
||||||
|
|
||||||
|
struct radv_shader_binary_legacy *bin = (struct radv_shader_binary_legacy *)binary;
|
||||||
|
memcpy(dest_ptr, bin->data, bin->code_size);
|
||||||
|
|
||||||
ralloc_free(b.shader);
|
ralloc_free(b.shader);
|
||||||
|
free(shader);
|
||||||
free(binary);
|
free(binary);
|
||||||
|
|
||||||
return shader;
|
return trap;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t radv_trap_handler_shader_get_va(const struct radv_trap_handler_shader *trap)
|
||||||
|
{
|
||||||
|
return radv_buffer_get_va(trap->alloc->arena->bo) + trap->alloc->offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
radv_trap_handler_shader_destroy(struct radv_device *device, struct radv_trap_handler_shader *trap)
|
||||||
|
{
|
||||||
|
if (!trap)
|
||||||
|
return;
|
||||||
|
|
||||||
|
radv_free_shader_memory(device, trap->alloc);
|
||||||
|
free(trap);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct radv_shader_prolog *
|
static struct radv_shader_prolog *
|
||||||
|
@@ -483,6 +483,11 @@ struct radv_shader {
|
|||||||
uint32_t *statistics;
|
uint32_t *statistics;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct radv_trap_handler_shader {
|
||||||
|
struct radeon_winsys_bo *bo;
|
||||||
|
union radv_shader_arena_block *alloc;
|
||||||
|
};
|
||||||
|
|
||||||
struct radv_shader_prolog {
|
struct radv_shader_prolog {
|
||||||
struct radeon_winsys_bo *bo;
|
struct radeon_winsys_bo *bo;
|
||||||
union radv_shader_arena_block *alloc;
|
union radv_shader_arena_block *alloc;
|
||||||
@@ -541,7 +546,10 @@ radv_create_gs_copy_shader(struct radv_device *device, struct nir_shader *nir,
|
|||||||
bool multiview, bool keep_shader_info, bool keep_statistic_info,
|
bool multiview, bool keep_shader_info, bool keep_statistic_info,
|
||||||
bool disable_optimizations);
|
bool disable_optimizations);
|
||||||
|
|
||||||
struct radv_shader *radv_create_trap_handler_shader(struct radv_device *device);
|
struct radv_trap_handler_shader *radv_create_trap_handler_shader(struct radv_device *device);
|
||||||
|
uint64_t radv_trap_handler_shader_get_va(const struct radv_trap_handler_shader *trap);
|
||||||
|
void radv_trap_handler_shader_destroy(struct radv_device *device,
|
||||||
|
struct radv_trap_handler_shader *trap);
|
||||||
|
|
||||||
struct radv_shader_prolog *radv_create_vs_prolog(struct radv_device *device,
|
struct radv_shader_prolog *radv_create_vs_prolog(struct radv_device *device,
|
||||||
const struct radv_vs_prolog_key *key);
|
const struct radv_vs_prolog_key *key);
|
||||||
|
@@ -141,7 +141,7 @@ si_emit_compute(struct radv_device *device, struct radeon_cmdbuf *cs)
|
|||||||
|
|
||||||
assert(device->physical_device->rad_info.chip_class == GFX8);
|
assert(device->physical_device->rad_info.chip_class == GFX8);
|
||||||
|
|
||||||
tba_va = radv_shader_get_va(device->trap_handler_shader);
|
tba_va = radv_trap_handler_shader_get_va(device->trap_handler_shader);
|
||||||
tma_va = radv_buffer_get_va(device->tma_bo);
|
tma_va = radv_buffer_get_va(device->tma_bo);
|
||||||
|
|
||||||
radeon_set_sh_reg_seq(cs, R_00B838_COMPUTE_TBA_LO, 4);
|
radeon_set_sh_reg_seq(cs, R_00B838_COMPUTE_TBA_LO, 4);
|
||||||
@@ -553,7 +553,7 @@ si_emit_graphics(struct radv_device *device, struct radeon_cmdbuf *cs)
|
|||||||
|
|
||||||
assert(device->physical_device->rad_info.chip_class == GFX8);
|
assert(device->physical_device->rad_info.chip_class == GFX8);
|
||||||
|
|
||||||
tba_va = radv_shader_get_va(device->trap_handler_shader);
|
tba_va = radv_trap_handler_shader_get_va(device->trap_handler_shader);
|
||||||
tma_va = radv_buffer_get_va(device->tma_bo);
|
tma_va = radv_buffer_get_va(device->tma_bo);
|
||||||
|
|
||||||
uint32_t regs[] = {R_00B000_SPI_SHADER_TBA_LO_PS, R_00B100_SPI_SHADER_TBA_LO_VS,
|
uint32_t regs[] = {R_00B000_SPI_SHADER_TBA_LO_PS, R_00B100_SPI_SHADER_TBA_LO_VS,
|
||||||
|
Reference in New Issue
Block a user