From: Marek Olšák <marek.ol...@amd.com> --- src/gallium/drivers/radeonsi/si_shader.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-)
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index c18915488e5..8c62d53e2ad 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -5302,33 +5302,37 @@ void si_shader_apply_scratch_relocs(struct si_shader *shader, if (!strcmp(scratch_rsrc_dword0_symbol, reloc->name)) { util_memcpy_cpu_to_le32(shader->binary.code + reloc->offset, &scratch_rsrc_dword0, 4); } else if (!strcmp(scratch_rsrc_dword1_symbol, reloc->name)) { util_memcpy_cpu_to_le32(shader->binary.code + reloc->offset, &scratch_rsrc_dword1, 4); } } } +/* For the UMR disassembler. */ +#define DEBUGGER_END_OF_CODE_MARKER 0xbf9f0000 /* invalid instruction */ +#define DEBUGGER_NUM_MARKERS 5 + static unsigned si_get_shader_binary_size(const struct si_shader *shader) { unsigned size = shader->binary.code_size; if (shader->prolog) size += shader->prolog->binary.code_size; if (shader->previous_stage) size += shader->previous_stage->binary.code_size; if (shader->prolog2) size += shader->prolog2->binary.code_size; if (shader->epilog) size += shader->epilog->binary.code_size; - return size; + return size + DEBUGGER_NUM_MARKERS * 4; } int si_shader_binary_upload(struct si_screen *sscreen, struct si_shader *shader) { const struct ac_shader_binary *prolog = shader->prolog ? &shader->prolog->binary : NULL; const struct ac_shader_binary *previous_stage = shader->previous_stage ? &shader->previous_stage->binary : NULL; const struct ac_shader_binary *prolog2 = shader->prolog2 ? &shader->prolog2->binary : NULL; @@ -5373,24 +5377,32 @@ int si_shader_binary_upload(struct si_screen *sscreen, struct si_shader *shader) ptr += previous_stage->code_size; } if (prolog2) { memcpy(ptr, prolog2->code, prolog2->code_size); ptr += prolog2->code_size; } memcpy(ptr, mainb->code, mainb->code_size); ptr += mainb->code_size; - if (epilog) + if (epilog) { memcpy(ptr, epilog->code, epilog->code_size); - else if (mainb->rodata_size > 0) + ptr += epilog->code_size; + } else if (mainb->rodata_size > 0) { memcpy(ptr, mainb->rodata, mainb->rodata_size); + ptr += mainb->rodata_size; + } + + /* Add end-of-code markers for the UMR disassembler. */ + uint32_t *ptr32 = (uint32_t*)ptr; + for (unsigned i = 0; i < DEBUGGER_NUM_MARKERS; i++) + ptr32[i] = DEBUGGER_END_OF_CODE_MARKER; sscreen->ws->buffer_unmap(shader->bo->buf); return 0; } static void si_shader_dump_disassembly(const struct ac_shader_binary *binary, struct pipe_debug_callback *debug, const char *name, FILE *file) { char *line, *p; -- 2.15.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev