TS8038
On this page

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

example.shade.ts
"use typeshade"
@fragment
export 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.

example.shade.ts
"use typeshade"
@fragment
export 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 f64 and the two f32 halves that carry it across an interface of f32.
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

SD0044
f64 in an interpolated @location IO field
TS8099 UNSUPPORTED
UNSUPPORTED (TS8099) is the one deliberate exception to "sequential": it is the catch-all for a diagnostic whose site does not yet deserve its own code, so it stays parked past the sequential range instead of at its head.

Source

Where the compiler raises this code at commit 26de7be8, one line per file:

Edit this page Report a problem