FWIW, there's a WebGPU extension which 'harmonizes' uniform buffer struct layout with other address spaces, but currently it's only implemented in Chromium-based browsers:
Right now, I'm targeting everything (native / Firefox / Chrome / Safari), so minimizing use of extensions; this also means I get to run head-long into fun cross-platform behavior differences [1][2][3]
> facet is a library for Rust which provides run-time reflection. By annotating your struct with #[derive(facet::Facet)], you get a SHAPE associated type which can be inspected at runtime.
> The core crates give types a SHAPE associated constant with their kind, layout, fields, documentation, attributes, and type-specific operations. facet-reflect builds, reads, and mutates values through those shapes while preserving their invariants.
> Serialization and integration crates build on that reflection layer: JSON, TOML, YAML, MessagePack, Postcard, ASN.1, XDR, CSV, XML, URL-encoded forms, SQLite, Axum, schema generation, structural diffing, and more.
An even better approach is to have a proc macro that parses wgsl and writes the rust struct definitions for you. That way this failure case can't happen.
While most of the time you want the memcpy semantics, but I wonder if naga could be used to compute a facet SHAPE from the shader. Maybe it could be used to "serialise" the cpu format to gpu format, without them needing to be padding/repr-compatible (or even field-reorder-compatible!).
Another option of course would be to parse the struct with naga and just always generate the rust counterpart, then it should always be compatible and up-to-date, but then you have codegen in your build step.
This is so good. And it's so absurd how programming languages so frequently treat types as a compile time check. Still. After so so long.
It's great having tools like Facet around to add runtime type information in. I wish TypeScript was seeing progress but there's seemingly no progress or traction in 5 years+, just some early experiments which died out.
FWIW, there's a WebGPU extension which 'harmonizes' uniform buffer struct layout with other address spaces, but currently it's only implemented in Chromium-based browsers:
Ticket: https://github.com/gpuweb/gpuweb/issues/4973
Caniuse: https://caniuse.com/?search=uniform_buffer_standard_layout
The std140-style layout restrictions are basically a leftover when GPUs used vec4 "register tables" for uniform data.
Nice, I'll keep an eye on that!
Right now, I'm targeting everything (native / Firefox / Chrome / Safari), so minimizing use of extensions; this also means I get to run head-long into fun cross-platform behavior differences [1][2][3]
[1] https://github.com/gfx-rs/wgpu/issues/8785
[2] https://bugzilla.mozilla.org/show_bug.cgi?id=1870699
[3] https://github.com/mkeeter/halfspace/issues/1#issuecomment-3...
> facet is a library for Rust which provides run-time reflection. By annotating your struct with #[derive(facet::Facet)], you get a SHAPE associated type which can be inspected at runtime.
https://github.com/facet-rs/facet
> The core crates give types a SHAPE associated constant with their kind, layout, fields, documentation, attributes, and type-specific operations. facet-reflect builds, reads, and mutates values through those shapes while preserving their invariants.
> Serialization and integration crates build on that reflection layer: JSON, TOML, YAML, MessagePack, Postcard, ASN.1, XDR, CSV, XML, URL-encoded forms, SQLite, Axum, schema generation, structural diffing, and more.
Side by side comparison with SERDE https://facet.rs/guide/serde/
An even better approach is to have a proc macro that parses wgsl and writes the rust struct definitions for you. That way this failure case can't happen.
Nice, always good to have some extra checking.
While most of the time you want the memcpy semantics, but I wonder if naga could be used to compute a facet SHAPE from the shader. Maybe it could be used to "serialise" the cpu format to gpu format, without them needing to be padding/repr-compatible (or even field-reorder-compatible!).
Another option of course would be to parse the struct with naga and just always generate the rust counterpart, then it should always be compatible and up-to-date, but then you have codegen in your build step.
Spent too much time debugging alignment issues with Vulkan buffers. WebGPU having good tools like Facet from the start is a huge win.
This is so good. And it's so absurd how programming languages so frequently treat types as a compile time check. Still. After so so long.
It's great having tools like Facet around to add runtime type information in. I wish TypeScript was seeing progress but there's seemingly no progress or traction in 5 years+, just some early experiments which died out.
[dead]
[dead]