Keep the glyph uvs as vectors on both sides

Review response: `GlyphInfo` goes back to two `vec2<f32>`, which is what
the uvs are, and `GlyphPrimitive` takes `#[repr(C, align(8))]` to match.
That leaves four padding bytes, which the `primitives!` macro's
`unsafe impl Pod` accepts. Measured at 32 bytes, align 8, the same as
WGSL's layout for the struct.
This commit is contained in:
iris committed 2026-09-13 12:55:56 -04:00
1 parent 0106257be0
commit f5864da3c4
2 files changed
+9 -10

No files matched your search

+6 -1
View File
@@ -89,6 +89,8 @@ macro_rules! primitives {
} }
$( $(
// Each is uploaded as its WGSL counterpart, so its fields have to
// sit at WGSL's offsets -- including an align Rust would not pick.
unsafe impl bytemuck::Pod for $ty {} unsafe impl bytemuck::Pod for $ty {}
unsafe impl bytemuck::Zeroable for $ty {} unsafe impl bytemuck::Zeroable for $ty {}
impl Primitive for $ty { impl Primitive for $ty {
@@ -263,7 +265,10 @@ impl RectPrimitive {
/// `color` is multiplied by the atlas alpha for a mask glyph; a colour glyph /// `color` is multiplied by the atlas alpha for a mask glyph; a colour glyph
/// takes the texel unchanged, which `GlyphEntry::IS_COLORED` selects. /// takes the texel unchanged, which `GlyphEntry::IS_COLORED` selects.
#[repr(C)] ///
/// `align(8)` because `vec2<f32>` aligns `GlyphInfo` to 8, which pads it to
/// 32 bytes.
#[repr(C, align(8))]
#[derive(Debug, Copy, Clone)] #[derive(Debug, Copy, Clone)]
pub struct GlyphPrimitive { pub struct GlyphPrimitive {
pub uv_min: Vec2, pub uv_min: Vec2,
+3 -9
View File
@@ -17,13 +17,9 @@ struct Rect {
inner_radius: f32, inner_radius: f32,
} }
// Scalars rather than two vec2<f32>: a vec2 member would align the struct to
// 8 and pad it to 32 bytes, which GlyphPrimitive has no field to fill.
struct GlyphInfo { struct GlyphInfo {
uv_min_x: f32, uv_min: vec2<f32>,
uv_min_y: f32, uv_max: vec2<f32>,
uv_max_x: f32,
uv_max_y: f32,
layer: u32, layer: u32,
color: u32, color: u32,
flags: u32, flags: u32,
@@ -162,9 +158,7 @@ fn draw_texture(region: Region) -> vec4<f32> {
} }
fn draw_glyph(region: Region, g: GlyphInfo) -> vec4<f32> { fn draw_glyph(region: Region, g: GlyphInfo) -> vec4<f32> {
let uv_min = vec2(g.uv_min_x, g.uv_min_y); let uv = mix(g.uv_min, g.uv_max, region.uv);
let uv_max = vec2(g.uv_max_x, g.uv_max_y);
let uv = mix(uv_min, uv_max, region.uv);
let texel = textureSample(tex, samp, uv, i32(g.layer)); let texel = textureSample(tex, samp, uv, i32(g.layer));
if (g.flags & 1u) != 0u { if (g.flags & 1u) != 0u {
return texel; return texel;