freedreno: add support for markers.
authorAmber <amber@igalia.com>
Mon, 16 Jan 2023 12:35:26 +0000 (13:35 +0100)
committerMarge Bot <emma+marge@anholt.net>
Wed, 18 Jan 2023 10:53:36 +0000 (10:53 +0000)
Signed-off-by: amber@igalia.com
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20727>

src/gallium/drivers/freedreno/freedreno_context.c
src/gallium/drivers/freedreno/freedreno_context.h
src/gallium/drivers/freedreno/freedreno_tracepoints.py

index 937de22..a9552b9 100644 (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
index ebc806f..d90446b 100644 (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,
index 68e19fc..215d215 100644 (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')],