From 613c706a39553c78a496bcb81a221c6b3a1f20bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= Date: Tue, 29 Apr 2025 23:01:45 +0200 Subject: [PATCH] Report layers rendered to `iced_beacon` --- beacon/src/client.rs | 1 + beacon/src/lib.rs | 9 ++++++++- beacon/src/span.rs | 3 ++- debug/src/lib.rs | 16 ++++++++++++---- wgpu/src/layer.rs | 10 ++++++++++ wgpu/src/lib.rs | 12 ++++++++++++ 6 files changed, 45 insertions(+), 6 deletions(-) diff --git a/beacon/src/client.rs b/beacon/src/client.rs index 85f44eb8..3850ca63 100644 --- a/beacon/src/client.rs +++ b/beacon/src/client.rs @@ -48,6 +48,7 @@ pub enum Event { MessageLogged { number: usize, message: String }, CommandsSpawned(usize), SubscriptionsTracked(usize), + LayersRendered(usize), } impl Client { diff --git a/beacon/src/lib.rs b/beacon/src/lib.rs index a5291e32..50af8b04 100644 --- a/beacon/src/lib.rs +++ b/beacon/src/lib.rs @@ -127,6 +127,7 @@ pub fn run() -> impl Stream { let mut last_tasks = 0; let mut last_subscriptions = 0; let mut last_present_window = None; + let mut last_present_layers = 0; drop(task::spawn(async move { let mut last_message_number = None; @@ -199,6 +200,9 @@ pub fn run() -> impl Stream { ) => { last_tasks = commands; } + client::Event::LayersRendered(layers) => { + last_present_layers = layers; + } client::Event::SpanStarted( span::Stage::Update, ) => { @@ -264,7 +268,10 @@ pub fn run() -> impl Stream { } } span::Stage::Present(window) => { - Span::Present { window } + Span::Present { + window, + layers: last_present_layers, + } } span::Stage::Custom(name) => { Span::Custom { name } diff --git a/beacon/src/span.rs b/beacon/src/span.rs index ff869e1e..8a266acc 100644 --- a/beacon/src/span.rs +++ b/beacon/src/span.rs @@ -33,6 +33,7 @@ pub enum Span { }, Present { window: window::Id, + layers: usize, }, Custom { name: String, @@ -70,7 +71,7 @@ impl Span { Span::Draw { window } => Stage::Draw(*window), Span::Prepare { primitive, .. } => Stage::Prepare(*primitive), Span::Render { primitive, .. } => Stage::Render(*primitive), - Span::Present { window } => Stage::Present(*window), + Span::Present { window, .. } => Stage::Present(*window), Span::Custom { name, .. } => Stage::Custom(name.clone()), } } diff --git a/debug/src/lib.rs b/debug/src/lib.rs index 83a424d2..6090cfbf 100644 --- a/debug/src/lib.rs +++ b/debug/src/lib.rs @@ -43,11 +43,15 @@ pub fn theme_changed(f: impl FnOnce() -> Option) { } pub fn tasks_spawned(amount: usize) { - internal::tasks_spawned(amount) + internal::tasks_spawned(amount); } pub fn subscriptions_tracked(amount: usize) { - internal::subscriptions_tracked(amount) + internal::subscriptions_tracked(amount); +} + +pub fn layers_rendered(amount: impl FnOnce() -> usize) { + internal::layers_rendered(amount); } pub fn boot() -> Span { @@ -157,6 +161,10 @@ mod internal { log(client::Event::SubscriptionsTracked(amount)); } + pub fn layers_rendered(amount: impl FnOnce() -> usize) { + log(client::Event::LayersRendered(amount())); + } + pub fn boot() -> Span { span(span::Stage::Boot) } @@ -300,8 +308,6 @@ mod internal { use crate::futures::Subscription; use crate::{Command, Primitive}; - use std::io; - pub fn enable() {} pub fn disable() {} @@ -317,6 +323,8 @@ mod internal { pub fn subscriptions_tracked(_amount: usize) {} + pub fn layers_rendered(_amount: impl FnOnce() -> usize) {} + pub fn boot() -> Span { Span } diff --git a/wgpu/src/layer.rs b/wgpu/src/layer.rs index 5e307ca7..8003d8f6 100644 --- a/wgpu/src/layer.rs +++ b/wgpu/src/layer.rs @@ -27,6 +27,16 @@ pub struct Layer { } impl Layer { + pub fn is_empty(&self) -> bool { + self.quads.is_empty() + && self.triangles.is_empty() + && self.primitives.is_empty() + && self.images.is_empty() + && self.text.is_empty() + && self.pending_meshes.is_empty() + && self.pending_text.is_empty() + } + pub fn draw_quad( &mut self, quad: renderer::Quad, diff --git a/wgpu/src/lib.rs b/wgpu/src/lib.rs index 94ab81c4..7f74905b 100644 --- a/wgpu/src/lib.rs +++ b/wgpu/src/lib.rs @@ -604,6 +604,18 @@ impl Renderer { } let _ = ManuallyDrop::into_inner(render_pass); + + debug::layers_rendered(|| { + self.layers + .iter() + .filter(|layer| { + !layer.is_empty() + && physical_bounds + .intersection(&(layer.bounds * scale_factor)) + .is_some_and(|viewport| viewport.snap().is_some()) + }) + .count() + }); } }