@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
JavaScript
//#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