tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 270a3076718ab271c5d2c5d833fee9d6cb304067
parent 532f34fffb9dedc35d3e98f5b19a000d74c8b7db
Author: Nicolas Silva <nical@fastmail.com>
Date:   Tue,  7 Oct 2025 07:06:05 +0000

Bug 1808756 - Reduce duplicated calls to PrimitiveHeaders::push in the picture batching code. r=gfx-reviewers,lsalzman

Differential Revision: https://phabricator.services.mozilla.com/D267528

Diffstat:
Mgfx/wr/webrender/src/batch.rs | 177++++++++++++++++++++++++++++++++++---------------------------------------------
1 file changed, 75 insertions(+), 102 deletions(-)

diff --git a/gfx/wr/webrender/src/batch.rs b/gfx/wr/webrender/src/batch.rs @@ -956,7 +956,7 @@ impl BatchBuilder { let prim_info = &prim_instance.vis; let bounding_rect = &prim_info.clip_chain.pic_coverage_rect; - let z_id = z_generator.next(); + let mut z_id = z_generator.next(); let prim_rect = ctx.data_stores.get_local_prim_rect( prim_instance, @@ -1092,7 +1092,7 @@ impl BatchBuilder { clip_mask_texture_id, ); - let (key, prim_header_index, resource_address) = match raster_config.composite_mode { + let (key, prim_user_data, resource_address) = match raster_config.composite_mode { PictureCompositeMode::TileCache { .. } | PictureCompositeMode::IntermediateSurface { .. } => return, @@ -1109,19 +1109,15 @@ impl BatchBuilder { blend_mode, textures, ); - let prim_header_index = prim_headers.push( - &prim_header, - z_id, - self.batcher.render_task_address, - ImageBrushData { - color_mode: ShaderColorMode::Image, - alpha_type: AlphaType::PremultipliedAlpha, - raster_space: RasterizationSpace::Screen, - opacity: 1.0, - }.encode(), - ); - (key, prim_header_index, uv_rect_address.as_int()) + let prim_user_data = ImageBrushData { + color_mode: ShaderColorMode::Image, + alpha_type: AlphaType::PremultipliedAlpha, + raster_space: RasterizationSpace::Screen, + opacity: 1.0, + }.encode(); + + (key, prim_user_data, uv_rect_address.as_int()) } Filter::DropShadows(shadows) => { // Draw an instance per shadow first, following by the content. @@ -1198,21 +1194,18 @@ impl BatchBuilder { shadow_uv_rect_address.as_int(), ); } - let z_id_content = z_generator.next(); - let content_prim_header_index = prim_headers.push( - &prim_header, - z_id_content, - self.batcher.render_task_address, - ImageBrushData { - color_mode: ShaderColorMode::Image, - alpha_type: AlphaType::PremultipliedAlpha, - raster_space: RasterizationSpace::Screen, - opacity: 1.0, - }.encode(), - ); + // Update z_id for the content + z_id = z_generator.next(); + + let prim_user_data = ImageBrushData { + color_mode: ShaderColorMode::Image, + alpha_type: AlphaType::PremultipliedAlpha, + raster_space: RasterizationSpace::Screen, + opacity: 1.0, + }.encode(); - (content_key, content_prim_header_index, content_uv_rect_address) + (content_key, prim_user_data, content_uv_rect_address) } Filter::Opacity(_, amount) => { let amount = (amount * 65536.0) as i32; @@ -1223,19 +1216,14 @@ impl BatchBuilder { textures, ); - let prim_header_index = prim_headers.push( - &prim_header, - z_id, - self.batcher.render_task_address, - [ - uv_rect_address.as_int(), - amount, - 0, - 0, - ] - ); + let prim_user_data = [ + uv_rect_address.as_int(), + amount, + 0, + 0, + ]; - (key, prim_header_index, 0) + (key, prim_user_data, 0) } _ => { // Must be kept in sync with brush_blend.glsl @@ -1288,19 +1276,14 @@ impl BatchBuilder { textures, ); - let prim_header_index = prim_headers.push( - &prim_header, - z_id, - self.batcher.render_task_address, - [ - uv_rect_address.as_int(), - filter_mode, - user_data, - 0, - ] - ); + let prim_user_data = [ + uv_rect_address.as_int(), + filter_mode, + user_data, + 0, + ]; - (key, prim_header_index, 0) + (key, prim_user_data, 0) } } } @@ -1323,19 +1306,14 @@ impl BatchBuilder { textures, ); - let prim_header_index = prim_headers.push( - &prim_header, - z_id, - self.batcher.render_task_address, - [ - uv_rect_address.as_int(), - filter_mode, - user_data, - 0, - ] - ); + let prim_user_data = [ + uv_rect_address.as_int(), + filter_mode, + user_data, + 0, + ]; - (key, prim_header_index, 0) + (key, prim_user_data, 0) } PictureCompositeMode::MixBlend(mode) if BlendMode::from_mix_blend_mode( mode, @@ -1355,22 +1333,18 @@ impl BatchBuilder { ).unwrap(), textures, ); - let prim_header_index = prim_headers.push( - &prim_header, - z_id, - self.batcher.render_task_address, - ImageBrushData { - color_mode: match key.blend_mode { - BlendMode::MultiplyDualSource => ShaderColorMode::MultiplyDualSource, - _ => ShaderColorMode::Image, - }, - alpha_type: AlphaType::PremultipliedAlpha, - raster_space: RasterizationSpace::Screen, - opacity: 1.0, - }.encode(), - ); - (key, prim_header_index, uv_rect_address.as_int()) + let prim_user_data = ImageBrushData { + color_mode: match key.blend_mode { + BlendMode::MultiplyDualSource => ShaderColorMode::MultiplyDualSource, + _ => ShaderColorMode::Image, + }, + alpha_type: AlphaType::PremultipliedAlpha, + raster_space: RasterizationSpace::Screen, + opacity: 1.0, + }.encode(); + + (key, prim_user_data, uv_rect_address.as_int()) } PictureCompositeMode::MixBlend(mode) => { let backdrop_id = picture.secondary_render_task_id.expect("no backdrop!?"); @@ -1574,19 +1548,15 @@ impl BatchBuilder { blend_mode, textures, ); - let prim_header_index = prim_headers.push( - &prim_header, - z_id, - self.batcher.render_task_address, - ImageBrushData { - color_mode: ShaderColorMode::Image, - alpha_type: AlphaType::PremultipliedAlpha, - raster_space: RasterizationSpace::Screen, - opacity: 1.0, - }.encode(), - ); - (key, prim_header_index, uv_rect_address.as_int()) + let prim_user_data = ImageBrushData { + color_mode: ShaderColorMode::Image, + alpha_type: AlphaType::PremultipliedAlpha, + raster_space: RasterizationSpace::Screen, + opacity: 1.0, + }.encode(); + + (key, prim_user_data, uv_rect_address.as_int()) } PictureCompositeMode::SVGFEGraph(..) => { let kind = BatchKind::Brush( @@ -1597,22 +1567,25 @@ impl BatchBuilder { blend_mode, textures, ); - let prim_header_index = prim_headers.push( - &prim_header, - z_id, - self.batcher.render_task_address, - ImageBrushData { - color_mode: ShaderColorMode::Image, - alpha_type: AlphaType::PremultipliedAlpha, - raster_space: RasterizationSpace::Screen, - opacity: 1.0, - }.encode(), - ); - (key, prim_header_index, uv_rect_address.as_int()) + let prim_user_data = ImageBrushData { + color_mode: ShaderColorMode::Image, + alpha_type: AlphaType::PremultipliedAlpha, + raster_space: RasterizationSpace::Screen, + opacity: 1.0, + }.encode(); + + (key, prim_user_data, uv_rect_address.as_int()) } }; + let prim_header_index = prim_headers.push( + &prim_header, + z_id, + self.batcher.render_task_address, + prim_user_data, + ); + self.add_brush_instance_to_batches( key, batch_features,