in src/webgpu/util/conversion.ts [2301:2358]
export function deserializeValue(s: BinaryStream): Value {
const deserializeScalar = (kind: ScalarKind) => {
switch (kind) {
case 'abstract-float':
return abstractFloat(s.readF64());
case 'f64':
return f64(s.readF64());
case 'f32':
return f32(s.readF32());
case 'f16':
return f16(s.readF16());
case 'u32':
return u32(s.readU32());
case 'u16':
return u16(s.readU16());
case 'u8':
return u8(s.readU8());
case 'abstract-int':
return abstractInt(s.readI64());
case 'i32':
return i32(s.readI32());
case 'i16':
return i16(s.readI16());
case 'i8':
return i8(s.readI8());
case 'bool':
return bool(s.readBool());
}
};
const valueKind = s.readU8();
const scalarKind = deserializeScalarKind(s);
switch (valueKind) {
case SerializedValueKind.Scalar:
return deserializeScalar(scalarKind);
case SerializedValueKind.Vector: {
const width = s.readU8();
const scalars = new Array<ScalarValue>(width);
for (let i = 0; i < width; i++) {
scalars[i] = deserializeScalar(scalarKind);
}
return new VectorValue(scalars);
}
case SerializedValueKind.Matrix: {
const numCols = s.readU8();
const numRows = s.readU8();
const columns = new Array<ScalarValue[]>(numCols);
for (let c = 0; c < numCols; c++) {
columns[c] = new Array<ScalarValue>(numRows);
for (let i = 0; i < numRows; i++) {
columns[c][i] = deserializeScalar(scalarKind);
}
}
return new MatrixValue(columns);
}
default:
unreachable(`invalid serialized value kind: ${valueKind}`);
}
}