@luma.gl/webgpu 9.2.6 → 9.3.0-alpha.4
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/get-bind-group.d.ts.map +1 -1
- package/dist/adapter/helpers/get-bind-group.js +11 -5
- package/dist/adapter/helpers/get-bind-group.js.map +1 -1
- package/dist/adapter/resources/webgpu-buffer.d.ts +7 -0
- package/dist/adapter/resources/webgpu-buffer.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-buffer.js +39 -12
- package/dist/adapter/resources/webgpu-buffer.js.map +1 -1
- package/dist/adapter/resources/webgpu-fence.d.ts +13 -0
- package/dist/adapter/resources/webgpu-fence.d.ts.map +1 -0
- package/dist/adapter/resources/webgpu-fence.js +25 -0
- package/dist/adapter/resources/webgpu-fence.js.map +1 -0
- package/dist/adapter/resources/webgpu-pipeline-layout.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-pipeline-layout.js +1 -2
- package/dist/adapter/resources/webgpu-pipeline-layout.js.map +1 -1
- package/dist/adapter/resources/webgpu-texture.d.ts +12 -3
- package/dist/adapter/resources/webgpu-texture.d.ts.map +1 -1
- package/dist/adapter/resources/webgpu-texture.js +143 -26
- package/dist/adapter/resources/webgpu-texture.js.map +1 -1
- package/dist/adapter/webgpu-adapter.d.ts.map +1 -1
- package/dist/adapter/webgpu-adapter.js +34 -34
- package/dist/adapter/webgpu-adapter.js.map +1 -1
- package/dist/adapter/webgpu-canvas-context.d.ts +4 -3
- package/dist/adapter/webgpu-canvas-context.d.ts.map +1 -1
- package/dist/adapter/webgpu-canvas-context.js +22 -21
- package/dist/adapter/webgpu-canvas-context.js.map +1 -1
- package/dist/adapter/webgpu-device.d.ts +3 -1
- package/dist/adapter/webgpu-device.d.ts.map +1 -1
- package/dist/adapter/webgpu-device.js +14 -3
- package/dist/adapter/webgpu-device.js.map +1 -1
- package/dist/dist.dev.js +6485 -293
- package/dist/dist.min.js +10 -6
- package/dist/index.cjs +398 -114
- 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 -0
- package/dist/index.js.map +1 -1
- package/dist/wgsl/get-shader-layout-wgsl.d.ts +8 -0
- package/dist/wgsl/get-shader-layout-wgsl.d.ts.map +1 -0
- package/dist/wgsl/get-shader-layout-wgsl.js +136 -0
- package/dist/wgsl/get-shader-layout-wgsl.js.map +1 -0
- package/package.json +6 -5
- package/src/adapter/helpers/get-bind-group.ts +18 -5
- package/src/adapter/resources/webgpu-buffer.ts +43 -12
- package/src/adapter/resources/webgpu-fence.ts +30 -0
- package/src/adapter/resources/webgpu-pipeline-layout.ts +1 -2
- package/src/adapter/resources/webgpu-texture.ts +202 -88
- package/src/adapter/webgpu-adapter.ts +40 -42
- package/src/adapter/webgpu-canvas-context.ts +25 -23
- package/src/adapter/webgpu-device.ts +19 -4
- package/src/index.ts +3 -0
- package/src/wgsl/get-shader-layout-wgsl.ts +156 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-bind-group.d.ts","sourceRoot":"","sources":["../../../src/adapter/helpers/get-bind-group.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,mBAAmB,EAAE,kBAAkB,EAAE,OAAO,EAAC,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"get-bind-group.d.ts","sourceRoot":"","sources":["../../../src/adapter/helpers/get-bind-group.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,mBAAmB,EAAE,kBAAkB,EAAE,OAAO,EAAC,MAAM,eAAe,CAAC;AAOpF;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,kBAAkB,EAC1B,QAAQ,EAAE,OAAO,EAAE,GAClB,kBAAkB,CAMpB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,EACjB,eAAe,EAAE,kBAAkB,EACnC,YAAY,EAAE,mBAAmB,EACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,YAAY,CAad;AAED,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,mBAAmB,EACjC,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAC,GACnC,kBAAkB,GAAG,IAAI,CAU3B"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// luma.gl
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
|
-
import { Buffer, Sampler, Texture, log } from '@luma.gl/core';
|
|
4
|
+
import { Buffer, Sampler, Texture, TextureView, log } from '@luma.gl/core';
|
|
5
5
|
/**
|
|
6
6
|
* Create a WebGPU "bind group layout" from an array of luma.gl bindings
|
|
7
7
|
* @note bind groups can be automatically generated by WebGPU.
|
|
@@ -47,7 +47,7 @@ function getBindGroupEntries(bindings, shaderLayout) {
|
|
|
47
47
|
for (const [bindingName, value] of Object.entries(bindings)) {
|
|
48
48
|
let bindingLayout = getShaderLayoutBinding(shaderLayout, bindingName);
|
|
49
49
|
if (bindingLayout) {
|
|
50
|
-
const entry = getBindGroupEntry(value, bindingLayout.location);
|
|
50
|
+
const entry = getBindGroupEntry(value, bindingLayout.location, undefined, bindingName);
|
|
51
51
|
if (entry) {
|
|
52
52
|
entries.push(entry);
|
|
53
53
|
}
|
|
@@ -58,7 +58,7 @@ function getBindGroupEntries(bindings, shaderLayout) {
|
|
|
58
58
|
ignoreWarnings: true
|
|
59
59
|
});
|
|
60
60
|
if (bindingLayout) {
|
|
61
|
-
const entry = getBindGroupEntry(value, bindingLayout.location, { sampler: true });
|
|
61
|
+
const entry = getBindGroupEntry(value, bindingLayout.location, { sampler: true }, bindingName);
|
|
62
62
|
if (entry) {
|
|
63
63
|
entries.push(entry);
|
|
64
64
|
}
|
|
@@ -67,7 +67,7 @@ function getBindGroupEntries(bindings, shaderLayout) {
|
|
|
67
67
|
}
|
|
68
68
|
return entries;
|
|
69
69
|
}
|
|
70
|
-
function getBindGroupEntry(binding, index, options) {
|
|
70
|
+
function getBindGroupEntry(binding, index, options, bindingName = 'unknown') {
|
|
71
71
|
if (binding instanceof Buffer) {
|
|
72
72
|
return {
|
|
73
73
|
binding: index,
|
|
@@ -82,6 +82,12 @@ function getBindGroupEntry(binding, index, options) {
|
|
|
82
82
|
resource: binding.handle
|
|
83
83
|
};
|
|
84
84
|
}
|
|
85
|
+
if (binding instanceof TextureView) {
|
|
86
|
+
return {
|
|
87
|
+
binding: index,
|
|
88
|
+
resource: binding.handle
|
|
89
|
+
};
|
|
90
|
+
}
|
|
85
91
|
if (binding instanceof Texture) {
|
|
86
92
|
if (options?.sampler) {
|
|
87
93
|
return {
|
|
@@ -94,7 +100,7 @@ function getBindGroupEntry(binding, index, options) {
|
|
|
94
100
|
resource: binding.view.handle
|
|
95
101
|
};
|
|
96
102
|
}
|
|
97
|
-
log.warn(`invalid binding ${
|
|
103
|
+
log.warn(`invalid binding ${bindingName}`, binding);
|
|
98
104
|
return null;
|
|
99
105
|
}
|
|
100
106
|
//# sourceMappingURL=get-bind-group.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-bind-group.js","sourceRoot":"","sources":["../../../src/adapter/helpers/get-bind-group.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAGpC,OAAO,EAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAC,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"get-bind-group.js","sourceRoot":"","sources":["../../../src/adapter/helpers/get-bind-group.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import { Buffer, type BufferProps, type BufferMapCallback } from '@luma.gl/core';
|
|
2
2
|
import { type WebGPUDevice } from "../webgpu-device.js";
|
|
3
|
+
/**
|
|
4
|
+
* WebGPU implementation of Buffer
|
|
5
|
+
* For byte alignment requirements see:
|
|
6
|
+
* @see https://www.w3.org/TR/webgpu/#dom-gpubuffer-mapasync
|
|
7
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/API/GPUBuffer/mapAsync
|
|
8
|
+
*/
|
|
3
9
|
export declare class WebGPUBuffer extends Buffer {
|
|
4
10
|
readonly device: WebGPUDevice;
|
|
5
11
|
readonly handle: GPUBuffer;
|
|
6
12
|
readonly byteLength: number;
|
|
13
|
+
readonly paddedByteLength: number;
|
|
7
14
|
constructor(device: WebGPUDevice, props: BufferProps);
|
|
8
15
|
destroy(): void;
|
|
9
16
|
write(data: ArrayBufferLike | ArrayBufferView | SharedArrayBuffer, byteOffset?: number): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgpu-buffer.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgpu-buffer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAM,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,iBAAiB,EAAC,MAAM,eAAe,CAAC;AACpF,OAAO,EAAC,KAAK,YAAY,EAAC,4BAAyB;AAEnD,qBAAa,YAAa,SAAQ,MAAM;IACtC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"webgpu-buffer.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgpu-buffer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAM,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,iBAAiB,EAAC,MAAM,eAAe,CAAC;AACpF,OAAO,EAAC,KAAK,YAAY,EAAC,4BAAyB;AAEnD;;;;;GAKG;AACH,qBAAa,YAAa,SAAQ,MAAM;IACtC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;gBAEtB,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW;IAoD3C,OAAO,IAAI,IAAI;IAMxB,KAAK,CAAC,IAAI,EAAE,eAAe,GAAG,eAAe,GAAG,iBAAiB,EAAE,UAAU,SAAI;IAoB3E,gBAAgB,CACpB,QAAQ,EAAE,iBAAiB,CAAC,IAAI,CAAC,EACjC,UAAU,GAAE,MAAU,EACtB,UAAU,GAAE,MAAqC,GAChD,OAAO,CAAC,IAAI,CAAC;IAkCV,SAAS,CACb,UAAU,GAAE,MAAU,EACtB,UAAU,SAA+B,GACxC,OAAO,CAAC,UAAU,CAAC;IAQhB,eAAe,CAAC,CAAC,EACrB,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAC9B,UAAU,SAAI,EACd,UAAU,SAA+B,GACxC,OAAO,CAAC,CAAC,CAAC;IA0Db,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC;IAMhF;;;OAGG;IACH,SAAS,CAAC,kBAAkB,CAC1B,KAAK,EAAE,MAAM,EAAE,sCAAsC;IACrD,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,YAAY;IAOf,SAAS,CAAC,WAAW,CACnB,YAAY,EAAE,YAAY,EAC1B,UAAU,GAAE,MAAU,EACtB,UAAU,GAAE,MAAwB;CAmBvC"}
|
|
@@ -2,17 +2,25 @@
|
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
import { log, Buffer } from '@luma.gl/core';
|
|
5
|
+
/**
|
|
6
|
+
* WebGPU implementation of Buffer
|
|
7
|
+
* For byte alignment requirements see:
|
|
8
|
+
* @see https://www.w3.org/TR/webgpu/#dom-gpubuffer-mapasync
|
|
9
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/API/GPUBuffer/mapAsync
|
|
10
|
+
*/
|
|
5
11
|
export class WebGPUBuffer extends Buffer {
|
|
6
12
|
device;
|
|
7
13
|
handle;
|
|
8
14
|
byteLength;
|
|
15
|
+
paddedByteLength;
|
|
9
16
|
constructor(device, props) {
|
|
10
17
|
super(device, props);
|
|
11
18
|
this.device = device;
|
|
12
19
|
this.byteLength = props.byteLength || props.data?.byteLength || 0;
|
|
20
|
+
this.paddedByteLength = Math.ceil(this.byteLength / 4) * 4;
|
|
13
21
|
const mappedAtCreation = Boolean(this.props.onMapped || props.data);
|
|
14
22
|
// WebGPU buffers must be aligned to 4 bytes
|
|
15
|
-
const size =
|
|
23
|
+
const size = this.paddedByteLength;
|
|
16
24
|
this.device.pushErrorScope('out-of-memory');
|
|
17
25
|
this.device.pushErrorScope('validation');
|
|
18
26
|
this.handle =
|
|
@@ -71,10 +79,11 @@ export class WebGPUBuffer extends Buffer {
|
|
|
71
79
|
});
|
|
72
80
|
}
|
|
73
81
|
async mapAndWriteAsync(callback, byteOffset = 0, byteLength = this.byteLength - byteOffset) {
|
|
82
|
+
const alignedByteLength = Math.ceil(byteLength / 4) * 4;
|
|
74
83
|
// Unless the application created and supplied a mappable buffer, a staging buffer is needed
|
|
75
84
|
const isMappable = (this.usage & Buffer.MAP_WRITE) !== 0;
|
|
76
85
|
const mappableBuffer = !isMappable
|
|
77
|
-
? this._getMappableBuffer(Buffer.MAP_WRITE | Buffer.COPY_SRC, 0, this.
|
|
86
|
+
? this._getMappableBuffer(Buffer.MAP_WRITE | Buffer.COPY_SRC, 0, this.paddedByteLength)
|
|
78
87
|
: null;
|
|
79
88
|
const writeBuffer = mappableBuffer || this;
|
|
80
89
|
// const isWritable = this.usage & Buffer.MAP_WRITE;
|
|
@@ -82,13 +91,15 @@ export class WebGPUBuffer extends Buffer {
|
|
|
82
91
|
this.device.pushErrorScope('validation');
|
|
83
92
|
try {
|
|
84
93
|
await this.device.handle.queue.onSubmittedWorkDone();
|
|
85
|
-
await writeBuffer.handle.mapAsync(GPUMapMode.WRITE, byteOffset,
|
|
86
|
-
const
|
|
94
|
+
await writeBuffer.handle.mapAsync(GPUMapMode.WRITE, byteOffset, alignedByteLength);
|
|
95
|
+
const mappedRange = writeBuffer.handle.getMappedRange(byteOffset, alignedByteLength);
|
|
96
|
+
const arrayBuffer = mappedRange.slice(0, byteLength);
|
|
87
97
|
// eslint-disable-next-line @typescript-eslint/await-thenable
|
|
88
98
|
await callback(arrayBuffer, 'mapped');
|
|
99
|
+
new Uint8Array(mappedRange).set(new Uint8Array(arrayBuffer), 0);
|
|
89
100
|
writeBuffer.handle.unmap();
|
|
90
101
|
if (mappableBuffer) {
|
|
91
|
-
this._copyBuffer(mappableBuffer, byteOffset,
|
|
102
|
+
this._copyBuffer(mappableBuffer, byteOffset, alignedByteLength);
|
|
92
103
|
}
|
|
93
104
|
}
|
|
94
105
|
finally {
|
|
@@ -103,16 +114,29 @@ export class WebGPUBuffer extends Buffer {
|
|
|
103
114
|
return this.mapAndReadAsync(arrayBuffer => new Uint8Array(arrayBuffer.slice(0)), byteOffset, byteLength);
|
|
104
115
|
}
|
|
105
116
|
async mapAndReadAsync(callback, byteOffset = 0, byteLength = this.byteLength - byteOffset) {
|
|
117
|
+
const requestedEnd = byteOffset + byteLength;
|
|
118
|
+
if (requestedEnd > this.byteLength) {
|
|
119
|
+
throw new Error('Mapping range exceeds buffer size');
|
|
120
|
+
}
|
|
121
|
+
let mappedByteOffset = byteOffset;
|
|
122
|
+
let mappedByteLength = byteLength;
|
|
123
|
+
let sliceByteOffset = 0;
|
|
124
|
+
let lifetime = 'mapped';
|
|
125
|
+
// WebGPU mapAsync requires 8-byte offsets and 4-byte lengths.
|
|
106
126
|
if (byteOffset % 8 !== 0 || byteLength % 4 !== 0) {
|
|
107
|
-
|
|
127
|
+
mappedByteOffset = Math.floor(byteOffset / 8) * 8;
|
|
128
|
+
const alignedEnd = Math.ceil(requestedEnd / 4) * 4;
|
|
129
|
+
mappedByteLength = alignedEnd - mappedByteOffset;
|
|
130
|
+
sliceByteOffset = byteOffset - mappedByteOffset;
|
|
131
|
+
lifetime = 'copied';
|
|
108
132
|
}
|
|
109
|
-
if (
|
|
133
|
+
if (mappedByteOffset + mappedByteLength > this.paddedByteLength) {
|
|
110
134
|
throw new Error('Mapping range exceeds buffer size');
|
|
111
135
|
}
|
|
112
136
|
// Unless the application created and supplied a mappable buffer, a staging buffer is needed
|
|
113
137
|
const isMappable = (this.usage & Buffer.MAP_READ) !== 0;
|
|
114
138
|
const mappableBuffer = !isMappable
|
|
115
|
-
? this._getMappableBuffer(Buffer.MAP_READ | Buffer.COPY_DST, 0, this.
|
|
139
|
+
? this._getMappableBuffer(Buffer.MAP_READ | Buffer.COPY_DST, 0, this.paddedByteLength)
|
|
116
140
|
: null;
|
|
117
141
|
const readBuffer = mappableBuffer || this;
|
|
118
142
|
// Map the temp buffer and read the data.
|
|
@@ -120,12 +144,15 @@ export class WebGPUBuffer extends Buffer {
|
|
|
120
144
|
try {
|
|
121
145
|
await this.device.handle.queue.onSubmittedWorkDone();
|
|
122
146
|
if (mappableBuffer) {
|
|
123
|
-
mappableBuffer._copyBuffer(this);
|
|
147
|
+
mappableBuffer._copyBuffer(this, mappedByteOffset, mappedByteLength);
|
|
124
148
|
}
|
|
125
|
-
await readBuffer.handle.mapAsync(GPUMapMode.READ,
|
|
126
|
-
const arrayBuffer = readBuffer.handle.getMappedRange(
|
|
149
|
+
await readBuffer.handle.mapAsync(GPUMapMode.READ, mappedByteOffset, mappedByteLength);
|
|
150
|
+
const arrayBuffer = readBuffer.handle.getMappedRange(mappedByteOffset, mappedByteLength);
|
|
151
|
+
const mappedRange = lifetime === 'mapped'
|
|
152
|
+
? arrayBuffer
|
|
153
|
+
: arrayBuffer.slice(sliceByteOffset, sliceByteOffset + byteLength);
|
|
127
154
|
// eslint-disable-next-line @typescript-eslint/await-thenable
|
|
128
|
-
const result = await callback(
|
|
155
|
+
const result = await callback(mappedRange, lifetime);
|
|
129
156
|
readBuffer.handle.unmap();
|
|
130
157
|
return result;
|
|
131
158
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgpu-buffer.js","sourceRoot":"","sources":["../../../src/adapter/resources/webgpu-buffer.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAEpC,OAAO,EAAC,GAAG,EAAE,MAAM,EAA2C,MAAM,eAAe,CAAC;AAGpF,MAAM,OAAO,YAAa,SAAQ,MAAM;IAC7B,MAAM,CAAe;IACrB,MAAM,CAAY;IAClB,UAAU,CAAS;
|
|
1
|
+
{"version":3,"file":"webgpu-buffer.js","sourceRoot":"","sources":["../../../src/adapter/resources/webgpu-buffer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Fence, type FenceProps } from '@luma.gl/core';
|
|
2
|
+
import { WebGPUDevice } from "../webgpu-device.js";
|
|
3
|
+
/** WebGPU fence implemented by waiting for submitted work */
|
|
4
|
+
export declare class WebGPUFence extends Fence {
|
|
5
|
+
readonly device: WebGPUDevice;
|
|
6
|
+
readonly handle: null;
|
|
7
|
+
readonly signaled: Promise<void>;
|
|
8
|
+
private _signaled;
|
|
9
|
+
constructor(device: WebGPUDevice, props?: FenceProps);
|
|
10
|
+
isSignaled(): boolean;
|
|
11
|
+
destroy(): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=webgpu-fence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgpu-fence.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgpu-fence.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,KAAK,EAAE,KAAK,UAAU,EAAC,MAAM,eAAe,CAAC;AACrD,OAAO,EAAC,YAAY,EAAC,4BAAyB;AAE9C,6DAA6D;AAC7D,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAQ;IAC7B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,YAAY,EAAE,KAAK,GAAE,UAAe;IAQxD,UAAU,IAAI,OAAO;IAIZ,OAAO,IAAI,IAAI;CAGzB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// luma.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
import { Fence } from '@luma.gl/core';
|
|
5
|
+
/** WebGPU fence implemented by waiting for submitted work */
|
|
6
|
+
export class WebGPUFence extends Fence {
|
|
7
|
+
device;
|
|
8
|
+
handle = null;
|
|
9
|
+
signaled;
|
|
10
|
+
_signaled = false;
|
|
11
|
+
constructor(device, props = {}) {
|
|
12
|
+
super(device, {});
|
|
13
|
+
this.device = device;
|
|
14
|
+
this.signaled = device.handle.queue.onSubmittedWorkDone().then(() => {
|
|
15
|
+
this._signaled = true;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
isSignaled() {
|
|
19
|
+
return this._signaled;
|
|
20
|
+
}
|
|
21
|
+
destroy() {
|
|
22
|
+
// Nothing to release for WebGPU fence
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=webgpu-fence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgpu-fence.js","sourceRoot":"","sources":["../../../src/adapter/resources/webgpu-fence.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAEpC,OAAO,EAAC,KAAK,EAAkB,MAAM,eAAe,CAAC;AAGrD,6DAA6D;AAC7D,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,MAAM,CAAe;IACrB,MAAM,GAAS,IAAI,CAAC;IACpB,QAAQ,CAAgB;IACzB,SAAS,GAAG,KAAK,CAAC;IAE1B,YAAY,MAAoB,EAAE,QAAoB,EAAE;QACtD,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YAClE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAEQ,OAAO;QACd,sCAAsC;IACxC,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgpu-pipeline-layout.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgpu-pipeline-layout.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,cAAc,EACd,mBAAmB,EAGpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAC,YAAY,EAAC,4BAAyB;AAE9C,qBAAa,oBAAqB,SAAQ,cAAc;IACtD,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;gBAEvB,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,mBAAmB;IAqBnD,OAAO,IAAI,IAAI;IAMxB,SAAS,CAAC,iCAAiC,IAAI,uBAAuB,EAAE;
|
|
1
|
+
{"version":3,"file":"webgpu-pipeline-layout.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgpu-pipeline-layout.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,cAAc,EACd,mBAAmB,EAGpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAC,YAAY,EAAC,4BAAyB;AAE9C,qBAAa,oBAAqB,SAAQ,cAAc;IACtD,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;gBAEvB,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,mBAAmB;IAqBnD,OAAO,IAAI,IAAI;IAMxB,SAAS,CAAC,iCAAiC,IAAI,uBAAuB,EAAE;CA+EzE"}
|
|
@@ -31,8 +31,7 @@ export class WebGPUPipelineLayout extends PipelineLayout {
|
|
|
31
31
|
// Set up the pipeline layout
|
|
32
32
|
// TODO (kaapp): This only supports the first group, but so does the rest of the code
|
|
33
33
|
const bindGroupEntries = [];
|
|
34
|
-
for (
|
|
35
|
-
const binding = this.props.shaderLayout.bindings[i];
|
|
34
|
+
for (const binding of this.props.shaderLayout.bindings) {
|
|
36
35
|
const bindingTypeInfo = {};
|
|
37
36
|
switch (binding.type) {
|
|
38
37
|
case 'uniform': {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgpu-pipeline-layout.js","sourceRoot":"","sources":["../../../src/adapter/resources/webgpu-pipeline-layout.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAEpC,OAAO,EACL,GAAG,EACH,cAAc,EAIf,MAAM,eAAe,CAAC;AAGvB,MAAM,OAAO,oBAAqB,SAAQ,cAAc;IAC7C,MAAM,CAAe;IACrB,MAAM,CAAoB;IAEnC,YAAY,MAAoB,EAAE,KAA0B;QAC1D,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAErB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,MAAM,gBAAgB,GAAG,IAAI,CAAC,iCAAiC,EAAE,CAAC;QAElE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC;YACpD,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,yBAAyB;YAC7C,gBAAgB,EAAE;gBAChB,yDAAyD;gBACzD,8DAA8D;gBAC9D,mCAAmC;gBACnC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC;oBACvC,KAAK,EAAE,mBAAmB;oBAC1B,OAAO,EAAE,gBAAgB;iBAC1B,CAAC;aACH;SACF,CAAC,CAAC;IACL,CAAC;IAEQ,OAAO;QACd,8CAA8C;QAC9C,mBAAmB;QACnB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAES,iCAAiC;QACzC,6BAA6B;QAC7B,qFAAqF;QACrF,MAAM,gBAAgB,GAA8B,EAAE,CAAC;QAEvD,KAAK,
|
|
1
|
+
{"version":3,"file":"webgpu-pipeline-layout.js","sourceRoot":"","sources":["../../../src/adapter/resources/webgpu-pipeline-layout.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAEpC,OAAO,EACL,GAAG,EACH,cAAc,EAIf,MAAM,eAAe,CAAC;AAGvB,MAAM,OAAO,oBAAqB,SAAQ,cAAc;IAC7C,MAAM,CAAe;IACrB,MAAM,CAAoB;IAEnC,YAAY,MAAoB,EAAE,KAA0B;QAC1D,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAErB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,MAAM,gBAAgB,GAAG,IAAI,CAAC,iCAAiC,EAAE,CAAC;QAElE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC;YACpD,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,yBAAyB;YAC7C,gBAAgB,EAAE;gBAChB,yDAAyD;gBACzD,8DAA8D;gBAC9D,mCAAmC;gBACnC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC;oBACvC,KAAK,EAAE,mBAAmB;oBAC1B,OAAO,EAAE,gBAAgB;iBAC1B,CAAC;aACH;SACF,CAAC,CAAC;IACL,CAAC;IAEQ,OAAO;QACd,8CAA8C;QAC9C,mBAAmB;QACnB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAES,iCAAiC;QACzC,6BAA6B;QAC7B,qFAAqF;QACrF,MAAM,gBAAgB,GAA8B,EAAE,CAAC;QAEvD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YACvD,MAAM,eAAe,GAA4D,EAAE,CAAC;YAEpF,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;gBACrB,KAAK,SAAS,CAAC,CAAC,CAAC;oBACf,eAAe,CAAC,MAAM,GAAG;wBACvB,IAAI,EAAE,SAAS;wBACf,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;wBAC1C,cAAc,EAAE,OAAO,CAAC,cAAc;qBACvC,CAAC;oBACF,MAAM;gBACR,CAAC;gBAED,KAAK,mBAAmB,CAAC,CAAC,CAAC;oBACzB,eAAe,CAAC,MAAM,GAAG;wBACvB,IAAI,EAAE,mBAAmB;wBACzB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;wBAC1C,cAAc,EAAE,OAAO,CAAC,cAAc;qBACvC,CAAC;oBACF,MAAM;gBACR,CAAC;gBAED,KAAK,SAAS,CAAC,CAAC,CAAC;oBACf,eAAe,CAAC,OAAO,GAAG;wBACxB,IAAI,EAAE,OAAO,CAAC,WAAW;qBAC1B,CAAC;oBACF,MAAM;gBACR,CAAC;gBAED,KAAK,SAAS,CAAC,CAAC,CAAC;oBACf,IAAI,6BAA6B,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC3C,eAAe,CAAC,cAAc,GAAG;4BAC/B,oEAAoE;4BACpE,iEAAiE;4BACjE,MAAM,EAAE,OAAO,CAAC,MAA0B;4BAC1C,MAAM,EAAE,OAAO,CAAC,MAAM;4BACtB,aAAa,EAAE,OAAO,CAAC,aAAa;yBACrC,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,eAAe,CAAC,MAAM,GAAG;4BACvB,IAAI,EAAE,SAAS;4BACf,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;4BAC1C,cAAc,EAAE,OAAO,CAAC,cAAc;yBACvC,CAAC;oBACJ,CAAC;oBACD,MAAM;gBACR,CAAC;gBAED,KAAK,SAAS,CAAC,CAAC,CAAC;oBACf,eAAe,CAAC,OAAO,GAAG;wBACxB,YAAY,EAAE,OAAO,CAAC,YAAY;wBAClC,UAAU,EAAE,OAAO,CAAC,UAAU;wBAC9B,aAAa,EAAE,OAAO,CAAC,aAAa;qBACrC,CAAC;oBACF,MAAM;gBACR,CAAC;gBAED,OAAO,CAAC,CAAC,CAAC;oBACR,GAAG,CAAC,IAAI,CAAC,0DAA0D,CAAC,EAAE,CAAC;gBACzE,CAAC;YACH,CAAC;YAED,MAAM,cAAc,GAClB,cAAc,CAAC,MAAM,GAAG,cAAc,CAAC,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC;YAE3E,gBAAgB,CAAC,IAAI,CAAC;gBACpB,OAAO,EAAE,OAAO,CAAC,QAAQ;gBACzB,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,cAAc;gBAChD,GAAG,eAAe;aACnB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,gBAAgB,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,6BAA6B,GAAG,CACpC,KAA+D,EACzB,EAAE;IACxC,OAAQ,KAAqC,CAAC,MAAM,KAAK,SAAS,CAAC;AACrE,CAAC,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type
|
|
2
|
-
import { Texture } from '@luma.gl/core';
|
|
1
|
+
import { type TextureProps, type TextureViewProps, type CopyExternalImageOptions, type CopyImageDataOptions, type TextureReadOptions, type TextureWriteOptions, Buffer, Texture } from '@luma.gl/core';
|
|
3
2
|
import type { WebGPUDevice } from "../webgpu-device.js";
|
|
4
3
|
import { WebGPUSampler } from "./webgpu-sampler.js";
|
|
5
4
|
import { WebGPUTextureView } from "./webgpu-texture-view.js";
|
|
5
|
+
/** WebGPU implementation of the luma.gl core Texture resource */
|
|
6
6
|
export declare class WebGPUTexture extends Texture {
|
|
7
7
|
readonly device: WebGPUDevice;
|
|
8
8
|
readonly handle: GPUTexture;
|
|
@@ -11,11 +11,20 @@ export declare class WebGPUTexture extends Texture {
|
|
|
11
11
|
constructor(device: WebGPUDevice, props: TextureProps);
|
|
12
12
|
destroy(): void;
|
|
13
13
|
createView(props: TextureViewProps): WebGPUTextureView;
|
|
14
|
-
copyImageData(options_: CopyImageDataOptions): void;
|
|
15
14
|
copyExternalImage(options_: CopyExternalImageOptions): {
|
|
16
15
|
width: number;
|
|
17
16
|
height: number;
|
|
18
17
|
};
|
|
18
|
+
copyImageData(options_: CopyImageDataOptions): void;
|
|
19
19
|
generateMipmapsWebGL(): void;
|
|
20
|
+
getImageDataLayout(options: TextureReadOptions): {
|
|
21
|
+
byteLength: number;
|
|
22
|
+
bytesPerRow: number;
|
|
23
|
+
rowsPerImage: number;
|
|
24
|
+
};
|
|
25
|
+
readBuffer(options?: TextureReadOptions, buffer?: Buffer): Buffer;
|
|
26
|
+
readDataAsync(options?: TextureReadOptions): Promise<ArrayBuffer>;
|
|
27
|
+
writeBuffer(buffer: Buffer, options?: TextureWriteOptions): void;
|
|
28
|
+
writeData(data: ArrayBuffer | ArrayBufferView, options?: TextureWriteOptions): void;
|
|
20
29
|
}
|
|
21
30
|
//# sourceMappingURL=webgpu-texture.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgpu-texture.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgpu-texture.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"webgpu-texture.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgpu-texture.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EAExB,MAAM,EACN,OAAO,EAGR,MAAM,eAAe,CAAC;AAGvB,OAAO,KAAK,EAAC,YAAY,EAAC,4BAAyB;AACnD,OAAO,EAAC,aAAa,EAAC,4BAAyB;AAC/C,OAAO,EAAC,iBAAiB,EAAC,iCAA8B;AAExD,iEAAiE;AACjE,qBAAa,aAAc,SAAQ,OAAO;IACxC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,EAAE,iBAAiB,CAAC;gBAEZ,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY;IA2D5C,OAAO,IAAI,IAAI;IAMxB,UAAU,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB;IAItD,iBAAiB,CAAC,QAAQ,EAAE,wBAAwB,GAAG;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC;IAgCtF,aAAa,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAgC1C,oBAAoB,IAAI,IAAI;IAIrC,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,GAAG;QAC/C,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB;IAQQ,UAAU,CAAC,OAAO,GAAE,kBAAuB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;IAmE/D,aAAa,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC;IAO3E,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB;IA8C7D,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,eAAe,EAAE,OAAO,GAAE,mBAAwB,GAAG,IAAI;CA6CjG"}
|
|
@@ -1,18 +1,17 @@
|
|
|
1
|
-
|
|
1
|
+
// luma.gl, MIT license
|
|
2
|
+
import { Buffer, Texture, log, textureFormatDecoder } from '@luma.gl/core';
|
|
2
3
|
import { getWebGPUTextureFormat } from "../helpers/convert-texture-format.js";
|
|
3
4
|
import { WebGPUSampler } from "./webgpu-sampler.js";
|
|
4
5
|
import { WebGPUTextureView } from "./webgpu-texture-view.js";
|
|
6
|
+
/** WebGPU implementation of the luma.gl core Texture resource */
|
|
5
7
|
export class WebGPUTexture extends Texture {
|
|
6
8
|
device;
|
|
7
9
|
handle;
|
|
8
10
|
sampler;
|
|
9
11
|
view;
|
|
10
12
|
constructor(device, props) {
|
|
11
|
-
super(device, props);
|
|
13
|
+
super(device, props, { byteAlignment: 256 }); // WebGPU requires row width to be a multiple of 256 bytes
|
|
12
14
|
this.device = device;
|
|
13
|
-
if (this.dimension === 'cube') {
|
|
14
|
-
this.depth = 6;
|
|
15
|
-
}
|
|
16
15
|
this.device.pushErrorScope('out-of-memory');
|
|
17
16
|
this.device.pushErrorScope('validation');
|
|
18
17
|
this.handle =
|
|
@@ -42,7 +41,9 @@ export class WebGPUTexture extends Texture {
|
|
|
42
41
|
// TODO - Read all properties directly from the supplied handle?
|
|
43
42
|
if (this.props.handle) {
|
|
44
43
|
this.handle.label ||= this.id;
|
|
44
|
+
// @ts-expect-error readonly
|
|
45
45
|
this.width = this.handle.width;
|
|
46
|
+
// @ts-expect-error readonly
|
|
46
47
|
this.height = this.handle.height;
|
|
47
48
|
}
|
|
48
49
|
this.sampler =
|
|
@@ -68,6 +69,35 @@ export class WebGPUTexture extends Texture {
|
|
|
68
69
|
createView(props) {
|
|
69
70
|
return new WebGPUTextureView(this.device, { ...props, texture: this });
|
|
70
71
|
}
|
|
72
|
+
copyExternalImage(options_) {
|
|
73
|
+
const options = this._normalizeCopyExternalImageOptions(options_);
|
|
74
|
+
this.device.pushErrorScope('validation');
|
|
75
|
+
this.device.handle.queue.copyExternalImageToTexture(
|
|
76
|
+
// source: GPUImageCopyExternalImage
|
|
77
|
+
{
|
|
78
|
+
source: options.image,
|
|
79
|
+
origin: [options.sourceX, options.sourceY],
|
|
80
|
+
flipY: false // options.flipY
|
|
81
|
+
},
|
|
82
|
+
// destination: GPUImageCopyTextureTagged
|
|
83
|
+
{
|
|
84
|
+
texture: this.handle,
|
|
85
|
+
origin: [options.x, options.y, options.z],
|
|
86
|
+
mipLevel: options.mipLevel,
|
|
87
|
+
aspect: options.aspect,
|
|
88
|
+
colorSpace: options.colorSpace,
|
|
89
|
+
premultipliedAlpha: options.premultipliedAlpha
|
|
90
|
+
},
|
|
91
|
+
// copySize: GPUExtent3D
|
|
92
|
+
[options.width, options.height, options.depth] // depth is always 1 for 2D textures
|
|
93
|
+
);
|
|
94
|
+
this.device.popErrorScope((error) => {
|
|
95
|
+
this.device.reportError(new Error(`copyExternalImage: ${error.message}`), this)();
|
|
96
|
+
this.device.debug();
|
|
97
|
+
});
|
|
98
|
+
// TODO - should these be clipped to the texture size minus x,y,z?
|
|
99
|
+
return { width: options.width, height: options.height };
|
|
100
|
+
}
|
|
71
101
|
copyImageData(options_) {
|
|
72
102
|
const { width, height, depth } = this;
|
|
73
103
|
const options = this._normalizeCopyImageDataOptions(options_);
|
|
@@ -97,36 +127,123 @@ export class WebGPUTexture extends Texture {
|
|
|
97
127
|
this.device.debug();
|
|
98
128
|
});
|
|
99
129
|
}
|
|
100
|
-
|
|
101
|
-
|
|
130
|
+
generateMipmapsWebGL() {
|
|
131
|
+
log.warn(`${this}: generateMipmaps not supported in WebGPU`)();
|
|
132
|
+
}
|
|
133
|
+
getImageDataLayout(options) {
|
|
134
|
+
return {
|
|
135
|
+
byteLength: 0,
|
|
136
|
+
bytesPerRow: 0,
|
|
137
|
+
rowsPerImage: 0
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
readBuffer(options = {}, buffer) {
|
|
141
|
+
const { x = 0, y = 0, z = 0, width = this.width, height = this.height, depthOrArrayLayers = this.depth, mipLevel = 0, aspect = 'all' } = options;
|
|
142
|
+
const layout = this.computeMemoryLayout(options);
|
|
143
|
+
const { bytesPerRow, rowsPerImage, byteLength } = layout;
|
|
144
|
+
// Create a GPUBuffer to hold the copied pixel data.
|
|
145
|
+
const readBuffer = buffer ||
|
|
146
|
+
this.device.createBuffer({
|
|
147
|
+
byteLength,
|
|
148
|
+
usage: Buffer.COPY_DST | Buffer.MAP_READ
|
|
149
|
+
});
|
|
150
|
+
const gpuReadBuffer = readBuffer.handle;
|
|
151
|
+
// Record commands to copy from the texture to the buffer.
|
|
152
|
+
const gpuDevice = this.device.handle;
|
|
102
153
|
this.device.pushErrorScope('validation');
|
|
103
|
-
|
|
104
|
-
|
|
154
|
+
const commandEncoder = gpuDevice.createCommandEncoder();
|
|
155
|
+
commandEncoder.copyTextureToBuffer(
|
|
156
|
+
// source
|
|
105
157
|
{
|
|
106
|
-
|
|
107
|
-
origin:
|
|
108
|
-
|
|
158
|
+
texture: this.handle,
|
|
159
|
+
origin: { x, y, z },
|
|
160
|
+
// origin: [options.x, options.y, 0], // options.depth],
|
|
161
|
+
mipLevel,
|
|
162
|
+
aspect
|
|
163
|
+
// colorSpace: options.colorSpace,
|
|
164
|
+
// premultipliedAlpha: options.premultipliedAlpha
|
|
109
165
|
},
|
|
110
|
-
// destination
|
|
166
|
+
// destination
|
|
111
167
|
{
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
colorSpace: options.colorSpace,
|
|
117
|
-
premultipliedAlpha: options.premultipliedAlpha
|
|
168
|
+
buffer: gpuReadBuffer,
|
|
169
|
+
offset: 0,
|
|
170
|
+
bytesPerRow,
|
|
171
|
+
rowsPerImage
|
|
118
172
|
},
|
|
119
|
-
//
|
|
120
|
-
|
|
173
|
+
// copy size
|
|
174
|
+
{
|
|
175
|
+
width,
|
|
176
|
+
height,
|
|
177
|
+
depthOrArrayLayers
|
|
178
|
+
});
|
|
179
|
+
// Submit the command.
|
|
180
|
+
const commandBuffer = commandEncoder.finish();
|
|
181
|
+
this.device.handle.queue.submit([commandBuffer]);
|
|
121
182
|
this.device.popErrorScope((error) => {
|
|
122
|
-
this.device.reportError(new Error(
|
|
183
|
+
this.device.reportError(new Error(`${this} readBuffer: ${error.message}`), this)();
|
|
123
184
|
this.device.debug();
|
|
124
185
|
});
|
|
125
|
-
|
|
126
|
-
return { width: options.width, height: options.height };
|
|
186
|
+
return readBuffer;
|
|
127
187
|
}
|
|
128
|
-
|
|
129
|
-
|
|
188
|
+
async readDataAsync(options = {}) {
|
|
189
|
+
const buffer = this.readBuffer(options);
|
|
190
|
+
const data = await buffer.readAsync();
|
|
191
|
+
buffer.destroy();
|
|
192
|
+
return data.buffer;
|
|
193
|
+
}
|
|
194
|
+
writeBuffer(buffer, options = {}) {
|
|
195
|
+
const { x = 0, y = 0, z = 0, width = this.width, height = this.height, depthOrArrayLayers = this.depth, mipLevel = 0, aspect = 'all' } = options;
|
|
196
|
+
const layout = this.computeMemoryLayout(options);
|
|
197
|
+
// Get the data on the CPU.
|
|
198
|
+
// await buffer.mapAndReadAsync();
|
|
199
|
+
const { bytesPerRow, rowsPerImage } = layout;
|
|
200
|
+
const gpuDevice = this.device.handle;
|
|
201
|
+
this.device.pushErrorScope('validation');
|
|
202
|
+
const commandEncoder = gpuDevice.createCommandEncoder();
|
|
203
|
+
commandEncoder.copyBufferToTexture({
|
|
204
|
+
buffer: buffer.handle,
|
|
205
|
+
offset: 0,
|
|
206
|
+
bytesPerRow,
|
|
207
|
+
rowsPerImage
|
|
208
|
+
}, {
|
|
209
|
+
texture: this.handle,
|
|
210
|
+
origin: { x, y, z },
|
|
211
|
+
mipLevel,
|
|
212
|
+
aspect
|
|
213
|
+
}, { width, height, depthOrArrayLayers });
|
|
214
|
+
const commandBuffer = commandEncoder.finish();
|
|
215
|
+
this.device.handle.queue.submit([commandBuffer]);
|
|
216
|
+
this.device.popErrorScope((error) => {
|
|
217
|
+
this.device.reportError(new Error(`${this} writeBuffer: ${error.message}`), this)();
|
|
218
|
+
this.device.debug();
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
writeData(data, options = {}) {
|
|
222
|
+
const device = this.device;
|
|
223
|
+
const { x = 0, y = 0, z = 0, width = this.width, height = this.height, depthOrArrayLayers = this.depth, mipLevel = 0, aspect = 'all' } = options;
|
|
224
|
+
const layout = textureFormatDecoder.computeMemoryLayout({
|
|
225
|
+
format: this.format,
|
|
226
|
+
width: this.width,
|
|
227
|
+
height: this.height,
|
|
228
|
+
depth: this.depth,
|
|
229
|
+
byteAlignment: this.byteAlignment
|
|
230
|
+
});
|
|
231
|
+
const { bytesPerRow, rowsPerImage } = layout;
|
|
232
|
+
this.device.pushErrorScope('validation');
|
|
233
|
+
device.handle.queue.writeTexture({
|
|
234
|
+
texture: this.handle,
|
|
235
|
+
mipLevel,
|
|
236
|
+
aspect,
|
|
237
|
+
origin: { x, y, z }
|
|
238
|
+
}, data, {
|
|
239
|
+
offset: 0,
|
|
240
|
+
bytesPerRow,
|
|
241
|
+
rowsPerImage
|
|
242
|
+
}, { width, height, depthOrArrayLayers });
|
|
243
|
+
this.device.popErrorScope((error) => {
|
|
244
|
+
this.device.reportError(new Error(`${this} writeData: ${error.message}`), this)();
|
|
245
|
+
this.device.debug();
|
|
246
|
+
});
|
|
130
247
|
}
|
|
131
248
|
}
|
|
132
249
|
//# sourceMappingURL=webgpu-texture.js.map
|