export function isConvertible()

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;
  }
}