typegpu
Version:
A thin layer between JS and WebGPU/WGSL that improves development experience and allows for faster iteration.
79 lines (78 loc) • 2.8 kB
JavaScript
import * as TB from 'typed-binary';
import { dualImpl } from "../core/function/dualImpl.js";
import { stitch } from "../core/resolve/stitch.js";
import { u32 } from "../data/numeric.js";
import { vec2f, vec4f } from "../data/vector.js";
import { readFloat16, writeFloat16 } from "../data/float16Conversion.js";
/**
* @privateRemarks
* https://gpuweb.github.io/gpuweb/wgsl/#unpack2x16float-builtin
*/
export const unpack2x16float = dualImpl({
name: 'unpack2x16float',
normalImpl: (e) => {
const buffer = new ArrayBuffer(4);
const writer = new TB.BufferWriter(buffer);
writer.writeUint32(e);
const reader = new TB.BufferReader(buffer);
return vec2f(readFloat16(reader), readFloat16(reader));
},
signature: { argTypes: [u32], returnType: vec2f },
codegenImpl: (_ctx, [e]) => stitch `unpack2x16float(${e})`,
sideEffects: false,
});
/**
* @privateRemarks
* https://gpuweb.github.io/gpuweb/wgsl/#pack2x16float-builtin
*/
export const pack2x16float = dualImpl({
name: 'pack2x16float',
normalImpl: (e) => {
const buffer = new ArrayBuffer(4);
const writer = new TB.BufferWriter(buffer);
writeFloat16(writer, e.x);
writeFloat16(writer, e.y);
const reader = new TB.BufferReader(buffer);
return u32(reader.readUint32());
},
signature: { argTypes: [vec2f], returnType: u32 },
codegenImpl: (_ctx, [e]) => stitch `pack2x16float(${e})`,
sideEffects: false,
});
/**
* @privateRemarks
* https://gpuweb.github.io/gpuweb/wgsl/#unpack4x8unorm-builtin
*/
export const unpack4x8unorm = dualImpl({
name: 'unpack4x8unorm',
normalImpl: (e) => {
const buffer = new ArrayBuffer(4);
const writer = new TB.BufferWriter(buffer);
writer.writeUint32(e);
const reader = new TB.BufferReader(buffer);
return vec4f(reader.readUint8() / 255, reader.readUint8() / 255, reader.readUint8() / 255, reader.readUint8() / 255);
},
signature: { argTypes: [u32], returnType: vec4f },
codegenImpl: (_ctx, [e]) => stitch `unpack4x8unorm(${e})`,
sideEffects: false,
});
/**
* @privateRemarks
* https://gpuweb.github.io/gpuweb/wgsl/#pack4x8unorm-builtin
*/
export const pack4x8unorm = dualImpl({
name: 'pack4x8unorm',
normalImpl: (e) => {
const buffer = new ArrayBuffer(4);
const writer = new TB.BufferWriter(buffer);
writer.writeUint8(e.x * 255);
writer.writeUint8(e.y * 255);
writer.writeUint8(e.z * 255);
writer.writeUint8(e.w * 255);
const reader = new TB.BufferReader(buffer);
return u32(reader.readUint32());
},
signature: { argTypes: [vec4f], returnType: u32 },
codegenImpl: (_ctx, [e]) => stitch `pack4x8unorm(${e})`,
sideEffects: false,
});