@@ -13,22 +13,24 @@ use msg::constellation_msg::PipelineId;
13
13
use script_traits:: compositor:: { CompositorDisplayListInfo , ScrollTreeNodeId , ScrollableNodeInfo } ;
14
14
use webrender_api:: units:: { LayoutPoint , LayoutSize , LayoutVector2D } ;
15
15
use webrender_api:: {
16
- self , ClipId , CommonItemProperties , DisplayItem as WrDisplayItem , DisplayListBuilder , Epoch ,
17
- PrimitiveFlags , PropertyBinding , PushStackingContextDisplayItem , RasterSpace ,
18
- ReferenceFrameKind , SpaceAndClipInfo , SpatialId , StackingContext ,
16
+ self , ClipChainId , ClipId , CommonItemProperties , DisplayItem as WrDisplayItem ,
17
+ DisplayListBuilder , Epoch , PrimitiveFlags , PropertyBinding , PushStackingContextDisplayItem ,
18
+ RasterSpace , ReferenceFrameKind , SpaceAndClipInfo , SpatialId , StackingContext ,
19
19
} ;
20
20
21
- struct ClipScrollState {
22
- clip_ids : Vec < Option < ClipId > > ,
23
- scroll_node_ids : Vec < Option < ScrollTreeNodeId > > ,
21
+ struct ClipScrollState < ' a > {
22
+ clip_scroll_nodes : & ' a mut Vec < ClipScrollNode > ,
24
23
compositor_info : CompositorDisplayListInfo ,
25
24
}
26
25
27
- impl ClipScrollState {
28
- fn new ( size : usize , compositor_info : CompositorDisplayListInfo ) -> Self {
26
+ impl < ' a > ClipScrollState < ' a > {
27
+ fn new (
28
+ clip_scroll_nodes : & ' a mut Vec < ClipScrollNode > ,
29
+ compositor_info : CompositorDisplayListInfo ,
30
+ builder : & mut DisplayListBuilder ,
31
+ ) -> Self {
29
32
let mut state = ClipScrollState {
30
- clip_ids : vec ! [ None ; size] ,
31
- scroll_node_ids : vec ! [ None ; size] ,
33
+ clip_scroll_nodes,
32
34
compositor_info,
33
35
} ;
34
36
@@ -37,32 +39,38 @@ impl ClipScrollState {
37
39
// automatically. We also follow the "old" WebRender API for clip/scroll for now,
38
40
// hence both arrays are initialized based on FIRST_SPATIAL_NODE_INDEX, while
39
41
// FIRST_CLIP_NODE_INDEX is not taken into account.
40
- state. scroll_node_ids [ 0 ] = Some ( state. compositor_info . root_reference_frame_id ) ;
41
- state. scroll_node_ids [ 1 ] = Some ( state. compositor_info . root_scroll_node_id ) ;
42
+ state. clip_scroll_nodes [ 0 ] . scroll_node_id =
43
+ Some ( state. compositor_info . root_reference_frame_id ) ;
44
+ state. clip_scroll_nodes [ 1 ] . scroll_node_id = Some ( state. compositor_info . root_scroll_node_id ) ;
42
45
43
- let root_clip_id = ClipId :: root ( state. compositor_info . pipeline_id ) ;
44
- state. add_clip_node_mapping ( 0 , root_clip_id) ;
45
- state. add_clip_node_mapping ( 1 , root_clip_id) ;
46
+ let root_clip_chain =
47
+ builder. define_clip_chain ( None , [ ClipId :: root ( state. compositor_info . pipeline_id ) ] ) ;
48
+ state. add_clip_node_mapping ( 0 , root_clip_chain) ;
49
+ state. add_clip_node_mapping ( 1 , root_clip_chain) ;
46
50
47
51
state
48
52
}
49
53
50
- fn webrender_clip_id_for_index ( & mut self , index : usize ) -> ClipId {
51
- self . clip_ids [ index] . expect ( "Tried to use WebRender parent ClipId before it was defined." )
54
+ fn webrender_clip_id_for_index ( & mut self , index : usize ) -> ClipChainId {
55
+ self . clip_scroll_nodes [ index]
56
+ . clip_chain_id
57
+ . expect ( "Tried to access WebRender ClipId before definining it." )
52
58
}
53
59
54
60
fn webrender_spatial_id_for_index ( & mut self , index : usize ) -> SpatialId {
55
- self . scroll_node_ids [ index]
61
+ self . clip_scroll_nodes [ index]
62
+ . scroll_node_id
56
63
. expect ( "Tried to use WebRender parent SpatialId before it was defined." )
57
64
. spatial_id
58
65
}
59
66
60
- fn add_clip_node_mapping ( & mut self , index : usize , webrender_id : ClipId ) {
61
- self . clip_ids [ index] = Some ( webrender_id) ;
67
+ fn add_clip_node_mapping ( & mut self , index : usize , webrender_id : ClipChainId ) {
68
+ self . clip_scroll_nodes [ index] . clip_chain_id = Some ( webrender_id) ;
62
69
}
63
70
64
71
fn scroll_node_id_from_index ( & self , index : usize ) -> ScrollTreeNodeId {
65
- self . scroll_node_ids [ index]
72
+ self . clip_scroll_nodes [ index]
73
+ . scroll_node_id
66
74
. expect ( "Tried to use WebRender parent SpatialId before it was defined." )
67
75
}
68
76
@@ -74,15 +82,17 @@ impl ClipScrollState {
74
82
scroll_info : Option < ScrollableNodeInfo > ,
75
83
) {
76
84
let parent_scroll_node_id = parent_index. map ( |index| self . scroll_node_id_from_index ( index) ) ;
77
- self . scroll_node_ids [ index] = Some ( self . compositor_info . scroll_tree . add_scroll_tree_node (
78
- parent_scroll_node_id. as_ref ( ) ,
79
- spatial_id,
80
- scroll_info,
81
- ) ) ;
85
+ self . clip_scroll_nodes [ index] . scroll_node_id =
86
+ Some ( self . compositor_info . scroll_tree . add_scroll_tree_node (
87
+ parent_scroll_node_id. as_ref ( ) ,
88
+ spatial_id,
89
+ scroll_info,
90
+ ) ) ;
82
91
}
83
92
84
93
fn add_spatial_node_mapping_to_parent_index ( & mut self , index : usize , parent_index : usize ) {
85
- self . scroll_node_ids [ index] = self . scroll_node_ids [ parent_index] ;
94
+ self . clip_scroll_nodes [ index] . scroll_node_id =
95
+ self . clip_scroll_nodes [ parent_index] . scroll_node_id
86
96
}
87
97
}
88
98
@@ -100,27 +110,22 @@ impl DisplayList {
100
110
epoch : Epoch ,
101
111
) -> ( DisplayListBuilder , CompositorDisplayListInfo , IsContentful ) {
102
112
let webrender_pipeline = pipeline_id. to_webrender ( ) ;
103
- let mut state = ClipScrollState :: new (
104
- self . clip_scroll_nodes . len ( ) ,
105
- CompositorDisplayListInfo :: new (
106
- viewport_size,
107
- self . bounds ( ) . size ,
108
- webrender_pipeline,
109
- epoch,
110
- ) ,
111
- ) ;
112
-
113
113
let mut builder = DisplayListBuilder :: with_capacity (
114
114
webrender_pipeline,
115
115
self . bounds ( ) . size ,
116
116
1024 * 1024 , // 1 MB of space
117
117
) ;
118
118
119
+ let content_size = self . bounds ( ) . size ;
120
+ let mut state = ClipScrollState :: new (
121
+ & mut self . clip_scroll_nodes ,
122
+ CompositorDisplayListInfo :: new ( viewport_size, content_size, webrender_pipeline, epoch) ,
123
+ & mut builder,
124
+ ) ;
125
+
119
126
let mut is_contentful = IsContentful ( false ) ;
120
127
for item in & mut self . list {
121
- is_contentful. 0 |= item
122
- . convert_to_webrender ( & self . clip_scroll_nodes , & mut state, & mut builder)
123
- . 0 ;
128
+ is_contentful. 0 |= item. convert_to_webrender ( & mut state, & mut builder) . 0 ;
124
129
}
125
130
126
131
( builder, state. compositor_info , is_contentful)
@@ -130,7 +135,6 @@ impl DisplayList {
130
135
impl DisplayItem {
131
136
fn convert_to_webrender (
132
137
& mut self ,
133
- clip_scroll_nodes : & [ ClipScrollNode ] ,
134
138
state : & mut ClipScrollState ,
135
139
builder : & mut DisplayListBuilder ,
136
140
) -> IsContentful {
@@ -165,7 +169,7 @@ impl DisplayItem {
165
169
CommonItemProperties {
166
170
clip_rect : base. clip_rect ,
167
171
spatial_id : current_scroll_node_id. spatial_id ,
168
- clip_id : current_clip_id,
172
+ clip_id : ClipId :: ClipChain ( current_clip_id) ,
169
173
// TODO(gw): Make use of the WR backface visibility functionality.
170
174
flags : PrimitiveFlags :: default ( ) ,
171
175
hit_info : tag,
@@ -339,48 +343,54 @@ impl DisplayItem {
339
343
} ,
340
344
DisplayItem :: DefineClipScrollNode ( ref mut item) => {
341
345
let index = item. node_index . to_index ( ) ;
342
- let node = & clip_scroll_nodes[ index] ;
346
+ let node = state . clip_scroll_nodes [ index] . clone ( ) ;
343
347
let item_rect = node. clip . main ;
344
348
345
349
let parent_index = node. parent_index . to_index ( ) ;
346
350
let parent_spatial_id = state. webrender_spatial_id_for_index ( parent_index) ;
347
- let parent_clip_id = state. webrender_clip_id_for_index ( parent_index) ;
351
+ let parent_clip_chain_id = state. webrender_clip_id_for_index ( parent_index) ;
352
+
353
+ let parent_space_and_clip_info = SpaceAndClipInfo {
354
+ clip_id : ClipId :: root ( state. compositor_info . pipeline_id ) ,
355
+ spatial_id : parent_spatial_id,
356
+ } ;
348
357
349
358
match node. node_type {
350
359
ClipScrollNodeType :: Clip ( clip_type) => {
351
- let space_and_clip_info = SpaceAndClipInfo {
352
- clip_id : parent_clip_id,
353
- spatial_id : parent_spatial_id,
354
- } ;
355
360
let clip_id = match clip_type {
356
361
ClipType :: Rect => {
357
- builder. define_clip_rect ( & space_and_clip_info, item_rect)
358
- } ,
359
- ClipType :: Rounded ( complex) => {
360
- builder. define_clip_rounded_rect ( & space_and_clip_info, complex)
362
+ builder. define_clip_rect ( & parent_space_and_clip_info, item_rect)
361
363
} ,
364
+ ClipType :: Rounded ( complex) => builder
365
+ . define_clip_rounded_rect ( & parent_space_and_clip_info, complex) ,
362
366
} ;
363
367
364
- state. add_clip_node_mapping ( index, clip_id) ;
368
+ let clip_chain_id =
369
+ builder. define_clip_chain ( Some ( parent_clip_chain_id) , [ clip_id] ) ;
370
+ state. add_clip_node_mapping ( index, clip_chain_id) ;
365
371
state. add_spatial_node_mapping_to_parent_index ( index, parent_index) ;
366
372
} ,
367
373
ClipScrollNodeType :: ScrollFrame ( scroll_sensitivity, external_id) => {
368
- let space_clip_info = builder. define_scroll_frame (
369
- & SpaceAndClipInfo {
370
- clip_id : parent_clip_id,
371
- spatial_id : parent_spatial_id,
372
- } ,
373
- Some ( external_id) ,
374
- node. content_rect ,
375
- item_rect,
376
- scroll_sensitivity,
377
- LayoutVector2D :: zero ( ) ,
378
- ) ;
374
+ let clip_id =
375
+ builder. define_clip_rect ( & parent_space_and_clip_info, item_rect) ;
376
+ let clip_chain_id =
377
+ builder. define_clip_chain ( Some ( parent_clip_chain_id) , [ clip_id] ) ;
378
+ state. add_clip_node_mapping ( index, clip_chain_id) ;
379
+
380
+ let spatial_id = builder
381
+ . define_scroll_frame (
382
+ & parent_space_and_clip_info,
383
+ Some ( external_id) ,
384
+ node. content_rect ,
385
+ item_rect,
386
+ scroll_sensitivity,
387
+ LayoutVector2D :: zero ( ) ,
388
+ )
389
+ . spatial_id ;
379
390
380
- state. add_clip_node_mapping ( index, space_clip_info. clip_id ) ;
381
391
state. register_spatial_node (
382
392
index,
383
- space_clip_info . spatial_id ,
393
+ spatial_id,
384
394
Some ( parent_index) ,
385
395
Some ( ScrollableNodeInfo {
386
396
external_id,
@@ -401,7 +411,7 @@ impl DisplayItem {
401
411
LayoutVector2D :: zero ( ) ,
402
412
) ;
403
413
404
- state. add_clip_node_mapping ( index, parent_clip_id ) ;
414
+ state. add_clip_node_mapping ( index, parent_clip_chain_id ) ;
405
415
state. register_spatial_node ( index, id, Some ( current_scrolling_index) , None ) ;
406
416
} ,
407
417
ClipScrollNodeType :: Placeholder => {
0 commit comments