diff --git a/packages/tgpu-gen/gen.mjs b/packages/tgpu-gen/gen.mjs index 33e560f8c4..5fee1d3215 100644 --- a/packages/tgpu-gen/gen.mjs +++ b/packages/tgpu-gen/gen.mjs @@ -231,6 +231,15 @@ function typeToAlias(type, format) { if (['vec2', 'vec3', 'vec4'].includes(type) && ['i32', 'u32', 'f32'].includes(format)) { return type + format[0]; } + if (['vec2', 'vec3', 'vec4'].includes(type) && format === 'f16') { + return `${type}h`; + } + if (['vec2', 'vec3', 'vec4'].includes(type) && format === 'bool') { + return `${type}b`; + } + if (['mat2x2', 'mat3x3', 'mat4x4'].includes(type) && format === 'f32') { + return `${type}f`; + } } /** diff --git a/packages/tgpu-gen/tests/structs.test.ts b/packages/tgpu-gen/tests/structs.test.ts index a1f2526228..a52f373539 100644 --- a/packages/tgpu-gen/tests/structs.test.ts +++ b/packages/tgpu-gen/tests/structs.test.ts @@ -80,6 +80,50 @@ export const Data = d.struct({ expect(generate(wgsl)).toContain(expected); }); + it('replaces f16 vector and matrix member types with predeclared aliases', () => { + const wgsl = ` +enable f16; + +struct Data { + a1: vec2, + a2: vec3, + a3: vec4, + a4: mat2x2, + a5: mat3x3, + a6: mat4x4, +};`; + + const expected = `\ +export const Data = d.struct({ + a1: d.vec2h, + a2: d.vec3h, + a3: d.vec4h, + a4: d.mat2x2f, + a5: d.mat3x3f, + a6: d.mat4x4f, +});`; + + expect(generate(wgsl)).toContain(expected); + }); + + it('replaces bool vector member types with predeclared aliases', () => { + const wgsl = ` +struct Data { + a1: vec2, + a2: vec3, + a3: vec4, +};`; + + const expected = `\ +export const Data = d.struct({ + a1: d.vec2b, + a2: d.vec3b, + a3: d.vec4b, +});`; + + expect(generate(wgsl)).toContain(expected); + }); + it('generates structs with nested structs', () => { const wgsl = ` struct TriangleData {