@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.
- package/dist/adapter/helpers/convert-texture-format.d.ts +0 -1
- package/dist/adapter/helpers/convert-texture-format.d.ts.map +1 -1
- package/dist/adapter/helpers/get-bind-group.d.ts +1 -2
- package/dist/adapter/helpers/get-bind-group.d.ts.map +1 -1
- package/dist/adapter/helpers/get-bind-group.js +5 -5
- package/dist/adapter/helpers/get-vertex-buffer-layout.d.ts +0 -1
- package/dist/adapter/helpers/get-vertex-buffer-layout.d.ts.map +1 -1
- package/dist/adapter/helpers/get-vertex-buffer-layout.js +11 -7
- package/dist/adapter/helpers/webgpu-parameters.d.ts +0 -1
- package/dist/adapter/helpers/webgpu-parameters.d.ts.map +1 -1
- package/dist/adapter/helpers/webgpu-parameters.js +27 -12
- package/dist/adapter/resources/webgpu-buffer.d.ts +0 -1
- package/dist/adapter/resources/webgpu-buffer.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-command-encoder.d.ts +0 -1
- package/dist/adapter/resources/webgpu-command-encoder.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-command-encoder.js +22 -5
- package/dist/adapter/resources/webgpu-compute-pass.d.ts +0 -1
- package/dist/adapter/resources/webgpu-compute-pass.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-compute-pass.js +1 -0
- package/dist/adapter/resources/webgpu-compute-pipeline.d.ts +0 -1
- package/dist/adapter/resources/webgpu-compute-pipeline.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-compute-pipeline.js +1 -1
- package/dist/adapter/resources/webgpu-external-texture.d.ts +0 -1
- package/dist/adapter/resources/webgpu-external-texture.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-external-texture.js +1 -0
- package/dist/adapter/resources/webgpu-framebuffer.d.ts +3 -0
- package/dist/adapter/resources/webgpu-framebuffer.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-framebuffer.js +2 -0
- package/dist/adapter/resources/webgpu-query-set.d.ts +0 -1
- package/dist/adapter/resources/webgpu-query-set.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-render-pass.d.ts +3 -3
- package/dist/adapter/resources/webgpu-render-pass.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-render-pass.js +8 -5
- package/dist/adapter/resources/webgpu-render-pipeline.d.ts +2 -3
- package/dist/adapter/resources/webgpu-render-pipeline.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-render-pipeline.js +11 -17
- package/dist/adapter/resources/webgpu-sampler.d.ts +0 -1
- package/dist/adapter/resources/webgpu-sampler.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-sampler.js +2 -0
- package/dist/adapter/resources/webgpu-shader.d.ts +0 -1
- package/dist/adapter/resources/webgpu-shader.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-texture-view.d.ts +0 -1
- package/dist/adapter/resources/webgpu-texture-view.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-texture.d.ts +12 -5
- package/dist/adapter/resources/webgpu-texture.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-texture.js +46 -23
- package/dist/adapter/resources/webgpu-vertex-array.d.ts +1 -1
- package/dist/adapter/resources/webgpu-vertex-array.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-vertex-array.js +3 -1
- package/dist/adapter/webgpu-adapter.d.ts +13 -0
- package/dist/adapter/webgpu-adapter.d.ts.map +1 -0
- package/dist/adapter/webgpu-adapter.js +68 -0
- package/dist/adapter/webgpu-canvas-context.d.ts +2 -3
- package/dist/adapter/webgpu-canvas-context.d.ts.map +1 -1
- package/dist/adapter/webgpu-device.d.ts +1 -6
- package/dist/adapter/webgpu-device.d.ts.map +1 -1
- package/dist/adapter/webgpu-device.js +9 -47
- package/dist/dist.dev.js +190 -156
- package/dist/dist.min.js +1 -1
- package/dist/index.cjs +174 -115
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/package.json +4 -4
- package/src/adapter/helpers/get-bind-group.ts +6 -6
- package/src/adapter/helpers/get-vertex-buffer-layout.ts +14 -8
- package/src/adapter/helpers/webgpu-parameters.ts +29 -12
- package/src/adapter/resources/webgpu-command-encoder.ts +25 -7
- package/src/adapter/resources/webgpu-compute-pass.ts +1 -0
- package/src/adapter/resources/webgpu-compute-pipeline.ts +1 -6
- package/src/adapter/resources/webgpu-external-texture.ts +1 -0
- package/src/adapter/resources/webgpu-framebuffer.ts +4 -0
- package/src/adapter/resources/webgpu-render-pass.ts +16 -10
- package/src/adapter/resources/webgpu-render-pipeline.ts +11 -23
- package/src/adapter/resources/webgpu-sampler.ts +3 -0
- package/src/adapter/resources/webgpu-texture-view.ts +15 -0
- package/src/adapter/resources/webgpu-texture.ts +88 -57
- package/src/adapter/resources/webgpu-vertex-array.ts +2 -1
- package/src/adapter/webgpu-adapter.ts +93 -0
- package/src/adapter/webgpu-canvas-context.ts +1 -1
- package/src/adapter/webgpu-device.ts +12 -64
- 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
|
|
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
|
|
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 ||
|
|
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 {
|
|
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';
|