From: Nicolai Hähnle <nicolai.haeh...@amd.com>

Enabling this option will create ddebug-style dumps for the aux context,
except that instead of intercepting the pipe_context layer
we just dump the IB contents on flush.
---
 src/gallium/drivers/radeonsi/si_debug.c         | 17 +++++++++++++++++
 .../drivers/radeonsi/si_debug_options.inc       |  1 +
 src/gallium/drivers/radeonsi/si_pipe.c          | 14 +++++++++++++-
 3 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/radeonsi/si_debug.c 
b/src/gallium/drivers/radeonsi/si_debug.c
index 07de96057dc..9a4494a98fe 100644
--- a/src/gallium/drivers/radeonsi/si_debug.c
+++ b/src/gallium/drivers/radeonsi/si_debug.c
@@ -475,20 +475,37 @@ void si_auto_log_cs(void *data, struct u_log_context *log)
        struct si_context *ctx = (struct si_context *)data;
        si_log_cs(ctx, log, false);
 }
 
 void si_log_hw_flush(struct si_context *sctx)
 {
        if (!sctx->log)
                return;
 
        si_log_cs(sctx, sctx->log, true);
+
+       if (&sctx->b == sctx->screen->aux_context) {
+               /* The aux context isn't captured by the ddebug wrapper,
+                * so we dump it on a flush-by-flush basis here.
+                */
+               FILE *f = dd_get_debug_file(false);
+               if (!f) {
+                       fprintf(stderr, "radeonsi: error opening aux context 
dump file.\n");
+               } else {
+                       dd_write_header(f, &sctx->screen->b, 0);
+
+                       fprintf(f, "Aux context dump:\n\n");
+                       u_log_new_page_print(sctx->log, f);
+
+                       fclose(f);
+               }
+       }
 }
 
 static const char *priority_to_string(enum radeon_bo_priority priority)
 {
 #define ITEM(x) [RADEON_PRIO_##x] = #x
        static const char *table[64] = {
                ITEM(FENCE),
                ITEM(TRACE),
                ITEM(SO_FILLED_SIZE),
                ITEM(QUERY),
diff --git a/src/gallium/drivers/radeonsi/si_debug_options.inc 
b/src/gallium/drivers/radeonsi/si_debug_options.inc
index 165dba8baf5..f4c3e19ed95 100644
--- a/src/gallium/drivers/radeonsi/si_debug_options.inc
+++ b/src/gallium/drivers/radeonsi/si_debug_options.inc
@@ -1,4 +1,5 @@
 OPT_BOOL(clear_db_cache_before_clear, false, "Clear DB cache before fast depth 
clear")
 OPT_BOOL(enable_nir, false, "Enable NIR")
+OPT_BOOL(aux_debug, false, "Generate ddebug_dumps for the auxiliary context")
 
 #undef OPT_BOOL
diff --git a/src/gallium/drivers/radeonsi/si_pipe.c 
b/src/gallium/drivers/radeonsi/si_pipe.c
index 9f8bd2039ee..10566a9b8d5 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.c
+++ b/src/gallium/drivers/radeonsi/si_pipe.c
@@ -718,20 +718,26 @@ static void si_destroy_screen(struct pipe_screen* pscreen)
                }
        }
        mtx_destroy(&sscreen->shader_parts_mutex);
        si_destroy_shader_cache(sscreen);
 
        si_destroy_perfcounters(sscreen);
        si_gpu_load_kill_thread(sscreen);
 
        mtx_destroy(&sscreen->gpu_load_mutex);
        mtx_destroy(&sscreen->aux_context_lock);
+       struct u_log_context *aux_log = ((struct si_context 
*)sscreen->aux_context)->log;
+       if (aux_log) {
+               sscreen->aux_context->set_log_context(sscreen->aux_context, 
NULL);
+               u_log_context_destroy(aux_log);
+               FREE(aux_log);
+       }
        sscreen->aux_context->destroy(sscreen->aux_context);
 
        slab_destroy_parent(&sscreen->pool_transfers);
 
        disk_cache_destroy(sscreen->disk_shader_cache);
        sscreen->ws->destroy(sscreen->ws);
        FREE(sscreen);
 }
 
 static void si_init_gs_info(struct si_screen *sscreen)
@@ -1176,21 +1182,27 @@ struct pipe_screen *radeonsi_screen_create(struct 
radeon_winsys *ws,
                        sscreen->eqaa_force_color_samples = f;
                }
        }
 
        for (i = 0; i < num_comp_hi_threads; i++)
                si_init_compiler(sscreen, &sscreen->compiler[i]);
        for (i = 0; i < num_comp_lo_threads; i++)
                si_init_compiler(sscreen, &sscreen->compiler_lowp[i]);
 
        /* Create the auxiliary context. This must be done last. */
-       sscreen->aux_context = si_create_context(&sscreen->b, 0);
+       sscreen->aux_context = si_create_context(
+               &sscreen->b, sscreen->options.aux_debug ? PIPE_CONTEXT_DEBUG : 
0);
+       if (sscreen->options.aux_debug) {
+               struct u_log_context *log = CALLOC_STRUCT(u_log_context);
+               u_log_context_init(log);
+               sscreen->aux_context->set_log_context(sscreen->aux_context, 
log);
+       }
 
        if (sscreen->debug_flags & DBG(TEST_DMA))
                si_test_dma(sscreen);
 
        if (sscreen->debug_flags & DBG(TEST_DMA_PERF)) {
                si_test_dma_perf(sscreen);
        }
 
        if (sscreen->debug_flags & (DBG(TEST_VMFAULT_CP) |
                                      DBG(TEST_VMFAULT_SDMA) |
-- 
2.20.1

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to