@luma.gl/webgpu 9.0.0-beta.3 → 9.0.0-beta.5

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 (60) hide show
  1. package/dist/adapter/helpers/accessor-to-format.js +99 -1
  2. package/dist/adapter/helpers/convert-texture-format.js +5 -5
  3. package/dist/adapter/helpers/generate-mipmaps.js +76 -82
  4. package/dist/adapter/helpers/get-bind-group.js +54 -41
  5. package/dist/adapter/helpers/get-vertex-buffer-layout.js +110 -80
  6. package/dist/adapter/helpers/webgpu-parameters.js +182 -125
  7. package/dist/adapter/resources/webgpu-buffer.js +110 -62
  8. package/dist/adapter/resources/webgpu-command-encoder.js +73 -49
  9. package/dist/adapter/resources/webgpu-compute-pass.js +54 -41
  10. package/dist/adapter/resources/webgpu-compute-pipeline.js +24 -19
  11. package/dist/adapter/resources/webgpu-external-texture.js +29 -19
  12. package/dist/adapter/resources/webgpu-framebuffer.js +11 -7
  13. package/dist/adapter/resources/webgpu-query.js +42 -1
  14. package/dist/adapter/resources/webgpu-render-pass.js +115 -105
  15. package/dist/adapter/resources/webgpu-render-pipeline.js +148 -83
  16. package/dist/adapter/resources/webgpu-sampler.js +18 -15
  17. package/dist/adapter/resources/webgpu-shader.js +55 -45
  18. package/dist/adapter/resources/webgpu-texture.js +129 -109
  19. package/dist/adapter/resources/webgpu-vertex-array.d.ts +4 -1
  20. package/dist/adapter/resources/webgpu-vertex-array.d.ts.map +1 -1
  21. package/dist/adapter/resources/webgpu-vertex-array.js +64 -41
  22. package/dist/adapter/webgpu-canvas-context.d.ts.map +1 -1
  23. package/dist/adapter/webgpu-canvas-context.js +100 -69
  24. package/dist/adapter/webgpu-device.d.ts.map +1 -1
  25. package/dist/adapter/webgpu-device.js +257 -230
  26. package/dist/adapter/webgpu-types.js +0 -2
  27. package/dist/dist.dev.js +661 -2178
  28. package/dist/glsl/glsllang.js +9 -6
  29. package/dist/index.cjs +58 -239
  30. package/dist/index.cjs.map +7 -0
  31. package/dist/index.js +9 -6
  32. package/dist.min.js +1 -22
  33. package/package.json +9 -7
  34. package/src/adapter/resources/webgpu-vertex-array.ts +5 -2
  35. package/src/adapter/webgpu-canvas-context.ts +1 -0
  36. package/src/adapter/webgpu-device.ts +16 -36
  37. package/dist/adapter/helpers/accessor-to-format.js.map +0 -1
  38. package/dist/adapter/helpers/convert-texture-format.js.map +0 -1
  39. package/dist/adapter/helpers/generate-mipmaps.js.map +0 -1
  40. package/dist/adapter/helpers/get-bind-group.js.map +0 -1
  41. package/dist/adapter/helpers/get-vertex-buffer-layout.js.map +0 -1
  42. package/dist/adapter/helpers/webgpu-parameters.js.map +0 -1
  43. package/dist/adapter/resources/webgpu-buffer.js.map +0 -1
  44. package/dist/adapter/resources/webgpu-command-encoder.js.map +0 -1
  45. package/dist/adapter/resources/webgpu-compute-pass.js.map +0 -1
  46. package/dist/adapter/resources/webgpu-compute-pipeline.js.map +0 -1
  47. package/dist/adapter/resources/webgpu-external-texture.js.map +0 -1
  48. package/dist/adapter/resources/webgpu-framebuffer.js.map +0 -1
  49. package/dist/adapter/resources/webgpu-query.js.map +0 -1
  50. package/dist/adapter/resources/webgpu-render-pass.js.map +0 -1
  51. package/dist/adapter/resources/webgpu-render-pipeline.js.map +0 -1
  52. package/dist/adapter/resources/webgpu-sampler.js.map +0 -1
  53. package/dist/adapter/resources/webgpu-shader.js.map +0 -1
  54. package/dist/adapter/resources/webgpu-texture.js.map +0 -1
  55. package/dist/adapter/resources/webgpu-vertex-array.js.map +0 -1
  56. package/dist/adapter/webgpu-canvas-context.js.map +0 -1
  57. package/dist/adapter/webgpu-device.js.map +0 -1
  58. package/dist/adapter/webgpu-types.js.map +0 -1
  59. package/dist/glsl/glsllang.js.map +0 -1
  60. package/dist/index.js.map +0 -1
@@ -1,137 +1,194 @@
1
1
  function addDepthStencil(descriptor) {
2
- descriptor.depthStencil = descriptor.depthStencil || {
3
- format: 'depth24plus',
4
- stencilFront: {},
5
- stencilBack: {},
6
- depthWriteEnabled: false,
7
- depthCompare: 'less-equal'
8
- };
9
- return descriptor.depthStencil;
2
+ descriptor.depthStencil = descriptor.depthStencil || {
3
+ // required, set something
4
+ format: 'depth24plus',
5
+ stencilFront: {},
6
+ stencilBack: {},
7
+ // TODO can this cause trouble? Should we set to WebGPU defaults? Are there defaults?
8
+ depthWriteEnabled: false,
9
+ depthCompare: 'less-equal'
10
+ };
11
+ return descriptor.depthStencil;
10
12
  }
13
+ /**
14
+ * Supports for luma.gl's flat parameter space
15
+ * Populates the corresponding sub-objects in a GPURenderPipelineDescriptor
16
+ */
17
+ // @ts-expect-error
11
18
  export const PARAMETER_TABLE = {
12
- cullMode: (parameter, value, descriptor) => {
13
- descriptor.primitive = descriptor.primitive || {};
14
- descriptor.primitive.cullMode = value;
15
- },
16
- frontFace: (parameter, value, descriptor) => {
17
- descriptor.primitive = descriptor.primitive || {};
18
- descriptor.primitive.frontFace = value;
19
- },
20
- depthWriteEnabled: (parameter, value, descriptor) => {
21
- const depthStencil = addDepthStencil(descriptor);
22
- depthStencil.depthWriteEnabled = value;
23
- },
24
- depthCompare: (parameter, value, descriptor) => {
25
- const depthStencil = addDepthStencil(descriptor);
26
- depthStencil.depthCompare = value;
27
- },
28
- depthFormat: (parameter, value, descriptor) => {
29
- const depthStencil = addDepthStencil(descriptor);
30
- depthStencil.format = value;
31
- },
32
- depthBias: (parameter, value, descriptor) => {
33
- const depthStencil = addDepthStencil(descriptor);
34
- depthStencil.depthBias = value;
35
- },
36
- depthBiasSlopeScale: (parameter, value, descriptor) => {
37
- const depthStencil = addDepthStencil(descriptor);
38
- depthStencil.depthBiasSlopeScale = value;
39
- },
40
- depthBiasClamp: (parameter, value, descriptor) => {
41
- const depthStencil = addDepthStencil(descriptor);
42
- depthStencil.depthBiasClamp = value;
43
- },
44
- stencilReadMask: (parameter, value, descriptor) => {
45
- const depthStencil = addDepthStencil(descriptor);
46
- depthStencil.stencilReadMask = value;
47
- },
48
- stencilWriteMask: (parameter, value, descriptor) => {
49
- const depthStencil = addDepthStencil(descriptor);
50
- depthStencil.stencilWriteMask = value;
51
- },
52
- stencilCompare: (parameter, value, descriptor) => {
53
- const depthStencil = addDepthStencil(descriptor);
54
- depthStencil.stencilFront.compare = value;
55
- depthStencil.stencilBack.compare = value;
56
- },
57
- stencilPassOperation: (parameter, value, descriptor) => {
58
- const depthStencil = addDepthStencil(descriptor);
59
- depthStencil.stencilFront.passOp = value;
60
- depthStencil.stencilBack.passOp = value;
61
- },
62
- stencilFailOperation: (parameter, value, descriptor) => {
63
- const depthStencil = addDepthStencil(descriptor);
64
- depthStencil.stencilFront.failOp = value;
65
- depthStencil.stencilBack.failOp = value;
66
- },
67
- stencilDepthFailOperation: (parameter, value, descriptor) => {
68
- const depthStencil = addDepthStencil(descriptor);
69
- depthStencil.stencilFront.depthFailOp = value;
70
- depthStencil.stencilBack.depthFailOp = value;
71
- },
72
- sampleCount: (parameter, value, descriptor) => {
73
- descriptor.multisample = descriptor.multisample || {};
74
- descriptor.multisample.count = value;
75
- },
76
- sampleMask: (parameter, value, descriptor) => {
77
- descriptor.multisample = descriptor.multisample || {};
78
- descriptor.multisample.mask = value;
79
- },
80
- sampleAlphaToCoverageEnabled: (parameter, value, descriptor) => {
81
- descriptor.multisample = descriptor.multisample || {};
82
- descriptor.multisample.alphaToCoverageEnabled = value;
83
- },
84
- colorMask: (parameter, value, descriptor) => {
85
- const targets = addColorState(descriptor);
86
- targets[0].writeMask = value;
87
- },
88
- blendColorOperation: (parameter, value, descriptor) => {
89
- addColorState(descriptor);
90
- }
19
+ // RASTERIZATION PARAMETERS
20
+ cullMode: (parameter, value, descriptor) => {
21
+ descriptor.primitive = descriptor.primitive || {};
22
+ descriptor.primitive.cullMode = value;
23
+ },
24
+ frontFace: (parameter, value, descriptor) => {
25
+ descriptor.primitive = descriptor.primitive || {};
26
+ descriptor.primitive.frontFace = value;
27
+ },
28
+ // DEPTH
29
+ depthWriteEnabled: (parameter, value, descriptor) => {
30
+ const depthStencil = addDepthStencil(descriptor);
31
+ depthStencil.depthWriteEnabled = value;
32
+ },
33
+ depthCompare: (parameter, value, descriptor) => {
34
+ const depthStencil = addDepthStencil(descriptor);
35
+ depthStencil.depthCompare = value;
36
+ },
37
+ depthFormat: (parameter, value, descriptor) => {
38
+ const depthStencil = addDepthStencil(descriptor);
39
+ depthStencil.format = value;
40
+ },
41
+ depthBias: (parameter, value, descriptor) => {
42
+ const depthStencil = addDepthStencil(descriptor);
43
+ depthStencil.depthBias = value;
44
+ },
45
+ depthBiasSlopeScale: (parameter, value, descriptor) => {
46
+ const depthStencil = addDepthStencil(descriptor);
47
+ depthStencil.depthBiasSlopeScale = value;
48
+ },
49
+ depthBiasClamp: (parameter, value, descriptor) => {
50
+ const depthStencil = addDepthStencil(descriptor);
51
+ depthStencil.depthBiasClamp = value;
52
+ },
53
+ // STENCIL
54
+ stencilReadMask: (parameter, value, descriptor) => {
55
+ const depthStencil = addDepthStencil(descriptor);
56
+ depthStencil.stencilReadMask = value;
57
+ },
58
+ stencilWriteMask: (parameter, value, descriptor) => {
59
+ const depthStencil = addDepthStencil(descriptor);
60
+ depthStencil.stencilWriteMask = value;
61
+ },
62
+ stencilCompare: (parameter, value, descriptor) => {
63
+ const depthStencil = addDepthStencil(descriptor);
64
+ depthStencil.stencilFront.compare = value;
65
+ depthStencil.stencilBack.compare = value;
66
+ },
67
+ stencilPassOperation: (parameter, value, descriptor) => {
68
+ const depthStencil = addDepthStencil(descriptor);
69
+ depthStencil.stencilFront.passOp = value;
70
+ depthStencil.stencilBack.passOp = value;
71
+ },
72
+ stencilFailOperation: (parameter, value, descriptor) => {
73
+ const depthStencil = addDepthStencil(descriptor);
74
+ depthStencil.stencilFront.failOp = value;
75
+ depthStencil.stencilBack.failOp = value;
76
+ },
77
+ stencilDepthFailOperation: (parameter, value, descriptor) => {
78
+ const depthStencil = addDepthStencil(descriptor);
79
+ depthStencil.stencilFront.depthFailOp = value;
80
+ depthStencil.stencilBack.depthFailOp = value;
81
+ },
82
+ // MULTISAMPLE
83
+ sampleCount: (parameter, value, descriptor) => {
84
+ descriptor.multisample = descriptor.multisample || {};
85
+ descriptor.multisample.count = value;
86
+ },
87
+ sampleMask: (parameter, value, descriptor) => {
88
+ descriptor.multisample = descriptor.multisample || {};
89
+ descriptor.multisample.mask = value;
90
+ },
91
+ sampleAlphaToCoverageEnabled: (parameter, value, descriptor) => {
92
+ descriptor.multisample = descriptor.multisample || {};
93
+ descriptor.multisample.alphaToCoverageEnabled = value;
94
+ },
95
+ // COLOR
96
+ colorMask: (parameter, value, descriptor) => {
97
+ const targets = addColorState(descriptor);
98
+ targets[0].writeMask = value;
99
+ },
100
+ blendColorOperation: (parameter, value, descriptor) => {
101
+ addColorState(descriptor);
102
+ // const targets = addColorState(descriptor);
103
+ // const target = targets[0];
104
+ // const blend: GPUBlendState = target.blend || {color: {alpha: 0}};
105
+ // blend.color = blend.color || {};
106
+ // target.blend.color.operation = value;
107
+ }
108
+ /*
109
+ blendColorSrcTarget: (parameter, value, descriptor: GPURenderPipelineDescriptor) => {
110
+ addColorState(descriptor);
111
+ targets[0].blend = targets[0].blend || {};
112
+ targets[0].blend.color = targets[0].blend.color || {};
113
+ targets[0].blend.color.srcTarget = value;
114
+ },
115
+
116
+ blendColorDstTarget: (parameter, value, descriptor: GPURenderPipelineDescriptor) => {
117
+ addColorState(descriptor);
118
+ targets[0].blend = targets[0].blend || {};
119
+ targets[0].blend.color = targets[0].blend.color || {};
120
+ targets[0].blend.color.dstTarget = value;
121
+ },
122
+
123
+ blendAlphaOperation: (parameter, value, descriptor: GPURenderPipelineDescriptor) => {
124
+ addColorState(descriptor);
125
+ targets[0].blend = targets[0].blend || {};
126
+ targets[0].blend.alpha = targets[0].blend.alpha || {};
127
+ targets[0].blend.alpha.operation = value;
128
+ },
129
+
130
+ blendAlphaSrcTarget: (parameter, value, descriptor: GPURenderPipelineDescriptor) => {
131
+ addColorState(descriptor);
132
+ targets[0].blend = targets[0].blend || {};
133
+ targets[0].blend.alpha = targets[0].blend.alpha || {};
134
+ targets[0].blend.alpha.srcTarget = value;
135
+ },
136
+
137
+ blendAlphaDstTarget: (parameter, value, descriptor: GPURenderPipelineDescriptor) => {
138
+ addColorState(descriptor);
139
+ targets[0].blend = targets[0].blend || {};
140
+ targets[0].blend.alpha = targets[0].blend.alpha || {};
141
+ targets[0].blend.alpha.dstTarget = value;
142
+ },
143
+ */
91
144
  };
92
145
  const DEFAULT_PIPELINE_DESCRIPTOR = {
93
- primitive: {
94
- cullMode: 'back',
95
- topology: 'triangle-list'
96
- },
97
- vertex: {
98
- module: undefined,
99
- entryPoint: 'main'
100
- },
101
- fragment: {
102
- module: undefined,
103
- entryPoint: 'main',
104
- targets: []
105
- },
106
- layout: 'auto'
146
+ // depthStencil: {
147
+ // stencilFront: {},
148
+ // stencilBack: {},
149
+ // // depthWriteEnabled: true,
150
+ // // depthCompare: 'less',
151
+ // // format: 'depth24plus-stencil8',
152
+ // },
153
+ primitive: {
154
+ cullMode: 'back',
155
+ topology: 'triangle-list'
156
+ },
157
+ vertex: {
158
+ module: undefined,
159
+ entryPoint: 'main'
160
+ },
161
+ fragment: {
162
+ module: undefined,
163
+ entryPoint: 'main',
164
+ targets: [
165
+ // { format: props.color0Format || 'bgra8unorm' }
166
+ ]
167
+ },
168
+ layout: 'auto'
107
169
  };
108
- export function applyParametersToRenderPipelineDescriptor(pipelineDescriptor) {
109
- let parameters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
110
- Object.assign(pipelineDescriptor, {
111
- ...DEFAULT_PIPELINE_DESCRIPTOR,
112
- ...pipelineDescriptor
113
- });
114
- setParameters(pipelineDescriptor, parameters);
170
+ export function applyParametersToRenderPipelineDescriptor(pipelineDescriptor, parameters = {}) {
171
+ // Apply defaults
172
+ Object.assign(pipelineDescriptor, { ...DEFAULT_PIPELINE_DESCRIPTOR, ...pipelineDescriptor });
173
+ setParameters(pipelineDescriptor, parameters);
115
174
  }
175
+ // Apply any supplied parameters
116
176
  function setParameters(pipelineDescriptor, parameters) {
117
- for (const [key, value] of Object.entries(parameters)) {
118
- const setterFunction = PARAMETER_TABLE[key];
119
- if (!setterFunction) {
120
- throw new Error(`Illegal parameter ${key}`);
177
+ for (const [key, value] of Object.entries(parameters)) {
178
+ const setterFunction = PARAMETER_TABLE[key];
179
+ if (!setterFunction) {
180
+ throw new Error(`Illegal parameter ${key}`);
181
+ }
182
+ setterFunction(key, value, pipelineDescriptor);
121
183
  }
122
- setterFunction(key, value, pipelineDescriptor);
123
- }
124
184
  }
125
185
  function addColorState(descriptor) {
126
- var _descriptor$fragment, _descriptor$fragment2, _descriptor$fragment3, _descriptor$fragment4;
127
- descriptor.fragment.targets = ((_descriptor$fragment = descriptor.fragment) === null || _descriptor$fragment === void 0 ? void 0 : _descriptor$fragment.targets) || [];
128
- if (!Array.isArray((_descriptor$fragment2 = descriptor.fragment) === null || _descriptor$fragment2 === void 0 ? void 0 : _descriptor$fragment2.targets)) {
129
- throw new Error('colorstate');
130
- }
131
- if (((_descriptor$fragment3 = descriptor.fragment) === null || _descriptor$fragment3 === void 0 || (_descriptor$fragment3 = _descriptor$fragment3.targets) === null || _descriptor$fragment3 === void 0 ? void 0 : _descriptor$fragment3.length) === 0) {
132
- var _descriptor$fragment$;
133
- (_descriptor$fragment$ = descriptor.fragment.targets) === null || _descriptor$fragment$ === void 0 ? void 0 : _descriptor$fragment$.push({});
134
- }
135
- return (_descriptor$fragment4 = descriptor.fragment) === null || _descriptor$fragment4 === void 0 ? void 0 : _descriptor$fragment4.targets;
186
+ descriptor.fragment.targets = descriptor.fragment?.targets || [];
187
+ if (!Array.isArray(descriptor.fragment?.targets)) {
188
+ throw new Error('colorstate');
189
+ }
190
+ if (descriptor.fragment?.targets?.length === 0) {
191
+ descriptor.fragment.targets?.push({});
192
+ }
193
+ return descriptor.fragment?.targets;
136
194
  }
137
- //# sourceMappingURL=webgpu-parameters.js.map
@@ -1,70 +1,118 @@
1
+ // WEBGPU Buffer implementation
1
2
  import { Buffer } from '@luma.gl/core';
2
3
  function getByteLength(props) {
3
- var _props$data;
4
- return props.byteLength || ((_props$data = props.data) === null || _props$data === void 0 ? void 0 : _props$data.byteLength) || 0;
4
+ return props.byteLength || props.data?.byteLength || 0;
5
5
  }
6
6
  export class WebGPUBuffer extends Buffer {
7
- constructor(device, props) {
8
- super(device, props);
9
- this.device = void 0;
10
- this.handle = void 0;
11
- this.byteLength = void 0;
12
- this.device = device;
13
- this.byteLength = getByteLength(props);
14
- const mapBuffer = Boolean(props.data);
15
- const size = Math.ceil(this.byteLength / 4) * 4;
16
- this.handle = this.props.handle || this.device.handle.createBuffer({
17
- size,
18
- usage: this.props.usage || GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
19
- mappedAtCreation: this.props.mappedAtCreation || mapBuffer,
20
- label: this.props.id
21
- });
22
- if (props.data) {
23
- this._writeMapped(props.data);
7
+ device;
8
+ handle;
9
+ byteLength;
10
+ constructor(device, props) {
11
+ super(device, props);
12
+ this.device = device;
13
+ this.byteLength = getByteLength(props);
14
+ const mapBuffer = Boolean(props.data);
15
+ // WebGPU buffers must be aligned to 4 bytes
16
+ const size = Math.ceil(this.byteLength / 4) * 4;
17
+ this.handle = this.props.handle || this.device.handle.createBuffer({
18
+ size,
19
+ // usage defaults to vertex
20
+ usage: this.props.usage || (GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST),
21
+ mappedAtCreation: this.props.mappedAtCreation || mapBuffer,
22
+ label: this.props.id
23
+ });
24
+ if (props.data) {
25
+ this._writeMapped(props.data);
26
+ // this.handle.writeAsync({data: props.data, map: false, unmap: false});
27
+ }
28
+ if (mapBuffer && !props.mappedAtCreation) {
29
+ this.handle.unmap();
30
+ }
24
31
  }
25
- if (mapBuffer && !props.mappedAtCreation) {
26
- this.handle.unmap();
32
+ destroy() {
33
+ this.handle.destroy();
27
34
  }
35
+ // WebGPU provides multiple ways to write a buffer...
36
+ write(data, byteOffset = 0) {
37
+ this.device.handle.queue.writeBuffer(this.handle, byteOffset, data.buffer, data.byteOffset, data.byteLength);
38
+ }
39
+ async readAsync(byteOffset = 0, byteLength = this.byteLength) {
40
+ // We need MAP_READ flag, but only COPY_DST buffers can have MAP_READ flag, so we need to create a temp buffer
41
+ const tempBuffer = new WebGPUBuffer(this.device, { usage: Buffer.MAP_READ | Buffer.COPY_DST, byteLength });
42
+ // Now do a GPU-side copy into the temp buffer we can actually read.
43
+ // TODO - we are spinning up an independent command queue here, what does this mean
44
+ const commandEncoder = this.device.handle.createCommandEncoder();
45
+ commandEncoder.copyBufferToBuffer(this.handle, byteOffset, tempBuffer.handle, 0, byteLength);
46
+ this.device.handle.queue.submit([commandEncoder.finish()]);
47
+ // Map the temp buffer and read the data.
48
+ await tempBuffer.handle.mapAsync(GPUMapMode.READ, byteOffset, byteLength);
49
+ const arrayBuffer = tempBuffer.handle.getMappedRange().slice(0);
50
+ tempBuffer.handle.unmap();
51
+ tempBuffer.destroy();
52
+ return new Uint8Array(arrayBuffer);
53
+ }
54
+ _writeMapped(typedArray) {
55
+ const arrayBuffer = this.handle.getMappedRange();
56
+ // @ts-expect-error
57
+ new typedArray.constructor(arrayBuffer).set(typedArray);
58
+ }
59
+ // WEBGPU API
60
+ mapAsync(mode, offset = 0, size) {
61
+ return this.handle.mapAsync(mode, offset, size);
62
+ }
63
+ getMappedRange(offset = 0, size) {
64
+ return this.handle.getMappedRange(offset, size);
65
+ }
66
+ unmap() {
67
+ this.handle.unmap();
68
+ }
69
+ }
70
+ /*
71
+ // Convenience API
72
+ /** Read data from the buffer *
73
+ async readAsync(options: {
74
+ byteOffset?: number,
75
+ byteLength?: number,
76
+ map?: boolean,
77
+ unmap?: boolean
78
+ }): Promise<ArrayBuffer> {
79
+ if (options.map ?? true) {
80
+ await this.mapAsync(Buffer.MAP_READ, options.byteOffset, options.byteLength);
81
+ }
82
+ const arrayBuffer = this.getMappedRange(options.byteOffset, options.byteLength);
83
+ if (options.unmap ?? true) {
84
+ this.unmap();
85
+ }
86
+ return arrayBuffer;
28
87
  }
29
- destroy() {
30
- this.handle.destroy();
31
- }
32
- write(data) {
33
- let byteOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
34
- this.device.handle.queue.writeBuffer(this.handle, byteOffset, data.buffer, data.byteOffset, data.byteLength);
35
- }
36
- async readAsync() {
37
- let byteOffset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
38
- let byteLength = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.byteLength;
39
- const tempBuffer = new WebGPUBuffer(this.device, {
40
- usage: Buffer.MAP_READ | Buffer.COPY_DST,
41
- byteLength
42
- });
43
- const commandEncoder = this.device.handle.createCommandEncoder();
44
- commandEncoder.copyBufferToBuffer(this.handle, byteOffset, tempBuffer.handle, 0, byteLength);
45
- this.device.handle.queue.submit([commandEncoder.finish()]);
46
- await tempBuffer.handle.mapAsync(GPUMapMode.READ, byteOffset, byteLength);
47
- const arrayBuffer = tempBuffer.handle.getMappedRange().slice(0);
48
- tempBuffer.handle.unmap();
49
- tempBuffer.destroy();
50
- return new Uint8Array(arrayBuffer);
51
- }
52
- _writeMapped(typedArray) {
53
- const arrayBuffer = this.handle.getMappedRange();
54
- new typedArray.constructor(arrayBuffer).set(typedArray);
55
- }
56
- mapAsync(mode) {
57
- let offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
58
- let size = arguments.length > 2 ? arguments[2] : undefined;
59
- return this.handle.mapAsync(mode, offset, size);
60
- }
61
- getMappedRange() {
62
- let offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
63
- let size = arguments.length > 1 ? arguments[1] : undefined;
64
- return this.handle.getMappedRange(offset, size);
65
- }
66
- unmap() {
67
- this.handle.unmap();
88
+
89
+ /** Write data to the buffer *
90
+ async writeAsync(options: {
91
+ data: ArrayBuffer,
92
+ byteOffset?: number,
93
+ byteLength?: number,
94
+ map?: boolean,
95
+ unmap?: boolean
96
+ }): Promise<void> {
97
+ if (options.map ?? true) {
98
+ await this.mapAsync(Buffer.MAP_WRITE, options.byteOffset, options.byteLength);
99
+ }
100
+ const arrayBuffer = this.getMappedRange(options.byteOffset, options.byteLength);
101
+ const destArray = new Uint8Array(arrayBuffer);
102
+ const srcArray = new Uint8Array(options.data);
103
+ destArray.set(srcArray);
104
+ if (options.unmap ?? true) {
105
+ this.unmap();
106
+ }
68
107
  }
69
- }
70
- //# sourceMappingURL=webgpu-buffer.js.map
108
+ */
109
+ // Mapped API (WebGPU)
110
+ /** Maps the memory so that it can be read *
111
+ // abstract mapAsync(mode, byteOffset, byteLength): Promise<void>
112
+
113
+ /** Get the mapped range of data for reading or writing *
114
+ // abstract getMappedRange(byteOffset, byteLength): ArrayBuffer;
115
+
116
+ /** unmap makes the contents of the buffer available to the GPU again *
117
+ // abstract unmap(): void;
118
+ */
@@ -1,52 +1,76 @@
1
1
  import { CommandEncoder } from '@luma.gl/core';
2
2
  export class WebGPUCommandEncoder extends CommandEncoder {
3
- constructor(device, props) {
4
- super(device, props);
5
- this.device = void 0;
6
- this.handle = void 0;
7
- this.device = device;
8
- this.handle = props.handle || this.device.handle.createCommandEncoder({});
9
- this.handle.label = this.props.id;
10
- }
11
- destroy() {}
12
- finish(options) {
13
- return this.finish(options);
14
- }
15
- copyBufferToBuffer(options) {
16
- var _options$sourceOffset, _options$destinationO, _options$size;
17
- const webgpuSourceBuffer = options.source;
18
- const WebGPUDestinationBuffer = options.destination;
19
- this.handle.copyBufferToBuffer(webgpuSourceBuffer.handle, (_options$sourceOffset = options.sourceOffset) !== null && _options$sourceOffset !== void 0 ? _options$sourceOffset : 0, WebGPUDestinationBuffer.handle, (_options$destinationO = options.destinationOffset) !== null && _options$destinationO !== void 0 ? _options$destinationO : 0, (_options$size = options.size) !== null && _options$size !== void 0 ? _options$size : 0);
20
- }
21
- copyBufferToTexture(options) {
22
- var _options$offset, _options$mipLevel, _options$origin;
23
- const webgpuSourceBuffer = options.source;
24
- const WebGPUDestinationTexture = options.destination;
25
- this.handle.copyBufferToTexture({
26
- buffer: webgpuSourceBuffer.handle,
27
- offset: (_options$offset = options.offset) !== null && _options$offset !== void 0 ? _options$offset : 0,
28
- bytesPerRow: options.bytesPerRow,
29
- rowsPerImage: options.rowsPerImage
30
- }, {
31
- texture: WebGPUDestinationTexture.handle,
32
- mipLevel: (_options$mipLevel = options.mipLevel) !== null && _options$mipLevel !== void 0 ? _options$mipLevel : 0,
33
- origin: (_options$origin = options.origin) !== null && _options$origin !== void 0 ? _options$origin : {}
34
- }, {
35
- width: options.extent[0],
36
- height: options.extent[1],
37
- depthOrArrayLayers: options.extent[2]
38
- });
39
- }
40
- copyTextureToBuffer(options) {}
41
- copyTextureToTexture(options) {}
42
- pushDebugGroup(groupLabel) {
43
- this.handle.pushDebugGroup(groupLabel);
44
- }
45
- popDebugGroup() {
46
- this.handle.popDebugGroup();
47
- }
48
- insertDebugMarker(markerLabel) {
49
- this.handle.insertDebugMarker(markerLabel);
50
- }
3
+ device;
4
+ handle;
5
+ constructor(device, props) {
6
+ super(device, props);
7
+ this.device = device;
8
+ this.handle =
9
+ props.handle ||
10
+ this.device.handle.createCommandEncoder({
11
+ // TODO was this removed in standard?
12
+ // measureExecutionTime: this.props.measureExecutionTime
13
+ });
14
+ this.handle.label = this.props.id;
15
+ }
16
+ destroy() { }
17
+ finish(options) {
18
+ return this.finish(options);
19
+ }
20
+ // beginRenderPass(GPURenderPassDescriptor descriptor): GPURenderPassEncoder;
21
+ // beginComputePass(optional GPUComputePassDescriptor descriptor = {}): GPUComputePassEncoder;
22
+ copyBufferToBuffer(options) {
23
+ const webgpuSourceBuffer = options.source;
24
+ const WebGPUDestinationBuffer = options.destination;
25
+ this.handle.copyBufferToBuffer(webgpuSourceBuffer.handle, options.sourceOffset ?? 0, WebGPUDestinationBuffer.handle, options.destinationOffset ?? 0, options.size ?? 0);
26
+ }
27
+ copyBufferToTexture(options) {
28
+ const webgpuSourceBuffer = options.source;
29
+ const WebGPUDestinationTexture = options.destination;
30
+ this.handle.copyBufferToTexture({
31
+ buffer: webgpuSourceBuffer.handle,
32
+ offset: options.offset ?? 0,
33
+ bytesPerRow: options.bytesPerRow,
34
+ rowsPerImage: options.rowsPerImage
35
+ }, {
36
+ texture: WebGPUDestinationTexture.handle,
37
+ mipLevel: options.mipLevel ?? 0,
38
+ origin: options.origin ?? {}
39
+ // aspect: options.aspect
40
+ }, {
41
+ // TODO exclamation mark hack
42
+ width: options.extent[0],
43
+ height: options.extent[1],
44
+ depthOrArrayLayers: options.extent[2]
45
+ });
46
+ }
47
+ copyTextureToBuffer(options) {
48
+ // this.handle.copyTextureToBuffer(
49
+ // // source
50
+ // {},
51
+ // // destination
52
+ // {},
53
+ // // copySize
54
+ // {}
55
+ // );
56
+ }
57
+ copyTextureToTexture(options) {
58
+ // this.handle.copyTextureToTexture(
59
+ // // source
60
+ // {},
61
+ // // destination
62
+ // {},
63
+ // // copySize
64
+ // {}
65
+ // );
66
+ }
67
+ pushDebugGroup(groupLabel) {
68
+ this.handle.pushDebugGroup(groupLabel);
69
+ }
70
+ popDebugGroup() {
71
+ this.handle.popDebugGroup();
72
+ }
73
+ insertDebugMarker(markerLabel) {
74
+ this.handle.insertDebugMarker(markerLabel);
75
+ }
51
76
  }
52
- //# sourceMappingURL=webgpu-command-encoder.js.map