UNPKG

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