UNPKG

typegpu

Version:

A thin layer between JS and WebGPU/WGSL that improves development experience and allows for faster iteration.

110 lines (109 loc) 4.47 kB
import { $cast, $gpuCallable, $internal, isMarkedInternal } from "../shared/symbols.js"; import { f32, i32, u32 } from "./numeric.js"; import { vec2f, vec2i, vec2u, vec3f, vec3i, vec3u, vec4f, vec4i, vec4u } from "./vector.js"; import { schemaCallWrapper, schemaCallWrapperGPU } from "./schemaCallWrapper.js"; class TgpuVertexFormatDataImpl { [$internal] = {}; type; [$gpuCallable]; // --- constructor(type) { this.type = type; this[$gpuCallable] = { call: (ctx, [v]) => { return schemaCallWrapperGPU(ctx, formatToWGSLType[this.type], v); }, }; } [$cast](v) { return schemaCallWrapper(formatToWGSLType[this.type], v); } } export const formatToWGSLType = { uint8: u32, uint8x2: vec2u, uint8x4: vec4u, sint8: i32, sint8x2: vec2i, sint8x4: vec4i, unorm8: f32, unorm8x2: vec2f, unorm8x4: vec4f, snorm8: f32, snorm8x2: vec2f, snorm8x4: vec4f, uint16: u32, uint16x2: vec2u, uint16x4: vec4u, sint16: i32, sint16x2: vec2i, sint16x4: vec4i, unorm16: f32, unorm16x2: vec2f, unorm16x4: vec4f, snorm16: f32, snorm16x2: vec2f, snorm16x4: vec4f, float16: f32, float16x2: vec2f, float16x4: vec4f, float32: f32, float32x2: vec2f, float32x3: vec3f, float32x4: vec4f, uint32: u32, uint32x2: vec2u, uint32x3: vec3u, uint32x4: vec4u, sint32: i32, sint32x2: vec2i, sint32x3: vec3i, sint32x4: vec4i, 'unorm10-10-10-2': vec4f, 'unorm8x4-bgra': vec4f, }; export const packedFormats = new Set(Object.keys(formatToWGSLType)); export const uint8 = new TgpuVertexFormatDataImpl('uint8'); export const uint8x2 = new TgpuVertexFormatDataImpl('uint8x2'); export const uint8x4 = new TgpuVertexFormatDataImpl('uint8x4'); export const sint8 = new TgpuVertexFormatDataImpl('sint8'); export const sint8x2 = new TgpuVertexFormatDataImpl('sint8x2'); export const sint8x4 = new TgpuVertexFormatDataImpl('sint8x4'); export const unorm8 = new TgpuVertexFormatDataImpl('unorm8'); export const unorm8x2 = new TgpuVertexFormatDataImpl('unorm8x2'); export const unorm8x4 = new TgpuVertexFormatDataImpl('unorm8x4'); export const snorm8 = new TgpuVertexFormatDataImpl('snorm8'); export const snorm8x2 = new TgpuVertexFormatDataImpl('snorm8x2'); export const snorm8x4 = new TgpuVertexFormatDataImpl('snorm8x4'); export const uint16 = new TgpuVertexFormatDataImpl('uint16'); export const uint16x2 = new TgpuVertexFormatDataImpl('uint16x2'); export const uint16x4 = new TgpuVertexFormatDataImpl('uint16x4'); export const sint16 = new TgpuVertexFormatDataImpl('sint16'); export const sint16x2 = new TgpuVertexFormatDataImpl('sint16x2'); export const sint16x4 = new TgpuVertexFormatDataImpl('sint16x4'); export const unorm16 = new TgpuVertexFormatDataImpl('unorm16'); export const unorm16x2 = new TgpuVertexFormatDataImpl('unorm16x2'); export const unorm16x4 = new TgpuVertexFormatDataImpl('unorm16x4'); export const snorm16 = new TgpuVertexFormatDataImpl('snorm16'); export const snorm16x2 = new TgpuVertexFormatDataImpl('snorm16x2'); export const snorm16x4 = new TgpuVertexFormatDataImpl('snorm16x4'); export const float16 = new TgpuVertexFormatDataImpl('float16'); export const float16x2 = new TgpuVertexFormatDataImpl('float16x2'); export const float16x4 = new TgpuVertexFormatDataImpl('float16x4'); export const float32 = new TgpuVertexFormatDataImpl('float32'); export const float32x2 = new TgpuVertexFormatDataImpl('float32x2'); export const float32x3 = new TgpuVertexFormatDataImpl('float32x3'); export const float32x4 = new TgpuVertexFormatDataImpl('float32x4'); export const uint32 = new TgpuVertexFormatDataImpl('uint32'); export const uint32x2 = new TgpuVertexFormatDataImpl('uint32x2'); export const uint32x3 = new TgpuVertexFormatDataImpl('uint32x3'); export const uint32x4 = new TgpuVertexFormatDataImpl('uint32x4'); export const sint32 = new TgpuVertexFormatDataImpl('sint32'); export const sint32x2 = new TgpuVertexFormatDataImpl('sint32x2'); export const sint32x3 = new TgpuVertexFormatDataImpl('sint32x3'); export const sint32x4 = new TgpuVertexFormatDataImpl('sint32x4'); export const unorm10_10_10_2 = new TgpuVertexFormatDataImpl('unorm10-10-10-2'); export const unorm8x4_bgra = new TgpuVertexFormatDataImpl('unorm8x4-bgra'); export function isPackedData(value) { return isMarkedInternal(value) && packedFormats.has(value?.type); }