Skip to content

Commit 5fd12cd

Browse files
committed
Metrics collector: measure dirty region
1 parent 9d03bbb commit 5fd12cd

File tree

8 files changed

+46
-37
lines changed

8 files changed

+46
-37
lines changed

internal/backends/qt/qt_window.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1014,10 +1014,6 @@ impl ItemRenderer for QtItemRenderer<'_> {
10141014
(*painter)->setOpacity((*painter)->opacity() * opacity);
10151015
}}
10161016
}
1017-
1018-
fn metrics(&self) -> RenderingMetrics {
1019-
self.metrics.clone()
1020-
}
10211017
}
10221018

10231019
#[derive(Clone)]
@@ -1609,7 +1605,7 @@ impl QtWindow {
16091605
painter,
16101606
cache: &self.cache,
16111607
window: &self.window,
1612-
metrics: RenderingMetrics { layers_created: Some(0) },
1608+
metrics: RenderingMetrics { layers_created: Some(0), ..Default::default() },
16131609
};
16141610

16151611
for (component, origin) in components {
@@ -1624,7 +1620,8 @@ impl QtWindow {
16241620
}
16251621

16261622
if let Some(collector) = &*self.rendering_metrics_collector.borrow() {
1627-
collector.measure_frame_rendered(&mut renderer);
1623+
let metrics = renderer.metrics.clone();
1624+
collector.measure_frame_rendered(&mut renderer, metrics);
16281625
}
16291626

16301627
if self.window.has_active_animations() {

internal/core/graphics/rendering_metrics_collector.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,20 @@ pub enum RefreshMode {
2929
pub struct RenderingMetrics {
3030
/// The number of layers that were created. None if the renderer does not create layers.
3131
pub layers_created: Option<usize>,
32+
33+
/// dirty_region
34+
pub dirty_region: Option<crate::partial_renderer::DirtyRegion>,
3235
}
3336

3437
impl core::fmt::Display for RenderingMetrics {
3538
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
3639
if let Some(layer_count) = self.layers_created {
37-
write!(f, "[{layer_count} layers created]")
38-
} else {
39-
Ok(())
40+
write!(f, "[{layer_count} layers created]")?
41+
}
42+
if let Some(dirty_region) = &self.dirty_region {
43+
write!(f, "(dirty: {dirty_region:?})")?
4044
}
45+
Ok(())
4146
}
4247
}
4348

@@ -158,10 +163,11 @@ impl RenderingMetricsCollector {
158163
pub fn measure_frame_rendered(
159164
self: &Rc<Self>,
160165
renderer: &mut dyn crate::item_rendering::ItemRenderer,
166+
metrics: RenderingMetrics,
161167
) {
162168
self.collected_frame_data_since_second_ago
163169
.borrow_mut()
164-
.push(FrameData { timestamp: Instant::now(), metrics: renderer.metrics() });
170+
.push(FrameData { timestamp: Instant::now(), metrics });
165171
if matches!(self.refresh_mode, RefreshMode::FullSpeed) {
166172
crate::animations::CURRENT_ANIMATION_DRIVER
167173
.with(|driver| driver.set_has_active_animations());

internal/core/item_rendering.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -489,12 +489,6 @@ pub trait ItemRenderer {
489489

490490
/// Return the internal renderer
491491
fn as_any(&mut self) -> Option<&mut dyn core::any::Any>;
492-
493-
/// Returns any rendering metrics collecting since the creation of the renderer (typically
494-
/// per frame)
495-
fn metrics(&self) -> crate::graphics::rendering_metrics_collector::RenderingMetrics {
496-
Default::default()
497-
}
498492
}
499493

500494
/// Helper trait to express the features of an item renderer.

internal/core/partial_renderer.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,12 +215,18 @@ impl PartialRendererCache {
215215
}
216216

217217
/// A region composed of a few rectangles that need to be redrawn.
218-
#[derive(Default, Clone, Debug)]
218+
#[derive(Default, Clone)]
219219
pub struct DirtyRegion {
220220
rectangles: [euclid::Box2D<Coord, LogicalPx>; Self::MAX_COUNT],
221221
count: usize,
222222
}
223223

224+
impl core::fmt::Debug for DirtyRegion {
225+
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
226+
write!(f, "{:?}", &self.rectangles[..self.count])
227+
}
228+
}
229+
224230
impl DirtyRegion {
225231
/// The maximum number of rectangles that can be stored in a DirtyRegion
226232
pub(crate) const MAX_COUNT: usize = 3;

internal/core/software_renderer.rs

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use crate::api::PlatformError;
2020
use crate::graphics::rendering_metrics_collector::{RefreshMode, RenderingMetricsCollector};
2121
use crate::graphics::{BorderRadius, Rgba8Pixel, SharedImageBuffer, SharedPixelBuffer};
2222
use crate::item_rendering::{
23-
CachedRenderingData, RenderBorderRectangle, RenderImage, RenderRectangle,
23+
CachedRenderingData, ItemRenderer, RenderBorderRectangle, RenderImage, RenderRectangle,
2424
};
2525
use crate::item_tree::ItemTreeWeak;
2626
use crate::items::{ItemRc, TextOverflow, TextWrap};
@@ -634,18 +634,28 @@ impl SoftwareRenderer {
634634
}
635635
}
636636

637-
if let Some(metrics) = &self.rendering_metrics_collector {
638-
metrics.measure_frame_rendered(&mut renderer);
639-
if metrics.refresh_mode() == RefreshMode::FullSpeed {
640-
self.partial_rendering_state.force_screen_refresh();
641-
}
642-
}
637+
self.measure_frame_rendered(&mut renderer);
643638

644639
dirty_region
645640
})
646641
.unwrap_or_default()
647642
}
648643

644+
fn measure_frame_rendered(&self, renderer: &mut dyn ItemRenderer) {
645+
if let Some(metrics) = &self.rendering_metrics_collector {
646+
let prev_frame_dirty = self.prev_frame_dirty.take();
647+
let m = crate::graphics::rendering_metrics_collector::RenderingMetrics {
648+
dirty_region: Some(prev_frame_dirty.clone()),
649+
..Default::default()
650+
};
651+
self.prev_frame_dirty.set(prev_frame_dirty);
652+
metrics.measure_frame_rendered(renderer, m);
653+
if metrics.refresh_mode() == RefreshMode::FullSpeed {
654+
self.partial_rendering_state.force_screen_refresh();
655+
}
656+
}
657+
}
658+
649659
/// Render the window, line by line, into the line buffer provided by the [`LineBufferProvider`].
650660
///
651661
/// The renderer uses a cache internally and will only render the part of the window
@@ -1252,12 +1262,7 @@ fn prepare_scene(
12521262
}
12531263
});
12541264

1255-
if let Some(metrics) = &software_renderer.rendering_metrics_collector {
1256-
metrics.measure_frame_rendered(&mut renderer);
1257-
if metrics.refresh_mode() == RefreshMode::FullSpeed {
1258-
software_renderer.partial_rendering_state.force_screen_refresh();
1259-
}
1260-
}
1265+
software_renderer.measure_frame_rendered(&mut renderer);
12611266

12621267
let prepare_scene = renderer.into_inner();
12631268

internal/renderers/femtovg/itemrenderer.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,10 @@ impl<'a, R: femtovg::Renderer + TextureImporter> GLItemRenderer<'a, R> {
192192
pub fn global_alpha_transparent(&self) -> bool {
193193
self.state.last().unwrap().global_alpha == 0.0
194194
}
195+
196+
pub fn metrics(&self) -> RenderingMetrics {
197+
self.metrics.clone()
198+
}
195199
}
196200

197201
impl<'a, R: femtovg::Renderer + TextureImporter> ItemRenderer for GLItemRenderer<'a, R> {
@@ -903,10 +907,6 @@ impl<'a, R: femtovg::Renderer + TextureImporter> ItemRenderer for GLItemRenderer
903907
*state *= opacity;
904908
self.canvas.borrow_mut().set_global_alpha(*state);
905909
}
906-
907-
fn metrics(&self) -> RenderingMetrics {
908-
self.metrics.clone()
909-
}
910910
}
911911

912912
#[derive(Clone)]
@@ -1033,7 +1033,7 @@ impl<'a, R: femtovg::Renderer + TextureImporter> GLItemRenderer<'a, R> {
10331033
global_alpha: 1.,
10341034
current_render_target: femtovg::RenderTarget::Screen,
10351035
}],
1036-
metrics: RenderingMetrics { layers_created: Some(0) },
1036+
metrics: RenderingMetrics { layers_created: Some(0), ..Default::default() },
10371037
}
10381038
}
10391039

internal/renderers/femtovg/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,8 @@ impl<B: GraphicsBackend> FemtoVGRenderer<B> {
240240
}
241241

242242
if let Some(collector) = &self.rendering_metrics_collector.borrow().as_ref() {
243-
collector.measure_frame_rendered(&mut item_renderer);
243+
let metrics = item_renderer.metrics();
244+
collector.measure_frame_rendered(&mut item_renderer, metrics);
244245
}
245246

246247
let commands = canvas.borrow_mut().flush_to_surface(surface.render_surface());

internal/renderers/skia/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -776,7 +776,7 @@ impl SkiaRenderer {
776776
}
777777

778778
if let Some(collector) = &self.rendering_metrics_collector.borrow_mut().as_ref() {
779-
collector.measure_frame_rendered(item_renderer);
779+
collector.measure_frame_rendered(item_renderer, Default::default());
780780
if collector.refresh_mode()
781781
== i_slint_core::graphics::rendering_metrics_collector::RefreshMode::FullSpeed
782782
{

0 commit comments

Comments
 (0)