From 63279c316ba1b3eaa05f6eb54f5a63a42a9aa290 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Tue, 19 Apr 2016 11:30:38 -0700 Subject: [PATCH] layout: Implement support for `overflow: scroll` in WebRender. Includes a WebRender upgrade. Improves Twitter. --- components/layout/display_list_builder.rs | 8 +++++-- components/layout/layout_thread.rs | 2 +- components/layout/webrender_helpers.rs | 26 ++++++++++++++++++++--- components/servo/Cargo.lock | 4 ++-- ports/cef/Cargo.lock | 4 ++-- ports/gonk/Cargo.lock | 4 ++-- 6 files changed, 36 insertions(+), 12 deletions(-) diff --git a/components/layout/display_list_builder.rs b/components/layout/display_list_builder.rs index db9373e84f2..1a02e7d8a5d 100644 --- a/components/layout/display_list_builder.rs +++ b/components/layout/display_list_builder.rs @@ -1294,8 +1294,9 @@ impl FragmentDisplayListBuilding for Fragment { scroll_policy: ScrollPolicy, mode: StackingContextCreationMode) -> Box { + let use_webrender = opts::get().use_webrender; let border_box = match mode { - StackingContextCreationMode::InnerScrollWrapper => { + StackingContextCreationMode::InnerScrollWrapper if !use_webrender => { Rect::new(Point2D::zero(), base_flow.overflow.scroll.size) } _ => { @@ -1308,9 +1309,12 @@ impl FragmentDisplayListBuilding for Fragment { } }; let overflow = match mode { - StackingContextCreationMode::InnerScrollWrapper => { + StackingContextCreationMode::InnerScrollWrapper if !use_webrender => { Rect::new(Point2D::zero(), base_flow.overflow.paint.size) } + StackingContextCreationMode::InnerScrollWrapper if use_webrender => { + Rect::new(Point2D::zero(), base_flow.overflow.scroll.size) + } StackingContextCreationMode::OuterScrollWrapper => { Rect::new(Point2D::zero(), border_box.size) } diff --git a/components/layout/layout_thread.rs b/components/layout/layout_thread.rs index 743e0edc526..8763d610c36 100644 --- a/components/layout/layout_thread.rs +++ b/components/layout/layout_thread.rs @@ -949,8 +949,8 @@ impl LayoutThread { let pipeline_id = self.id.to_webrender(); // TODO(gw) For now only create a root scrolling layer! - let root_scroll_layer_id = webrender_traits::ScrollLayerId::new(pipeline_id, 0); let mut frame_builder = WebRenderFrameBuilder::new(pipeline_id); + let root_scroll_layer_id = frame_builder.next_scroll_layer_id(); let sc_id = rw_data.display_list.as_ref().unwrap().convert_to_webrender( &mut self.webrender_api.as_mut().unwrap(), pipeline_id, diff --git a/components/layout/webrender_helpers.rs b/components/layout/webrender_helpers.rs index f52685501e9..2facfe5a0d6 100644 --- a/components/layout/webrender_helpers.rs +++ b/components/layout/webrender_helpers.rs @@ -268,11 +268,16 @@ impl WebRenderStackingContextConverter for StackingContext { } if child.context_type == StackingContextType::Real { + let scroll_layer_id_for_children = if self.scrolls_overflow_area { + scroll_layer_id + } else { + None + }; let stacking_context_id = child.convert_to_webrender(traversal, api, pipeline_id, epoch, - None, + scroll_layer_id_for_children, scroll_policy, frame_builder); builder.push_stacking_context(stacking_context_id); @@ -299,7 +304,7 @@ impl WebRenderStackingContextConverter for StackingContext { api: &mut webrender_traits::RenderApi, pipeline_id: webrender_traits::PipelineId, epoch: webrender_traits::Epoch, - scroll_layer_id: Option, + mut scroll_layer_id: Option, mut scroll_policy: ScrollPolicy, frame_builder: &mut WebRenderFrameBuilder) -> webrender_traits::StackingContextId { @@ -324,7 +329,13 @@ impl WebRenderStackingContextConverter for StackingContext { self.blend_mode.to_blend_mode(), self.filters.to_filter_ops(), &mut frame_builder.auxiliary_lists_builder); + let mut builder = webrender_traits::DisplayListBuilder::new(); + + if self.scrolls_overflow_area { + scroll_layer_id = Some(frame_builder.next_scroll_layer_id()); + } + self.convert_children_to_webrender(traversal, api, pipeline_id, @@ -502,7 +513,8 @@ pub struct WebRenderFrameBuilder { pub stacking_contexts: Vec<(StackingContextId, webrender_traits::StackingContext)>, pub display_lists: Vec<(DisplayListId, webrender_traits::BuiltDisplayList)>, pub auxiliary_lists_builder: AuxiliaryListsBuilder, - pub root_pipeline_id: PipelineId + pub root_pipeline_id: PipelineId, + pub next_scroll_layer_id: usize, } impl WebRenderFrameBuilder { @@ -512,6 +524,7 @@ impl WebRenderFrameBuilder { display_lists: vec![], auxiliary_lists_builder: AuxiliaryListsBuilder::new(), root_pipeline_id: root_pipeline_id, + next_scroll_layer_id: 0, } } @@ -538,5 +551,12 @@ impl WebRenderFrameBuilder { self.display_lists.push((id, display_list)); id } + + pub fn next_scroll_layer_id(&mut self) -> webrender_traits::ScrollLayerId { + let scroll_layer_id = self.next_scroll_layer_id; + self.next_scroll_layer_id += 1; + webrender_traits::ScrollLayerId::new(self.root_pipeline_id, scroll_layer_id) + } + } diff --git a/components/servo/Cargo.lock b/components/servo/Cargo.lock index 54958de7a55..fabc126fcfe 100644 --- a/components/servo/Cargo.lock +++ b/components/servo/Cargo.lock @@ -2320,7 +2320,7 @@ dependencies = [ [[package]] name = "webrender" version = "0.1.0" -source = "git+https://github.com/servo/webrender#46dd3f0ffe2e3a650171fd651b522ed072ccf799" +source = "git+https://github.com/servo/webrender#8d778dac5398cadd093136bc9cf0afbbb61a2b52" dependencies = [ "app_units 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2343,7 +2343,7 @@ dependencies = [ [[package]] name = "webrender_traits" version = "0.1.0" -source = "git+https://github.com/servo/webrender_traits#69125172bcea93fd79be48d846eae63d50ddc8ea" +source = "git+https://github.com/servo/webrender_traits#d1a3bb53f87891bbba8576d05260caee147dc5d8" dependencies = [ "app_units 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/ports/cef/Cargo.lock b/ports/cef/Cargo.lock index 8b389d75a05..3816313b2cb 100644 --- a/ports/cef/Cargo.lock +++ b/ports/cef/Cargo.lock @@ -2195,7 +2195,7 @@ dependencies = [ [[package]] name = "webrender" version = "0.1.0" -source = "git+https://github.com/servo/webrender#46dd3f0ffe2e3a650171fd651b522ed072ccf799" +source = "git+https://github.com/servo/webrender#8d778dac5398cadd093136bc9cf0afbbb61a2b52" dependencies = [ "app_units 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2218,7 +2218,7 @@ dependencies = [ [[package]] name = "webrender_traits" version = "0.1.0" -source = "git+https://github.com/servo/webrender_traits#69125172bcea93fd79be48d846eae63d50ddc8ea" +source = "git+https://github.com/servo/webrender_traits#d1a3bb53f87891bbba8576d05260caee147dc5d8" dependencies = [ "app_units 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/ports/gonk/Cargo.lock b/ports/gonk/Cargo.lock index 614fa5f1c4b..b465fadcdaf 100644 --- a/ports/gonk/Cargo.lock +++ b/ports/gonk/Cargo.lock @@ -2145,7 +2145,7 @@ dependencies = [ [[package]] name = "webrender" version = "0.1.0" -source = "git+https://github.com/servo/webrender#46dd3f0ffe2e3a650171fd651b522ed072ccf799" +source = "git+https://github.com/servo/webrender#8d778dac5398cadd093136bc9cf0afbbb61a2b52" dependencies = [ "app_units 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2168,7 +2168,7 @@ dependencies = [ [[package]] name = "webrender_traits" version = "0.1.0" -source = "git+https://github.com/servo/webrender_traits#69125172bcea93fd79be48d846eae63d50ddc8ea" +source = "git+https://github.com/servo/webrender_traits#d1a3bb53f87891bbba8576d05260caee147dc5d8" dependencies = [ "app_units 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",