Skip to content

Commit 9a44521

Browse files
committed
Major refactoring of how clips are processed down the pipeline, in preparation to multiple transformed clip support.
Removed MaskImageSource, introduced PrimitiveClipSource to the metadata. Avoided cloning the auxiliary lists map.
1 parent 72770bf commit 9a44521

13 files changed

+251
-295
lines changed

webrender/res/clip_shared.glsl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ flat varying vec4 vClipMaskUvRect;
99
flat varying vec4 vClipMaskLocalRect;
1010

1111
#ifdef WR_VERTEX_SHADER
12-
void write_clip(ClipInfo clip) {
12+
void write_clip(ClipData clip) {
1313
vClipRect = vec4(clip.rect.rect.xy, clip.rect.rect.xy + clip.rect.rect.zw);
1414
vClipRadius = vec4(clip.top_left.outer_inner_radius.x,
1515
clip.top_right.outer_inner_radius.x,
1616
clip.bottom_right.outer_inner_radius.x,
1717
clip.bottom_left.outer_inner_radius.x);
1818
//TODO: interpolate the final mask UV
19-
vClipMaskUvRect = clip.mask_info.uv_rect;
20-
vClipMaskLocalRect = clip.mask_info.local_rect; //TODO: transform
19+
vClipMaskUvRect = clip.mask_data.uv_rect;
20+
vClipMaskLocalRect = clip.mask_data.local_rect; //TODO: transform
2121
}
2222
#endif
2323

webrender/res/prim_shared.glsl

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -347,13 +347,13 @@ ClipRect fetch_clip_rect(int index) {
347347
return rect;
348348
}
349349

350-
struct ImageMaskInfo {
350+
struct ImageMaskData {
351351
vec4 uv_rect;
352352
vec4 local_rect;
353353
};
354354

355-
ImageMaskInfo fetch_mask_info(int index) {
356-
ImageMaskInfo info;
355+
ImageMaskData fetch_mask_data(int index) {
356+
ImageMaskData info;
357357

358358
ivec2 uv = get_fetch_uv_2(index);
359359

@@ -379,24 +379,24 @@ ClipCorner fetch_clip_corner(int index) {
379379
return corner;
380380
}
381381

382-
struct ClipInfo {
382+
struct ClipData {
383383
ClipRect rect;
384384
ClipCorner top_left;
385385
ClipCorner top_right;
386386
ClipCorner bottom_left;
387387
ClipCorner bottom_right;
388-
ImageMaskInfo mask_info;
388+
ImageMaskData mask_data;
389389
};
390390

391-
ClipInfo fetch_clip(int index) {
392-
ClipInfo clip;
391+
ClipData fetch_clip(int index) {
392+
ClipData clip;
393393

394394
clip.rect = fetch_clip_rect(index + 0);
395395
clip.top_left = fetch_clip_corner(index + 1);
396396
clip.top_right = fetch_clip_corner(index + 2);
397397
clip.bottom_left = fetch_clip_corner(index + 3);
398398
clip.bottom_right = fetch_clip_corner(index + 4);
399-
clip.mask_info = fetch_mask_info(index + 5);
399+
clip.mask_data = fetch_mask_data(index + 5);
400400

401401
return clip;
402402
}

webrender/res/ps_gradient_clip.vs.glsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,6 @@ void main(void) {
6666
break;
6767
}
6868

69-
ClipInfo clip = fetch_clip(prim.clip_index);
69+
ClipData clip = fetch_clip(prim.clip_index);
7070
write_clip(clip);
7171
}

webrender/res/ps_image_clip.vs.glsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ void main(void) {
2323
vLocalPos = vi.local_clamped_pos;
2424
#endif
2525

26-
ClipInfo clip = fetch_clip(prim.clip_index);
26+
ClipData clip = fetch_clip(prim.clip_index);
2727
write_clip(clip);
2828

2929
// vUv will contain how many times this image has wrapped around the image size.

webrender/res/ps_rectangle_clip.vs.glsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@ void main(void) {
2222
vPos = vi.local_clamped_pos;
2323
#endif
2424

25-
ClipInfo clip = fetch_clip(prim.clip_index);
25+
ClipData clip = fetch_clip(prim.clip_index);
2626
write_clip(clip);
2727
}

webrender/src/frame.rs

Lines changed: 19 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,14 @@ 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::{AuxiliaryListsMap, FrameBuilder, FrameBuilderConfig, PrimitiveFlags};
2119
use util::MatrixHelpers;
2220
use webrender_traits::{AuxiliaryLists, PipelineId, Epoch, ScrollPolicy, ScrollLayerId};
23-
use webrender_traits::{ColorF, StackingContext, FilterOp, MixBlendMode};
21+
use webrender_traits::{ClipRegion, ColorF, StackingContext, FilterOp, MixBlendMode};
2422
use webrender_traits::{ScrollEventPhase, ScrollLayerInfo, SpecificDisplayItem, ScrollLayerState};
2523

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

3735
struct FlattenContext<'a> {
3836
resource_cache: &'a mut ResourceCache,
39-
dummy_resources: &'a DummyResources,
4037
scene: &'a Scene,
4138
pipeline_sizes: &'a mut HashMap<PipelineId, Size2D<f32>>,
4239
builder: &'a mut FrameBuilder,
@@ -411,13 +408,13 @@ impl Frame {
411408
{
412409
let mut frame_builder = FrameBuilder::new(root_pipeline.viewport_size,
413410
device_pixel_ratio,
411+
dummy_resources.clone(),
414412
self.debug,
415413
self.frame_builder_config);
416414

417415
{
418416
let mut context = FlattenContext {
419417
resource_cache: resource_cache,
420-
dummy_resources: dummy_resources,
421418
scene: scene,
422419
pipeline_sizes: pipeline_sizes,
423420
builder: &mut frame_builder,
@@ -538,76 +535,35 @@ impl Frame {
538535
//
539536
// If we do need this, does it make sense to keep Frame::clear_tiles?
540537
context.builder.add_solid_rectangle(&stacking_context.bounds,
541-
&stacking_context.bounds,
542-
None,
538+
&ClipRegion::simple(&stacking_context.bounds),
543539
&ColorF::new(1.0, 1.0, 1.0, 1.0),
544540
PrimitiveFlags::None);
545541
}
546542

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-
553543
for item in scene_items {
554544
match item.specific {
555545
SpecificSceneItem::DrawList(draw_list_id) => {
556546
let draw_list = context.resource_cache.get_draw_list(draw_list_id);
557547
let builder = &mut context.builder;
558-
let auxiliary_lists = self.pipeline_auxiliary_lists
559-
.get(&parent_info.pipeline_id)
560-
.expect("No auxiliary lists?!");
561548

562549
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-
591550
match item.item {
592551
SpecificDisplayItem::WebGL(ref info) => {
593552
builder.add_webgl_rectangle(item.rect,
594-
&item.clip.main,
595-
clip,
553+
&item.clip,
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,
602559
&info.stretch_size,
603560
&info.tile_spacing,
604561
info.image_key,
605562
info.image_rendering);
606563
}
607564
SpecificDisplayItem::Text(ref text_info) => {
608565
builder.add_text(item.rect,
609-
&item.clip.main,
610-
clip,
566+
&item.clip,
611567
text_info.font_key,
612568
text_info.size,
613569
text_info.blur_radius,
@@ -616,23 +572,20 @@ impl Frame {
616572
}
617573
SpecificDisplayItem::Rectangle(ref info) => {
618574
builder.add_solid_rectangle(&item.rect,
619-
&item.clip.main,
620-
clip,
575+
&item.clip,
621576
&info.color,
622577
PrimitiveFlags::None);
623578
}
624579
SpecificDisplayItem::Gradient(ref info) => {
625580
builder.add_gradient(item.rect,
626-
&item.clip.main,
627-
clip,
581+
&item.clip,
628582
info.start_point,
629583
info.end_point,
630584
info.stops);
631585
}
632586
SpecificDisplayItem::BoxShadow(ref box_shadow_info) => {
633587
builder.add_box_shadow(&box_shadow_info.box_bounds,
634-
&item.clip.main,
635-
clip,
588+
&item.clip,
636589
&box_shadow_info.offset,
637590
&box_shadow_info.color,
638591
box_shadow_info.blur_radius,
@@ -642,8 +595,7 @@ impl Frame {
642595
}
643596
SpecificDisplayItem::Border(ref info) => {
644597
builder.add_border(item.rect,
645-
&item.clip.main,
646-
clip,
598+
&item.clip,
647599
info);
648600
}
649601
}
@@ -762,8 +714,7 @@ impl Frame {
762714
let scrollbar_rect = Rect::new(Point2D::zero(),
763715
Size2D::new(10.0, 70.0));
764716
context.builder.add_solid_rectangle(&scrollbar_rect,
765-
&scrollbar_rect,
766-
None,
717+
&ClipRegion::simple(&scrollbar_rect),
767718
&DEFAULT_SCROLLBAR_COLOR,
768719
PrimitiveFlags::Scrollbar(self.root_scroll_layer_id.unwrap(),
769720
4.0));
@@ -774,10 +725,11 @@ impl Frame {
774725

775726
pub fn build(&mut self,
776727
resource_cache: &mut ResourceCache,
728+
auxiliary_lists_map: &AuxiliaryListsMap,
777729
device_pixel_ratio: f32)
778730
-> RendererFrame {
779731
self.update_layer_transforms(device_pixel_ratio);
780-
let frame = self.build_frame(resource_cache);
732+
let frame = self.build_frame(resource_cache, auxiliary_lists_map);
781733
resource_cache.expire_old_resources(self.id);
782734
frame
783735
}
@@ -853,14 +805,12 @@ impl Frame {
853805
}
854806

855807
fn build_frame(&mut self,
856-
resource_cache: &mut ResourceCache) -> RendererFrame {
808+
resource_cache: &mut ResourceCache,
809+
auxiliary_lists_map: &AuxiliaryListsMap) -> RendererFrame {
857810
let mut frame_builder = self.frame_builder.take();
858-
let frame = frame_builder.as_mut().map(|builder| {
859-
builder.build(resource_cache,
860-
self.id,
861-
&self.pipeline_auxiliary_lists,
862-
&self.layers)
863-
});
811+
let frame = frame_builder.as_mut().map(|builder|
812+
builder.build(resource_cache, self.id, &self.layers, auxiliary_lists_map)
813+
);
864814
self.frame_builder = frame_builder;
865815

866816
let layers_bouncing_back = self.collect_layers_bouncing_back();

0 commit comments

Comments
 (0)