UNPKG

@motion-core/motion-gpu

Version:

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

57 lines (56 loc) 2.12 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; } /** * Pass-local cache for a pipeline-owned heterogeneous compute bind group layout. */ function createComputeBindGroupCache(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.entries.length === 0) { reset(); return null; } if (cachedTopologyKey !== request.topologyKey || cachedLayout !== request.layout) { cachedTopologyKey = request.topologyKey; cachedLayout = request.layout; cachedBindGroup = null; nullBackingSlots(cachedResourceRefs, 0, cachedResourceRefCount); cachedResourceRefCount = 0; } if (cachedBindGroup && equalResourceRefs(cachedResourceRefs, cachedResourceRefCount, request.resourceRefs)) return cachedBindGroup; cachedBindGroup = device.createBindGroup({ layout: request.layout, entries: request.entries }); const previousCount = 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, previousCount); return cachedBindGroup; }, reset }; } //#endregion export { createComputeBindGroupCache }; //# sourceMappingURL=compute-bindgroup-cache.js.map