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

Author: Tatsuyuki Ishi <[email protected]>
Date:   Fri Feb 24 15:56:50 2023 +0900

radv/sqtt: Use code buffer from radv_shader directly instead of copying.

The reference-counted radv_shader always outlives the pipeline, so we can
use this buffer directly when dumping code objects to the trace.

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

---

 src/amd/vulkan/layers/radv_sqtt_layer.c | 19 +------------------
 1 file changed, 1 insertion(+), 18 deletions(-)

diff --git a/src/amd/vulkan/layers/radv_sqtt_layer.c 
b/src/amd/vulkan/layers/radv_sqtt_layer.c
index 61616ff75bf..a6c6eb6da8d 100644
--- a/src/amd/vulkan/layers/radv_sqtt_layer.c
+++ b/src/amd/vulkan/layers/radv_sqtt_layer.c
@@ -1122,25 +1122,17 @@ radv_add_code_object(struct radv_device *device, struct 
radv_pipeline *pipeline)
 
    for (unsigned i = 0; i < MESA_VULKAN_SHADER_STAGES; i++) {
       struct radv_shader *shader = pipeline->shaders[i];
-      uint8_t *code;
       uint64_t va;
 
       if (!shader)
          continue;
 
-      code = malloc(shader->code_size);
-      if (!code) {
-         free(record);
-         return VK_ERROR_OUT_OF_HOST_MEMORY;
-      }
-      memcpy(code, shader->code, shader->code_size);
-
       va = radv_sqtt_shader_get_va_reloc(pipeline, i);
 
       record->shader_data[i].hash[0] = (uint64_t)(uintptr_t)shader;
       record->shader_data[i].hash[1] = (uint64_t)(uintptr_t)shader >> 32;
       record->shader_data[i].code_size = shader->code_size;
-      record->shader_data[i].code = code;
+      record->shader_data[i].code = shader->code;
       record->shader_data[i].vgpr_count = shader->config.num_vgprs;
       record->shader_data[i].sgpr_count = shader->config.num_sgprs;
       record->shader_data[i].scratch_memory_size = 
shader->config.scratch_bytes_per_wave;
@@ -1236,15 +1228,6 @@ radv_unregister_pipeline(struct radv_device *device, 
struct radv_pipeline *pipel
    list_for_each_entry_safe(struct rgp_code_object_record, record, 
&code_object->record, list)
    {
       if (record->pipeline_hash[0] == pipeline->pipeline_hash) {
-         uint32_t mask = record->shader_stages_mask;
-         int i;
-
-         /* Free the disassembly. */
-         while (mask) {
-            i = u_bit_scan(&mask);
-            free(record->shader_data[i].code);
-         }
-
          code_object->record_count--;
          list_del(&record->list);
          free(record);

Reply via email to