Skip to content

glam v0.33.6 breaks Vec3A #645

Description

@Firestar99

PR bitshifter/glam-rs#786 changed the definition of Vec3A to make it bytemuck::Pod:

  #[repr(align(16))]
  #[repr(C)]
  #[cfg_attr(target_arch = "spirv", rust_gpu::vector::v1)]
  pub struct Vec3A {
      pub x: f32,
      pub y: f32,
      pub z: f32,
+     _w: f32,
  }

So from rust-gpu's perspective, this is now a vector with 4 floats instead of 3 floats, breaking a lot of safety assumptions in our codebase.

Observed Fallout

error: error:0:0 - Expected Image Operand Grad dx to have 3 components, but given 4
         %38 = OpImageSampleDrefExplicitLod %float %37 %32 %float_1 Grad %33 %34

Mitigation

Problems:

  • glam v0.33.6 is a breaking change for rust-gpu
  • glam added _w: f32 member to get impl bytemuck::Pod for Vec3A, so reverting this is a breaking change for regular glam users
  • don't want impl Pod not to be impl on spirv

Ideas:

  • hack something in the compiler to special case glam::Vec3A
    • how do we know if a type is Vec3A? This will be a hack and not really sustainable
  • PR adjust Matrix4x3 to unbreak glam 0.33.6 #646 adjusts Matrix4x3 to use Vec3 instead of Vec3A. The layout of that special type is screwed up anyway, so we don't really care about it changing.
    • not a full mitigation!

Strategy:

  1. short term fix
  • special case spirv to not have _w: f32 member and not impl Pod,
  • release glam v0.33.9, fixing rust-gpu
  1. long term fix
  • glam::Vec3A:
    • remove short term fix
    • change attribute to #[spirv::vector::v1(3, f32)] to overwrite rust-gpu vector type
    • release glam v0.34.0
  • rust-gpu:
    • adjust #[spirv::vector::v1] attribute to take params to overwrite vector type
    • make rust-gpu support glam v0.34.0
    • release rust-gpu?

will update this description as I go

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions