From 75468efd8356b4f9928a2468e1f72fd9a3410550 Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Thu, 15 Nov 2018 18:09:17 -0500 Subject: [PATCH 1/2] Don't ignore the clip on the stack for reference frames and clips --- webrender/src/display_list_flattener.rs | 29 ++++++++++++++----------- webrender_api/src/display_list.rs | 29 ++++++++++++++++++++----- 2 files changed, 39 insertions(+), 19 deletions(-) diff --git a/webrender/src/display_list_flattener.rs b/webrender/src/display_list_flattener.rs index 2a68acbdc8..6354d2b5e7 100644 --- a/webrender/src/display_list_flattener.rs +++ b/webrender/src/display_list_flattener.rs @@ -377,7 +377,7 @@ impl<'a> DisplayListFlattener<'a> { debug_assert!(info.clip_id != info.scroll_frame_id); - self.add_clip_node(info.clip_id, clip_and_scroll_ids.scroll_node_id, clip_region); + self.add_clip_node(info.clip_id, clip_and_scroll_ids, clip_region); self.add_scroll_frame( info.scroll_frame_id, @@ -396,12 +396,13 @@ impl<'a> DisplayListFlattener<'a> { pipeline_id: PipelineId, item: &DisplayItemRef, reference_frame: &ReferenceFrame, - scroll_node_id: ClipId, + clip_and_scroll_ids: &ClipAndScrollInfo, reference_frame_relative_offset: LayoutVector2D, ) { self.push_reference_frame( reference_frame.id, - Some(scroll_node_id), + Some(clip_and_scroll_ids.scroll_node_id), + clip_and_scroll_ids.clip_node_id, pipeline_id, reference_frame.transform, reference_frame.perspective, @@ -472,10 +473,9 @@ impl<'a> DisplayListFlattener<'a> { }, }; - //TODO: use or assert on `clip_and_scroll_ids.clip_node_id` ? let clip_chain_index = self.add_clip_node( info.clip_id, - clip_and_scroll_ids.scroll_node_id, + clip_and_scroll_ids, ClipRegion::create_for_clip_node_with_local_clip( item.clip_rect(), reference_frame_relative_offset @@ -488,6 +488,7 @@ impl<'a> DisplayListFlattener<'a> { self.push_reference_frame( ClipId::root_reference_frame(iframe_pipeline_id), Some(info.clip_id), + None, iframe_pipeline_id, None, None, @@ -654,7 +655,7 @@ impl<'a> DisplayListFlattener<'a> { pipeline_id, &item, &info.reference_frame, - clip_and_scroll_ids.scroll_node_id, + &clip_and_scroll_ids, reference_frame_relative_offset, ); return Some(subtraversal); @@ -676,7 +677,7 @@ impl<'a> DisplayListFlattener<'a> { info.image_mask, &reference_frame_relative_offset, ); - self.add_clip_node(info.id, clip_and_scroll_ids.scroll_node_id, clip_region); + self.add_clip_node(info.id, &clip_and_scroll_ids, clip_region); } SpecificDisplayItem::ClipChain(ref info) => { // For a user defined clip-chain the parent (if specified) must @@ -1281,13 +1282,14 @@ impl<'a> DisplayListFlattener<'a> { pub fn push_reference_frame( &mut self, reference_frame_id: ClipId, - parent_id: Option, + parent_scroll_id: Option, + parent_clip_id: Option, pipeline_id: PipelineId, source_transform: Option>, source_perspective: Option, origin_in_parent_reference_frame: LayoutVector2D, ) -> SpatialNodeIndex { - let parent_index = parent_id.map(|id| self.id_to_index_mapper.get_spatial_node_index(id)); + let parent_index = parent_scroll_id.map(|id| self.id_to_index_mapper.get_spatial_node_index(id)); let index = self.clip_scroll_tree.add_reference_frame( parent_index, source_transform, @@ -1297,7 +1299,7 @@ impl<'a> DisplayListFlattener<'a> { ); self.id_to_index_mapper.map_spatial_node(reference_frame_id, index); - match parent_id { + match parent_clip_id.or(parent_scroll_id) { Some(ref parent_id) => self.id_to_index_mapper.map_to_parent_clip_chain(reference_frame_id, parent_id), _ => self.id_to_index_mapper.add_clip_chain(reference_frame_id, ClipChainId::NONE, 0), @@ -1319,6 +1321,7 @@ impl<'a> DisplayListFlattener<'a> { self.push_reference_frame( ClipId::root_reference_frame(pipeline_id), None, + None, pipeline_id, None, None, @@ -1339,7 +1342,7 @@ impl<'a> DisplayListFlattener<'a> { pub fn add_clip_node( &mut self, new_node_id: ClipId, - parent_id: ClipId, + parent: &ClipAndScrollInfo, clip_region: ClipRegion, ) -> ClipChainId where @@ -1351,9 +1354,9 @@ impl<'a> DisplayListFlattener<'a> { // Map from parent ClipId to existing clip-chain. let mut parent_clip_chain_index = self .id_to_index_mapper - .get_clip_chain_id(&parent_id); + .get_clip_chain_id(&parent.clip_node_id()); // Map the ClipId for the positioning node to a spatial node index. - let spatial_node = self.id_to_index_mapper.get_spatial_node_index(parent_id); + let spatial_node = self.id_to_index_mapper.get_spatial_node_index(parent.scroll_node_id); // Add a mapping for this ClipId in case it's referenced as a positioning node. self.id_to_index_mapper diff --git a/webrender_api/src/display_list.rs b/webrender_api/src/display_list.rs index f6d452cb96..be15795c67 100644 --- a/webrender_api/src/display_list.rs +++ b/webrender_api/src/display_list.rs @@ -1402,12 +1402,12 @@ impl DisplayListBuilder { I: IntoIterator, I::IntoIter: ExactSizeIterator + Clone, { - let parent = self.clip_stack.last().unwrap().scroll_node_id; - self.define_clip_with_parent( - parent, + let clip_and_scroll = self.clip_stack.last().unwrap().clone(); + self.define_clip_impl( + clip_and_scroll, clip_rect, complex_clips, - image_mask + image_mask, ) } @@ -1418,6 +1418,25 @@ impl DisplayListBuilder { complex_clips: I, image_mask: Option, ) -> ClipId + where + I: IntoIterator, + I::IntoIter: ExactSizeIterator + Clone, + { + self.define_clip_impl( + ClipAndScrollInfo::simple(parent), + clip_rect, + complex_clips, + image_mask, + ) + } + + fn define_clip_impl( + &mut self, + scrollinfo: ClipAndScrollInfo, + clip_rect: LayoutRect, + complex_clips: I, + image_mask: Option, + ) -> ClipId where I: IntoIterator, I::IntoIter: ExactSizeIterator + Clone, @@ -1430,7 +1449,6 @@ impl DisplayListBuilder { let info = LayoutPrimitiveInfo::new(clip_rect); - let scrollinfo = ClipAndScrollInfo::simple(parent); self.push_item_with_clip_scroll_info(item, &info, scrollinfo); self.push_iter(complex_clips); id @@ -1443,7 +1461,6 @@ impl DisplayListBuilder { vertical_offset_bounds: StickyOffsetBounds, horizontal_offset_bounds: StickyOffsetBounds, previously_applied_offset: LayoutVector2D, - ) -> ClipId { let id = self.generate_spatial_index(); let item = SpecificDisplayItem::StickyFrame(StickyFrameDisplayItem { From 1a7439217ae00bb4fad24fc37c3c204c9a78f1a8 Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Thu, 15 Nov 2018 21:32:04 -0500 Subject: [PATCH 2/2] Annote a few reftests with expected surface counts for SC clipping --- wrench/reftests/clip/reftest.list | 2 +- wrench/reftests/mask/reftest.list | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/wrench/reftests/clip/reftest.list b/wrench/reftests/clip/reftest.list index f19544e83a..a37afd2a7e 100644 --- a/wrench/reftests/clip/reftest.list +++ b/wrench/reftests/clip/reftest.list @@ -9,5 +9,5 @@ fuzzy(1,3) == clip-corner-overlap.yaml clip-corner-overlap-ref.yaml == fixed-position-clipping.yaml fixed-position-clipping-ref.yaml == segmentation-with-other-coordinate-system-clip.yaml segmentation-with-other-coordinate-system-clip-ref.yaml == segmentation-across-rotation.yaml segmentation-across-rotation-ref.yaml -== stacking-context-clip.yaml stacking-context-clip-ref.yaml +== color_targets(3) alpha_targets(1) stacking-context-clip.yaml stacking-context-clip-ref.yaml == snapping.yaml snapping-ref.yaml diff --git a/wrench/reftests/mask/reftest.list b/wrench/reftests/mask/reftest.list index e112bde060..f23283f360 100644 --- a/wrench/reftests/mask/reftest.list +++ b/wrench/reftests/mask/reftest.list @@ -7,7 +7,7 @@ == mask-transformed-to-empty-rect.yaml mask-transformed-to-empty-rect-ref.yaml platform(linux,mac) == rounded-corners.yaml rounded-corners.png != mask.yaml out-of-bounds.yaml -platform(linux,mac) fuzzy(1,8750) == mask-atomicity.yaml mask-atomicity-ref.yaml +platform(linux,mac) fuzzy(1,8750) color_targets(2) alpha_targets(1) == mask-atomicity.yaml mask-atomicity-ref.yaml platform(linux,mac) fuzzy(1,8750) == mask-atomicity-tiling.yaml mask-atomicity-ref.yaml platform(linux,mac) == mask-perspective.yaml mask-perspective.png == mask-perspective-tiling.yaml mask-perspective.yaml