Skip to content

Commit f65ef32

Browse files
committed
better ClipScrollGroup visibility
1 parent e4c846a commit f65ef32

File tree

1 file changed

+29
-25
lines changed

1 file changed

+29
-25
lines changed

webrender/src/frame_builder.rs

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,9 @@ pub struct FrameBuilder {
9494

9595
stacking_context_store: Vec<StackingContext>,
9696
clip_scroll_group_store: Vec<ClipScrollGroup>,
97-
clip_scroll_group_indices: FastHashMap<ClipAndScrollInfo, ClipScrollGroupIndex>,
97+
// Note: value here is meant to be `ClipScrollGroupIndex`,
98+
// but we already have `ClipAndScrollInfo` in the key
99+
clip_scroll_group_indices: FastHashMap<ClipAndScrollInfo, usize>,
98100
packed_layers: Vec<PackedLayer>,
99101

100102
// A stack of the current text-shadow primitives.
@@ -136,7 +138,8 @@ impl<'a> PrimitiveContext<'a> {
136138
screen_rect: &DeviceIntRect,
137139
clip_scroll_tree: &ClipScrollTree,
138140
clip_store: &ClipStore,
139-
device_pixel_ratio: f32) -> Option<Self> {
141+
device_pixel_ratio: f32,
142+
) -> Option<Self> {
140143

141144
let mut current_clip_stack = Vec::new();
142145
let mut clip_bounds = *screen_rect;
@@ -242,15 +245,6 @@ impl FrameBuilder {
242245
}
243246
}
244247

245-
pub fn create_clip_scroll_group_if_necessary(&mut self, info: ClipAndScrollInfo) {
246-
if self.clip_scroll_group_indices.contains_key(&info) {
247-
return;
248-
}
249-
250-
let group_index = self.create_clip_scroll_group(info);
251-
self.clip_scroll_group_indices.insert(info, group_index);
252-
}
253-
254248
/// Create a primitive and add it to the prim store. This method doesn't
255249
/// add the primitive to the draw list, so can be used for creating
256250
/// sub-primitives.
@@ -261,7 +255,10 @@ impl FrameBuilder {
261255
mut clip_sources: Vec<ClipSource>,
262256
container: PrimitiveContainer,
263257
) -> PrimitiveIndex {
264-
self.create_clip_scroll_group_if_necessary(clip_and_scroll);
258+
if !self.clip_scroll_group_indices.contains_key(&clip_and_scroll) {
259+
let group_id = self.create_clip_scroll_group(&clip_and_scroll);
260+
self.clip_scroll_group_indices.insert(clip_and_scroll, group_id);
261+
}
265262

266263
if let &LocalClip::RoundedRect(main, region) = &info.local_clip {
267264
clip_sources.push(ClipSource::Rectangle(main));
@@ -352,18 +349,19 @@ impl FrameBuilder {
352349
prim_index
353350
}
354351

355-
pub fn create_clip_scroll_group(&mut self, info: ClipAndScrollInfo) -> ClipScrollGroupIndex {
352+
fn create_clip_scroll_group(&mut self, info: &ClipAndScrollInfo) -> usize {
356353
let packed_layer_index = PackedLayerIndex(self.packed_layers.len());
357354
self.packed_layers.push(PackedLayer::empty());
358355

356+
let group_id = self.clip_scroll_group_store.len();
359357
self.clip_scroll_group_store.push(ClipScrollGroup {
360358
scroll_node_id: info.scroll_node_id,
361359
clip_node_id: info.clip_node_id(),
362360
packed_layer_index,
363361
screen_bounding_rect: None,
364362
});
365363

366-
ClipScrollGroupIndex(self.clip_scroll_group_store.len() - 1, info)
364+
group_id
367365
}
368366

369367
pub fn notify_waiting_for_root_stacking_context(&mut self) {
@@ -1551,8 +1549,8 @@ impl FrameBuilder {
15511549
&self,
15521550
clip_and_scroll: &ClipAndScrollInfo
15531551
) -> Option<PackedLayerIndex> {
1554-
let group_index = self.clip_scroll_group_indices.get(&clip_and_scroll).unwrap();
1555-
let clip_scroll_group = &self.clip_scroll_group_store[group_index.0];
1552+
let group_id = self.clip_scroll_group_indices[&clip_and_scroll];
1553+
let clip_scroll_group = &self.clip_scroll_group_store[group_id];
15561554
if clip_scroll_group.is_visible() {
15571555
Some(clip_scroll_group.packed_layer_index)
15581556
} else {
@@ -1642,22 +1640,22 @@ impl FrameBuilder {
16421640
screen_rect: &DeviceIntRect,
16431641
device_pixel_ratio: f32,
16441642
profile_counters: &mut FrameProfileCounters,
1645-
) {
1643+
) -> bool {
16461644
let stacking_context_index = *self.stacking_context_stack.last().unwrap();
16471645
let packed_layer_index =
16481646
match self.get_packed_layer_index_if_visible(&clip_and_scroll) {
16491647
Some(index) => index,
16501648
None => {
16511649
debug!("{:?} of invisible {:?}", base_prim_index, stacking_context_index);
1652-
return;
1650+
return false;
16531651
}
16541652
};
16551653

16561654
let pipeline_id = {
16571655
let stacking_context =
16581656
&mut self.stacking_context_store[stacking_context_index.0];
16591657
if !stacking_context.can_contribute_to_scene() {
1660-
return;
1658+
return false;
16611659
}
16621660

16631661
// At least one primitive in this stacking context is visible, so the stacking
@@ -1682,7 +1680,7 @@ impl FrameBuilder {
16821680
.display_list;
16831681

16841682
if !stacking_context.is_backface_visible && packed_layer.transform.is_backface_visible() {
1685-
return;
1683+
return false;
16861684
}
16871685

16881686
let prim_context = PrimitiveContext::new(
@@ -1697,7 +1695,11 @@ impl FrameBuilder {
16971695

16981696
let prim_context = match prim_context {
16991697
Some(prim_context) => prim_context,
1700-
None => return,
1698+
None => {
1699+
let group_id = self.clip_scroll_group_indices[&clip_and_scroll];
1700+
self.clip_scroll_group_store[group_id].screen_bounding_rect = None;
1701+
return false
1702+
},
17011703
};
17021704

17031705
debug!(
@@ -1729,6 +1731,8 @@ impl FrameBuilder {
17291731
profile_counters.visible_primitives.inc();
17301732
}
17311733
}
1734+
1735+
true //visible
17321736
}
17331737

17341738
fn handle_pop_stacking_context(&mut self, screen_rect: &DeviceIntRect) {
@@ -2231,10 +2235,10 @@ impl FrameBuilder {
22312235
continue;
22322236
}
22332237

2234-
let group_index = *self.clip_scroll_group_indices
2235-
.get(&clip_and_scroll)
2236-
.unwrap();
2237-
if self.clip_scroll_group_store[group_index.0]
2238+
let group_id = self.clip_scroll_group_indices[&clip_and_scroll];
2239+
let group_index = ClipScrollGroupIndex(group_id, clip_and_scroll);
2240+
2241+
if self.clip_scroll_group_store[group_id]
22382242
.screen_bounding_rect
22392243
.is_none()
22402244
{

0 commit comments

Comments
 (0)