@luma.gl/webgpu 9.0.0-alpha.15 → 9.0.0-alpha.16

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 (179) hide show
  1. package/dist/adapter/helpers/accessor-to-format.js +100 -1
  2. package/dist/adapter/helpers/convert-texture-format.js +5 -6
  3. package/dist/adapter/helpers/generate-mipmaps.js +88 -92
  4. package/dist/adapter/helpers/get-bind-group.js +54 -48
  5. package/dist/adapter/helpers/get-vertex-buffer-layout.js +97 -84
  6. package/dist/adapter/helpers/webgpu-parameters.d.ts.map +1 -1
  7. package/dist/adapter/helpers/webgpu-parameters.js +181 -129
  8. package/dist/adapter/resources/webgpu-buffer.js +57 -73
  9. package/dist/adapter/resources/webgpu-command-encoder.d.ts.map +1 -1
  10. package/dist/adapter/resources/webgpu-command-encoder.js +47 -63
  11. package/dist/adapter/resources/webgpu-compute-pass.d.ts +1 -1
  12. package/dist/adapter/resources/webgpu-compute-pass.d.ts.map +1 -1
  13. package/dist/adapter/resources/webgpu-compute-pass.js +51 -55
  14. package/dist/adapter/resources/webgpu-compute-pipeline.d.ts.map +1 -1
  15. package/dist/adapter/resources/webgpu-compute-pipeline.js +22 -24
  16. package/dist/adapter/resources/webgpu-external-texture.js +26 -27
  17. package/dist/adapter/resources/webgpu-framebuffer.d.ts.map +1 -1
  18. package/dist/adapter/resources/webgpu-framebuffer.js +89 -103
  19. package/dist/adapter/resources/webgpu-query.js +42 -1
  20. package/dist/adapter/resources/webgpu-render-pass.d.ts +1 -1
  21. package/dist/adapter/resources/webgpu-render-pass.d.ts.map +1 -1
  22. package/dist/adapter/resources/webgpu-render-pass.js +64 -89
  23. package/dist/adapter/resources/webgpu-render-pipeline.d.ts.map +1 -1
  24. package/dist/adapter/resources/webgpu-render-pipeline.js +158 -154
  25. package/dist/adapter/resources/webgpu-sampler.d.ts +1 -1
  26. package/dist/adapter/resources/webgpu-sampler.d.ts.map +1 -1
  27. package/dist/adapter/resources/webgpu-sampler.js +16 -22
  28. package/dist/adapter/resources/webgpu-shader.d.ts +1 -1
  29. package/dist/adapter/resources/webgpu-shader.d.ts.map +1 -1
  30. package/dist/adapter/resources/webgpu-shader.js +47 -58
  31. package/dist/adapter/resources/webgpu-texture.d.ts +0 -1
  32. package/dist/adapter/resources/webgpu-texture.d.ts.map +1 -1
  33. package/dist/adapter/resources/webgpu-texture.js +100 -103
  34. package/dist/adapter/webgpu-canvas-context.d.ts.map +1 -1
  35. package/dist/adapter/webgpu-canvas-context.js +77 -90
  36. package/dist/adapter/webgpu-device.js +215 -242
  37. package/dist/adapter/webgpu-types.js +0 -2
  38. package/dist/bundle.js +1 -2
  39. package/dist/dist.js +8051 -0
  40. package/dist/dist.min.js +1 -0
  41. package/dist/es5/adapter/helpers/accessor-to-format.js +2 -0
  42. package/dist/es5/adapter/helpers/accessor-to-format.js.map +1 -0
  43. package/dist/es5/adapter/helpers/convert-texture-format.js +13 -0
  44. package/dist/es5/adapter/helpers/convert-texture-format.js.map +1 -0
  45. package/dist/es5/adapter/helpers/generate-mipmaps.js +103 -0
  46. package/dist/es5/adapter/helpers/generate-mipmaps.js.map +1 -0
  47. package/dist/es5/adapter/helpers/get-bind-group.js +66 -0
  48. package/dist/es5/adapter/helpers/get-bind-group.js.map +1 -0
  49. package/dist/es5/adapter/helpers/get-vertex-buffer-layout.js +149 -0
  50. package/dist/es5/adapter/helpers/get-vertex-buffer-layout.js.map +1 -0
  51. package/dist/es5/adapter/helpers/webgpu-parameters.js +150 -0
  52. package/dist/es5/adapter/helpers/webgpu-parameters.js.map +1 -0
  53. package/dist/es5/adapter/resources/webgpu-buffer.js +131 -0
  54. package/dist/es5/adapter/resources/webgpu-buffer.js.map +1 -0
  55. package/dist/es5/adapter/resources/webgpu-command-encoder.js +90 -0
  56. package/dist/es5/adapter/resources/webgpu-command-encoder.js.map +1 -0
  57. package/dist/es5/adapter/resources/webgpu-compute-pass.js +85 -0
  58. package/dist/es5/adapter/resources/webgpu-compute-pass.js.map +1 -0
  59. package/dist/es5/adapter/resources/webgpu-compute-pipeline.js +48 -0
  60. package/dist/es5/adapter/resources/webgpu-compute-pipeline.js.map +1 -0
  61. package/dist/es5/adapter/resources/webgpu-external-texture.js +50 -0
  62. package/dist/es5/adapter/resources/webgpu-external-texture.js.map +1 -0
  63. package/dist/es5/adapter/resources/webgpu-framebuffer.js +126 -0
  64. package/dist/es5/adapter/resources/webgpu-framebuffer.js.map +1 -0
  65. package/dist/es5/adapter/resources/webgpu-query.js +2 -0
  66. package/dist/es5/adapter/resources/webgpu-query.js.map +1 -0
  67. package/dist/es5/adapter/resources/webgpu-render-pass.js +124 -0
  68. package/dist/es5/adapter/resources/webgpu-render-pass.js.map +1 -0
  69. package/dist/es5/adapter/resources/webgpu-render-pipeline.js +185 -0
  70. package/dist/es5/adapter/resources/webgpu-render-pipeline.js.map +1 -0
  71. package/dist/es5/adapter/resources/webgpu-sampler.js +45 -0
  72. package/dist/es5/adapter/resources/webgpu-sampler.js.map +1 -0
  73. package/dist/es5/adapter/resources/webgpu-shader.js +125 -0
  74. package/dist/es5/adapter/resources/webgpu-shader.js.map +1 -0
  75. package/dist/es5/adapter/resources/webgpu-texture.js +138 -0
  76. package/dist/es5/adapter/resources/webgpu-texture.js.map +1 -0
  77. package/dist/es5/adapter/webgpu-canvas-context.js +111 -0
  78. package/dist/es5/adapter/webgpu-canvas-context.js.map +1 -0
  79. package/dist/es5/adapter/webgpu-device.js +317 -0
  80. package/dist/es5/adapter/webgpu-device.js.map +1 -0
  81. package/dist/es5/adapter/webgpu-types.js +2 -0
  82. package/dist/es5/adapter/webgpu-types.js.map +1 -0
  83. package/dist/es5/bundle.js +6 -0
  84. package/dist/es5/bundle.js.map +1 -0
  85. package/dist/es5/glsl/glsllang.js +47 -0
  86. package/dist/es5/glsl/glsllang.js.map +1 -0
  87. package/dist/es5/index.js +44 -0
  88. package/dist/es5/index.js.map +1 -0
  89. package/dist/es5/init.js +7 -0
  90. package/dist/es5/init.js.map +1 -0
  91. package/dist/esm/adapter/helpers/accessor-to-format.js +2 -0
  92. package/dist/esm/adapter/helpers/accessor-to-format.js.map +1 -0
  93. package/dist/esm/adapter/helpers/convert-texture-format.js +7 -0
  94. package/dist/esm/adapter/helpers/convert-texture-format.js.map +1 -0
  95. package/dist/esm/adapter/helpers/generate-mipmaps.js +88 -0
  96. package/dist/esm/adapter/helpers/generate-mipmaps.js.map +1 -0
  97. package/dist/esm/adapter/helpers/get-bind-group.js +51 -0
  98. package/dist/esm/adapter/helpers/get-bind-group.js.map +1 -0
  99. package/dist/esm/adapter/helpers/get-vertex-buffer-layout.js +83 -0
  100. package/dist/esm/adapter/helpers/get-vertex-buffer-layout.js.map +1 -0
  101. package/dist/esm/adapter/helpers/webgpu-parameters.js +137 -0
  102. package/dist/esm/adapter/helpers/webgpu-parameters.js.map +1 -0
  103. package/dist/esm/adapter/resources/webgpu-buffer.js +70 -0
  104. package/dist/esm/adapter/resources/webgpu-buffer.js.map +1 -0
  105. package/dist/esm/adapter/resources/webgpu-command-encoder.js +49 -0
  106. package/dist/esm/adapter/resources/webgpu-command-encoder.js.map +1 -0
  107. package/dist/esm/adapter/resources/webgpu-compute-pass.js +44 -0
  108. package/dist/esm/adapter/resources/webgpu-compute-pass.js.map +1 -0
  109. package/dist/esm/adapter/resources/webgpu-compute-pipeline.js +23 -0
  110. package/dist/esm/adapter/resources/webgpu-compute-pipeline.js.map +1 -0
  111. package/dist/esm/adapter/resources/webgpu-external-texture.js +23 -0
  112. package/dist/esm/adapter/resources/webgpu-external-texture.js.map +1 -0
  113. package/dist/esm/adapter/resources/webgpu-framebuffer.js +93 -0
  114. package/dist/esm/adapter/resources/webgpu-framebuffer.js.map +1 -0
  115. package/dist/esm/adapter/resources/webgpu-query.js +2 -0
  116. package/dist/esm/adapter/resources/webgpu-query.js.map +1 -0
  117. package/dist/esm/adapter/resources/webgpu-render-pass.js +79 -0
  118. package/dist/esm/adapter/resources/webgpu-render-pass.js.map +1 -0
  119. package/dist/esm/adapter/resources/webgpu-render-pipeline.js +130 -0
  120. package/dist/esm/adapter/resources/webgpu-render-pipeline.js.map +1 -0
  121. package/dist/esm/adapter/resources/webgpu-sampler.js +20 -0
  122. package/dist/esm/adapter/resources/webgpu-sampler.js.map +1 -0
  123. package/dist/esm/adapter/resources/webgpu-shader.js +50 -0
  124. package/dist/esm/adapter/resources/webgpu-shader.js.map +1 -0
  125. package/dist/esm/adapter/resources/webgpu-texture.js +95 -0
  126. package/dist/esm/adapter/resources/webgpu-texture.js.map +1 -0
  127. package/dist/esm/adapter/webgpu-canvas-context.js +74 -0
  128. package/dist/esm/adapter/webgpu-canvas-context.js.map +1 -0
  129. package/dist/esm/adapter/webgpu-device.js +196 -0
  130. package/dist/esm/adapter/webgpu-device.js.map +1 -0
  131. package/dist/esm/adapter/webgpu-types.js +2 -0
  132. package/dist/esm/adapter/webgpu-types.js.map +1 -0
  133. package/dist/esm/bundle.js +4 -0
  134. package/dist/esm/bundle.js.map +1 -0
  135. package/dist/esm/glsl/glsllang.js +9 -0
  136. package/dist/esm/glsl/glsllang.js.map +1 -0
  137. package/dist/esm/index.js +8 -0
  138. package/dist/esm/index.js.map +1 -0
  139. package/dist/esm/init.js +4 -0
  140. package/dist/esm/init.js.map +1 -0
  141. package/dist/glsl/glsllang.js +9 -7
  142. package/dist/index.js +8 -6
  143. package/dist/init.js +1 -2
  144. package/package.json +8 -8
  145. package/src/adapter/helpers/webgpu-parameters.ts +7 -2
  146. package/src/adapter/resources/webgpu-command-encoder.ts +2 -1
  147. package/src/adapter/resources/webgpu-compute-pass.ts +4 -4
  148. package/src/adapter/resources/webgpu-compute-pipeline.ts +2 -1
  149. package/src/adapter/resources/webgpu-framebuffer.ts +3 -2
  150. package/src/adapter/resources/webgpu-render-pass.ts +2 -2
  151. package/src/adapter/resources/webgpu-render-pipeline.ts +2 -1
  152. package/src/adapter/resources/webgpu-shader.ts +1 -1
  153. package/src/adapter/webgpu-canvas-context.ts +3 -2
  154. package/src/adapter/webgpu-device.ts +2 -2
  155. package/dist/adapter/helpers/accessor-to-format.js.map +0 -1
  156. package/dist/adapter/helpers/convert-texture-format.js.map +0 -1
  157. package/dist/adapter/helpers/generate-mipmaps.js.map +0 -1
  158. package/dist/adapter/helpers/get-bind-group.js.map +0 -1
  159. package/dist/adapter/helpers/get-vertex-buffer-layout.js.map +0 -1
  160. package/dist/adapter/helpers/webgpu-parameters.js.map +0 -1
  161. package/dist/adapter/resources/webgpu-buffer.js.map +0 -1
  162. package/dist/adapter/resources/webgpu-command-encoder.js.map +0 -1
  163. package/dist/adapter/resources/webgpu-compute-pass.js.map +0 -1
  164. package/dist/adapter/resources/webgpu-compute-pipeline.js.map +0 -1
  165. package/dist/adapter/resources/webgpu-external-texture.js.map +0 -1
  166. package/dist/adapter/resources/webgpu-framebuffer.js.map +0 -1
  167. package/dist/adapter/resources/webgpu-query.js.map +0 -1
  168. package/dist/adapter/resources/webgpu-render-pass.js.map +0 -1
  169. package/dist/adapter/resources/webgpu-render-pipeline.js.map +0 -1
  170. package/dist/adapter/resources/webgpu-sampler.js.map +0 -1
  171. package/dist/adapter/resources/webgpu-shader.js.map +0 -1
  172. package/dist/adapter/resources/webgpu-texture.js.map +0 -1
  173. package/dist/adapter/webgpu-canvas-context.js.map +0 -1
  174. package/dist/adapter/webgpu-device.js.map +0 -1
  175. package/dist/adapter/webgpu-types.js.map +0 -1
  176. package/dist/bundle.js.map +0 -1
  177. package/dist/glsl/glsllang.js.map +0 -1
  178. package/dist/index.js.map +0 -1
  179. package/dist/init.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgpu-device.js","names":["_api","require","_webgpuBuffer","_interopRequireDefault","_webgpuTexture","_webgpuExternalTexture","_webgpuSampler","_webgpuShader","_webgpuRenderPipeline","_webgpuComputePipeline","_webgpuRenderPass","_webgpuComputePass","_webgpuCanvasContext","ownKeys","object","enumerableOnly","keys","Object","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","target","i","arguments","length","source","forEach","key","_defineProperty2","default","getOwnPropertyDescriptors","defineProperties","defineProperty","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","result","NewTarget","constructor","Reflect","construct","_possibleConstructorReturn2","sham","Proxy","Boolean","prototype","valueOf","call","e","WebGPUDevice","_Device","_inherits2","_super","device","adapter","props","_this","_classCallCheck2","id","uid","_assertThisInitialized2","handle","_info","type","vendor","__brand","renderer","version","gpu","shadingLanguages","shadingLanguageVersions","glsl","wgsl","vendorMasked","rendererMasked","lost","Promise","_ref","_asyncToGenerator2","_regenerator","mark","_callee","resolve","lostInfo","wrap","_callee$","_context","prev","next","sent","_isLost","reason","message","stop","_x","canvas","canvasContext","WebGPUCanvasContext","features","_getFeatures","_createClass2","value","destroy","get","limits","isTextureFormatSupported","format","includes","isTextureFormatFilterable","isTextureFormatRenderable","_createBuffer","WebGPUBuffer","_createTexture","WebGPUTexture","createExternalTexture","WebGPUExternalTexture","createShader","WebGPUShader","createSampler","WebGPUSampler","createRenderPipeline","WebGPURenderPipeline","createFramebuffer","Error","createComputePipeline","WebGPUComputePipeline","beginRenderPass","commandEncoder","createCommandEncoder","WebGPURenderPass","beginComputePass","WebGPUComputePass","createCanvasContext","getDefaultRenderPass","_this$canvasContext","renderPass","framebuffer","getCurrentFramebuffer","submit","_this$renderPass","_this$commandEncoder","end","commandBuffer","finish","queue","Set","has","delete","add","isSupported","navigator","_create","_callee2","gpuDevice","_callee2$","_context2","log","groupCollapsed","requestAdapter","powerPreference","probe","requestDevice","requiredFeatures","CanvasContext","pageLoaded","info","table","groupEnd","abrupt","create","_x2","Device","exports"],"sources":["../../../src/adapter/webgpu-device.ts"],"sourcesContent":["/// <reference types=\"@webgpu/types\" />\n\nimport type {\n DeviceProps,\n DeviceInfo,\n DeviceLimits,\n DeviceFeature,\n CanvasContextProps,\n BufferProps,\n SamplerProps,\n ShaderProps,\n TextureProps,\n TextureFormat,\n ExternalTextureProps,\n FramebufferProps,\n RenderPipelineProps,\n ComputePipelineProps,\n RenderPassProps,\n ComputePassProps\n} from '@luma.gl/api';\nimport {Device, CanvasContext, log, uid} from '@luma.gl/api';\nimport WebGPUBuffer from './resources/webgpu-buffer';\nimport WebGPUTexture from './resources/webgpu-texture';\nimport WebGPUExternalTexture from './resources/webgpu-external-texture';\nimport WebGPUSampler from './resources/webgpu-sampler';\nimport WebGPUShader from './resources/webgpu-shader';\nimport WebGPURenderPipeline from './resources/webgpu-render-pipeline';\nimport WebGPUFramebuffer from './resources/webgpu-framebuffer';\nimport WebGPUComputePipeline from './resources/webgpu-compute-pipeline';\nimport WebGPURenderPass from './resources/webgpu-render-pass';\nimport WebGPUComputePass from './resources/webgpu-compute-pass';\n\nimport WebGPUCanvasContext from './webgpu-canvas-context';\n// import {loadGlslangModule} from '../glsl/glslang';\n\n/** WebGPU Device implementation */\nexport default class WebGPUDevice extends Device {\n readonly handle: GPUDevice;\n readonly adapter: GPUAdapter;\n readonly lost: Promise<{reason: 'destroyed'; message: string}>;\n canvasContext: WebGPUCanvasContext | null = null;\n\n commandEncoder: GPUCommandEncoder | null = null;\n renderPass: WebGPURenderPass | null = null;\n\n private _info: DeviceInfo;\n private _isLost: boolean = false;\n\n static type: string = 'webgpu';\n\n /** Check if WebGPU is available */\n static isSupported(): boolean {\n return Boolean(typeof navigator !== 'undefined' && navigator.gpu);\n }\n\n static async create(props: DeviceProps): Promise<WebGPUDevice> {\n if (!navigator.gpu) {\n throw new Error(\n 'WebGPU not available. Open in Chrome Canary and turn on chrome://flags/#enable-unsafe-webgpu'\n );\n }\n log.groupCollapsed(1, 'WebGPUDevice created')();\n const adapter = await navigator.gpu.requestAdapter({\n powerPreference: 'high-performance'\n // forceSoftware: false\n });\n if (!adapter) {\n throw new Error('Failed to request WebGPU adapter');\n }\n\n log.probe(1, 'Adapter available')();\n\n const gpuDevice = await adapter.requestDevice({\n requiredFeatures: adapter.features as ReadonlySet<GPUFeatureName>\n // TODO ensure we obtain best limits\n // requiredLimits: adapter.limits\n });\n log.probe(1, 'GPUDevice available')();\n\n if (typeof props.canvas === 'string') {\n await CanvasContext.pageLoaded;\n log.probe(1, 'DOM is loaded')();\n }\n\n const device = new WebGPUDevice(gpuDevice, adapter, props);\n log.probe(1, 'Device created', device.info)();\n log.table(1, device.info)();\n log.groupEnd(1)();\n return device;\n }\n\n constructor(device: GPUDevice, adapter: GPUAdapter, props: DeviceProps) {\n super({...props, id: props.id || uid('webgpu-device')});\n this.handle = device;\n this.adapter = adapter;\n\n this._info = {\n type: 'webgpu',\n vendor: this.adapter.__brand,\n renderer: '',\n version: '',\n gpu: 'unknown', // 'nvidia' | 'amd' | 'intel' | 'apple' | 'unknown',\n shadingLanguages: ['glsl', 'wgsl'],\n shadingLanguageVersions: {\n glsl: '450',\n wgsl: '100'\n },\n vendorMasked: '',\n rendererMasked: ''\n };\n\n // \"Context\" loss handling\n this.lost = new Promise<{reason: 'destroyed'; message: string}>(async (resolve) => {\n const lostInfo = await this.handle.lost;\n this._isLost = true;\n resolve({reason: 'destroyed', message: lostInfo.message});\n });\n\n // Note: WebGPU devices can be created without a canvas, for compute shader purposes\n if (props.canvas) {\n this.canvasContext = new WebGPUCanvasContext(this, this.adapter, {canvas: props.canvas});\n }\n\n this.features = this._getFeatures();\n }\n\n // TODO\n // Load the glslang module now so that it is available synchronously when compiling shaders\n // const {glsl = true} = props;\n // this.glslang = glsl && await loadGlslangModule();\n\n destroy(): void {\n this.handle.destroy();\n }\n\n get info(): DeviceInfo {\n return this._info;\n }\n\n features: Set<DeviceFeature>;\n\n get limits(): DeviceLimits {\n return this.handle.limits;\n }\n\n isTextureFormatSupported(format: TextureFormat): boolean {\n return !format.includes('webgl');\n }\n\n /** @todo implement proper check? */\n isTextureFormatFilterable(format: TextureFormat): boolean {\n return this.isTextureFormatSupported(format);\n }\n\n /** @todo implement proper check? */\n isTextureFormatRenderable(format: TextureFormat): boolean {\n return this.isTextureFormatSupported(format);\n }\n\n get isLost(): boolean {\n return this._isLost;\n }\n\n _createBuffer(props: BufferProps): WebGPUBuffer {\n return new WebGPUBuffer(this, props);\n }\n\n _createTexture(props: TextureProps): WebGPUTexture {\n return new WebGPUTexture(this, props);\n }\n\n createExternalTexture(props: ExternalTextureProps): WebGPUExternalTexture {\n return new WebGPUExternalTexture(this, props);\n }\n\n createShader(props: ShaderProps): WebGPUShader {\n return new WebGPUShader(this, props);\n }\n\n createSampler(props: SamplerProps): WebGPUSampler {\n return new WebGPUSampler(this, props);\n }\n\n createRenderPipeline(props: RenderPipelineProps): WebGPURenderPipeline {\n return new WebGPURenderPipeline(this, props);\n }\n\n createFramebuffer(props: FramebufferProps): WebGPUFramebuffer {\n throw new Error('Not implemented');\n }\n\n createComputePipeline(props: ComputePipelineProps): WebGPUComputePipeline {\n return new WebGPUComputePipeline(this, props);\n }\n\n // WebGPU specifics\n\n /**\n * Allows a render pass to begin against a canvas context\n * @todo need to support a \"Framebuffer\" equivalent (aka preconfigured RenderPassDescriptors?).\n */\n beginRenderPass(props: RenderPassProps): WebGPURenderPass {\n this.commandEncoder = this.commandEncoder || this.handle.createCommandEncoder();\n return new WebGPURenderPass(this, props);\n }\n\n beginComputePass(props: ComputePassProps): WebGPUComputePass {\n this.commandEncoder = this.commandEncoder || this.handle.createCommandEncoder();\n return new WebGPUComputePass(this, props);\n }\n\n createCanvasContext(props: CanvasContextProps): WebGPUCanvasContext {\n return new WebGPUCanvasContext(this, this.adapter, props);\n }\n\n /**\n * Gets default renderpass encoder.\n * Creates a new encoder against default canvasContext if not already created\n * @note Called internally by Model.\n */\n getDefaultRenderPass(): WebGPURenderPass {\n this.renderPass =\n this.renderPass ||\n this.beginRenderPass({\n framebuffer: this.canvasContext?.getCurrentFramebuffer()\n });\n return this.renderPass;\n }\n\n submit(): void {\n this.renderPass?.end();\n const commandBuffer = this.commandEncoder?.finish();\n if (commandBuffer) {\n this.handle.queue.submit([commandBuffer]);\n }\n this.commandEncoder = null;\n this.renderPass = null;\n }\n\n _getFeatures() {\n // WebGPU Features\n const features = new Set<DeviceFeature>(this.handle.features as Set<DeviceFeature>);\n\n // Fixups for pre-standard names: https://github.com/webgpu-native/webgpu-headers/issues/133\n // @ts-expect-error Chrome Canary v99\n if (features.has('depth-clamping')) {\n // @ts-expect-error Chrome Canary v99\n features.delete('depth-clamping');\n features.add('depth-clip-control');\n }\n\n // Add subsets\n if (features.has('texture-compression-bc')) {\n features.add('texture-compression-bc5-webgl');\n }\n\n features.add('webgpu');\n\n features.add('timer-query-webgl');\n\n // WEBGL1 SUPPORT\n features.add('vertex-array-object-webgl1');\n features.add('instanced-rendering-webgl1');\n features.add('multiple-render-targets-webgl1');\n features.add('index-uint32-webgl1');\n features.add('blend-minmax-webgl1');\n features.add('texture-blend-float-webgl1');\n\n // TEXTURES, RENDERBUFFERS\n features.add('texture-formats-srgb-webgl1');\n\n // TEXTURES\n features.add('texture-formats-depth-webgl1');\n features.add('texture-formats-float32-webgl1');\n features.add('texture-formats-float16-webgl1');\n\n features.add('texture-filter-linear-float32-webgl');\n features.add('texture-filter-linear-float16-webgl');\n features.add('texture-filter-anisotropic-webgl');\n\n // FRAMEBUFFERS, TEXTURES AND RENDERBUFFERS\n features.add('texture-renderable-rgba32float-webgl');\n features.add('texture-renderable-float32-webgl');\n features.add('texture-renderable-float16-webgl');\n\n // GLSL extensions\n features.add('glsl-frag-data');\n features.add('glsl-frag-depth');\n features.add('glsl-derivatives');\n features.add('glsl-texture-lod');\n\n return features;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=webgpu-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webgpu-types.js","names":[],"sources":["../../../src/adapter/webgpu-types.ts"],"sourcesContent":[""],"mappings":""}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ var moduleExports = require('./index');
4
+ globalThis.luma = globalThis.luma || {};
5
+ module.exports = Object.assign(globalThis.luma, moduleExports);
6
+ //# sourceMappingURL=bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.js","names":["moduleExports","require","globalThis","luma","module","exports","Object","assign"],"sources":["../../src/bundle.ts"],"sourcesContent":["// @ts-nocheck\nconst moduleExports = require('./index');\nglobalThis.luma = globalThis.luma || {};\nmodule.exports = Object.assign(globalThis.luma, moduleExports);\n"],"mappings":";;AACA,IAAMA,aAAa,GAAGC,OAAO,CAAC,SAAS,CAAC;AACxCC,UAAU,CAACC,IAAI,GAAGD,UAAU,CAACC,IAAI,IAAI,CAAC,CAAC;AACvCC,MAAM,CAACC,OAAO,GAAGC,MAAM,CAACC,MAAM,CAACL,UAAU,CAACC,IAAI,EAAEH,aAAa,CAAC"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.loadGlslangModule = loadGlslangModule;
8
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
10
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
12
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || (0, _typeof2.default)(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
13
+ var glslang;
14
+ function loadGlslangModule() {
15
+ return _loadGlslangModule.apply(this, arguments);
16
+ }
17
+ function _loadGlslangModule() {
18
+ _loadGlslangModule = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee() {
19
+ var glslangModule;
20
+ return _regenerator.default.wrap(function _callee$(_context) {
21
+ while (1) switch (_context.prev = _context.next) {
22
+ case 0:
23
+ if (glslang) {
24
+ _context.next = 7;
25
+ break;
26
+ }
27
+ _context.next = 3;
28
+ return Promise.resolve().then(function () {
29
+ return _interopRequireWildcard(require('https://unpkg.com/@webgpu/glslang@0.0.15/dist/web-devel/glslang.js'));
30
+ });
31
+ case 3:
32
+ glslangModule = _context.sent;
33
+ _context.next = 6;
34
+ return glslangModule.default();
35
+ case 6:
36
+ glslang = _context.sent;
37
+ case 7:
38
+ return _context.abrupt("return", glslang);
39
+ case 8:
40
+ case "end":
41
+ return _context.stop();
42
+ }
43
+ }, _callee);
44
+ }));
45
+ return _loadGlslangModule.apply(this, arguments);
46
+ }
47
+ //# sourceMappingURL=glsllang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glsllang.js","names":["glslang","loadGlslangModule","_loadGlslangModule","apply","arguments","_asyncToGenerator2","default","_regenerator","mark","_callee","glslangModule","wrap","_callee$","_context","prev","next","Promise","resolve","then","_interopRequireWildcard","require","sent","abrupt","stop"],"sources":["../../../src/glsl/glsllang.ts"],"sourcesContent":["// Inspired by webgpu samples at https://github.com/austinEng/webgpu-samples/blob/master/src/glslang.ts\n// under BSD 3-clause license\n\nlet glslang: unknown;\n\n/** Dynamically load the GLSL compiler */\nexport async function loadGlslangModule() {\n if (!glslang) {\n // @ts-ignore\n const glslangModule = await import(/* webpackIgnore: true */ 'https://unpkg.com/@webgpu/glslang@0.0.15/dist/web-devel/glslang.js');\n glslang = await glslangModule.default();\n }\n return glslang;\n}\n"],"mappings":";;;;;;;;;;;;AAGA,IAAIA,OAAgB;AAAC,SAGCC,iBAAiBA,CAAA;EAAA,OAAAC,kBAAA,CAAAC,KAAA,OAAAC,SAAA;AAAA;AAAA,SAAAF,mBAAA;EAAAA,kBAAA,OAAAG,kBAAA,CAAAC,OAAA,EAAAC,YAAA,CAAAD,OAAA,CAAAE,IAAA,CAAhC,SAAAC,QAAA;IAAA,IAAAC,aAAA;IAAA,OAAAH,YAAA,CAAAD,OAAA,CAAAK,IAAA,UAAAC,SAAAC,QAAA;MAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;QAAA;UAAA,IACAf,OAAO;YAAAa,QAAA,CAAAE,IAAA;YAAA;UAAA;UAAAF,QAAA,CAAAE,IAAA;UAAA,OAAAC,OAAA,CAAAC,OAAA,GAAAC,IAAA;YAAA,OAAAC,uBAAA,CAAAC,OAAA,CAEmD,oEAAoE;UAAA;QAAA;UAA3HV,aAAa,GAAAG,QAAA,CAAAQ,IAAA;UAAAR,QAAA,CAAAE,IAAA;UAAA,OACHL,aAAa,CAACJ,OAAO,EAAE;QAAA;UAAvCN,OAAO,GAAAa,QAAA,CAAAQ,IAAA;QAAA;UAAA,OAAAR,QAAA,CAAAS,MAAA,WAEFtB,OAAO;QAAA;QAAA;UAAA,OAAAa,QAAA,CAAAU,IAAA;MAAA;IAAA,GAAAd,OAAA;EAAA,CACf;EAAA,OAAAP,kBAAA,CAAAC,KAAA,OAAAC,SAAA;AAAA"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ Object.defineProperty(exports, "WebGPUBuffer", {
8
+ enumerable: true,
9
+ get: function get() {
10
+ return _webgpuBuffer.default;
11
+ }
12
+ });
13
+ Object.defineProperty(exports, "WebGPUDevice", {
14
+ enumerable: true,
15
+ get: function get() {
16
+ return _webgpuDevice.default;
17
+ }
18
+ });
19
+ Object.defineProperty(exports, "WebGPUSampler", {
20
+ enumerable: true,
21
+ get: function get() {
22
+ return _webgpuSampler.default;
23
+ }
24
+ });
25
+ Object.defineProperty(exports, "WebGPUShader", {
26
+ enumerable: true,
27
+ get: function get() {
28
+ return _webgpuShader.default;
29
+ }
30
+ });
31
+ Object.defineProperty(exports, "WebGPUTexture", {
32
+ enumerable: true,
33
+ get: function get() {
34
+ return _webgpuTexture.default;
35
+ }
36
+ });
37
+ require("@luma.gl/api");
38
+ require("./init");
39
+ var _webgpuDevice = _interopRequireDefault(require("./adapter/webgpu-device"));
40
+ var _webgpuBuffer = _interopRequireDefault(require("./adapter/resources/webgpu-buffer"));
41
+ var _webgpuTexture = _interopRequireDefault(require("./adapter/resources/webgpu-texture"));
42
+ var _webgpuSampler = _interopRequireDefault(require("./adapter/resources/webgpu-sampler"));
43
+ var _webgpuShader = _interopRequireDefault(require("./adapter/resources/webgpu-shader"));
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["require","_webgpuDevice","_interopRequireDefault","_webgpuBuffer","_webgpuTexture","_webgpuSampler","_webgpuShader"],"sources":["../../src/index.ts"],"sourcesContent":["\n// Initialize any global state\nimport '@luma.gl/api';\nimport './init'\n\n// WEBGPU ADAPTER\nexport {default as WebGPUDevice} from './adapter/webgpu-device';\n\n// WEBGPU CLASSES (typically not accessed directly)\nexport {default as WebGPUBuffer} from './adapter/resources/webgpu-buffer';\nexport {default as WebGPUTexture} from './adapter/resources/webgpu-texture';\nexport {default as WebGPUSampler} from './adapter/resources/webgpu-sampler';\nexport {default as WebGPUShader} from './adapter/resources/webgpu-shader';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEAA,OAAA;AACAA,OAAA;AAGA,IAAAC,aAAA,GAAAC,sBAAA,CAAAF,OAAA;AAGA,IAAAG,aAAA,GAAAD,sBAAA,CAAAF,OAAA;AACA,IAAAI,cAAA,GAAAF,sBAAA,CAAAF,OAAA;AACA,IAAAK,cAAA,GAAAH,sBAAA,CAAAF,OAAA;AACA,IAAAM,aAAA,GAAAJ,sBAAA,CAAAF,OAAA"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _api = require("@luma.gl/api");
5
+ var _webgpuDevice = _interopRequireDefault(require("./adapter/webgpu-device"));
6
+ _api.luma.registerDevices([_webgpuDevice.default]);
7
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","names":["_api","require","_webgpuDevice","_interopRequireDefault","luma","registerDevices","WebGPUDevice"],"sources":["../../src/init.ts"],"sourcesContent":["import {luma} from '@luma.gl/api';\nimport WebGPUDevice from './adapter/webgpu-device';\n\nluma.registerDevices([WebGPUDevice]);\n"],"mappings":";;;AAAA,IAAAA,IAAA,GAAAC,OAAA;AACA,IAAAC,aAAA,GAAAC,sBAAA,CAAAF,OAAA;AAEAG,SAAI,CAACC,eAAe,CAAC,CAACC,qBAAY,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=accessor-to-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accessor-to-format.js","names":[],"sources":["../../../../src/adapter/helpers/accessor-to-format.ts"],"sourcesContent":["/*\nimport {assert} from '@luma.gl/api';\nimport GL from '@luma.gl/constants';\n\ntype Accessor = Record<string, any>;\n\nconst FORMAT_TO_ACCESSOR: Record<GPUVertexFormat, Accessor> = {\n uchar2: {type: 'uchar', size: 2},\n uchar4: {type: 'uchar', size: 4},\n char2: {type: 'char', size: 2},\n char4: {type: 'char', size: 4},\n uchar2norm: {type: 'uchar', size: 2, normalized: true},\n uchar4norm: {type: 'uchar', size: 4, normalized: true},\n char2norm: {type: 'char', size: 2, normalized: true},\n char4norm: {type: 'char', size: 4, normalized: true},\n ushort2: {type: 'ushort', size: 2},\n ushort4: {type: 'ushort', size: 4},\n short2: {type: 'short', size: 2},\n short4: {type: 'short', size: 4},\n ushort2norm: {type: 'ushort', size: 2, normalized: true},\n ushort4norm: {type: 'ushort', size: 4, normalized: true},\n short2norm: {type: 'short', size: 1, normalized: true},\n short4norm: {type: 'short', size: 1, normalized: true},\n half2: {type: 'half', size: 2},\n half4: {type: 'half', size: 4},\n float: {type: 'float', size: 1},\n float2: {type: 'float', size: 2},\n float3: {type: 'float', size: 3},\n float4: {type: 'float', size: 4},\n uint: {type: 'uint', size: 1, integer: true},\n uint2: {type: 'uint', size: 2, integer: true},\n uint3: {type: 'uint', size: 3, integer: true},\n uint4: {type: 'uint', size: 4, integer: true},\n int: {type: 'int', size: 1, integer: true},\n int2: {type: 'int', size: 2, integer: true},\n int3: {type: 'int', size: 3, integer: true},\n int4: {type: 'int', size: 4, integer: true}\n};\n\n/**\n * Convert from WebGPU attribute format strings to accessor {type, size, normalized, integer}\n * @param {*} format\n *\nexport function mapWebGPUFormatToAccessor(format) {\n const accessorDefinition = FORMAT_TO_ACCESSOR[format];\n assert(accessorDefinition, 'invalid attribute format');\n return Object.freeze(accessorDefinition);\n}\n\n/**\n * Convert from accessor {type, size, normalized, integer} to WebGPU attribute format strings\n * @param {*} format\n *\nexport function mapAccessorToWebGPUFormat(accessor) {\n const {type = GL.FLOAT, size = 1, normalized = false, integer = false} = accessor;\n assert(size >=1 && size <=4);\n // `norm` suffix (uchar4norm)\n const norm = normalized ? 'norm' : '';\n // size 1 is ommitted in format names (float vs float2)\n const count = size === 1 ? '' : size;\n switch (type) {\n case GL.UNSIGNED_BYTE:\n switch (size) {\n case 2:\n case 4:\n return `uchar${count}${norm}`;\n }\n case GL.BYTE:\n switch (size) {\n case 2:\n case 4:\n return `char${count}${norm}`;\n }\n case GL.UNSIGNED_SHORT:\n switch (size) {\n case 2:\n case 4:\n return `ushort${count}${norm}`;\n }\n case GL.SHORT:\n switch (size) {\n case 2:\n case 4:\n return `short${count}${norm}`;\n }\n case GL.HALF_FLOAT:\n switch (size) {\n case 2:\n case 4:\n return `half${count}`;\n }\n case GL.FLOAT:\n return `float${count}`;\n case GL.UNSIGNED_INT:\n return `uint${count}`;\n case GL.INT:\n return `int${count}`;\n }\n throw new Error('illegal accessor');\n}\n*/"],"mappings":""}
@@ -0,0 +1,7 @@
1
+ export function getWebGPUTextureFormat(format) {
2
+ if (format.includes('webgl')) {
3
+ throw new Error('webgl-only format');
4
+ }
5
+ return format;
6
+ }
7
+ //# sourceMappingURL=convert-texture-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert-texture-format.js","names":["getWebGPUTextureFormat","format","includes","Error"],"sources":["../../../../src/adapter/helpers/convert-texture-format.ts"],"sourcesContent":["// luma.gl, MIT license\nimport {TextureFormat} from '@luma.gl/api';\n\n/** Ensure a texture format is WebGPU compatible */\nexport function getWebGPUTextureFormat(format: TextureFormat): GPUTextureFormat {\n if (format.includes('webgl')) {\n throw new Error('webgl-only format');\n }\n return format as GPUTextureFormat;\n}\n"],"mappings":"AAIA,OAAO,SAASA,sBAAsBA,CAACC,MAAqB,EAAoB;EAC9E,IAAIA,MAAM,CAACC,QAAQ,CAAC,OAAO,CAAC,EAAE;IAC5B,MAAM,IAAIC,KAAK,CAAC,mBAAmB,CAAC;EACtC;EACA,OAAOF,MAAM;AACf"}
@@ -0,0 +1,88 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ const VS_GEN_MIPMAP = "#version 450\nconst 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));\nlayout(location = 0) out vec2 vTex;\nvoid main() {\n gl_Position = vec4(pos[gl_VertexIndex], 0.0, 1.0);\n vTex = gl_Position / 2.0f + vec2(0.5f);\n}";
3
+ const FS_GEN_MIPMAP = "#version 450\nlayout(set = 0, binding = 0) uniform sampler imgSampler;\nlayout(set = 0, binding = 1) uniform texture2D img;\nlayout(location = 0) in vec2 vTex;\nlayout(location = 0) out vec4 outColor;\nvoid main() {\n outColor = texture(sampler2D(img, imgSampler), vTex);\n}";
4
+ export class WebGPUMipmapGenerator {
5
+ constructor(device, glslang) {
6
+ _defineProperty(this, "device", void 0);
7
+ _defineProperty(this, "mipmapSampler", void 0);
8
+ _defineProperty(this, "mipmapPipeline", void 0);
9
+ this.device = device;
10
+ this.mipmapSampler = device.createSampler({
11
+ minFilter: 'linear'
12
+ });
13
+ this.mipmapPipeline = device.createRenderPipeline({
14
+ vertexStage: {
15
+ module: device.createShaderModule({
16
+ code: glslang.compileGLSL(VS_GEN_MIPMAP, 'vertex')
17
+ }),
18
+ entryPoint: 'main'
19
+ },
20
+ fragmentStage: {
21
+ module: device.createShaderModule({
22
+ code: glslang.compileGLSL(FS_GEN_MIPMAP, 'fragment')
23
+ }),
24
+ entryPoint: 'main'
25
+ },
26
+ primitiveTopology: 'triangle-strip',
27
+ colorStates: [{
28
+ format: 'rgba8unorm'
29
+ }]
30
+ });
31
+ }
32
+ generateMipmappedTexture(imageBitmap) {
33
+ let textureSize = {
34
+ width: imageBitmap.width,
35
+ height: imageBitmap.height,
36
+ depth: 1
37
+ };
38
+ const mipLevelCount = Math.floor(Math.log2(Math.max(imageBitmap.width, imageBitmap.height))) + 1;
39
+ const texture = this.device.createTexture({
40
+ size: textureSize,
41
+ format: 'rgba8unorm',
42
+ usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.SAMPLED | GPUTextureUsage.OUTPUT_ATTACHMENT,
43
+ mipLevelCount
44
+ });
45
+ this.device.queue.copyImageBitmapToTexture({
46
+ imageBitmap
47
+ }, {
48
+ texture: srcTexture
49
+ }, textureSize);
50
+ const commandEncoder = this.device.createCommandEncoder({});
51
+ for (let i = 1; i < mipLevelCount; ++i) {
52
+ const passEncoder = commandEncoder.beginRenderPass({
53
+ colorAttachments: [{
54
+ attachment: texture.createView({
55
+ baseMipLevel: i,
56
+ mipLevelCount: 1
57
+ }),
58
+ loadValue: {
59
+ r: 1.0,
60
+ g: 0.0,
61
+ b: 0.0,
62
+ a: 0.0
63
+ }
64
+ }]
65
+ });
66
+ const bindGroup = this.device.createBindGroup({
67
+ layout: this.mipmapPipeline.getBindGroupLayout(0),
68
+ bindings: [{
69
+ binding: 0,
70
+ resource: this.mipmapSampler
71
+ }, {
72
+ binding: 1,
73
+ resource: texture.createView({
74
+ baseMipLevel: i - 1,
75
+ mipLevelCount: 1
76
+ })
77
+ }]
78
+ });
79
+ passEncoder.setPipeline(this.mipmapPipeline);
80
+ passEncoder.setBindGroup(0, bindGroup);
81
+ passEncoder.draw(4);
82
+ passEncoder.endPass();
83
+ }
84
+ this.device.queue.submit([commandEncoder.finish()]);
85
+ return texture;
86
+ }
87
+ }
88
+ //# sourceMappingURL=generate-mipmaps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-mipmaps.js","names":["VS_GEN_MIPMAP","FS_GEN_MIPMAP","WebGPUMipmapGenerator","constructor","device","glslang","_defineProperty","mipmapSampler","createSampler","minFilter","mipmapPipeline","createRenderPipeline","vertexStage","module","createShaderModule","code","compileGLSL","entryPoint","fragmentStage","primitiveTopology","colorStates","format","generateMipmappedTexture","imageBitmap","textureSize","width","height","depth","mipLevelCount","Math","floor","log2","max","texture","createTexture","size","usage","GPUTextureUsage","COPY_DST","SAMPLED","OUTPUT_ATTACHMENT","queue","copyImageBitmapToTexture","srcTexture","commandEncoder","createCommandEncoder","i","passEncoder","beginRenderPass","colorAttachments","attachment","createView","baseMipLevel","loadValue","r","g","b","a","bindGroup","createBindGroup","layout","getBindGroupLayout","bindings","binding","resource","setPipeline","setBindGroup","draw","endPass","submit","finish"],"sources":["../../../../src/adapter/helpers/generate-mipmaps.ts"],"sourcesContent":["// luma.gl, MIT license\n// Forked from Kangz/mipmapper.js under MIT license Copyright 2020 Brandon Jones\n// https://gist.github.com/Kangz/782d5f1ae502daf53910a13f55db2f83\n\n// @ts-nocheck this is written against outdated WebGPU API, needs an update pass\n\nconst VS_GEN_MIPMAP = `\\#version 450\nconst 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));\nlayout(location = 0) out vec2 vTex;\nvoid main() {\n gl_Position = vec4(pos[gl_VertexIndex], 0.0, 1.0);\n vTex = gl_Position / 2.0f + vec2(0.5f);\n}`;\n\nconst FS_GEN_MIPMAP = `#version 450\nlayout(set = 0, binding = 0) uniform sampler imgSampler;\nlayout(set = 0, binding = 1) uniform texture2D img;\nlayout(location = 0) in vec2 vTex;\nlayout(location = 0) out vec4 outColor;\nvoid main() {\n outColor = texture(sampler2D(img, imgSampler), vTex);\n}`;\n\n/** WebGPU does not have built-in mipmap creation */\nexport class WebGPUMipmapGenerator {\n device: GPUDevice;\n mipmapSampler: GPUSampler;\n mipmapPipeline: GPURenderPipeline;\n\n constructor(device: GPUDevice, glslang) {\n this.device = device;\n\n this.mipmapSampler = device.createSampler({ minFilter: 'linear' });\n\n this.mipmapPipeline = device.createRenderPipeline({\n vertexStage: {\n module: device.createShaderModule({\n code: glslang.compileGLSL(VS_GEN_MIPMAP, 'vertex')\n }),\n entryPoint: 'main'\n },\n fragmentStage: {\n module: device.createShaderModule({\n code: glslang.compileGLSL(FS_GEN_MIPMAP, 'fragment')\n }),\n entryPoint: 'main'\n },\n primitiveTopology: 'triangle-strip',\n colorStates: [{\n format: 'rgba8unorm',\n }]\n });\n }\n\n generateMipmappedTexture(imageBitmap: ImageBitmap) {\n let textureSize = {\n width: imageBitmap.width,\n height: imageBitmap.height,\n depth: 1,\n }\n const mipLevelCount = Math.floor(Math.log2(Math.max(imageBitmap.width, imageBitmap.height))) + 1;\n\n // Populate the top level of the srcTexture with the imageBitmap.\n const texture = this.device.createTexture({\n size: textureSize,\n format: 'rgba8unorm',\n usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.SAMPLED | GPUTextureUsage.OUTPUT_ATTACHMENT,\n mipLevelCount\n });\n this.device.queue.copyImageBitmapToTexture({ imageBitmap }, { texture: srcTexture }, textureSize);\n\n const commandEncoder = this.device.createCommandEncoder({});\n for (let i = 1; i < mipLevelCount; ++i) {\n const passEncoder = commandEncoder.beginRenderPass({\n colorAttachments: [{\n attachment: texture.createView({\n baseMipLevel: i,\n mipLevelCount: 1\n }),\n loadValue: { r: 1.0, g: 0.0, b: 0.0, a: 0.0 },\n }],\n });\n\n const bindGroup = this.device.createBindGroup({\n layout: this.mipmapPipeline.getBindGroupLayout(0),\n bindings: [{\n binding: 0,\n resource: this.mipmapSampler,\n }, {\n binding: 1,\n resource: texture.createView({\n baseMipLevel: i - 1,\n mipLevelCount: 1\n }),\n }],\n });\n\n passEncoder.setPipeline(this.mipmapPipeline);\n passEncoder.setBindGroup(0, bindGroup);\n passEncoder.draw(4);\n passEncoder.endPass();\n }\n\n this.device.queue.submit([commandEncoder.finish()]);\n return texture;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { Buffer, Sampler, Texture, log, cast } from '@luma.gl/api';
2
+ export function makeBindGroupLayout(device, layout, bindings) {
3
+ throw new Error('not implemented');
4
+ }
5
+ export function getBindGroup(device, bindGroupLayout, layout, bindings) {
6
+ const entries = getBindGroupEntries(bindings, layout);
7
+ return device.createBindGroup({
8
+ layout: bindGroupLayout,
9
+ entries
10
+ });
11
+ }
12
+ export function getShaderLayoutBinding(layout, bindingName) {
13
+ const bindingLayout = layout.bindings.find(binding => binding.name === bindingName);
14
+ if (!bindingLayout) {
15
+ log.warn("Binding ".concat(bindingName, " not set: Not found in shader layout."))();
16
+ }
17
+ return bindingLayout;
18
+ }
19
+ function getBindGroupEntries(bindings, layout) {
20
+ const entries = [];
21
+ for (const [bindingName, value] of Object.entries(bindings)) {
22
+ const bindingLayout = getShaderLayoutBinding(layout, bindingName);
23
+ if (bindingLayout) {
24
+ entries.push(getBindGroupEntry(value, bindingLayout.location));
25
+ }
26
+ }
27
+ return entries;
28
+ }
29
+ function getBindGroupEntry(binding, index) {
30
+ if (binding instanceof Buffer) {
31
+ return {
32
+ binding: index,
33
+ resource: {
34
+ buffer: cast(binding).handle
35
+ }
36
+ };
37
+ }
38
+ if (binding instanceof Sampler) {
39
+ return {
40
+ binding: index,
41
+ resource: cast(binding).handle
42
+ };
43
+ } else if (binding instanceof Texture) {
44
+ return {
45
+ binding: index,
46
+ resource: cast(binding).handle.createView()
47
+ };
48
+ }
49
+ throw new Error('invalid binding');
50
+ }
51
+ //# sourceMappingURL=get-bind-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-bind-group.js","names":["Buffer","Sampler","Texture","log","cast","makeBindGroupLayout","device","layout","bindings","Error","getBindGroup","bindGroupLayout","entries","getBindGroupEntries","createBindGroup","getShaderLayoutBinding","bindingName","bindingLayout","find","binding","name","warn","concat","value","Object","push","getBindGroupEntry","location","index","resource","buffer","handle","createView"],"sources":["../../../../src/adapter/helpers/get-bind-group.ts"],"sourcesContent":["// luma.gl, MIT license\nimport type {ShaderLayout, BindingLayout, Binding} from '@luma.gl/api';\nimport {Buffer, Sampler, Texture, log, cast} from '@luma.gl/api';\nimport type WebGPUBuffer from '../resources/webgpu-buffer';\nimport type WebGPUSampler from '../resources/webgpu-sampler';\nimport type WebGPUTexture from '../resources/webgpu-texture';\n\n/**\n * Create a WebGPU \"bind group layout\" from an array of luma.gl bindings\n * @note bind groups can be automatically generated by WebGPU.\n */\n export function makeBindGroupLayout(device: GPUDevice, layout: GPUBindGroupLayout, bindings: Binding[]): GPUBindGroupLayout {\n throw new Error('not implemented');\n // return device.createBindGroupLayout({\n // layout,\n // entries: getBindGroupEntries(bindings)\n // })\n}\n\n/**\n * Create a WebGPU \"bind group\" from an array of luma.gl bindings\n */\nexport function getBindGroup(\n device: GPUDevice,\n bindGroupLayout: GPUBindGroupLayout,\n layout: ShaderLayout,\n bindings: Record<string, Binding>\n): GPUBindGroup {\n const entries = getBindGroupEntries(bindings, layout);\n return device.createBindGroup({\n layout: bindGroupLayout,\n entries\n });\n}\n\nexport function getShaderLayoutBinding(layout: ShaderLayout, bindingName: string): BindingLayout {\n const bindingLayout = layout.bindings.find(binding => binding.name === bindingName);\n if (!bindingLayout) {\n log.warn(`Binding ${bindingName} not set: Not found in shader layout.`)();\n }\n return bindingLayout;\n}\n\n/**\n * @param bindings\n * @returns\n */\nfunction getBindGroupEntries(bindings: Record<string, Binding>, layout: ShaderLayout): GPUBindGroupEntry[] {\n const entries: GPUBindGroupEntry[] = [];\n\n for (const [bindingName, value] of Object.entries(bindings)) {\n const bindingLayout = getShaderLayoutBinding(layout, bindingName);\n if (bindingLayout) {\n entries.push(getBindGroupEntry(value, bindingLayout.location));\n }\n }\n\n return entries;\n}\n\nfunction getBindGroupEntry(binding: Binding, index: number): GPUBindGroupEntry {\n if (binding instanceof Buffer) {\n return {\n binding: index,\n resource: {\n buffer: cast<WebGPUBuffer>(binding).handle\n }\n };\n }\n if (binding instanceof Sampler) {\n return {\n binding: index,\n resource: cast<WebGPUSampler>(binding).handle\n };\n } else if (binding instanceof Texture) {\n return {\n binding: index,\n resource: cast<WebGPUTexture>(binding).handle.createView()\n };\n }\n throw new Error('invalid binding');\n}\n"],"mappings":"AAEA,SAAQA,MAAM,EAAEC,OAAO,EAAEC,OAAO,EAAEC,GAAG,EAAEC,IAAI,QAAO,cAAc;AAS/D,OAAO,SAASC,mBAAmBA,CAACC,MAAiB,EAAEC,MAA0B,EAAEC,QAAmB,EAAsB;EAC3H,MAAM,IAAIC,KAAK,CAAC,iBAAiB,CAAC;AAKpC;AAKA,OAAO,SAASC,YAAYA,CAC1BJ,MAAiB,EACjBK,eAAmC,EACnCJ,MAAoB,EACpBC,QAAiC,EACnB;EACd,MAAMI,OAAO,GAAGC,mBAAmB,CAACL,QAAQ,EAAED,MAAM,CAAC;EACrD,OAAOD,MAAM,CAACQ,eAAe,CAAC;IAC5BP,MAAM,EAAEI,eAAe;IACvBC;EACF,CAAC,CAAC;AACJ;AAEA,OAAO,SAASG,sBAAsBA,CAACR,MAAoB,EAAES,WAAmB,EAAiB;EAC/F,MAAMC,aAAa,GAAGV,MAAM,CAACC,QAAQ,CAACU,IAAI,CAACC,OAAO,IAAIA,OAAO,CAACC,IAAI,KAAKJ,WAAW,CAAC;EACnF,IAAI,CAACC,aAAa,EAAE;IAClBd,GAAG,CAACkB,IAAI,YAAAC,MAAA,CAAYN,WAAW,2CAAwC,EAAE;EAC3E;EACA,OAAOC,aAAa;AACtB;AAMA,SAASJ,mBAAmBA,CAACL,QAAiC,EAAED,MAAoB,EAAuB;EACzG,MAAMK,OAA4B,GAAG,EAAE;EAEvC,KAAK,MAAM,CAACI,WAAW,EAAEO,KAAK,CAAC,IAAIC,MAAM,CAACZ,OAAO,CAACJ,QAAQ,CAAC,EAAE;IAC3D,MAAMS,aAAa,GAAGF,sBAAsB,CAACR,MAAM,EAAES,WAAW,CAAC;IACjE,IAAIC,aAAa,EAAE;MACjBL,OAAO,CAACa,IAAI,CAACC,iBAAiB,CAACH,KAAK,EAAEN,aAAa,CAACU,QAAQ,CAAC,CAAC;IAChE;EACF;EAEA,OAAOf,OAAO;AAChB;AAEA,SAASc,iBAAiBA,CAACP,OAAgB,EAAES,KAAa,EAAqB;EAC7E,IAAIT,OAAO,YAAYnB,MAAM,EAAE;IAC7B,OAAO;MACLmB,OAAO,EAAES,KAAK;MACdC,QAAQ,EAAE;QACRC,MAAM,EAAE1B,IAAI,CAAee,OAAO,CAAC,CAACY;MACtC;IACF,CAAC;EACH;EACA,IAAIZ,OAAO,YAAYlB,OAAO,EAAE;IAC9B,OAAO;MACLkB,OAAO,EAAES,KAAK;MACdC,QAAQ,EAAEzB,IAAI,CAAgBe,OAAO,CAAC,CAACY;IACzC,CAAC;EACH,CAAC,MAAM,IAAIZ,OAAO,YAAYjB,OAAO,EAAE;IACrC,OAAO;MACLiB,OAAO,EAAES,KAAK;MACdC,QAAQ,EAAEzB,IAAI,CAAgBe,OAAO,CAAC,CAACY,MAAM,CAACC,UAAU;IAC1D,CAAC;EACH;EACA,MAAM,IAAIvB,KAAK,CAAC,iBAAiB,CAAC;AACpC"}
@@ -0,0 +1,83 @@
1
+ import { decodeVertexFormat } from '@luma.gl/api';
2
+ export function getVertexBufferLayout(layout, bufferMap) {
3
+ const vertexBufferLayouts = [];
4
+ const usedAttributes = new Set();
5
+ for (const mapping of bufferMap) {
6
+ const vertexAttributes = [];
7
+ let stepMode = 'vertex';
8
+ let byteStride = 0;
9
+ let byteOffset = mapping.byteOffset || 0;
10
+ if ('attributes' in mapping) {
11
+ for (const interleaved of mapping.attributes) {
12
+ const attributeLayout = findAttributeLayout(layout, interleaved.name, usedAttributes);
13
+ stepMode = attributeLayout.stepMode || 'vertex';
14
+ vertexAttributes.push({
15
+ format: attributeLayout.format,
16
+ offset: byteOffset + byteStride,
17
+ shaderLocation: attributeLayout.location
18
+ });
19
+ byteStride += decodeVertexFormat(attributeLayout.format).byteLength;
20
+ }
21
+ } else {
22
+ const attributeLayout = findAttributeLayout(layout, mapping.name, usedAttributes);
23
+ byteStride = decodeVertexFormat(attributeLayout.format).byteLength, stepMode = attributeLayout.stepMode || 'vertex';
24
+ vertexAttributes.push({
25
+ format: attributeLayout.format,
26
+ offset: byteOffset,
27
+ shaderLocation: attributeLayout.location
28
+ });
29
+ }
30
+ vertexBufferLayouts.push({
31
+ arrayStride: mapping.byteStride || byteStride,
32
+ stepMode: stepMode || 'vertex',
33
+ attributes: vertexAttributes
34
+ });
35
+ }
36
+ for (const attribute of layout.attributes) {
37
+ if (!usedAttributes.has(attribute.name)) {
38
+ vertexBufferLayouts.push({
39
+ arrayStride: decodeVertexFormat(attribute.format).byteLength,
40
+ stepMode: attribute.stepMode || 'vertex',
41
+ attributes: [{
42
+ format: attribute.format,
43
+ offset: 0,
44
+ shaderLocation: attribute.location
45
+ }]
46
+ });
47
+ }
48
+ }
49
+ return vertexBufferLayouts;
50
+ }
51
+ export function getBufferSlots(layout, bufferMap) {
52
+ const usedAttributes = new Set();
53
+ let bufferSlot = 0;
54
+ const bufferSlots = {};
55
+ for (const mapping of bufferMap) {
56
+ if ('attributes' in mapping) {
57
+ for (const interleaved of mapping.attributes) {
58
+ usedAttributes.add(interleaved.name);
59
+ }
60
+ } else {
61
+ usedAttributes.add(mapping.name);
62
+ }
63
+ bufferSlots[mapping.name] = bufferSlot++;
64
+ }
65
+ for (const attribute of layout.attributes) {
66
+ if (!usedAttributes.has(attribute.name)) {
67
+ bufferSlots[attribute.name] = bufferSlot++;
68
+ }
69
+ }
70
+ return bufferSlots;
71
+ }
72
+ function findAttributeLayout(layout, name, attributeNames) {
73
+ const attribute = layout.attributes.find(attribute => attribute.name === name);
74
+ if (!attribute) {
75
+ throw new Error("Unknown attribute ".concat(name));
76
+ }
77
+ if (attributeNames.has(name)) {
78
+ throw new Error("Duplicate attribute ".concat(name));
79
+ }
80
+ attributeNames.add(name);
81
+ return attribute;
82
+ }
83
+ //# sourceMappingURL=get-vertex-buffer-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-vertex-buffer-layout.js","names":["decodeVertexFormat","getVertexBufferLayout","layout","bufferMap","vertexBufferLayouts","usedAttributes","Set","mapping","vertexAttributes","stepMode","byteStride","byteOffset","interleaved","attributes","attributeLayout","findAttributeLayout","name","push","format","offset","shaderLocation","location","byteLength","arrayStride","attribute","has","getBufferSlots","bufferSlot","bufferSlots","add","attributeNames","find","Error","concat"],"sources":["../../../../src/adapter/helpers/get-vertex-buffer-layout.ts"],"sourcesContent":["import type {ShaderLayout, BufferMapping, AttributeLayout} from '@luma.gl/api';\nimport {decodeVertexFormat} from '@luma.gl/api';\n\n/**\n * Build a WebGPU vertex buffer layout intended for use in a GPURenderPassDescriptor.\n * Converts luma.gl attribute definitions to a WebGPU GPUVertexBufferLayout[] array\n * @param layout\n * @param bufferMap The buffer map is optional\n * @returns WebGPU layout intended for a GPURenderPassDescriptor.\n */\nexport function getVertexBufferLayout(layout: ShaderLayout, bufferMap: BufferMapping[]): GPUVertexBufferLayout[] {\n const vertexBufferLayouts: GPUVertexBufferLayout[] = [];\n const usedAttributes = new Set<string>();\n\n // First handle any buffers mentioned in `bufferMapping`\n for (const mapping of bufferMap) {\n // Build vertex attributes for one buffer\n const vertexAttributes: GPUVertexAttribute[] = [];\n\n // TODO verify that all stepModes for one buffer are the same\n let stepMode: 'vertex' | 'instance' = 'vertex';\n let byteStride = 0;\n let byteOffset = mapping.byteOffset || 0;\n\n // interleaved mapping {..., attributes: [{...}, ...]}\n if ('attributes' in mapping) {\n // const arrayStride = mapping.byteStride; TODO \n for (const interleaved of mapping.attributes) {\n const attributeLayout = findAttributeLayout(layout, interleaved.name, usedAttributes);\n\n stepMode = attributeLayout.stepMode || 'vertex';\n vertexAttributes.push({\n format: attributeLayout.format,\n offset: byteOffset + byteStride,\n shaderLocation: attributeLayout.location\n });\n\n byteStride += decodeVertexFormat(attributeLayout.format).byteLength;\n }\n // non-interleaved mapping (just set offset and stride)\n } else {\n const attributeLayout = findAttributeLayout(layout, mapping.name, usedAttributes);\n byteStride = decodeVertexFormat(attributeLayout.format).byteLength,\n\n stepMode = attributeLayout.stepMode || 'vertex';\n vertexAttributes.push({\n format: attributeLayout.format,\n offset: byteOffset,\n shaderLocation: attributeLayout.location\n });\n }\n\n // Store all the attribute bindings for one buffer\n vertexBufferLayouts.push({\n arrayStride: mapping.byteStride || byteStride,\n stepMode: stepMode || 'vertex',\n attributes: vertexAttributes\n });\n }\n\n // Add any non-mapped attributes\n for (const attribute of layout.attributes) {\n if (!usedAttributes.has(attribute.name)) {\n vertexBufferLayouts.push({\n arrayStride: decodeVertexFormat(attribute.format).byteLength,\n stepMode: attribute.stepMode || 'vertex',\n attributes: [{\n format: attribute.format,\n offset: 0,\n shaderLocation: attribute.location\n }]\n });\n }\n }\n\n return vertexBufferLayouts;\n}\n\nexport function getBufferSlots(layout: ShaderLayout, bufferMap: BufferMapping[]): Record<string, number> {\n const usedAttributes = new Set<string>();\n let bufferSlot = 0;\n const bufferSlots: Record<string, number> = {};\n\n // First handle any buffers mentioned in `bufferMapping`\n for (const mapping of bufferMap) {\n // interleaved mapping {..., attributes: [{...}, ...]}\n if ('attributes' in mapping) {\n for (const interleaved of mapping.attributes) {\n usedAttributes.add(interleaved.name);\n }\n // non-interleaved mapping (just set offset and stride)\n } else {\n usedAttributes.add(mapping.name);\n }\n bufferSlots[mapping.name] = bufferSlot++;\n }\n\n // Add any non-mapped attributes\n for (const attribute of layout.attributes) {\n if (!usedAttributes.has(attribute.name)) {\n bufferSlots[attribute.name] = bufferSlot++;\n }\n }\n\n return bufferSlots;\n}\n\n/**\n * Looks up an attribute in the ShaderLayout.\n * @throws if name is not in ShaderLayout\n * @throws if name has already been referenced\n */\nfunction findAttributeLayout(layout: ShaderLayout, name: string, attributeNames: Set<string>): AttributeLayout {\n const attribute = layout.attributes.find(attribute => attribute.name === name);\n if (!attribute) {\n throw new Error(`Unknown attribute ${name}`);\n }\n if (attributeNames.has(name)) {\n throw new Error(`Duplicate attribute ${name}`);\n }\n attributeNames.add(name);\n return attribute;\n}\n"],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ function addDepthStencil(descriptor) {
2
+ descriptor.depthStencil = descriptor.depthStencil || {
3
+ format: 'depth24plus',
4
+ stencilFront: {},
5
+ stencilBack: {},
6
+ depthWriteEnabled: undefined,
7
+ depthCompare: undefined
8
+ };
9
+ return descriptor.depthStencil;
10
+ }
11
+ export const PARAMETER_TABLE = {
12
+ cullMode: (parameter, value, descriptor) => {
13
+ descriptor.primitive = descriptor.primitive || {};
14
+ descriptor.primitive.cullMode = value;
15
+ },
16
+ frontFace: (parameter, value, descriptor) => {
17
+ descriptor.primitive = descriptor.primitive || {};
18
+ descriptor.primitive.frontFace = value;
19
+ },
20
+ depthWriteEnabled: (parameter, value, descriptor) => {
21
+ const depthStencil = addDepthStencil(descriptor);
22
+ depthStencil.depthWriteEnabled = value;
23
+ },
24
+ depthCompare: (parameter, value, descriptor) => {
25
+ const depthStencil = addDepthStencil(descriptor);
26
+ depthStencil.depthCompare = value;
27
+ },
28
+ depthFormat: (parameter, value, descriptor) => {
29
+ const depthStencil = addDepthStencil(descriptor);
30
+ depthStencil.format = value;
31
+ },
32
+ depthBias: (parameter, value, descriptor) => {
33
+ const depthStencil = addDepthStencil(descriptor);
34
+ depthStencil.depthBias = value;
35
+ },
36
+ depthBiasSlopeScale: (parameter, value, descriptor) => {
37
+ const depthStencil = addDepthStencil(descriptor);
38
+ depthStencil.depthBiasSlopeScale = value;
39
+ },
40
+ depthBiasClamp: (parameter, value, descriptor) => {
41
+ const depthStencil = addDepthStencil(descriptor);
42
+ depthStencil.depthBiasClamp = value;
43
+ },
44
+ stencilReadMask: (parameter, value, descriptor) => {
45
+ const depthStencil = addDepthStencil(descriptor);
46
+ depthStencil.stencilReadMask = value;
47
+ },
48
+ stencilWriteMask: (parameter, value, descriptor) => {
49
+ const depthStencil = addDepthStencil(descriptor);
50
+ depthStencil.stencilWriteMask = value;
51
+ },
52
+ stencilCompare: (parameter, value, descriptor) => {
53
+ const depthStencil = addDepthStencil(descriptor);
54
+ depthStencil.stencilFront.compare = value;
55
+ depthStencil.stencilBack.compare = value;
56
+ },
57
+ stencilPassOperation: (parameter, value, descriptor) => {
58
+ const depthStencil = addDepthStencil(descriptor);
59
+ depthStencil.stencilFront.passOp = value;
60
+ depthStencil.stencilBack.passOp = value;
61
+ },
62
+ stencilFailOperation: (parameter, value, descriptor) => {
63
+ const depthStencil = addDepthStencil(descriptor);
64
+ depthStencil.stencilFront.failOp = value;
65
+ depthStencil.stencilBack.failOp = value;
66
+ },
67
+ stencilDepthFailOperation: (parameter, value, descriptor) => {
68
+ const depthStencil = addDepthStencil(descriptor);
69
+ depthStencil.stencilFront.depthFailOp = value;
70
+ depthStencil.stencilBack.depthFailOp = value;
71
+ },
72
+ sampleCount: (parameter, value, descriptor) => {
73
+ descriptor.multisample = descriptor.multisample || {};
74
+ descriptor.multisample.count = value;
75
+ },
76
+ sampleMask: (parameter, value, descriptor) => {
77
+ descriptor.multisample = descriptor.multisample || {};
78
+ descriptor.multisample.mask = value;
79
+ },
80
+ sampleAlphaToCoverageEnabled: (parameter, value, descriptor) => {
81
+ descriptor.multisample = descriptor.multisample || {};
82
+ descriptor.multisample.alphaToCoverageEnabled = value;
83
+ },
84
+ colorMask: (parameter, value, descriptor) => {
85
+ const targets = addColorState(descriptor);
86
+ targets[0].writeMask = value;
87
+ },
88
+ blendColorOperation: (parameter, value, descriptor) => {
89
+ addColorState(descriptor);
90
+ }
91
+ };
92
+ const DEFAULT_PIPELINE_DESCRIPTOR = {
93
+ primitive: {
94
+ cullMode: 'back',
95
+ topology: 'triangle-list'
96
+ },
97
+ vertex: {
98
+ module: undefined,
99
+ entryPoint: 'main'
100
+ },
101
+ fragment: {
102
+ module: undefined,
103
+ entryPoint: 'main',
104
+ targets: []
105
+ },
106
+ layout: 'auto'
107
+ };
108
+ export function applyParametersToRenderPipelineDescriptor(pipelineDescriptor) {
109
+ let parameters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
110
+ Object.assign(pipelineDescriptor, {
111
+ ...DEFAULT_PIPELINE_DESCRIPTOR,
112
+ ...pipelineDescriptor
113
+ });
114
+ setParameters(pipelineDescriptor, parameters);
115
+ }
116
+ function setParameters(pipelineDescriptor, parameters) {
117
+ for (const [key, value] of Object.entries(parameters)) {
118
+ const setterFunction = PARAMETER_TABLE[key];
119
+ if (!setterFunction) {
120
+ throw new Error("Illegal parameter ".concat(key));
121
+ }
122
+ setterFunction(key, value, pipelineDescriptor);
123
+ }
124
+ }
125
+ function addColorState(descriptor) {
126
+ var _descriptor$fragment, _descriptor$fragment2, _descriptor$fragment3, _descriptor$fragment4, _descriptor$fragment5;
127
+ descriptor.fragment.targets = ((_descriptor$fragment = descriptor.fragment) === null || _descriptor$fragment === void 0 ? void 0 : _descriptor$fragment.targets) || [];
128
+ if (!Array.isArray((_descriptor$fragment2 = descriptor.fragment) === null || _descriptor$fragment2 === void 0 ? void 0 : _descriptor$fragment2.targets)) {
129
+ throw new Error('colorstate');
130
+ }
131
+ if (((_descriptor$fragment3 = descriptor.fragment) === null || _descriptor$fragment3 === void 0 ? void 0 : (_descriptor$fragment4 = _descriptor$fragment3.targets) === null || _descriptor$fragment4 === void 0 ? void 0 : _descriptor$fragment4.length) === 0) {
132
+ var _descriptor$fragment$;
133
+ (_descriptor$fragment$ = descriptor.fragment.targets) === null || _descriptor$fragment$ === void 0 ? void 0 : _descriptor$fragment$.push({});
134
+ }
135
+ return (_descriptor$fragment5 = descriptor.fragment) === null || _descriptor$fragment5 === void 0 ? void 0 : _descriptor$fragment5.targets;
136
+ }
137
+ //# sourceMappingURL=webgpu-parameters.js.map