@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.
Files changed (127) hide show
  1. package/README.md +1 -0
  2. package/dist/adapter/helpers/accessor-to-format.d.ts +1 -0
  3. package/dist/adapter/helpers/accessor-to-format.d.ts.map +1 -0
  4. package/dist/adapter/helpers/accessor-to-format.js +2 -0
  5. package/dist/adapter/helpers/accessor-to-format.js.map +1 -0
  6. package/dist/adapter/helpers/convert-texture-format.d.ts +5 -0
  7. package/dist/adapter/helpers/convert-texture-format.d.ts.map +1 -0
  8. package/dist/adapter/helpers/convert-texture-format.js +8 -0
  9. package/dist/adapter/helpers/convert-texture-format.js.map +1 -0
  10. package/dist/adapter/helpers/generate-mipmaps.d.ts +10 -0
  11. package/dist/adapter/helpers/generate-mipmaps.d.ts.map +1 -0
  12. package/dist/adapter/helpers/generate-mipmaps.js +95 -0
  13. package/dist/adapter/helpers/generate-mipmaps.js.map +1 -0
  14. package/dist/adapter/helpers/get-bind-group.d.ts +13 -0
  15. package/dist/adapter/helpers/get-bind-group.d.ts.map +1 -0
  16. package/dist/adapter/helpers/get-bind-group.js +60 -0
  17. package/dist/adapter/helpers/get-bind-group.js.map +1 -0
  18. package/dist/adapter/helpers/get-vertex-buffer-layout.d.ts +12 -0
  19. package/dist/adapter/helpers/get-vertex-buffer-layout.d.ts.map +1 -0
  20. package/dist/adapter/helpers/get-vertex-buffer-layout.js +98 -0
  21. package/dist/adapter/helpers/get-vertex-buffer-layout.js.map +1 -0
  22. package/dist/adapter/helpers/webgpu-parameters.d.ts +9 -0
  23. package/dist/adapter/helpers/webgpu-parameters.d.ts.map +1 -0
  24. package/dist/adapter/helpers/webgpu-parameters.js +134 -0
  25. package/dist/adapter/helpers/webgpu-parameters.js.map +1 -0
  26. package/dist/adapter/resources/webgpu-buffer.d.ts +18 -0
  27. package/dist/adapter/resources/webgpu-buffer.d.ts.map +1 -0
  28. package/dist/adapter/resources/webgpu-buffer.js +84 -0
  29. package/dist/adapter/resources/webgpu-buffer.js.map +1 -0
  30. package/dist/adapter/resources/webgpu-command-encoder.d.ts +45 -0
  31. package/dist/adapter/resources/webgpu-command-encoder.d.ts.map +1 -0
  32. package/dist/adapter/resources/webgpu-command-encoder.js +66 -0
  33. package/dist/adapter/resources/webgpu-command-encoder.js.map +1 -0
  34. package/dist/adapter/resources/webgpu-compute-pass.d.ts +32 -0
  35. package/dist/adapter/resources/webgpu-compute-pass.d.ts.map +1 -0
  36. package/dist/adapter/resources/webgpu-compute-pass.js +56 -0
  37. package/dist/adapter/resources/webgpu-compute-pass.js.map +1 -0
  38. package/dist/adapter/resources/webgpu-compute-pipeline.d.ts +12 -0
  39. package/dist/adapter/resources/webgpu-compute-pipeline.d.ts.map +1 -0
  40. package/dist/adapter/resources/webgpu-compute-pipeline.js +27 -0
  41. package/dist/adapter/resources/webgpu-compute-pipeline.js.map +1 -0
  42. package/dist/adapter/resources/webgpu-external-texture.d.ts +18 -0
  43. package/dist/adapter/resources/webgpu-external-texture.d.ts.map +1 -0
  44. package/dist/adapter/resources/webgpu-external-texture.js +30 -0
  45. package/dist/adapter/resources/webgpu-external-texture.js.map +1 -0
  46. package/dist/adapter/resources/webgpu-framebuffer.d.ts +29 -0
  47. package/dist/adapter/resources/webgpu-framebuffer.d.ts.map +1 -0
  48. package/dist/adapter/resources/webgpu-framebuffer.js +111 -0
  49. package/dist/adapter/resources/webgpu-framebuffer.js.map +1 -0
  50. package/dist/adapter/resources/webgpu-query.d.ts +1 -0
  51. package/dist/adapter/resources/webgpu-query.d.ts.map +1 -0
  52. package/dist/adapter/resources/webgpu-query.js +2 -0
  53. package/dist/adapter/resources/webgpu-query.js.map +1 -0
  54. package/dist/adapter/resources/webgpu-render-pass.d.ts +34 -0
  55. package/dist/adapter/resources/webgpu-render-pass.d.ts.map +1 -0
  56. package/dist/adapter/resources/webgpu-render-pass.js +92 -0
  57. package/dist/adapter/resources/webgpu-render-pass.js.map +1 -0
  58. package/dist/adapter/resources/webgpu-render-pipeline.d.ts +41 -0
  59. package/dist/adapter/resources/webgpu-render-pipeline.d.ts.map +1 -0
  60. package/dist/adapter/resources/webgpu-render-pipeline.js +148 -0
  61. package/dist/adapter/resources/webgpu-render-pipeline.js.map +1 -0
  62. package/dist/adapter/resources/webgpu-sampler.d.ts +16 -0
  63. package/dist/adapter/resources/webgpu-sampler.d.ts.map +1 -0
  64. package/dist/adapter/resources/webgpu-sampler.js +19 -0
  65. package/dist/adapter/resources/webgpu-sampler.js.map +1 -0
  66. package/dist/adapter/resources/webgpu-shader.d.ts +21 -0
  67. package/dist/adapter/resources/webgpu-shader.d.ts.map +1 -0
  68. package/dist/adapter/resources/webgpu-shader.js +64 -0
  69. package/dist/adapter/resources/webgpu-shader.js.map +1 -0
  70. package/dist/adapter/resources/webgpu-texture.d.ts +39 -0
  71. package/dist/adapter/resources/webgpu-texture.d.ts.map +1 -0
  72. package/dist/adapter/resources/webgpu-texture.js +111 -0
  73. package/dist/adapter/resources/webgpu-texture.js.map +1 -0
  74. package/dist/adapter/webgpu-canvas-context.d.ts +32 -0
  75. package/dist/adapter/webgpu-canvas-context.d.ts.map +1 -0
  76. package/dist/adapter/webgpu-canvas-context.js +95 -0
  77. package/dist/adapter/webgpu-canvas-context.js.map +1 -0
  78. package/dist/adapter/webgpu-device.d.ts +67 -0
  79. package/dist/adapter/webgpu-device.d.ts.map +1 -0
  80. package/dist/adapter/webgpu-device.js +225 -0
  81. package/dist/adapter/webgpu-device.js.map +1 -0
  82. package/dist/adapter/webgpu-types.d.ts +1 -0
  83. package/dist/adapter/webgpu-types.d.ts.map +1 -0
  84. package/dist/adapter/webgpu-types.js +2 -0
  85. package/dist/adapter/webgpu-types.js.map +1 -0
  86. package/dist/bundle.d.ts +2 -0
  87. package/dist/bundle.d.ts.map +1 -0
  88. package/dist/bundle.js +5 -0
  89. package/dist/bundle.js.map +1 -0
  90. package/dist/glsl/glsllang.d.ts +3 -0
  91. package/dist/glsl/glsllang.d.ts.map +1 -0
  92. package/dist/glsl/glsllang.js +10 -0
  93. package/dist/glsl/glsllang.js.map +1 -0
  94. package/dist/index.d.ts +8 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +8 -0
  97. package/dist/index.js.map +1 -0
  98. package/dist/init.d.ts +2 -0
  99. package/dist/init.d.ts.map +1 -0
  100. package/dist/init.js +4 -0
  101. package/dist/init.js.map +1 -0
  102. package/package.json +36 -0
  103. package/src/adapter/helpers/accessor-to-format.ts +101 -0
  104. package/src/adapter/helpers/convert-texture-format.ts +10 -0
  105. package/src/adapter/helpers/generate-mipmaps.ts +107 -0
  106. package/src/adapter/helpers/get-bind-group.ts +82 -0
  107. package/src/adapter/helpers/get-vertex-buffer-layout.ts +123 -0
  108. package/src/adapter/helpers/webgpu-parameters.ts +226 -0
  109. package/src/adapter/resources/webgpu-buffer.ts +96 -0
  110. package/src/adapter/resources/webgpu-command-encoder.ts +111 -0
  111. package/src/adapter/resources/webgpu-compute-pass.ts +74 -0
  112. package/src/adapter/resources/webgpu-compute-pipeline.ts +34 -0
  113. package/src/adapter/resources/webgpu-external-texture.ts +37 -0
  114. package/src/adapter/resources/webgpu-framebuffer.ts +120 -0
  115. package/src/adapter/resources/webgpu-query.ts +43 -0
  116. package/src/adapter/resources/webgpu-render-pass.ts +128 -0
  117. package/src/adapter/resources/webgpu-render-pipeline.ts +231 -0
  118. package/src/adapter/resources/webgpu-sampler.ts +25 -0
  119. package/src/adapter/resources/webgpu-shader.ts +72 -0
  120. package/src/adapter/resources/webgpu-texture.ts +243 -0
  121. package/src/adapter/webgpu-canvas-context.ts +102 -0
  122. package/src/adapter/webgpu-device.ts +282 -0
  123. package/src/adapter/webgpu-types.ts +0 -0
  124. package/src/bundle.ts +4 -0
  125. package/src/glsl/glsllang.ts +14 -0
  126. package/src/index.ts +13 -0
  127. 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"}