mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-26 22:10:37 +01:00
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>
This commit is contained in:
parent
52f27cda05
commit
ea070fb83a
3 changed files with 25 additions and 5 deletions
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue