Produce WR display lists without nested stacking contexts

WebRender now supports display lists that do not use nested stacking
contexts for overflow scroll regions. We can remove a bit of code in
Servo now.
This commit is contained in:
Martin Robinson 2016-10-21 08:03:58 +02:00
parent bfd966f819
commit 8a12c15582
2 changed files with 13 additions and 62 deletions

View file

@ -9,7 +9,7 @@
use app_units::Au; use app_units::Au;
use azure::azure_hl::Color; use azure::azure_hl::Color;
use euclid::{Matrix4D, Point2D, Rect, Size2D}; use euclid::{Point2D, Rect, Size2D};
use gfx::display_list::{BorderRadii, BoxShadowClipMode, ClippingRegion}; use gfx::display_list::{BorderRadii, BoxShadowClipMode, ClippingRegion};
use gfx::display_list::{DisplayItem, DisplayList, DisplayListTraversal}; use gfx::display_list::{DisplayItem, DisplayList, DisplayListTraversal};
use gfx::display_list::{GradientStop, StackingContext, StackingContextType}; use gfx::display_list::{GradientStop, StackingContext, StackingContextType};
@ -25,7 +25,6 @@ trait WebRenderStackingContextConverter {
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>,
frame_builder: &mut WebRenderFrameBuilder) frame_builder: &mut WebRenderFrameBuilder)
-> webrender_traits::StackingContextId; -> webrender_traits::StackingContextId;
@ -34,7 +33,6 @@ trait WebRenderStackingContextConverter {
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>,
builder: &mut webrender_traits::DisplayListBuilder, builder: &mut webrender_traits::DisplayListBuilder,
frame_builder: &mut WebRenderFrameBuilder, frame_builder: &mut WebRenderFrameBuilder,
force_positioned_stacking_level: bool); force_positioned_stacking_level: bool);
@ -45,7 +43,6 @@ pub trait WebRenderDisplayListConverter {
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>,
frame_builder: &mut WebRenderFrameBuilder) frame_builder: &mut WebRenderFrameBuilder)
-> webrender_traits::StackingContextId; -> webrender_traits::StackingContextId;
} }
@ -253,7 +250,6 @@ 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>,
builder: &mut webrender_traits::DisplayListBuilder, builder: &mut webrender_traits::DisplayListBuilder,
frame_builder: &mut WebRenderFrameBuilder, frame_builder: &mut WebRenderFrameBuilder,
_force_positioned_stacking_level: bool) { _force_positioned_stacking_level: bool) {
@ -263,18 +259,11 @@ impl WebRenderStackingContextConverter for StackingContext {
let stacking_context = &stacking_context_item.stacking_context; let stacking_context = &stacking_context_item.stacking_context;
debug_assert!(stacking_context.context_type == StackingContextType::Real); debug_assert!(stacking_context.context_type == StackingContextType::Real);
let scroll_layer_id_for_children = if self.overflow_scroll_id.is_some() {
scroll_layer_id
} else {
None
};
let stacking_context_id = let stacking_context_id =
stacking_context.convert_to_webrender(traversal, stacking_context.convert_to_webrender(traversal,
api, api,
pipeline_id, pipeline_id,
epoch, epoch,
scroll_layer_id_for_children,
frame_builder); frame_builder);
builder.push_stacking_context(stacking_context_id); builder.push_stacking_context(stacking_context_id);
@ -290,7 +279,6 @@ 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>,
frame_builder: &mut WebRenderFrameBuilder) frame_builder: &mut WebRenderFrameBuilder)
-> webrender_traits::StackingContextId { -> webrender_traits::StackingContextId {
let webrender_scroll_policy = match self.scroll_policy { let webrender_scroll_policy = match self.scroll_policy {
@ -300,10 +288,11 @@ impl WebRenderStackingContextConverter for StackingContext {
let webrender_stacking_context_id = self.id.convert_to_webrender(); let webrender_stacking_context_id = self.id.convert_to_webrender();
let outer_overflow = if self.overflow_scroll_id.is_none() { let scroll_layer_id = if self.overflow_scroll_id.is_some() ||
self.overflow.to_rectf() self.id == StackingContextId::root() {
Some(frame_builder.next_scroll_layer_id())
} else { } else {
Rect::new(Point2D::zero(), self.bounds.size).to_rectf() None
}; };
let mut sc = let mut sc =
@ -311,7 +300,7 @@ impl WebRenderStackingContextConverter for StackingContext {
scroll_layer_id, scroll_layer_id,
webrender_scroll_policy, webrender_scroll_policy,
self.bounds.to_rectf(), self.bounds.to_rectf(),
outer_overflow, self.overflow.to_rectf(),
self.z_index, self.z_index,
&self.transform, &self.transform,
&self.perspective, &self.perspective,
@ -321,47 +310,13 @@ impl WebRenderStackingContextConverter for StackingContext {
&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 let Some(inner_stacking_context_id) = self.overflow_scroll_id {
let inner_webrender_stacking_context_id =
inner_stacking_context_id.convert_to_webrender();
let mut inner_sc =
webrender_traits::StackingContext::new(inner_webrender_stacking_context_id,
Some(frame_builder.next_scroll_layer_id()),
webrender_scroll_policy,
self.overflow.to_rectf(),
self.overflow.to_rectf(),
self.z_index,
&Matrix4D::identity(),
&Matrix4D::identity(),
false,
webrender_traits::MixBlendMode::Normal,
Vec::new(),
&mut frame_builder.auxiliary_lists_builder);
let mut inner_builder = webrender_traits::DisplayListBuilder::new();
self.convert_children_to_webrender(traversal, self.convert_children_to_webrender(traversal,
api, api,
pipeline_id, pipeline_id,
epoch, epoch,
None,
&mut inner_builder,
frame_builder,
false);
frame_builder.add_display_list(api, inner_builder.finalize(), &mut inner_sc);
let new_id = frame_builder.add_stacking_context(api, pipeline_id, inner_sc);
builder.push_stacking_context(new_id);
} else {
self.convert_children_to_webrender(traversal,
api,
pipeline_id,
epoch,
scroll_layer_id,
&mut builder, &mut builder,
frame_builder, frame_builder,
false); false);
}
frame_builder.add_display_list(api, builder.finalize(), &mut sc); frame_builder.add_display_list(api, builder.finalize(), &mut sc);
frame_builder.add_stacking_context(api, pipeline_id, sc) frame_builder.add_stacking_context(api, pipeline_id, sc)
@ -373,7 +328,6 @@ impl WebRenderDisplayListConverter for DisplayList {
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>,
frame_builder: &mut WebRenderFrameBuilder) frame_builder: &mut WebRenderFrameBuilder)
-> webrender_traits::StackingContextId { -> webrender_traits::StackingContextId {
let mut traversal = DisplayListTraversal::new(self); let mut traversal = DisplayListTraversal::new(self);
@ -385,7 +339,6 @@ impl WebRenderDisplayListConverter for DisplayList {
api, api,
pipeline_id, pipeline_id,
epoch, epoch,
scroll_layer_id,
frame_builder) frame_builder)
} }
_ => unreachable!("DisplayList did not start with StackingContext."), _ => unreachable!("DisplayList did not start with StackingContext."),

View file

@ -981,12 +981,10 @@ impl LayoutThread {
// TODO(gw) For now only create a root scrolling layer! // TODO(gw) For now only create a root scrolling layer!
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, &mut self.webrender_api,
pipeline_id, pipeline_id,
epoch, epoch,
Some(root_scroll_layer_id),
&mut frame_builder); &mut frame_builder);
let root_background_color = get_root_flow_background_color(layout_root); let root_background_color = get_root_flow_background_color(layout_root);
let root_background_color = let root_background_color =