From 28a03be06b183caa433de03c9bf35ba5dbd8c77a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Thu, 30 Jun 2016 01:15:19 +0200 Subject: [PATCH] radeonsi: enable string markers and record apitrace call numbers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: Bas Nieuwenhuizen Reviewed-by: Nicolai Hähnle --- src/gallium/drivers/radeonsi/si_debug.c | 4 ++++ src/gallium/drivers/radeonsi/si_pipe.c | 20 +++++++++++++++++++- src/gallium/drivers/radeonsi/si_pipe.h | 1 + 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/radeonsi/si_debug.c b/src/gallium/drivers/radeonsi/si_debug.c index 112e68684f3..220ce13dab3 100644 --- a/src/gallium/drivers/radeonsi/si_debug.c +++ b/src/gallium/drivers/radeonsi/si_debug.c @@ -814,6 +814,10 @@ void si_check_vm_faults(struct r600_common_context *ctx, fprintf(f, "Device name: %s\n\n", screen->get_name(screen)); fprintf(f, "Failing VM page: 0x%08x\n\n", addr); + if (sctx->apitrace_call_number) + fprintf(f, "Last apitrace call: %u\n\n", + sctx->apitrace_call_number); + switch (ring) { case RING_GFX: si_dump_debug_state(&sctx->b.b, f, 0); diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index 6c88fe381f4..f15e58904ec 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -31,6 +31,7 @@ #include "util/u_memory.h" #include "util/u_suballoc.h" #include "vl/vl_decoder.h" +#include "../ddebug/dd_util.h" #define SI_LLVM_DEFAULT_FEATURES \ "+DumpCode,+vgpr-spilling,-fp32-denormals,+fp64-denormals" @@ -106,6 +107,22 @@ si_amdgpu_get_reset_status(struct pipe_context *ctx) return sctx->b.ws->ctx_query_reset_status(sctx->b.ctx); } +/* Apitrace profiling: + * 1) qapitrace : Tools -> Profile: Measure CPU & GPU times + * 2) In the middle panel, zoom in (mouse wheel) on some bad draw call + * and remember its number. + * 3) In Mesa, enable queries and performance counters around that draw + * call and print the results. + * 4) glretrace --benchmark --markers .. + */ +static void si_emit_string_marker(struct pipe_context *ctx, + const char *string, int len) +{ + struct si_context *sctx = (struct si_context *)ctx; + + dd_parse_apitrace_marker(string, len, &sctx->apitrace_call_number); +} + static struct pipe_context *si_create_context(struct pipe_screen *screen, void *priv, unsigned flags) { @@ -125,6 +142,7 @@ static struct pipe_context *si_create_context(struct pipe_screen *screen, sctx->b.b.screen = screen; /* this must be set first */ sctx->b.b.priv = priv; sctx->b.b.destroy = si_destroy_context; + sctx->b.b.emit_string_marker = si_emit_string_marker; sctx->b.set_atom_dirty = (void *)si_set_atom_dirty; sctx->screen = sscreen; /* Easy accessing of screen/winsys. */ sctx->is_debug = (flags & PIPE_CONTEXT_DEBUG) != 0; @@ -361,6 +379,7 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param) case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR: case PIPE_CAP_GENERATE_MIPMAP: case PIPE_CAP_POLYGON_OFFSET_UNITS_UNSCALED: + case PIPE_CAP_STRING_MARKER: return 1; case PIPE_CAP_RESOURCE_FROM_USER_MEMORY: @@ -413,7 +432,6 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param) case PIPE_CAP_DRAW_PARAMETERS: case PIPE_CAP_MULTI_DRAW_INDIRECT: case PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS: - case PIPE_CAP_STRING_MARKER: case PIPE_CAP_QUERY_BUFFER_OBJECT: case PIPE_CAP_CULL_DISTANCE: case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES: diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index 3aff0ac8c05..9d15cbf2225 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -330,6 +330,7 @@ struct si_context { struct r600_resource *trace_buf; unsigned trace_id; uint64_t dmesg_timestamp; + unsigned apitrace_call_number; /* Other state */ bool need_check_render_feedback;