in src/webgpu/util/conversion.ts [2215:2298]
export function serializeValue(s: BinaryStream, v: Value) {
const serializeScalar = (scalar: ScalarValue, kind: ScalarKind) => {
switch (typeof scalar.value) {
case 'number':
switch (kind) {
case 'abstract-float':
s.writeF64(scalar.value);
return;
case 'f64':
s.writeF64(scalar.value);
return;
case 'f32':
s.writeF32(scalar.value);
return;
case 'f16':
s.writeF16(scalar.value);
return;
case 'u32':
s.writeU32(scalar.value);
return;
case 'u16':
s.writeU16(scalar.value);
return;
case 'u8':
s.writeU8(scalar.value);
return;
case 'i32':
s.writeI32(scalar.value);
return;
case 'i16':
s.writeI16(scalar.value);
return;
case 'i8':
s.writeI8(scalar.value);
return;
}
break;
case 'bigint':
switch (kind) {
case 'abstract-int':
s.writeI64(scalar.value);
return;
}
break;
case 'boolean':
switch (kind) {
case 'bool':
s.writeBool(scalar.value);
return;
}
break;
}
};
if (isScalarValue(v)) {
s.writeU8(SerializedValueKind.Scalar);
serializeScalarKind(s, v.type.kind);
serializeScalar(v, v.type.kind);
return;
}
if (v instanceof VectorValue) {
s.writeU8(SerializedValueKind.Vector);
serializeScalarKind(s, v.type.elementType.kind);
s.writeU8(v.type.width);
for (const element of v.elements) {
serializeScalar(element, v.type.elementType.kind);
}
return;
}
if (v instanceof MatrixValue) {
s.writeU8(SerializedValueKind.Matrix);
serializeScalarKind(s, v.type.elementType.kind);
s.writeU8(v.type.cols);
s.writeU8(v.type.rows);
for (const column of v.elements) {
for (const element of column) {
serializeScalar(element, v.type.elementType.kind);
}
}
return;
}
unreachable(`unhandled value type: ${v}`);
}