Skip to content

Commit 029f429

Browse files
committed
Bug 1971296: Make WebRender clip dirty rects and display rects to surface sizes. r=gw
This patch clamps dirty rects and display rects to surface sizes. This prevents native compositors -- specifically macOS -- from panicking that one or both of the rects is larger than the surface itself. Differential Revision: https://phabricator.services.mozilla.com/D254761
1 parent 373a02f commit 029f429

File tree

1 file changed

+27
-7
lines changed

1 file changed

+27
-7
lines changed

gfx/wr/webrender/src/frame_builder.rs

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use crate::gpu_types::{PrimitiveHeaders, TransformPalette, ZBufferIdGenerator};
1818
use crate::gpu_types::{QuadSegment, TransformData};
1919
use crate::internal_types::{FastHashMap, PlaneSplitter, FrameId, FrameStamp};
2020
use crate::picture::{DirtyRegion, SliceId, TileCacheInstance};
21-
use crate::picture::{SurfaceInfo, SurfaceIndex};
21+
use crate::picture::{SurfaceInfo, SurfaceIndex, ResolvedSurfaceTexture};
2222
use crate::picture::{SubpixelMode, RasterConfig, PictureCompositeMode};
2323
use crate::prepare::prepare_picture;
2424
use crate::prim_store::{PictureIndex, PrimitiveScratchBuffer};
@@ -1135,8 +1135,17 @@ pub fn build_render_pass(
11351135
match task.kind {
11361136
RenderTaskKind::Picture(ref pic_task) => {
11371137
let cmd_buffer = cmd_buffers.get(pic_task.cmd_buffer_index);
1138-
let scissor_rect = pic_task.scissor_rect.expect("bug: must be set for cache tasks");
1139-
let valid_rect = pic_task.valid_rect.expect("bug: must be set for cache tasks");
1138+
let mut dirty_rect = pic_task.scissor_rect.expect("bug: must be set for cache tasks");
1139+
let mut valid_rect = pic_task.valid_rect.expect("bug: must be set for cache tasks");
1140+
1141+
// If we have a surface size, clip the dirty and vaild rects
1142+
// to that size. This ensures that native compositors will
1143+
// pass sanity checks (Bug 1971296).
1144+
if let ResolvedSurfaceTexture::Native { size, .. } = surface {
1145+
let surface_size_rect = <DeviceIntRect>::from_size(*size);
1146+
dirty_rect = dirty_rect.intersection(&surface_size_rect).unwrap_or_default();
1147+
valid_rect = valid_rect.intersection(&surface_size_rect).unwrap_or_default();
1148+
}
11401149

11411150
let batcher = AlphaBatchBuilder::new(
11421151
screen_size,
@@ -1171,7 +1180,7 @@ pub fn build_render_pass(
11711180

11721181
let mut batch_containers = ctx.frame_memory.new_vec();
11731182
let mut alpha_batch_container = AlphaBatchContainer::new(
1174-
Some(scissor_rect),
1183+
Some(dirty_rect),
11751184
&ctx.frame_memory
11761185
);
11771186

@@ -1189,22 +1198,33 @@ pub fn build_render_pass(
11891198
kind: PictureCacheTargetKind::Draw {
11901199
alpha_batch_container,
11911200
},
1192-
dirty_rect: scissor_rect,
1201+
dirty_rect,
11931202
valid_rect,
11941203
};
11951204

11961205
pass.picture_cache.push(target);
11971206
}
11981207
RenderTaskKind::TileComposite(ref tile_task) => {
1208+
let mut dirty_rect = tile_task.scissor_rect;
1209+
let mut valid_rect = tile_task.valid_rect;
1210+
// If we have a surface size, clip the dirty and vaild rects
1211+
// to that size. This ensures that native compositors will
1212+
// pass sanity checks (Bug 1971296).
1213+
if let ResolvedSurfaceTexture::Native { size, .. } = surface {
1214+
let surface_size_rect = <DeviceIntRect>::from_size(*size);
1215+
dirty_rect = dirty_rect.intersection(&surface_size_rect).unwrap_or_default();
1216+
valid_rect = valid_rect.intersection(&surface_size_rect).unwrap_or_default();
1217+
}
1218+
11991219
let target = PictureCacheTarget {
12001220
surface: surface.clone(),
12011221
clear_color: Some(tile_task.clear_color),
12021222
kind: PictureCacheTargetKind::Blit {
12031223
task_id: tile_task.task_id.expect("bug: no source task_id set"),
12041224
sub_rect_offset: tile_task.sub_rect_offset,
12051225
},
1206-
dirty_rect: tile_task.scissor_rect,
1207-
valid_rect: tile_task.valid_rect,
1226+
dirty_rect,
1227+
valid_rect,
12081228
};
12091229

12101230
pass.picture_cache.push(target);

0 commit comments

Comments
 (0)