diff options
Diffstat (limited to 'components/compositing/compositor.rs')
-rw-r--r-- | components/compositing/compositor.rs | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/components/compositing/compositor.rs b/components/compositing/compositor.rs index 461a5a819d5..53debad39d6 100644 --- a/components/compositing/compositor.rs +++ b/components/compositing/compositor.rs @@ -34,8 +34,9 @@ use ipc_channel::ipc::{self, IpcSharedMemory}; use libc::c_void; use log::{debug, info, trace, warn}; use pixels::{CorsStatus, Image, ImageFrame, PixelFormat}; +use profile_traits::mem::{ProcessReports, ProfilerRegistration, Report, ReportKind}; use profile_traits::time::{self as profile_time, ProfilerCategory}; -use profile_traits::time_profile; +use profile_traits::{path, time_profile}; use servo_config::opts; use servo_geometry::DeviceIndependentPixel; use style_traits::CSSPixel; @@ -147,6 +148,10 @@ pub struct IOCompositor { /// The [`Instant`] of the last animation tick, used to avoid flooding the Constellation and /// ScriptThread with a deluge of animation ticks. last_animation_tick: Instant, + + /// A handle to the memory profiler which will automatically unregister + /// when it's dropped. + _mem_profiler_registration: ProfilerRegistration, } /// Why we need to be repainted. This is used for debugging. @@ -391,6 +396,11 @@ impl ServoRenderer { impl IOCompositor { pub fn new(state: InitialCompositorState, convert_mouse_to_touch: bool) -> Self { + let registration = state.mem_profiler_chan.prepare_memory_reporting( + "compositor".into(), + state.sender.clone(), + CompositorMsg::CollectMemoryReport, + ); let compositor = IOCompositor { global: Rc::new(RefCell::new(ServoRenderer { shutdown_state: state.shutdown_state, @@ -414,6 +424,7 @@ impl IOCompositor { rendering_context: state.rendering_context, pending_frames: 0, last_animation_tick: Instant::now(), + _mem_profiler_registration: registration, }; { @@ -496,6 +507,30 @@ impl IOCompositor { } match msg { + CompositorMsg::CollectMemoryReport(sender) => { + let ops = + wr_malloc_size_of::MallocSizeOfOps::new(servo_allocator::usable_size, None); + let report = self.global.borrow().webrender_api.report_memory(ops); + let reports = vec![ + Report { + path: path!["webrender", "fonts"], + kind: ReportKind::ExplicitJemallocHeapSize, + size: report.fonts, + }, + Report { + path: path!["webrender", "images"], + kind: ReportKind::ExplicitJemallocHeapSize, + size: report.images, + }, + Report { + path: path!["webrender", "display-list"], + kind: ReportKind::ExplicitJemallocHeapSize, + size: report.display_list, + }, + ]; + sender.send(ProcessReports::new(reports)); + }, + CompositorMsg::ChangeRunningAnimationsState( webview_id, pipeline_id, |