tor-browser

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

commit 0ca69d4f07297d74741d096c3745c82b448db32f
parent dad13aef3397c48e5db96173af761f8e6022baf2
Author: Nicolas Silva <nical@fastmail.com>
Date:   Tue,  9 Dec 2025 08:19:05 +0000

Bug 2000393 - Add QuadHeader. r=gw

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

Diffstat:
Mgfx/wr/webrender/src/gpu_types.rs | 22+++++++++++++++++++++-
Mgfx/wr/webrender/src/quad.rs | 17++++++++---------
Mgfx/wr/webrender/src/renderer/gpu_buffer.rs | 32++++++++++++++++----------------
Mgfx/wr/webrender/src/renderer/mod.rs | 3++-
4 files changed, 47 insertions(+), 27 deletions(-)

diff --git a/gfx/wr/webrender/src/gpu_types.rs b/gfx/wr/webrender/src/gpu_types.rs @@ -6,6 +6,7 @@ use api::{AlphaType, PremultipliedColorF, YuvFormat, YuvRangedColorSpace}; use api::units::*; use euclid::HomogeneousVector; use crate::composite::{CompositeFeatures, CompositorClip}; +use crate::pattern::PatternShaderInput; use crate::quad::LayoutOrDeviceRect; use crate::segment::EdgeAaSegmentMask; use crate::spatial_tree::{SpatialTree, SpatialNodeIndex}; @@ -13,7 +14,7 @@ use crate::internal_types::{FastHashMap, FrameVec, FrameMemory}; use crate::prim_store::{ClipData, VECS_PER_SEGMENT}; use crate::render_task::RenderTaskAddress; use crate::render_task_graph::RenderTaskId; -use crate::renderer::{GpuBufferAddress, GpuBufferBuilderF, GpuBufferHandle, GpuBufferWriterF, GpuBufferDataF, ShaderColorMode}; +use crate::renderer::{GpuBufferAddress, GpuBufferBuilderF, GpuBufferHandle, GpuBufferWriterF, GpuBufferDataF, GpuBufferDataI, GpuBufferWriterI, ShaderColorMode}; use std::i32; use crate::util::{MatrixHelpers, ScaleOffset, TransformedRectKind}; use glyph_rasterizer::SubpixelDirection; @@ -647,6 +648,25 @@ impl From<QuadInstance> for PrimitiveInstanceData { } } +/// Matches QuadHeader in ps_quad.glsl +pub struct QuadHeader { + pub transform_id: TransformPaletteId, + pub z_id: ZBufferId, + pub pattern_input: PatternShaderInput, +} + +impl GpuBufferDataI for QuadHeader { + const NUM_BLOCKS: usize = 1; + fn write(&self, writer: &mut GpuBufferWriterI) { + writer.push_one([ + self.transform_id.0 as i32, + self.z_id.0, + self.pattern_input.0, + self.pattern_input.1, + ]); + } +} + /// Matches QuadPrimitive in ps_quad.glsl pub struct QuadPrimitive { pub bounds: LayoutOrDeviceRect, diff --git a/gfx/wr/webrender/src/quad.rs b/gfx/wr/webrender/src/quad.rs @@ -9,14 +9,14 @@ use crate::batch::{BatchKey, BatchKind, BatchTextures}; use crate::clip::{ClipChainInstance, ClipIntern, ClipItemKind, ClipNodeRange, ClipSpaceConversion, ClipStore}; use crate::command_buffer::{CommandBufferIndex, PrimitiveCommand, QuadFlags}; use crate::frame_builder::{FrameBuildingContext, FrameBuildingState, PictureContext, PictureState}; -use crate::gpu_types::{PrimitiveInstanceData, QuadInstance, QuadPrimitive, QuadSegment, TransformPaletteId, ZBufferId}; +use crate::gpu_types::{PrimitiveInstanceData, QuadHeader, QuadInstance, QuadPrimitive, QuadSegment, TransformPaletteId, ZBufferId}; use crate::intern::DataStore; use crate::internal_types::TextureSource; use crate::pattern::{Pattern, PatternBuilder, PatternBuilderContext, PatternBuilderState, PatternKind, PatternShaderInput}; use crate::prim_store::{PrimitiveInstanceIndex, PrimitiveScratchBuffer}; use crate::render_task::{MaskSubPass, RenderTask, RenderTaskAddress, RenderTaskKind, SubPass}; use crate::render_task_graph::{RenderTaskGraph, RenderTaskGraphBuilder, RenderTaskId}; -use crate::renderer::{BlendMode, GpuBufferAddress, GpuBufferBuilder, GpuBufferBuilderF}; +use crate::renderer::{BlendMode, GpuBufferAddress, GpuBufferBuilder, GpuBufferBuilderF, GpuBufferDataI}; use crate::segment::EdgeAaSegmentMask; use crate::space::SpaceMapper; use crate::spatial_tree::{CoordinateSpaceMapping, SpatialNodeIndex, SpatialTree}; @@ -1177,13 +1177,12 @@ pub fn add_to_batch<F>( } // See QuadHeader in ps_quad.glsl - let mut writer = gpu_buffer_builder.i32.write_blocks(1); - writer.push_one([ - transform_id.0 as i32, - z_id.0, - pattern_input.0, - pattern_input.1, - ]); + let mut writer = gpu_buffer_builder.i32.write_blocks(QuadHeader::NUM_BLOCKS); + writer.push(&QuadHeader { + transform_id, + z_id, + pattern_input, + }); let prim_address_i = writer.finish(); let texture = match src_task_id { diff --git a/gfx/wr/webrender/src/renderer/gpu_buffer.rs b/gfx/wr/webrender/src/renderer/gpu_buffer.rs @@ -30,7 +30,7 @@ pub type GpuBufferI = GpuBuffer<GpuBufferBlockI>; pub type GpuBufferBuilderI = GpuBufferBuilderImpl<GpuBufferBlockI>; pub type GpuBufferWriterF<'l> = GpuBufferWriter<'l, GpuBufferBlockF>; -//pub type GpuBufferWriterI<'l> = GpuBufferWriter<'l, GpuBufferBlockI>; +pub type GpuBufferWriterI<'l> = GpuBufferWriter<'l, GpuBufferBlockI>; unsafe impl Texel for GpuBufferBlockF { fn image_format() -> ImageFormat { ImageFormat::RGBAF32 } @@ -284,10 +284,10 @@ pub trait GpuBufferDataF { fn write(&self, writer: &mut GpuBufferWriterF); } -//pub trait GpuBufferDataI { -// const NUM_BLOCKS: usize; -// fn write(&self, writer: &mut GpuBufferWriterI); -//} +pub trait GpuBufferDataI { + const NUM_BLOCKS: usize; + fn write(&self, writer: &mut GpuBufferWriterI); +} impl GpuBufferDataF for [f32; 4] { const NUM_BLOCKS: usize = 1; @@ -296,12 +296,12 @@ impl GpuBufferDataF for [f32; 4] { } } -//impl GpuBufferDataI for [i32; 4] { -// const NUM_BLOCKS: usize = 1; -// fn write(&self, writer: &mut GpuBufferWriterI) { -// writer.push_one(*self); -// } -//} +impl GpuBufferDataI for [i32; 4] { + const NUM_BLOCKS: usize = 1; + fn write(&self, writer: &mut GpuBufferWriterI) { + writer.push_one(*self); + } +} /// Record a patch to the GPU buffer for a render task struct DeferredBlock { @@ -376,11 +376,11 @@ impl<'a> GpuBufferWriterF<'a> { } } -//impl<'a> GpuBufferWriterI<'a> { -// pub fn push<Data: GpuBufferDataI>(&mut self, data: &Data) { -// data.write(self); -// } -//} +impl<'a> GpuBufferWriterI<'a> { + pub fn push<Data: GpuBufferDataI>(&mut self, data: &Data) { + data.write(self); + } +} impl<'a, T> Drop for GpuBufferWriter<'a, T> { fn drop(&mut self) { diff --git a/gfx/wr/webrender/src/renderer/mod.rs b/gfx/wr/webrender/src/renderer/mod.rs @@ -129,7 +129,8 @@ pub use debug::DebugRenderer; pub use shade::{PendingShadersToPrecache, Shaders, SharedShaders}; pub use vertex::{desc, VertexArrayKind, MAX_VERTEX_TEXTURE_WIDTH}; pub use gpu_buffer::{GpuBuffer, GpuBufferF, GpuBufferBuilderF, GpuBufferI, GpuBufferBuilderI}; -pub use gpu_buffer::{GpuBufferHandle, GpuBufferAddress, GpuBufferBuilder, GpuBufferWriterF, GpuBufferBlockF, GpuBufferDataF}; +pub use gpu_buffer::{GpuBufferHandle, GpuBufferAddress, GpuBufferBuilder, GpuBufferWriterF}; +pub use gpu_buffer::{GpuBufferBlockF, GpuBufferDataF, GpuBufferDataI, GpuBufferWriterI}; /// The size of the array of each type of vertex data texture that /// is round-robin-ed each frame during bind_frame_data. Doing this