@@ -18,7 +18,7 @@ use crate::gpu_types::{PrimitiveHeaders, TransformPalette, ZBufferIdGenerator};
1818use crate :: gpu_types:: { QuadSegment , TransformData } ;
1919use crate :: internal_types:: { FastHashMap , PlaneSplitter , FrameId , FrameStamp } ;
2020use crate :: picture:: { DirtyRegion , SliceId , TileCacheInstance } ;
21- use crate :: picture:: { SurfaceInfo , SurfaceIndex } ;
21+ use crate :: picture:: { SurfaceInfo , SurfaceIndex , ResolvedSurfaceTexture } ;
2222use crate :: picture:: { SubpixelMode , RasterConfig , PictureCompositeMode } ;
2323use crate :: prepare:: prepare_picture;
2424use 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