You don’t measure the same thing, because StorageBuffer.read
postpone the read to the end of the frame, so that it happens after the command buffer has been submitted:
WebGPUEngine.prototype.readFromStorageBuffer = function (
storageBuffer: DataBuffer,
offset?: number,
size?: number,
buffer?: ArrayBufferView,
noDelay?: boolean
): Promise<ArrayBufferView> {
size = size || storageBuffer.capacity;
const gpuBuffer = this._bufferManager.createRawBuffer(size, WebGPUConstants.BufferUsage.MapRead | WebGPUConstants.BufferUsage.CopyDst, undefined, "TempReadFromStorageBuffer");
this._renderEncoder.copyBufferToBuffer(storageBuffer.underlyingResource, offset ?? 0, gpuBuffer, 0, size);
return new Promise((resolve, reject) => {
const readFromBuffer = () => {
gpuBuffer.mapAsync(WebGPUConstants.MapMode.Read, 0, size).then(
() => {
const copyArrayBuffer = gpuBuffer.getMappedRange(0, size);
let data: ArrayBufferView | undefined = buffer;
if (data === undefined) {
This file has been truncated. show original
1 Like