@babylonjs/core 5.52.0 → 5.53.1

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 (168) hide show
  1. package/Animations/animatable.js +1 -1
  2. package/Animations/animatable.js.map +1 -1
  3. package/Animations/animationGroup.js +8 -1
  4. package/Animations/animationGroup.js.map +1 -1
  5. package/Collisions/pickingInfo.d.ts +2 -1
  6. package/Collisions/pickingInfo.js +4 -3
  7. package/Collisions/pickingInfo.js.map +1 -1
  8. package/DeviceInput/eventFactory.js +4 -0
  9. package/DeviceInput/eventFactory.js.map +1 -1
  10. package/DeviceInput/webDeviceInputSystem.js +17 -9
  11. package/DeviceInput/webDeviceInputSystem.js.map +1 -1
  12. package/Engines/Extensions/engine.cubeTexture.js +3 -0
  13. package/Engines/Extensions/engine.cubeTexture.js.map +1 -1
  14. package/Engines/Extensions/engine.multiRender.js +74 -19
  15. package/Engines/Extensions/engine.multiRender.js.map +1 -1
  16. package/Engines/Extensions/engine.renderTarget.js +2 -5
  17. package/Engines/Extensions/engine.renderTarget.js.map +1 -1
  18. package/Engines/WebGL/webGLHardwareTexture.d.ts +3 -1
  19. package/Engines/WebGL/webGLHardwareTexture.js +19 -7
  20. package/Engines/WebGL/webGLHardwareTexture.js.map +1 -1
  21. package/Engines/WebGL/webGLRenderTargetWrapper.d.ts +14 -1
  22. package/Engines/WebGL/webGLRenderTargetWrapper.js +76 -6
  23. package/Engines/WebGL/webGLRenderTargetWrapper.js.map +1 -1
  24. package/Engines/WebGPU/Extensions/engine.multiRender.js +20 -0
  25. package/Engines/WebGPU/Extensions/engine.multiRender.js.map +1 -1
  26. package/Engines/WebGPU/Extensions/engine.renderTarget.js +3 -1
  27. package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
  28. package/Engines/WebGPU/webgpuConstants.d.ts +22 -7
  29. package/Engines/WebGPU/webgpuConstants.js +24 -8
  30. package/Engines/WebGPU/webgpuConstants.js.map +1 -1
  31. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.d.ts +0 -3
  32. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +20 -53
  33. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  34. package/Engines/WebGPU/webgpuTextureHelper.d.ts +3 -2
  35. package/Engines/WebGPU/webgpuTextureHelper.js +33 -14
  36. package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
  37. package/Engines/WebGPU/webgpuTintWASM.d.ts +3 -2
  38. package/Engines/WebGPU/webgpuTintWASM.js +10 -8
  39. package/Engines/WebGPU/webgpuTintWASM.js.map +1 -1
  40. package/Engines/constants.d.ts +12 -0
  41. package/Engines/constants.js +12 -0
  42. package/Engines/constants.js.map +1 -1
  43. package/Engines/engine.d.ts +130 -72
  44. package/Engines/engine.js +5 -0
  45. package/Engines/engine.js.map +1 -1
  46. package/Engines/nativeEngine.d.ts +1 -0
  47. package/Engines/nativeEngine.js +16 -5
  48. package/Engines/nativeEngine.js.map +1 -1
  49. package/Engines/renderTargetWrapper.d.ts +28 -4
  50. package/Engines/renderTargetWrapper.js +107 -10
  51. package/Engines/renderTargetWrapper.js.map +1 -1
  52. package/Engines/thinEngine.d.ts +6 -6
  53. package/Engines/thinEngine.js +29 -21
  54. package/Engines/thinEngine.js.map +1 -1
  55. package/Engines/webgpuEngine.d.ts +25 -8
  56. package/Engines/webgpuEngine.js +112 -48
  57. package/Engines/webgpuEngine.js.map +1 -1
  58. package/Inputs/scene.inputManager.js +5 -12
  59. package/Inputs/scene.inputManager.js.map +1 -1
  60. package/Materials/PBR/pbrAnisotropicConfiguration.js +0 -1
  61. package/Materials/PBR/pbrAnisotropicConfiguration.js.map +1 -1
  62. package/Materials/PBR/pbrBaseMaterial.js +3 -0
  63. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  64. package/Materials/Textures/Filtering/hdrFiltering.js +4 -0
  65. package/Materials/Textures/Filtering/hdrFiltering.js.map +1 -1
  66. package/Materials/Textures/internalTexture.d.ts +4 -0
  67. package/Materials/Textures/internalTexture.js.map +1 -1
  68. package/Materials/Textures/multiRenderTarget.d.ts +40 -0
  69. package/Materials/Textures/multiRenderTarget.js +143 -4
  70. package/Materials/Textures/multiRenderTarget.js.map +1 -1
  71. package/Materials/Textures/renderTargetTexture.d.ts +4 -0
  72. package/Materials/Textures/renderTargetTexture.js +10 -2
  73. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  74. package/Materials/Textures/texture.d.ts +4 -2
  75. package/Materials/Textures/texture.js +1 -0
  76. package/Materials/Textures/texture.js.map +1 -1
  77. package/Materials/Textures/textureCreationOptions.d.ts +4 -0
  78. package/Materials/Textures/textureCreationOptions.js.map +1 -1
  79. package/Materials/materialPluginBase.d.ts +3 -2
  80. package/Materials/materialPluginBase.js.map +1 -1
  81. package/Materials/materialPluginManager.js +13 -3
  82. package/Materials/materialPluginManager.js.map +1 -1
  83. package/Materials/uniformBuffer.d.ts +2 -0
  84. package/Materials/uniformBuffer.js +4 -0
  85. package/Materials/uniformBuffer.js.map +1 -1
  86. package/Maths/math.frustum.d.ts +8 -1
  87. package/Maths/math.frustum.js +14 -0
  88. package/Maths/math.frustum.js.map +1 -1
  89. package/Meshes/instancedMesh.d.ts +2 -1
  90. package/Meshes/instancedMesh.js +3 -2
  91. package/Meshes/instancedMesh.js.map +1 -1
  92. package/Meshes/mesh.d.ts +10 -5
  93. package/Meshes/mesh.js +40 -16
  94. package/Meshes/mesh.js.map +1 -1
  95. package/Misc/filesInput.d.ts +5 -2
  96. package/Misc/filesInput.js +39 -20
  97. package/Misc/filesInput.js.map +1 -1
  98. package/Misc/interfaces/screenshotSize.d.ts +17 -3
  99. package/Misc/interfaces/screenshotSize.js.map +1 -1
  100. package/Misc/sceneOptimizer.js +3 -0
  101. package/Misc/sceneOptimizer.js.map +1 -1
  102. package/Misc/screenshotTools.d.ts +2 -2
  103. package/Misc/screenshotTools.js +49 -9
  104. package/Misc/screenshotTools.js.map +1 -1
  105. package/Misc/textureTools.d.ts +1 -1
  106. package/Misc/textureTools.js +4 -2
  107. package/Misc/textureTools.js.map +1 -1
  108. package/Physics/v2/physicsAggregate.js +3 -3
  109. package/Physics/v2/physicsAggregate.js.map +1 -1
  110. package/Physics/v2/physicsBody.d.ts +27 -16
  111. package/Physics/v2/physicsBody.js +31 -16
  112. package/Physics/v2/physicsBody.js.map +1 -1
  113. package/Physics/v2/physicsConstraint.d.ts +6 -6
  114. package/Physics/v2/physicsConstraint.js +6 -6
  115. package/Physics/v2/physicsConstraint.js.map +1 -1
  116. package/Physics/v2/physicsShape.d.ts +7 -7
  117. package/Physics/v2/physicsShape.js +7 -7
  118. package/Physics/v2/physicsShape.js.map +1 -1
  119. package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.js +1 -0
  120. package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.js.map +1 -1
  121. package/PostProcesses/RenderPipeline/postProcessRenderPipelineManager.d.ts +5 -0
  122. package/PostProcesses/RenderPipeline/postProcessRenderPipelineManager.js +7 -0
  123. package/PostProcesses/RenderPipeline/postProcessRenderPipelineManager.js.map +1 -1
  124. package/PostProcesses/depthOfFieldMergePostProcess.d.ts +0 -23
  125. package/PostProcesses/depthOfFieldMergePostProcess.js +0 -5
  126. package/PostProcesses/depthOfFieldMergePostProcess.js.map +1 -1
  127. package/PostProcesses/postProcess.js +1 -0
  128. package/PostProcesses/postProcess.js.map +1 -1
  129. package/Probes/reflectionProbe.js +1 -0
  130. package/Probes/reflectionProbe.js.map +1 -1
  131. package/Rendering/depthPeelingRenderer.js +3 -1
  132. package/Rendering/depthPeelingRenderer.js.map +1 -1
  133. package/Rendering/fluidRenderer/fluidRenderer.js +1 -1
  134. package/Rendering/fluidRenderer/fluidRenderer.js.map +1 -1
  135. package/Rendering/fluidRenderer/fluidRenderingDepthTextureCopy.js +2 -1
  136. package/Rendering/fluidRenderer/fluidRenderingDepthTextureCopy.js.map +1 -1
  137. package/Rendering/fluidRenderer/fluidRenderingTextures.js +2 -0
  138. package/Rendering/fluidRenderer/fluidRenderingTextures.js.map +1 -1
  139. package/Shaders/default.fragment.js +1 -1
  140. package/Shaders/default.fragment.js.map +1 -1
  141. package/Shaders/depthOfFieldMerge.fragment.js +10 -5
  142. package/Shaders/depthOfFieldMerge.fragment.js.map +1 -1
  143. package/Shaders/fluidRenderingRender.fragment.js +3 -3
  144. package/Shaders/fluidRenderingRender.fragment.js.map +1 -1
  145. package/Shaders/motionBlur.fragment.js +8 -2
  146. package/Shaders/motionBlur.fragment.js.map +1 -1
  147. package/Shaders/screenSpaceReflection2.fragment.js +11 -4
  148. package/Shaders/screenSpaceReflection2.fragment.js.map +1 -1
  149. package/Shaders/screenSpaceReflection2Blur.fragment.js +6 -1
  150. package/Shaders/screenSpaceReflection2Blur.fragment.js.map +1 -1
  151. package/Shaders/ssao2.fragment.js +1 -0
  152. package/Shaders/ssao2.fragment.js.map +1 -1
  153. package/ShadersWGSL/ShadersInclude/bakedVertexAnimation.js +9 -9
  154. package/ShadersWGSL/ShadersInclude/bakedVertexAnimation.js.map +1 -1
  155. package/ShadersWGSL/ShadersInclude/bonesVertex.js +16 -16
  156. package/ShadersWGSL/ShadersInclude/bonesVertex.js.map +1 -1
  157. package/ShadersWGSL/ShadersInclude/clipPlaneFragment.js +6 -6
  158. package/ShadersWGSL/ShadersInclude/clipPlaneFragment.js.map +1 -1
  159. package/ShadersWGSL/ShadersInclude/clipPlaneVertex.js +6 -6
  160. package/ShadersWGSL/ShadersInclude/clipPlaneVertex.js.map +1 -1
  161. package/ShadersWGSL/ShadersInclude/instancesVertex.js +1 -1
  162. package/ShadersWGSL/ShadersInclude/instancesVertex.js.map +1 -1
  163. package/ShadersWGSL/ShadersInclude/morphTargetsVertex.js +8 -8
  164. package/ShadersWGSL/ShadersInclude/morphTargetsVertex.js.map +1 -1
  165. package/XR/features/WebXRControllerTeleportation.d.ts +9 -0
  166. package/XR/features/WebXRControllerTeleportation.js +28 -4
  167. package/XR/features/WebXRControllerTeleportation.js.map +1 -1
  168. package/package.json +1 -1
@@ -60,15 +60,31 @@ export interface WebGPUEngineOptions extends ThinEngineOptions, GPURequestAdapte
60
60
  */
61
61
  powerPreference?: GPUPowerPreference;
62
62
  /**
63
- * Defines the device descriptor used to create a device.
63
+ * When set to true, indicates that only a fallback adapter may be returned when requesting an adapter.
64
+ * If the user agent does not support a fallback adapter, will cause requestAdapter() to resolve to null.
65
+ * Default: false
66
+ */
67
+ forceFallbackAdapter?: boolean;
68
+ /**
69
+ * Defines the device descriptor used to create a device once we have retrieved an appropriate adapter
64
70
  */
65
71
  deviceDescriptor?: GPUDeviceDescriptor;
72
+ /**
73
+ * When requesting the device, enable all the features supported by the adapter. Default: false
74
+ * Note that this setting is ignored if you explicitely set deviceDescriptor.requiredFeatures
75
+ */
76
+ enableAllFeatures?: boolean;
77
+ /**
78
+ * When requesting the device, set the required limits to the maximum possible values (the ones from adapter.limits). Default: false
79
+ * Note that this setting is ignored if you explicitely set deviceDescriptor.requiredLimits
80
+ */
81
+ setMaximumLimits?: boolean;
66
82
  /**
67
83
  * Defines the requested Swap Chain Format.
68
84
  */
69
85
  swapChainFormat?: GPUTextureFormat;
70
86
  /**
71
- * Defines whether we should generate debug markers in the gpu command lists (can be seen with PIX for eg)
87
+ * Defines whether we should generate debug markers in the gpu command lists (can be seen with PIX for eg). Default: false
72
88
  */
73
89
  enableGPUDebugMarkers?: boolean;
74
90
  /**
@@ -98,16 +114,18 @@ export declare class WebGPUEngine extends Engine {
98
114
  /** @internal */
99
115
  readonly _clearStencilValue = 0;
100
116
  private readonly _defaultSampleCount;
101
- private _canvas;
102
117
  /** @internal */
103
118
  _options: WebGPUEngineOptions;
104
119
  private _glslang;
105
120
  private _tintWASM;
106
121
  private _adapter;
107
122
  private _adapterSupportedExtensions;
123
+ private _adapterInfo;
124
+ private _adapterSupportedLimits;
108
125
  /** @internal */
109
126
  _device: GPUDevice;
110
127
  private _deviceEnabledExtensions;
128
+ private _deviceLimits;
111
129
  private _context;
112
130
  private _mainPassSampleCount;
113
131
  /** @internal */
@@ -250,6 +268,10 @@ export declare class WebGPUEngine extends Engine {
250
268
  get supportedExtensions(): Immutable<GPUFeatureName[]>;
251
269
  /** Gets the currently enabled extensions on the WebGPU device */
252
270
  get enabledExtensions(): Immutable<GPUFeatureName[]>;
271
+ /** Gets the supported limits by the WebGPU adapter */
272
+ get supportedLimits(): GPUSupportedLimits;
273
+ /** Gets the current limits of the WebGPU device */
274
+ get currentLimits(): GPUSupportedLimits;
253
275
  /**
254
276
  * Returns a string describing the current engine
255
277
  */
@@ -770,11 +792,6 @@ export declare class WebGPUEngine extends Engine {
770
792
  * @returns a number defining the current render height
771
793
  */
772
794
  getRenderHeight(useScreen?: boolean): number;
773
- /**
774
- * Gets the HTML canvas attached with the current WebGPU context
775
- * @returns a HTML canvas
776
- */
777
- getRenderingCanvas(): Nullable<HTMLCanvasElement>;
778
795
  /**
779
796
  * Get the current error code of the WebGPU context
780
797
  * @returns the error code
@@ -35,6 +35,21 @@ import { WebGPUTintWASM } from "./WebGPU/webgpuTintWASM.js";
35
35
  import { WebGPUShaderProcessor } from "./WebGPU/webgpuShaderProcessor.js";
36
36
  import { ShaderLanguage } from "../Materials/shaderLanguage.js";
37
37
  import { WebGPUSnapshotRendering } from "./WebGPU/webgpuSnapshotRendering.js";
38
+ const viewDescriptorSwapChainAntialiasing = {
39
+ label: `TextureView_SwapChain_ResolveTarget`,
40
+ dimension: WebGPUConstants.TextureDimension.E2d,
41
+ format: undefined,
42
+ mipLevelCount: 1,
43
+ arrayLayerCount: 1,
44
+ };
45
+ const viewDescriptorSwapChain = {
46
+ label: `TextureView_SwapChain`,
47
+ dimension: WebGPUConstants.TextureDimension.E2d,
48
+ format: undefined,
49
+ mipLevelCount: 1,
50
+ arrayLayerCount: 1,
51
+ };
52
+ const disableUniformityAnalysisMarker = "/* disable_uniformity_analysis */";
38
53
  /**
39
54
  * The web GPU engine class provides support for WebGPU version of babylon.js.
40
55
  * @since 5.0.0
@@ -130,6 +145,14 @@ export class WebGPUEngine extends Engine {
130
145
  get enabledExtensions() {
131
146
  return this._deviceEnabledExtensions;
132
147
  }
148
+ /** Gets the supported limits by the WebGPU adapter */
149
+ get supportedLimits() {
150
+ return this._adapterSupportedLimits;
151
+ }
152
+ /** Gets the current limits of the WebGPU device */
153
+ get currentLimits() {
154
+ return this._deviceLimits;
155
+ }
133
156
  /**
134
157
  * Returns a string describing the current engine
135
158
  */
@@ -149,9 +172,9 @@ export class WebGPUEngine extends Engine {
149
172
  */
150
173
  getInfo() {
151
174
  return {
152
- vendor: "unknown vendor",
153
- renderer: "unknown renderer",
154
- version: "unknown version",
175
+ vendor: this._adapterInfo.vendor || "unknown vendor",
176
+ renderer: this._adapterInfo.architecture || "unknown renderer",
177
+ version: this._adapterInfo.description || "unknown version",
155
178
  };
156
179
  }
157
180
  /**
@@ -202,6 +225,12 @@ export class WebGPUEngine extends Engine {
202
225
  this._defaultSampleCount = 4; // Only supported value for now.
203
226
  this._glslang = null;
204
227
  this._tintWASM = null;
228
+ this._adapterInfo = {
229
+ vendor: "",
230
+ architecture: "",
231
+ device: "",
232
+ description: "",
233
+ };
205
234
  /** @internal */
206
235
  this._compiledComputeEffects = {};
207
236
  /** @internal */
@@ -290,7 +319,7 @@ export class WebGPUEngine extends Engine {
290
319
  options.swapChainFormat = options.swapChainFormat || navigator.gpu.getPreferredCanvasFormat();
291
320
  this._isWebGPU = true;
292
321
  this._shaderPlatformName = "WEBGPU";
293
- this._canvas = canvas;
322
+ this._renderingCanvas = canvas;
294
323
  this._options = options;
295
324
  this._mainPassSampleCount = options.antialias ? this._defaultSampleCount : 1;
296
325
  this._setupMobileChecks();
@@ -329,7 +358,7 @@ export class WebGPUEngine extends Engine {
329
358
  throw Error("WebGPU initializations stopped.");
330
359
  })
331
360
  .then((adapter) => {
332
- var _a;
361
+ var _a, _b, _c;
333
362
  if (!adapter) {
334
363
  throw "Could not retrieve a WebGPU adapter (adapter is null).";
335
364
  }
@@ -337,9 +366,14 @@ export class WebGPUEngine extends Engine {
337
366
  this._adapter = adapter;
338
367
  this._adapterSupportedExtensions = [];
339
368
  (_a = this._adapter.features) === null || _a === void 0 ? void 0 : _a.forEach((feature) => this._adapterSupportedExtensions.push(feature));
340
- const deviceDescriptor = this._options.deviceDescriptor;
341
- if (deviceDescriptor === null || deviceDescriptor === void 0 ? void 0 : deviceDescriptor.requiredFeatures) {
342
- const requestedExtensions = deviceDescriptor.requiredFeatures;
369
+ this._adapterSupportedLimits = this._adapter.limits;
370
+ this._adapter.requestAdapterInfo().then((adapterInfo) => {
371
+ this._adapterInfo = adapterInfo;
372
+ });
373
+ const deviceDescriptor = (_b = this._options.deviceDescriptor) !== null && _b !== void 0 ? _b : {};
374
+ const requiredFeatures = (_c = deviceDescriptor === null || deviceDescriptor === void 0 ? void 0 : deviceDescriptor.requiredFeatures) !== null && _c !== void 0 ? _c : (this._options.enableAllFeatures ? this._adapterSupportedExtensions : undefined);
375
+ if (requiredFeatures) {
376
+ const requestedExtensions = requiredFeatures;
343
377
  const validExtensions = [];
344
378
  for (const extension of requestedExtensions) {
345
379
  if (this._adapterSupportedExtensions.indexOf(extension) !== -1) {
@@ -348,7 +382,13 @@ export class WebGPUEngine extends Engine {
348
382
  }
349
383
  deviceDescriptor.requiredFeatures = validExtensions;
350
384
  }
351
- return this._adapter.requestDevice(this._options.deviceDescriptor);
385
+ if (this._options.setMaximumLimits && !deviceDescriptor.requiredLimits) {
386
+ deviceDescriptor.requiredLimits = {};
387
+ for (const name in this._adapterSupportedLimits) {
388
+ deviceDescriptor.requiredLimits[name] = this._adapterSupportedLimits[name];
389
+ }
390
+ }
391
+ return this._adapter.requestDevice(deviceDescriptor);
352
392
  }
353
393
  })
354
394
  .then((device) => {
@@ -356,6 +396,7 @@ export class WebGPUEngine extends Engine {
356
396
  this._device = device;
357
397
  this._deviceEnabledExtensions = [];
358
398
  (_a = this._device.features) === null || _a === void 0 ? void 0 : _a.forEach((feature) => this._deviceEnabledExtensions.push(feature));
399
+ this._deviceLimits = device.limits;
359
400
  let numUncapturedErrors = -1;
360
401
  this._device.addEventListener("uncapturederror", (event) => {
361
402
  if (++numUncapturedErrors < this.numMaxUncapturedErrors) {
@@ -367,6 +408,9 @@ export class WebGPUEngine extends Engine {
367
408
  });
368
409
  if (!this._doNotHandleContextLost) {
369
410
  (_b = this._device.lost) === null || _b === void 0 ? void 0 : _b.then((info) => {
411
+ if (this._isDisposed) {
412
+ return;
413
+ }
370
414
  this._contextWasLost = true;
371
415
  Logger.Warn("WebGPU context lost. " + info);
372
416
  this.onContextLostObservable.notifyObservers(this);
@@ -454,16 +498,16 @@ export class WebGPUEngine extends Engine {
454
498
  // Init caps
455
499
  // TODO WEBGPU Real Capability check once limits will be working.
456
500
  this._caps = {
457
- maxTexturesImageUnits: 16,
458
- maxVertexTextureImageUnits: 16,
459
- maxCombinedTexturesImageUnits: 32,
460
- maxTextureSize: 8192,
461
- maxCubemapTextureSize: 2048,
462
- maxRenderTextureSize: 8192,
463
- maxVertexAttribs: 16,
464
- maxVaryingVectors: 15,
465
- maxFragmentUniformVectors: 1024,
466
- maxVertexUniformVectors: 1024,
501
+ maxTexturesImageUnits: this._deviceLimits.maxSampledTexturesPerShaderStage,
502
+ maxVertexTextureImageUnits: this._deviceLimits.maxSampledTexturesPerShaderStage,
503
+ maxCombinedTexturesImageUnits: this._deviceLimits.maxSampledTexturesPerShaderStage * 2,
504
+ maxTextureSize: this._deviceLimits.maxTextureDimension2D,
505
+ maxCubemapTextureSize: this._deviceLimits.maxTextureDimension2D,
506
+ maxRenderTextureSize: this._deviceLimits.maxTextureDimension2D,
507
+ maxVertexAttribs: this._deviceLimits.maxVertexAttributes,
508
+ maxVaryingVectors: this._deviceLimits.maxInterStageShaderVariables,
509
+ maxFragmentUniformVectors: Math.floor(this._deviceLimits.maxUniformBufferBindingSize / 4),
510
+ maxVertexUniformVectors: Math.floor(this._deviceLimits.maxUniformBufferBindingSize / 4),
467
511
  standardDerivatives: true,
468
512
  astc: (this._deviceEnabledExtensions.indexOf(WebGPUConstants.FeatureName.TextureCompressionASTC) >= 0 ? true : undefined),
469
513
  s3tc: (this._deviceEnabledExtensions.indexOf(WebGPUConstants.FeatureName.TextureCompressionBC) >= 0 ? true : undefined),
@@ -471,13 +515,13 @@ export class WebGPUEngine extends Engine {
471
515
  etc1: null,
472
516
  etc2: (this._deviceEnabledExtensions.indexOf(WebGPUConstants.FeatureName.TextureCompressionETC2) >= 0 ? true : undefined),
473
517
  bptc: this._deviceEnabledExtensions.indexOf(WebGPUConstants.FeatureName.TextureCompressionBC) >= 0 ? true : undefined,
474
- maxAnisotropy: 4,
518
+ maxAnisotropy: 16,
475
519
  uintIndices: true,
476
520
  fragmentDepthSupported: true,
477
521
  highPrecisionShaderSupported: true,
478
522
  colorBufferFloat: true,
479
523
  textureFloat: true,
480
- textureFloatLinearFiltering: false,
524
+ textureFloatLinearFiltering: this._deviceEnabledExtensions.indexOf(WebGPUConstants.FeatureName.Float32Filterable) >= 0,
481
525
  textureFloatRender: true,
482
526
  textureHalfFloat: true,
483
527
  textureHalfFloatLinearFiltering: true,
@@ -488,7 +532,7 @@ export class WebGPUEngine extends Engine {
488
532
  depthTextureExtension: true,
489
533
  vertexArrayObject: false,
490
534
  instancedArrays: true,
491
- timerQuery: typeof BigUint64Array !== "undefined" && this.enabledExtensions.indexOf(WebGPUConstants.FeatureName.TimestampQuery) !== -1 ? true : undefined,
535
+ timerQuery: typeof BigUint64Array !== "undefined" && this._deviceEnabledExtensions.indexOf(WebGPUConstants.FeatureName.TimestampQuery) !== -1 ? true : undefined,
492
536
  supportOcclusionQuery: typeof BigUint64Array !== "undefined",
493
537
  canUseTimestampForTimerQuery: true,
494
538
  multiview: false,
@@ -502,7 +546,7 @@ export class WebGPUEngine extends Engine {
502
546
  supportSRGBBuffers: true,
503
547
  supportTransformFeedbacks: false,
504
548
  textureMaxLevel: true,
505
- texture2DArrayMaxLayerCount: 2048,
549
+ texture2DArrayMaxLayerCount: this._deviceLimits.maxTextureArrayLayers,
506
550
  };
507
551
  this._caps.parallelShaderCompile = null;
508
552
  this._features = {
@@ -533,7 +577,10 @@ export class WebGPUEngine extends Engine {
533
577
  };
534
578
  }
535
579
  _initializeContextAndSwapChain() {
536
- this._context = this._canvas.getContext("webgpu");
580
+ if (!this._renderingCanvas) {
581
+ throw "The rendering canvas has not been set!";
582
+ }
583
+ this._context = this._renderingCanvas.getContext("webgpu");
537
584
  this._configureContext();
538
585
  this._colorFormat = this._options.swapChainFormat;
539
586
  this._mainRenderPassWrapper.colorAttachmentGPUTextures = [new WebGPUHardwareTexture()];
@@ -546,17 +593,17 @@ export class WebGPUEngine extends Engine {
546
593
  }
547
594
  this.flushFramebuffer(false);
548
595
  this._mainTextureExtends = {
549
- width: this.getRenderWidth(),
550
- height: this.getRenderHeight(),
596
+ width: this.getRenderWidth(true),
597
+ height: this.getRenderHeight(true),
551
598
  depthOrArrayLayers: 1,
552
599
  };
553
- const bufferDataUpdate = new Float32Array([this.getRenderHeight()]);
600
+ const bufferDataUpdate = new Float32Array([this.getRenderHeight(true)]);
554
601
  this._bufferManager.setSubData(this._ubInvertY, 4, bufferDataUpdate);
555
602
  this._bufferManager.setSubData(this._ubDontInvertY, 4, bufferDataUpdate);
556
603
  let mainColorAttachments;
557
604
  if (this._options.antialias) {
558
605
  const mainTextureDescriptor = {
559
- label: "Texture_MainColor_antialiasing",
606
+ label: `Texture_MainColor_${this._mainTextureExtends.width}x${this._mainTextureExtends.height}_antialiasing`,
560
607
  size: this._mainTextureExtends,
561
608
  mipLevelCount: 1,
562
609
  sampleCount: this._mainPassSampleCount,
@@ -570,7 +617,13 @@ export class WebGPUEngine extends Engine {
570
617
  this._mainTexture = this._device.createTexture(mainTextureDescriptor);
571
618
  mainColorAttachments = [
572
619
  {
573
- view: this._mainTexture.createView(),
620
+ view: this._mainTexture.createView({
621
+ label: "TextureView_MainColor_antialiasing",
622
+ dimension: WebGPUConstants.TextureDimension.E2d,
623
+ format: this._options.swapChainFormat,
624
+ mipLevelCount: 1,
625
+ arrayLayerCount: 1,
626
+ }),
574
627
  clearValue: new Color4(0, 0, 0, 1),
575
628
  loadOp: WebGPUConstants.LoadOp.Clear,
576
629
  storeOp: WebGPUConstants.StoreOp.Store, // don't use StoreOp.Discard, else using several cameras with different viewports or using scissors will fail because we call beginRenderPass / endPass several times for the same color attachment!
@@ -590,7 +643,7 @@ export class WebGPUEngine extends Engine {
590
643
  this._mainRenderPassWrapper.depthTextureFormat = this.isStencilEnable ? WebGPUConstants.TextureFormat.Depth24PlusStencil8 : WebGPUConstants.TextureFormat.Depth32Float;
591
644
  this._setDepthTextureFormat(this._mainRenderPassWrapper);
592
645
  const depthTextureDescriptor = {
593
- label: "Texture_MainDepthStencil",
646
+ label: `Texture_MainDepthStencil_${this._mainTextureExtends.width}x${this._mainTextureExtends.height}`,
594
647
  size: this._mainTextureExtends,
595
648
  mipLevelCount: 1,
596
649
  sampleCount: this._mainPassSampleCount,
@@ -603,7 +656,13 @@ export class WebGPUEngine extends Engine {
603
656
  }
604
657
  this._depthTexture = this._device.createTexture(depthTextureDescriptor);
605
658
  const mainDepthAttachment = {
606
- view: this._depthTexture.createView(),
659
+ view: this._depthTexture.createView({
660
+ label: `TextureView_MainDepthStencil_${this._mainTextureExtends.width}x${this._mainTextureExtends.height}`,
661
+ dimension: WebGPUConstants.TextureDimension.E2d,
662
+ format: this._depthTexture.format,
663
+ mipLevelCount: 1,
664
+ arrayLayerCount: 1,
665
+ }),
607
666
  depthClearValue: this._clearDepthValue,
608
667
  depthLoadOp: WebGPUConstants.LoadOp.Clear,
609
668
  depthStoreOp: WebGPUConstants.StoreOp.Store,
@@ -746,7 +805,7 @@ export class WebGPUEngine extends Engine {
746
805
  let y = Math.floor(this._viewportCached.y);
747
806
  const h = Math.floor(this._viewportCached.w);
748
807
  if (!this._currentRenderTarget) {
749
- y = this.getRenderHeight() - y - h;
808
+ y = this.getRenderHeight(true) - y - h;
750
809
  }
751
810
  renderPass.setViewport(Math.floor(this._viewportCached.x), y, Math.floor(this._viewportCached.z), h, 0, 1);
752
811
  if (this.dbgVerboseLogsForFirstFrames) {
@@ -1109,10 +1168,10 @@ export class WebGPUEngine extends Engine {
1109
1168
  }
1110
1169
  return defines + source;
1111
1170
  }
1112
- _createPipelineStageDescriptor(vertexShader, fragmentShader, shaderLanguage) {
1171
+ _createPipelineStageDescriptor(vertexShader, fragmentShader, shaderLanguage, disableUniformityAnalysisInVertex, disableUniformityAnalysisInFragment) {
1113
1172
  if (this._tintWASM && shaderLanguage === ShaderLanguage.GLSL) {
1114
- vertexShader = this._tintWASM.convertSpirV2WGSL(vertexShader);
1115
- fragmentShader = this._tintWASM.convertSpirV2WGSL(fragmentShader);
1173
+ vertexShader = this._tintWASM.convertSpirV2WGSL(vertexShader, disableUniformityAnalysisInVertex);
1174
+ fragmentShader = this._tintWASM.convertSpirV2WGSL(fragmentShader, disableUniformityAnalysisInFragment);
1116
1175
  }
1117
1176
  return {
1118
1177
  vertexStage: {
@@ -1130,18 +1189,22 @@ export class WebGPUEngine extends Engine {
1130
1189
  };
1131
1190
  }
1132
1191
  _compileRawPipelineStageDescriptor(vertexCode, fragmentCode, shaderLanguage) {
1192
+ const disableUniformityAnalysisInVertex = vertexCode.indexOf(disableUniformityAnalysisMarker) >= 0;
1193
+ const disableUniformityAnalysisInFragment = fragmentCode.indexOf(disableUniformityAnalysisMarker) >= 0;
1133
1194
  const vertexShader = shaderLanguage === ShaderLanguage.GLSL ? this._compileRawShaderToSpirV(vertexCode, "vertex") : vertexCode;
1134
1195
  const fragmentShader = shaderLanguage === ShaderLanguage.GLSL ? this._compileRawShaderToSpirV(fragmentCode, "fragment") : fragmentCode;
1135
- return this._createPipelineStageDescriptor(vertexShader, fragmentShader, shaderLanguage);
1196
+ return this._createPipelineStageDescriptor(vertexShader, fragmentShader, shaderLanguage, disableUniformityAnalysisInVertex, disableUniformityAnalysisInFragment);
1136
1197
  }
1137
1198
  _compilePipelineStageDescriptor(vertexCode, fragmentCode, defines, shaderLanguage) {
1138
1199
  this.onBeforeShaderCompilationObservable.notifyObservers(this);
1200
+ const disableUniformityAnalysisInVertex = vertexCode.indexOf(disableUniformityAnalysisMarker) >= 0;
1201
+ const disableUniformityAnalysisInFragment = fragmentCode.indexOf(disableUniformityAnalysisMarker) >= 0;
1139
1202
  const shaderVersion = "#version 450\n";
1140
1203
  const vertexShader = shaderLanguage === ShaderLanguage.GLSL ? this._compileShaderToSpirV(vertexCode, "vertex", defines, shaderVersion) : this._getWGSLShader(vertexCode, "vertex", defines);
1141
1204
  const fragmentShader = shaderLanguage === ShaderLanguage.GLSL
1142
1205
  ? this._compileShaderToSpirV(fragmentCode, "fragment", defines, shaderVersion)
1143
1206
  : this._getWGSLShader(fragmentCode, "fragment", defines);
1144
- const program = this._createPipelineStageDescriptor(vertexShader, fragmentShader, shaderLanguage);
1207
+ const program = this._createPipelineStageDescriptor(vertexShader, fragmentShader, shaderLanguage, disableUniformityAnalysisInVertex, disableUniformityAnalysisInFragment);
1145
1208
  this.onAfterShaderCompilationObservable.notifyObservers(this);
1146
1209
  return program;
1147
1210
  }
@@ -1364,6 +1427,7 @@ export class WebGPUEngine extends Engine {
1364
1427
  fullOptions.samples = (_a = options.samples) !== null && _a !== void 0 ? _a : 1;
1365
1428
  fullOptions.creationFlags = (_b = options.creationFlags) !== null && _b !== void 0 ? _b : 0;
1366
1429
  fullOptions.useSRGBBuffer = (_c = options.useSRGBBuffer) !== null && _c !== void 0 ? _c : false;
1430
+ fullOptions.label = options.label;
1367
1431
  }
1368
1432
  else {
1369
1433
  fullOptions.generateMipMaps = options;
@@ -1403,6 +1467,7 @@ export class WebGPUEngine extends Engine {
1403
1467
  texture._cachedWrapU = 0;
1404
1468
  texture._cachedWrapV = 0;
1405
1469
  texture._useSRGBBuffer = fullOptions.useSRGBBuffer;
1470
+ texture.label = fullOptions.label;
1406
1471
  this._internalTexturesCache.push(texture);
1407
1472
  if (!delayGPUTextureCreation) {
1408
1473
  this._textureHelper.createGPUTextureForInternalTexture(texture, width, height, layers || 1, fullOptions.creationFlags);
@@ -2104,10 +2169,12 @@ export class WebGPUEngine extends Engine {
2104
2169
  this._mainRenderPassWrapper.colorAttachmentGPUTextures[0].set(swapChainTexture);
2105
2170
  // Resolve in case of MSAA
2106
2171
  if (this._options.antialias) {
2107
- this._mainRenderPassWrapper.renderPassDescriptor.colorAttachments[0].resolveTarget = swapChainTexture.createView();
2172
+ viewDescriptorSwapChainAntialiasing.format = swapChainTexture.format;
2173
+ this._mainRenderPassWrapper.renderPassDescriptor.colorAttachments[0].resolveTarget = swapChainTexture.createView(viewDescriptorSwapChainAntialiasing);
2108
2174
  }
2109
2175
  else {
2110
- this._mainRenderPassWrapper.renderPassDescriptor.colorAttachments[0].view = swapChainTexture.createView();
2176
+ viewDescriptorSwapChain.format = swapChainTexture.format;
2177
+ this._mainRenderPassWrapper.renderPassDescriptor.colorAttachments[0].view = swapChainTexture.createView(viewDescriptorSwapChain);
2111
2178
  }
2112
2179
  if (this.dbgVerboseLogsForFirstFrames) {
2113
2180
  if (this._count === undefined) {
@@ -2518,8 +2585,10 @@ export class WebGPUEngine extends Engine {
2518
2585
  */
2519
2586
  dispose() {
2520
2587
  var _a, _b;
2588
+ this._isDisposed = true;
2521
2589
  (_a = this._mainTexture) === null || _a === void 0 ? void 0 : _a.destroy();
2522
2590
  (_b = this._depthTexture) === null || _b === void 0 ? void 0 : _b.destroy();
2591
+ this._device.destroy();
2523
2592
  super.dispose();
2524
2593
  }
2525
2594
  //------------------------------------------------------------------------------
@@ -2531,10 +2600,11 @@ export class WebGPUEngine extends Engine {
2531
2600
  * @returns a number defining the current render width
2532
2601
  */
2533
2602
  getRenderWidth(useScreen = false) {
2603
+ var _a, _b;
2534
2604
  if (!useScreen && this._currentRenderTarget) {
2535
2605
  return this._currentRenderTarget.width;
2536
2606
  }
2537
- return this._canvas.width;
2607
+ return (_b = (_a = this._renderingCanvas) === null || _a === void 0 ? void 0 : _a.width) !== null && _b !== void 0 ? _b : 0;
2538
2608
  }
2539
2609
  /**
2540
2610
  * Gets the current render height
@@ -2542,17 +2612,11 @@ export class WebGPUEngine extends Engine {
2542
2612
  * @returns a number defining the current render height
2543
2613
  */
2544
2614
  getRenderHeight(useScreen = false) {
2615
+ var _a, _b;
2545
2616
  if (!useScreen && this._currentRenderTarget) {
2546
2617
  return this._currentRenderTarget.height;
2547
2618
  }
2548
- return this._canvas.height;
2549
- }
2550
- /**
2551
- * Gets the HTML canvas attached with the current WebGPU context
2552
- * @returns a HTML canvas
2553
- */
2554
- getRenderingCanvas() {
2555
- return this._canvas;
2619
+ return (_b = (_a = this._renderingCanvas) === null || _a === void 0 ? void 0 : _a.height) !== null && _b !== void 0 ? _b : 0;
2556
2620
  }
2557
2621
  //------------------------------------------------------------------------------
2558
2622
  // Errors