Mesa (main): radv: fix allocating/uploading the trap handler shader

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Feb 14 09:27:17 UTC 2022


Module: Mesa
Branch: main
Commit: a224b7a057a531ee638cb1f66744170eff4454b1
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=a224b7a057a531ee638cb1f66744170eff4454b1

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Wed Feb  9 14:48:07 2022 +0100

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 at gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14950>

---

 src/amd/vulkan/radv_debug.c    |  2 +-
 src/amd/vulkan/radv_private.h  |  2 +-
 src/amd/vulkan/radv_shader.c   | 33 +++++++++++++++++++++++++++++++--
 src/amd/vulkan/radv_shader.h   | 10 +++++++++-
 src/amd/vulkan/si_cmd_buffer.c |  4 ++--
 5 files changed, 44 insertions(+), 7 deletions(-)

diff --git a/src/amd/vulkan/radv_debug.c b/src/amd/vulkan/radv_debug.c
index 179082cef8f..6092a7e0fbe 100644
--- a/src/amd/vulkan/radv_debug.c
+++ b/src/amd/vulkan/radv_debug.c
@@ -891,7 +891,7 @@ radv_trap_handler_finish(struct radv_device *device)
    struct radeon_winsys *ws = device->ws;
 
    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)) {
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 7a56d08f5ec..ba9aa246dc8 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -840,7 +840,7 @@ struct radv_device {
    struct ac_perfcounters perfcounters;
 
    /* 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 */
    uint32_t *tma_ptr;
 
diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c
index f915d947137..40e53e0d594 100644
--- a/src/amd/vulkan/radv_shader.c
+++ b/src/amd/vulkan/radv_shader.c
@@ -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);
 }
 
-struct radv_shader *
+struct radv_trap_handler_shader *
 radv_create_trap_handler_shader(struct radv_device *device)
 {
    struct radv_nir_compiler_options options = {0};
    struct radv_shader *shader = NULL;
    struct radv_shader_binary *binary = NULL;
    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");
 
@@ -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,
                            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);
+   free(shader);
    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 *
diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h
index 7cbdb357740..0f587b4ad7c 100644
--- a/src/amd/vulkan/radv_shader.h
+++ b/src/amd/vulkan/radv_shader.h
@@ -483,6 +483,11 @@ struct radv_shader {
    uint32_t *statistics;
 };
 
+struct radv_trap_handler_shader {
+   struct radeon_winsys_bo *bo;
+   union radv_shader_arena_block *alloc;
+};
+
 struct radv_shader_prolog {
    struct radeon_winsys_bo *bo;
    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 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,
                                                  const struct radv_vs_prolog_key *key);
diff --git a/src/amd/vulkan/si_cmd_buffer.c b/src/amd/vulkan/si_cmd_buffer.c
index 64198871472..4e1856eb60d 100644
--- a/src/amd/vulkan/si_cmd_buffer.c
+++ b/src/amd/vulkan/si_cmd_buffer.c
@@ -141,7 +141,7 @@ si_emit_compute(struct radv_device *device, struct radeon_cmdbuf *cs)
 
       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);
 
       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);
 
-      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);
 
       uint32_t regs[] = {R_00B000_SPI_SHADER_TBA_LO_PS, R_00B100_SPI_SHADER_TBA_LO_VS,



More information about the mesa-commit mailing list