@@ -11,16 +11,15 @@ use internal_types::{CompositionOp};
11
11
use internal_types:: { LowLevelFilterOp } ;
12
12
use internal_types:: { RendererFrame } ;
13
13
use layer:: { Layer , ScrollingState } ;
14
- use prim_store:: ClipInfo ;
15
14
use resource_cache:: { DummyResources , ResourceCache } ;
16
15
use scene:: { SceneStackingContext , ScenePipeline , Scene , SceneItem , SpecificSceneItem } ;
17
16
use std:: collections:: { HashMap , HashSet } ;
18
17
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 } ;
21
20
use util:: MatrixHelpers ;
22
21
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 } ;
24
23
use webrender_traits:: { ScrollEventPhase , ScrollLayerInfo , SpecificDisplayItem , ScrollLayerState } ;
25
24
26
25
#[ 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
36
35
37
36
struct FlattenContext < ' a > {
38
37
resource_cache : & ' a mut ResourceCache ,
39
- dummy_resources : & ' a DummyResources ,
40
38
scene : & ' a Scene ,
41
39
pipeline_sizes : & ' a mut HashMap < PipelineId , Size2D < f32 > > ,
42
40
builder : & ' a mut FrameBuilder ,
@@ -53,15 +51,10 @@ struct FlattenInfo {
53
51
layer_relative_transform : Matrix4D < f32 > ,
54
52
}
55
53
56
- pub type LayerMap = HashMap < ScrollLayerId , Layer , BuildHasherDefault < FnvHasher > > ;
57
-
58
54
// TODO: doc
59
55
pub struct Frame {
60
56
pub layers : LayerMap ,
61
57
pub pipeline_epoch_map : HashMap < PipelineId , Epoch , BuildHasherDefault < FnvHasher > > ,
62
- pub pipeline_auxiliary_lists : HashMap < PipelineId ,
63
- AuxiliaryLists ,
64
- BuildHasherDefault < FnvHasher > > ,
65
58
pub root_scroll_layer_id : Option < ScrollLayerId > ,
66
59
id : FrameId ,
67
60
debug : bool ,
@@ -197,7 +190,6 @@ impl Frame {
197
190
pub fn new ( debug : bool , config : FrameBuilderConfig ) -> Frame {
198
191
Frame {
199
192
pipeline_epoch_map : HashMap :: with_hasher ( Default :: default ( ) ) ,
200
- pipeline_auxiliary_lists : HashMap :: with_hasher ( Default :: default ( ) ) ,
201
193
layers : HashMap :: with_hasher ( Default :: default ( ) ) ,
202
194
root_scroll_layer_id : None ,
203
195
id : FrameId ( 0 ) ,
@@ -378,8 +370,6 @@ impl Frame {
378
370
if let Some ( root_pipeline) = scene. pipeline_map . get ( & root_pipeline_id) {
379
371
let old_layer_scrolling_states = self . reset ( ) ;
380
372
381
- self . pipeline_auxiliary_lists = scene. pipeline_auxiliary_lists . clone ( ) ;
382
-
383
373
let root_stacking_context = scene. stacking_context_map
384
374
. get ( & root_pipeline. root_stacking_context_id )
385
375
. unwrap ( ) ;
@@ -409,15 +399,21 @@ impl Frame {
409
399
410
400
// Work around borrow check on resource cache
411
401
{
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
+ } ;
412
407
let mut frame_builder = FrameBuilder :: new ( root_pipeline. viewport_size ,
413
408
device_pixel_ratio,
409
+ dummy_mask_source,
414
410
self . debug ,
411
+ scene. pipeline_auxiliary_lists . clone ( ) ,
415
412
self . frame_builder_config ) ;
416
413
417
414
{
418
415
let mut context = FlattenContext {
419
416
resource_cache : resource_cache,
420
- dummy_resources : dummy_resources,
421
417
scene : scene,
422
418
pipeline_sizes : pipeline_sizes,
423
419
builder : & mut frame_builder,
@@ -482,9 +478,7 @@ impl Frame {
482
478
}
483
479
484
480
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) ;
488
482
stacking_context. composition_operations ( auxiliary_lists)
489
483
} ;
490
484
@@ -525,6 +519,7 @@ impl Frame {
525
519
scroll_layer_id,
526
520
& composition_operations) ;
527
521
522
+ let aux_pipeline_id = parent_info. pipeline_id ;
528
523
if level == 0 {
529
524
// Add a large white rectangle as the root display item. This is removed
530
525
// by the occlusion culling for most tiles, and means that it's no longer
@@ -538,76 +533,39 @@ impl Frame {
538
533
//
539
534
// If we do need this, does it make sense to keep Frame::clear_tiles?
540
535
context. builder . add_solid_rectangle ( & stacking_context. bounds ,
541
- & stacking_context. bounds ,
542
- None ,
536
+ & ClipRegion :: simple ( & stacking_context. bounds ) ,
537
+ aux_pipeline_id ,
543
538
& ColorF :: new ( 1.0 , 1.0 , 1.0 , 1.0 ) ,
544
539
PrimitiveFlags :: None ) ;
545
540
}
546
541
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
-
553
542
for item in scene_items {
554
543
match item. specific {
555
544
SpecificSceneItem :: DrawList ( draw_list_id) => {
556
545
let draw_list = context. resource_cache . get_draw_list ( draw_list_id) ;
557
546
let builder = & mut context. builder ;
558
- let auxiliary_lists = self . pipeline_auxiliary_lists
559
- . get ( & parent_info. pipeline_id )
560
- . expect ( "No auxiliary lists?!" ) ;
561
547
562
548
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
-
591
549
match item. item {
592
550
SpecificDisplayItem :: WebGL ( ref info) => {
593
551
builder. add_webgl_rectangle ( item. rect ,
594
- & item. clip . main ,
595
- clip ,
552
+ & item. clip ,
553
+ aux_pipeline_id ,
596
554
info. context_id ) ;
597
555
}
598
556
SpecificDisplayItem :: Image ( ref info) => {
599
557
builder. add_image ( item. rect ,
600
- & item. clip . main ,
601
- clip ,
558
+ & item. clip ,
559
+ aux_pipeline_id ,
602
560
& info. stretch_size ,
603
561
& info. tile_spacing ,
604
562
info. image_key ,
605
563
info. image_rendering ) ;
606
564
}
607
565
SpecificDisplayItem :: Text ( ref text_info) => {
608
566
builder. add_text ( item. rect ,
609
- & item. clip . main ,
610
- clip ,
567
+ & item. clip ,
568
+ aux_pipeline_id ,
611
569
text_info. font_key ,
612
570
text_info. size ,
613
571
text_info. blur_radius ,
@@ -616,23 +574,23 @@ impl Frame {
616
574
}
617
575
SpecificDisplayItem :: Rectangle ( ref info) => {
618
576
builder. add_solid_rectangle ( & item. rect ,
619
- & item. clip . main ,
620
- clip ,
577
+ & item. clip ,
578
+ aux_pipeline_id ,
621
579
& info. color ,
622
580
PrimitiveFlags :: None ) ;
623
581
}
624
582
SpecificDisplayItem :: Gradient ( ref info) => {
625
583
builder. add_gradient ( item. rect ,
626
- & item. clip . main ,
627
- clip ,
584
+ & item. clip ,
585
+ aux_pipeline_id ,
628
586
info. start_point ,
629
587
info. end_point ,
630
588
info. stops ) ;
631
589
}
632
590
SpecificDisplayItem :: BoxShadow ( ref box_shadow_info) => {
633
591
builder. add_box_shadow ( & box_shadow_info. box_bounds ,
634
- & item. clip . main ,
635
- clip ,
592
+ & item. clip ,
593
+ aux_pipeline_id ,
636
594
& box_shadow_info. offset ,
637
595
& box_shadow_info. color ,
638
596
box_shadow_info. blur_radius ,
@@ -642,8 +600,8 @@ impl Frame {
642
600
}
643
601
SpecificDisplayItem :: Border ( ref info) => {
644
602
builder. add_border ( item. rect ,
645
- & item. clip . main ,
646
- clip ,
603
+ & item. clip ,
604
+ aux_pipeline_id ,
647
605
info) ;
648
606
}
649
607
}
@@ -762,8 +720,8 @@ impl Frame {
762
720
let scrollbar_rect = Rect :: new ( Point2D :: zero ( ) ,
763
721
Size2D :: new ( 10.0 , 70.0 ) ) ;
764
722
context. builder . add_solid_rectangle ( & scrollbar_rect,
765
- & scrollbar_rect,
766
- None ,
723
+ & ClipRegion :: simple ( & scrollbar_rect) ,
724
+ aux_pipeline_id ,
767
725
& DEFAULT_SCROLLBAR_COLOR ,
768
726
PrimitiveFlags :: Scrollbar ( self . root_scroll_layer_id . unwrap ( ) ,
769
727
4.0 ) ) ;
@@ -852,13 +810,11 @@ impl Frame {
852
810
}
853
811
}
854
812
855
- fn build_frame ( & mut self ,
856
- resource_cache : & mut ResourceCache ) -> RendererFrame {
813
+ fn build_frame ( & mut self , resource_cache : & mut ResourceCache ) -> RendererFrame {
857
814
let mut frame_builder = self . frame_builder . take ( ) ;
858
815
let frame = frame_builder. as_mut ( ) . map ( |builder| {
859
816
builder. build ( resource_cache,
860
817
self . id ,
861
- & self . pipeline_auxiliary_lists ,
862
818
& self . layers )
863
819
} ) ;
864
820
self . frame_builder = frame_builder;
0 commit comments