@babylonjs/core 6.34.2 → 6.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Compute/computeShader.d.ts +8 -2
- package/Compute/computeShader.js +5 -1
- package/Compute/computeShader.js.map +1 -1
- package/Engines/Extensions/engine.computeShader.d.ts +3 -1
- package/Engines/Extensions/engine.computeShader.js.map +1 -1
- package/Engines/Extensions/engine.cubeTexture.js +2 -2
- package/Engines/Extensions/engine.cubeTexture.js.map +1 -1
- package/Engines/Extensions/engine.multiRender.js +3 -2
- package/Engines/Extensions/engine.multiRender.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.computeShader.js +10 -2
- package/Engines/WebGPU/Extensions/engine.computeShader.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.multiRender.js +3 -2
- package/Engines/WebGPU/Extensions/engine.multiRender.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.storageBuffer.js +8 -1
- package/Engines/WebGPU/Extensions/engine.storageBuffer.js.map +1 -1
- package/Engines/WebGPU/webgpuBufferManager.d.ts +3 -1
- package/Engines/WebGPU/webgpuBufferManager.js +10 -2
- package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
- package/Engines/WebGPU/webgpuOcclusionQuery.js +1 -1
- package/Engines/WebGPU/webgpuOcclusionQuery.js.map +1 -1
- package/Engines/WebGPU/webgpuPerfCounter.d.ts +15 -0
- package/Engines/WebGPU/webgpuPerfCounter.js +31 -0
- package/Engines/WebGPU/webgpuPerfCounter.js.map +1 -0
- package/Engines/WebGPU/webgpuQuerySet.d.ts +3 -1
- package/Engines/WebGPU/webgpuQuerySet.js +37 -18
- package/Engines/WebGPU/webgpuQuerySet.js.map +1 -1
- package/Engines/WebGPU/webgpuRenderTargetWrapper.d.ts +20 -1
- package/Engines/WebGPU/webgpuRenderTargetWrapper.js +18 -1
- package/Engines/WebGPU/webgpuRenderTargetWrapper.js.map +1 -1
- package/Engines/WebGPU/webgpuTimestampQuery.d.ts +11 -2
- package/Engines/WebGPU/webgpuTimestampQuery.js +45 -7
- package/Engines/WebGPU/webgpuTimestampQuery.js.map +1 -1
- package/Engines/engine.d.ts +1 -1
- package/Engines/index.d.ts +1 -0
- package/Engines/index.js +1 -0
- package/Engines/index.js.map +1 -1
- package/Engines/nativeEngine.js +1 -1
- package/Engines/nativeEngine.js.map +1 -1
- package/Engines/thinEngine.js +2 -2
- package/Engines/thinEngine.js.map +1 -1
- package/Engines/webgpuEngine.d.ts +16 -1
- package/Engines/webgpuEngine.js +33 -4
- package/Engines/webgpuEngine.js.map +1 -1
- package/Gizmos/positionGizmo.js +1 -5
- package/Gizmos/positionGizmo.js.map +1 -1
- package/Gizmos/rotationGizmo.js +1 -5
- package/Gizmos/rotationGizmo.js.map +1 -1
- package/Gizmos/scaleGizmo.js +1 -5
- package/Gizmos/scaleGizmo.js.map +1 -1
- package/Materials/Textures/multiRenderTarget.d.ts +4 -0
- package/Materials/Textures/multiRenderTarget.js +1 -0
- package/Materials/Textures/multiRenderTarget.js.map +1 -1
- package/Materials/Textures/videoTexture.js +5 -2
- package/Materials/Textures/videoTexture.js.map +1 -1
- package/Meshes/abstractMesh.js +1 -1
- package/Meshes/abstractMesh.js.map +1 -1
- package/Misc/environmentTextureTools.js +1 -1
- package/Misc/environmentTextureTools.js.map +1 -1
- package/Misc/fileTools.js +4 -5
- package/Misc/fileTools.js.map +1 -1
- package/Misc/perfCounter.d.ts +2 -1
- package/Misc/perfCounter.js +1 -0
- package/Misc/perfCounter.js.map +1 -1
- package/Particles/computeShaderParticleSystem.js.map +1 -1
- package/Physics/v2/ragdoll.d.ts +0 -1
- package/Physics/v2/ragdoll.js +9 -3
- package/Physics/v2/ragdoll.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js +2 -2
- package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockSubSurface.js +3 -1
- package/Shaders/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgpuBufferManager.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuBufferManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DataBuffer } from \"../../Buffers/dataBuffer\";\r\nimport { WebGPUDataBuffer } from \"../../Meshes/WebGPU/webgpuDataBuffer\";\r\nimport { FromHalfFloat } from \"../../Misc/textureTools\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Constants } from \"../constants\";\r\nimport { allocateAndCopyTypedBuffer } from \"../Extensions/engine.readTexture\";\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\n\r\n/** @internal */\r\nexport class WebGPUBufferManager {\r\n private _device: GPUDevice;\r\n private _deferredReleaseBuffers: Array<GPUBuffer> = [];\r\n\r\n private static _IsGPUBuffer(buffer: DataBuffer | GPUBuffer): buffer is GPUBuffer {\r\n return (buffer as DataBuffer).underlyingResource === undefined;\r\n }\r\n\r\n private static _FlagsToString(flags: GPUBufferUsageFlags, suffix = \"\") {\r\n let result = suffix;\r\n\r\n for (let i = 0; i <= 9; ++i) {\r\n if (flags & (1 << i)) {\r\n if (result) {\r\n result += \"_\";\r\n }\r\n result += WebGPUConstants.BufferUsage[1 << i];\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n constructor(device: GPUDevice) {\r\n this._device = device;\r\n }\r\n\r\n public createRawBuffer(viewOrSize: ArrayBufferView | number, flags: GPUBufferUsageFlags, mappedAtCreation = false, label?: string): GPUBuffer {\r\n const alignedLength = (viewOrSize as ArrayBufferView).byteLength !== undefined ? ((viewOrSize as ArrayBufferView).byteLength + 3) & ~3 : ((viewOrSize as number) + 3) & ~3; // 4 bytes alignments (because of the upload which requires this)\r\n const verticesBufferDescriptor = {\r\n label: WebGPUBufferManager._FlagsToString(flags, label ?? \"Buffer\") + \"_size\" + alignedLength,\r\n mappedAtCreation,\r\n size: alignedLength,\r\n usage: flags,\r\n };\r\n\r\n return this._device.createBuffer(verticesBufferDescriptor);\r\n }\r\n\r\n public createBuffer(viewOrSize: ArrayBufferView | number, flags: GPUBufferUsageFlags, label?: string): WebGPUDataBuffer {\r\n const isView = (viewOrSize as ArrayBufferView).byteLength !== undefined;\r\n const buffer = this.createRawBuffer(viewOrSize, flags, undefined, label);\r\n const dataBuffer = new WebGPUDataBuffer(buffer);\r\n dataBuffer.references = 1;\r\n dataBuffer.capacity = isView ? (viewOrSize as ArrayBufferView).byteLength : (viewOrSize as number);\r\n\r\n if (isView) {\r\n this.setSubData(dataBuffer, 0, viewOrSize as ArrayBufferView);\r\n }\r\n\r\n return dataBuffer;\r\n }\r\n\r\n public setRawData(buffer: GPUBuffer, dstByteOffset: number, src: ArrayBufferView, srcByteOffset: number, byteLength: number): void {\r\n this._device.queue.writeBuffer(buffer, dstByteOffset, src.buffer, srcByteOffset, byteLength);\r\n }\r\n\r\n public setSubData(dataBuffer: WebGPUDataBuffer, dstByteOffset: number, src: ArrayBufferView, srcByteOffset = 0, byteLength = 0): void {\r\n const buffer = dataBuffer.underlyingResource as GPUBuffer;\r\n\r\n byteLength = byteLength || src.byteLength;\r\n byteLength = Math.min(byteLength, dataBuffer.capacity - dstByteOffset);\r\n\r\n // After Migration to Canary\r\n let chunkStart = src.byteOffset + srcByteOffset;\r\n let chunkEnd = chunkStart + byteLength;\r\n\r\n // 4 bytes alignments for upload\r\n const alignedLength = (byteLength + 3) & ~3;\r\n if (alignedLength !== byteLength) {\r\n const tempView = new Uint8Array(src.buffer.slice(chunkStart, chunkEnd));\r\n src = new Uint8Array(alignedLength);\r\n (src as Uint8Array).set(tempView);\r\n srcByteOffset = 0;\r\n chunkStart = 0;\r\n chunkEnd = alignedLength;\r\n byteLength = alignedLength;\r\n }\r\n\r\n // Chunk\r\n const maxChunk = 1024 * 1024 * 15;\r\n let offset = 0;\r\n while (chunkEnd - (chunkStart + offset) > maxChunk) {\r\n this._device.queue.writeBuffer(buffer, dstByteOffset + offset, src.buffer, chunkStart + offset, maxChunk);\r\n offset += maxChunk;\r\n }\r\n\r\n this._device.queue.writeBuffer(buffer, dstByteOffset + offset, src.buffer, chunkStart + offset, byteLength - offset);\r\n }\r\n\r\n private _getHalfFloatAsFloatRGBAArrayBuffer(dataLength: number, arrayBuffer: ArrayBuffer, destArray?: Float32Array): Float32Array {\r\n if (!destArray) {\r\n destArray = new Float32Array(dataLength);\r\n }\r\n const srcData = new Uint16Array(arrayBuffer);\r\n while (dataLength--) {\r\n destArray[dataLength] = FromHalfFloat(srcData[dataLength]);\r\n }\r\n\r\n return destArray;\r\n }\r\n\r\n public readDataFromBuffer(\r\n gpuBuffer: GPUBuffer,\r\n size: number,\r\n width: number,\r\n height: number,\r\n bytesPerRow: number,\r\n bytesPerRowAligned: number,\r\n type = Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n offset = 0,\r\n buffer: Nullable<ArrayBufferView> = null,\r\n destroyBuffer = true,\r\n noDataConversion = false\r\n ): Promise<ArrayBufferView> {\r\n const floatFormat = type === Constants.TEXTURETYPE_FLOAT ? 2 : type === Constants.TEXTURETYPE_HALF_FLOAT ? 1 : 0;\r\n return new Promise((resolve, reject) => {\r\n gpuBuffer.mapAsync(WebGPUConstants.MapMode.Read, offset, size).then(\r\n () => {\r\n const copyArrayBuffer = gpuBuffer.getMappedRange(offset, size);\r\n let data: Nullable<ArrayBufferView> | Uint8Array | Float32Array = buffer;\r\n if (noDataConversion) {\r\n if (data === null) {\r\n data = allocateAndCopyTypedBuffer(type, size, true, copyArrayBuffer);\r\n } else {\r\n data = allocateAndCopyTypedBuffer(type, data.buffer, undefined, copyArrayBuffer);\r\n }\r\n } else {\r\n if (data === null) {\r\n switch (floatFormat) {\r\n case 0: // byte format\r\n data = new Uint8Array(size);\r\n (data as Uint8Array).set(new Uint8Array(copyArrayBuffer));\r\n break;\r\n case 1: // half float\r\n // TODO WEBGPU use computer shaders (or render pass) to make the conversion?\r\n data = this._getHalfFloatAsFloatRGBAArrayBuffer(size / 2, copyArrayBuffer);\r\n break;\r\n case 2: // float\r\n data = new Float32Array(size / 4);\r\n (data as Float32Array).set(new Float32Array(copyArrayBuffer));\r\n break;\r\n }\r\n } else {\r\n switch (floatFormat) {\r\n case 0: // byte format\r\n data = new Uint8Array(data.buffer);\r\n (data as Uint8Array).set(new Uint8Array(copyArrayBuffer));\r\n break;\r\n case 1: // half float\r\n // TODO WEBGPU use computer shaders (or render pass) to make the conversion?\r\n data = this._getHalfFloatAsFloatRGBAArrayBuffer(size / 2, copyArrayBuffer, buffer as Float32Array);\r\n break;\r\n case 2: // float\r\n data = new Float32Array(data.buffer);\r\n (data as Float32Array).set(new Float32Array(copyArrayBuffer));\r\n break;\r\n }\r\n }\r\n }\r\n if (bytesPerRow !== bytesPerRowAligned) {\r\n // TODO WEBGPU use computer shaders (or render pass) to build the final buffer data?\r\n if (floatFormat === 1 && !noDataConversion) {\r\n // half float have been converted to float above\r\n bytesPerRow *= 2;\r\n bytesPerRowAligned *= 2;\r\n }\r\n const data2 = new Uint8Array(data!.buffer);\r\n let offset = bytesPerRow,\r\n offset2 = 0;\r\n for (let y = 1; y < height; ++y) {\r\n offset2 = y * bytesPerRowAligned;\r\n for (let x = 0; x < bytesPerRow; ++x) {\r\n data2[offset++] = data2[offset2++];\r\n }\r\n }\r\n if (floatFormat !== 0 && !noDataConversion) {\r\n data = new Float32Array(data2.buffer, 0, offset / 4);\r\n } else {\r\n data = new Uint8Array(data2.buffer, 0, offset);\r\n }\r\n }\r\n gpuBuffer.unmap();\r\n if (destroyBuffer) {\r\n this.releaseBuffer(gpuBuffer);\r\n }\r\n resolve(data!);\r\n },\r\n (reason) => reject(reason)\r\n );\r\n });\r\n }\r\n\r\n public releaseBuffer(buffer: DataBuffer | GPUBuffer): boolean {\r\n if (WebGPUBufferManager._IsGPUBuffer(buffer)) {\r\n this._deferredReleaseBuffers.push(buffer);\r\n return true;\r\n }\r\n\r\n buffer.references--;\r\n\r\n if (buffer.references === 0) {\r\n this._deferredReleaseBuffers.push(buffer.underlyingResource as GPUBuffer);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public destroyDeferredBuffers(): void {\r\n for (let i = 0; i < this._deferredReleaseBuffers.length; ++i) {\r\n this._deferredReleaseBuffers[i].destroy();\r\n }\r\n\r\n this._deferredReleaseBuffers.length = 0;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"webgpuBufferManager.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuBufferManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DataBuffer } from \"../../Buffers/dataBuffer\";\r\nimport { WebGPUDataBuffer } from \"../../Meshes/WebGPU/webgpuDataBuffer\";\r\nimport { FromHalfFloat } from \"../../Misc/textureTools\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Constants } from \"../constants\";\r\nimport { allocateAndCopyTypedBuffer } from \"../Extensions/engine.readTexture\";\r\nimport type { WebGPUEngine } from \"../webgpuEngine\";\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\n\r\n/** @internal */\r\nexport class WebGPUBufferManager {\r\n private _engine: WebGPUEngine;\r\n private _device: GPUDevice;\r\n private _deferredReleaseBuffers: Array<GPUBuffer> = [];\r\n\r\n private static _IsGPUBuffer(buffer: DataBuffer | GPUBuffer): buffer is GPUBuffer {\r\n return (buffer as DataBuffer).underlyingResource === undefined;\r\n }\r\n\r\n private static _FlagsToString(flags: GPUBufferUsageFlags, suffix = \"\") {\r\n let result = suffix;\r\n\r\n for (let i = 0; i <= 9; ++i) {\r\n if (flags & (1 << i)) {\r\n if (result) {\r\n result += \"_\";\r\n }\r\n result += WebGPUConstants.BufferUsage[1 << i];\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n constructor(engine: WebGPUEngine, device: GPUDevice) {\r\n this._engine = engine;\r\n this._device = device;\r\n }\r\n\r\n public createRawBuffer(viewOrSize: ArrayBufferView | number, flags: GPUBufferUsageFlags, mappedAtCreation = false, label?: string): GPUBuffer {\r\n const alignedLength = (viewOrSize as ArrayBufferView).byteLength !== undefined ? ((viewOrSize as ArrayBufferView).byteLength + 3) & ~3 : ((viewOrSize as number) + 3) & ~3; // 4 bytes alignments (because of the upload which requires this)\r\n const verticesBufferDescriptor = {\r\n label: WebGPUBufferManager._FlagsToString(flags, label ?? \"Buffer\") + \"_size\" + alignedLength,\r\n mappedAtCreation,\r\n size: alignedLength,\r\n usage: flags,\r\n };\r\n\r\n return this._device.createBuffer(verticesBufferDescriptor);\r\n }\r\n\r\n public createBuffer(viewOrSize: ArrayBufferView | number, flags: GPUBufferUsageFlags, label?: string): WebGPUDataBuffer {\r\n const isView = (viewOrSize as ArrayBufferView).byteLength !== undefined;\r\n const buffer = this.createRawBuffer(viewOrSize, flags, undefined, label);\r\n const dataBuffer = new WebGPUDataBuffer(buffer);\r\n dataBuffer.references = 1;\r\n dataBuffer.capacity = isView ? (viewOrSize as ArrayBufferView).byteLength : (viewOrSize as number);\r\n\r\n if (isView) {\r\n this.setSubData(dataBuffer, 0, viewOrSize as ArrayBufferView);\r\n }\r\n\r\n return dataBuffer;\r\n }\r\n\r\n public setRawData(buffer: GPUBuffer, dstByteOffset: number, src: ArrayBufferView, srcByteOffset: number, byteLength: number): void {\r\n this._device.queue.writeBuffer(buffer, dstByteOffset, src.buffer, srcByteOffset, byteLength);\r\n }\r\n\r\n public setSubData(dataBuffer: WebGPUDataBuffer, dstByteOffset: number, src: ArrayBufferView, srcByteOffset = 0, byteLength = 0): void {\r\n const buffer = dataBuffer.underlyingResource as GPUBuffer;\r\n\r\n byteLength = byteLength || src.byteLength;\r\n byteLength = Math.min(byteLength, dataBuffer.capacity - dstByteOffset);\r\n\r\n // After Migration to Canary\r\n let chunkStart = src.byteOffset + srcByteOffset;\r\n let chunkEnd = chunkStart + byteLength;\r\n\r\n // 4 bytes alignments for upload\r\n const alignedLength = (byteLength + 3) & ~3;\r\n if (alignedLength !== byteLength) {\r\n const tempView = new Uint8Array(src.buffer.slice(chunkStart, chunkEnd));\r\n src = new Uint8Array(alignedLength);\r\n (src as Uint8Array).set(tempView);\r\n srcByteOffset = 0;\r\n chunkStart = 0;\r\n chunkEnd = alignedLength;\r\n byteLength = alignedLength;\r\n }\r\n\r\n // Chunk\r\n const maxChunk = 1024 * 1024 * 15;\r\n let offset = 0;\r\n while (chunkEnd - (chunkStart + offset) > maxChunk) {\r\n this._device.queue.writeBuffer(buffer, dstByteOffset + offset, src.buffer, chunkStart + offset, maxChunk);\r\n offset += maxChunk;\r\n }\r\n\r\n this._device.queue.writeBuffer(buffer, dstByteOffset + offset, src.buffer, chunkStart + offset, byteLength - offset);\r\n }\r\n\r\n private _getHalfFloatAsFloatRGBAArrayBuffer(dataLength: number, arrayBuffer: ArrayBuffer, destArray?: Float32Array): Float32Array {\r\n if (!destArray) {\r\n destArray = new Float32Array(dataLength);\r\n }\r\n const srcData = new Uint16Array(arrayBuffer);\r\n while (dataLength--) {\r\n destArray[dataLength] = FromHalfFloat(srcData[dataLength]);\r\n }\r\n\r\n return destArray;\r\n }\r\n\r\n public readDataFromBuffer(\r\n gpuBuffer: GPUBuffer,\r\n size: number,\r\n width: number,\r\n height: number,\r\n bytesPerRow: number,\r\n bytesPerRowAligned: number,\r\n type = Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n offset = 0,\r\n buffer: Nullable<ArrayBufferView> = null,\r\n destroyBuffer = true,\r\n noDataConversion = false\r\n ): Promise<ArrayBufferView> {\r\n const floatFormat = type === Constants.TEXTURETYPE_FLOAT ? 2 : type === Constants.TEXTURETYPE_HALF_FLOAT ? 1 : 0;\r\n return new Promise((resolve, reject) => {\r\n gpuBuffer.mapAsync(WebGPUConstants.MapMode.Read, offset, size).then(\r\n () => {\r\n const copyArrayBuffer = gpuBuffer.getMappedRange(offset, size);\r\n let data: Nullable<ArrayBufferView> | Uint8Array | Float32Array = buffer;\r\n if (noDataConversion) {\r\n if (data === null) {\r\n data = allocateAndCopyTypedBuffer(type, size, true, copyArrayBuffer);\r\n } else {\r\n data = allocateAndCopyTypedBuffer(type, data.buffer, undefined, copyArrayBuffer);\r\n }\r\n } else {\r\n if (data === null) {\r\n switch (floatFormat) {\r\n case 0: // byte format\r\n data = new Uint8Array(size);\r\n (data as Uint8Array).set(new Uint8Array(copyArrayBuffer));\r\n break;\r\n case 1: // half float\r\n // TODO WEBGPU use computer shaders (or render pass) to make the conversion?\r\n data = this._getHalfFloatAsFloatRGBAArrayBuffer(size / 2, copyArrayBuffer);\r\n break;\r\n case 2: // float\r\n data = new Float32Array(size / 4);\r\n (data as Float32Array).set(new Float32Array(copyArrayBuffer));\r\n break;\r\n }\r\n } else {\r\n switch (floatFormat) {\r\n case 0: // byte format\r\n data = new Uint8Array(data.buffer);\r\n (data as Uint8Array).set(new Uint8Array(copyArrayBuffer));\r\n break;\r\n case 1: // half float\r\n // TODO WEBGPU use computer shaders (or render pass) to make the conversion?\r\n data = this._getHalfFloatAsFloatRGBAArrayBuffer(size / 2, copyArrayBuffer, buffer as Float32Array);\r\n break;\r\n case 2: // float\r\n data = new Float32Array(data.buffer);\r\n (data as Float32Array).set(new Float32Array(copyArrayBuffer));\r\n break;\r\n }\r\n }\r\n }\r\n if (bytesPerRow !== bytesPerRowAligned) {\r\n // TODO WEBGPU use computer shaders (or render pass) to build the final buffer data?\r\n if (floatFormat === 1 && !noDataConversion) {\r\n // half float have been converted to float above\r\n bytesPerRow *= 2;\r\n bytesPerRowAligned *= 2;\r\n }\r\n const data2 = new Uint8Array(data!.buffer);\r\n let offset = bytesPerRow,\r\n offset2 = 0;\r\n for (let y = 1; y < height; ++y) {\r\n offset2 = y * bytesPerRowAligned;\r\n for (let x = 0; x < bytesPerRow; ++x) {\r\n data2[offset++] = data2[offset2++];\r\n }\r\n }\r\n if (floatFormat !== 0 && !noDataConversion) {\r\n data = new Float32Array(data2.buffer, 0, offset / 4);\r\n } else {\r\n data = new Uint8Array(data2.buffer, 0, offset);\r\n }\r\n }\r\n gpuBuffer.unmap();\r\n if (destroyBuffer) {\r\n this.releaseBuffer(gpuBuffer);\r\n }\r\n resolve(data!);\r\n },\r\n (reason) => {\r\n if (this._engine.isDisposed) {\r\n resolve(new Uint8Array());\r\n } else {\r\n reject(reason);\r\n }\r\n }\r\n );\r\n });\r\n }\r\n\r\n public releaseBuffer(buffer: DataBuffer | GPUBuffer): boolean {\r\n if (WebGPUBufferManager._IsGPUBuffer(buffer)) {\r\n this._deferredReleaseBuffers.push(buffer);\r\n return true;\r\n }\r\n\r\n buffer.references--;\r\n\r\n if (buffer.references === 0) {\r\n this._deferredReleaseBuffers.push(buffer.underlyingResource as GPUBuffer);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public destroyDeferredBuffers(): void {\r\n for (let i = 0; i < this._deferredReleaseBuffers.length; ++i) {\r\n this._deferredReleaseBuffers[i].destroy();\r\n }\r\n\r\n this._deferredReleaseBuffers.length = 0;\r\n }\r\n}\r\n"]}
|
|
@@ -67,7 +67,7 @@ export class WebGPUOcclusionQuery {
|
|
|
67
67
|
this._availableIndices.push(this._currentTotalIndices + i);
|
|
68
68
|
}
|
|
69
69
|
this._currentTotalIndices += numIndices;
|
|
70
|
-
this._querySet = new WebGPUQuerySet(this._currentTotalIndices, WebGPUConstants.QueryType.Occlusion, this._device, this._bufferManager, false, "QuerySet_OcclusionQuery_count_" + this._currentTotalIndices);
|
|
70
|
+
this._querySet = new WebGPUQuerySet(this._engine, this._currentTotalIndices, WebGPUConstants.QueryType.Occlusion, this._device, this._bufferManager, false, "QuerySet_OcclusionQuery_count_" + this._currentTotalIndices);
|
|
71
71
|
this._frameQuerySetIsDirty = this._engine.frameId;
|
|
72
72
|
}
|
|
73
73
|
_delayQuerySetDispose() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgpuOcclusionQuery.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuOcclusionQuery.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,eAAe,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,gBAAgB;AAChB,MAAM,OAAO,oBAAoB;IAc7B,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;IACnC,CAAC;IAED,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,oBAAoB,KAAK,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC;IACvE,CAAC;IAEM,aAAa,CAAC,KAAa;QAC9B,IAAI,IAAI,CAAC,qBAAqB,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YAC3G,OAAO,KAAK,CAAC;SAChB;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,4BAA4B,EAAE,CAAC,oBAAqB,CAAC,iBAAiB,KAAK,SAAS,CAAC;QAEnH,IAAI,QAAQ,EAAE;YACV,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;SACpD;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,YAAY,MAAoB,EAAE,MAAiB,EAAE,aAAkC,EAAE,UAAU,GAAG,EAAE,EAAE,cAAc,GAAG,GAAG;QA5BtH,sBAAiB,GAAa,EAAE,CAAC;QAGjC,0BAAqB,GAAG,CAAC,CAAC,CAAC;QAC3B,kBAAa,GAAa,EAAE,CAAC;QAyBjC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QAEpC,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;QAEtC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;IAEM,WAAW;QACd,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE;YACrC,IAAI,CAAC,mBAAmB,EAAE,CAAC;SAC9B;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC;QAEhC,OAAO,KAAK,CAAC;IACjB,CAAC;IAEM,WAAW,CAAC,KAAa;QAC5B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;IAClE,CAAC;IAEM,sBAAsB,CAAC,KAAa;QACvC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAE5B,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;IACjE,CAAC;IAEM,cAAc,CAAC,KAAa;;QAC/B,OAAO,MAAM,CAAC,MAAA,MAAA,IAAI,CAAC,WAAW,0CAAG,KAAK,CAAC,mCAAI,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAEO,oBAAoB;QACxB,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACpE,OAAO;SACV;QAED,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YAChD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YAC7C,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE;gBACzE,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;YACnC,CAAC,CAAC,CAAC;SACN;IACL,CAAC;IAEO,mBAAmB,CAAC,UAAmB;QAC3C,UAAU,GAAG,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,IAAI,CAAC,eAAe,CAAC;QAEhD,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,EAAE,CAAC,EAAE;YACjC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC,CAAC;SAC9D;QAED,IAAI,CAAC,oBAAoB,IAAI,UAAU,CAAC;QACxC,IAAI,CAAC,SAAS,GAAG,IAAI,cAAc,CAC/B,IAAI,CAAC,oBAAoB,EACzB,eAAe,CAAC,SAAS,CAAC,SAAS,EACnC,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,cAAc,EACnB,KAAK,EACL,gCAAgC,GAAG,IAAI,CAAC,oBAAoB,CAC/D,CAAC;QAEF,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IACtD,CAAC;IAEO,qBAAqB;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,QAAQ,EAAE;YACV,6FAA6F;YAC7F,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;SAC5C;IACL,CAAC;IAEM,OAAO;;QACV,MAAA,IAAI,CAAC,SAAS,0CAAE,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC;IACtC,CAAC;CACJ","sourcesContent":["import type { Nullable } from \"../../types\";\r\nimport type { WebGPUEngine } from \"../webgpuEngine\";\r\nimport type { WebGPUBufferManager } from \"./webgpuBufferManager\";\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\nimport { WebGPUQuerySet } from \"./webgpuQuerySet\";\r\n\r\n/** @internal */\r\nexport class WebGPUOcclusionQuery {\r\n private _engine: WebGPUEngine;\r\n private _device: GPUDevice;\r\n private _bufferManager: WebGPUBufferManager;\r\n\r\n private _currentTotalIndices: number;\r\n private _countIncrement: number;\r\n private _querySet: WebGPUQuerySet;\r\n private _availableIndices: number[] = [];\r\n private _lastBuffer: Nullable<BigUint64Array>;\r\n private _frameLastBuffer: number;\r\n private _frameQuerySetIsDirty = -1;\r\n private _queryFrameId: number[] = [];\r\n\r\n public get querySet(): GPUQuerySet {\r\n return this._querySet.querySet;\r\n }\r\n\r\n public get hasQueries(): boolean {\r\n return this._currentTotalIndices !== this._availableIndices.length;\r\n }\r\n\r\n public canBeginQuery(index: number): boolean {\r\n if (this._frameQuerySetIsDirty === this._engine.frameId || this._queryFrameId[index] === this._engine.frameId) {\r\n return false;\r\n }\r\n\r\n const canBegin = this._engine._getCurrentRenderPassWrapper().renderPassDescriptor!.occlusionQuerySet !== undefined;\r\n\r\n if (canBegin) {\r\n this._queryFrameId[index] = this._engine.frameId;\r\n }\r\n\r\n return canBegin;\r\n }\r\n\r\n constructor(engine: WebGPUEngine, device: GPUDevice, bufferManager: WebGPUBufferManager, startCount = 50, incrementCount = 100) {\r\n this._engine = engine;\r\n this._device = device;\r\n this._bufferManager = bufferManager;\r\n\r\n this._frameLastBuffer = -1;\r\n this._currentTotalIndices = 0;\r\n this._countIncrement = incrementCount;\r\n\r\n this._allocateNewIndices(startCount);\r\n }\r\n\r\n public createQuery(): number {\r\n if (this._availableIndices.length === 0) {\r\n this._allocateNewIndices();\r\n }\r\n\r\n const index = this._availableIndices[this._availableIndices.length - 1];\r\n this._availableIndices.length--;\r\n\r\n return index;\r\n }\r\n\r\n public deleteQuery(index: number): void {\r\n this._availableIndices[this._availableIndices.length] = index;\r\n }\r\n\r\n public isQueryResultAvailable(index: number): boolean {\r\n this._retrieveQueryBuffer();\r\n\r\n return !!this._lastBuffer && index < this._lastBuffer.length;\r\n }\r\n\r\n public getQueryResult(index: number): number {\r\n return Number(this._lastBuffer?.[index] ?? -1);\r\n }\r\n\r\n private _retrieveQueryBuffer(): void {\r\n if (this._lastBuffer && this._frameLastBuffer === this._engine.frameId) {\r\n return;\r\n }\r\n\r\n if (this._frameLastBuffer !== this._engine.frameId) {\r\n this._frameLastBuffer = this._engine.frameId;\r\n this._querySet.readValues(0, this._currentTotalIndices).then((arrayBuffer) => {\r\n this._lastBuffer = arrayBuffer;\r\n });\r\n }\r\n }\r\n\r\n private _allocateNewIndices(numIndices?: number): void {\r\n numIndices = numIndices ?? this._countIncrement;\r\n\r\n this._delayQuerySetDispose();\r\n\r\n for (let i = 0; i < numIndices; ++i) {\r\n this._availableIndices.push(this._currentTotalIndices + i);\r\n }\r\n\r\n this._currentTotalIndices += numIndices;\r\n this._querySet = new WebGPUQuerySet(\r\n this._currentTotalIndices,\r\n WebGPUConstants.QueryType.Occlusion,\r\n this._device,\r\n this._bufferManager,\r\n false,\r\n \"QuerySet_OcclusionQuery_count_\" + this._currentTotalIndices\r\n );\r\n\r\n this._frameQuerySetIsDirty = this._engine.frameId;\r\n }\r\n\r\n private _delayQuerySetDispose(): void {\r\n const querySet = this._querySet;\r\n if (querySet) {\r\n // Wait a bit before disposing of the queryset, in case some queries are still running for it\r\n setTimeout(() => querySet.dispose, 1000);\r\n }\r\n }\r\n\r\n public dispose(): void {\r\n this._querySet?.dispose();\r\n this._availableIndices.length = 0;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"webgpuOcclusionQuery.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuOcclusionQuery.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../../types\";\r\nimport type { WebGPUEngine } from \"../webgpuEngine\";\r\nimport type { WebGPUBufferManager } from \"./webgpuBufferManager\";\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\nimport { WebGPUQuerySet } from \"./webgpuQuerySet\";\r\n\r\n/** @internal */\r\nexport class WebGPUOcclusionQuery {\r\n private _engine: WebGPUEngine;\r\n private _device: GPUDevice;\r\n private _bufferManager: WebGPUBufferManager;\r\n\r\n private _currentTotalIndices: number;\r\n private _countIncrement: number;\r\n private _querySet: WebGPUQuerySet;\r\n private _availableIndices: number[] = [];\r\n private _lastBuffer: Nullable<BigUint64Array>;\r\n private _frameLastBuffer: number;\r\n private _frameQuerySetIsDirty = -1;\r\n private _queryFrameId: number[] = [];\r\n\r\n public get querySet(): GPUQuerySet {\r\n return this._querySet.querySet;\r\n }\r\n\r\n public get hasQueries(): boolean {\r\n return this._currentTotalIndices !== this._availableIndices.length;\r\n }\r\n\r\n public canBeginQuery(index: number): boolean {\r\n if (this._frameQuerySetIsDirty === this._engine.frameId || this._queryFrameId[index] === this._engine.frameId) {\r\n return false;\r\n }\r\n\r\n const canBegin = this._engine._getCurrentRenderPassWrapper().renderPassDescriptor!.occlusionQuerySet !== undefined;\r\n\r\n if (canBegin) {\r\n this._queryFrameId[index] = this._engine.frameId;\r\n }\r\n\r\n return canBegin;\r\n }\r\n\r\n constructor(engine: WebGPUEngine, device: GPUDevice, bufferManager: WebGPUBufferManager, startCount = 50, incrementCount = 100) {\r\n this._engine = engine;\r\n this._device = device;\r\n this._bufferManager = bufferManager;\r\n\r\n this._frameLastBuffer = -1;\r\n this._currentTotalIndices = 0;\r\n this._countIncrement = incrementCount;\r\n\r\n this._allocateNewIndices(startCount);\r\n }\r\n\r\n public createQuery(): number {\r\n if (this._availableIndices.length === 0) {\r\n this._allocateNewIndices();\r\n }\r\n\r\n const index = this._availableIndices[this._availableIndices.length - 1];\r\n this._availableIndices.length--;\r\n\r\n return index;\r\n }\r\n\r\n public deleteQuery(index: number): void {\r\n this._availableIndices[this._availableIndices.length] = index;\r\n }\r\n\r\n public isQueryResultAvailable(index: number): boolean {\r\n this._retrieveQueryBuffer();\r\n\r\n return !!this._lastBuffer && index < this._lastBuffer.length;\r\n }\r\n\r\n public getQueryResult(index: number): number {\r\n return Number(this._lastBuffer?.[index] ?? -1);\r\n }\r\n\r\n private _retrieveQueryBuffer(): void {\r\n if (this._lastBuffer && this._frameLastBuffer === this._engine.frameId) {\r\n return;\r\n }\r\n\r\n if (this._frameLastBuffer !== this._engine.frameId) {\r\n this._frameLastBuffer = this._engine.frameId;\r\n this._querySet.readValues(0, this._currentTotalIndices).then((arrayBuffer) => {\r\n this._lastBuffer = arrayBuffer;\r\n });\r\n }\r\n }\r\n\r\n private _allocateNewIndices(numIndices?: number): void {\r\n numIndices = numIndices ?? this._countIncrement;\r\n\r\n this._delayQuerySetDispose();\r\n\r\n for (let i = 0; i < numIndices; ++i) {\r\n this._availableIndices.push(this._currentTotalIndices + i);\r\n }\r\n\r\n this._currentTotalIndices += numIndices;\r\n this._querySet = new WebGPUQuerySet(\r\n this._engine,\r\n this._currentTotalIndices,\r\n WebGPUConstants.QueryType.Occlusion,\r\n this._device,\r\n this._bufferManager,\r\n false,\r\n \"QuerySet_OcclusionQuery_count_\" + this._currentTotalIndices\r\n );\r\n\r\n this._frameQuerySetIsDirty = this._engine.frameId;\r\n }\r\n\r\n private _delayQuerySetDispose(): void {\r\n const querySet = this._querySet;\r\n if (querySet) {\r\n // Wait a bit before disposing of the queryset, in case some queries are still running for it\r\n setTimeout(() => querySet.dispose, 1000);\r\n }\r\n }\r\n\r\n public dispose(): void {\r\n this._querySet?.dispose();\r\n this._availableIndices.length = 0;\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { PerfCounter } from "../../Misc/perfCounter";
|
|
2
|
+
/**
|
|
3
|
+
* Class used to define a WebGPU performance counter
|
|
4
|
+
*/
|
|
5
|
+
export declare class WebGPUPerfCounter {
|
|
6
|
+
private _gpuTimeInFrameId;
|
|
7
|
+
/**
|
|
8
|
+
* The GPU time in nanoseconds spent in the last frame
|
|
9
|
+
*/
|
|
10
|
+
counter: PerfCounter;
|
|
11
|
+
/**
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
_addDuration(currentFrameId: number, duration: number): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { PerfCounter } from "../../Misc/perfCounter.js";
|
|
2
|
+
/**
|
|
3
|
+
* Class used to define a WebGPU performance counter
|
|
4
|
+
*/
|
|
5
|
+
export class WebGPUPerfCounter {
|
|
6
|
+
constructor() {
|
|
7
|
+
this._gpuTimeInFrameId = -1;
|
|
8
|
+
/**
|
|
9
|
+
* The GPU time in nanoseconds spent in the last frame
|
|
10
|
+
*/
|
|
11
|
+
this.counter = new PerfCounter();
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* @internal
|
|
15
|
+
*/
|
|
16
|
+
_addDuration(currentFrameId, duration) {
|
|
17
|
+
if (currentFrameId < this._gpuTimeInFrameId) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (this._gpuTimeInFrameId !== currentFrameId) {
|
|
21
|
+
this.counter._fetchResult();
|
|
22
|
+
this.counter.fetchNewFrame();
|
|
23
|
+
this.counter.addCount(duration, false);
|
|
24
|
+
this._gpuTimeInFrameId = currentFrameId;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
this.counter.addCount(duration, false);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=webgpuPerfCounter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgpuPerfCounter.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuPerfCounter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAA9B;QACY,sBAAiB,GAAG,CAAC,CAAC,CAAC;QAE/B;;WAEG;QACI,YAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAkBvC,CAAC;IAhBG;;OAEG;IACI,YAAY,CAAC,cAAsB,EAAE,QAAgB;QACxD,IAAI,cAAc,GAAG,IAAI,CAAC,iBAAiB,EAAE;YACzC,OAAO;SACV;QACD,IAAI,IAAI,CAAC,iBAAiB,KAAK,cAAc,EAAE;YAC3C,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YAC7B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACvC,IAAI,CAAC,iBAAiB,GAAG,cAAc,CAAC;SAC3C;aAAM;YACH,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;SAC1C;IACL,CAAC;CACJ","sourcesContent":["import { PerfCounter } from \"../../Misc/perfCounter\";\r\n\r\n/**\r\n * Class used to define a WebGPU performance counter\r\n */\r\nexport class WebGPUPerfCounter {\r\n private _gpuTimeInFrameId = -1;\r\n\r\n /**\r\n * The GPU time in nanoseconds spent in the last frame\r\n */\r\n public counter = new PerfCounter();\r\n\r\n /**\r\n * @internal\r\n */\r\n public _addDuration(currentFrameId: number, duration: number) {\r\n if (currentFrameId < this._gpuTimeInFrameId) {\r\n return;\r\n }\r\n if (this._gpuTimeInFrameId !== currentFrameId) {\r\n this.counter._fetchResult();\r\n this.counter.fetchNewFrame();\r\n this.counter.addCount(duration, false);\r\n this._gpuTimeInFrameId = currentFrameId;\r\n } else {\r\n this.counter.addCount(duration, false);\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import type { WebGPUEngine } from "../webgpuEngine";
|
|
1
2
|
import type { WebGPUBufferManager } from "./webgpuBufferManager";
|
|
2
3
|
import type { QueryType } from "./webgpuConstants";
|
|
3
4
|
/** @internal */
|
|
4
5
|
export declare class WebGPUQuerySet {
|
|
6
|
+
private _engine;
|
|
5
7
|
private _device;
|
|
6
8
|
private _bufferManager;
|
|
7
9
|
private _count;
|
|
@@ -10,7 +12,7 @@ export declare class WebGPUQuerySet {
|
|
|
10
12
|
private _queryBuffer;
|
|
11
13
|
private _dstBuffers;
|
|
12
14
|
get querySet(): GPUQuerySet;
|
|
13
|
-
constructor(count: number, type: QueryType, device: GPUDevice, bufferManager: WebGPUBufferManager, canUseMultipleBuffers?: boolean, label?: string);
|
|
15
|
+
constructor(engine: WebGPUEngine, count: number, type: QueryType, device: GPUDevice, bufferManager: WebGPUBufferManager, canUseMultipleBuffers?: boolean, label?: string);
|
|
14
16
|
private _getBuffer;
|
|
15
17
|
readValues(firstQuery?: number, queryCount?: number): Promise<BigUint64Array | null>;
|
|
16
18
|
readValue(firstQuery?: number): Promise<number | null>;
|
|
@@ -4,8 +4,9 @@ export class WebGPUQuerySet {
|
|
|
4
4
|
get querySet() {
|
|
5
5
|
return this._querySet;
|
|
6
6
|
}
|
|
7
|
-
constructor(count, type, device, bufferManager, canUseMultipleBuffers = true, label) {
|
|
7
|
+
constructor(engine, count, type, device, bufferManager, canUseMultipleBuffers = true, label) {
|
|
8
8
|
this._dstBuffers = [];
|
|
9
|
+
this._engine = engine;
|
|
9
10
|
this._device = device;
|
|
10
11
|
this._bufferManager = bufferManager;
|
|
11
12
|
this._count = count;
|
|
@@ -43,35 +44,53 @@ export class WebGPUQuerySet {
|
|
|
43
44
|
if (buffer === null) {
|
|
44
45
|
return null;
|
|
45
46
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
return buffer.mapAsync(WebGPUConstants.MapMode.Read).then(() => {
|
|
48
|
+
const arrayBuf = new BigUint64Array(buffer.getMappedRange()).slice();
|
|
49
|
+
buffer.unmap();
|
|
50
|
+
this._dstBuffers[this._dstBuffers.length] = buffer;
|
|
51
|
+
return arrayBuf;
|
|
52
|
+
}, (err) => {
|
|
53
|
+
if (this._engine.isDisposed) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
throw err;
|
|
57
|
+
});
|
|
51
58
|
}
|
|
52
59
|
async readValue(firstQuery = 0) {
|
|
53
60
|
const buffer = this._getBuffer(firstQuery, 1);
|
|
54
61
|
if (buffer === null) {
|
|
55
62
|
return null;
|
|
56
63
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
64
|
+
return buffer.mapAsync(WebGPUConstants.MapMode.Read).then(() => {
|
|
65
|
+
const arrayBuf = new BigUint64Array(buffer.getMappedRange());
|
|
66
|
+
const value = Number(arrayBuf[0]);
|
|
67
|
+
buffer.unmap();
|
|
68
|
+
this._dstBuffers[this._dstBuffers.length] = buffer;
|
|
69
|
+
return value;
|
|
70
|
+
}, (err) => {
|
|
71
|
+
if (this._engine.isDisposed) {
|
|
72
|
+
return 0;
|
|
73
|
+
}
|
|
74
|
+
throw err;
|
|
75
|
+
});
|
|
63
76
|
}
|
|
64
77
|
async readTwoValuesAndSubtract(firstQuery = 0) {
|
|
65
78
|
const buffer = this._getBuffer(firstQuery, 2);
|
|
66
79
|
if (buffer === null) {
|
|
67
80
|
return null;
|
|
68
81
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
82
|
+
return buffer.mapAsync(WebGPUConstants.MapMode.Read).then(() => {
|
|
83
|
+
const arrayBuf = new BigUint64Array(buffer.getMappedRange());
|
|
84
|
+
const value = Number(arrayBuf[1] - arrayBuf[0]);
|
|
85
|
+
buffer.unmap();
|
|
86
|
+
this._dstBuffers[this._dstBuffers.length] = buffer;
|
|
87
|
+
return value;
|
|
88
|
+
}, (err) => {
|
|
89
|
+
if (this._engine.isDisposed) {
|
|
90
|
+
return 0;
|
|
91
|
+
}
|
|
92
|
+
throw err;
|
|
93
|
+
});
|
|
75
94
|
}
|
|
76
95
|
dispose() {
|
|
77
96
|
this._querySet.destroy();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgpuQuerySet.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuQuerySet.ts"],"names":[],"mappings":"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","sourcesContent":["import type { WebGPUBufferManager } from \"./webgpuBufferManager\";\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\nimport type { QueryType } from \"./webgpuConstants\";\r\n\r\n/** @internal */\r\nexport class WebGPUQuerySet {\r\n private _device: GPUDevice;\r\n private _bufferManager: WebGPUBufferManager;\r\n\r\n private _count: number;\r\n private _canUseMultipleBuffers: boolean;\r\n private _querySet: GPUQuerySet;\r\n private _queryBuffer: GPUBuffer;\r\n private _dstBuffers: GPUBuffer[] = [];\r\n\r\n public get querySet(): GPUQuerySet {\r\n return this._querySet;\r\n }\r\n\r\n constructor(count: number, type: QueryType, device: GPUDevice, bufferManager: WebGPUBufferManager, canUseMultipleBuffers = true, label?: string) {\r\n this._device = device;\r\n this._bufferManager = bufferManager;\r\n this._count = count;\r\n this._canUseMultipleBuffers = canUseMultipleBuffers;\r\n\r\n this._querySet = device.createQuerySet({\r\n label,\r\n type,\r\n count,\r\n });\r\n\r\n this._queryBuffer = bufferManager.createRawBuffer(8 * count, WebGPUConstants.BufferUsage.QueryResolve | WebGPUConstants.BufferUsage.CopySrc, undefined, \"QueryBuffer\");\r\n\r\n if (!canUseMultipleBuffers) {\r\n this._dstBuffers.push(\r\n this._bufferManager.createRawBuffer(\r\n 8 * this._count,\r\n WebGPUConstants.BufferUsage.MapRead | WebGPUConstants.BufferUsage.CopyDst,\r\n undefined,\r\n \"QueryBufferNoMultipleBuffers\"\r\n )\r\n );\r\n }\r\n }\r\n\r\n private _getBuffer(firstQuery: number, queryCount: number): GPUBuffer | null {\r\n if (!this._canUseMultipleBuffers && this._dstBuffers.length === 0) {\r\n return null;\r\n }\r\n\r\n const encoderResult = this._device.createCommandEncoder();\r\n\r\n let buffer: GPUBuffer;\r\n if (this._dstBuffers.length === 0) {\r\n buffer = this._bufferManager.createRawBuffer(\r\n 8 * this._count,\r\n WebGPUConstants.BufferUsage.MapRead | WebGPUConstants.BufferUsage.CopyDst,\r\n undefined,\r\n \"QueryBufferAdditionalBuffer\"\r\n );\r\n } else {\r\n buffer = this._dstBuffers[this._dstBuffers.length - 1];\r\n this._dstBuffers.length--;\r\n }\r\n\r\n encoderResult.resolveQuerySet(this._querySet, firstQuery, queryCount, this._queryBuffer, 0);\r\n encoderResult.copyBufferToBuffer(this._queryBuffer, 0, buffer, 0, 8 * queryCount);\r\n\r\n this._device.queue.submit([encoderResult.finish()]);\r\n\r\n return buffer;\r\n }\r\n\r\n public async readValues(firstQuery = 0, queryCount = 1): Promise<BigUint64Array | null> {\r\n const buffer = this._getBuffer(firstQuery, queryCount);\r\n if (buffer === null) {\r\n return null;\r\n }\r\n\r\n await buffer.mapAsync(WebGPUConstants.MapMode.Read);\r\n\r\n const arrayBuf = new BigUint64Array(buffer.getMappedRange()).slice();\r\n\r\n buffer.unmap();\r\n\r\n this._dstBuffers[this._dstBuffers.length] = buffer;\r\n\r\n return arrayBuf;\r\n }\r\n\r\n public async readValue(firstQuery = 0): Promise<number | null> {\r\n const buffer = this._getBuffer(firstQuery, 1);\r\n if (buffer === null) {\r\n return null;\r\n }\r\n\r\n await buffer.mapAsync(WebGPUConstants.MapMode.Read);\r\n\r\n const arrayBuf = new BigUint64Array(buffer.getMappedRange());\r\n const value = Number(arrayBuf[0]);\r\n\r\n buffer.unmap();\r\n\r\n this._dstBuffers[this._dstBuffers.length] = buffer;\r\n\r\n return value;\r\n }\r\n\r\n public async readTwoValuesAndSubtract(firstQuery = 0): Promise<number | null> {\r\n const buffer = this._getBuffer(firstQuery, 2);\r\n if (buffer === null) {\r\n return null;\r\n }\r\n\r\n await buffer.mapAsync(WebGPUConstants.MapMode.Read);\r\n\r\n const arrayBuf = new BigUint64Array(buffer.getMappedRange());\r\n const value = Number(arrayBuf[1] - arrayBuf[0]);\r\n\r\n buffer.unmap();\r\n\r\n this._dstBuffers[this._dstBuffers.length] = buffer;\r\n\r\n return value;\r\n }\r\n\r\n public dispose() {\r\n this._querySet.destroy();\r\n this._bufferManager.releaseBuffer(this._queryBuffer);\r\n for (let i = 0; i < this._dstBuffers.length; ++i) {\r\n this._bufferManager.releaseBuffer(this._dstBuffers[i]);\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"webgpuQuerySet.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuQuerySet.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable babylonjs/available */\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { WebGPUEngine } from \"../webgpuEngine\";\r\nimport type { WebGPUBufferManager } from \"./webgpuBufferManager\";\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\nimport type { QueryType } from \"./webgpuConstants\";\r\n\r\n/** @internal */\r\nexport class WebGPUQuerySet {\r\n private _engine: WebGPUEngine;\r\n private _device: GPUDevice;\r\n private _bufferManager: WebGPUBufferManager;\r\n\r\n private _count: number;\r\n private _canUseMultipleBuffers: boolean;\r\n private _querySet: GPUQuerySet;\r\n private _queryBuffer: GPUBuffer;\r\n private _dstBuffers: GPUBuffer[] = [];\r\n\r\n public get querySet(): GPUQuerySet {\r\n return this._querySet;\r\n }\r\n\r\n constructor(engine: WebGPUEngine, count: number, type: QueryType, device: GPUDevice, bufferManager: WebGPUBufferManager, canUseMultipleBuffers = true, label?: string) {\r\n this._engine = engine;\r\n this._device = device;\r\n this._bufferManager = bufferManager;\r\n this._count = count;\r\n this._canUseMultipleBuffers = canUseMultipleBuffers;\r\n\r\n this._querySet = device.createQuerySet({\r\n label,\r\n type,\r\n count,\r\n });\r\n\r\n this._queryBuffer = bufferManager.createRawBuffer(8 * count, WebGPUConstants.BufferUsage.QueryResolve | WebGPUConstants.BufferUsage.CopySrc, undefined, \"QueryBuffer\");\r\n\r\n if (!canUseMultipleBuffers) {\r\n this._dstBuffers.push(\r\n this._bufferManager.createRawBuffer(\r\n 8 * this._count,\r\n WebGPUConstants.BufferUsage.MapRead | WebGPUConstants.BufferUsage.CopyDst,\r\n undefined,\r\n \"QueryBufferNoMultipleBuffers\"\r\n )\r\n );\r\n }\r\n }\r\n\r\n private _getBuffer(firstQuery: number, queryCount: number): GPUBuffer | null {\r\n if (!this._canUseMultipleBuffers && this._dstBuffers.length === 0) {\r\n return null;\r\n }\r\n\r\n const encoderResult = this._device.createCommandEncoder();\r\n\r\n let buffer: GPUBuffer;\r\n if (this._dstBuffers.length === 0) {\r\n buffer = this._bufferManager.createRawBuffer(\r\n 8 * this._count,\r\n WebGPUConstants.BufferUsage.MapRead | WebGPUConstants.BufferUsage.CopyDst,\r\n undefined,\r\n \"QueryBufferAdditionalBuffer\"\r\n );\r\n } else {\r\n buffer = this._dstBuffers[this._dstBuffers.length - 1];\r\n this._dstBuffers.length--;\r\n }\r\n\r\n encoderResult.resolveQuerySet(this._querySet, firstQuery, queryCount, this._queryBuffer, 0);\r\n encoderResult.copyBufferToBuffer(this._queryBuffer, 0, buffer, 0, 8 * queryCount);\r\n\r\n this._device.queue.submit([encoderResult.finish()]);\r\n\r\n return buffer;\r\n }\r\n\r\n public async readValues(firstQuery = 0, queryCount = 1): Promise<BigUint64Array | null> {\r\n const buffer = this._getBuffer(firstQuery, queryCount);\r\n if (buffer === null) {\r\n return null;\r\n }\r\n\r\n return buffer.mapAsync(WebGPUConstants.MapMode.Read).then(\r\n () => {\r\n const arrayBuf = new BigUint64Array(buffer.getMappedRange()).slice();\r\n\r\n buffer.unmap();\r\n\r\n this._dstBuffers[this._dstBuffers.length] = buffer;\r\n\r\n return arrayBuf;\r\n },\r\n (err) => {\r\n if (this._engine.isDisposed) {\r\n return null;\r\n }\r\n throw err;\r\n }\r\n );\r\n }\r\n\r\n public async readValue(firstQuery = 0): Promise<number | null> {\r\n const buffer = this._getBuffer(firstQuery, 1);\r\n if (buffer === null) {\r\n return null;\r\n }\r\n\r\n return buffer.mapAsync(WebGPUConstants.MapMode.Read).then(\r\n () => {\r\n const arrayBuf = new BigUint64Array(buffer.getMappedRange());\r\n const value = Number(arrayBuf[0]);\r\n\r\n buffer.unmap();\r\n\r\n this._dstBuffers[this._dstBuffers.length] = buffer;\r\n\r\n return value;\r\n },\r\n (err) => {\r\n if (this._engine.isDisposed) {\r\n return 0;\r\n }\r\n throw err;\r\n }\r\n );\r\n }\r\n\r\n public async readTwoValuesAndSubtract(firstQuery = 0): Promise<number | null> {\r\n const buffer = this._getBuffer(firstQuery, 2);\r\n if (buffer === null) {\r\n return null;\r\n }\r\n\r\n return buffer.mapAsync(WebGPUConstants.MapMode.Read).then(\r\n () => {\r\n const arrayBuf = new BigUint64Array(buffer.getMappedRange());\r\n const value = Number(arrayBuf[1] - arrayBuf[0]);\r\n\r\n buffer.unmap();\r\n\r\n this._dstBuffers[this._dstBuffers.length] = buffer;\r\n\r\n return value;\r\n },\r\n (err) => {\r\n if (this._engine.isDisposed) {\r\n return 0;\r\n }\r\n throw err;\r\n }\r\n );\r\n }\r\n\r\n public dispose() {\r\n this._querySet.destroy();\r\n this._bufferManager.releaseBuffer(this._queryBuffer);\r\n for (let i = 0; i < this._dstBuffers.length; ++i) {\r\n this._bufferManager.releaseBuffer(this._dstBuffers[i]);\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -1,6 +1,25 @@
|
|
|
1
|
+
import type { TextureSize } from "../../Materials/Textures/textureCreationOptions";
|
|
2
|
+
import type { WebGPUEngine } from "../webgpuEngine";
|
|
1
3
|
import { RenderTargetWrapper } from "../renderTargetWrapper";
|
|
2
|
-
|
|
4
|
+
import { WebGPUPerfCounter } from "./webgpuPerfCounter";
|
|
5
|
+
/**
|
|
6
|
+
* Specialized class used to store a render target of a WebGPU engine
|
|
7
|
+
*/
|
|
3
8
|
export declare class WebGPURenderTargetWrapper extends RenderTargetWrapper {
|
|
4
9
|
/** @internal */
|
|
5
10
|
_defaultAttachments: number[];
|
|
11
|
+
/**
|
|
12
|
+
* Gets the GPU time spent rendering this render target in the last frame (in nanoseconds).
|
|
13
|
+
* You have to enable the "timestamp-query" extension in the engine constructor options and set engine.enableGPUTimingMeasurements = true.
|
|
14
|
+
*/
|
|
15
|
+
readonly gpuTimeInFrame?: WebGPUPerfCounter;
|
|
16
|
+
/**
|
|
17
|
+
* Initializes the render target wrapper
|
|
18
|
+
* @param isMulti true if the wrapper is a multi render target
|
|
19
|
+
* @param isCube true if the wrapper should render to a cube texture
|
|
20
|
+
* @param size size of the render target (width/height/layers)
|
|
21
|
+
* @param engine engine used to create the render target
|
|
22
|
+
* @param label defines the label to use for the wrapper (for debugging purpose only)
|
|
23
|
+
*/
|
|
24
|
+
constructor(isMulti: boolean, isCube: boolean, size: TextureSize, engine: WebGPUEngine, label?: string);
|
|
6
25
|
}
|
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
import { RenderTargetWrapper } from "../renderTargetWrapper.js";
|
|
2
|
-
|
|
2
|
+
import { WebGPUPerfCounter } from "./webgpuPerfCounter.js";
|
|
3
|
+
/**
|
|
4
|
+
* Specialized class used to store a render target of a WebGPU engine
|
|
5
|
+
*/
|
|
3
6
|
export class WebGPURenderTargetWrapper extends RenderTargetWrapper {
|
|
7
|
+
/**
|
|
8
|
+
* Initializes the render target wrapper
|
|
9
|
+
* @param isMulti true if the wrapper is a multi render target
|
|
10
|
+
* @param isCube true if the wrapper should render to a cube texture
|
|
11
|
+
* @param size size of the render target (width/height/layers)
|
|
12
|
+
* @param engine engine used to create the render target
|
|
13
|
+
* @param label defines the label to use for the wrapper (for debugging purpose only)
|
|
14
|
+
*/
|
|
15
|
+
constructor(isMulti, isCube, size, engine, label) {
|
|
16
|
+
super(isMulti, isCube, size, engine, label);
|
|
17
|
+
if (engine.enableGPUTimingMeasurements) {
|
|
18
|
+
this.gpuTimeInFrame = new WebGPUPerfCounter();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
4
21
|
}
|
|
5
22
|
//# sourceMappingURL=webgpuRenderTargetWrapper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgpuRenderTargetWrapper.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuRenderTargetWrapper.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"webgpuRenderTargetWrapper.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuRenderTargetWrapper.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD;;GAEG;AACH,MAAM,OAAO,yBAA0B,SAAQ,mBAAmB;IAU9D;;;;;;;OAOG;IACH,YAAY,OAAgB,EAAE,MAAe,EAAE,IAAiB,EAAE,MAAoB,EAAE,KAAc;QAClG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAE5C,IAAI,MAAM,CAAC,2BAA2B,EAAE;YACpC,IAAI,CAAC,cAAc,GAAG,IAAI,iBAAiB,EAAE,CAAC;SACjD;IACL,CAAC;CACJ","sourcesContent":["import type { TextureSize } from \"../../Materials/Textures/textureCreationOptions\";\r\nimport type { WebGPUEngine } from \"../webgpuEngine\";\r\nimport { RenderTargetWrapper } from \"../renderTargetWrapper\";\r\nimport { WebGPUPerfCounter } from \"./webgpuPerfCounter\";\r\n\r\n/**\r\n * Specialized class used to store a render target of a WebGPU engine\r\n */\r\nexport class WebGPURenderTargetWrapper extends RenderTargetWrapper {\r\n /** @internal */\r\n public _defaultAttachments: number[];\r\n\r\n /**\r\n * Gets the GPU time spent rendering this render target in the last frame (in nanoseconds).\r\n * You have to enable the \"timestamp-query\" extension in the engine constructor options and set engine.enableGPUTimingMeasurements = true.\r\n */\r\n public readonly gpuTimeInFrame?: WebGPUPerfCounter;\r\n\r\n /**\r\n * Initializes the render target wrapper\r\n * @param isMulti true if the wrapper is a multi render target\r\n * @param isCube true if the wrapper should render to a cube texture\r\n * @param size size of the render target (width/height/layers)\r\n * @param engine engine used to create the render target\r\n * @param label defines the label to use for the wrapper (for debugging purpose only)\r\n */\r\n constructor(isMulti: boolean, isCube: boolean, size: TextureSize, engine: WebGPUEngine, label?: string) {\r\n super(isMulti, isCube, size, engine, label);\r\n\r\n if (engine.enableGPUTimingMeasurements) {\r\n this.gpuTimeInFrame = new WebGPUPerfCounter();\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import type { WebGPUBufferManager } from "./webgpuBufferManager";
|
|
2
2
|
import { PerfCounter } from "../../Misc/perfCounter";
|
|
3
|
+
import type { WebGPUEngine } from "../webgpuEngine";
|
|
4
|
+
import type { WebGPUPerfCounter } from "./webgpuPerfCounter";
|
|
3
5
|
/** @internal */
|
|
4
6
|
export declare class WebGPUTimestampQuery {
|
|
7
|
+
private _engine;
|
|
5
8
|
private _device;
|
|
6
9
|
private _bufferManager;
|
|
7
10
|
private _enabled;
|
|
@@ -9,17 +12,23 @@ export declare class WebGPUTimestampQuery {
|
|
|
9
12
|
private _measureDuration;
|
|
10
13
|
private _measureDurationState;
|
|
11
14
|
get gpuFrameTimeCounter(): PerfCounter;
|
|
12
|
-
constructor(device: GPUDevice, bufferManager: WebGPUBufferManager);
|
|
15
|
+
constructor(engine: WebGPUEngine, device: GPUDevice, bufferManager: WebGPUBufferManager);
|
|
13
16
|
get enable(): boolean;
|
|
14
17
|
set enable(value: boolean);
|
|
15
18
|
startFrame(commandEncoder: GPUCommandEncoder): void;
|
|
16
19
|
endFrame(commandEncoder: GPUCommandEncoder): void;
|
|
20
|
+
startPass(descriptor: GPURenderPassDescriptor | GPUComputePassDescriptor, index: number): void;
|
|
21
|
+
endPass(index: number, gpuPerfCounter?: WebGPUPerfCounter): void;
|
|
22
|
+
dispose(): void;
|
|
17
23
|
}
|
|
18
24
|
/** @internal */
|
|
19
25
|
export declare class WebGPUDurationMeasure {
|
|
20
26
|
private _querySet;
|
|
21
|
-
|
|
27
|
+
private _count;
|
|
28
|
+
constructor(engine: WebGPUEngine, device: GPUDevice, bufferManager: WebGPUBufferManager, count?: number, querySetLabel?: string);
|
|
22
29
|
start(encoder: GPUCommandEncoder): void;
|
|
23
30
|
stop(encoder: GPUCommandEncoder): Promise<number | null>;
|
|
31
|
+
startPass(descriptor: GPURenderPassDescriptor | GPUComputePassDescriptor, index: number): void;
|
|
32
|
+
stopPass(index: number): Promise<number | null>;
|
|
24
33
|
dispose(): void;
|
|
25
34
|
}
|
|
@@ -6,10 +6,11 @@ export class WebGPUTimestampQuery {
|
|
|
6
6
|
get gpuFrameTimeCounter() {
|
|
7
7
|
return this._gpuFrameTimeCounter;
|
|
8
8
|
}
|
|
9
|
-
constructor(device, bufferManager) {
|
|
9
|
+
constructor(engine, device, bufferManager) {
|
|
10
10
|
this._enabled = false;
|
|
11
11
|
this._gpuFrameTimeCounter = new PerfCounter();
|
|
12
12
|
this._measureDurationState = 0;
|
|
13
|
+
this._engine = engine;
|
|
13
14
|
this._device = device;
|
|
14
15
|
this._bufferManager = bufferManager;
|
|
15
16
|
}
|
|
@@ -23,7 +24,7 @@ export class WebGPUTimestampQuery {
|
|
|
23
24
|
this._enabled = value;
|
|
24
25
|
this._measureDurationState = 0;
|
|
25
26
|
if (value) {
|
|
26
|
-
this._measureDuration = new WebGPUDurationMeasure(this._device, this._bufferManager);
|
|
27
|
+
this._measureDuration = new WebGPUDurationMeasure(this._engine, this._device, this._bufferManager, 2000, "QuerySet_TimestampQuery");
|
|
27
28
|
}
|
|
28
29
|
else {
|
|
29
30
|
this._measureDuration.dispose();
|
|
@@ -47,18 +48,55 @@ export class WebGPUTimestampQuery {
|
|
|
47
48
|
});
|
|
48
49
|
}
|
|
49
50
|
}
|
|
51
|
+
startPass(descriptor, index) {
|
|
52
|
+
if (this._enabled) {
|
|
53
|
+
this._measureDuration.startPass(descriptor, index);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
descriptor.timestampWrites = undefined;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
endPass(index, gpuPerfCounter) {
|
|
60
|
+
if (!this._enabled || !gpuPerfCounter) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const currentFrameId = this._engine.frameId;
|
|
64
|
+
this._measureDuration.stopPass(index).then((duration_) => {
|
|
65
|
+
gpuPerfCounter._addDuration(currentFrameId, duration_ !== null && duration_ > 0 ? duration_ : 0);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
dispose() {
|
|
69
|
+
var _a;
|
|
70
|
+
(_a = this._measureDuration) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
71
|
+
}
|
|
50
72
|
}
|
|
51
73
|
/** @internal */
|
|
52
74
|
export class WebGPUDurationMeasure {
|
|
53
|
-
constructor(device, bufferManager) {
|
|
54
|
-
this.
|
|
75
|
+
constructor(engine, device, bufferManager, count = 2, querySetLabel) {
|
|
76
|
+
this._count = count;
|
|
77
|
+
this._querySet = new WebGPUQuerySet(engine, count, WebGPUConstants.QueryType.Timestamp, device, bufferManager, true, querySetLabel);
|
|
55
78
|
}
|
|
56
79
|
start(encoder) {
|
|
57
|
-
|
|
80
|
+
var _a;
|
|
81
|
+
(_a = encoder.writeTimestamp) === null || _a === void 0 ? void 0 : _a.call(encoder, this._querySet.querySet, 0);
|
|
58
82
|
}
|
|
59
83
|
async stop(encoder) {
|
|
60
|
-
|
|
61
|
-
|
|
84
|
+
var _a;
|
|
85
|
+
(_a = encoder.writeTimestamp) === null || _a === void 0 ? void 0 : _a.call(encoder, this._querySet.querySet, 1);
|
|
86
|
+
return encoder.writeTimestamp ? this._querySet.readTwoValuesAndSubtract(0) : 0;
|
|
87
|
+
}
|
|
88
|
+
startPass(descriptor, index) {
|
|
89
|
+
if (index + 3 > this._count) {
|
|
90
|
+
throw new Error("WebGPUDurationMeasure: index out of range (" + index + ")");
|
|
91
|
+
}
|
|
92
|
+
descriptor.timestampWrites = {
|
|
93
|
+
querySet: this._querySet.querySet,
|
|
94
|
+
beginningOfPassWriteIndex: index + 2,
|
|
95
|
+
endOfPassWriteIndex: index + 3,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
async stopPass(index) {
|
|
99
|
+
return this._querySet.readTwoValuesAndSubtract(index + 2);
|
|
62
100
|
}
|
|
63
101
|
dispose() {
|
|
64
102
|
this._querySet.dispose();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgpuTimestampQuery.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuTimestampQuery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"webgpuTimestampQuery.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuTimestampQuery.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable babylonjs/available */\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { WebGPUBufferManager } from \"./webgpuBufferManager\";\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\nimport { PerfCounter } from \"../../Misc/perfCounter\";\r\nimport { WebGPUQuerySet } from \"./webgpuQuerySet\";\r\nimport type { WebGPUEngine } from \"../webgpuEngine\";\r\nimport type { WebGPUPerfCounter } from \"./webgpuPerfCounter\";\r\n\r\n/** @internal */\r\nexport class WebGPUTimestampQuery {\r\n private _engine: WebGPUEngine;\r\n private _device: GPUDevice;\r\n private _bufferManager: WebGPUBufferManager;\r\n\r\n private _enabled = false;\r\n private _gpuFrameTimeCounter: PerfCounter = new PerfCounter();\r\n private _measureDuration: WebGPUDurationMeasure;\r\n private _measureDurationState = 0;\r\n\r\n public get gpuFrameTimeCounter() {\r\n return this._gpuFrameTimeCounter;\r\n }\r\n\r\n constructor(engine: WebGPUEngine, device: GPUDevice, bufferManager: WebGPUBufferManager) {\r\n this._engine = engine;\r\n this._device = device;\r\n this._bufferManager = bufferManager;\r\n }\r\n\r\n public get enable(): boolean {\r\n return this._enabled;\r\n }\r\n\r\n public set enable(value: boolean) {\r\n if (this._enabled === value) {\r\n return;\r\n }\r\n\r\n this._enabled = value;\r\n this._measureDurationState = 0;\r\n if (value) {\r\n this._measureDuration = new WebGPUDurationMeasure(this._engine, this._device, this._bufferManager, 2000, \"QuerySet_TimestampQuery\");\r\n } else {\r\n this._measureDuration.dispose();\r\n }\r\n }\r\n\r\n public startFrame(commandEncoder: GPUCommandEncoder): void {\r\n if (this._enabled && this._measureDurationState === 0) {\r\n this._measureDuration.start(commandEncoder);\r\n this._measureDurationState = 1;\r\n }\r\n }\r\n\r\n public endFrame(commandEncoder: GPUCommandEncoder): void {\r\n if (this._measureDurationState === 1) {\r\n this._measureDurationState = 2;\r\n this._measureDuration.stop(commandEncoder).then((duration) => {\r\n if (duration !== null && duration >= 0) {\r\n this._gpuFrameTimeCounter.fetchNewFrame();\r\n this._gpuFrameTimeCounter.addCount(duration, true);\r\n }\r\n this._measureDurationState = 0;\r\n });\r\n }\r\n }\r\n\r\n public startPass(descriptor: GPURenderPassDescriptor | GPUComputePassDescriptor, index: number): void {\r\n if (this._enabled) {\r\n this._measureDuration.startPass(descriptor, index);\r\n } else {\r\n descriptor.timestampWrites = undefined;\r\n }\r\n }\r\n\r\n public endPass(index: number, gpuPerfCounter?: WebGPUPerfCounter): void {\r\n if (!this._enabled || !gpuPerfCounter) {\r\n return;\r\n }\r\n\r\n const currentFrameId = this._engine.frameId;\r\n\r\n this._measureDuration.stopPass(index).then((duration_) => {\r\n gpuPerfCounter._addDuration(currentFrameId, duration_ !== null && duration_ > 0 ? duration_ : 0);\r\n });\r\n }\r\n\r\n public dispose() {\r\n this._measureDuration?.dispose();\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class WebGPUDurationMeasure {\r\n private _querySet: WebGPUQuerySet;\r\n private _count: number;\r\n\r\n constructor(engine: WebGPUEngine, device: GPUDevice, bufferManager: WebGPUBufferManager, count = 2, querySetLabel?: string) {\r\n this._count = count;\r\n this._querySet = new WebGPUQuerySet(engine, count, WebGPUConstants.QueryType.Timestamp, device, bufferManager, true, querySetLabel);\r\n }\r\n\r\n public start(encoder: GPUCommandEncoder): void {\r\n encoder.writeTimestamp?.(this._querySet.querySet, 0);\r\n }\r\n\r\n public async stop(encoder: GPUCommandEncoder): Promise<number | null> {\r\n encoder.writeTimestamp?.(this._querySet.querySet, 1);\r\n\r\n return encoder.writeTimestamp ? this._querySet.readTwoValuesAndSubtract(0) : 0;\r\n }\r\n\r\n public startPass(descriptor: GPURenderPassDescriptor | GPUComputePassDescriptor, index: number): void {\r\n if (index + 3 > this._count) {\r\n throw new Error(\"WebGPUDurationMeasure: index out of range (\" + index + \")\");\r\n }\r\n\r\n descriptor.timestampWrites = {\r\n querySet: this._querySet.querySet,\r\n beginningOfPassWriteIndex: index + 2,\r\n endOfPassWriteIndex: index + 3,\r\n };\r\n }\r\n\r\n public async stopPass(index: number): Promise<number | null> {\r\n return this._querySet.readTwoValuesAndSubtract(index + 2);\r\n }\r\n\r\n public dispose() {\r\n this._querySet.dispose();\r\n }\r\n}\r\n"]}
|
package/Engines/engine.d.ts
CHANGED
|
@@ -1927,7 +1927,7 @@ class GPUCommandEncoder implements GPUObjectBase, GPUCommandsMixin, GPUDebugComm
|
|
|
1927
1927
|
copyTextureToTexture(source: GPUImageCopyTexture, destination: GPUImageCopyTexture, copySize: GPUExtent3D): void;
|
|
1928
1928
|
clearBuffer(buffer: GPUBuffer, offset?: GPUSize64 /* default=0 */, size?: GPUSize64): void;
|
|
1929
1929
|
|
|
1930
|
-
writeTimestamp(querySet: GPUQuerySet, queryIndex: GPUSize32): void;
|
|
1930
|
+
writeTimestamp?(querySet: GPUQuerySet, queryIndex: GPUSize32): void;
|
|
1931
1931
|
|
|
1932
1932
|
resolveQuerySet(querySet: GPUQuerySet, firstQuery: GPUSize32, queryCount: GPUSize32, destination: GPUBuffer, destinationOffset: GPUSize64): void;
|
|
1933
1933
|
|
package/Engines/index.d.ts
CHANGED
|
@@ -19,6 +19,7 @@ export * from "./WebGPU/webgpuCacheRenderPipelineTree";
|
|
|
19
19
|
export * from "./WebGPU/webgpuCacheBindGroups";
|
|
20
20
|
export * from "./WebGPU/webgpuCacheSampler";
|
|
21
21
|
export * from "./WebGPU/webgpuDrawContext";
|
|
22
|
+
export * from "./WebGPU/webgpuRenderTargetWrapper";
|
|
22
23
|
export * from "./WebGPU/webgpuTintWASM";
|
|
23
24
|
export * from "./WebGL/webGL2ShaderProcessors";
|
|
24
25
|
export * from "./nativeEngine";
|
package/Engines/index.js
CHANGED
|
@@ -20,6 +20,7 @@ export * from "./WebGPU/webgpuCacheRenderPipelineTree.js";
|
|
|
20
20
|
export * from "./WebGPU/webgpuCacheBindGroups.js";
|
|
21
21
|
export * from "./WebGPU/webgpuCacheSampler.js";
|
|
22
22
|
export * from "./WebGPU/webgpuDrawContext.js";
|
|
23
|
+
export * from "./WebGPU/webgpuRenderTargetWrapper.js";
|
|
23
24
|
export * from "./WebGPU/webgpuTintWASM.js";
|
|
24
25
|
export * from "./WebGL/webGL2ShaderProcessors.js";
|
|
25
26
|
export * from "./nativeEngine.js";
|
package/Engines/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../dev/core/src/Engines/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,WAAW,CAAC;AAC1B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC","sourcesContent":["/* eslint-disable import/no-internal-modules */\r\nexport * from \"./constants\";\r\nexport * from \"./engineCapabilities\";\r\nexport * from \"./instancingAttributeInfo\";\r\nexport * from \"./thinEngine\";\r\nexport * from \"./engine\";\r\nexport * from \"./engineStore\";\r\nexport * from \"./nullEngine\";\r\nexport * from \"./Extensions/index\";\r\nexport * from \"./Native/index\";\r\nexport * from \"./WebGPU/Extensions/index\";\r\nexport * from \"./IPipelineContext\";\r\nexport * from \"./ICanvas\";\r\nexport * from \"./WebGL/webGLPipelineContext\";\r\nexport * from \"./WebGL/webGLHardwareTexture\";\r\nexport * from \"./WebGPU/webgpuConstants\";\r\nexport * from \"./webgpuEngine\";\r\nexport * from \"./WebGPU/webgpuCacheRenderPipeline\";\r\nexport * from \"./WebGPU/webgpuCacheRenderPipelineTree\";\r\nexport * from \"./WebGPU/webgpuCacheBindGroups\";\r\nexport * from \"./WebGPU/webgpuCacheSampler\";\r\nexport * from \"./WebGPU/webgpuDrawContext\";\r\nexport * from \"./WebGPU/webgpuTintWASM\";\r\nexport * from \"./WebGL/webGL2ShaderProcessors\";\r\nexport * from \"./nativeEngine\";\r\nexport * from \"./Processors/shaderCodeInliner\";\r\nexport * from \"./performanceConfigurator\";\r\nexport * from \"./engineFeatures\";\r\nexport * from \"./engineFactory\";\r\nexport * from \"./IMaterialContext\";\r\nexport * from \"./IDrawContext\";\r\nexport * from \"./shaderStore\";\r\nexport * from \"./renderTargetWrapper\";\r\nexport * from \"./Processors/iShaderProcessor\";\r\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../dev/core/src/Engines/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,WAAW,CAAC;AAC1B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oCAAoC,CAAC;AACnD,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC","sourcesContent":["/* eslint-disable import/no-internal-modules */\r\nexport * from \"./constants\";\r\nexport * from \"./engineCapabilities\";\r\nexport * from \"./instancingAttributeInfo\";\r\nexport * from \"./thinEngine\";\r\nexport * from \"./engine\";\r\nexport * from \"./engineStore\";\r\nexport * from \"./nullEngine\";\r\nexport * from \"./Extensions/index\";\r\nexport * from \"./Native/index\";\r\nexport * from \"./WebGPU/Extensions/index\";\r\nexport * from \"./IPipelineContext\";\r\nexport * from \"./ICanvas\";\r\nexport * from \"./WebGL/webGLPipelineContext\";\r\nexport * from \"./WebGL/webGLHardwareTexture\";\r\nexport * from \"./WebGPU/webgpuConstants\";\r\nexport * from \"./webgpuEngine\";\r\nexport * from \"./WebGPU/webgpuCacheRenderPipeline\";\r\nexport * from \"./WebGPU/webgpuCacheRenderPipelineTree\";\r\nexport * from \"./WebGPU/webgpuCacheBindGroups\";\r\nexport * from \"./WebGPU/webgpuCacheSampler\";\r\nexport * from \"./WebGPU/webgpuDrawContext\";\r\nexport * from \"./WebGPU/webgpuRenderTargetWrapper\";\r\nexport * from \"./WebGPU/webgpuTintWASM\";\r\nexport * from \"./WebGL/webGL2ShaderProcessors\";\r\nexport * from \"./nativeEngine\";\r\nexport * from \"./Processors/shaderCodeInliner\";\r\nexport * from \"./performanceConfigurator\";\r\nexport * from \"./engineFeatures\";\r\nexport * from \"./engineFactory\";\r\nexport * from \"./IMaterialContext\";\r\nexport * from \"./IDrawContext\";\r\nexport * from \"./shaderStore\";\r\nexport * from \"./renderTargetWrapper\";\r\nexport * from \"./Processors/iShaderProcessor\";\r\n"]}
|
package/Engines/nativeEngine.js
CHANGED
|
@@ -193,7 +193,7 @@ export class NativeEngine extends Engine {
|
|
|
193
193
|
disableMorphTargetTexture: false,
|
|
194
194
|
};
|
|
195
195
|
this._features = {
|
|
196
|
-
forceBitmapOverHTMLImageElement:
|
|
196
|
+
forceBitmapOverHTMLImageElement: true,
|
|
197
197
|
supportRenderAndCopyToLodForFloatTextures: false,
|
|
198
198
|
supportDepthStencilTexture: false,
|
|
199
199
|
supportShadowSamplers: false,
|