From c09052595bf7ee129f905bf1b64b4ac7674d86ba Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Wed, 14 Nov 2018 15:38:52 -0500 Subject: [PATCH] Remove explicit clip ID from stacking context --- examples/alpha_perf.rs | 1 - examples/animation.rs | 1 - examples/basic.rs | 1 - examples/blob.rs | 1 - examples/document.rs | 1 - examples/frame_output.rs | 2 -- examples/iframe.rs | 3 --- examples/image_resize.rs | 1 - examples/multiwindow.rs | 1 - examples/scrolling.rs | 2 -- examples/texture_cache_stress.rs | 1 - examples/yuv.rs | 1 - webrender/src/display_list_flattener.rs | 35 +++++++++++++------------ webrender_api/src/display_item.rs | 1 - webrender_api/src/display_list.rs | 29 ++++++++++++++++++-- wrench/src/yaml_frame_reader.rs | 19 ++++++++------ wrench/src/yaml_frame_writer.rs | 6 ----- 17 files changed, 56 insertions(+), 50 deletions(-) diff --git a/examples/alpha_perf.rs b/examples/alpha_perf.rs index 1152fdb0bd..9a91d783f3 100644 --- a/examples/alpha_perf.rs +++ b/examples/alpha_perf.rs @@ -34,7 +34,6 @@ impl Example for App { builder.push_stacking_context( &info, - None, TransformStyle::Flat, MixBlendMode::Normal, &[], diff --git a/examples/animation.rs b/examples/animation.rs index f56d312f73..70d0c48b47 100644 --- a/examples/animation.rs +++ b/examples/animation.rs @@ -59,7 +59,6 @@ impl Example for App { let info = LayoutPrimitiveInfo::new(bounds); builder.push_stacking_context( &info, - None, TransformStyle::Flat, MixBlendMode::Normal, &filters, diff --git a/examples/basic.rs b/examples/basic.rs index 7707c49f27..23802d22f4 100644 --- a/examples/basic.rs +++ b/examples/basic.rs @@ -193,7 +193,6 @@ impl Example for App { let info = LayoutPrimitiveInfo::new(bounds); builder.push_stacking_context( &info, - None, TransformStyle::Flat, MixBlendMode::Normal, &[], diff --git a/examples/blob.rs b/examples/blob.rs index 912c8667e4..43e8833697 100644 --- a/examples/blob.rs +++ b/examples/blob.rs @@ -218,7 +218,6 @@ impl Example for App { let info = api::LayoutPrimitiveInfo::new(bounds); builder.push_stacking_context( &info, - None, api::TransformStyle::Flat, api::MixBlendMode::Normal, &[], diff --git a/examples/document.rs b/examples/document.rs index c964e1a815..3a1639f607 100644 --- a/examples/document.rs +++ b/examples/document.rs @@ -113,7 +113,6 @@ impl Example for App { builder.push_stacking_context( &LayoutPrimitiveInfo::new(doc.content_rect), - None, TransformStyle::Flat, MixBlendMode::Normal, &[], diff --git a/examples/frame_output.rs b/examples/frame_output.rs index 8a1ab644ef..ca4352263a 100644 --- a/examples/frame_output.rs +++ b/examples/frame_output.rs @@ -114,7 +114,6 @@ impl App { builder.push_stacking_context( &info, - None, TransformStyle::Flat, MixBlendMode::Normal, &[], @@ -157,7 +156,6 @@ impl Example for App { let info = LayoutPrimitiveInfo::new((100, 100).to(200, 200)); builder.push_stacking_context( &info, - None, TransformStyle::Flat, MixBlendMode::Normal, &[], diff --git a/examples/iframe.rs b/examples/iframe.rs index e94acb2813..1ce075847f 100644 --- a/examples/iframe.rs +++ b/examples/iframe.rs @@ -39,7 +39,6 @@ impl Example for App { let info = LayoutPrimitiveInfo::new(sub_bounds); sub_builder.push_stacking_context( &info, - None, TransformStyle::Flat, MixBlendMode::Normal, &[], @@ -68,11 +67,9 @@ impl Example for App { ); builder.push_clip_id(reference_frame_id); - // And this is for the root pipeline builder.push_stacking_context( &info, - None, TransformStyle::Flat, MixBlendMode::Normal, &[], diff --git a/examples/image_resize.rs b/examples/image_resize.rs index bc9331571b..f00a96f114 100644 --- a/examples/image_resize.rs +++ b/examples/image_resize.rs @@ -41,7 +41,6 @@ impl Example for App { let info = LayoutPrimitiveInfo::new(bounds); builder.push_stacking_context( &info, - None, TransformStyle::Flat, MixBlendMode::Normal, &[], diff --git a/examples/multiwindow.rs b/examples/multiwindow.rs index 4b75f8b4db..8d1f98c9d6 100644 --- a/examples/multiwindow.rs +++ b/examples/multiwindow.rs @@ -190,7 +190,6 @@ impl Window { let info = LayoutPrimitiveInfo::new(bounds); builder.push_stacking_context( &info, - None, TransformStyle::Flat, MixBlendMode::Normal, &[], diff --git a/examples/scrolling.rs b/examples/scrolling.rs index 74bf4d3692..7abe1f34fa 100644 --- a/examples/scrolling.rs +++ b/examples/scrolling.rs @@ -35,7 +35,6 @@ impl Example for App { ); builder.push_stacking_context( &info, - None, TransformStyle::Flat, MixBlendMode::Normal, &[], @@ -48,7 +47,6 @@ impl Example for App { let scrollbox = (0, 0).to(300, 400); builder.push_stacking_context( &LayoutPrimitiveInfo::new((10, 10).by(0, 0)), - None, TransformStyle::Flat, MixBlendMode::Normal, &[], diff --git a/examples/texture_cache_stress.rs b/examples/texture_cache_stress.rs index 4ca8899eb2..94a4c01331 100644 --- a/examples/texture_cache_stress.rs +++ b/examples/texture_cache_stress.rs @@ -98,7 +98,6 @@ impl Example for App { let info = LayoutPrimitiveInfo::new(bounds); builder.push_stacking_context( &info, - None, TransformStyle::Flat, MixBlendMode::Normal, &[], diff --git a/examples/yuv.rs b/examples/yuv.rs index dbd1f209d7..5779558ed1 100644 --- a/examples/yuv.rs +++ b/examples/yuv.rs @@ -95,7 +95,6 @@ impl Example for App { let info = LayoutPrimitiveInfo::new(bounds); builder.push_stacking_context( &info, - None, TransformStyle::Flat, MixBlendMode::Normal, &[], diff --git a/webrender/src/display_list_flattener.rs b/webrender/src/display_list_flattener.rs index 2a68acbdc8..c8ff6f6c4f 100644 --- a/webrender/src/display_list_flattener.rs +++ b/webrender/src/display_list_flattener.rs @@ -262,8 +262,7 @@ impl<'a> DisplayListFlattener<'a> { TransformStyle::Flat, true, true, - root_scroll_node, - None, + &ClipAndScrollInfo::simple(root_scroll_node), RasterSpace::Screen, ); @@ -396,12 +395,16 @@ 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, ) { + if clip_and_scroll_ids.clip_node_id.is_some() { + // warning: this clip node is ignored + } + self.push_reference_frame( reference_frame.id, - Some(scroll_node_id), + Some(clip_and_scroll_ids.scroll_node_id), pipeline_id, reference_frame.transform, reference_frame.perspective, @@ -417,7 +420,7 @@ impl<'a> DisplayListFlattener<'a> { pipeline_id: PipelineId, item: &DisplayItemRef, stacking_context: &StackingContext, - scroll_node_id: ClipId, + clip_and_scroll_ids: &ClipAndScrollInfo, reference_frame_relative_offset: LayoutVector2D, is_backface_visible: bool, ) { @@ -442,8 +445,7 @@ impl<'a> DisplayListFlattener<'a> { stacking_context.transform_style, is_backface_visible, false, - scroll_node_id, - stacking_context.clip_node_id, + clip_and_scroll_ids, stacking_context.raster_space, ); @@ -641,7 +643,7 @@ impl<'a> DisplayListFlattener<'a> { pipeline_id, &item, &info.stacking_context, - clip_and_scroll_ids.scroll_node_id, + &clip_and_scroll_ids, reference_frame_relative_offset, prim_info.is_backface_visible, ); @@ -654,7 +656,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); @@ -959,12 +961,11 @@ impl<'a> DisplayListFlattener<'a> { transform_style: TransformStyle, is_backface_visible: bool, is_pipeline_root: bool, - spatial_node: ClipId, - clipping_node: Option, + clip_and_scroll_ids: &ClipAndScrollInfo, requested_raster_space: RasterSpace, ) { - let spatial_node_index = self.id_to_index_mapper.get_spatial_node_index(spatial_node); - let clip_chain_id = match clipping_node { + let spatial_node_index = self.id_to_index_mapper.get_spatial_node_index(clip_and_scroll_ids.scroll_node_id); + let clip_chain_id = match clip_and_scroll_ids.clip_node_id { Some(ref clipping_node) => self.id_to_index_mapper.get_clip_chain_id(clipping_node), None => ClipChainId::NONE, }; @@ -1032,7 +1033,7 @@ impl<'a> DisplayListFlattener<'a> { // has a clip node. In the future, we may decide during // prepare step to skip the intermediate surface if the // clip node doesn't affect the stacking context rect. - let should_isolate = clipping_node.is_some(); + let should_isolate = clip_chain_id != ClipChainId::NONE; let prim_key = PrimitiveKey::new( is_backface_visible, @@ -1281,13 +1282,13 @@ impl<'a> DisplayListFlattener<'a> { pub fn push_reference_frame( &mut self, reference_frame_id: ClipId, - parent_id: Option, + parent_node_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_node_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 +1298,7 @@ impl<'a> DisplayListFlattener<'a> { ); self.id_to_index_mapper.map_spatial_node(reference_frame_id, index); - match parent_id { + match parent_node_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), diff --git a/webrender_api/src/display_item.rs b/webrender_api/src/display_item.rs index 7f54259fad..fb4a8982d2 100644 --- a/webrender_api/src/display_item.rs +++ b/webrender_api/src/display_item.rs @@ -557,7 +557,6 @@ pub struct PushStackingContextDisplayItem { pub struct StackingContext { pub transform_style: TransformStyle, pub mix_blend_mode: MixBlendMode, - pub clip_node_id: Option, pub raster_space: RasterSpace, } // IMPLICIT: filters: Vec diff --git a/webrender_api/src/display_list.rs b/webrender_api/src/display_list.rs index f6d452cb96..e1818f2a22 100644 --- a/webrender_api/src/display_list.rs +++ b/webrender_api/src/display_list.rs @@ -1273,7 +1273,6 @@ impl DisplayListBuilder { pub fn push_stacking_context( &mut self, info: &LayoutPrimitiveInfo, - clip_node_id: Option, transform_style: TransformStyle, mix_blend_mode: MixBlendMode, filters: &[FilterOp], @@ -1283,16 +1282,24 @@ impl DisplayListBuilder { stacking_context: StackingContext { transform_style, mix_blend_mode, - clip_node_id, raster_space, }, }); self.push_item(item, info); self.push_iter(filters); + + // now that we took the clip_id from the stack and are applying it + // to the whole stacking context, reset the stack + let scroll_id = self.clip_stack + .last() + .map(|sc_info| sc_info.scroll_node_id) + .unwrap(); + self.clip_stack.push(ClipAndScrollInfo::simple(scroll_id)); } pub fn pop_stacking_context(&mut self) { + self.pop_clip_id(); self.push_new_empty_item(SpecificDisplayItem::PopStackingContext); } @@ -1463,6 +1470,24 @@ impl DisplayListBuilder { self.clip_stack.push(ClipAndScrollInfo::simple(id)); } + pub fn push_clip_id_override(&mut self, id: ClipId) { + let scroll_node_id = self.clip_stack + .last() + .map(|sc_info| sc_info.scroll_node_id) + .unwrap_or(ClipId::root_scroll_node(id.pipeline_id())); + self.clip_stack.push(ClipAndScrollInfo::new(scroll_node_id, id)); + } + + pub fn push_scroll_id_override(&mut self, id: ClipId) { + let clip_node_id = self.clip_stack + .last() + .and_then(|sc_info| sc_info.clip_node_id); + self.clip_stack.push(ClipAndScrollInfo { + scroll_node_id: id, + clip_node_id, + }); + } + pub fn push_clip_and_scroll_info(&mut self, info: ClipAndScrollInfo) { self.clip_stack.push(info); } diff --git a/wrench/src/yaml_frame_reader.rs b/wrench/src/yaml_frame_reader.rs index a4c0166ef6..03d08e34f3 100644 --- a/wrench/src/yaml_frame_reader.rs +++ b/wrench/src/yaml_frame_reader.rs @@ -1616,16 +1616,23 @@ impl YamlFrameReader { info.clip_rect = bounds; let reference_frame_id = if !yaml["transform"].is_badvalue() || - !yaml["perspective"].is_badvalue() { + !yaml["perspective"].is_badvalue() + { let reference_frame_id = self.push_reference_frame(dl, wrench, yaml, info); info.rect.origin = LayoutPoint::zero(); info.clip_rect.origin = LayoutPoint::zero(); + dl.push_scroll_id_override(reference_frame_id); Some(reference_frame_id) } else { None }; + // note: this API is deprecated, use the standard clip-and-scroll field instead let clip_node_id = self.to_clip_id(&yaml["clip-node"], dl.pipeline_id); + if let Some(clip_id) = clip_node_id { + dl.push_clip_id_override(clip_id); + } + let transform_style = yaml["transform-style"] .as_transform_style() .unwrap_or(TransformStyle::Flat); @@ -1645,13 +1652,8 @@ impl YamlFrameReader { let filters = yaml["filters"].as_vec_filter_op().unwrap_or(vec![]); - if let Some(reference_frame_id) = reference_frame_id { - dl.push_clip_id(reference_frame_id); - } - dl.push_stacking_context( &info, - clip_node_id, transform_style, mix_blend_mode, &filters, @@ -1666,10 +1668,11 @@ impl YamlFrameReader { if reference_frame_id.is_some() { dl.pop_clip_id(); + dl.pop_reference_frame(); } - if reference_frame_id.is_some() { - dl.pop_reference_frame(); + if clip_node_id.is_some() { + dl.pop_clip_id(); } } } diff --git a/wrench/src/yaml_frame_writer.rs b/wrench/src/yaml_frame_writer.rs index 63de378df3..c42f8577be 100644 --- a/wrench/src/yaml_frame_writer.rs +++ b/wrench/src/yaml_frame_writer.rs @@ -202,7 +202,6 @@ fn write_stacking_context( sc: &StackingContext, properties: &SceneProperties, filter_iter: AuxIter, - clip_id_mapper: &ClipIdMapper, ) { enum_node(parent, "transform-style", sc.transform_style); @@ -216,10 +215,6 @@ fn write_stacking_context( }; str_node(parent, "raster-space", &raster_space); - if let Some(clip_node_id) = sc.clip_node_id { - yaml_node(parent, "clip-node", clip_id_mapper.map_id(&clip_node_id)); - } - // mix_blend_mode if sc.mix_blend_mode != MixBlendMode::Normal { enum_node(parent, "mix-blend-mode", sc.mix_blend_mode) @@ -1014,7 +1009,6 @@ impl YamlFrameWriter { &item.stacking_context, &scene.properties, filters, - clip_id_mapper, ); let mut sub_iter = base.sub_iter();