Skip to content

Commit ba51d8d

Browse files
author
bors-servo
authored
Auto merge of #1775 - kvark:group-ref, r=glennw
ClipScrollGroup reference & visibility This PR makes us properly ignore the primitive runs culled out by the clip-scroll tree hierarchy. Fixes #1751 r? @glennw <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/webrender/1775) <!-- Reviewable:end -->
2 parents 37622ba + f65ef32 commit ba51d8d

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) {
@@ -1574,8 +1572,8 @@ impl FrameBuilder {
15741572
&self,
15751573
clip_and_scroll: &ClipAndScrollInfo
15761574
) -> Option<PackedLayerIndex> {
1577-
let group_index = self.clip_scroll_group_indices.get(&clip_and_scroll).unwrap();
1578-
let clip_scroll_group = &self.clip_scroll_group_store[group_index.0];
1575+
let group_id = self.clip_scroll_group_indices[&clip_and_scroll];
1576+
let clip_scroll_group = &self.clip_scroll_group_store[group_id];
15791577
if clip_scroll_group.is_visible() {
15801578
Some(clip_scroll_group.packed_layer_index)
15811579
} else {
@@ -1665,22 +1663,22 @@ impl FrameBuilder {
16651663
screen_rect: &DeviceIntRect,
16661664
device_pixel_ratio: f32,
16671665
profile_counters: &mut FrameProfileCounters,
1668-
) {
1666+
) -> bool {
16691667
let stacking_context_index = *self.stacking_context_stack.last().unwrap();
16701668
let packed_layer_index =
16711669
match self.get_packed_layer_index_if_visible(&clip_and_scroll) {
16721670
Some(index) => index,
16731671
None => {
16741672
debug!("{:?} of invisible {:?}", base_prim_index, stacking_context_index);
1675-
return;
1673+
return false;
16761674
}
16771675
};
16781676

16791677
let pipeline_id = {
16801678
let stacking_context =
16811679
&mut self.stacking_context_store[stacking_context_index.0];
16821680
if !stacking_context.can_contribute_to_scene() {
1683-
return;
1681+
return false;
16841682
}
16851683

16861684
// At least one primitive in this stacking context is visible, so the stacking
@@ -1705,7 +1703,7 @@ impl FrameBuilder {
17051703
.display_list;
17061704

17071705
if !stacking_context.is_backface_visible && packed_layer.transform.is_backface_visible() {
1708-
return;
1706+
return false;
17091707
}
17101708

17111709
let prim_context = PrimitiveContext::new(
@@ -1720,7 +1718,11 @@ impl FrameBuilder {
17201718

17211719
let prim_context = match prim_context {
17221720
Some(prim_context) => prim_context,
1723-
None => return,
1721+
None => {
1722+
let group_id = self.clip_scroll_group_indices[&clip_and_scroll];
1723+
self.clip_scroll_group_store[group_id].screen_bounding_rect = None;
1724+
return false
1725+
},
17241726
};
17251727

17261728
debug!(
@@ -1752,6 +1754,8 @@ impl FrameBuilder {
17521754
profile_counters.visible_primitives.inc();
17531755
}
17541756
}
1757+
1758+
true //visible
17551759
}
17561760

17571761
fn handle_pop_stacking_context(&mut self, screen_rect: &DeviceIntRect) {
@@ -2254,10 +2258,10 @@ impl FrameBuilder {
22542258
continue;
22552259
}
22562260

2257-
let group_index = *self.clip_scroll_group_indices
2258-
.get(&clip_and_scroll)
2259-
.unwrap();
2260-
if self.clip_scroll_group_store[group_index.0]
2261+
let group_id = self.clip_scroll_group_indices[&clip_and_scroll];
2262+
let group_index = ClipScrollGroupIndex(group_id, clip_and_scroll);
2263+
2264+
if self.clip_scroll_group_store[group_id]
22612265
.screen_bounding_rect
22622266
.is_none()
22632267
{

0 commit comments

Comments
 (0)