From 94be71f287a4dc09a1f13504e44a5e889f73770b Mon Sep 17 00:00:00 2001 From: Miko Mynttinen <mikokm@gmail.com> Date: Fri, 20 Dec 2019 15:41:06 +0000 Subject: [PATCH] Bug 1605380 - Avoid calculating snapped bounds for some display items twice r=aosmond Differential Revision: https://phabricator.services.mozilla.com/D57976 --HG-- extra : moz-landing-system : lando --- gfx/wr/webrender/src/scene_building.rs | 55 +++++++++++++++----------- 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/gfx/wr/webrender/src/scene_building.rs b/gfx/wr/webrender/src/scene_building.rs index 1392574e095ec..790ca150f4f6f 100644 --- a/gfx/wr/webrender/src/scene_building.rs +++ b/gfx/wr/webrender/src/scene_building.rs @@ -994,21 +994,8 @@ impl<'a> SceneBuilder<'a> { fn process_common_properties( &mut self, common: &CommonItemProperties, - apply_pipeline_clip: bool - ) -> (LayoutPrimitiveInfo, ScrollNodeAndClipChain) { - let (layout, _, clip_and_scroll) = self.process_common_properties_with_bounds( - common, - &common.clip_rect, - apply_pipeline_clip, - ); - (layout, clip_and_scroll) - } - - fn process_common_properties_with_bounds( - &mut self, - common: &CommonItemProperties, - bounds: &LayoutRect, - apply_pipeline_clip: bool + bounds: Option<&LayoutRect>, + apply_pipeline_clip: bool, ) -> (LayoutPrimitiveInfo, LayoutRect, ScrollNodeAndClipChain) { let clip_and_scroll = self.get_clip_and_scroll( &common.clip_id, @@ -1024,12 +1011,17 @@ impl<'a> SceneBuilder<'a> { &self.clip_scroll_tree ); - let clip_rect = common.clip_rect.translate(current_offset); - let rect = bounds.translate(current_offset); + let clip_rect = snap_to_device.snap_rect( + &common.clip_rect.translate(current_offset) + ); + + let rect = bounds.map_or(clip_rect, |bounds| { + snap_to_device.snap_rect(&bounds.translate(current_offset)) + }); let layout = LayoutPrimitiveInfo { - rect: snap_to_device.snap_rect(&rect), - clip_rect: snap_to_device.snap_rect(&clip_rect), + rect, + clip_rect, flags: common.flags, hit_info: common.hit_info, }; @@ -1037,6 +1029,19 @@ impl<'a> SceneBuilder<'a> { (layout, rect, clip_and_scroll) } + fn process_common_properties_with_bounds( + &mut self, + common: &CommonItemProperties, + bounds: &LayoutRect, + apply_pipeline_clip: bool, + ) -> (LayoutPrimitiveInfo, LayoutRect, ScrollNodeAndClipChain) { + self.process_common_properties( + common, + Some(bounds), + apply_pipeline_clip, + ) + } + pub fn snap_rect( &mut self, rect: &LayoutRect, @@ -1141,8 +1146,9 @@ impl<'a> SceneBuilder<'a> { ); } DisplayItem::Rectangle(ref info) => { - let (layout, clip_and_scroll) = self.process_common_properties( + let (layout, _, clip_and_scroll) = self.process_common_properties( &info.common, + None, apply_pipeline_clip, ); @@ -1153,8 +1159,9 @@ impl<'a> SceneBuilder<'a> { ); } DisplayItem::HitTest(ref info) => { - let (layout, clip_and_scroll) = self.process_common_properties( + let (layout, _, clip_and_scroll) = self.process_common_properties( &info.common, + None, apply_pipeline_clip, ); @@ -1165,8 +1172,9 @@ impl<'a> SceneBuilder<'a> { ); } DisplayItem::ClearRectangle(ref info) => { - let (layout, clip_and_scroll) = self.process_common_properties( + let (layout, _, clip_and_scroll) = self.process_common_properties( &info.common, + None, apply_pipeline_clip, ); @@ -1419,8 +1427,9 @@ impl<'a> SceneBuilder<'a> { ); } DisplayItem::BackdropFilter(ref info) => { - let (layout, clip_and_scroll) = self.process_common_properties( + let (layout, _, clip_and_scroll) = self.process_common_properties( &info.common, + None, apply_pipeline_clip, ); -- GitLab