UNPKG

@motion-core/motion-gpu

Version:

Framework-agnostic WebGPU runtime for fullscreen WGSL shaders with explicit Svelte, React, and Vue adapter entrypoints.

78 lines (77 loc) 3.31 kB
import { assertUniformName } from "./uniforms.js"; import { TEXTURE_FORMATS, isStorageTextureFormat } from "./format-capabilities.js"; //#region src/lib/core/storage-buffers.ts /** * Valid WGSL storage buffer element types. */ var VALID_STORAGE_BUFFER_TYPES = /* @__PURE__ */ new Set([ "array<f32>", "array<vec2f>", "array<vec3f>", "array<vec4f>", "array<u32>", "array<i32>", "array<vec4u>", "array<vec4i>" ]); /** * Storage-compatible texture formats for `texture_storage_2d`. */ var STORAGE_TEXTURE_FORMATS = new Set(Array.from(TEXTURE_FORMATS, (format) => format).filter(isStorageTextureFormat)); /** * Validates a single storage buffer definition. * * @param name - Buffer identifier. * @param definition - Storage buffer definition to validate. * @throws {Error} When any field is invalid. */ function assertStorageBufferDefinition(name, definition) { assertUniformName(name); if (!Number.isFinite(definition.size) || definition.size <= 0) throw new Error(`Storage buffer "${name}" size must be a finite number greater than 0, got ${definition.size}`); if (definition.size % 4 !== 0) throw new Error(`Storage buffer "${name}" size must be a multiple of 4, got ${definition.size}`); if (!VALID_STORAGE_BUFFER_TYPES.has(definition.type)) throw new Error(`Storage buffer "${name}" has unknown type "${definition.type}". Supported types: ${[...VALID_STORAGE_BUFFER_TYPES].join(", ")}`); if (definition.access !== void 0 && definition.access !== "read" && definition.access !== "read-write") throw new Error(`Storage buffer "${name}" has invalid access mode "${definition.access}". Use 'read' or 'read-write'.`); if (definition.initialData !== void 0) { if (definition.initialData.byteLength > definition.size) throw new Error(`Storage buffer "${name}" initialData byte length (${definition.initialData.byteLength}) exceeds buffer size (${definition.size})`); } } /** * Validates and returns sorted storage buffer keys. * * @param definitions - Storage buffer definition map. * @returns Lexicographically sorted buffer keys. */ function resolveStorageBufferKeys(definitions) { const keys = Object.keys(definitions).sort(); for (const key of keys) { const definition = definitions[key]; if (definition) assertStorageBufferDefinition(key, definition); } return keys; } /** * Normalizes a storage buffer definition with defaults applied. * * @param definition - Raw definition. * @returns Normalized definition with access default. */ function normalizeStorageBufferDefinition(definition) { return { size: definition.size, type: definition.type, access: definition.access ?? "read-write" }; } /** * Validates that a texture format is storage-compatible. * * @param name - Texture identifier. * @param format - GPU texture format. * @throws {Error} When format is not storage-compatible. */ function assertStorageTextureFormat(name, format) { if (!STORAGE_TEXTURE_FORMATS.has(format)) throw new Error(`Texture "${name}" with storage:true requires a storage-compatible format, but got "${format}". Supported formats: ${[...STORAGE_TEXTURE_FORMATS].join(", ")}`); } //#endregion export { STORAGE_TEXTURE_FORMATS, assertStorageBufferDefinition, assertStorageTextureFormat, normalizeStorageBufferDefinition, resolveStorageBufferKeys }; //# sourceMappingURL=storage-buffers.js.map