[Mesa-dev] [PATCH 1/3] radeonsi: fix compute shader state dumping
Nicolai Hähnle
nhaehnle at gmail.com
Fri Aug 25 14:40:44 UTC 2017
From: Nicolai Hähnle <nicolai.haehnle at amd.com>
Fixes: 420c438589c8 ("radeonsi: log draw and compute state into log context")
---
src/gallium/drivers/radeonsi/si_debug.c | 17 +++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)
diff --git a/src/gallium/drivers/radeonsi/si_debug.c b/src/gallium/drivers/radeonsi/si_debug.c
index c2242a6deab..43ad73d92df 100644
--- a/src/gallium/drivers/radeonsi/si_debug.c
+++ b/src/gallium/drivers/radeonsi/si_debug.c
@@ -53,72 +53,78 @@ struct si_log_chunk_shader {
/* The shader destroy code assumes a current context for unlinking of
* PM4 packets etc.
*
* While we should be able to destroy shaders without a context, doing
* so would happen only very rarely and be therefore likely to fail
* just when you're trying to debug something. Let's just remember the
* current context in the chunk.
*/
struct si_context *ctx;
struct si_shader *shader;
+ enum pipe_shader_type processor;
/* For keep-alive reference counts */
struct si_shader_selector *sel;
struct si_compute *program;
};
static void
si_log_chunk_shader_destroy(void *data)
{
struct si_log_chunk_shader *chunk = data;
si_shader_selector_reference(chunk->ctx, &chunk->sel, NULL);
si_compute_reference(&chunk->program, NULL);
FREE(chunk);
}
static void
si_log_chunk_shader_print(void *data, FILE *f)
{
struct si_log_chunk_shader *chunk = data;
struct si_screen *sscreen = chunk->ctx->screen;
- si_dump_shader(sscreen, chunk->shader->selector->info.processor,
+ si_dump_shader(sscreen, chunk->processor,
chunk->shader, f);
}
static struct u_log_chunk_type si_log_chunk_type_shader = {
.destroy = si_log_chunk_shader_destroy,
.print = si_log_chunk_shader_print,
};
static void si_dump_gfx_shader(struct si_context *ctx,
const struct si_shader_ctx_state *state,
struct u_log_context *log)
{
struct si_shader *current = state->current;
if (!state->cso || !current)
return;
struct si_log_chunk_shader *chunk = CALLOC_STRUCT(si_log_chunk_shader);
chunk->ctx = ctx;
+ chunk->processor = state->cso->info.processor;
chunk->shader = current;
si_shader_selector_reference(ctx, &chunk->sel, current->selector);
u_log_chunk(log, &si_log_chunk_type_shader, chunk);
}
-static void si_dump_compute_shader(const struct si_cs_shader_state *state,
+static void si_dump_compute_shader(struct si_context *ctx,
struct u_log_context *log)
{
- if (!state->program || state->program != state->emitted_program)
+ const struct si_cs_shader_state *state = &ctx->cs_shader_state;
+
+ if (!state->program)
return;
struct si_log_chunk_shader *chunk = CALLOC_STRUCT(si_log_chunk_shader);
+ chunk->ctx = ctx;
+ chunk->processor = PIPE_SHADER_COMPUTE;
chunk->shader = &state->program->shader;
si_compute_reference(&chunk->program, state->program);
u_log_chunk(log, &si_log_chunk_type_shader, chunk);
}
/**
* Shader compiles can be overridden with arbitrary ELF objects by setting
* the environment variable RADEON_REPLACE_SHADERS=num1:filename1[;num2:filename2]
*/
bool si_replace_shader(unsigned num, struct ac_shader_binary *binary)
@@ -737,22 +743,21 @@ static void si_dump_gfx_descriptors(struct si_context *sctx,
{
if (!state->cso || !state->current)
return;
si_dump_descriptors(sctx, state->cso->type, &state->cso->info, log);
}
static void si_dump_compute_descriptors(struct si_context *sctx,
struct u_log_context *log)
{
- if (!sctx->cs_shader_state.program ||
- sctx->cs_shader_state.program != sctx->cs_shader_state.emitted_program)
+ if (!sctx->cs_shader_state.program)
return;
si_dump_descriptors(sctx, PIPE_SHADER_COMPUTE, NULL, log);
}
struct si_shader_inst {
char text[160]; /* one disasm line */
unsigned offset; /* instruction offset */
unsigned size; /* instruction size = 4 or 8 */
};
@@ -1060,21 +1065,21 @@ void si_log_draw_state(struct si_context *sctx, struct u_log_context *log)
si_dump_gfx_descriptors(sctx, &sctx->tes_shader, log);
si_dump_gfx_descriptors(sctx, &sctx->gs_shader, log);
si_dump_gfx_descriptors(sctx, &sctx->ps_shader, log);
}
void si_log_compute_state(struct si_context *sctx, struct u_log_context *log)
{
if (!log)
return;
- si_dump_compute_shader(&sctx->cs_shader_state, log);
+ si_dump_compute_shader(sctx, log);
si_dump_compute_descriptors(sctx, log);
}
static void si_dump_dma(struct si_context *sctx,
struct radeon_saved_cs *saved, FILE *f)
{
static const char ib_name[] = "sDMA IB";
unsigned i;
si_dump_bo_list(sctx, saved, f);
--
2.11.0
More information about the mesa-dev
mailing list