@luma.gl/webgpu 9.0.0-beta.6 → 9.0.0-beta.8

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 (66) hide show
  1. package/dist/adapter/helpers/get-bind-group.d.ts +3 -3
  2. package/dist/adapter/helpers/get-bind-group.d.ts.map +1 -1
  3. package/dist/adapter/resources/webgpu-buffer.d.ts.map +1 -1
  4. package/dist/adapter/resources/webgpu-buffer.js +3 -1
  5. package/dist/adapter/resources/webgpu-compute-pass.d.ts +14 -8
  6. package/dist/adapter/resources/webgpu-compute-pass.d.ts.map +1 -1
  7. package/dist/adapter/resources/webgpu-compute-pass.js +18 -13
  8. package/dist/adapter/resources/webgpu-compute-pipeline.d.ts +13 -3
  9. package/dist/adapter/resources/webgpu-compute-pipeline.d.ts.map +1 -1
  10. package/dist/adapter/resources/webgpu-compute-pipeline.js +25 -7
  11. package/dist/adapter/resources/webgpu-external-texture.d.ts.map +1 -1
  12. package/dist/adapter/resources/webgpu-external-texture.js +2 -0
  13. package/dist/adapter/resources/webgpu-query-set.d.ts.map +1 -1
  14. package/dist/adapter/resources/webgpu-query-set.js +3 -1
  15. package/dist/adapter/resources/webgpu-render-pipeline.d.ts +49 -1
  16. package/dist/adapter/resources/webgpu-render-pipeline.d.ts.map +1 -1
  17. package/dist/adapter/resources/webgpu-render-pipeline.js +69 -51
  18. package/dist/adapter/resources/webgpu-sampler.d.ts.map +1 -1
  19. package/dist/adapter/resources/webgpu-sampler.js +3 -0
  20. package/dist/adapter/resources/webgpu-shader.d.ts +1 -4
  21. package/dist/adapter/resources/webgpu-shader.d.ts.map +1 -1
  22. package/dist/adapter/resources/webgpu-shader.js +7 -18
  23. package/dist/adapter/resources/webgpu-texture-view.d.ts.map +1 -1
  24. package/dist/adapter/resources/webgpu-texture-view.js +3 -0
  25. package/dist/adapter/resources/webgpu-texture.d.ts +3 -4
  26. package/dist/adapter/resources/webgpu-texture.d.ts.map +1 -1
  27. package/dist/adapter/resources/webgpu-texture.js +8 -8
  28. package/dist/adapter/webgpu-canvas-context.d.ts.map +1 -1
  29. package/dist/adapter/webgpu-canvas-context.js +2 -1
  30. package/dist/adapter/webgpu-device.d.ts +2 -7
  31. package/dist/adapter/webgpu-device.d.ts.map +1 -1
  32. package/dist/adapter/webgpu-device.js +9 -19
  33. package/dist/dist.dev.js +130 -176
  34. package/dist/dist.min.js +9 -0
  35. package/dist/index.cjs +122 -131
  36. package/dist/index.cjs.map +4 -4
  37. package/package.json +5 -5
  38. package/src/.DS_Store +0 -0
  39. package/src/adapter/.DS_Store +0 -0
  40. package/src/adapter/helpers/get-bind-group.ts +4 -4
  41. package/src/adapter/resources/webgpu-buffer.ts +3 -1
  42. package/src/adapter/resources/webgpu-compute-pass.ts +19 -14
  43. package/src/adapter/resources/webgpu-compute-pipeline.ts +36 -9
  44. package/src/adapter/resources/webgpu-external-texture.ts +2 -0
  45. package/src/adapter/resources/webgpu-query-set.ts +3 -1
  46. package/src/adapter/resources/webgpu-render-pipeline.ts +63 -92
  47. package/src/adapter/resources/webgpu-sampler.ts +3 -0
  48. package/src/adapter/resources/webgpu-shader.ts +8 -23
  49. package/src/adapter/resources/webgpu-texture-view.ts +3 -0
  50. package/src/adapter/resources/webgpu-texture.ts +11 -10
  51. package/src/adapter/webgpu-canvas-context.ts +2 -1
  52. package/src/adapter/webgpu-device.ts +11 -20
  53. package/dist/adapter/helpers/generate-mipmaps.d.ts +0 -10
  54. package/dist/adapter/helpers/generate-mipmaps.d.ts.map +0 -1
  55. package/dist/adapter/helpers/generate-mipmaps.js +0 -103
  56. package/dist/adapter/resources/webgpu-query.d.ts +0 -1
  57. package/dist/adapter/resources/webgpu-query.d.ts.map +0 -1
  58. package/dist/adapter/resources/webgpu-query.js +0 -43
  59. package/dist/adapter/webgpu-types.d.ts +0 -1
  60. package/dist/adapter/webgpu-types.d.ts.map +0 -1
  61. package/dist/adapter/webgpu-types.js +0 -0
  62. package/dist/glsl/glsllang.d.ts +0 -3
  63. package/dist/glsl/glsllang.d.ts.map +0 -1
  64. package/dist/glsl/glsllang.js +0 -12
  65. package/dist.min.js +0 -9
  66. package/src/adapter/helpers/generate-mipmaps.ts +0 -118
@@ -1,103 +0,0 @@
1
- // luma.gl
2
- // SPDX-License-Identifier: MIT
3
- // Copyright (c) vis.gl contributors
4
- // Forked from Kangz/mipmapper.js under MIT license Copyright 2020 Brandon Jones
5
- // https://gist.github.com/Kangz/782d5f1ae502daf53910a13f55db2f83
6
- // @ts-nocheck this is written against outdated WebGPU API, needs an update pass
7
- const VS_GEN_MIPMAP = `\#version 450
8
- const vec2 pos[4] = vec2[4](vec2(-1.0f, 1.0f), vec2(1.0f, 1.0f), vec2(-1.0f, -1.0f), vec2(1.0f, -1.0f));
9
- layout(location = 0) out vec2 vTex;
10
- void main() {
11
- gl_Position = vec4(pos[gl_VertexIndex], 0.0, 1.0);
12
- vTex = gl_Position / 2.0f + vec2(0.5f);
13
- }`;
14
- const FS_GEN_MIPMAP = `#version 450
15
- layout(set = 0, binding = 0) uniform sampler imgSampler;
16
- layout(set = 0, binding = 1) uniform texture2D img;
17
- layout(location = 0) in vec2 vTex;
18
- layout(location = 0) out vec4 outColor;
19
- void main() {
20
- outColor = texture(sampler2D(img, imgSampler), vTex);
21
- }`;
22
- /** WebGPU does not have built-in mipmap creation */
23
- export class WebGPUMipmapGenerator {
24
- device;
25
- mipmapSampler;
26
- mipmapPipeline;
27
- constructor(device, glslang) {
28
- this.device = device;
29
- this.mipmapSampler = device.createSampler({ minFilter: 'linear' });
30
- this.mipmapPipeline = device.createRenderPipeline({
31
- vertexStage: {
32
- module: device.createShaderModule({
33
- code: glslang.compileGLSL(VS_GEN_MIPMAP, 'vertex')
34
- }),
35
- entryPoint: 'main'
36
- },
37
- fragmentStage: {
38
- module: device.createShaderModule({
39
- code: glslang.compileGLSL(FS_GEN_MIPMAP, 'fragment')
40
- }),
41
- entryPoint: 'main'
42
- },
43
- primitiveTopology: 'triangle-strip',
44
- colorStates: [
45
- {
46
- format: 'rgba8unorm'
47
- }
48
- ]
49
- });
50
- }
51
- generateMipmappedTexture(imageBitmap) {
52
- const textureSize = {
53
- width: imageBitmap.width,
54
- height: imageBitmap.height,
55
- depth: 1
56
- };
57
- const mipLevelCount = Math.floor(Math.log2(Math.max(imageBitmap.width, imageBitmap.height))) + 1;
58
- // Populate the top level of the srcTexture with the imageBitmap.
59
- const texture = this.device.createTexture({
60
- size: textureSize,
61
- format: 'rgba8unorm',
62
- usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.SAMPLED | GPUTextureUsage.OUTPUT_ATTACHMENT,
63
- mipLevelCount
64
- });
65
- this.device.queue.copyImageBitmapToTexture({ imageBitmap }, { texture }, textureSize);
66
- const commandEncoder = this.device.createCommandEncoder({});
67
- for (let i = 1; i < mipLevelCount; ++i) {
68
- const passEncoder = commandEncoder.beginRenderPass({
69
- colorAttachments: [
70
- {
71
- attachment: texture.createView({
72
- baseMipLevel: i,
73
- mipLevelCount: 1
74
- }),
75
- loadValue: { r: 1.0, g: 0.0, b: 0.0, a: 0.0 }
76
- }
77
- ]
78
- });
79
- const bindGroup = this.device.createBindGroup({
80
- layout: this.mipmapPipeline.getBindGroupLayout(0),
81
- bindings: [
82
- {
83
- binding: 0,
84
- resource: this.mipmapSampler
85
- },
86
- {
87
- binding: 1,
88
- resource: texture.createView({
89
- baseMipLevel: i - 1,
90
- mipLevelCount: 1
91
- })
92
- }
93
- ]
94
- });
95
- passEncoder.setPipeline(this.mipmapPipeline);
96
- passEncoder.setBindGroup(0, bindGroup);
97
- passEncoder.draw(4);
98
- passEncoder.endPass();
99
- }
100
- this.device.queue.submit([commandEncoder.finish()]);
101
- return texture;
102
- }
103
- }
@@ -1 +0,0 @@
1
- //# sourceMappingURL=webgpu-query.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"webgpu-query.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgpu-query.ts"],"names":[],"mappings":""}
@@ -1,43 +0,0 @@
1
- /*
2
- import {Resource, Query, QueryProps} from '@luma.gl/core';
3
- import {WebGPUDevice} from '../webgpu-device';
4
-
5
- export type WebGPUQueryProps = QueryProps & {
6
- handle?: any;
7
- };
8
-
9
- const DEFAULT_QUERY_PROPS: Required<WebGPUQueryProps> = {
10
- id: undefined,
11
- handle: undefined,
12
- userData: undefined,
13
- type: 'timestamp',
14
- count: 1,
15
- pipelineStatistics: []
16
- };
17
-
18
- /**
19
- * Immutable
20
- *
21
- class WebGPUQuery extends Resource<WebGPUQueryProps> implements Query {
22
- readonly device: WebGPUDevice;
23
- readonly handle: GPUQuerySet;
24
-
25
- constructor(device: WebGPUDevice, props: WebGPUQueryProps) {
26
- super(device, props, DEFAULT_QUERY_PROPS);
27
- this.handle = this.props.handle as GPUQuerySet || this.createHandle();
28
- this.handle.label = this.props.id;
29
- }
30
-
31
- protected createHandle() {
32
- return this.device.handle.createQuerySet({
33
- type: this.props.type,
34
- count: this.props.count,
35
- pipelineStatistics: this.props.pipelineStatistics
36
- });
37
- }
38
-
39
- override destroy(): void {
40
- this.handle.destroy();
41
- }
42
- }
43
- */
@@ -1 +0,0 @@
1
- //# sourceMappingURL=webgpu-types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"webgpu-types.d.ts","sourceRoot":"","sources":["../../src/adapter/webgpu-types.ts"],"names":[],"mappings":""}
File without changes
@@ -1,3 +0,0 @@
1
- /** Dynamically load the GLSL compiler */
2
- export declare function loadGlslangModule(): Promise<unknown>;
3
- //# sourceMappingURL=glsllang.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"glsllang.d.ts","sourceRoot":"","sources":["../../src/glsl/glsllang.ts"],"names":[],"mappings":"AAKA,yCAAyC;AACzC,wBAAsB,iBAAiB,qBAOtC"}
@@ -1,12 +0,0 @@
1
- // Inspired by webgpu samples at https://github.com/austinEng/webgpu-samples/blob/master/src/glslang.ts
2
- // under BSD 3-clause license
3
- let glslang;
4
- /** Dynamically load the GLSL compiler */
5
- export async function loadGlslangModule() {
6
- if (!glslang) {
7
- // @ts-ignore
8
- const glslangModule = await import(/* webpackIgnore: true */ 'https://unpkg.com/@webgpu/glslang@0.0.15/dist/web-devel/glslang.js');
9
- glslang = await glslangModule.default();
10
- }
11
- return glslang;
12
- }
package/dist.min.js DELETED
@@ -1,9 +0,0 @@
1
- (function webpackUniversalModuleDefinition(root, factory) {
2
- if (typeof exports === 'object' && typeof module === 'object')
3
- module.exports = factory();
4
- else if (typeof define === 'function' && define.amd) define([], factory);
5
- else if (typeof exports === 'object') exports['luma'] = factory();
6
- else root['luma'] = factory();})(globalThis, function () {
7
- var __exports__=(()=>{var he=Object.create;var w=Object.defineProperty;var me=Object.getOwnPropertyDescriptor;var fe=Object.getOwnPropertyNames;var Pe=Object.getPrototypeOf,be=Object.prototype.hasOwnProperty;var ge=(i,e,t)=>e in i?w(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t;var ye=(i,e)=>()=>(e||i((e={exports:{}}).exports,e),e.exports),ve=(i,e)=>{for(var t in e)w(i,t,{get:e[t],enumerable:!0})},Y=(i,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of fe(e))!be.call(i,n)&&n!==t&&w(i,n,{get:()=>e[n],enumerable:!(r=me(e,n))||r.enumerable});return i};var p=(i,e,t)=>(t=i!=null?he(Pe(i)):{},Y(e||!i||!i.__esModule?w(t,"default",{value:i,enumerable:!0}):t,i)),xe=i=>Y(w({},"__esModule",{value:!0}),i);var X=(i,e,t)=>(ge(i,typeof e!="symbol"?e+"":e,t),t);var s=ye((Ae,J)=>{J.exports=globalThis.luma});var Te={};ve(Te,{WebGPUBuffer:()=>b,WebGPUDevice:()=>B,WebGPUSampler:()=>c,WebGPUShader:()=>G,WebGPUTexture:()=>x});var l=p(s(),1);var D=p(s(),1);function Ge(i){return i.byteLength||i.data?.byteLength||0}var b=class extends D.Buffer{device;handle;byteLength;constructor(e,t){super(e,t),this.device=e,this.byteLength=Ge(t);let r=Boolean(t.data),n=Math.ceil(this.byteLength/4)*4;this.handle=this.props.handle||this.device.handle.createBuffer({size:n,usage:this.props.usage||GPUBufferUsage.VERTEX|GPUBufferUsage.COPY_DST,mappedAtCreation:this.props.mappedAtCreation||r,label:this.props.id}),t.data&&this._writeMapped(t.data),r&&!t.mappedAtCreation&&this.handle.unmap()}destroy(){this.handle.destroy()}write(e,t=0){this.device.handle.queue.writeBuffer(this.handle,t,e.buffer,e.byteOffset,e.byteLength)}async readAsync(e=0,t=this.byteLength){let r=new b(this.device,{usage:D.Buffer.MAP_READ|D.Buffer.COPY_DST,byteLength:t}),n=this.device.handle.createCommandEncoder();n.copyBufferToBuffer(this.handle,e,r.handle,0,t),this.device.handle.queue.submit([n.finish()]),await r.handle.mapAsync(GPUMapMode.READ,e,t);let o=r.handle.getMappedRange().slice(0);return r.handle.unmap(),r.destroy(),new Uint8Array(o)}_writeMapped(e){let t=this.handle.getMappedRange();new e.constructor(t).set(e)}mapAsync(e,t=0,r){return this.handle.mapAsync(e,t,r)}getMappedRange(e=0,t){return this.handle.getMappedRange(e,t)}unmap(){this.handle.unmap()}};var ee=p(s(),1);function v(i){if(i.includes("webgl"))throw new Error("webgl-only format");return i}var Z=p(s(),1),c=class extends Z.Sampler{device;handle;constructor(e,t){super(e,t),this.device=e;let r={...this.props};r.type!=="comparison-sampler"&&delete r.compare,this.handle=this.handle||this.device.handle.createSampler(r),this.handle.label=this.props.id}destroy(){}};var K=p(s(),1),T=class extends K.TextureView{device;handle;texture;constructor(e,t){super(e,t),this.device=e,this.texture=t.texture,this.handle=this.handle||this.texture.handle.createView({format:t.format||this.texture.format,dimension:t.dimension||this.texture.dimension,aspect:t.aspect,baseMipLevel:t.baseMipLevel,mipLevelCount:t.mipLevelCount,baseArrayLayer:t.baseArrayLayer,arrayLayerCount:t.arrayLayerCount}),this.handle.label=this.props.id}destroy(){}};var Ue={"1d":"1d","2d":"2d","2d-array":"2d",cube:"2d","cube-array":"2d","3d":"3d"},x=class extends ee.Texture{device;handle;height=1;width=1;sampler;view;constructor(e,t){if(super(e,t),this.device=e,t.data instanceof Promise){t.data.then(r=>{this.props={...t,data:r},this.initialize(this.props)});return}this.initialize(t)}initialize(e){this.handle=this.props.handle||this.createHandle(),this.handle.label||=this.id,this.props.data&&this.setData({data:this.props.data}),this.width=this.handle.width,this.height=this.handle.height,this.sampler=e.sampler instanceof c?e.sampler:new c(this.device,e.sampler),this.view=new T(this.device,{...this.props,texture:this})}createHandle(){let e=this.props.width||this.props.data?.width||1,t=this.props.height||this.props.data?.height||1;return this.device.handle.createTexture({label:this.id,size:{width:e,height:t,depthOrArrayLayers:this.props.depth},dimension:Ue[this.props.dimension],format:v(this.props.format),usage:this.props.usage,mipLevelCount:this.props.mipLevels,sampleCount:this.props.samples})}destroy(){this.handle.destroy()}setSampler(e){return this.sampler=e instanceof c?e:new c(this.device,e),this}setData(e){return this.setImage({source:e.data})}setImage(e){let{source:t,width:r=e.source.width,height:n=e.source.height,depth:o=1,sourceX:a=0,sourceY:u=0,mipLevel:d=0,x:g=0,y=0,z:Q=0,aspect:q="all",colorSpace:$="srgb",premultipliedAlpha:ce=!1}=e;return this.device.handle.queue.copyExternalImageToTexture({source:t,origin:[a,u]},{texture:this.handle,origin:[g,y,Q],mipLevel:d,aspect:q,colorSpace:$,premultipliedAlpha:ce},[r,n,o]),{width:r,height:n}}createView(){return this.handle.createView({label:this.id})}};var te=p(s(),1);var R=class extends te.ExternalTexture{device;handle;sampler;constructor(e,t){super(e,t),this.device=e,this.handle=this.props.handle||this.device.handle.importExternalTexture({source:t.source,colorSpace:t.colorSpace}),this.sampler=null}destroy(){}setSampler(e){return this.sampler=e instanceof c?e:new c(this.device,e),this}};var A=p(s(),1),G=class extends A.Shader{device;handle;constructor(e,t){super(e,t),this.device=e,this.device.handle.pushErrorScope("validation"),this.handle=this.props.handle||this.createHandle(),this.handle.label=this.props.id,this._checkCompilationError(this.device.handle.popErrorScope())}async _checkCompilationError(e){let t=await e;if(t){this.debugShader();let r=await this.getCompilationInfo();throw A.log.error(`Shader compilation error: ${t.message}`,r)(),new Error(`Shader compilation error: ${t.message}`)}}destroy(){}async getCompilationInfo(){return(await this.handle.getCompilationInfo()).messages}createHandle(){let{source:e,stage:t}=this.props,r=this.props.language;switch(r==="auto"&&(r=e.includes("->")?"wgsl":"glsl"),r){case"wgsl":return this.device.handle.createShaderModule({code:e});case"glsl":return this.device.handle.createShaderModule({code:e,transform:n=>this.device.glslang.compileGLSL(n,t)});default:throw new Error(r)}}};var f=p(s(),1);function h(i){return i.depthStencil=i.depthStencil||{format:"depth24plus",stencilFront:{},stencilBack:{},depthWriteEnabled:!1,depthCompare:"less-equal"},i.depthStencil}var we={cullMode:(i,e,t)=>{t.primitive=t.primitive||{},t.primitive.cullMode=e},frontFace:(i,e,t)=>{t.primitive=t.primitive||{},t.primitive.frontFace=e},depthWriteEnabled:(i,e,t)=>{let r=h(t);r.depthWriteEnabled=e},depthCompare:(i,e,t)=>{let r=h(t);r.depthCompare=e},depthFormat:(i,e,t)=>{let r=h(t);r.format=e},depthBias:(i,e,t)=>{let r=h(t);r.depthBias=e},depthBiasSlopeScale:(i,e,t)=>{let r=h(t);r.depthBiasSlopeScale=e},depthBiasClamp:(i,e,t)=>{let r=h(t);r.depthBiasClamp=e},stencilReadMask:(i,e,t)=>{let r=h(t);r.stencilReadMask=e},stencilWriteMask:(i,e,t)=>{let r=h(t);r.stencilWriteMask=e},stencilCompare:(i,e,t)=>{let r=h(t);r.stencilFront.compare=e,r.stencilBack.compare=e},stencilPassOperation:(i,e,t)=>{let r=h(t);r.stencilFront.passOp=e,r.stencilBack.passOp=e},stencilFailOperation:(i,e,t)=>{let r=h(t);r.stencilFront.failOp=e,r.stencilBack.failOp=e},stencilDepthFailOperation:(i,e,t)=>{let r=h(t);r.stencilFront.depthFailOp=e,r.stencilBack.depthFailOp=e},sampleCount:(i,e,t)=>{t.multisample=t.multisample||{},t.multisample.count=e},sampleMask:(i,e,t)=>{t.multisample=t.multisample||{},t.multisample.mask=e},sampleAlphaToCoverageEnabled:(i,e,t)=>{t.multisample=t.multisample||{},t.multisample.alphaToCoverageEnabled=e},colorMask:(i,e,t)=>{let r=re(t);r[0].writeMask=e},blendColorOperation:(i,e,t)=>{re(t)}},Se={primitive:{cullMode:"back",topology:"triangle-list"},vertex:{module:void 0,entryPoint:"main"},fragment:{module:void 0,entryPoint:"main",targets:[]},layout:"auto"};function ie(i,e={}){Object.assign(i,{...Se,...i}),We(i,e)}function We(i,e){for(let[t,r]of Object.entries(e)){let n=we[t];if(!n)throw new Error(`Illegal parameter ${t}`);n(t,r,i)}}function re(i){if(i.fragment.targets=i.fragment?.targets||[],!Array.isArray(i.fragment?.targets))throw new Error("colorstate");return i.fragment?.targets?.length===0&&i.fragment.targets?.push({}),i.fragment?.targets}var m=p(s(),1);function ne(i,e,t,r){let n=Be(r,t);return i.createBindGroup({layout:e,entries:n})}function Ce(i,e){let t=i.bindings.find(r=>r.name===e||`${r.name}uniforms`===e.toLocaleLowerCase());return t||m.log.warn(`Binding ${e} not set: Not found in shader layout.`)(),t}function Be(i,e){let t=[];for(let[r,n]of Object.entries(i)){let o=Ce(e,r);o&&t.push(De(n,o.location))}return t}function De(i,e){if(i instanceof m.Buffer)return{binding:e,resource:{buffer:(0,m.cast)(i).handle}};if(i instanceof m.Sampler)return{binding:e,resource:(0,m.cast)(i).handle};if(i instanceof m.Texture)return{binding:e,resource:(0,m.cast)(i).handle.createView({label:"bind-group-auto-created"})};throw new Error("invalid binding")}var U=p(s(),1);function z(i){if(i.endsWith("-webgl"))throw new Error(`WebGPU does not support vertex format ${i}`);return i}function ae(i,e){let t=[],r=new Set;for(let n of e){let o=[],a="vertex",u=0;if(n.attributes)for(let d of n.attributes){let g=d.attribute,y=oe(i,g,r);a=y.stepMode||(y.name.startsWith("instance")?"instance":"vertex"),o.push({format:z(d.format||n.format),offset:d.byteOffset,shaderLocation:y.location}),u+=(0,U.decodeVertexFormat)(n.format).byteLength}else{let d=oe(i,n.name,r);if(!d)continue;u=(0,U.decodeVertexFormat)(n.format).byteLength,a=d.stepMode||(d.name.startsWith("instance")?"instance":"vertex"),o.push({format:z(n.format),offset:0,shaderLocation:d.location})}t.push({arrayStride:n.byteStride||u,stepMode:a,attributes:o})}for(let n of i.attributes)r.has(n.name)||t.push({arrayStride:(0,U.decodeVertexFormat)("float32x3").byteLength,stepMode:n.stepMode||(n.name.startsWith("instance")?"instance":"vertex"),attributes:[{format:z("float32x3"),offset:0,shaderLocation:n.location}]});return t}function oe(i,e,t){let r=i.attributes.find(n=>n.name===e);if(!r)return U.log.warn(`Unknown attribute ${e}`)(),null;if(t.has(e))throw new Error(`Duplicate attribute ${e}`);return t.add(e),r}var E=class extends f.RenderPipeline{device;handle;vs;fs=null;_bindGroupLayout=null;_bindGroup=null;constructor(e,t){if(super(e,t),this.device=e,this.handle=this.props.handle,!this.handle){let r=this._getRenderPipelineDescriptor();f.log.groupCollapsed(1,`new WebGPURenderPipeline(${this.id})`)(),f.log.probe(1,JSON.stringify(r,null,2))(),f.log.groupEnd(1)(),this.handle=this.device.handle.createRenderPipeline(r)}this.handle.label=this.props.id,this.vs=(0,f.cast)(t.vs),this.fs=(0,f.cast)(t.fs)}destroy(){}setBindings(e){Object.assign(this.props.bindings,e)}draw(e){let t=(0,f.cast)(e.renderPass)||this.device.getDefaultRenderPass();t.handle.setPipeline(this.handle);let r=this._getBindGroup();r&&t.handle.setBindGroup(0,r),e.vertexArray.bindBeforeRender(e.renderPass),e.indexCount?t.handle.drawIndexed(e.indexCount,e.instanceCount,e.firstIndex,e.baseVertex,e.firstInstance):t.handle.draw(e.vertexCount||0,e.instanceCount||1,e.firstInstance),e.vertexArray.unbindAfterRender(e.renderPass)}_getBindGroup(){return this._bindGroupLayout=this._bindGroupLayout||this.handle.getBindGroupLayout(0),this._bindGroup=this._bindGroup||ne(this.device.handle,this._bindGroupLayout,this.props.shaderLayout,this.props.bindings),this._bindGroup}_getRenderPipelineDescriptor(){let e={module:(0,f.cast)(this.props.vs).handle,entryPoint:this.props.vsEntryPoint||"main",buffers:ae(this.props.shaderLayout,this.props.bufferLayout)},t;switch(this.props.fs&&(t={module:(0,f.cast)(this.props.fs).handle,entryPoint:this.props.fsEntryPoint||"main",targets:[{format:v(this.device?.canvasContext?.format)}]}),this.props.topology){case"triangle-fan-webgl":case"line-loop-webgl":throw new Error(`WebGPU does not support primitive topology ${this.props.topology}`);default:}let r={vertex:e,fragment:t,primitive:{topology:this.props.topology},layout:"auto"};return ie(r,this.props.parameters),r}};var se=p(s(),1),L=class extends se.ComputePipeline{device;handle;constructor(e,t){super(e,t),this.device=e;let r=this.props.cs;this.handle=this.props.handle||this.device.handle.createComputePipeline({label:this.props.id,compute:{module:r.handle,entryPoint:this.props.csEntryPoint},layout:"auto"})}_getBindGroupLayout(){return this.handle.getBindGroupLayout(0)}};var P=p(s(),1),F=class extends P.RenderPass{device;handle;pipeline=null;constructor(e,t={}){super(e,t),this.device=e;let r=t.framebuffer||e.canvasContext.getCurrentFramebuffer(),n=this.getRenderPassDescriptor(r),o=t.timestampQuerySet;if(o&&(n.occlusionQuerySet=o.handle),e.features.has("timestamp-query")){let a=t.timestampQuerySet;n.timestampWrites=a?{querySet:a.handle,beginningOfPassWriteIndex:t.beginTimestampIndex,endOfPassWriteIndex:t.endTimestampIndex}:void 0}this.handle=this.props.handle||e.commandEncoder.beginRenderPass(n),this.handle.label=this.props.id,P.log.groupCollapsed(3,`new WebGPURenderPass(${this.id})`)(),P.log.probe(3,JSON.stringify(n,null,2))(),P.log.groupEnd(3)()}destroy(){}end(){this.handle.end()}setPipeline(e){this.pipeline=(0,P.cast)(e),this.handle.setPipeline(this.pipeline.handle)}setBindings(e){this.pipeline?.setBindings(e);let t=this.pipeline?._getBindGroup();t&&this.handle.setBindGroup(0,t)}setIndexBuffer(e,t,r=0,n){this.handle.setIndexBuffer((0,P.cast)(e).handle,t,r,n)}setVertexBuffer(e,t,r=0){this.handle.setVertexBuffer(e,(0,P.cast)(t).handle,r)}draw(e){e.indexCount?this.handle.drawIndexed(e.indexCount,e.instanceCount,e.firstIndex,e.baseVertex,e.firstInstance):this.handle.draw(e.vertexCount||0,e.instanceCount||1,e.firstIndex,e.firstInstance)}drawIndirect(){}setParameters(e){let{blendConstant:t,stencilReference:r,scissorRect:n,viewport:o}=e;t&&this.handle.setBlendConstant(t),r&&this.handle.setStencilReference(r),n&&this.handle.setScissorRect(n[0],n[1],n[2],n[3]),o&&this.handle.setViewport(o[0],o[1],o[2],o[3],o[4],o[5])}pushDebugGroup(e){this.handle.pushDebugGroup(e)}popDebugGroup(){this.handle.popDebugGroup()}insertDebugMarker(e){this.handle.insertDebugMarker(e)}beginOcclusionQuery(e){this.handle.beginOcclusionQuery(e)}endOcclusionQuery(){this.handle.endOcclusionQuery()}getRenderPassDescriptor(e){let t={colorAttachments:[]};if(t.colorAttachments=e.colorAttachments.map(r=>({loadOp:this.props.clearColor!==!1?"clear":"load",colorClearValue:this.props.clearColor||[0,0,0,0],storeOp:this.props.discard?"discard":"store",view:r.handle})),e.depthStencilAttachment){t.depthStencilAttachment={view:e.depthStencilAttachment.handle};let{depthStencilAttachment:r}=t;this.props.depthReadOnly&&(r.depthReadOnly=!0),r.depthClearValue=this.props.clearDepth||0,!0&&(r.depthLoadOp=this.props.clearDepth!==!1?"clear":"load",r.depthStoreOp="store"),!1&&(r.stencilLoadOp=this.props.clearStencil!==!1?"clear":"load",r.stencilStoreOp="store")}return t}};var de=p(s(),1),I=class extends de.ComputePass{device;handle;_bindGroupLayout=null;constructor(e,t){super(e,t),this.device=e;let r;if(e.features.has("timestamp-query")){let n=t.timestampQuerySet;n&&(r={querySet:n.handle,beginningOfPassWriteIndex:t.beginTimestampIndex,endOfPassWriteIndex:t.endTimestampIndex})}this.handle=this.props.handle||e.commandEncoder?.beginComputePass({label:this.props.id,timestampWrites:r})}destroy(){}end(){this.handle.end()}setPipeline(e){let t=e;this.handle.setPipeline(t.handle),this._bindGroupLayout=t._getBindGroupLayout()}setBindings(e){throw new Error("fix me")}dispatch(e,t,r){this.handle.dispatchWorkgroups(e,t,r)}dispatchIndirect(e,t=0){let r=e;this.handle.dispatchWorkgroupsIndirect(r.handle,t)}pushDebugGroup(e){this.handle.pushDebugGroup(e)}popDebugGroup(){this.handle.popDebugGroup()}insertDebugMarker(e){this.handle.insertDebugMarker(e)}};var W=p(s(),1);function S(i){if(typeof window<"u"&&typeof window.process=="object"&&window.process.type==="renderer"||typeof process<"u"&&typeof process.versions=="object"&&Boolean(process.versions.electron))return!0;let e=typeof navigator=="object"&&typeof navigator.userAgent=="string"&&navigator.userAgent,t=i||e;return!!(t&&t.indexOf("Electron")>=0)}function N(){return!(typeof process=="object"&&String(process)==="[object process]"&&!process.browser)||S()}var xt=globalThis.self||globalThis.window||globalThis.global,Gt=globalThis.window||globalThis.self||globalThis.global,Ut=globalThis.document||{},wt=globalThis.process||{},St=globalThis.console,pe=globalThis.navigator||{};var j=globalThis;function V(i){if(!i&&!N())return"Node";if(S(i))return"Electron";let e=i||pe.userAgent||"";if(e.indexOf("Edge")>-1)return"Edge";let t=e.indexOf("MSIE ")!==-1,r=e.indexOf("Trident/")!==-1;return t||r?"IE":j.chrome?"Chrome":j.safari?"Safari":j.mozInnerScreenX?"Firefox":"Unknown"}var k=class extends W.VertexArray{get[Symbol.toStringTag](){return"WebGPUVertexArray"}device;handle;constructor(e,t){super(e,t),this.device=e}destroy(){}setIndexBuffer(e){this.indexBuffer=e}setBuffer(e,t){this.attributes[e]=t}bindBeforeRender(e,t,r){let n=e,o=this.indexBuffer;o?.handle&&(W.log.warn("setting index buffer",o?.handle,o?.indexType)(),n.handle.setIndexBuffer(o?.handle,o?.indexType));for(let a=0;a<this.maxVertexAttributes;a++){let u=this.attributes[a];u?.handle&&(W.log.warn(`setting vertex buffer ${a}`,u?.handle)(),n.handle.setVertexBuffer(a,u?.handle))}}unbindAfterRender(e){}static isConstantAttributeZeroSupported(e){return V()==="Chrome"}};var _=p(s(),1);var ue=p(s(),1),M=class extends ue.Framebuffer{device;constructor(e,t){super(e,t),this.device=e,this.autoCreateAttachmentTextures()}};var C=class extends _.CanvasContext{device;gpuCanvasContext;format=navigator.gpu.getPreferredCanvasFormat();depthStencilFormat="depth24plus";depthStencilAttachment=null;constructor(e,t,r){super(r),this.device=e,this.width=-1,this.height=-1,this._setAutoCreatedCanvasId(`${this.device.id}-canvas`),this.gpuCanvasContext=this.canvas.getContext("webgpu"),this.format="bgra8unorm"}destroy(){this.gpuCanvasContext.unconfigure()}getCurrentFramebuffer(){this.update();let e=this.getCurrentTexture();return this.width=e.width,this.height=e.height,this._createDepthStencilAttachment(),new M(this.device,{colorAttachments:[e],depthStencilAttachment:this.depthStencilAttachment})}update(){let[e,t]=this.getPixelSize();(e!==this.width||t!==this.height)&&(this.width=e,this.height=t,this.depthStencilAttachment&&(this.depthStencilAttachment.destroy(),this.depthStencilAttachment=null),this.gpuCanvasContext.configure({device:this.device.handle,format:v(this.format),colorSpace:this.props.colorSpace,alphaMode:this.props.alphaMode}),_.log.log(1,`Resized to ${this.width}x${this.height}px`)())}resize(e){this.update()}getCurrentTexture(){return this.device._createTexture({id:`${this.id}#color-texture`,handle:this.gpuCanvasContext.getCurrentTexture()})}_createDepthStencilAttachment(){return this.depthStencilAttachment||(this.depthStencilAttachment=this.device.createTexture({id:`${this.id}#depth-stencil-texture`,format:this.depthStencilFormat,width:this.width,height:this.height,usage:GPUTextureUsage.RENDER_ATTACHMENT})),this.depthStencilAttachment}};var le=p(s(),1),O=class extends le.QuerySet{device;handle;constructor(e,t){super(e,t),this.device=e,this.handle=this.props.handle||this.device.handle.createQuerySet({type:this.props.type,count:this.props.count}),this.handle.label=this.props.id}destroy(){this.handle.destroy()}};var H=class extends l.Device{handle;adapter;adapterInfo;features;info;limits;lost;canvasContext=null;_isLost=!1;commandEncoder=null;renderPass=null;static isSupported(){return Boolean(typeof navigator<"u"&&navigator.gpu)}static async create(e){if(!navigator.gpu)throw new Error("WebGPU not available. Open in Chrome Canary and turn on chrome://flags/#enable-unsafe-webgpu");l.log.groupCollapsed(1,"WebGPUDevice created")();let t=await navigator.gpu.requestAdapter({powerPreference:"high-performance"});if(!t)throw new Error("Failed to request WebGPU adapter");let r=await t.requestAdapterInfo();l.log.probe(2,"Adapter available",r)();let n=[],o={};if(e.requestMaximalLimits){n.push(...Array.from(t.features));for(let d in t.limits)o[d]=t.limits[d];delete o.minSubgroupSize,delete o.maxSubgroupSize}let a=await t.requestDevice({requiredFeatures:n,requiredLimits:o});l.log.probe(1,"GPUDevice available")(),typeof e.canvas=="string"&&(await l.CanvasContext.pageLoaded,l.log.probe(1,"DOM is loaded")());let u=new H(a,t,r,e);return l.log.probe(1,"Device created. For more info, set chrome://flags/#enable-webgpu-developer-features")(),l.log.table(1,u.info)(),l.log.groupEnd(1)(),u}constructor(e,t,r,n){super({...n,id:n.id||(0,l.uid)("webgpu-device")}),this.handle=e,this.adapter=t,this.adapterInfo=r,this.info=this._getInfo(),this.features=this._getFeatures(),this.limits=this.handle.limits,this.lost=new Promise(async o=>{let a=await this.handle.lost;this._isLost=!0,o({reason:"destroyed",message:a.message})}),this.canvasContext=new C(this,this.adapter,{canvas:n.canvas,height:n.height,width:n.width,container:n.container})}destroy(){this.handle.destroy()}isTextureFormatSupported(e){return!e.includes("webgl")}isTextureFormatFilterable(e){return this.isTextureFormatSupported(e)}isTextureFormatRenderable(e){return this.isTextureFormatSupported(e)}get isLost(){return this._isLost}createBuffer(e){let t=this._getBufferProps(e);return new b(this,t)}_createTexture(e){return new x(this,e)}createExternalTexture(e){return new R(this,e)}createShader(e){return new G(this,e)}createSampler(e){return new c(this,e)}createRenderPipeline(e){return new E(this,e)}createFramebuffer(e){throw new Error("Not implemented")}createComputePipeline(e){return new L(this,e)}createVertexArray(e){return new k(this,e)}beginRenderPass(e){return this.commandEncoder=this.commandEncoder||this.handle.createCommandEncoder(),new F(this,e)}beginComputePass(e){return this.commandEncoder=this.commandEncoder||this.handle.createCommandEncoder(),new I(this,e)}createTransformFeedback(e){throw new Error("Transform feedback not supported in WebGPU")}createQuerySet(e){return new O(this,e)}createCanvasContext(e){return new C(this,this.adapter,e)}getDefaultRenderPass(){throw new Error("a")}submit(){let e=this.commandEncoder?.finish();e&&this.handle.queue.submit([e]),this.commandEncoder=null}_getInfo(){let[e,t]=(this.adapterInfo.driver||"").split(" Version "),r=this.adapterInfo.vendor||this.adapter.__brand||"unknown",n=e||"",o=t||"",a=r==="apple"?"apple":"unknown",u=this.adapterInfo.architecture||"unknown",d=this.adapterInfo.backend||"unknown",g=(this.adapterInfo.type||"").split(" ")[0].toLowerCase()||"unknown";return{type:"webgpu",vendor:r,renderer:n,version:o,gpu:a,gpuType:g,gpuBackend:d,gpuArchitecture:u,shadingLanguage:"wgsl",shadingLanguageVersion:100}}_getFeatures(){let e=new Set(this.handle.features);e.has("depth-clamping")&&(e.delete("depth-clamping"),e.add("depth-clip-control")),e.has("texture-compression-bc")&&e.add("texture-compression-bc5-webgl");let t=["timer-query-webgl","compilation-status-async-webgl","float32-renderable-webgl","float16-renderable-webgl","norm16-renderable-webgl","texture-filterable-anisotropic-webgl","shader-noperspective-interpolation-webgl"];for(let r of t)e.add(r);return new l.DeviceFeatures(Array.from(e))}copyExternalImageToTexture(e){let{source:t,sourceX:r=0,sourceY:n=0,texture:o,mipLevel:a=0,aspect:u="all",colorSpace:d="display-p3",premultipliedAlpha:g=!1,width:y=o.width,height:Q=o.height,depth:q=1}=e,$=o;this.handle?.queue.copyExternalImageToTexture({source:t,origin:[r,n]},{texture:$.handle,origin:[0,0,0],mipLevel:a,aspect:u,colorSpace:d,premultipliedAlpha:g},[y,Q,q])}},B=H;X(B,"type","webgpu");return xe(Te);})();
8
- return __exports__;
9
- });
@@ -1,118 +0,0 @@
1
- // luma.gl
2
- // SPDX-License-Identifier: MIT
3
- // Copyright (c) vis.gl contributors
4
-
5
- // Forked from Kangz/mipmapper.js under MIT license Copyright 2020 Brandon Jones
6
- // https://gist.github.com/Kangz/782d5f1ae502daf53910a13f55db2f83
7
-
8
- // @ts-nocheck this is written against outdated WebGPU API, needs an update pass
9
-
10
- const VS_GEN_MIPMAP = `\#version 450
11
- const vec2 pos[4] = vec2[4](vec2(-1.0f, 1.0f), vec2(1.0f, 1.0f), vec2(-1.0f, -1.0f), vec2(1.0f, -1.0f));
12
- layout(location = 0) out vec2 vTex;
13
- void main() {
14
- gl_Position = vec4(pos[gl_VertexIndex], 0.0, 1.0);
15
- vTex = gl_Position / 2.0f + vec2(0.5f);
16
- }`;
17
-
18
- const FS_GEN_MIPMAP = `#version 450
19
- layout(set = 0, binding = 0) uniform sampler imgSampler;
20
- layout(set = 0, binding = 1) uniform texture2D img;
21
- layout(location = 0) in vec2 vTex;
22
- layout(location = 0) out vec4 outColor;
23
- void main() {
24
- outColor = texture(sampler2D(img, imgSampler), vTex);
25
- }`;
26
-
27
- /** WebGPU does not have built-in mipmap creation */
28
- export class WebGPUMipmapGenerator {
29
- device: GPUDevice;
30
- mipmapSampler: GPUSampler;
31
- mipmapPipeline: GPURenderPipeline;
32
-
33
- constructor(device: GPUDevice, glslang) {
34
- this.device = device;
35
-
36
- this.mipmapSampler = device.createSampler({minFilter: 'linear'});
37
-
38
- this.mipmapPipeline = device.createRenderPipeline({
39
- vertexStage: {
40
- module: device.createShaderModule({
41
- code: glslang.compileGLSL(VS_GEN_MIPMAP, 'vertex')
42
- }),
43
- entryPoint: 'main'
44
- },
45
- fragmentStage: {
46
- module: device.createShaderModule({
47
- code: glslang.compileGLSL(FS_GEN_MIPMAP, 'fragment')
48
- }),
49
- entryPoint: 'main'
50
- },
51
- primitiveTopology: 'triangle-strip',
52
- colorStates: [
53
- {
54
- format: 'rgba8unorm'
55
- }
56
- ]
57
- });
58
- }
59
-
60
- generateMipmappedTexture(imageBitmap: ImageBitmap) {
61
- const textureSize = {
62
- width: imageBitmap.width,
63
- height: imageBitmap.height,
64
- depth: 1
65
- };
66
- const mipLevelCount =
67
- Math.floor(Math.log2(Math.max(imageBitmap.width, imageBitmap.height))) + 1;
68
-
69
- // Populate the top level of the srcTexture with the imageBitmap.
70
- const texture = this.device.createTexture({
71
- size: textureSize,
72
- format: 'rgba8unorm',
73
- usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.SAMPLED | GPUTextureUsage.OUTPUT_ATTACHMENT,
74
- mipLevelCount
75
- });
76
- this.device.queue.copyImageBitmapToTexture({imageBitmap}, {texture}, textureSize);
77
-
78
- const commandEncoder = this.device.createCommandEncoder({});
79
- for (let i = 1; i < mipLevelCount; ++i) {
80
- const passEncoder = commandEncoder.beginRenderPass({
81
- colorAttachments: [
82
- {
83
- attachment: texture.createView({
84
- baseMipLevel: i,
85
- mipLevelCount: 1
86
- }),
87
- loadValue: {r: 1.0, g: 0.0, b: 0.0, a: 0.0}
88
- }
89
- ]
90
- });
91
-
92
- const bindGroup = this.device.createBindGroup({
93
- layout: this.mipmapPipeline.getBindGroupLayout(0),
94
- bindings: [
95
- {
96
- binding: 0,
97
- resource: this.mipmapSampler
98
- },
99
- {
100
- binding: 1,
101
- resource: texture.createView({
102
- baseMipLevel: i - 1,
103
- mipLevelCount: 1
104
- })
105
- }
106
- ]
107
- });
108
-
109
- passEncoder.setPipeline(this.mipmapPipeline);
110
- passEncoder.setBindGroup(0, bindGroup);
111
- passEncoder.draw(4);
112
- passEncoder.endPass();
113
- }
114
-
115
- this.device.queue.submit([commandEncoder.finish()]);
116
- return texture;
117
- }
118
- }