@babylonjs/core 6.34.2 → 6.34.3

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.
Files changed (49) hide show
  1. package/Compute/computeShader.d.ts +8 -2
  2. package/Compute/computeShader.js +5 -1
  3. package/Compute/computeShader.js.map +1 -1
  4. package/Engines/Extensions/engine.computeShader.d.ts +3 -1
  5. package/Engines/Extensions/engine.computeShader.js.map +1 -1
  6. package/Engines/Extensions/engine.multiRender.js +3 -2
  7. package/Engines/Extensions/engine.multiRender.js.map +1 -1
  8. package/Engines/WebGPU/Extensions/engine.computeShader.js +10 -2
  9. package/Engines/WebGPU/Extensions/engine.computeShader.js.map +1 -1
  10. package/Engines/WebGPU/Extensions/engine.multiRender.js +3 -2
  11. package/Engines/WebGPU/Extensions/engine.multiRender.js.map +1 -1
  12. package/Engines/WebGPU/Extensions/engine.storageBuffer.js +8 -1
  13. package/Engines/WebGPU/Extensions/engine.storageBuffer.js.map +1 -1
  14. package/Engines/WebGPU/webgpuBufferManager.d.ts +3 -1
  15. package/Engines/WebGPU/webgpuBufferManager.js +10 -2
  16. package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
  17. package/Engines/WebGPU/webgpuOcclusionQuery.js +1 -1
  18. package/Engines/WebGPU/webgpuOcclusionQuery.js.map +1 -1
  19. package/Engines/WebGPU/webgpuPerfCounter.d.ts +15 -0
  20. package/Engines/WebGPU/webgpuPerfCounter.js +31 -0
  21. package/Engines/WebGPU/webgpuPerfCounter.js.map +1 -0
  22. package/Engines/WebGPU/webgpuQuerySet.d.ts +3 -1
  23. package/Engines/WebGPU/webgpuQuerySet.js +37 -18
  24. package/Engines/WebGPU/webgpuQuerySet.js.map +1 -1
  25. package/Engines/WebGPU/webgpuRenderTargetWrapper.d.ts +20 -1
  26. package/Engines/WebGPU/webgpuRenderTargetWrapper.js +18 -1
  27. package/Engines/WebGPU/webgpuRenderTargetWrapper.js.map +1 -1
  28. package/Engines/WebGPU/webgpuTimestampQuery.d.ts +11 -2
  29. package/Engines/WebGPU/webgpuTimestampQuery.js +45 -7
  30. package/Engines/WebGPU/webgpuTimestampQuery.js.map +1 -1
  31. package/Engines/engine.d.ts +1 -1
  32. package/Engines/index.d.ts +1 -0
  33. package/Engines/index.js +1 -0
  34. package/Engines/index.js.map +1 -1
  35. package/Engines/thinEngine.js +2 -2
  36. package/Engines/thinEngine.js.map +1 -1
  37. package/Engines/webgpuEngine.d.ts +16 -1
  38. package/Engines/webgpuEngine.js +33 -4
  39. package/Engines/webgpuEngine.js.map +1 -1
  40. package/Materials/Textures/multiRenderTarget.d.ts +4 -0
  41. package/Materials/Textures/multiRenderTarget.js +1 -0
  42. package/Materials/Textures/multiRenderTarget.js.map +1 -1
  43. package/Misc/perfCounter.d.ts +2 -1
  44. package/Misc/perfCounter.js +1 -0
  45. package/Misc/perfCounter.js.map +1 -1
  46. package/Particles/computeShaderParticleSystem.js.map +1 -1
  47. package/Shaders/ShadersInclude/pbrBlockSubSurface.js +3 -1
  48. package/Shaders/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
  49. package/package.json +1 -1
@@ -34,6 +34,7 @@ import type { WebGPUDataBuffer } from "../Meshes/WebGPU/webgpuDataBuffer";
34
34
  import "../Buffers/buffer.align";
35
35
  import "../ShadersWGSL/postprocess.vertex";
36
36
  import type { RenderTargetWrapper } from "./renderTargetWrapper";
37
+ import { WebGPUPerfCounter } from "./WebGPU/webgpuPerfCounter";
37
38
  /** @internal */
38
39
  interface IWebGPURenderPassWrapper {
39
40
  renderPassDescriptor: Nullable<GPURenderPassDescriptor>;
@@ -152,6 +153,8 @@ export declare class WebGPUEngine extends Engine {
152
153
  /** @internal */
153
154
  _timestampQuery: WebGPUTimestampQuery;
154
155
  /** @internal */
156
+ _timestampIndex: number;
157
+ /** @internal */
155
158
  _occlusionQuery: WebGPUOcclusionQuery;
156
159
  /** @internal */
157
160
  _compiledComputeEffects: {
@@ -299,6 +302,18 @@ export declare class WebGPUEngine extends Engine {
299
302
  */
300
303
  get compatibilityMode(): boolean;
301
304
  set compatibilityMode(mode: boolean);
305
+ /**
306
+ * Enables or disables GPU timing measurements.
307
+ * Note that this is only supported if the "timestamp-query" extension is enabled in the options.
308
+ */
309
+ get enableGPUTimingMeasurements(): boolean;
310
+ set enableGPUTimingMeasurements(enable: boolean);
311
+ /**
312
+ * Gets the GPU time spent in the main render pass for the last frame rendered (in nanoseconds).
313
+ * You have to enable the "timestamp-query" extension in the engine constructor options and set engine.enableGPUTimingMeasurements = true.
314
+ * It will only return time spent in the main pass, not additional render target / compute passes (if any)!
315
+ */
316
+ readonly gpuTimeInFrameForMainPass?: WebGPUPerfCounter;
302
317
  /** @internal */
303
318
  get currentSampleCount(): number;
304
319
  /**
@@ -426,7 +441,7 @@ export declare class WebGPUEngine extends Engine {
426
441
  /**
427
442
  * Creates a new index buffer
428
443
  * @param indices defines the content of the index buffer
429
- * @param updatable defines if the index buffer must be updatable
444
+ * @param _updatable defines if the index buffer must be updatable
430
445
  * @param label defines the label of the buffer (for debug purpose)
431
446
  * @returns a new buffer
432
447
  */
@@ -1,9 +1,11 @@
1
+ /* eslint-disable babylonjs/available */
1
2
  import { Logger } from "../Misc/logger.js";
2
3
  import { Color4 } from "../Maths/math.js";
3
4
  import { Engine } from "../Engines/engine.js";
4
5
  import { InternalTexture, InternalTextureSource } from "../Materials/Textures/internalTexture.js";
5
6
  import { Effect } from "../Materials/effect.js";
6
7
 
8
+ // eslint-disable-next-line @typescript-eslint/naming-convention
7
9
  import * as WebGPUConstants from "./WebGPU/webgpuConstants.js";
8
10
  import { VertexBuffer } from "../Buffers/buffer.js";
9
11
  import { WebGPUPipelineContext } from "./WebGPU/webgpuPipelineContext.js";
@@ -34,6 +36,7 @@ import { ShaderLanguage } from "../Materials/shaderLanguage.js";
34
36
  import { WebGPUSnapshotRendering } from "./WebGPU/webgpuSnapshotRendering.js";
35
37
  import "../Buffers/buffer.align.js";
36
38
  import "../ShadersWGSL/postprocess.vertex.js";
39
+ import { WebGPUPerfCounter } from "./WebGPU/webgpuPerfCounter.js";
37
40
  const viewDescriptorSwapChainAntialiasing = {
38
41
  label: `TextureView_SwapChain_ResolveTarget`,
39
42
  dimension: WebGPUConstants.TextureDimension.E2d,
@@ -188,6 +191,20 @@ export class WebGPUEngine extends Engine {
188
191
  set compatibilityMode(mode) {
189
192
  this._compatibilityMode = mode;
190
193
  }
194
+ /**
195
+ * Enables or disables GPU timing measurements.
196
+ * Note that this is only supported if the "timestamp-query" extension is enabled in the options.
197
+ */
198
+ get enableGPUTimingMeasurements() {
199
+ return this._timestampQuery.enable;
200
+ }
201
+ set enableGPUTimingMeasurements(enable) {
202
+ if (this._timestampQuery.enable === enable) {
203
+ return;
204
+ }
205
+ this.gpuTimeInFrameForMainPass = enable ? new WebGPUPerfCounter() : undefined;
206
+ this._timestampQuery.enable = enable;
207
+ }
191
208
  /** @internal */
192
209
  get currentSampleCount() {
193
210
  return this._currentRenderTarget ? this._currentRenderTarget.samples : this._mainPassSampleCount;
@@ -231,6 +248,8 @@ export class WebGPUEngine extends Engine {
231
248
  description: "",
232
249
  };
233
250
  /** @internal */
251
+ this._timestampIndex = 0;
252
+ /** @internal */
234
253
  this._compiledComputeEffects = {};
235
254
  /** @internal */
236
255
  this._counters = {
@@ -420,11 +439,11 @@ export class WebGPUEngine extends Engine {
420
439
  Logger.Error(e);
421
440
  })
422
441
  .then(() => {
423
- this._bufferManager = new WebGPUBufferManager(this._device);
442
+ this._bufferManager = new WebGPUBufferManager(this, this._device);
424
443
  this._textureHelper = new WebGPUTextureHelper(this._device, this._glslang, this._tintWASM, this._bufferManager, this._deviceEnabledExtensions);
425
444
  this._cacheSampler = new WebGPUCacheSampler(this._device);
426
445
  this._cacheBindGroups = new WebGPUCacheBindGroups(this._device, this._cacheSampler, this);
427
- this._timestampQuery = new WebGPUTimestampQuery(this._device, this._bufferManager);
446
+ this._timestampQuery = new WebGPUTimestampQuery(this, this._device, this._bufferManager);
428
447
  this._occlusionQuery = this._device.createQuerySet ? new WebGPUOcclusionQuery(this, this._device, this._bufferManager) : undefined;
429
448
  this._bundleList = new WebGPUBundleList(this._device);
430
449
  this._snapshotRendering = new WebGPUSnapshotRendering(this, this._snapshotRenderingMode, this._bundleList);
@@ -1034,7 +1053,7 @@ export class WebGPUEngine extends Engine {
1034
1053
  /**
1035
1054
  * Creates a new index buffer
1036
1055
  * @param indices defines the content of the index buffer
1037
- * @param updatable defines if the index buffer must be updatable
1056
+ * @param _updatable defines if the index buffer must be updatable
1038
1057
  * @param label defines the label of the buffer (for debug purpose)
1039
1058
  * @returns a new buffer
1040
1059
  */
@@ -1912,6 +1931,7 @@ export class WebGPUEngine extends Engine {
1912
1931
  this._endCurrentRenderPass();
1913
1932
  this._snapshotRendering.endFrame();
1914
1933
  this._timestampQuery.endFrame(this._renderEncoder);
1934
+ this._timestampIndex = 0;
1915
1935
  this.flushFramebuffer();
1916
1936
  this._textureHelper.destroyDeferredTextures();
1917
1937
  this._bufferManager.destroyDeferredBuffers();
@@ -2057,7 +2077,7 @@ export class WebGPUEngine extends Engine {
2057
2077
  colorAttachments.push(null);
2058
2078
  }
2059
2079
  }
2060
- (_e = this._debugPushGroup) === null || _e === void 0 ? void 0 : _e.call(this, "render target pass", 1);
2080
+ (_e = this._debugPushGroup) === null || _e === void 0 ? void 0 : _e.call(this, "render target pass" + (renderTargetWrapper.label ? " (" + renderTargetWrapper.label + ")" : ""), 1);
2061
2081
  this._rttRenderPassWrapper.renderPassDescriptor = {
2062
2082
  label: ((_f = renderTargetWrapper.label) !== null && _f !== void 0 ? _f : "RTT") + "RenderPass",
2063
2083
  colorAttachments,
@@ -2078,6 +2098,7 @@ export class WebGPUEngine extends Engine {
2078
2098
  : undefined,
2079
2099
  occlusionQuerySet: ((_g = this._occlusionQuery) === null || _g === void 0 ? void 0 : _g.hasQueries) ? this._occlusionQuery.querySet : undefined,
2080
2100
  };
2101
+ this._timestampQuery.startPass(this._rttRenderPassWrapper.renderPassDescriptor, this._timestampIndex);
2081
2102
  this._currentRenderPass = this._renderEncoder.beginRenderPass(this._rttRenderPassWrapper.renderPassDescriptor);
2082
2103
  if (this.dbgVerboseLogsForFirstFrames) {
2083
2104
  if (this._count === undefined) {
@@ -2158,6 +2179,7 @@ export class WebGPUEngine extends Engine {
2158
2179
  }
2159
2180
  }
2160
2181
  (_b = this._debugPushGroup) === null || _b === void 0 ? void 0 : _b.call(this, "main pass", 0);
2182
+ this._timestampQuery.startPass(this._mainRenderPassWrapper.renderPassDescriptor, this._timestampIndex);
2161
2183
  this._currentRenderPass = this._renderEncoder.beginRenderPass(this._mainRenderPassWrapper.renderPassDescriptor);
2162
2184
  this._setDepthTextureFormat(this._mainRenderPassWrapper);
2163
2185
  this._setColorFormat(this._mainRenderPassWrapper);
@@ -2179,6 +2201,10 @@ export class WebGPUEngine extends Engine {
2179
2201
  this._bundleList.reset();
2180
2202
  }
2181
2203
  this._currentRenderPass.end();
2204
+ this._timestampQuery.endPass(this._timestampIndex, (this._currentRenderTarget && this._currentRenderTarget.gpuTimeInFrame
2205
+ ? this._currentRenderTarget.gpuTimeInFrame
2206
+ : this.gpuTimeInFrameForMainPass));
2207
+ this._timestampIndex += 2;
2182
2208
  if (this.dbgVerboseLogsForFirstFrames) {
2183
2209
  if (this._count === undefined) {
2184
2210
  this._count = 0;
@@ -2543,8 +2569,11 @@ export class WebGPUEngine extends Engine {
2543
2569
  dispose() {
2544
2570
  var _a, _b;
2545
2571
  this._isDisposed = true;
2572
+ this._timestampQuery.dispose();
2546
2573
  (_a = this._mainTexture) === null || _a === void 0 ? void 0 : _a.destroy();
2547
2574
  (_b = this._depthTexture) === null || _b === void 0 ? void 0 : _b.destroy();
2575
+ this._textureHelper.destroyDeferredTextures();
2576
+ this._bufferManager.destroyDeferredBuffers();
2548
2577
  this._device.destroy();
2549
2578
  super.dispose();
2550
2579
  }