diff --git a/webrender/src/picture.rs b/webrender/src/picture.rs index 4120b203ed..73ce7c1a2c 100644 --- a/webrender/src/picture.rs +++ b/webrender/src/picture.rs @@ -2787,10 +2787,10 @@ impl TileCacheInstance { if let Some(TileSurface::Texture { descriptor: SurfaceTextureDescriptor::Native { ref mut id, .. }, .. }) = tile.surface { if let Some(id) = id.take() { frame_state.resource_cache.destroy_compositor_tile(id); - tile.surface = None; - // Invalidate the entire tile to force a redraw. - tile.invalidate(None, InvalidationReason::CompositorKindChanged); } + tile.surface = None; + // Invalidate the entire tile to force a redraw. + tile.invalidate(None, InvalidationReason::CompositorKindChanged); } } diff --git a/webrender/src/scene.rs b/webrender/src/scene.rs index 0f468b494f..7498f9dae5 100644 --- a/webrender/src/scene.rs +++ b/webrender/src/scene.rs @@ -4,7 +4,9 @@ use api::{BuiltDisplayList, DisplayListWithCache, ColorF, DynamicProperties, Epoch, FontRenderMode}; use api::{PipelineId, PropertyBinding, PropertyBindingId, PropertyValue, MixBlendMode, StackingContext}; +use api::MemoryReport; use api::units::*; +use malloc_size_of::{MallocSizeOf, MallocSizeOfOps}; use crate::composite::CompositorKind; use crate::clip::{ClipStore, ClipDataStore}; use crate::spatial_tree::{SpatialTree, SpatialNodeIndex}; @@ -236,6 +238,16 @@ impl Scene { false } + + pub fn report_memory( + &self, + ops: &mut MallocSizeOfOps, + report: &mut MemoryReport + ) { + for (_, pipeline) in &self.pipelines { + report.display_list += pipeline.display_list.size_of(ops) + } + } } pub trait StackingContextHelpers { diff --git a/webrender/src/scene_builder_thread.rs b/webrender/src/scene_builder_thread.rs index 4827c5a6a3..c9de7740cc 100644 --- a/webrender/src/scene_builder_thread.rs +++ b/webrender/src/scene_builder_thread.rs @@ -694,6 +694,7 @@ impl SceneBuilderThread { let mut report = MemoryReport::default(); for doc in self.documents.values() { doc.interners.report_memory(ops, &mut report); + doc.scene.report_memory(ops, &mut report); } report diff --git a/webrender_api/src/api.rs b/webrender_api/src/api.rs index ad57931a73..e322e947c7 100644 --- a/webrender_api/src/api.rs +++ b/webrender_api/src/api.rs @@ -1242,6 +1242,7 @@ pub struct MemoryReport { pub rasterized_blobs: usize, pub shader_cache: usize, pub interning: InterningMemoryReport, + pub display_list: usize, // // GPU memory. diff --git a/webrender_api/src/display_item_cache.rs b/webrender_api/src/display_item_cache.rs index 3f85f0c68f..169e54797a 100644 --- a/webrender_api/src/display_item_cache.rs +++ b/webrender_api/src/display_item_cache.rs @@ -4,6 +4,7 @@ use crate::display_item::*; use crate::display_list::*; +use malloc_size_of::{MallocSizeOf, MallocSizeOfOps}; #[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] pub struct CachedDisplayItem { @@ -21,6 +22,12 @@ impl CachedDisplayItem { } } +impl MallocSizeOf for CachedDisplayItem { + fn size_of(&self, ops: &mut MallocSizeOfOps) -> usize { + self.data.size_of(ops) + } +} + impl From> for CachedDisplayItem { fn from(item_ref: DisplayItemRef) -> Self { let item = item_ref.item(); @@ -38,13 +45,13 @@ impl From> for CachedDisplayItem { } } -#[derive(Clone, Deserialize, Serialize)] +#[derive(Clone, Deserialize, MallocSizeOf, Serialize)] struct CacheEntry { items: Vec, occupied: bool, } -#[derive(Clone, Deserialize, Serialize)] +#[derive(Clone, Deserialize, MallocSizeOf, Serialize)] pub struct DisplayItemCache { entries: Vec, } diff --git a/webrender_api/src/display_list.rs b/webrender_api/src/display_list.rs index 5e463b6884..7c8235d365 100644 --- a/webrender_api/src/display_list.rs +++ b/webrender_api/src/display_list.rs @@ -16,6 +16,7 @@ use std::ops::Range; use std::mem; use std::collections::HashMap; use time::precise_time_ns; +use malloc_size_of::{MallocSizeOf, MallocSizeOfOps}; // local imports use crate::display_item as di; use crate::display_item_cache::*; @@ -172,6 +173,12 @@ impl DisplayListWithCache { } } +impl MallocSizeOf for DisplayListWithCache { + fn size_of(&self, ops: &mut MallocSizeOfOps) -> usize { + self.display_list.data.size_of(ops) + self.cache.size_of(ops) + } +} + #[cfg(feature = "serialize")] impl Serialize for DisplayListWithCache { fn serialize(