diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 917b1475b3a..705e6e54c00 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -874,12 +874,19 @@ bool si_shader_binary_upload(struct si_screen *sscreen, struct si_shader *shader if (!u.rx_ptr) return false; - bool ok = ac_rtld_upload(&u); + int size = ac_rtld_upload(&u); + + if (sscreen->debug_flags & DBG(SQTT)) { + /* Remember the uploaded code */ + shader->binary.uploaded_code_size = size; + shader->binary.uploaded_code = malloc(size); + memcpy(shader->binary.uploaded_code, u.rx_ptr, size); + } sscreen->ws->buffer_unmap(shader->bo->buf); ac_rtld_close(&binary); - return ok; + return size >= 0; } static void si_shader_dump_disassembly(struct si_screen *screen, @@ -2143,6 +2150,10 @@ void si_shader_binary_clean(struct si_shader_binary *binary) free(binary->llvm_ir_string); binary->llvm_ir_string = NULL; + + free(binary->uploaded_code); + binary->uploaded_code = NULL; + binary->uploaded_code_size = 0; } void si_shader_destroy(struct si_shader *shader) diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h index 07615fa87c7..d2d5718f201 100644 --- a/src/gallium/drivers/radeonsi/si_shader.h +++ b/src/gallium/drivers/radeonsi/si_shader.h @@ -723,6 +723,9 @@ struct si_shader_binary { const char *elf_buffer; size_t elf_size; + char *uploaded_code; + size_t uploaded_code_size; + char *llvm_ir_string; };