mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
layout: Flatten display list transfer into a separately-transferred byte
array, and consolidate the multitude of display list messages into one. Improves display list building performance by 50%-100% for small display lists.
This commit is contained in:
parent
805aa3a3ab
commit
9fcf9215d0
5 changed files with 106 additions and 59 deletions
|
@ -83,7 +83,7 @@ use util::opts;
|
||||||
use util::thread;
|
use util::thread;
|
||||||
use util::thread_state;
|
use util::thread_state;
|
||||||
use util::workqueue::WorkQueue;
|
use util::workqueue::WorkQueue;
|
||||||
use webrender_helpers::WebRenderDisplayListConverter;
|
use webrender_helpers::{WebRenderDisplayListConverter, WebRenderFrameBuilder};
|
||||||
use webrender_traits::{self, AuxiliaryListsBuilder};
|
use webrender_traits::{self, AuxiliaryListsBuilder};
|
||||||
use wrapper::{LayoutNode, NonOpaqueStyleAndLayoutData, ServoLayoutNode, ThreadSafeLayoutNode};
|
use wrapper::{LayoutNode, NonOpaqueStyleAndLayoutData, ServoLayoutNode, ThreadSafeLayoutNode};
|
||||||
|
|
||||||
|
@ -940,7 +940,6 @@ impl LayoutThread {
|
||||||
self.epoch.next();
|
self.epoch.next();
|
||||||
|
|
||||||
if opts::get().use_webrender {
|
if opts::get().use_webrender {
|
||||||
let api = self.webrender_api.as_ref().unwrap();
|
|
||||||
// TODO: Avoid the temporary conversion and build webrender sc/dl directly!
|
// TODO: Avoid the temporary conversion and build webrender sc/dl directly!
|
||||||
let Epoch(epoch_number) = self.epoch;
|
let Epoch(epoch_number) = self.epoch;
|
||||||
let epoch = webrender_traits::Epoch(epoch_number);
|
let epoch = webrender_traits::Epoch(epoch_number);
|
||||||
|
@ -948,13 +947,13 @@ impl LayoutThread {
|
||||||
|
|
||||||
// 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 root_scroll_layer_id = webrender_traits::ScrollLayerId::new(pipeline_id, 0);
|
||||||
let mut auxiliary_lists_builder = AuxiliaryListsBuilder::new();
|
let mut frame_builder = WebRenderFrameBuilder::new(pipeline_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(
|
||||||
&self.webrender_api.as_ref().unwrap(),
|
&mut self.webrender_api.as_mut().unwrap(),
|
||||||
pipeline_id,
|
pipeline_id,
|
||||||
epoch,
|
epoch,
|
||||||
Some(root_scroll_layer_id),
|
Some(root_scroll_layer_id),
|
||||||
&mut auxiliary_lists_builder);
|
&mut frame_builder);
|
||||||
let root_background_color = get_root_flow_background_color(
|
let root_background_color = get_root_flow_background_color(
|
||||||
flow_ref::deref_mut(layout_root));
|
flow_ref::deref_mut(layout_root));
|
||||||
let root_background_color =
|
let root_background_color =
|
||||||
|
@ -966,12 +965,16 @@ impl LayoutThread {
|
||||||
let viewport_size = Size2D::new(self.viewport_size.width.to_f32_px(),
|
let viewport_size = Size2D::new(self.viewport_size.width.to_f32_px(),
|
||||||
self.viewport_size.height.to_f32_px());
|
self.viewport_size.height.to_f32_px());
|
||||||
|
|
||||||
|
let api = self.webrender_api.as_ref().unwrap();
|
||||||
api.set_root_stacking_context(sc_id,
|
api.set_root_stacking_context(sc_id,
|
||||||
root_background_color,
|
root_background_color,
|
||||||
epoch,
|
epoch,
|
||||||
pipeline_id,
|
pipeline_id,
|
||||||
viewport_size,
|
viewport_size,
|
||||||
auxiliary_lists_builder.finalize());
|
frame_builder.stacking_contexts,
|
||||||
|
frame_builder.display_lists,
|
||||||
|
frame_builder.auxiliary_lists_builder
|
||||||
|
.finalize());
|
||||||
} else {
|
} else {
|
||||||
self.paint_chan
|
self.paint_chan
|
||||||
.send(LayoutToPaintMsg::PaintInit(self.epoch, display_list))
|
.send(LayoutToPaintMsg::PaintInit(self.epoch, display_list))
|
||||||
|
|
|
@ -19,26 +19,26 @@ use msg::constellation_msg::ConvertPipelineIdToWebRender;
|
||||||
use style::computed_values::filter::{self, Filter};
|
use style::computed_values::filter::{self, Filter};
|
||||||
use style::computed_values::{image_rendering, mix_blend_mode};
|
use style::computed_values::{image_rendering, mix_blend_mode};
|
||||||
use style::values::computed::BorderStyle;
|
use style::values::computed::BorderStyle;
|
||||||
use webrender_traits::{self, AuxiliaryListsBuilder};
|
use webrender_traits::{self, AuxiliaryListsBuilder, DisplayListId, PipelineId, StackingContextId};
|
||||||
|
|
||||||
trait WebRenderStackingContextConverter {
|
trait WebRenderStackingContextConverter {
|
||||||
fn convert_to_webrender<'a>(&self,
|
fn convert_to_webrender<'a>(&self,
|
||||||
traversal: &mut DisplayListTraversal<'a>,
|
traversal: &mut DisplayListTraversal<'a>,
|
||||||
api: &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>,
|
scroll_layer_id: Option<webrender_traits::ScrollLayerId>,
|
||||||
auxiliary_lists_builder: &mut AuxiliaryListsBuilder)
|
frame_builder: &mut WebRenderFrameBuilder)
|
||||||
-> webrender_traits::StackingContextId;
|
-> webrender_traits::StackingContextId;
|
||||||
|
|
||||||
fn convert_children_to_webrender<'a>(&self,
|
fn convert_children_to_webrender<'a>(&self,
|
||||||
traversal: &mut DisplayListTraversal<'a>,
|
traversal: &mut DisplayListTraversal<'a>,
|
||||||
api: &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>,
|
scroll_layer_id: Option<webrender_traits::ScrollLayerId>,
|
||||||
builder: &mut webrender_traits::DisplayListBuilder,
|
builder: &mut webrender_traits::DisplayListBuilder,
|
||||||
auxiliary_lists_builder: &mut AuxiliaryListsBuilder,
|
frame_builder: &mut WebRenderFrameBuilder,
|
||||||
force_positioned_stacking_level: bool);
|
force_positioned_stacking_level: bool);
|
||||||
|
|
||||||
fn web_render_stacking_level(&self) -> webrender_traits::StackingLevel;
|
fn web_render_stacking_level(&self) -> webrender_traits::StackingLevel;
|
||||||
|
@ -46,11 +46,11 @@ trait WebRenderStackingContextConverter {
|
||||||
|
|
||||||
pub trait WebRenderDisplayListConverter {
|
pub trait WebRenderDisplayListConverter {
|
||||||
fn convert_to_webrender(&self,
|
fn convert_to_webrender(&self,
|
||||||
api: &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>,
|
scroll_layer_id: Option<webrender_traits::ScrollLayerId>,
|
||||||
auxiliary_lists_builder: &mut AuxiliaryListsBuilder)
|
frame_builder: &mut WebRenderFrameBuilder)
|
||||||
-> webrender_traits::StackingContextId;
|
-> webrender_traits::StackingContextId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ trait WebRenderDisplayItemConverter {
|
||||||
fn convert_to_webrender(&self,
|
fn convert_to_webrender(&self,
|
||||||
level: webrender_traits::StackingLevel,
|
level: webrender_traits::StackingLevel,
|
||||||
builder: &mut webrender_traits::DisplayListBuilder,
|
builder: &mut webrender_traits::DisplayListBuilder,
|
||||||
auxiliary_lists_builder: &mut AuxiliaryListsBuilder);
|
frame_builder: &mut WebRenderFrameBuilder);
|
||||||
}
|
}
|
||||||
|
|
||||||
trait WebRenderDisplayListEntryConverter {
|
trait WebRenderDisplayListEntryConverter {
|
||||||
|
@ -171,12 +171,12 @@ impl ToGradientStop for GradientStop {
|
||||||
}
|
}
|
||||||
|
|
||||||
trait ToClipRegion {
|
trait ToClipRegion {
|
||||||
fn to_clip_region(&self, auxiliary_lists_builder: &mut AuxiliaryListsBuilder)
|
fn to_clip_region(&self, frame_builder: &mut WebRenderFrameBuilder)
|
||||||
-> webrender_traits::ClipRegion;
|
-> webrender_traits::ClipRegion;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ToClipRegion for ClippingRegion {
|
impl ToClipRegion for ClippingRegion {
|
||||||
fn to_clip_region(&self, auxiliary_lists_builder: &mut AuxiliaryListsBuilder)
|
fn to_clip_region(&self, frame_builder: &mut WebRenderFrameBuilder)
|
||||||
-> webrender_traits::ClipRegion {
|
-> webrender_traits::ClipRegion {
|
||||||
webrender_traits::ClipRegion::new(&self.main.to_rectf(),
|
webrender_traits::ClipRegion::new(&self.main.to_rectf(),
|
||||||
self.complex.iter().map(|complex_clipping_region| {
|
self.complex.iter().map(|complex_clipping_region| {
|
||||||
|
@ -185,7 +185,7 @@ impl ToClipRegion for ClippingRegion {
|
||||||
complex_clipping_region.radii.to_border_radius(),
|
complex_clipping_region.radii.to_border_radius(),
|
||||||
)
|
)
|
||||||
}).collect(),
|
}).collect(),
|
||||||
auxiliary_lists_builder)
|
&mut frame_builder.auxiliary_lists_builder)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -272,12 +272,12 @@ impl ToFilterOps for filter::T {
|
||||||
impl WebRenderStackingContextConverter for StackingContext {
|
impl WebRenderStackingContextConverter for StackingContext {
|
||||||
fn convert_children_to_webrender<'a>(&self,
|
fn convert_children_to_webrender<'a>(&self,
|
||||||
traversal: &mut DisplayListTraversal<'a>,
|
traversal: &mut DisplayListTraversal<'a>,
|
||||||
api: &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>,
|
scroll_layer_id: Option<webrender_traits::ScrollLayerId>,
|
||||||
builder: &mut webrender_traits::DisplayListBuilder,
|
builder: &mut webrender_traits::DisplayListBuilder,
|
||||||
auxiliary_lists_builder: &mut AuxiliaryListsBuilder,
|
frame_builder: &mut WebRenderFrameBuilder,
|
||||||
force_positioned_stacking_level: bool) {
|
force_positioned_stacking_level: bool) {
|
||||||
for child in self.children.iter() {
|
for child in self.children.iter() {
|
||||||
while let Some(item) = traversal.advance(self) {
|
while let Some(item) = traversal.advance(self) {
|
||||||
|
@ -286,7 +286,7 @@ impl WebRenderStackingContextConverter for StackingContext {
|
||||||
} else {
|
} else {
|
||||||
item.web_render_stacking_level()
|
item.web_render_stacking_level()
|
||||||
};
|
};
|
||||||
item.item.convert_to_webrender(stacking_level, builder, auxiliary_lists_builder);
|
item.item.convert_to_webrender(stacking_level, builder, frame_builder);
|
||||||
|
|
||||||
}
|
}
|
||||||
if child.context_type == StackingContextType::Real {
|
if child.context_type == StackingContextType::Real {
|
||||||
|
@ -295,7 +295,7 @@ impl WebRenderStackingContextConverter for StackingContext {
|
||||||
pipeline_id,
|
pipeline_id,
|
||||||
epoch,
|
epoch,
|
||||||
None,
|
None,
|
||||||
auxiliary_lists_builder);
|
frame_builder);
|
||||||
builder.push_stacking_context(child.web_render_stacking_level(),
|
builder.push_stacking_context(child.web_render_stacking_level(),
|
||||||
stacking_context_id);
|
stacking_context_id);
|
||||||
} else {
|
} else {
|
||||||
|
@ -305,7 +305,7 @@ impl WebRenderStackingContextConverter for StackingContext {
|
||||||
epoch,
|
epoch,
|
||||||
scroll_layer_id,
|
scroll_layer_id,
|
||||||
builder,
|
builder,
|
||||||
auxiliary_lists_builder,
|
frame_builder,
|
||||||
true);
|
true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -313,17 +313,17 @@ impl WebRenderStackingContextConverter for StackingContext {
|
||||||
while let Some(item) = traversal.advance(self) {
|
while let Some(item) = traversal.advance(self) {
|
||||||
item.item.convert_to_webrender(webrender_traits::StackingLevel::PositionedContent,
|
item.item.convert_to_webrender(webrender_traits::StackingLevel::PositionedContent,
|
||||||
builder,
|
builder,
|
||||||
auxiliary_lists_builder);
|
frame_builder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn convert_to_webrender<'a>(&self,
|
fn convert_to_webrender<'a>(&self,
|
||||||
traversal: &mut DisplayListTraversal<'a>,
|
traversal: &mut DisplayListTraversal<'a>,
|
||||||
api: &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>,
|
scroll_layer_id: Option<webrender_traits::ScrollLayerId>,
|
||||||
auxiliary_lists_builder: &mut AuxiliaryListsBuilder)
|
frame_builder: &mut WebRenderFrameBuilder)
|
||||||
-> webrender_traits::StackingContextId {
|
-> webrender_traits::StackingContextId {
|
||||||
let scroll_policy = self.layer_info
|
let scroll_policy = self.layer_info
|
||||||
.map_or(webrender_traits::ScrollPolicy::Scrollable, |info| {
|
.map_or(webrender_traits::ScrollPolicy::Scrollable, |info| {
|
||||||
|
@ -333,17 +333,18 @@ impl WebRenderStackingContextConverter for StackingContext {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
let mut sc = webrender_traits::StackingContext::new(scroll_layer_id,
|
let mut sc =
|
||||||
scroll_policy,
|
webrender_traits::StackingContext::new(scroll_layer_id,
|
||||||
self.bounds.to_rectf(),
|
scroll_policy,
|
||||||
self.overflow.to_rectf(),
|
self.bounds.to_rectf(),
|
||||||
self.z_index,
|
self.overflow.to_rectf(),
|
||||||
&self.transform,
|
self.z_index,
|
||||||
&self.perspective,
|
&self.transform,
|
||||||
self.establishes_3d_context,
|
&self.perspective,
|
||||||
self.blend_mode.to_blend_mode(),
|
self.establishes_3d_context,
|
||||||
self.filters.to_filter_ops(),
|
self.blend_mode.to_blend_mode(),
|
||||||
auxiliary_lists_builder);
|
self.filters.to_filter_ops(),
|
||||||
|
&mut frame_builder.auxiliary_lists_builder);
|
||||||
let mut builder = webrender_traits::DisplayListBuilder::new();
|
let mut builder = webrender_traits::DisplayListBuilder::new();
|
||||||
self.convert_children_to_webrender(traversal,
|
self.convert_children_to_webrender(traversal,
|
||||||
api,
|
api,
|
||||||
|
@ -351,10 +352,10 @@ impl WebRenderStackingContextConverter for StackingContext {
|
||||||
epoch,
|
epoch,
|
||||||
scroll_layer_id,
|
scroll_layer_id,
|
||||||
&mut builder,
|
&mut builder,
|
||||||
auxiliary_lists_builder,
|
frame_builder,
|
||||||
false);
|
false);
|
||||||
api.add_display_list(builder.finalize(), &mut sc, pipeline_id, epoch);
|
frame_builder.add_display_list(api, builder.finalize(), &mut sc);
|
||||||
api.add_stacking_context(sc, pipeline_id, epoch)
|
frame_builder.add_stacking_context(api, pipeline_id, sc)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn web_render_stacking_level(&self) -> webrender_traits::StackingLevel {
|
fn web_render_stacking_level(&self) -> webrender_traits::StackingLevel {
|
||||||
|
@ -368,11 +369,11 @@ impl WebRenderStackingContextConverter for StackingContext {
|
||||||
|
|
||||||
impl WebRenderDisplayListConverter for DisplayList {
|
impl WebRenderDisplayListConverter for DisplayList {
|
||||||
fn convert_to_webrender(&self,
|
fn convert_to_webrender(&self,
|
||||||
api: &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>,
|
scroll_layer_id: Option<webrender_traits::ScrollLayerId>,
|
||||||
auxiliary_lists_builder: &mut AuxiliaryListsBuilder)
|
frame_builder: &mut WebRenderFrameBuilder)
|
||||||
-> webrender_traits::StackingContextId {
|
-> webrender_traits::StackingContextId {
|
||||||
let mut traversal = DisplayListTraversal {
|
let mut traversal = DisplayListTraversal {
|
||||||
display_list: self,
|
display_list: self,
|
||||||
|
@ -385,7 +386,7 @@ impl WebRenderDisplayListConverter for DisplayList {
|
||||||
pipeline_id,
|
pipeline_id,
|
||||||
epoch,
|
epoch,
|
||||||
scroll_layer_id,
|
scroll_layer_id,
|
||||||
auxiliary_lists_builder)
|
frame_builder)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -393,14 +394,14 @@ impl WebRenderDisplayItemConverter for DisplayItem {
|
||||||
fn convert_to_webrender(&self,
|
fn convert_to_webrender(&self,
|
||||||
level: webrender_traits::StackingLevel,
|
level: webrender_traits::StackingLevel,
|
||||||
builder: &mut webrender_traits::DisplayListBuilder,
|
builder: &mut webrender_traits::DisplayListBuilder,
|
||||||
auxiliary_lists_builder: &mut AuxiliaryListsBuilder) {
|
frame_builder: &mut WebRenderFrameBuilder) {
|
||||||
match *self {
|
match *self {
|
||||||
DisplayItem::SolidColorClass(ref item) => {
|
DisplayItem::SolidColorClass(ref item) => {
|
||||||
let color = item.color.to_colorf();
|
let color = item.color.to_colorf();
|
||||||
if color.a > 0.0 {
|
if color.a > 0.0 {
|
||||||
builder.push_rect(level,
|
builder.push_rect(level,
|
||||||
item.base.bounds.to_rectf(),
|
item.base.bounds.to_rectf(),
|
||||||
item.base.clip.to_clip_region(auxiliary_lists_builder),
|
item.base.clip.to_clip_region(frame_builder),
|
||||||
color);
|
color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -425,13 +426,13 @@ impl WebRenderDisplayItemConverter for DisplayItem {
|
||||||
if glyphs.len() > 0 {
|
if glyphs.len() > 0 {
|
||||||
builder.push_text(level,
|
builder.push_text(level,
|
||||||
item.base.bounds.to_rectf(),
|
item.base.bounds.to_rectf(),
|
||||||
item.base.clip.to_clip_region(auxiliary_lists_builder),
|
item.base.clip.to_clip_region(frame_builder),
|
||||||
glyphs,
|
glyphs,
|
||||||
item.text_run.font_key.expect("Font not added to webrender!"),
|
item.text_run.font_key.expect("Font not added to webrender!"),
|
||||||
item.text_color.to_colorf(),
|
item.text_color.to_colorf(),
|
||||||
item.text_run.actual_pt_size,
|
item.text_run.actual_pt_size,
|
||||||
item.blur_radius,
|
item.blur_radius,
|
||||||
auxiliary_lists_builder);
|
&mut frame_builder.auxiliary_lists_builder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DisplayItem::ImageClass(ref item) => {
|
DisplayItem::ImageClass(ref item) => {
|
||||||
|
@ -440,7 +441,7 @@ impl WebRenderDisplayItemConverter for DisplayItem {
|
||||||
item.stretch_size.height > Au(0) {
|
item.stretch_size.height > Au(0) {
|
||||||
builder.push_image(level,
|
builder.push_image(level,
|
||||||
item.base.bounds.to_rectf(),
|
item.base.bounds.to_rectf(),
|
||||||
item.base.clip.to_clip_region(auxiliary_lists_builder),
|
item.base.clip.to_clip_region(frame_builder),
|
||||||
item.stretch_size.to_sizef(),
|
item.stretch_size.to_sizef(),
|
||||||
item.image_rendering.to_image_rendering(),
|
item.image_rendering.to_image_rendering(),
|
||||||
id);
|
id);
|
||||||
|
@ -450,7 +451,7 @@ impl WebRenderDisplayItemConverter for DisplayItem {
|
||||||
DisplayItem::WebGLClass(ref item) => {
|
DisplayItem::WebGLClass(ref item) => {
|
||||||
builder.push_webgl_canvas(level,
|
builder.push_webgl_canvas(level,
|
||||||
item.base.bounds.to_rectf(),
|
item.base.bounds.to_rectf(),
|
||||||
item.base.clip.to_clip_region(auxiliary_lists_builder),
|
item.base.clip.to_clip_region(frame_builder),
|
||||||
item.context_id);
|
item.context_id);
|
||||||
}
|
}
|
||||||
DisplayItem::BorderClass(ref item) => {
|
DisplayItem::BorderClass(ref item) => {
|
||||||
|
@ -478,7 +479,7 @@ impl WebRenderDisplayItemConverter for DisplayItem {
|
||||||
let radius = item.radius.to_border_radius();
|
let radius = item.radius.to_border_radius();
|
||||||
builder.push_border(level,
|
builder.push_border(level,
|
||||||
rect,
|
rect,
|
||||||
item.base.clip.to_clip_region(auxiliary_lists_builder),
|
item.base.clip.to_clip_region(frame_builder),
|
||||||
left,
|
left,
|
||||||
top,
|
top,
|
||||||
right,
|
right,
|
||||||
|
@ -495,11 +496,11 @@ impl WebRenderDisplayItemConverter for DisplayItem {
|
||||||
}
|
}
|
||||||
builder.push_gradient(level,
|
builder.push_gradient(level,
|
||||||
rect,
|
rect,
|
||||||
item.base.clip.to_clip_region(auxiliary_lists_builder),
|
item.base.clip.to_clip_region(frame_builder),
|
||||||
start_point,
|
start_point,
|
||||||
end_point,
|
end_point,
|
||||||
stops,
|
stops,
|
||||||
auxiliary_lists_builder);
|
&mut frame_builder.auxiliary_lists_builder);
|
||||||
}
|
}
|
||||||
DisplayItem::LineClass(..) => {
|
DisplayItem::LineClass(..) => {
|
||||||
println!("TODO DisplayItem::LineClass");
|
println!("TODO DisplayItem::LineClass");
|
||||||
|
@ -512,7 +513,7 @@ impl WebRenderDisplayItemConverter for DisplayItem {
|
||||||
let box_bounds = item.box_bounds.to_rectf();
|
let box_bounds = item.box_bounds.to_rectf();
|
||||||
builder.push_box_shadow(level,
|
builder.push_box_shadow(level,
|
||||||
rect,
|
rect,
|
||||||
item.base.clip.to_clip_region(auxiliary_lists_builder),
|
item.base.clip.to_clip_region(frame_builder),
|
||||||
box_bounds,
|
box_bounds,
|
||||||
item.offset.to_pointf(),
|
item.offset.to_pointf(),
|
||||||
item.color.to_colorf(),
|
item.color.to_colorf(),
|
||||||
|
@ -526,9 +527,52 @@ impl WebRenderDisplayItemConverter for DisplayItem {
|
||||||
let pipeline_id = item.iframe.to_webrender();
|
let pipeline_id = item.iframe.to_webrender();
|
||||||
builder.push_iframe(level,
|
builder.push_iframe(level,
|
||||||
rect,
|
rect,
|
||||||
item.base.clip.to_clip_region(auxiliary_lists_builder),
|
item.base.clip.to_clip_region(frame_builder),
|
||||||
pipeline_id);
|
pipeline_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
impl WebRenderFrameBuilder {
|
||||||
|
pub fn new(root_pipeline_id: PipelineId) -> WebRenderFrameBuilder {
|
||||||
|
WebRenderFrameBuilder {
|
||||||
|
stacking_contexts: vec![],
|
||||||
|
display_lists: vec![],
|
||||||
|
auxiliary_lists_builder: AuxiliaryListsBuilder::new(),
|
||||||
|
root_pipeline_id: root_pipeline_id,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add_stacking_context(&mut self,
|
||||||
|
api: &mut webrender_traits::RenderApi,
|
||||||
|
pipeline_id: PipelineId,
|
||||||
|
stacking_context: webrender_traits::StackingContext)
|
||||||
|
-> StackingContextId {
|
||||||
|
assert!(pipeline_id == self.root_pipeline_id);
|
||||||
|
let id = api.next_stacking_context_id();
|
||||||
|
self.stacking_contexts.push((id, stacking_context));
|
||||||
|
id
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add_display_list(&mut self,
|
||||||
|
api: &mut webrender_traits::RenderApi,
|
||||||
|
display_list: webrender_traits::BuiltDisplayList,
|
||||||
|
stacking_context: &mut webrender_traits::StackingContext)
|
||||||
|
-> DisplayListId {
|
||||||
|
let id = api.next_display_list_id();
|
||||||
|
stacking_context.has_stacking_contexts = stacking_context.has_stacking_contexts ||
|
||||||
|
display_list.descriptor().has_stacking_contexts;
|
||||||
|
stacking_context.display_lists.push(id);
|
||||||
|
self.display_lists.push((id, display_list));
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
4
components/servo/Cargo.lock
generated
4
components/servo/Cargo.lock
generated
|
@ -2306,7 +2306,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "webrender"
|
name = "webrender"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/servo/webrender#ab1c795612a5bd560a8adf750b4630cf1d24f706"
|
source = "git+https://github.com/servo/webrender#2a71ccb0249601b25ef156f9a585a001c8d606cb"
|
||||||
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)",
|
||||||
"core-graphics 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"core-graphics 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -2328,7 +2328,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#0bff8081020c0fc0a31258482f4c6e9bfaf597f2"
|
source = "git+https://github.com/servo/webrender_traits#2ad5e68f3f49c91ef627848d9561649f3c1be344"
|
||||||
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)",
|
||||||
"core-graphics 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"core-graphics 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
|
4
ports/cef/Cargo.lock
generated
4
ports/cef/Cargo.lock
generated
|
@ -2182,7 +2182,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "webrender"
|
name = "webrender"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/servo/webrender#ab1c795612a5bd560a8adf750b4630cf1d24f706"
|
source = "git+https://github.com/servo/webrender#2a71ccb0249601b25ef156f9a585a001c8d606cb"
|
||||||
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)",
|
||||||
"core-graphics 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"core-graphics 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -2204,7 +2204,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#0bff8081020c0fc0a31258482f4c6e9bfaf597f2"
|
source = "git+https://github.com/servo/webrender_traits#2ad5e68f3f49c91ef627848d9561649f3c1be344"
|
||||||
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)",
|
||||||
"core-graphics 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"core-graphics 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
|
4
ports/gonk/Cargo.lock
generated
4
ports/gonk/Cargo.lock
generated
|
@ -2131,7 +2131,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "webrender"
|
name = "webrender"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/servo/webrender#ab1c795612a5bd560a8adf750b4630cf1d24f706"
|
source = "git+https://github.com/servo/webrender#2a71ccb0249601b25ef156f9a585a001c8d606cb"
|
||||||
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)",
|
||||||
"core-graphics 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"core-graphics 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -2153,7 +2153,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#0bff8081020c0fc0a31258482f4c6e9bfaf597f2"
|
source = "git+https://github.com/servo/webrender_traits#2ad5e68f3f49c91ef627848d9561649f3c1be344"
|
||||||
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)",
|
||||||
"core-graphics 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"core-graphics 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue