@luma.gl/webgpu 9.0.0-alpha.2
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/README.md +1 -0
- package/dist/adapter/helpers/accessor-to-format.d.ts +1 -0
- package/dist/adapter/helpers/accessor-to-format.d.ts.map +1 -0
- package/dist/adapter/helpers/accessor-to-format.js +2 -0
- package/dist/adapter/helpers/accessor-to-format.js.map +1 -0
- package/dist/adapter/helpers/convert-texture-format.d.ts +5 -0
- package/dist/adapter/helpers/convert-texture-format.d.ts.map +1 -0
- package/dist/adapter/helpers/convert-texture-format.js +8 -0
- package/dist/adapter/helpers/convert-texture-format.js.map +1 -0
- package/dist/adapter/helpers/generate-mipmaps.d.ts +10 -0
- package/dist/adapter/helpers/generate-mipmaps.d.ts.map +1 -0
- package/dist/adapter/helpers/generate-mipmaps.js +95 -0
- package/dist/adapter/helpers/generate-mipmaps.js.map +1 -0
- package/dist/adapter/helpers/get-bind-group.d.ts +13 -0
- package/dist/adapter/helpers/get-bind-group.d.ts.map +1 -0
- package/dist/adapter/helpers/get-bind-group.js +60 -0
- package/dist/adapter/helpers/get-bind-group.js.map +1 -0
- package/dist/adapter/helpers/get-vertex-buffer-layout.d.ts +12 -0
- package/dist/adapter/helpers/get-vertex-buffer-layout.d.ts.map +1 -0
- package/dist/adapter/helpers/get-vertex-buffer-layout.js +98 -0
- package/dist/adapter/helpers/get-vertex-buffer-layout.js.map +1 -0
- package/dist/adapter/helpers/webgpu-parameters.d.ts +9 -0
- package/dist/adapter/helpers/webgpu-parameters.d.ts.map +1 -0
- package/dist/adapter/helpers/webgpu-parameters.js +134 -0
- package/dist/adapter/helpers/webgpu-parameters.js.map +1 -0
- package/dist/adapter/resources/webgpu-buffer.d.ts +18 -0
- package/dist/adapter/resources/webgpu-buffer.d.ts.map +1 -0
- package/dist/adapter/resources/webgpu-buffer.js +84 -0
- package/dist/adapter/resources/webgpu-buffer.js.map +1 -0
- package/dist/adapter/resources/webgpu-command-encoder.d.ts +45 -0
- package/dist/adapter/resources/webgpu-command-encoder.d.ts.map +1 -0
- package/dist/adapter/resources/webgpu-command-encoder.js +66 -0
- package/dist/adapter/resources/webgpu-command-encoder.js.map +1 -0
- package/dist/adapter/resources/webgpu-compute-pass.d.ts +32 -0
- package/dist/adapter/resources/webgpu-compute-pass.d.ts.map +1 -0
- package/dist/adapter/resources/webgpu-compute-pass.js +56 -0
- package/dist/adapter/resources/webgpu-compute-pass.js.map +1 -0
- package/dist/adapter/resources/webgpu-compute-pipeline.d.ts +12 -0
- package/dist/adapter/resources/webgpu-compute-pipeline.d.ts.map +1 -0
- package/dist/adapter/resources/webgpu-compute-pipeline.js +27 -0
- package/dist/adapter/resources/webgpu-compute-pipeline.js.map +1 -0
- package/dist/adapter/resources/webgpu-external-texture.d.ts +18 -0
- package/dist/adapter/resources/webgpu-external-texture.d.ts.map +1 -0
- package/dist/adapter/resources/webgpu-external-texture.js +30 -0
- package/dist/adapter/resources/webgpu-external-texture.js.map +1 -0
- package/dist/adapter/resources/webgpu-framebuffer.d.ts +29 -0
- package/dist/adapter/resources/webgpu-framebuffer.d.ts.map +1 -0
- package/dist/adapter/resources/webgpu-framebuffer.js +111 -0
- package/dist/adapter/resources/webgpu-framebuffer.js.map +1 -0
- package/dist/adapter/resources/webgpu-query.d.ts +1 -0
- package/dist/adapter/resources/webgpu-query.d.ts.map +1 -0
- package/dist/adapter/resources/webgpu-query.js +2 -0
- package/dist/adapter/resources/webgpu-query.js.map +1 -0
- package/dist/adapter/resources/webgpu-render-pass.d.ts +34 -0
- package/dist/adapter/resources/webgpu-render-pass.d.ts.map +1 -0
- package/dist/adapter/resources/webgpu-render-pass.js +92 -0
- package/dist/adapter/resources/webgpu-render-pass.js.map +1 -0
- package/dist/adapter/resources/webgpu-render-pipeline.d.ts +41 -0
- package/dist/adapter/resources/webgpu-render-pipeline.d.ts.map +1 -0
- package/dist/adapter/resources/webgpu-render-pipeline.js +148 -0
- package/dist/adapter/resources/webgpu-render-pipeline.js.map +1 -0
- package/dist/adapter/resources/webgpu-sampler.d.ts +16 -0
- package/dist/adapter/resources/webgpu-sampler.d.ts.map +1 -0
- package/dist/adapter/resources/webgpu-sampler.js +19 -0
- package/dist/adapter/resources/webgpu-sampler.js.map +1 -0
- package/dist/adapter/resources/webgpu-shader.d.ts +21 -0
- package/dist/adapter/resources/webgpu-shader.d.ts.map +1 -0
- package/dist/adapter/resources/webgpu-shader.js +64 -0
- package/dist/adapter/resources/webgpu-shader.js.map +1 -0
- package/dist/adapter/resources/webgpu-texture.d.ts +39 -0
- package/dist/adapter/resources/webgpu-texture.d.ts.map +1 -0
- package/dist/adapter/resources/webgpu-texture.js +111 -0
- package/dist/adapter/resources/webgpu-texture.js.map +1 -0
- package/dist/adapter/webgpu-canvas-context.d.ts +32 -0
- package/dist/adapter/webgpu-canvas-context.d.ts.map +1 -0
- package/dist/adapter/webgpu-canvas-context.js +95 -0
- package/dist/adapter/webgpu-canvas-context.js.map +1 -0
- package/dist/adapter/webgpu-device.d.ts +67 -0
- package/dist/adapter/webgpu-device.d.ts.map +1 -0
- package/dist/adapter/webgpu-device.js +225 -0
- package/dist/adapter/webgpu-device.js.map +1 -0
- package/dist/adapter/webgpu-types.d.ts +1 -0
- package/dist/adapter/webgpu-types.d.ts.map +1 -0
- package/dist/adapter/webgpu-types.js +2 -0
- package/dist/adapter/webgpu-types.js.map +1 -0
- package/dist/bundle.d.ts +2 -0
- package/dist/bundle.d.ts.map +1 -0
- package/dist/bundle.js +5 -0
- package/dist/bundle.js.map +1 -0
- package/dist/glsl/glsllang.d.ts +3 -0
- package/dist/glsl/glsllang.d.ts.map +1 -0
- package/dist/glsl/glsllang.js +10 -0
- package/dist/glsl/glsllang.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +2 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +4 -0
- package/dist/init.js.map +1 -0
- package/package.json +36 -0
- package/src/adapter/helpers/accessor-to-format.ts +101 -0
- package/src/adapter/helpers/convert-texture-format.ts +10 -0
- package/src/adapter/helpers/generate-mipmaps.ts +107 -0
- package/src/adapter/helpers/get-bind-group.ts +82 -0
- package/src/adapter/helpers/get-vertex-buffer-layout.ts +123 -0
- package/src/adapter/helpers/webgpu-parameters.ts +226 -0
- package/src/adapter/resources/webgpu-buffer.ts +96 -0
- package/src/adapter/resources/webgpu-command-encoder.ts +111 -0
- package/src/adapter/resources/webgpu-compute-pass.ts +74 -0
- package/src/adapter/resources/webgpu-compute-pipeline.ts +34 -0
- package/src/adapter/resources/webgpu-external-texture.ts +37 -0
- package/src/adapter/resources/webgpu-framebuffer.ts +120 -0
- package/src/adapter/resources/webgpu-query.ts +43 -0
- package/src/adapter/resources/webgpu-render-pass.ts +128 -0
- package/src/adapter/resources/webgpu-render-pipeline.ts +231 -0
- package/src/adapter/resources/webgpu-sampler.ts +25 -0
- package/src/adapter/resources/webgpu-shader.ts +72 -0
- package/src/adapter/resources/webgpu-texture.ts +243 -0
- package/src/adapter/webgpu-canvas-context.ts +102 -0
- package/src/adapter/webgpu-device.ts +282 -0
- package/src/adapter/webgpu-types.ts +0 -0
- package/src/bundle.ts +4 -0
- package/src/glsl/glsllang.ts +14 -0
- package/src/index.ts +13 -0
- package/src/init.ts +4 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/// <reference types="@webgpu/types" />
|
|
2
|
+
import type { RenderPassProps, RenderPassParameters, Binding } from '@luma.gl/api';
|
|
3
|
+
import { Buffer, RenderPass, RenderPipeline } from '@luma.gl/api';
|
|
4
|
+
import WebGPUDevice from '../webgpu-device';
|
|
5
|
+
import WebGPURenderPipeline from './webgpu-render-pipeline';
|
|
6
|
+
export default class WebGPURenderPass extends RenderPass {
|
|
7
|
+
readonly device: WebGPUDevice;
|
|
8
|
+
readonly handle: GPURenderPassEncoder;
|
|
9
|
+
/** Active pipeline */
|
|
10
|
+
pipeline: WebGPURenderPipeline | null;
|
|
11
|
+
constructor(device: WebGPUDevice, props?: RenderPassProps);
|
|
12
|
+
destroy(): void;
|
|
13
|
+
endPass(): void;
|
|
14
|
+
setPipeline(pipeline: RenderPipeline): void;
|
|
15
|
+
/** Sets an array of bindings (uniform buffers, samplers, textures, ...) */
|
|
16
|
+
setBindings(bindings: Record<string, Binding>): void;
|
|
17
|
+
setIndexBuffer(buffer: Buffer, indexFormat: GPUIndexFormat, offset?: number, size?: number): void;
|
|
18
|
+
setVertexBuffer(slot: number, buffer: Buffer, offset?: number): void;
|
|
19
|
+
draw(options: {
|
|
20
|
+
vertexCount?: number;
|
|
21
|
+
indexCount?: number;
|
|
22
|
+
instanceCount?: number;
|
|
23
|
+
firstVertex?: number;
|
|
24
|
+
firstIndex?: number;
|
|
25
|
+
firstInstance?: number;
|
|
26
|
+
baseVertex?: number;
|
|
27
|
+
}): void;
|
|
28
|
+
drawIndirect(): void;
|
|
29
|
+
setParameters(parameters: RenderPassParameters): void;
|
|
30
|
+
pushDebugGroup(groupLabel: string): void;
|
|
31
|
+
popDebugGroup(): void;
|
|
32
|
+
insertDebugMarker(markerLabel: string): void;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=webgpu-render-pass.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgpu-render-pass.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgpu-render-pass.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAC,eAAe,EAAE,oBAAoB,EAAE,OAAO,EAAC,MAAM,cAAc,CAAC;AACjF,OAAO,EAAC,MAAM,EAAE,UAAU,EAAE,cAAc,EAAY,MAAM,cAAc,CAAC;AAC3E,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAG5C,OAAO,oBAAoB,MAAM,0BAA0B,CAAC;AAE5D,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,UAAU;IACtD,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IAEtC,sBAAsB;IACtB,QAAQ,EAAE,oBAAoB,GAAG,IAAI,CAAQ;gBAEjC,MAAM,EAAE,YAAY,EAAE,KAAK,GAAE,eAAoB;IAU7D,OAAO;IAEP,OAAO,IAAI,IAAI;IAIf,WAAW,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAK3C,2EAA2E;IAC3E,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAKpD,cAAc,CACZ,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,cAAc,EAC3B,MAAM,GAAE,MAAU,EAClB,IAAI,CAAC,EAAE,MAAM,GACZ,IAAI;IAIP,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,GAAG,IAAI;IAIvE,IAAI,CAAC,OAAO,EAAE;QACZ,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,IAAI;IAmBR,YAAY,IAAI,IAAI;IAKpB,aAAa,CAAC,UAAU,EAAE,oBAAoB,GAAG,IAAI;IAwBrD,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAGxC,aAAa,IAAI,IAAI;IAGrB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;CAW7C"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
2
|
+
import { RenderPass, cast } from '@luma.gl/api';
|
|
3
|
+
export default class WebGPURenderPass extends RenderPass {
|
|
4
|
+
constructor(device, props = {}) {
|
|
5
|
+
super(device, props);
|
|
6
|
+
|
|
7
|
+
_defineProperty(this, "device", void 0);
|
|
8
|
+
|
|
9
|
+
_defineProperty(this, "handle", void 0);
|
|
10
|
+
|
|
11
|
+
_defineProperty(this, "pipeline", null);
|
|
12
|
+
|
|
13
|
+
this.device = device;
|
|
14
|
+
const framebuffer = props.framebuffer || device.canvasContext.getCurrentFramebuffer();
|
|
15
|
+
const renderPassDescriptor = framebuffer.renderPassDescriptor;
|
|
16
|
+
this.handle = this.props.handle || device.commandEncoder.beginRenderPass(renderPassDescriptor);
|
|
17
|
+
this.handle.label = this.props.id;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
destroy() {}
|
|
21
|
+
|
|
22
|
+
endPass() {
|
|
23
|
+
this.handle.endPass();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
setPipeline(pipeline) {
|
|
27
|
+
this.pipeline = cast(pipeline);
|
|
28
|
+
this.handle.setPipeline(this.pipeline.handle);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
setBindings(bindings) {
|
|
32
|
+
this.pipeline.setBindings(bindings);
|
|
33
|
+
this.handle.setBindGroup(0, this.pipeline._getBindGroup());
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
setIndexBuffer(buffer, indexFormat, offset = 0, size) {
|
|
37
|
+
this.handle.setIndexBuffer(cast(buffer).handle, indexFormat, offset, size);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
setVertexBuffer(slot, buffer, offset = 0) {
|
|
41
|
+
this.handle.setVertexBuffer(slot, cast(buffer).handle, offset);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
draw(options) {
|
|
45
|
+
if (options.indexCount) {
|
|
46
|
+
this.handle.drawIndexed(options.indexCount, options.instanceCount, options.firstIndex, options.baseVertex, options.firstInstance);
|
|
47
|
+
} else {
|
|
48
|
+
this.handle.draw(options.vertexCount, options.instanceCount, options.firstIndex, options.firstInstance);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
drawIndirect() {}
|
|
53
|
+
|
|
54
|
+
setParameters(parameters) {
|
|
55
|
+
const {
|
|
56
|
+
blendConstant,
|
|
57
|
+
stencilReference,
|
|
58
|
+
scissorRect,
|
|
59
|
+
viewport
|
|
60
|
+
} = parameters;
|
|
61
|
+
|
|
62
|
+
if (blendConstant) {
|
|
63
|
+
this.handle.setBlendConstant(blendConstant);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (stencilReference) {
|
|
67
|
+
this.handle.setStencilReference(stencilReference);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (scissorRect) {
|
|
71
|
+
this.handle.setScissorRect(scissorRect[0], scissorRect[1], scissorRect[2], scissorRect[3]);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (viewport) {
|
|
75
|
+
this.handle.setViewport(viewport[0], viewport[1], viewport[2], viewport[3], viewport[4], viewport[5]);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
pushDebugGroup(groupLabel) {
|
|
80
|
+
this.handle.pushDebugGroup(groupLabel);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
popDebugGroup() {
|
|
84
|
+
this.handle.popDebugGroup();
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
insertDebugMarker(markerLabel) {
|
|
88
|
+
this.handle.insertDebugMarker(markerLabel);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=webgpu-render-pass.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/adapter/resources/webgpu-render-pass.ts"],"names":["RenderPass","cast","WebGPURenderPass","constructor","device","props","framebuffer","canvasContext","getCurrentFramebuffer","renderPassDescriptor","handle","commandEncoder","beginRenderPass","label","id","destroy","endPass","setPipeline","pipeline","setBindings","bindings","setBindGroup","_getBindGroup","setIndexBuffer","buffer","indexFormat","offset","size","setVertexBuffer","slot","draw","options","indexCount","drawIndexed","instanceCount","firstIndex","baseVertex","firstInstance","vertexCount","drawIndirect","setParameters","parameters","blendConstant","stencilReference","scissorRect","viewport","setBlendConstant","setStencilReference","setScissorRect","setViewport","pushDebugGroup","groupLabel","popDebugGroup","insertDebugMarker","markerLabel"],"mappings":"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","sourcesContent":["import type {RenderPassProps, RenderPassParameters, Binding} from '@luma.gl/api';\nimport {Buffer, RenderPass, RenderPipeline, cast, log} from '@luma.gl/api';\nimport WebGPUDevice from '../webgpu-device';\nimport WebGPUBuffer from './webgpu-buffer';\n// import WebGPUCommandEncoder from './webgpu-command-encoder';\nimport WebGPURenderPipeline from './webgpu-render-pipeline';\n\nexport default class WebGPURenderPass extends RenderPass {\n readonly device: WebGPUDevice;\n readonly handle: GPURenderPassEncoder;\n\n /** Active pipeline */\n pipeline: WebGPURenderPipeline | null = null;\n\n constructor(device: WebGPUDevice, props: RenderPassProps = {}) {\n super(device, props);\n this.device = device;\n const framebuffer = props.framebuffer || device.canvasContext.getCurrentFramebuffer();\n // @ts-expect-error\n const renderPassDescriptor = framebuffer.renderPassDescriptor;\n this.handle = this.props.handle || device.commandEncoder.beginRenderPass(renderPassDescriptor);\n this.handle.label = this.props.id;\n }\n\n destroy() {}\n\n endPass(): void {\n this.handle.endPass();\n }\n\n setPipeline(pipeline: RenderPipeline): void {\n this.pipeline = cast<WebGPURenderPipeline>(pipeline);\n this.handle.setPipeline(this.pipeline.handle);\n }\n\n /** Sets an array of bindings (uniform buffers, samplers, textures, ...) */\n setBindings(bindings: Record<string, Binding>): void {\n this.pipeline.setBindings(bindings);\n this.handle.setBindGroup(0, this.pipeline._getBindGroup());\n }\n\n setIndexBuffer(\n buffer: Buffer,\n indexFormat: GPUIndexFormat,\n offset: number = 0,\n size?: number\n ): void {\n this.handle.setIndexBuffer(cast<WebGPUBuffer>(buffer).handle, indexFormat, offset, size);\n }\n\n setVertexBuffer(slot: number, buffer: Buffer, offset: number = 0): void {\n this.handle.setVertexBuffer(slot, cast<WebGPUBuffer>(buffer).handle, offset);\n }\n\n draw(options: {\n vertexCount?: number;\n indexCount?: number;\n instanceCount?: number;\n firstVertex?: number;\n firstIndex?: number;\n firstInstance?: number;\n baseVertex?: number;\n }): void {\n if (options.indexCount) {\n this.handle.drawIndexed(\n options.indexCount,\n options.instanceCount,\n options.firstIndex,\n options.baseVertex,\n options.firstInstance\n );\n } else {\n this.handle.draw(\n options.vertexCount,\n options.instanceCount,\n options.firstIndex,\n options.firstInstance\n );\n }\n }\n\n drawIndirect(): void {\n // drawIndirect(indirectBuffer: GPUBuffer, indirectOffset: number): void;\n // drawIndexedIndirect(indirectBuffer: GPUBuffer, indirectOffset: number): void;\n }\n\n setParameters(parameters: RenderPassParameters): void {\n const {blendConstant, stencilReference, scissorRect, viewport} = parameters;\n if (blendConstant) {\n this.handle.setBlendConstant(blendConstant);\n }\n if (stencilReference) {\n this.handle.setStencilReference(stencilReference);\n }\n if (scissorRect) {\n this.handle.setScissorRect(scissorRect[0], scissorRect[1], scissorRect[2], scissorRect[3]);\n }\n // TODO - explain how 3 dimensions vs 2 in WebGL works.\n if (viewport) {\n this.handle.setViewport(\n viewport[0],\n viewport[1],\n viewport[2],\n viewport[3],\n viewport[4],\n viewport[5]\n );\n }\n }\n\n pushDebugGroup(groupLabel: string): void {\n this.handle.pushDebugGroup(groupLabel);\n }\n popDebugGroup(): void {\n this.handle.popDebugGroup();\n }\n insertDebugMarker(markerLabel: string): void {\n this.handle.insertDebugMarker(markerLabel);\n }\n\n // writeTimestamp(querySet: GPUQuerySet, queryIndex: number): void;\n // beginOcclusionQuery(queryIndex: number): void;\n // endOcclusionQuery(): void;\n // beginPipelineStatisticsQuery(querySet: GPUQuerySet, queryIndex: number): void;\n // endPipelineStatisticsQuery(querySet: GPUQuerySet, queryIndex: number): void;\n\n // executeBundles(bundles: Iterable<GPURenderBundle>): void;\n}\n"],"file":"webgpu-render-pass.js"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/// <reference types="@webgpu/types" />
|
|
2
|
+
import type { Binding, RenderPass } from '@luma.gl/api';
|
|
3
|
+
import { Buffer, RenderPipeline, RenderPipelineProps } from '@luma.gl/api';
|
|
4
|
+
import type WebGPUDevice from '../webgpu-device';
|
|
5
|
+
import type WebGPURenderPass from './webgpu-render-pass';
|
|
6
|
+
/** Creates a new render pipeline when parameters change */
|
|
7
|
+
export default class WebGPURenderPipeline extends RenderPipeline {
|
|
8
|
+
device: WebGPUDevice;
|
|
9
|
+
handle: GPURenderPipeline;
|
|
10
|
+
private _bufferSlots;
|
|
11
|
+
private _buffers;
|
|
12
|
+
private _indexBuffer;
|
|
13
|
+
/** For internal use to create BindGroups */
|
|
14
|
+
private _bindGroupLayout;
|
|
15
|
+
private _bindGroup;
|
|
16
|
+
constructor(device: WebGPUDevice, props: RenderPipelineProps);
|
|
17
|
+
protected createHandle(): GPURenderPipeline;
|
|
18
|
+
destroy(): void;
|
|
19
|
+
setIndexBuffer(indexBuffer: Buffer): void;
|
|
20
|
+
setAttributes(attributes: Record<string, Buffer>): void;
|
|
21
|
+
/** Set the bindings */
|
|
22
|
+
setBindings(bindings: Record<string, Binding>): void;
|
|
23
|
+
setUniforms(uniforms: Record<string, any>): void;
|
|
24
|
+
_getBuffers(): Buffer[];
|
|
25
|
+
/** Return a bind group created by setBindings */
|
|
26
|
+
_getBindGroup(): GPUBindGroup;
|
|
27
|
+
/** Populate the complex WebGPU GPURenderPipelineDescriptor */
|
|
28
|
+
protected _getRenderPipelineDescriptor(): GPURenderPipelineDescriptor;
|
|
29
|
+
draw(options: {
|
|
30
|
+
renderPass?: RenderPass;
|
|
31
|
+
vertexCount?: number;
|
|
32
|
+
indexCount?: number;
|
|
33
|
+
instanceCount?: number;
|
|
34
|
+
firstVertex?: number;
|
|
35
|
+
firstIndex?: number;
|
|
36
|
+
firstInstance?: number;
|
|
37
|
+
baseVertex?: number;
|
|
38
|
+
}): void;
|
|
39
|
+
_setAttributeBuffers(webgpuRenderPass: WebGPURenderPass): void;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=webgpu-render-pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgpu-render-pipeline.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgpu-render-pipeline.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAC,OAAO,EAAE,UAAU,EAAC,MAAM,cAAc,CAAC;AACtD,OAAO,EAAC,MAAM,EAAE,cAAc,EAAE,mBAAmB,EAA2B,MAAM,cAAc,CAAC;AASnG,OAAO,KAAK,YAAY,MAAM,kBAAkB,CAAC;AAGjD,OAAO,KAAK,gBAAgB,MAAM,sBAAsB,CAAC;AAIzD,2DAA2D;AAC3D,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,cAAc;IAC9D,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,iBAAiB,CAAC;IAE1B,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,YAAY,CAAe;IAInC,4CAA4C;IAC5C,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,OAAO,CAAC,UAAU,CAAsB;gBAE5B,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,mBAAmB;IAW5D,SAAS,CAAC,YAAY,IAAI,iBAAiB;IAS3C,OAAO;IAIP,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIzC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAmBvD,uBAAuB;IACvB,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAapD,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAMhD,WAAW;IAIX,iDAAiD;IACjD,aAAa;IAKb,8DAA8D;IAC9D,SAAS,CAAC,4BAA4B;IAqCtC,IAAI,CAAC,OAAO,EAAE;QACZ,UAAU,CAAC,EAAE,UAAU,CAAC;QACxB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,IAAI;IAkCR,oBAAoB,CAAC,gBAAgB,EAAE,gBAAgB;CAwCxD"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
2
|
+
import { RenderPipeline, cast, log, isObjectEmpty } from '@luma.gl/api';
|
|
3
|
+
import { applyParametersToRenderPipelineDescriptor } from '../helpers/webgpu-parameters';
|
|
4
|
+
import { getWebGPUTextureFormat } from '../helpers/convert-texture-format';
|
|
5
|
+
import { getBindGroup } from '../helpers/get-bind-group';
|
|
6
|
+
import { getVertexBufferLayout, getBufferSlots } from '../helpers/get-vertex-buffer-layout';
|
|
7
|
+
export default class WebGPURenderPipeline extends RenderPipeline {
|
|
8
|
+
constructor(device, props) {
|
|
9
|
+
super(device, props);
|
|
10
|
+
|
|
11
|
+
_defineProperty(this, "device", void 0);
|
|
12
|
+
|
|
13
|
+
_defineProperty(this, "handle", void 0);
|
|
14
|
+
|
|
15
|
+
_defineProperty(this, "_bufferSlots", void 0);
|
|
16
|
+
|
|
17
|
+
_defineProperty(this, "_buffers", void 0);
|
|
18
|
+
|
|
19
|
+
_defineProperty(this, "_indexBuffer", void 0);
|
|
20
|
+
|
|
21
|
+
_defineProperty(this, "_bindGroupLayout", void 0);
|
|
22
|
+
|
|
23
|
+
_defineProperty(this, "_bindGroup", null);
|
|
24
|
+
|
|
25
|
+
this.device = device;
|
|
26
|
+
this.handle = this.props.handle || this.createHandle();
|
|
27
|
+
this.handle.label = this.props.id;
|
|
28
|
+
this._bufferSlots = getBufferSlots(this.props.layout, this.props.bufferMap);
|
|
29
|
+
this._buffers = new Array(Object.keys(this._bufferSlots).length).fill(null);
|
|
30
|
+
this._bindGroupLayout = this.handle.getBindGroupLayout(0);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
createHandle() {
|
|
34
|
+
const descriptor = this._getRenderPipelineDescriptor();
|
|
35
|
+
|
|
36
|
+
const renderPipeline = this.device.handle.createRenderPipeline(descriptor);
|
|
37
|
+
log.groupCollapsed(1, "new WebGPRenderPipeline(".concat(this.id, ")"))();
|
|
38
|
+
log.log(1, JSON.stringify(descriptor, null, 2))();
|
|
39
|
+
log.groupEnd(1)();
|
|
40
|
+
return renderPipeline;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
destroy() {}
|
|
44
|
+
|
|
45
|
+
setIndexBuffer(indexBuffer) {
|
|
46
|
+
this._indexBuffer = cast(indexBuffer);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
setAttributes(attributes) {
|
|
50
|
+
for (const [name, buffer] of Object.entries(attributes)) {
|
|
51
|
+
const bufferIndex = this._bufferSlots[name];
|
|
52
|
+
|
|
53
|
+
if (bufferIndex >= 0) {
|
|
54
|
+
this._buffers[bufferIndex] = buffer;
|
|
55
|
+
} else {
|
|
56
|
+
throw new Error("Setting attribute '".concat(name, "' not listed in shader layout for program ").concat(this.id));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
setBindings(bindings) {
|
|
62
|
+
if (!isObjectEmpty(this.props.bindings)) {
|
|
63
|
+
Object.assign(this.props.bindings, bindings);
|
|
64
|
+
this._bindGroup = getBindGroup(this.device.handle, this._bindGroupLayout, this.props.layout, this.props.bindings);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
setUniforms(uniforms) {
|
|
69
|
+
if (!isObjectEmpty(uniforms)) {
|
|
70
|
+
throw new Error('WebGPU does not support uniforms');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
_getBuffers() {
|
|
75
|
+
return this._buffers;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
_getBindGroup() {
|
|
79
|
+
return this._bindGroup;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
_getRenderPipelineDescriptor() {
|
|
83
|
+
const vertex = {
|
|
84
|
+
module: cast(this.props.vs).handle,
|
|
85
|
+
entryPoint: this.props.vsEntryPoint || 'main',
|
|
86
|
+
buffers: getVertexBufferLayout(this.props.layout, this.props.bufferMap)
|
|
87
|
+
};
|
|
88
|
+
let fragment;
|
|
89
|
+
|
|
90
|
+
if (this.props.fs) {
|
|
91
|
+
fragment = {
|
|
92
|
+
module: cast(this.props.fs).handle,
|
|
93
|
+
entryPoint: this.props.fsEntryPoint || 'main',
|
|
94
|
+
targets: [{
|
|
95
|
+
format: getWebGPUTextureFormat(this.device.canvasContext.format)
|
|
96
|
+
}]
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
let descriptor = {
|
|
101
|
+
vertex,
|
|
102
|
+
fragment,
|
|
103
|
+
primitive: {
|
|
104
|
+
topology: this.props.topology
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
applyParametersToRenderPipelineDescriptor(descriptor, this.props.parameters);
|
|
108
|
+
return descriptor;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
draw(options) {
|
|
112
|
+
const webgpuRenderPass = cast(options.renderPass) || this.device.getDefaultRenderPass();
|
|
113
|
+
webgpuRenderPass.handle.setPipeline(this.handle);
|
|
114
|
+
|
|
115
|
+
if (this._getBindGroup()) {
|
|
116
|
+
webgpuRenderPass.handle.setBindGroup(0, this._getBindGroup());
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
this._setAttributeBuffers(webgpuRenderPass);
|
|
120
|
+
|
|
121
|
+
if (options.indexCount) {
|
|
122
|
+
webgpuRenderPass.handle.drawIndexed(options.indexCount, options.instanceCount, options.firstIndex, options.baseVertex, options.firstInstance);
|
|
123
|
+
} else {
|
|
124
|
+
webgpuRenderPass.handle.draw(options.vertexCount, options.instanceCount, options.firstIndex, options.firstInstance);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
_setAttributeBuffers(webgpuRenderPass) {
|
|
129
|
+
if (this._indexBuffer) {
|
|
130
|
+
webgpuRenderPass.handle.setIndexBuffer(this._indexBuffer.handle, this._indexBuffer.props.indexType);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const buffers = this._getBuffers();
|
|
134
|
+
|
|
135
|
+
for (let i = 0; i < buffers.length; ++i) {
|
|
136
|
+
const buffer = cast(buffers[i]);
|
|
137
|
+
|
|
138
|
+
if (!buffer) {
|
|
139
|
+
const attribute = this.props.layout.attributes.find(attribute => attribute.location === i);
|
|
140
|
+
throw new Error("No buffer provided for attribute '".concat((attribute === null || attribute === void 0 ? void 0 : attribute.name) || '', "' in Model '").concat(this.props.id, "'"));
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
webgpuRenderPass.handle.setVertexBuffer(i, buffer.handle);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=webgpu-render-pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/adapter/resources/webgpu-render-pipeline.ts"],"names":["RenderPipeline","cast","log","isObjectEmpty","applyParametersToRenderPipelineDescriptor","getWebGPUTextureFormat","getBindGroup","getVertexBufferLayout","getBufferSlots","WebGPURenderPipeline","constructor","device","props","handle","createHandle","label","id","_bufferSlots","layout","bufferMap","_buffers","Array","Object","keys","length","fill","_bindGroupLayout","getBindGroupLayout","descriptor","_getRenderPipelineDescriptor","renderPipeline","createRenderPipeline","groupCollapsed","JSON","stringify","groupEnd","destroy","setIndexBuffer","indexBuffer","_indexBuffer","setAttributes","attributes","name","buffer","entries","bufferIndex","Error","setBindings","bindings","assign","_bindGroup","setUniforms","uniforms","_getBuffers","_getBindGroup","vertex","module","vs","entryPoint","vsEntryPoint","buffers","fragment","fs","fsEntryPoint","targets","format","canvasContext","primitive","topology","parameters","draw","options","webgpuRenderPass","renderPass","getDefaultRenderPass","setPipeline","setBindGroup","_setAttributeBuffers","indexCount","drawIndexed","instanceCount","firstIndex","baseVertex","firstInstance","vertexCount","indexType","i","attribute","find","location","setVertexBuffer"],"mappings":"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","sourcesContent":["import type {Binding, RenderPass} from '@luma.gl/api';\nimport {Buffer, RenderPipeline, RenderPipelineProps, cast, log, isObjectEmpty} from '@luma.gl/api';\nimport {applyParametersToRenderPipelineDescriptor} from '../helpers/webgpu-parameters';\nimport {getWebGPUTextureFormat} from '../helpers/convert-texture-format';\nimport {getBindGroup} from '../helpers/get-bind-group';\nimport {getVertexBufferLayout, getBufferSlots} from '../helpers/get-vertex-buffer-layout';\n// import {convertAttributesVertexBufferToLayout} from '../helpers/get-vertex-buffer-layout';\n// import {mapAccessorToWebGPUFormat} from './helpers/accessor-to-format';\n// import type {BufferAccessors} from './webgpu-pipeline';\n\nimport type WebGPUDevice from '../webgpu-device';\nimport type WebGPUBuffer from './webgpu-buffer';\nimport type WebGPUShader from './webgpu-shader';\nimport type WebGPURenderPass from './webgpu-render-pass';\n\n// RENDER PIPELINE\n\n/** Creates a new render pipeline when parameters change */\nexport default class WebGPURenderPipeline extends RenderPipeline {\n device: WebGPUDevice;\n handle: GPURenderPipeline;\n\n private _bufferSlots: Record<string, number>;\n private _buffers: Buffer[];\n private _indexBuffer: WebGPUBuffer;\n // private _firstIndex: number;\n // private _lastIndex: number;\n\n /** For internal use to create BindGroups */\n private _bindGroupLayout: GPUBindGroupLayout;\n private _bindGroup: GPUBindGroup = null;\n\n constructor(device: WebGPUDevice, props: RenderPipelineProps) {\n super(device, props);\n this.device = device;\n this.handle = (this.props.handle as GPURenderPipeline) || this.createHandle();\n this.handle.label = this.props.id;\n\n this._bufferSlots = getBufferSlots(this.props.layout, this.props.bufferMap);\n this._buffers = new Array<Buffer>(Object.keys(this._bufferSlots).length).fill(null);\n this._bindGroupLayout = this.handle.getBindGroupLayout(0);\n }\n\n protected createHandle(): GPURenderPipeline {\n const descriptor = this._getRenderPipelineDescriptor();\n const renderPipeline = this.device.handle.createRenderPipeline(descriptor);\n log.groupCollapsed(1, `new WebGPRenderPipeline(${this.id})`)();\n log.log(1, JSON.stringify(descriptor, null, 2))();\n log.groupEnd(1)();\n return renderPipeline;\n }\n\n destroy() {\n // WebGPURenderPipeline has no destroy method.\n }\n\n setIndexBuffer(indexBuffer: Buffer): void {\n this._indexBuffer = cast<WebGPUBuffer>(indexBuffer);\n }\n\n setAttributes(attributes: Record<string, Buffer>): void {\n for (const [name, buffer] of Object.entries(attributes)) {\n const bufferIndex = this._bufferSlots[name];\n if (bufferIndex >= 0) {\n this._buffers[bufferIndex] = buffer;\n } else {\n throw new Error(\n `Setting attribute '${name}' not listed in shader layout for program ${this.id}`\n );\n }\n }\n // for (let i = 0; i < this._bufferSlots.length; ++i) {\n // const bufferName = this._bufferSlots[i];\n // if (attributes[bufferName]) {\n // this.handle\n // }\n // }\n }\n\n /** Set the bindings */\n setBindings(bindings: Record<string, Binding>): void {\n if (!isObjectEmpty(this.props.bindings)) {\n Object.assign(this.props.bindings, bindings);\n // Set up the bindings\n this._bindGroup = getBindGroup(\n this.device.handle,\n this._bindGroupLayout,\n this.props.layout,\n this.props.bindings\n );\n }\n }\n\n setUniforms(uniforms: Record<string, any>): void {\n if (!isObjectEmpty(uniforms)) {\n throw new Error('WebGPU does not support uniforms');\n }\n }\n\n _getBuffers() {\n return this._buffers;\n }\n\n /** Return a bind group created by setBindings */\n _getBindGroup() {\n // assert(this._bindGroup);\n return this._bindGroup;\n }\n\n /** Populate the complex WebGPU GPURenderPipelineDescriptor */\n protected _getRenderPipelineDescriptor() {\n // Set up the vertex stage\n const vertex: GPUVertexState = {\n module: cast<WebGPUShader>(this.props.vs).handle,\n entryPoint: this.props.vsEntryPoint || 'main',\n buffers: getVertexBufferLayout(this.props.layout, this.props.bufferMap)\n };\n\n // Set up the fragment stage\n let fragment: GPUFragmentState | undefined;\n if (this.props.fs) {\n fragment = {\n module: cast<WebGPUShader>(this.props.fs).handle,\n entryPoint: this.props.fsEntryPoint || 'main',\n targets: [\n {\n format: getWebGPUTextureFormat(this.device.canvasContext.format)\n }\n ]\n };\n }\n\n // Create a partially populated descriptor\n let descriptor: GPURenderPipelineDescriptor = {\n vertex,\n fragment,\n primitive: {\n topology: this.props.topology\n }\n };\n\n // Set parameters on the descriptor\n applyParametersToRenderPipelineDescriptor(descriptor, this.props.parameters);\n\n return descriptor;\n }\n\n draw(options: {\n renderPass?: RenderPass;\n vertexCount?: number;\n indexCount?: number;\n instanceCount?: number;\n firstVertex?: number;\n firstIndex?: number;\n firstInstance?: number;\n baseVertex?: number;\n }): void {\n const webgpuRenderPass =\n cast<WebGPURenderPass>(options.renderPass) || this.device.getDefaultRenderPass();\n\n // Set pipeline\n webgpuRenderPass.handle.setPipeline(this.handle);\n\n // Set bindings (uniform buffers, textures etc)\n if (this._getBindGroup()) {\n webgpuRenderPass.handle.setBindGroup(0, this._getBindGroup());\n }\n\n // Set attributes\n this._setAttributeBuffers(webgpuRenderPass);\n\n // Draw\n if (options.indexCount) {\n webgpuRenderPass.handle.drawIndexed(\n options.indexCount,\n options.instanceCount,\n options.firstIndex,\n options.baseVertex,\n options.firstInstance\n );\n } else {\n webgpuRenderPass.handle.draw(\n options.vertexCount,\n options.instanceCount,\n options.firstIndex,\n options.firstInstance\n );\n }\n }\n\n _setAttributeBuffers(webgpuRenderPass: WebGPURenderPass) {\n if (this._indexBuffer) {\n webgpuRenderPass.handle.setIndexBuffer(this._indexBuffer.handle, this._indexBuffer.props.indexType);\n }\n\n const buffers = this._getBuffers();\n for (let i = 0; i < buffers.length; ++i) {\n const buffer = cast<WebGPUBuffer>(buffers[i]);\n if (!buffer) {\n const attribute = this.props.layout.attributes.find(\n (attribute) => attribute.location === i\n );\n throw new Error(\n `No buffer provided for attribute '${attribute?.name || ''}' in Model '${this.props.id}'`\n );\n }\n webgpuRenderPass.handle.setVertexBuffer(i, buffer.handle);\n }\n\n // TODO - HANDLE buffer maps\n /*\n for (const [bufferName, attributeMapping] of Object.entries(this.props.bufferMap)) {\n const buffer = cast<WebGPUBuffer>(this.props.attributes[bufferName]);\n if (!buffer) {\n log.warn(`Missing buffer for buffer map ${bufferName}`)();\n continue;\n }\n\n if ('location' in attributeMapping) {\n // @ts-expect-error TODO model must not depend on webgpu\n renderPass.handle.setVertexBuffer(layout.location, buffer.handle);\n } else {\n for (const [bufferName, mapping] of Object.entries(attributeMapping)) {\n // @ts-expect-error TODO model must not depend on webgpu\n renderPass.handle.setVertexBuffer(field.location, buffer.handle);\n }\n }\n }\n */\n }\n}\n"],"file":"webgpu-render-pipeline.js"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/// <reference types="@webgpu/types" />
|
|
2
|
+
import { Sampler, SamplerProps } from '@luma.gl/api';
|
|
3
|
+
import type WebGPUDevice from '../webgpu-device';
|
|
4
|
+
export declare type WebGPUSamplerProps = SamplerProps & {
|
|
5
|
+
handle?: GPUSampler;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
*
|
|
9
|
+
*/
|
|
10
|
+
export default class WebGPUSampler extends Sampler {
|
|
11
|
+
readonly device: WebGPUDevice;
|
|
12
|
+
readonly handle: GPUSampler;
|
|
13
|
+
constructor(device: WebGPUDevice, props: WebGPUSamplerProps);
|
|
14
|
+
destroy(): void;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=webgpu-sampler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgpu-sampler.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgpu-sampler.ts"],"names":[],"mappings":";AAAA,OAAO,EAAC,OAAO,EAAE,YAAY,EAAC,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,YAAY,MAAM,kBAAkB,CAAC;AAEjD,oBAAY,kBAAkB,GAAG,YAAY,GAAG;IAC9C,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,OAAO;IAChD,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;gBAEhB,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,kBAAkB;IAO3D,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
2
|
+
import { Sampler } from '@luma.gl/api';
|
|
3
|
+
export default class WebGPUSampler extends Sampler {
|
|
4
|
+
constructor(device, props) {
|
|
5
|
+
super(device, props);
|
|
6
|
+
|
|
7
|
+
_defineProperty(this, "device", void 0);
|
|
8
|
+
|
|
9
|
+
_defineProperty(this, "handle", void 0);
|
|
10
|
+
|
|
11
|
+
this.device = device;
|
|
12
|
+
this.handle = this.handle || this.device.handle.createSampler(this.props);
|
|
13
|
+
this.handle.label = this.props.id;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
destroy() {}
|
|
17
|
+
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=webgpu-sampler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/adapter/resources/webgpu-sampler.ts"],"names":["Sampler","WebGPUSampler","constructor","device","props","handle","createSampler","label","id","destroy"],"mappings":";AAAA,SAAQA,OAAR,QAAoC,cAApC;AAUA,eAAe,MAAMC,aAAN,SAA4BD,OAA5B,CAAoC;AAIjDE,EAAAA,WAAW,CAACC,MAAD,EAAuBC,KAAvB,EAAkD;AAC3D,UAAMD,MAAN,EAAcC,KAAd;;AAD2D;;AAAA;;AAE3D,SAAKD,MAAL,GAAcA,MAAd;AACA,SAAKE,MAAL,GAAc,KAAKA,MAAL,IAAe,KAAKF,MAAL,CAAYE,MAAZ,CAAmBC,aAAnB,CAAiC,KAAKF,KAAtC,CAA7B;AACA,SAAKC,MAAL,CAAYE,KAAZ,GAAoB,KAAKH,KAAL,CAAWI,EAA/B;AACD;;AAEDC,EAAAA,OAAO,GAAS,CAEf;;AAbgD","sourcesContent":["import {Sampler, SamplerProps} from '@luma.gl/api';\nimport type WebGPUDevice from '../webgpu-device';\n\nexport type WebGPUSamplerProps = SamplerProps & {\n handle?: GPUSampler;\n}\n\n/**\n *\n */\nexport default class WebGPUSampler extends Sampler {\n readonly device: WebGPUDevice;\n readonly handle: GPUSampler;\n\n constructor(device: WebGPUDevice, props: WebGPUSamplerProps) {\n super(device, props);\n this.device = device;\n this.handle = this.handle || this.device.handle.createSampler(this.props);\n this.handle.label = this.props.id;\n }\n\n destroy(): void {\n // this.handle.destroy();\n }\n}\n"],"file":"webgpu-sampler.js"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/// <reference types="@webgpu/types" />
|
|
2
|
+
import type { ShaderProps, CompilerMessage } from '@luma.gl/api';
|
|
3
|
+
import { Shader } from '@luma.gl/api';
|
|
4
|
+
import type WebGPUDevice from '../webgpu-device';
|
|
5
|
+
export declare type WebGPUShaderProps = ShaderProps & {
|
|
6
|
+
handle?: GPUShaderModule;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Immutable shader
|
|
10
|
+
*/
|
|
11
|
+
export default class WebGPUShader extends Shader {
|
|
12
|
+
readonly device: WebGPUDevice;
|
|
13
|
+
readonly handle: GPUShaderModule;
|
|
14
|
+
constructor(device: WebGPUDevice, props: WebGPUShaderProps);
|
|
15
|
+
_checkCompilationError(errorScope: Promise<GPUError>): Promise<void>;
|
|
16
|
+
destroy(): void;
|
|
17
|
+
protected createHandle(): GPUShaderModule;
|
|
18
|
+
/** Returns compilation info for this shader */
|
|
19
|
+
compilationInfo(): Promise<readonly CompilerMessage[]>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=webgpu-shader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgpu-shader.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgpu-shader.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAC,WAAW,EAAE,eAAe,EAAC,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAC,MAAM,EAAM,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,YAAY,MAAM,kBAAkB,CAAC;AAEjD,oBAAY,iBAAiB,GAAG,WAAW,GAAG;IAC5C,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,MAAM;IAC9C,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;gBAErB,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,iBAAiB;IAYpD,sBAAsB,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAW1E,OAAO;IAIP,SAAS,CAAC,YAAY,IAAI,eAAe;IAwBzC,+CAA+C;IACzC,eAAe,IAAI,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC;CAI7D"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
2
|
+
import { Shader, log } from '@luma.gl/api';
|
|
3
|
+
export default class WebGPUShader extends Shader {
|
|
4
|
+
constructor(device, props) {
|
|
5
|
+
super(device, props);
|
|
6
|
+
|
|
7
|
+
_defineProperty(this, "device", void 0);
|
|
8
|
+
|
|
9
|
+
_defineProperty(this, "handle", void 0);
|
|
10
|
+
|
|
11
|
+
this.device = device;
|
|
12
|
+
this.device.handle.pushErrorScope('validation');
|
|
13
|
+
this.handle = this.props.handle || this.createHandle();
|
|
14
|
+
this.handle.label = this.props.id;
|
|
15
|
+
|
|
16
|
+
this._checkCompilationError(this.device.handle.popErrorScope());
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async _checkCompilationError(errorScope) {
|
|
20
|
+
const error = await errorScope;
|
|
21
|
+
|
|
22
|
+
if (error) {
|
|
23
|
+
const shaderLog = await this.compilationInfo();
|
|
24
|
+
log.error("Shader compilation error: ".concat(error.message), shaderLog)();
|
|
25
|
+
throw new Error("Shader compilation error: ".concat(error.message));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
destroy() {}
|
|
30
|
+
|
|
31
|
+
createHandle() {
|
|
32
|
+
const {
|
|
33
|
+
source
|
|
34
|
+
} = this.props;
|
|
35
|
+
let language = this.props.language;
|
|
36
|
+
|
|
37
|
+
if (!language) {
|
|
38
|
+
language = source.includes('->') ? 'wgsl' : 'glsl';
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
switch (language) {
|
|
42
|
+
case 'wgsl':
|
|
43
|
+
return this.device.handle.createShaderModule({
|
|
44
|
+
code: source
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
case 'glsl':
|
|
48
|
+
return this.device.handle.createShaderModule({
|
|
49
|
+
code: source,
|
|
50
|
+
transform: glsl => this.device.glslang.compileGLSL(glsl, type)
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
default:
|
|
54
|
+
throw new Error(language);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async compilationInfo() {
|
|
59
|
+
const compilationInfo = await this.handle.compilationInfo();
|
|
60
|
+
return compilationInfo.messages;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=webgpu-shader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/adapter/resources/webgpu-shader.ts"],"names":["Shader","log","WebGPUShader","constructor","device","props","handle","pushErrorScope","createHandle","label","id","_checkCompilationError","popErrorScope","errorScope","error","shaderLog","compilationInfo","message","Error","destroy","source","language","includes","createShaderModule","code","transform","glsl","glslang","compileGLSL","type","messages"],"mappings":";AACA,SAAQA,MAAR,EAAgBC,GAAhB,QAA0B,cAA1B;AAUA,eAAe,MAAMC,YAAN,SAA2BF,MAA3B,CAAkC;AAI/CG,EAAAA,WAAW,CAACC,MAAD,EAAuBC,KAAvB,EAAiD;AAC1D,UAAMD,MAAN,EAAcC,KAAd;;AAD0D;;AAAA;;AAE1D,SAAKD,MAAL,GAAcA,MAAd;AAEA,SAAKA,MAAL,CAAYE,MAAZ,CAAmBC,cAAnB,CAAkC,YAAlC;AAEA,SAAKD,MAAL,GAAc,KAAKD,KAAL,CAAWC,MAAX,IAAqB,KAAKE,YAAL,EAAnC;AACA,SAAKF,MAAL,CAAYG,KAAZ,GAAoB,KAAKJ,KAAL,CAAWK,EAA/B;;AAEA,SAAKC,sBAAL,CAA4B,KAAKP,MAAL,CAAYE,MAAZ,CAAmBM,aAAnB,EAA5B;AACD;;AAE2B,QAAtBD,sBAAsB,CAACE,UAAD,EAA+C;AACzE,UAAMC,KAAK,GAAG,MAAMD,UAApB;;AACA,QAAIC,KAAJ,EAAW;AACT,YAAMC,SAAS,GAAG,MAAM,KAAKC,eAAL,EAAxB;AACAf,MAAAA,GAAG,CAACa,KAAJ,qCAAuCA,KAAK,CAACG,OAA7C,GAAwDF,SAAxD;AAGA,YAAM,IAAIG,KAAJ,qCAAuCJ,KAAK,CAACG,OAA7C,EAAN;AACD;AACF;;AAEDE,EAAAA,OAAO,GAAG,CAET;;AAESX,EAAAA,YAAY,GAAoB;AACxC,UAAM;AAACY,MAAAA;AAAD,QAAW,KAAKf,KAAtB;AAEA,QAAIgB,QAAQ,GAAG,KAAKhB,KAAL,CAAWgB,QAA1B;;AAEA,QAAI,CAACA,QAAL,EAAe;AAEbA,MAAAA,QAAQ,GAAGD,MAAM,CAACE,QAAP,CAAgB,IAAhB,IAAwB,MAAxB,GAAiC,MAA5C;AACD;;AAED,YAAOD,QAAP;AACE,WAAK,MAAL;AACE,eAAO,KAAKjB,MAAL,CAAYE,MAAZ,CAAmBiB,kBAAnB,CAAsC;AAACC,UAAAA,IAAI,EAAEJ;AAAP,SAAtC,CAAP;;AACF,WAAK,MAAL;AACE,eAAO,KAAKhB,MAAL,CAAYE,MAAZ,CAAmBiB,kBAAnB,CAAsC;AAC3CC,UAAAA,IAAI,EAAEJ,MADqC;AAG3CK,UAAAA,SAAS,EAAGC,IAAD,IAAU,KAAKtB,MAAL,CAAYuB,OAAZ,CAAoBC,WAApB,CAAgCF,IAAhC,EAAsCG,IAAtC;AAHsB,SAAtC,CAAP;;AAKF;AACE,cAAM,IAAIX,KAAJ,CAAUG,QAAV,CAAN;AAVJ;AAYD;;AAGoB,QAAfL,eAAe,GAAwC;AAC3D,UAAMA,eAAe,GAAG,MAAM,KAAKV,MAAL,CAAYU,eAAZ,EAA9B;AACA,WAAOA,eAAe,CAACc,QAAvB;AACD;;AA3D8C","sourcesContent":["import type {ShaderProps, CompilerMessage} from '@luma.gl/api';\nimport {Shader, log} from '@luma.gl/api';\nimport type WebGPUDevice from '../webgpu-device';\n\nexport type WebGPUShaderProps = ShaderProps & {\n handle?: GPUShaderModule;\n};\n\n/**\n * Immutable shader\n */\nexport default class WebGPUShader extends Shader {\n readonly device: WebGPUDevice;\n readonly handle: GPUShaderModule;\n\n constructor(device: WebGPUDevice, props: WebGPUShaderProps) {\n super(device, props);\n this.device = device;\n\n this.device.handle.pushErrorScope('validation');\n\n this.handle = this.props.handle || this.createHandle();\n this.handle.label = this.props.id;\n\n this._checkCompilationError(this.device.handle.popErrorScope());\n }\n\n async _checkCompilationError(errorScope: Promise<GPUError>): Promise<void> {\n const error = await errorScope as GPUValidationError;\n if (error) {\n const shaderLog = await this.compilationInfo();\n log.error(`Shader compilation error: ${error.message}`, shaderLog)();\n // Note: Even though this error is asynchronous and thrown after the constructor completes,\n // it will result in a useful stack trace leading back to the constructor\n throw new Error(`Shader compilation error: ${error.message}`);\n }\n }\n\n destroy() {\n // this.handle.destroy();\n }\n\n protected createHandle(): GPUShaderModule {\n const {source} = this.props;\n\n let language = this.props.language;\n // Compile from src\n if (!language) {\n // wgsl uses C++ \"auto\" style arrow notation\n language = source.includes('->') ? 'wgsl' : 'glsl';\n }\n\n switch(language) {\n case 'wgsl':\n return this.device.handle.createShaderModule({code: source});\n case 'glsl':\n return this.device.handle.createShaderModule({\n code: source,\n // @ts-expect-error\n transform: (glsl) => this.device.glslang.compileGLSL(glsl, type)\n });\n default:\n throw new Error(language);\n }\n }\n\n /** Returns compilation info for this shader */\n async compilationInfo(): Promise<readonly CompilerMessage[]> {\n const compilationInfo = await this.handle.compilationInfo();\n return compilationInfo.messages;\n }\n}\n"],"file":"webgpu-shader.js"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/// <reference types="@webgpu/types" />
|
|
2
|
+
/// <reference types="offscreencanvas" />
|
|
3
|
+
import { Texture, TextureProps, Sampler, SamplerProps } from '@luma.gl/api';
|
|
4
|
+
import type WebGPUDevice from '../webgpu-device';
|
|
5
|
+
import WebGPUSampler from './webgpu-sampler';
|
|
6
|
+
export default class WebGPUTexture extends Texture {
|
|
7
|
+
readonly device: WebGPUDevice;
|
|
8
|
+
readonly handle: GPUTexture;
|
|
9
|
+
readonly view: GPUTextureView;
|
|
10
|
+
sampler: WebGPUSampler;
|
|
11
|
+
constructor(device: WebGPUDevice, props: TextureProps);
|
|
12
|
+
protected createHandle(): GPUTexture;
|
|
13
|
+
destroy(): void;
|
|
14
|
+
/**
|
|
15
|
+
* Set default sampler
|
|
16
|
+
* Accept a sampler instance or set of props;
|
|
17
|
+
*/
|
|
18
|
+
setSampler(sampler: Sampler | SamplerProps): this;
|
|
19
|
+
setData(options: {
|
|
20
|
+
data: any;
|
|
21
|
+
}): this;
|
|
22
|
+
/** Set image */
|
|
23
|
+
setImage(options: {
|
|
24
|
+
source: ImageBitmap | HTMLCanvasElement | OffscreenCanvas;
|
|
25
|
+
width?: number;
|
|
26
|
+
height?: number;
|
|
27
|
+
depth?: number;
|
|
28
|
+
sourceX?: number;
|
|
29
|
+
sourceY?: number;
|
|
30
|
+
mipLevel?: number;
|
|
31
|
+
x?: number;
|
|
32
|
+
y?: number;
|
|
33
|
+
z?: number;
|
|
34
|
+
aspect?: 'all' | 'stencil-only' | 'depth-only';
|
|
35
|
+
colorSpace?: 'srgb';
|
|
36
|
+
premultipliedAlpha?: boolean;
|
|
37
|
+
}): this;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=webgpu-texture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgpu-texture.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgpu-texture.ts"],"names":[],"mappings":";;AACA,OAAO,EAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAS,MAAM,cAAc,CAAC;AAElF,OAAO,KAAK,YAAY,MAAM,kBAAkB,CAAC;AACjD,OAAO,aAAa,MAAM,kBAAkB,CAAC;AAW7C,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,OAAO;IAChD,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,OAAO,EAAE,aAAa,CAAC;gBASX,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY;IA8BrD,SAAS,CAAC,YAAY,IAAI,UAAU;IAyBpC,OAAO,IAAI,IAAI;IAIf;;;OAGG;IACH,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI;IAKjD,OAAO,CAAC,OAAO,EAAE;QACf,IAAI,EAAE,GAAG,CAAC;KACX;IAID,gBAAgB;IAChB,QAAQ,CAAC,OAAO,EAAE;QAChB,MAAM,EAAE,WAAW,GAAG,iBAAiB,GAAG,eAAe,CAAC;QAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,MAAM,CAAC,EAAE,KAAK,GAAG,cAAc,GAAG,YAAY,CAAC;QAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,GAAG,IAAI;CA6HT"}
|