in src/webgpu/util/conversion.ts [2441:2500]
export function isConvertible(src: Type, dst: Type) {
if (src === dst) {
return true;
}
const shapeOf = (ty: Type) => {
if (ty instanceof ScalarType) {
return `scalar`;
}
if (ty instanceof VectorType) {
return `vec${ty.width}`;
}
if (ty instanceof MatrixType) {
return `mat${ty.cols}x${ty.rows}`;
}
if (ty instanceof ArrayType) {
return `array<${ty.count}>`;
}
unreachable(`unhandled type: ${ty}`);
};
if (shapeOf(src) !== shapeOf(dst)) {
return false;
}
const elSrc = scalarTypeOf(src);
const elDst = scalarTypeOf(dst);
switch (elSrc.kind) {
case 'abstract-float':
switch (elDst.kind) {
case 'abstract-float':
case 'f16':
case 'f32':
case 'f64':
return true;
default:
return false;
}
case 'abstract-int':
switch (elDst.kind) {
case 'abstract-int':
case 'abstract-float':
case 'f16':
case 'f32':
case 'f64':
case 'u16':
case 'u32':
case 'u8':
case 'i16':
case 'i32':
case 'i8':
return true;
default:
return false;
}
default:
return false;
}
}