| author | Nicolas Silva <nsilva@mozilla.com> |
| Thu, 12 Dec 2019 09:09:05 +0000 | |
| changeset 506636 | afdbc174451905720fd9d9be93e402fc4793aba3 |
| parent 506635 | 7f28f9e9ec258d9b35c62ff169e4cd42edf5fd69 |
| child 506637 | 116c84612571ece9fe439cb89292120f5c05f1af |
| push id | 36910 |
| push user | csabou@mozilla.com |
| push date | Thu, 12 Dec 2019 21:50:40 +0000 |
| treeherder | mozilla-central@0f6958f49842 [default view] [failures only] |
| perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
| reviewers | gw |
| bugs | 1602458 |
| milestone | 73.0a1 |
| first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
| last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/gfx/wr/webrender/src/picture.rs +++ b/gfx/wr/webrender/src/picture.rs @@ -1444,16 +1444,18 @@ pub struct TileCacheInstance { /// List of opacity bindings, with some extra information /// about whether they changed since last frame. opacity_bindings: FastHashMap<PropertyBindingId, OpacityBindingInfo>, /// Switch back and forth between old and new bindings hashmaps to avoid re-allocating. old_opacity_bindings: FastHashMap<PropertyBindingId, OpacityBindingInfo>, /// List of spatial nodes, with some extra information /// about whether they changed since last frame. spatial_nodes: FastHashMap<SpatialNodeIndex, SpatialNodeDependency>, + /// Switch back and forth between old and new spatial nodes hashmaps to avoid re-allocating. + old_spatial_nodes: FastHashMap<SpatialNodeIndex, SpatialNodeDependency>, /// A set of spatial nodes that primitives / clips depend on found /// during dependency creation. This is used to avoid trying to /// calculate invalid relative transforms when building the spatial /// nodes hash above. used_spatial_nodes: FastHashSet<SpatialNodeIndex>, /// The current dirty region tracker for this picture. pub dirty_region: DirtyRegion, /// Current size of tiles in picture units. @@ -1518,16 +1520,17 @@ impl TileCacheInstance { ), map_child_pic_to_surface: SpaceMapper::new( ROOT_SPATIAL_NODE_INDEX, PictureRect::zero(), ), opacity_bindings: FastHashMap::default(), old_opacity_bindings: FastHashMap::default(), spatial_nodes: FastHashMap::default(), + old_spatial_nodes: FastHashMap::default(), used_spatial_nodes: FastHashSet::default(), dirty_region: DirtyRegion::new(), tile_size: PictureSize::zero(), tile_rect: TileRect::zero(), tile_bounds_p0: TileOffset::zero(), tile_bounds_p1: TileOffset::zero(), local_rect: PictureRect::zero(), local_clip_rect: PictureRect::zero(), @@ -2236,31 +2239,32 @@ impl TileCacheInstance { .into(); let root_transform_changed = root_transform != self.root_transform; if root_transform_changed { self.root_transform = root_transform; frame_state.composite_state.dirty_rects_are_valid = false; } // Diff the state of the spatial nodes between last frame build and now. - let mut old_spatial_nodes = mem::replace(&mut self.spatial_nodes, FastHashMap::default()); + mem::swap(&mut self.spatial_nodes, &mut self.old_spatial_nodes); // TODO(gw): Maybe remove the used_spatial_nodes set and just mutate / create these // diffs inside add_prim_dependency? + self.spatial_nodes.clear(); for spatial_node_index in self.used_spatial_nodes.drain() { // Get the current relative transform. let mut value = get_transform_key( spatial_node_index, self.spatial_node_index, frame_context.clip_scroll_tree, ); // Check if the transform has changed from last frame let mut changed = true; - if let Some(old_info) = old_spatial_nodes.remove(&spatial_node_index) { + if let Some(old_info) = self.old_spatial_nodes.remove(&spatial_node_index) { if old_info.value == value { // Since the transform key equality check applies epsilon, if we // consider the value to be the same, store that old value to avoid // missing very slow drifts in the value over time. // TODO(gw): We should change ComparableVec to use a trait for comparison // rather than PartialEq. value = old_info.value; changed = false;