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

Author: Tatsuyuki Ishi <[email protected]>
Date:   Fri Feb 24 18:27:04 2023 +0900

radv: Keep shader code ptr in a separately allocated buffer.

RGP traces need a dump of shader code in order to display ISA and
instruction trace. Previously, this was read back from GPU at trace
creation time. However, for future changes that implements upload shader
to invisible VRAM, the upload destination will be a temporary staging
buffer and will be only accessible during shader creation.

To allow dumping in such cases, copy the shader code to a separate buffer
at creation time, if thread tracing is enabled.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21513>

---

 src/amd/vulkan/layers/radv_sqtt_layer.c |  4 ++--
 src/amd/vulkan/radv_shader.c            | 22 ++++++++++++++++++++--
 src/amd/vulkan/radv_shader.h            |  4 +++-
 3 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/src/amd/vulkan/layers/radv_sqtt_layer.c 
b/src/amd/vulkan/layers/radv_sqtt_layer.c
index 11775d66892..61616ff75bf 100644
--- a/src/amd/vulkan/layers/radv_sqtt_layer.c
+++ b/src/amd/vulkan/layers/radv_sqtt_layer.c
@@ -182,7 +182,7 @@ radv_sqtt_reloc_graphics_shaders(struct radv_device *device,
       reloc->va[i] = slab_va + slab_offset;
 
       void *dest_ptr = slab_ptr + slab_offset;
-      memcpy(dest_ptr, shader->code_ptr, shader->code_size);
+      memcpy(dest_ptr, shader->code, shader->code_size);
 
       slab_offset += align(shader->code_size, RADV_SHADER_ALLOC_ALIGNMENT);
    }
@@ -1133,7 +1133,7 @@ radv_add_code_object(struct radv_device *device, struct 
radv_pipeline *pipeline)
          free(record);
          return VK_ERROR_OUT_OF_HOST_MEMORY;
       }
-      memcpy(code, shader->code_ptr, shader->code_size);
+      memcpy(code, shader->code, shader->code_size);
 
       va = radv_sqtt_shader_get_va_reloc(pipeline, i);
 
diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c
index 927843523e7..426db4dc73e 100644
--- a/src/amd/vulkan/radv_shader.c
+++ b/src/amd/vulkan/radv_shader.c
@@ -33,6 +33,7 @@
 #include "util/memstream.h"
 #include "util/mesa-sha1.h"
 #include "util/u_atomic.h"
+#include "util/streaming-load-memcpy.h"
 #include "radv_debug.h"
 #include "radv_meta.h"
 #include "radv_private.h"
@@ -2040,6 +2041,14 @@ radv_shader_binary_upload(struct radv_device *device, 
const struct radv_shader_b
 
    dest_ptr = shader->alloc->arena->ptr + shader->alloc->offset;
 
+   if (device->thread_trace.bo) {
+      shader->code = calloc(shader->code_size, 1);
+      if (!shader->code) {
+         radv_shader_unref(device, shader);
+         return false;
+      }
+   }
+
    if (binary->type == RADV_BINARY_TYPE_RTLD) {
 #if !defined(USE_LIBELF)
       return false;
@@ -2063,8 +2072,14 @@ radv_shader_binary_upload(struct radv_device *device, 
const struct radv_shader_b
          return false;
       }
 
-      shader->code_ptr = dest_ptr;
       ac_rtld_close(&rtld_binary);
+
+      if (shader->code) {
+         /* Instead of running RTLD twice, just copy the relocated binary back 
from VRAM.
+          * Use streaming memcpy to reduce penalty of copying from uncachable 
memory.
+          */
+         util_streaming_load_memcpy(shader->code, dest_ptr, shader->code_size);
+      }
 #endif
    } else {
       struct radv_shader_binary_legacy *bin = (struct 
radv_shader_binary_legacy *)binary;
@@ -2075,7 +2090,9 @@ radv_shader_binary_upload(struct radv_device *device, 
const struct radv_shader_b
       for (unsigned i = 0; i < DEBUGGER_NUM_MARKERS; i++)
          ptr32[i] = DEBUGGER_END_OF_CODE_MARKER;
 
-      shader->code_ptr = dest_ptr;
+      if (shader->code) {
+         memcpy(shader->code, bin->data + bin->stats_size, bin->code_size);
+      }
    }
 
    return true;
@@ -2667,6 +2684,7 @@ radv_shader_destroy(struct radv_device *device, struct 
radv_shader *shader)
 
    radv_free_shader_memory(device, shader->alloc);
 
+   free(shader->code);
    free(shader->spirv);
    free(shader->nir_string);
    free(shader->disasm_string);
diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h
index c36c18f9e8e..cc074438fb2 100644
--- a/src/amd/vulkan/radv_shader.h
+++ b/src/amd/vulkan/radv_shader.h
@@ -492,11 +492,13 @@ struct radv_shader {
    uint64_t va;
 
    struct ac_shader_config config;
-   uint8_t *code_ptr;
    uint32_t code_size;
    uint32_t exec_size;
    struct radv_shader_info info;
 
+   /* sqtt only */
+   void *code;
+
    /* debug only */
    char *spirv;
    uint32_t spirv_size;

Reply via email to