@luma.gl/webgpu 9.0.17 → 9.1.0-alpha.10

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 (83) hide show
  1. package/dist/adapter/helpers/convert-texture-format.d.ts +0 -1
  2. package/dist/adapter/helpers/convert-texture-format.d.ts.map +1 -1
  3. package/dist/adapter/helpers/get-bind-group.d.ts +1 -2
  4. package/dist/adapter/helpers/get-bind-group.d.ts.map +1 -1
  5. package/dist/adapter/helpers/get-bind-group.js +5 -5
  6. package/dist/adapter/helpers/get-vertex-buffer-layout.d.ts +0 -1
  7. package/dist/adapter/helpers/get-vertex-buffer-layout.d.ts.map +1 -1
  8. package/dist/adapter/helpers/get-vertex-buffer-layout.js +11 -7
  9. package/dist/adapter/helpers/webgpu-parameters.d.ts +0 -1
  10. package/dist/adapter/helpers/webgpu-parameters.d.ts.map +1 -1
  11. package/dist/adapter/helpers/webgpu-parameters.js +27 -12
  12. package/dist/adapter/resources/webgpu-buffer.d.ts +0 -1
  13. package/dist/adapter/resources/webgpu-buffer.d.ts.map +1 -1
  14. package/dist/adapter/resources/webgpu-command-encoder.d.ts +0 -1
  15. package/dist/adapter/resources/webgpu-command-encoder.d.ts.map +1 -1
  16. package/dist/adapter/resources/webgpu-command-encoder.js +22 -5
  17. package/dist/adapter/resources/webgpu-compute-pass.d.ts +0 -1
  18. package/dist/adapter/resources/webgpu-compute-pass.d.ts.map +1 -1
  19. package/dist/adapter/resources/webgpu-compute-pass.js +1 -0
  20. package/dist/adapter/resources/webgpu-compute-pipeline.d.ts +0 -1
  21. package/dist/adapter/resources/webgpu-compute-pipeline.d.ts.map +1 -1
  22. package/dist/adapter/resources/webgpu-compute-pipeline.js +1 -1
  23. package/dist/adapter/resources/webgpu-external-texture.d.ts +0 -1
  24. package/dist/adapter/resources/webgpu-external-texture.d.ts.map +1 -1
  25. package/dist/adapter/resources/webgpu-external-texture.js +1 -0
  26. package/dist/adapter/resources/webgpu-framebuffer.d.ts +3 -0
  27. package/dist/adapter/resources/webgpu-framebuffer.d.ts.map +1 -1
  28. package/dist/adapter/resources/webgpu-framebuffer.js +2 -0
  29. package/dist/adapter/resources/webgpu-query-set.d.ts +0 -1
  30. package/dist/adapter/resources/webgpu-query-set.d.ts.map +1 -1
  31. package/dist/adapter/resources/webgpu-render-pass.d.ts +3 -3
  32. package/dist/adapter/resources/webgpu-render-pass.d.ts.map +1 -1
  33. package/dist/adapter/resources/webgpu-render-pass.js +8 -5
  34. package/dist/adapter/resources/webgpu-render-pipeline.d.ts +2 -3
  35. package/dist/adapter/resources/webgpu-render-pipeline.d.ts.map +1 -1
  36. package/dist/adapter/resources/webgpu-render-pipeline.js +11 -17
  37. package/dist/adapter/resources/webgpu-sampler.d.ts +0 -1
  38. package/dist/adapter/resources/webgpu-sampler.d.ts.map +1 -1
  39. package/dist/adapter/resources/webgpu-sampler.js +2 -0
  40. package/dist/adapter/resources/webgpu-shader.d.ts +0 -1
  41. package/dist/adapter/resources/webgpu-shader.d.ts.map +1 -1
  42. package/dist/adapter/resources/webgpu-texture-view.d.ts +0 -1
  43. package/dist/adapter/resources/webgpu-texture-view.d.ts.map +1 -1
  44. package/dist/adapter/resources/webgpu-texture.d.ts +12 -5
  45. package/dist/adapter/resources/webgpu-texture.d.ts.map +1 -1
  46. package/dist/adapter/resources/webgpu-texture.js +46 -23
  47. package/dist/adapter/resources/webgpu-vertex-array.d.ts +1 -1
  48. package/dist/adapter/resources/webgpu-vertex-array.d.ts.map +1 -1
  49. package/dist/adapter/resources/webgpu-vertex-array.js +3 -1
  50. package/dist/adapter/webgpu-adapter.d.ts +13 -0
  51. package/dist/adapter/webgpu-adapter.d.ts.map +1 -0
  52. package/dist/adapter/webgpu-adapter.js +68 -0
  53. package/dist/adapter/webgpu-canvas-context.d.ts +2 -3
  54. package/dist/adapter/webgpu-canvas-context.d.ts.map +1 -1
  55. package/dist/adapter/webgpu-device.d.ts +1 -6
  56. package/dist/adapter/webgpu-device.d.ts.map +1 -1
  57. package/dist/adapter/webgpu-device.js +9 -47
  58. package/dist/dist.dev.js +190 -156
  59. package/dist/dist.min.js +1 -1
  60. package/dist/index.cjs +174 -115
  61. package/dist/index.cjs.map +4 -4
  62. package/dist/index.d.ts +2 -0
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +2 -2
  65. package/package.json +4 -4
  66. package/src/adapter/helpers/get-bind-group.ts +6 -6
  67. package/src/adapter/helpers/get-vertex-buffer-layout.ts +14 -8
  68. package/src/adapter/helpers/webgpu-parameters.ts +29 -12
  69. package/src/adapter/resources/webgpu-command-encoder.ts +25 -7
  70. package/src/adapter/resources/webgpu-compute-pass.ts +1 -0
  71. package/src/adapter/resources/webgpu-compute-pipeline.ts +1 -6
  72. package/src/adapter/resources/webgpu-external-texture.ts +1 -0
  73. package/src/adapter/resources/webgpu-framebuffer.ts +4 -0
  74. package/src/adapter/resources/webgpu-render-pass.ts +16 -10
  75. package/src/adapter/resources/webgpu-render-pipeline.ts +11 -23
  76. package/src/adapter/resources/webgpu-sampler.ts +3 -0
  77. package/src/adapter/resources/webgpu-texture-view.ts +15 -0
  78. package/src/adapter/resources/webgpu-texture.ts +88 -57
  79. package/src/adapter/resources/webgpu-vertex-array.ts +2 -1
  80. package/src/adapter/webgpu-adapter.ts +93 -0
  81. package/src/adapter/webgpu-canvas-context.ts +1 -1
  82. package/src/adapter/webgpu-device.ts +12 -64
  83. package/src/index.ts +3 -1
@@ -22,7 +22,7 @@ export class WebGPUVertexArray extends VertexArray {
22
22
  readonly handle: never;
23
23
 
24
24
  // Create a VertexArray
25
- constructor(device: WebGPUDevice, props?: VertexArrayProps) {
25
+ constructor(device: WebGPUDevice, props: VertexArrayProps) {
26
26
  super(device, props);
27
27
  this.device = device;
28
28
  }
@@ -60,6 +60,7 @@ export class WebGPUVertexArray extends VertexArray {
60
60
  log.warn('setting index buffer', webgpuIndexBuffer?.handle, webgpuIndexBuffer?.indexType)();
61
61
  webgpuRenderPass.handle.setIndexBuffer(
62
62
  webgpuIndexBuffer?.handle,
63
+ // @ts-expect-error TODO - we must enforce type
63
64
  webgpuIndexBuffer?.indexType
64
65
  );
65
66
  }
@@ -0,0 +1,93 @@
1
+ // luma.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import {Adapter, DeviceProps, CanvasContext, log} from '@luma.gl/core';
6
+ import {WebGPUDevice} from './webgpu-device';
7
+
8
+ // / <reference types="@webgpu/types" />
9
+
10
+ export class WebGPUAdapter extends Adapter {
11
+ /** type of device's created by this adapter */
12
+ readonly type: WebGPUDevice['type'] = 'webgpu';
13
+
14
+ constructor() {
15
+ super();
16
+ // @ts-ignore For backwards compatibility luma.registerDevices
17
+ WebGPUDevice.adapter = this;
18
+ }
19
+
20
+ /** Check if WebGPU is available */
21
+ isSupported(): boolean {
22
+ return Boolean(typeof navigator !== 'undefined' && navigator.gpu);
23
+ }
24
+
25
+ async create(props: DeviceProps): Promise<WebGPUDevice> {
26
+ if (!navigator.gpu) {
27
+ throw new Error(
28
+ 'WebGPU not available. Open in Chrome Canary and turn on chrome://flags/#enable-unsafe-webgpu'
29
+ );
30
+ }
31
+ log.groupCollapsed(1, 'WebGPUDevice created')();
32
+ const adapter = await navigator.gpu.requestAdapter({
33
+ powerPreference: 'high-performance'
34
+ // forceSoftware: false
35
+ });
36
+
37
+ if (!adapter) {
38
+ throw new Error('Failed to request WebGPU adapter');
39
+ }
40
+
41
+ const adapterInfo = await adapter.requestAdapterInfo();
42
+ log.probe(2, 'Adapter available', adapterInfo)();
43
+
44
+ const requiredFeatures: GPUFeatureName[] = [];
45
+ const requiredLimits: Record<string, number> = {};
46
+
47
+ if (props.requestMaxLimits) {
48
+ // Require all features
49
+ requiredFeatures.push(...(Array.from(adapter.features) as GPUFeatureName[]));
50
+
51
+ // Require all limits
52
+ // Filter out chrome specific keys (avoid crash)
53
+ const limits = Object.keys(adapter.limits).filter(
54
+ key => !['minSubgroupSize', 'maxSubgroupSize'].includes(key)
55
+ );
56
+ for (const key of limits) {
57
+ const limit = key as keyof GPUSupportedLimits;
58
+ const value = adapter.limits[limit];
59
+ if (typeof value === 'number') {
60
+ requiredLimits[limit] = value;
61
+ }
62
+ }
63
+ }
64
+
65
+ const gpuDevice = await adapter.requestDevice({
66
+ requiredFeatures,
67
+ requiredLimits
68
+ });
69
+
70
+ log.probe(1, 'GPUDevice available')();
71
+
72
+ if (typeof props.canvas === 'string') {
73
+ await CanvasContext.pageLoaded;
74
+ log.probe(1, 'DOM is loaded')();
75
+ }
76
+
77
+ const device = new WebGPUDevice(props, gpuDevice, adapter, adapterInfo);
78
+
79
+ log.probe(
80
+ 1,
81
+ 'Device created. For more info, set chrome://flags/#enable-webgpu-developer-features'
82
+ )();
83
+ log.table(1, device.info)();
84
+ log.groupEnd(1)();
85
+ return device;
86
+ }
87
+
88
+ async attach(handle: GPUDevice): Promise<WebGPUDevice> {
89
+ throw new Error('WebGPUAdapter.attach() not implemented');
90
+ }
91
+ }
92
+
93
+ export const webgpuAdapter = new WebGPUAdapter();
@@ -22,7 +22,7 @@ export class WebGPUCanvasContext extends CanvasContext {
22
22
  /** Format of returned textures: "bgra8unorm", "rgba8unorm", "rgba16float". */
23
23
  readonly format: TextureFormat = navigator.gpu.getPreferredCanvasFormat() as TextureFormat;
24
24
  /** Default stencil format for depth textures */
25
- depthStencilFormat: TextureFormat = 'depth24plus';
25
+ readonly depthStencilFormat: TextureFormat = 'depth24plus';
26
26
 
27
27
  private depthStencilAttachment: Texture | null = null;
28
28
 
@@ -30,7 +30,7 @@ import type {
30
30
  QuerySet,
31
31
  QuerySetProps
32
32
  } from '@luma.gl/core';
33
- import {Device, DeviceFeatures, CanvasContext, log, uid} from '@luma.gl/core';
33
+ import {Device, DeviceFeatures} from '@luma.gl/core';
34
34
  import {WebGPUBuffer} from './resources/webgpu-buffer';
35
35
  import {WebGPUTexture} from './resources/webgpu-texture';
36
36
  import {WebGPUExternalTexture} from './resources/webgpu-external-texture';
@@ -49,8 +49,6 @@ import {WebGPUQuerySet} from './resources/webgpu-query-set';
49
49
 
50
50
  /** WebGPU Device implementation */
51
51
  export class WebGPUDevice extends Device {
52
- static type: string = 'webgpu';
53
-
54
52
  /** type of this device */
55
53
  readonly type = 'webgpu';
56
54
 
@@ -72,71 +70,13 @@ export class WebGPUDevice extends Device {
72
70
  commandEncoder: GPUCommandEncoder | null = null;
73
71
  renderPass: WebGPURenderPass | null = null;
74
72
 
75
- /** Check if WebGPU is available */
76
- static isSupported(): boolean {
77
- return Boolean(typeof navigator !== 'undefined' && navigator.gpu);
78
- }
79
-
80
- static async create(props: DeviceProps): Promise<WebGPUDevice> {
81
- if (!navigator.gpu) {
82
- throw new Error(
83
- 'WebGPU not available. Open in Chrome Canary and turn on chrome://flags/#enable-unsafe-webgpu'
84
- );
85
- }
86
- log.groupCollapsed(1, 'WebGPUDevice created')();
87
- const adapter = await navigator.gpu.requestAdapter({
88
- powerPreference: 'high-performance'
89
- // forceSoftware: false
90
- });
91
- if (!adapter) {
92
- throw new Error('Failed to request WebGPU adapter');
93
- }
94
-
95
- const adapterInfo = await adapter.requestAdapterInfo();
96
- log.probe(2, 'Adapter available', adapterInfo)();
97
-
98
- const requiredFeatures: GPUFeatureName[] = [];
99
- const requiredLimits: Record<string, number> = {};
100
-
101
- if (props.requestMaxLimits) {
102
- requiredFeatures.push(...(Array.from(adapter.features) as GPUFeatureName[]));
103
- for (const key in adapter.limits) {
104
- requiredLimits[key] = adapter.limits[key];
105
- }
106
- delete requiredLimits.minSubgroupSize;
107
- delete requiredLimits.maxSubgroupSize;
108
- }
109
-
110
- const gpuDevice = await adapter.requestDevice({
111
- requiredFeatures,
112
- requiredLimits
113
- });
114
-
115
- log.probe(1, 'GPUDevice available')();
116
-
117
- if (typeof props.canvas === 'string') {
118
- await CanvasContext.pageLoaded;
119
- log.probe(1, 'DOM is loaded')();
120
- }
121
-
122
- const device = new WebGPUDevice(gpuDevice, adapter, adapterInfo, props);
123
-
124
- log.probe(
125
- 1,
126
- 'Device created. For more info, set chrome://flags/#enable-webgpu-developer-features'
127
- )();
128
- log.table(1, device.info)();
129
- log.groupEnd(1)();
130
- return device;
131
- }
132
-
133
73
  constructor(
74
+ props: DeviceProps,
134
75
  device: GPUDevice,
135
76
  adapter: GPUAdapter,
136
- adapterInfo: GPUAdapterInfo,
137
- props: DeviceProps
77
+ adapterInfo: GPUAdapterInfo
138
78
  ) {
139
- super({...props, id: props.id || uid('webgpu-device')});
79
+ super({...props, id: props.id || 'webgpu-device'});
140
80
  this.handle = device;
141
81
  this.adapter = adapter;
142
82
  this.adapterInfo = adapterInfo;
@@ -145,6 +85,14 @@ export class WebGPUDevice extends Device {
145
85
  this.features = this._getFeatures();
146
86
  this.limits = this.handle.limits;
147
87
 
88
+ // Listen for uncaptured WebGPU errors
89
+ device.addEventListener('uncapturederror', (event: Event) => {
90
+ // TODO is this the right way to make sure the error is an Error instance?
91
+ const errorMessage =
92
+ event instanceof GPUUncapturedErrorEvent ? event.error.message : 'Unknown error';
93
+ this.error(new Error(errorMessage));
94
+ });
95
+
148
96
  // "Context" loss handling
149
97
  this.lost = new Promise<{reason: 'destroyed'; message: string}>(async resolve => {
150
98
  const lostInfo = await this.handle.lost;
package/src/index.ts CHANGED
@@ -3,9 +3,11 @@
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
5
  // WEBGPU ADAPTER
6
- export {WebGPUDevice} from './adapter/webgpu-device';
6
+ export type {WebGPUAdapter} from './adapter/webgpu-adapter';
7
+ export {webgpuAdapter} from './adapter/webgpu-adapter';
7
8
 
8
9
  // WEBGPU CLASSES (typically not accessed directly)
10
+ export {WebGPUDevice} from './adapter/webgpu-device';
9
11
  export {WebGPUBuffer} from './adapter/resources/webgpu-buffer';
10
12
  export {WebGPUTexture} from './adapter/resources/webgpu-texture';
11
13
  export {WebGPUSampler} from './adapter/resources/webgpu-sampler';