@@ -20,7 +20,7 @@ use crate::api::PlatformError;
2020use crate :: graphics:: rendering_metrics_collector:: { RefreshMode , RenderingMetricsCollector } ;
2121use crate :: graphics:: { BorderRadius , Rgba8Pixel , SharedImageBuffer , SharedPixelBuffer } ;
2222use crate :: item_rendering:: {
23- CachedRenderingData , RenderBorderRectangle , RenderImage , RenderRectangle ,
23+ CachedRenderingData , ItemRenderer , RenderBorderRectangle , RenderImage , RenderRectangle ,
2424} ;
2525use crate :: item_tree:: ItemTreeWeak ;
2626use 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
0 commit comments