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