freedreno: add support for markers.

Signed-off-by: amber@igalia.com
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20727>
This commit is contained in:
Amber 2023-01-16 13:35:26 +01:00 committed by Marge Bot
parent ab9dd18b68
commit a6ac4cbae8
3 changed files with 66 additions and 4 deletions

View file

@ -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: <magic><formatted string>\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

View file

@ -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,

View file

@ -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')],