diff --git a/src/gallium/drivers/freedreno/freedreno_context.c b/src/gallium/drivers/freedreno/freedreno_context.c index 937de2277a7..a9552b9767a 100644 --- a/src/gallium/drivers/freedreno/freedreno_context.c +++ b/src/gallium/drivers/freedreno/freedreno_context.c @@ -243,6 +243,58 @@ fd_emit_string_marker(struct pipe_context *pctx, const char *string, fd_batch_reference(&batch, NULL); } +static void +fd_cs_magic_write_string(void *cs, struct u_trace_context *utctx, int magic, + const char *fmt, va_list args) +{ + struct fd_context *ctx = + container_of(utctx, struct fd_context, trace_context); + int fmt_len = vsnprintf(NULL, 0, fmt, args); + int len = 4 + fmt_len + 1; + char *string = (char *)malloc(len); + + /* format: \0 */ + *(uint32_t *)string = magic; + vsnprintf(string + 4, fmt_len + 1, fmt, args); + + if (ctx->screen->gen >= 5) { + fd_emit_string5((struct fd_ringbuffer *)cs, string, len); + } else { + fd_emit_string((struct fd_ringbuffer *)cs, string, len); + } + free(string); +} + +void +fd_cs_trace_msg(struct u_trace_context *utctx, void *cs, const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + int magic = CP_NOP_MESG; + fd_cs_magic_write_string(cs, utctx, magic, fmt, args); + va_end(args); +} + +void +fd_cs_trace_start(struct u_trace_context *utctx, void *cs, const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + int magic = CP_NOP_BEGN; + fd_cs_magic_write_string(cs, utctx, magic, fmt, args); + va_end(args); +} + +void +fd_cs_trace_end(struct u_trace_context *utctx, void *cs, const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + int magic = CP_NOP_END; + fd_cs_magic_write_string(cs, utctx, magic, fmt, args); + va_end(args); +} + /** * If we have a pending fence_server_sync() (GPU side sync), flush now. * The alternative to try to track this with batch dependencies gets diff --git a/src/gallium/drivers/freedreno/freedreno_context.h b/src/gallium/drivers/freedreno/freedreno_context.h index ebc806f3183..d90446bf578 100644 --- a/src/gallium/drivers/freedreno/freedreno_context.h +++ b/src/gallium/drivers/freedreno/freedreno_context.h @@ -716,6 +716,13 @@ void fd_context_setup_common_vbos(struct fd_context *ctx); void fd_context_cleanup_common_vbos(struct fd_context *ctx); void fd_emit_string(struct fd_ringbuffer *ring, const char *string, int len); void fd_emit_string5(struct fd_ringbuffer *ring, const char *string, int len); +__attribute__((format(printf, 3, 4))) void +fd_cs_trace_msg(struct u_trace_context *utctx, void *cs, const char *fmt, ...); +__attribute__((format(printf, 3, 4))) void +fd_cs_trace_start(struct u_trace_context *utctx, void *cs, const char *fmt, + ...); +__attribute__((format(printf, 3, 4))) void +fd_cs_trace_end(struct u_trace_context *utctx, void *cs, const char *fmt, ...); struct pipe_context *fd_context_init(struct fd_context *ctx, struct pipe_screen *pscreen, diff --git a/src/gallium/drivers/freedreno/freedreno_tracepoints.py b/src/gallium/drivers/freedreno/freedreno_tracepoints.py index 68e19fcbc0f..215d215c62d 100644 --- a/src/gallium/drivers/freedreno/freedreno_tracepoints.py +++ b/src/gallium/drivers/freedreno/freedreno_tracepoints.py @@ -62,10 +62,12 @@ def begin_end_tp(name, args=[], tp_struct=None, tp_print=None, args=args, tp_struct=tp_struct, tp_perfetto='fd_start_{0}'.format(name), - tp_print=tp_print) + tp_print=tp_print, + tp_markers='fd_cs_trace_start') Tracepoint('end_{0}'.format(name), toggle_name=name, - tp_perfetto='fd_end_{0}'.format(name)) + tp_perfetto='fd_end_{0}'.format(name), + tp_markers='fd_cs_trace_end') def singular_tp(name, args=[], tp_struct=None, tp_print=None, @@ -77,12 +79,13 @@ def singular_tp(name, args=[], tp_struct=None, tp_print=None, toggle_name=name, args=args, tp_struct=tp_struct, - tp_print=tp_print) + tp_print=tp_print, + tp_markers='fd_cs_trace_msg') begin_end_tp('state_restore') singular_tp('flush_batch', - args=[TracepointArg(type='struct fd_batch *', var='batch', c_format='%x'), + args=[TracepointArg(type='struct fd_batch *', var='batch', c_format='%p'), TracepointArg(type='uint16_t', var='cleared', c_format='%x'), TracepointArg(type='uint16_t', var='gmem_reason', c_format='%x'), TracepointArg(type='uint16_t', var='num_draws', c_format='%u')],