TS8038
Front-end code F64_ENTRY_IO
An emulated double (f64, a vec64) on an entry's IO boundary — a @location parameter, a @location field of an IO struct, or an entry's return.
The registry text and every compiler message on these pages are the compiler's own English.
When it fires
An emulated double (f64, a vec64) on an entry's IO boundary — a @location parameter, a @location field of an IO struct, or an entry's return. A double is a pair of f32 words after lowering, and a varying interpolates each word on its own, which is not the interpolation of the double they encode; a vec64 attribute would need two slots. Its own code rather than the UNSUPPORTED bucket because the remedy is specific and an author can look it up: narrow with f32(x), or read the double in the stage that needs it, since a uniform or a storage binding carries an f64 and every stage can see one. There is deliberately no author-facing way to split a double into its two f32 words — they are the emulation's business (§39).
Example
"use typeshade"
@fragmentexport function main(@location(0) uv: vec2<f64>): vec4 { return vec4(f32(uv.x), f32(uv.y), 0., 1.)}Compiled at build time against the pinned compiler, this program gets:
TS8038 error, line 4: Parameter "uv" carries vec2f64: an emulated double is a pair of f32 words, and a @location varying interpolates each word on its own, which is not the interpolation of the double. Narrow it with f32(x), or compute the double in the stage that needs it — a uniform or storage binding carries an f64 and every stage can read one.
How to fix it
The same program, corrected. It compiles with no diagnostic.
"use typeshade"
@fragmentexport function main(@location(0) uv: vec2): vec4 { return vec4(uv.x, uv.y, 0., 1.)}The rules this enforces
- Rule 2.3 Test
- A value sometimes has to cross between a representation the compiler chose and one the target has: an
f64and the twof32halves that carry it across an interface off32. - Rule 12.6 Test
- A requirement the front end can check must be checked at the front end, in the author’s words, and not left to Tint or a driver.
See also
Source
Where the compiler raises this code at commit 26de7be8, one line per file: