diff --git a/src/gallium/frontends/rusticl/core/queue.rs b/src/gallium/frontends/rusticl/core/queue.rs index 893a13e71cd..56316112467 100644 --- a/src/gallium/frontends/rusticl/core/queue.rs +++ b/src/gallium/frontends/rusticl/core/queue.rs @@ -358,6 +358,12 @@ fn flush_events( CL_SUCCESS as cl_int } +fn flush_perfetto() { + unsafe { + util_perfetto_thread_flush(); + } +} + impl Queue { pub fn new( context: Arc, @@ -417,8 +423,19 @@ impl Queue { loop { debug_assert!(flushed.is_empty()); - let Ok(new_events) = rx_t.recv() else { - break; + let new_events = match rx_t.try_recv() { + Ok(evs) => evs, + Err(_) => { + // Flush thread's track events before blocking: + flush_perfetto(); + + // break out of the loop when we get an error as this + // indicates the sender has disconnected. + let Ok(new_events) = rx_t.recv() else { + break; + }; + new_events + } }; let new_events = QueueEvents::new(new_events); @@ -478,21 +495,36 @@ impl Queue { let flush_err = flush_events(&mut flushed, &ctx, &tx_q2); last_err = cmp::min(last_err, flush_err); } + flush_perfetto(); }) .unwrap(), _thrd_signal: thread::Builder::new() .name("rusticl queue signal thread".into()) - .spawn(move || loop { - let Ok((fence, events)) = rx_t2.recv() else { - break; - }; + .spawn(move || { + loop { + let (fence, events) = match rx_t2.try_recv() { + Ok((fence, events)) => (fence, events), + Err(_) => { + // Flush thread's track events before blocking: + flush_perfetto(); - let evs = events.iter(); - if fence.wait() { - evs.for_each(|e| e.signal()); - } else { - evs.for_each(|e| e.set_user_status(CL_OUT_OF_RESOURCES)); + // break out of the loop when we get an error as this + // indicates the sender has disconnected. + let Ok((fence, events)) = rx_t2.recv() else { + break; + }; + (fence, events) + } + }; + + let evs = events.iter(); + if fence.wait() { + evs.for_each(|e| e.signal()); + } else { + evs.for_each(|e| e.set_user_status(CL_OUT_OF_RESOURCES)); + } } + flush_perfetto(); }) .unwrap(), })) diff --git a/src/gallium/frontends/rusticl/meson.build b/src/gallium/frontends/rusticl/meson.build index 41f6d8b2233..80490152fc4 100644 --- a/src/gallium/frontends/rusticl/meson.build +++ b/src/gallium/frontends/rusticl/meson.build @@ -281,6 +281,7 @@ rusticl_mesa_bindings = rust.bindgen( '--allowlist-function', 'util_queue_.*', '--allowlist-function', 'util_vma_.*', '--allowlist-function', 'util_get_cpu_caps', + '--allowlist-function', 'util_perfetto_thread_flush', '--no-copy', 'util_vma_heap', # it's a linked list '--no-copy', 'util_queue', '--no-copy', 'util_queue_fence', diff --git a/src/gallium/frontends/rusticl/rusticl_mesa_bindings.h b/src/gallium/frontends/rusticl/rusticl_mesa_bindings.h index 857a64b51bb..86e8e43a795 100644 --- a/src/gallium/frontends/rusticl/rusticl_mesa_bindings.h +++ b/src/gallium/frontends/rusticl/rusticl_mesa_bindings.h @@ -26,6 +26,7 @@ #include "util/disk_cache.h" #include "util/hex.h" #include "util/os_time.h" +#include "util/perf/u_perfetto.h" #include "util/u_cpu_detect.h" #include "util/u_inlines.h" #include "util/u_upload_mgr.h"