Skip to content

Commit 8fd781f

Browse files
committed
Refactored passing down ClipRegion and auxiliary context lists
1 parent 6e0f4ba commit 8fd781f

File tree

4 files changed

+141
-137
lines changed

4 files changed

+141
-137
lines changed

webrender/src/frame.rs

Lines changed: 31 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,15 @@ use internal_types::{CompositionOp};
1111
use internal_types::{LowLevelFilterOp};
1212
use internal_types::{RendererFrame};
1313
use layer::{Layer, ScrollingState};
14-
use prim_store::ClipInfo;
1514
use resource_cache::{DummyResources, ResourceCache};
1615
use scene::{SceneStackingContext, ScenePipeline, Scene, SceneItem, SpecificSceneItem};
1716
use std::collections::{HashMap, HashSet};
1817
use std::hash::BuildHasherDefault;
19-
use tiling::{FrameBuilder, FrameBuilderConfig, InsideTest, Clip, MaskImageSource};
20-
use tiling::PrimitiveFlags;
18+
use tiling::{FrameBuilder, FrameBuilderConfig, LayerMap};
19+
use tiling::{MaskImageSource, PrimitiveFlags};
2120
use util::MatrixHelpers;
2221
use webrender_traits::{AuxiliaryLists, PipelineId, Epoch, ScrollPolicy, ScrollLayerId};
23-
use webrender_traits::{ColorF, StackingContext, FilterOp, MixBlendMode};
22+
use webrender_traits::{ClipRegion, ColorF, StackingContext, FilterOp, MixBlendMode};
2423
use webrender_traits::{ScrollEventPhase, ScrollLayerInfo, SpecificDisplayItem, ScrollLayerState};
2524

2625
#[cfg(target_os = "macos")]
@@ -36,7 +35,6 @@ static DEFAULT_SCROLLBAR_COLOR: ColorF = ColorF { r: 0.3, g: 0.3, b: 0.3, a: 0.6
3635

3736
struct FlattenContext<'a> {
3837
resource_cache: &'a mut ResourceCache,
39-
dummy_resources: &'a DummyResources,
4038
scene: &'a Scene,
4139
pipeline_sizes: &'a mut HashMap<PipelineId, Size2D<f32>>,
4240
builder: &'a mut FrameBuilder,
@@ -53,15 +51,10 @@ struct FlattenInfo {
5351
layer_relative_transform: Matrix4D<f32>,
5452
}
5553

56-
pub type LayerMap = HashMap<ScrollLayerId, Layer, BuildHasherDefault<FnvHasher>>;
57-
5854
// TODO: doc
5955
pub struct Frame {
6056
pub layers: LayerMap,
6157
pub pipeline_epoch_map: HashMap<PipelineId, Epoch, BuildHasherDefault<FnvHasher>>,
62-
pub pipeline_auxiliary_lists: HashMap<PipelineId,
63-
AuxiliaryLists,
64-
BuildHasherDefault<FnvHasher>>,
6558
pub root_scroll_layer_id: Option<ScrollLayerId>,
6659
id: FrameId,
6760
debug: bool,
@@ -197,7 +190,6 @@ impl Frame {
197190
pub fn new(debug: bool, config: FrameBuilderConfig) -> Frame {
198191
Frame {
199192
pipeline_epoch_map: HashMap::with_hasher(Default::default()),
200-
pipeline_auxiliary_lists: HashMap::with_hasher(Default::default()),
201193
layers: HashMap::with_hasher(Default::default()),
202194
root_scroll_layer_id: None,
203195
id: FrameId(0),
@@ -378,8 +370,6 @@ impl Frame {
378370
if let Some(root_pipeline) = scene.pipeline_map.get(&root_pipeline_id) {
379371
let old_layer_scrolling_states = self.reset();
380372

381-
self.pipeline_auxiliary_lists = scene.pipeline_auxiliary_lists.clone();
382-
383373
let root_stacking_context = scene.stacking_context_map
384374
.get(&root_pipeline.root_stacking_context_id)
385375
.unwrap();
@@ -409,15 +399,21 @@ impl Frame {
409399

410400
// Work around borrow check on resource cache
411401
{
402+
let dummy_mask_source = {
403+
let cache_id = dummy_resources.opaque_mask_image_id;
404+
let cache_item = resource_cache.get_image_by_cache_id(cache_id);
405+
MaskImageSource::Renderer(cache_item.texture_id)
406+
};
412407
let mut frame_builder = FrameBuilder::new(root_pipeline.viewport_size,
413408
device_pixel_ratio,
409+
dummy_mask_source,
414410
self.debug,
411+
scene.pipeline_auxiliary_lists.clone(),
415412
self.frame_builder_config);
416413

417414
{
418415
let mut context = FlattenContext {
419416
resource_cache: resource_cache,
420-
dummy_resources: dummy_resources,
421417
scene: scene,
422418
pipeline_sizes: pipeline_sizes,
423419
builder: &mut frame_builder,
@@ -482,9 +478,7 @@ impl Frame {
482478
}
483479

484480
let composition_operations = {
485-
let auxiliary_lists = self.pipeline_auxiliary_lists
486-
.get(&pipeline_id)
487-
.expect("No auxiliary lists?!");
481+
let auxiliary_lists = context.builder.get_auxiliary_lists(pipeline_id);
488482
stacking_context.composition_operations(auxiliary_lists)
489483
};
490484

@@ -525,6 +519,7 @@ impl Frame {
525519
scroll_layer_id,
526520
&composition_operations);
527521

522+
let aux_pipeline_id = parent_info.pipeline_id;
528523
if level == 0 {
529524
// Add a large white rectangle as the root display item. This is removed
530525
// by the occlusion culling for most tiles, and means that it's no longer
@@ -538,76 +533,39 @@ impl Frame {
538533
//
539534
// If we do need this, does it make sense to keep Frame::clear_tiles?
540535
context.builder.add_solid_rectangle(&stacking_context.bounds,
541-
&stacking_context.bounds,
542-
None,
536+
&ClipRegion::simple(&stacking_context.bounds),
537+
aux_pipeline_id,
543538
&ColorF::new(1.0, 1.0, 1.0, 1.0),
544539
PrimitiveFlags::None);
545540
}
546541

547-
let dummy_mask_source = {
548-
let cache_id = context.dummy_resources.opaque_mask_image_id;
549-
let cache_item = context.resource_cache.get_image_by_cache_id(cache_id);
550-
MaskImageSource::Renderer(cache_item.texture_id)
551-
};
552-
553542
for item in scene_items {
554543
match item.specific {
555544
SpecificSceneItem::DrawList(draw_list_id) => {
556545
let draw_list = context.resource_cache.get_draw_list(draw_list_id);
557546
let builder = &mut context.builder;
558-
let auxiliary_lists = self.pipeline_auxiliary_lists
559-
.get(&parent_info.pipeline_id)
560-
.expect("No auxiliary lists?!");
561547

562548
for item in &draw_list.items {
563-
let clips = auxiliary_lists.complex_clip_regions(&item.clip.complex);
564-
let mut clip = match clips.len() {
565-
0 if item.clip.image_mask.is_none() => None,
566-
0 => Some(Clip::new(ClipInfo::uniform(item.clip.main, 0.0), dummy_mask_source)),
567-
1 => Some(Clip::new(ClipInfo::from_clip_region(&clips[0]), dummy_mask_source)),
568-
_ => {
569-
let internal_clip = clips.last().unwrap();
570-
let region = if clips.iter().all(|current_clip| current_clip.might_contain(internal_clip)) {
571-
internal_clip
572-
} else {
573-
&clips[0]
574-
};
575-
Some(Clip::new(ClipInfo::from_clip_region(region), dummy_mask_source))
576-
},
577-
};
578-
579-
if let Some(ref mask) = item.clip.image_mask {
580-
let old = match clip {
581-
Some(masked) => *masked.clip,
582-
None => ClipInfo::uniform(item.clip.main, 0.0),
583-
};
584-
//Note: can't call `tex_cache.aligned_uv_rect()` here since the image
585-
// is not yet marked as needed this frame.
586-
clip = Some(Clip::new(old.with_mask(Rect::zero(), mask.rect),
587-
MaskImageSource::User(mask.image)));
588-
}
589-
590-
591549
match item.item {
592550
SpecificDisplayItem::WebGL(ref info) => {
593551
builder.add_webgl_rectangle(item.rect,
594-
&item.clip.main,
595-
clip,
552+
&item.clip,
553+
aux_pipeline_id,
596554
info.context_id);
597555
}
598556
SpecificDisplayItem::Image(ref info) => {
599557
builder.add_image(item.rect,
600-
&item.clip.main,
601-
clip,
558+
&item.clip,
559+
aux_pipeline_id,
602560
&info.stretch_size,
603561
&info.tile_spacing,
604562
info.image_key,
605563
info.image_rendering);
606564
}
607565
SpecificDisplayItem::Text(ref text_info) => {
608566
builder.add_text(item.rect,
609-
&item.clip.main,
610-
clip,
567+
&item.clip,
568+
aux_pipeline_id,
611569
text_info.font_key,
612570
text_info.size,
613571
text_info.blur_radius,
@@ -616,23 +574,23 @@ impl Frame {
616574
}
617575
SpecificDisplayItem::Rectangle(ref info) => {
618576
builder.add_solid_rectangle(&item.rect,
619-
&item.clip.main,
620-
clip,
577+
&item.clip,
578+
aux_pipeline_id,
621579
&info.color,
622580
PrimitiveFlags::None);
623581
}
624582
SpecificDisplayItem::Gradient(ref info) => {
625583
builder.add_gradient(item.rect,
626-
&item.clip.main,
627-
clip,
584+
&item.clip,
585+
aux_pipeline_id,
628586
info.start_point,
629587
info.end_point,
630588
info.stops);
631589
}
632590
SpecificDisplayItem::BoxShadow(ref box_shadow_info) => {
633591
builder.add_box_shadow(&box_shadow_info.box_bounds,
634-
&item.clip.main,
635-
clip,
592+
&item.clip,
593+
aux_pipeline_id,
636594
&box_shadow_info.offset,
637595
&box_shadow_info.color,
638596
box_shadow_info.blur_radius,
@@ -642,8 +600,8 @@ impl Frame {
642600
}
643601
SpecificDisplayItem::Border(ref info) => {
644602
builder.add_border(item.rect,
645-
&item.clip.main,
646-
clip,
603+
&item.clip,
604+
aux_pipeline_id,
647605
info);
648606
}
649607
}
@@ -762,8 +720,8 @@ impl Frame {
762720
let scrollbar_rect = Rect::new(Point2D::zero(),
763721
Size2D::new(10.0, 70.0));
764722
context.builder.add_solid_rectangle(&scrollbar_rect,
765-
&scrollbar_rect,
766-
None,
723+
&ClipRegion::simple(&scrollbar_rect),
724+
aux_pipeline_id,
767725
&DEFAULT_SCROLLBAR_COLOR,
768726
PrimitiveFlags::Scrollbar(self.root_scroll_layer_id.unwrap(),
769727
4.0));
@@ -852,13 +810,11 @@ impl Frame {
852810
}
853811
}
854812

855-
fn build_frame(&mut self,
856-
resource_cache: &mut ResourceCache) -> RendererFrame {
813+
fn build_frame(&mut self, resource_cache: &mut ResourceCache) -> RendererFrame {
857814
let mut frame_builder = self.frame_builder.take();
858815
let frame = frame_builder.as_mut().map(|builder| {
859816
builder.build(resource_cache,
860817
self.id,
861-
&self.pipeline_auxiliary_lists,
862818
&self.layers)
863819
});
864820
self.frame_builder = frame_builder;

webrender/src/scene.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ use internal_types::DrawListId;
88
use resource_cache::ResourceCache;
99
use std::collections::HashMap;
1010
use std::hash::BuildHasherDefault;
11-
use webrender_traits::{AuxiliaryLists, BuiltDisplayList, ItemRange, PipelineId, Epoch};
11+
use tiling::AuxiliaryListsMap;
12+
use webrender_traits::{AuxiliaryLists, BuiltDisplayList, PipelineId, Epoch};
1213
use webrender_traits::{ColorF, DisplayListId, StackingContext, StackingContextId};
1314
use webrender_traits::{SpecificDisplayListItem};
1415
use webrender_traits::{IframeInfo};
@@ -29,9 +30,7 @@ pub struct Scene {
2930
pub root_pipeline_id: Option<PipelineId>,
3031
pub pipeline_map: HashMap<PipelineId, ScenePipeline, BuildHasherDefault<FnvHasher>>,
3132
pub pipeline_sizes: HashMap<PipelineId, Size2D<f32>>,
32-
pub pipeline_auxiliary_lists: HashMap<PipelineId,
33-
AuxiliaryLists,
34-
BuildHasherDefault<FnvHasher>>,
33+
pub pipeline_auxiliary_lists: AuxiliaryListsMap,
3534
pub display_list_map: HashMap<DisplayListId, SceneDisplayList, BuildHasherDefault<FnvHasher>>,
3635
pub stacking_context_map: HashMap<StackingContextId, SceneStackingContext, BuildHasherDefault<FnvHasher>>,
3736
}
@@ -185,15 +184,10 @@ impl Scene {
185184
let rectangle_item = RectangleDisplayItem {
186185
color: background_color,
187186
};
188-
let clip = ClipRegion {
189-
main: overflow,
190-
complex: ItemRange::empty(),
191-
image_mask: None,
192-
};
193187
let root_bg_color_item = DisplayItem {
194188
item: SpecificDisplayItem::Rectangle(rectangle_item),
195189
rect: overflow,
196-
clip: clip,
190+
clip: ClipRegion::simple(&overflow),
197191
};
198192

199193
let draw_list_id = resource_cache.add_draw_list(vec![root_bg_color_item], pipeline_id);

0 commit comments

Comments
 (0)