UNPKG

@motion-core/motion-gpu

Version:

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

58 lines (57 loc) 2.23 kB
//#region src/lib/core/compute-bindgroup-cache.ts function equalResourceRefs(previous, previousCount, next) { if (previousCount !== next.length) return false; for (let index = 0; index < previousCount; index += 1) if (!Object.is(previous[index], next[index])) return false; return true; } function nullBackingSlots(array, from, to) { for (let index = from; index < to; index += 1) array[index] = null; } function createComputeStorageBindGroupCache(device) { let cachedTopologyKey = null; let cachedLayout = null; let cachedBindGroup = null; let cachedResourceRefs = []; let cachedResourceRefCount = 0; const reset = () => { cachedTopologyKey = null; cachedLayout = null; cachedBindGroup = null; nullBackingSlots(cachedResourceRefs, 0, cachedResourceRefCount); cachedResourceRefCount = 0; }; return { getOrCreate(request) { if (request.layoutEntries.length === 0) { reset(); return null; } if (cachedTopologyKey !== request.topologyKey) { cachedTopologyKey = request.topologyKey; cachedLayout = device.createBindGroupLayout({ entries: request.layoutEntries }); cachedBindGroup = null; nullBackingSlots(cachedResourceRefs, 0, cachedResourceRefCount); cachedResourceRefCount = 0; } if (!cachedLayout) throw new Error("Compute storage bind group cache is missing a layout."); if (cachedBindGroup && equalResourceRefs(cachedResourceRefs, cachedResourceRefCount, request.resourceRefs)) return cachedBindGroup; cachedBindGroup = device.createBindGroup({ layout: cachedLayout, entries: request.bindGroupEntries }); const prevCount = cachedResourceRefCount; cachedResourceRefCount = request.resourceRefs.length; if (cachedResourceRefs.length < cachedResourceRefCount) cachedResourceRefs = new Array(cachedResourceRefCount); for (let index = 0; index < cachedResourceRefCount; index += 1) cachedResourceRefs[index] = request.resourceRefs[index]; nullBackingSlots(cachedResourceRefs, cachedResourceRefCount, prevCount); return cachedBindGroup; }, reset, _refAt(index) { return cachedResourceRefs[index]; } }; } //#endregion export { createComputeStorageBindGroupCache }; //# sourceMappingURL=compute-bindgroup-cache.js.map