export interface CachedFloat32BufferWrite { hasValue: boolean; previous: Float32Array; } export const createCachedFloat32BufferWrite = ( length: number ): CachedFloat32BufferWrite => ({ hasValue: false, previous: new Float32Array(length), }); export const writeFloat32BufferIfChanged = ( device: GPUDevice, buffer: GPUBuffer, values: Float32Array, cache: CachedFloat32BufferWrite ): boolean => { if (values.length !== cache.previous.length) { throw new Error('Cached buffer write length mismatch'); } let hasChanged = !cache.hasValue; for (let i = 0; i < values.length && !hasChanged; i++) { hasChanged = !Object.is(values[i], cache.previous[i]); } if (!hasChanged) { return false; } cache.previous.set(values); cache.hasValue = true; device.queue.writeBuffer(buffer, 0, values); return true; };