Skip to content

Commit 4ba3493

Browse files
committed
Avoid resolving the clip every frame
1 parent 01517a2 commit 4ba3493

File tree

1 file changed

+30
-28
lines changed

1 file changed

+30
-28
lines changed

webrender/src/prim_store.rs

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -394,12 +394,11 @@ impl PrimitiveStore {
394394
local_clip_rect: clip.main.clone(),
395395
});
396396

397-
let (clip_index, clip_source) = if clip.is_complex() {
398-
(Some(self.gpu_data32.alloc(6)),
399-
Box::new(PrimitiveClipSource::Region(clip.clone())))
397+
let clip_source = Box::new(if clip.is_complex() {
398+
PrimitiveClipSource::Region(clip.clone())
400399
} else {
401-
(None, Box::new(PrimitiveClipSource::NoClip))
402-
};
400+
PrimitiveClipSource::NoClip
401+
});
403402

404403
let metadata = match container {
405404
PrimitiveContainer::Rectangle(rect) => {
@@ -409,7 +408,7 @@ impl PrimitiveStore {
409408
let metadata = PrimitiveMetadata {
410409
is_opaque: is_opaque,
411410
mask_texture_id: TextureId::invalid(),
412-
clip_index: clip_index,
411+
clip_index: None,
413412
clip_source: clip_source,
414413
prim_kind: PrimitiveKind::Rectangle,
415414
cpu_prim_index: SpecificPrimitiveIndex::invalid(),
@@ -428,7 +427,7 @@ impl PrimitiveStore {
428427
let metadata = PrimitiveMetadata {
429428
is_opaque: false,
430429
mask_texture_id: TextureId::invalid(),
431-
clip_index: clip_index,
430+
clip_index: None,
432431
clip_source: clip_source,
433432
prim_kind: PrimitiveKind::TextRun,
434433
cpu_prim_index: SpecificPrimitiveIndex(self.cpu_text_runs.len()),
@@ -447,7 +446,7 @@ impl PrimitiveStore {
447446
let metadata = PrimitiveMetadata {
448447
is_opaque: false,
449448
mask_texture_id: TextureId::invalid(),
450-
clip_index: clip_index,
449+
clip_index: None,
451450
clip_source: clip_source,
452451
prim_kind: PrimitiveKind::Image,
453452
cpu_prim_index: SpecificPrimitiveIndex(self.cpu_images.len()),
@@ -466,7 +465,7 @@ impl PrimitiveStore {
466465
let metadata = PrimitiveMetadata {
467466
is_opaque: false,
468467
mask_texture_id: TextureId::invalid(),
469-
clip_index: clip_index,
468+
clip_index: None,
470469
clip_source: clip_source,
471470
prim_kind: PrimitiveKind::Border,
472471
cpu_prim_index: SpecificPrimitiveIndex(self.cpu_borders.len()),
@@ -486,7 +485,7 @@ impl PrimitiveStore {
486485
let metadata = PrimitiveMetadata {
487486
is_opaque: false,
488487
mask_texture_id: TextureId::invalid(),
489-
clip_index: clip_index,
488+
clip_index: None,
490489
clip_source: clip_source,
491490
prim_kind: PrimitiveKind::Gradient,
492491
cpu_prim_index: SpecificPrimitiveIndex(self.cpu_gradients.len()),
@@ -524,7 +523,7 @@ impl PrimitiveStore {
524523
let metadata = PrimitiveMetadata {
525524
is_opaque: false,
526525
mask_texture_id: TextureId::invalid(),
527-
clip_index: clip_index,
526+
clip_index: None,
528527
clip_source: clip_source,
529528
prim_kind: PrimitiveKind::BoxShadow,
530529
cpu_prim_index: SpecificPrimitiveIndex::invalid(),
@@ -679,42 +678,45 @@ impl PrimitiveStore {
679678
let metadata = &mut self.cpu_metadata[prim_index.0];
680679
let mut prim_needs_resolve = false;
681680
let mut rebuild_bounding_rect = false;
682-
if let &PrimitiveClipSource::Region(ClipRegion { image_mask: Some(mask), .. }) = metadata.clip_source.as_ref() {
683-
resource_cache.request_image(mask.image, ImageRendering::Auto);
684-
prim_needs_resolve = true;
685-
}
686-
if let Some(gpu_address) = metadata.clip_index {
681+
682+
if metadata.clip_index.is_none() {
683+
// if the `clip_index` already exist, we consider the contents up to date
687684
let clip_data = match metadata.clip_source.as_ref() {
688-
&PrimitiveClipSource::NoClip => {
689-
let local_rect = self.gpu_geometry.get(GpuStoreAddress(prim_index.0 as i32))
690-
.local_clip_rect;
691-
ClipData::uniform(local_rect, 0.0)
692-
}
685+
&PrimitiveClipSource::NoClip => None,
693686
&PrimitiveClipSource::Complex(rect, radius) => {
694-
ClipData::uniform(rect, radius)
687+
Some(ClipData::uniform(rect, radius))
695688
}
696689
&PrimitiveClipSource::Region(ref clip_region) => {
690+
if let Some(mask) = clip_region.image_mask {
691+
resource_cache.request_image(mask.image, ImageRendering::Auto);
692+
}
697693
let clips = auxiliary_lists.complex_clip_regions(&clip_region.complex);
698694
//TODO: proper solution to multiple complex clips
699695
match clips.len() {
700-
0 => ClipData::uniform(clip_region.main, 0.0),
701-
1 => ClipData::from_clip_region(&clips[0]),
696+
0 if clip_region.image_mask.is_none() => None,
697+
0 => Some(ClipData::uniform(clip_region.main, 0.0)),
698+
1 => Some(ClipData::from_clip_region(&clips[0])),
702699
_ => {
703700
let internal_clip = clips.last().unwrap();
704701
let region = if clips.iter().all(|current_clip| current_clip.might_contain(internal_clip)) {
705702
internal_clip
706703
} else {
707704
&clips[0]
708705
};
709-
ClipData::from_clip_region(region)
706+
Some(ClipData::from_clip_region(region))
710707
},
711708
}
712709
}
713710
};
714711

715-
metadata.mask_texture_id = dummy_mask_cache_item.texture_id;
716-
let gpu_data = self.gpu_data32.get_slice_mut(gpu_address, 6);
717-
Self::populate_clip_data(gpu_data, clip_data);
712+
if let Some(data) = clip_data {
713+
prim_needs_resolve = true;
714+
let gpu_address = self.gpu_data32.alloc(6);
715+
let gpu_data = self.gpu_data32.get_slice_mut(gpu_address, 6);
716+
Self::populate_clip_data(gpu_data, data);
717+
metadata.clip_index = Some(gpu_address);
718+
metadata.mask_texture_id = dummy_mask_cache_item.texture_id;
719+
}
718720
}
719721

720722
match metadata.prim_kind {

0 commit comments

Comments
 (0)