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