36 lines
853 B
TypeScript
36 lines
853 B
TypeScript
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;
|
|
};
|