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:
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