Skip to content

Commit dadb5c0

Browse files
committed
Flatten the display list in the API
This changes brings the WebRender API more into line with the Servo display list and also the frames generated inside WebRender itself. Most intermediate display list representations are removed as well as their place on the resource cache. Perhaps most notably, stacking contexts are started via a PushStackingContext display item and ended via a PopStackingContext item. Additionally, the flatten pass has been significantly simplified to account for these changes.
1 parent 0f79d9d commit dadb5c0

File tree

11 files changed

+515
-842
lines changed

11 files changed

+515
-842
lines changed

sample/src/main.rs

Lines changed: 20 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
extern crate app_units;
21
extern crate webrender;
32
extern crate glutin;
43
extern crate gleam;
@@ -9,9 +8,8 @@ use euclid::{Size2D, Point2D, Rect, Matrix4D};
98
use gleam::gl;
109
use std::path::PathBuf;
1110
use std::ffi::CStr;
12-
use webrender_traits::{PipelineId, StackingContextId, DisplayListId};
13-
use webrender_traits::{AuxiliaryListsBuilder, Epoch, ColorF, GlyphInstance};
14-
use webrender_traits::{ImageFormat, RendererKind};
11+
use webrender_traits::{AuxiliaryListsBuilder, ColorF, Epoch, GlyphInstance};
12+
use webrender_traits::{ImageFormat, PipelineId, RendererKind};
1513
use std::fs::File;
1614
use std::io::Read;
1715
use std::env;
@@ -36,54 +34,10 @@ impl Notifier {
3634
}
3735

3836
pub struct WebRenderFrameBuilder {
39-
pub stacking_contexts: Vec<(StackingContextId, webrender_traits::StackingContext)>,
40-
pub display_lists: Vec<(DisplayListId, webrender_traits::BuiltDisplayList)>,
41-
pub auxiliary_lists_builder: AuxiliaryListsBuilder,
4237
pub root_pipeline_id: PipelineId,
4338
pub next_scroll_layer_id: usize,
4439
}
4540

46-
impl WebRenderFrameBuilder {
47-
pub fn new(root_pipeline_id: PipelineId) -> WebRenderFrameBuilder {
48-
WebRenderFrameBuilder {
49-
stacking_contexts: vec![],
50-
display_lists: vec![],
51-
auxiliary_lists_builder: AuxiliaryListsBuilder::new(),
52-
root_pipeline_id: root_pipeline_id,
53-
next_scroll_layer_id: 0,
54-
}
55-
}
56-
57-
pub fn add_stacking_context(&mut self,
58-
api: &mut webrender_traits::RenderApi,
59-
pipeline_id: PipelineId,
60-
stacking_context: webrender_traits::StackingContext)
61-
-> StackingContextId {
62-
assert!(pipeline_id == self.root_pipeline_id);
63-
let id = api.next_stacking_context_id();
64-
self.stacking_contexts.push((id, stacking_context));
65-
id
66-
}
67-
68-
pub fn add_display_list(&mut self,
69-
api: &mut webrender_traits::RenderApi,
70-
display_list: webrender_traits::BuiltDisplayList,
71-
stacking_context: &mut webrender_traits::StackingContext)
72-
-> DisplayListId {
73-
let id = api.next_display_list_id();
74-
stacking_context.display_lists.push(id);
75-
self.display_lists.push((id, display_list));
76-
id
77-
}
78-
79-
pub fn next_scroll_layer_id(&mut self) -> webrender_traits::ScrollLayerId {
80-
let scroll_layer_id = webrender_traits::ServoScrollRootId(self.next_scroll_layer_id);
81-
self.next_scroll_layer_id += 1;
82-
webrender_traits::ScrollLayerId::new(self.root_pipeline_id, 0, scroll_layer_id)
83-
}
84-
85-
}
86-
8741
impl webrender_traits::RenderNotifier for Notifier {
8842
fn new_frame_ready(&mut self) {
8943
self.window_proxy.wakeup_event_loop();
@@ -144,7 +98,7 @@ fn main() {
14498
};
14599

146100
let (mut renderer, sender) = webrender::renderer::Renderer::new(opts);
147-
let mut api = sender.create_api();
101+
let api = sender.create_api();
148102

149103
// let font_path = "/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf";
150104
// let font_bytes = load_file(font_path);
@@ -157,11 +111,15 @@ fn main() {
157111
let epoch = Epoch(0);
158112
let root_background_color = ColorF::new(0.3, 0.0, 0.0, 1.0);
159113

160-
let mut frame_builder = WebRenderFrameBuilder::new(pipeline_id);
161-
let root_scroll_layer_id = frame_builder.next_scroll_layer_id();
114+
let mut auxiliary_lists_builder = AuxiliaryListsBuilder::new();
115+
let mut builder = webrender_traits::DisplayListBuilder::new();
116+
117+
let root_scroll_layer_id =
118+
webrender_traits::ScrollLayerId::new(pipeline_id, 0,
119+
webrender_traits::ServoScrollRootId(0));
162120

163121
let bounds = Rect::new(Point2D::new(0.0, 0.0), Size2D::new(width as f32, height as f32));
164-
let mut sc =
122+
builder.push_stacking_context(
165123
webrender_traits::StackingContext::new(Some(root_scroll_layer_id),
166124
webrender_traits::ScrollPolicy::Scrollable,
167125
bounds,
@@ -172,9 +130,7 @@ fn main() {
172130
true,
173131
webrender_traits::MixBlendMode::Normal,
174132
Vec::new(),
175-
&mut frame_builder.auxiliary_lists_builder);
176-
177-
let mut builder = webrender_traits::DisplayListBuilder::new();
133+
&mut auxiliary_lists_builder));
178134

179135
let clip_region = {
180136
let rect = Rect::new(Point2D::new(100.0, 100.0), Size2D::new(100.0, 100.0));
@@ -189,7 +145,7 @@ fn main() {
189145
webrender_traits::ClipRegion::new(&bounds,
190146
vec![complex],
191147
Some(mask),
192-
&mut frame_builder.auxiliary_lists_builder)
148+
&mut auxiliary_lists_builder)
193149
};
194150

195151
builder.push_rect(Rect::new(Point2D::new(100.0, 100.0), Size2D::new(100.0, 100.0)),
@@ -270,19 +226,15 @@ fn main() {
270226
// Au::from_px(0),
271227
// &mut frame_builder.auxiliary_lists_builder);
272228

273-
frame_builder.add_display_list(&mut api, builder.finalize(), &mut sc);
274-
let sc_id = frame_builder.add_stacking_context(&mut api, pipeline_id, sc);
275-
276-
api.set_root_stacking_context(sc_id,
277-
root_background_color,
278-
epoch,
279-
pipeline_id,
280-
Size2D::new(width as f32, height as f32),
281-
frame_builder.stacking_contexts,
282-
frame_builder.display_lists,
283-
frame_builder.auxiliary_lists_builder
284-
.finalize());
229+
builder.pop_stacking_context();
285230

231+
api.set_root_display_list(
232+
root_background_color,
233+
epoch,
234+
pipeline_id,
235+
Size2D::new(width as f32, height as f32),
236+
builder.finalize(),
237+
auxiliary_lists_builder.finalize());
286238
api.set_root_pipeline(pipeline_id);
287239

288240
for event in window.wait_events() {

0 commit comments

Comments
 (0)