Auto merge of #10717 - pcwalton:wr-overflow-scroll, r=glennw

layout: Implement support for `overflow: scroll` in WebRender.

Requires a WebRender upgrade.

r? @glennw

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="35" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/10717)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2016-04-20 02:55:44 +05:30
commit 64b0dafde8
6 changed files with 36 additions and 12 deletions

View file

@ -1294,8 +1294,9 @@ impl FragmentDisplayListBuilding for Fragment {
scroll_policy: ScrollPolicy, scroll_policy: ScrollPolicy,
mode: StackingContextCreationMode) mode: StackingContextCreationMode)
-> Box<StackingContext> { -> Box<StackingContext> {
let use_webrender = opts::get().use_webrender;
let border_box = match mode { let border_box = match mode {
StackingContextCreationMode::InnerScrollWrapper => { StackingContextCreationMode::InnerScrollWrapper if !use_webrender => {
Rect::new(Point2D::zero(), base_flow.overflow.scroll.size) Rect::new(Point2D::zero(), base_flow.overflow.scroll.size)
} }
_ => { _ => {
@ -1308,9 +1309,12 @@ impl FragmentDisplayListBuilding for Fragment {
} }
}; };
let overflow = match mode { let overflow = match mode {
StackingContextCreationMode::InnerScrollWrapper => { StackingContextCreationMode::InnerScrollWrapper if !use_webrender => {
Rect::new(Point2D::zero(), base_flow.overflow.paint.size) 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 => { StackingContextCreationMode::OuterScrollWrapper => {
Rect::new(Point2D::zero(), border_box.size) Rect::new(Point2D::zero(), border_box.size)
} }

View file

@ -949,8 +949,8 @@ impl LayoutThread {
let pipeline_id = self.id.to_webrender(); let pipeline_id = self.id.to_webrender();
// TODO(gw) For now only create a root scrolling layer! // 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 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( let sc_id = rw_data.display_list.as_ref().unwrap().convert_to_webrender(
&mut self.webrender_api.as_mut().unwrap(), &mut self.webrender_api.as_mut().unwrap(),
pipeline_id, pipeline_id,

View file

@ -268,11 +268,16 @@ impl WebRenderStackingContextConverter for StackingContext {
} }
if child.context_type == StackingContextType::Real { 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, let stacking_context_id = child.convert_to_webrender(traversal,
api, api,
pipeline_id, pipeline_id,
epoch, epoch,
None, scroll_layer_id_for_children,
scroll_policy, scroll_policy,
frame_builder); frame_builder);
builder.push_stacking_context(stacking_context_id); builder.push_stacking_context(stacking_context_id);
@ -299,7 +304,7 @@ impl WebRenderStackingContextConverter for StackingContext {
api: &mut webrender_traits::RenderApi, api: &mut webrender_traits::RenderApi,
pipeline_id: webrender_traits::PipelineId, pipeline_id: webrender_traits::PipelineId,
epoch: webrender_traits::Epoch, epoch: webrender_traits::Epoch,
scroll_layer_id: Option<webrender_traits::ScrollLayerId>, mut scroll_layer_id: Option<webrender_traits::ScrollLayerId>,
mut scroll_policy: ScrollPolicy, mut scroll_policy: ScrollPolicy,
frame_builder: &mut WebRenderFrameBuilder) frame_builder: &mut WebRenderFrameBuilder)
-> webrender_traits::StackingContextId { -> webrender_traits::StackingContextId {
@ -324,7 +329,13 @@ impl WebRenderStackingContextConverter for StackingContext {
self.blend_mode.to_blend_mode(), self.blend_mode.to_blend_mode(),
self.filters.to_filter_ops(), self.filters.to_filter_ops(),
&mut frame_builder.auxiliary_lists_builder); &mut frame_builder.auxiliary_lists_builder);
let mut builder = webrender_traits::DisplayListBuilder::new(); 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, self.convert_children_to_webrender(traversal,
api, api,
pipeline_id, pipeline_id,
@ -502,7 +513,8 @@ pub struct WebRenderFrameBuilder {
pub stacking_contexts: Vec<(StackingContextId, webrender_traits::StackingContext)>, pub stacking_contexts: Vec<(StackingContextId, webrender_traits::StackingContext)>,
pub display_lists: Vec<(DisplayListId, webrender_traits::BuiltDisplayList)>, pub display_lists: Vec<(DisplayListId, webrender_traits::BuiltDisplayList)>,
pub auxiliary_lists_builder: AuxiliaryListsBuilder, pub auxiliary_lists_builder: AuxiliaryListsBuilder,
pub root_pipeline_id: PipelineId pub root_pipeline_id: PipelineId,
pub next_scroll_layer_id: usize,
} }
impl WebRenderFrameBuilder { impl WebRenderFrameBuilder {
@ -512,6 +524,7 @@ impl WebRenderFrameBuilder {
display_lists: vec![], display_lists: vec![],
auxiliary_lists_builder: AuxiliaryListsBuilder::new(), auxiliary_lists_builder: AuxiliaryListsBuilder::new(),
root_pipeline_id: root_pipeline_id, root_pipeline_id: root_pipeline_id,
next_scroll_layer_id: 0,
} }
} }
@ -538,5 +551,12 @@ impl WebRenderFrameBuilder {
self.display_lists.push((id, display_list)); self.display_lists.push((id, display_list));
id 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)
}
} }

View file

@ -2320,7 +2320,7 @@ dependencies = [
[[package]] [[package]]
name = "webrender" name = "webrender"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/servo/webrender#46dd3f0ffe2e3a650171fd651b522ed072ccf799" source = "git+https://github.com/servo/webrender#8d778dac5398cadd093136bc9cf0afbbb61a2b52"
dependencies = [ dependencies = [
"app_units 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "byteorder 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2343,7 +2343,7 @@ dependencies = [
[[package]] [[package]]
name = "webrender_traits" name = "webrender_traits"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/servo/webrender_traits#69125172bcea93fd79be48d846eae63d50ddc8ea" source = "git+https://github.com/servo/webrender_traits#d1a3bb53f87891bbba8576d05260caee147dc5d8"
dependencies = [ dependencies = [
"app_units 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "byteorder 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",

4
ports/cef/Cargo.lock generated
View file

@ -2195,7 +2195,7 @@ dependencies = [
[[package]] [[package]]
name = "webrender" name = "webrender"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/servo/webrender#46dd3f0ffe2e3a650171fd651b522ed072ccf799" source = "git+https://github.com/servo/webrender#8d778dac5398cadd093136bc9cf0afbbb61a2b52"
dependencies = [ dependencies = [
"app_units 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "byteorder 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2218,7 +2218,7 @@ dependencies = [
[[package]] [[package]]
name = "webrender_traits" name = "webrender_traits"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/servo/webrender_traits#69125172bcea93fd79be48d846eae63d50ddc8ea" source = "git+https://github.com/servo/webrender_traits#d1a3bb53f87891bbba8576d05260caee147dc5d8"
dependencies = [ dependencies = [
"app_units 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "byteorder 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",

4
ports/gonk/Cargo.lock generated
View file

@ -2145,7 +2145,7 @@ dependencies = [
[[package]] [[package]]
name = "webrender" name = "webrender"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/servo/webrender#46dd3f0ffe2e3a650171fd651b522ed072ccf799" source = "git+https://github.com/servo/webrender#8d778dac5398cadd093136bc9cf0afbbb61a2b52"
dependencies = [ dependencies = [
"app_units 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "byteorder 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2168,7 +2168,7 @@ dependencies = [
[[package]] [[package]]
name = "webrender_traits" name = "webrender_traits"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/servo/webrender_traits#69125172bcea93fd79be48d846eae63d50ddc8ea" source = "git+https://github.com/servo/webrender_traits#d1a3bb53f87891bbba8576d05260caee147dc5d8"
dependencies = [ dependencies = [
"app_units 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "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)", "byteorder 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",