@luma.gl/core 9.2.6 → 9.3.0-alpha.10

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 (280) hide show
  1. package/dist/adapter/canvas-context.d.ts +6 -162
  2. package/dist/adapter/canvas-context.d.ts.map +1 -1
  3. package/dist/adapter/canvas-context.js +5 -419
  4. package/dist/adapter/canvas-context.js.map +1 -1
  5. package/dist/adapter/canvas-observer.d.ts +32 -0
  6. package/dist/adapter/canvas-observer.d.ts.map +1 -0
  7. package/dist/adapter/canvas-observer.js +90 -0
  8. package/dist/adapter/canvas-observer.js.map +1 -0
  9. package/dist/adapter/canvas-surface.d.ts +150 -0
  10. package/dist/adapter/canvas-surface.d.ts.map +1 -0
  11. package/dist/adapter/canvas-surface.js +392 -0
  12. package/dist/adapter/canvas-surface.js.map +1 -0
  13. package/dist/adapter/device.d.ts +81 -16
  14. package/dist/adapter/device.d.ts.map +1 -1
  15. package/dist/adapter/device.js +191 -10
  16. package/dist/adapter/device.js.map +1 -1
  17. package/dist/adapter/luma.js +1 -1
  18. package/dist/adapter/luma.js.map +1 -1
  19. package/dist/adapter/presentation-context.d.ts +11 -0
  20. package/dist/adapter/presentation-context.d.ts.map +1 -0
  21. package/dist/adapter/presentation-context.js +12 -0
  22. package/dist/adapter/presentation-context.js.map +1 -0
  23. package/dist/adapter/resources/buffer.d.ts +1 -1
  24. package/dist/adapter/resources/buffer.d.ts.map +1 -1
  25. package/dist/adapter/resources/buffer.js +14 -6
  26. package/dist/adapter/resources/buffer.js.map +1 -1
  27. package/dist/adapter/resources/command-buffer.d.ts +3 -1
  28. package/dist/adapter/resources/command-buffer.d.ts.map +1 -1
  29. package/dist/adapter/resources/command-buffer.js +3 -1
  30. package/dist/adapter/resources/command-buffer.js.map +1 -1
  31. package/dist/adapter/resources/command-encoder.d.ts +30 -7
  32. package/dist/adapter/resources/command-encoder.d.ts.map +1 -1
  33. package/dist/adapter/resources/command-encoder.js +68 -2
  34. package/dist/adapter/resources/command-encoder.js.map +1 -1
  35. package/dist/adapter/resources/compute-pipeline.d.ts +2 -2
  36. package/dist/adapter/resources/compute-pipeline.d.ts.map +1 -1
  37. package/dist/adapter/resources/fence.d.ts +16 -0
  38. package/dist/adapter/resources/fence.d.ts.map +1 -0
  39. package/dist/adapter/resources/fence.js +17 -0
  40. package/dist/adapter/resources/fence.js.map +1 -0
  41. package/dist/adapter/resources/framebuffer.d.ts +1 -1
  42. package/dist/adapter/resources/framebuffer.d.ts.map +1 -1
  43. package/dist/adapter/resources/framebuffer.js +15 -12
  44. package/dist/adapter/resources/framebuffer.js.map +1 -1
  45. package/dist/adapter/resources/query-set.d.ts +17 -1
  46. package/dist/adapter/resources/query-set.d.ts.map +1 -1
  47. package/dist/adapter/resources/query-set.js.map +1 -1
  48. package/dist/adapter/resources/render-pipeline.d.ts +28 -10
  49. package/dist/adapter/resources/render-pipeline.d.ts.map +1 -1
  50. package/dist/adapter/resources/render-pipeline.js +21 -2
  51. package/dist/adapter/resources/render-pipeline.js.map +1 -1
  52. package/dist/adapter/resources/resource.d.ts +13 -0
  53. package/dist/adapter/resources/resource.d.ts.map +1 -1
  54. package/dist/adapter/resources/resource.js +243 -14
  55. package/dist/adapter/resources/resource.js.map +1 -1
  56. package/dist/adapter/resources/shader.js +27 -25
  57. package/dist/adapter/resources/shader.js.map +1 -1
  58. package/dist/adapter/resources/shared-render-pipeline.d.ts +22 -0
  59. package/dist/adapter/resources/shared-render-pipeline.d.ts.map +1 -0
  60. package/dist/adapter/resources/shared-render-pipeline.js +25 -0
  61. package/dist/adapter/resources/shared-render-pipeline.js.map +1 -0
  62. package/dist/adapter/resources/texture-view.d.ts +1 -1
  63. package/dist/adapter/resources/texture-view.d.ts.map +1 -1
  64. package/dist/adapter/resources/texture.d.ts +168 -28
  65. package/dist/adapter/resources/texture.d.ts.map +1 -1
  66. package/dist/adapter/resources/texture.js +284 -25
  67. package/dist/adapter/resources/texture.js.map +1 -1
  68. package/dist/adapter/types/attachments.d.ts +1 -1
  69. package/dist/adapter/types/attachments.d.ts.map +1 -1
  70. package/dist/adapter/types/buffer-layout.d.ts +1 -1
  71. package/dist/adapter/types/buffer-layout.d.ts.map +1 -1
  72. package/dist/adapter/types/parameters.d.ts +3 -1
  73. package/dist/adapter/types/parameters.d.ts.map +1 -1
  74. package/dist/adapter/types/parameters.js +1 -0
  75. package/dist/adapter/types/parameters.js.map +1 -1
  76. package/dist/adapter/types/shader-layout.d.ts +10 -6
  77. package/dist/adapter/types/shader-layout.d.ts.map +1 -1
  78. package/dist/adapter/types/uniforms.d.ts +6 -0
  79. package/dist/adapter/types/uniforms.d.ts.map +1 -1
  80. package/dist/adapter-utils/bind-groups.d.ts +9 -0
  81. package/dist/adapter-utils/bind-groups.d.ts.map +1 -0
  82. package/dist/adapter-utils/bind-groups.js +41 -0
  83. package/dist/adapter-utils/bind-groups.js.map +1 -0
  84. package/dist/adapter-utils/format-compiler-log.d.ts.map +1 -1
  85. package/dist/adapter-utils/format-compiler-log.js +23 -15
  86. package/dist/adapter-utils/format-compiler-log.js.map +1 -1
  87. package/dist/adapter-utils/get-attribute-from-layouts.d.ts +2 -2
  88. package/dist/adapter-utils/get-attribute-from-layouts.d.ts.map +1 -1
  89. package/dist/adapter-utils/get-attribute-from-layouts.js +6 -6
  90. package/dist/adapter-utils/get-attribute-from-layouts.js.map +1 -1
  91. package/dist/dist.dev.js +2686 -644
  92. package/dist/dist.min.js +10 -9
  93. package/dist/factories/bind-group-factory.d.ts +20 -0
  94. package/dist/factories/bind-group-factory.d.ts.map +1 -0
  95. package/dist/factories/bind-group-factory.js +79 -0
  96. package/dist/factories/bind-group-factory.js.map +1 -0
  97. package/dist/factories/core-module-state.d.ts +7 -0
  98. package/dist/factories/core-module-state.d.ts.map +1 -0
  99. package/dist/{shadertypes/data-types/shader-types.js → factories/core-module-state.js} +1 -1
  100. package/dist/factories/core-module-state.js.map +1 -0
  101. package/dist/factories/pipeline-factory.d.ts +54 -0
  102. package/dist/factories/pipeline-factory.d.ts.map +1 -0
  103. package/dist/factories/pipeline-factory.js +270 -0
  104. package/dist/factories/pipeline-factory.js.map +1 -0
  105. package/dist/factories/shader-factory.d.ts +20 -0
  106. package/dist/factories/shader-factory.d.ts.map +1 -0
  107. package/dist/factories/shader-factory.js +84 -0
  108. package/dist/factories/shader-factory.js.map +1 -0
  109. package/dist/index.cjs +2422 -554
  110. package/dist/index.cjs.map +4 -4
  111. package/dist/index.d.ts +30 -14
  112. package/dist/index.d.ts.map +1 -1
  113. package/dist/index.js +19 -7
  114. package/dist/index.js.map +1 -1
  115. package/dist/portable/shader-block-writer.d.ts +51 -0
  116. package/dist/portable/shader-block-writer.d.ts.map +1 -0
  117. package/dist/portable/shader-block-writer.js +185 -0
  118. package/dist/portable/shader-block-writer.js.map +1 -0
  119. package/dist/portable/uniform-block.d.ts +1 -1
  120. package/dist/portable/uniform-block.d.ts.map +1 -1
  121. package/dist/portable/uniform-store.d.ts +55 -24
  122. package/dist/portable/uniform-store.d.ts.map +1 -1
  123. package/dist/portable/uniform-store.js +73 -25
  124. package/dist/portable/uniform-store.js.map +1 -1
  125. package/dist/shadertypes/data-types/data-type-decoder.d.ts +20 -0
  126. package/dist/shadertypes/data-types/data-type-decoder.d.ts.map +1 -0
  127. package/dist/shadertypes/data-types/data-type-decoder.js +79 -0
  128. package/dist/shadertypes/data-types/data-type-decoder.js.map +1 -0
  129. package/dist/shadertypes/data-types/data-types.d.ts +31 -12
  130. package/dist/shadertypes/data-types/data-types.d.ts.map +1 -1
  131. package/dist/shadertypes/data-types/decode-data-types.d.ts.map +1 -1
  132. package/dist/shadertypes/data-types/decode-data-types.js +2 -1
  133. package/dist/shadertypes/data-types/decode-data-types.js.map +1 -1
  134. package/dist/{image-utils → shadertypes/image-types}/image-types.d.ts +0 -6
  135. package/dist/shadertypes/image-types/image-types.d.ts.map +1 -0
  136. package/dist/shadertypes/image-types/image-types.js.map +1 -0
  137. package/dist/shadertypes/shader-types/shader-block-layout.d.ts +72 -0
  138. package/dist/shadertypes/shader-types/shader-block-layout.d.ts.map +1 -0
  139. package/dist/shadertypes/shader-types/shader-block-layout.js +209 -0
  140. package/dist/shadertypes/shader-types/shader-block-layout.js.map +1 -0
  141. package/dist/shadertypes/shader-types/shader-type-decoder.d.ts +41 -0
  142. package/dist/shadertypes/shader-types/shader-type-decoder.d.ts.map +1 -0
  143. package/dist/shadertypes/{data-types/decode-shader-types.js → shader-types/shader-type-decoder.js} +43 -4
  144. package/dist/shadertypes/shader-types/shader-type-decoder.js.map +1 -0
  145. package/dist/shadertypes/shader-types/shader-types.d.ts +101 -0
  146. package/dist/shadertypes/shader-types/shader-types.d.ts.map +1 -0
  147. package/dist/shadertypes/shader-types/shader-types.js +30 -0
  148. package/dist/shadertypes/shader-types/shader-types.js.map +1 -0
  149. package/dist/shadertypes/texture-types/pixel-utils.d.ts.map +1 -0
  150. package/dist/shadertypes/{textures → texture-types}/pixel-utils.js +4 -4
  151. package/dist/shadertypes/texture-types/pixel-utils.js.map +1 -0
  152. package/dist/shadertypes/texture-types/texture-format-decoder.d.ts +36 -0
  153. package/dist/shadertypes/texture-types/texture-format-decoder.d.ts.map +1 -0
  154. package/dist/shadertypes/{textures → texture-types}/texture-format-decoder.js +109 -37
  155. package/dist/shadertypes/texture-types/texture-format-decoder.js.map +1 -0
  156. package/dist/shadertypes/texture-types/texture-format-generics.d.ts +34 -0
  157. package/dist/shadertypes/texture-types/texture-format-generics.d.ts.map +1 -0
  158. package/dist/shadertypes/texture-types/texture-format-generics.js.map +1 -0
  159. package/dist/shadertypes/texture-types/texture-format-table.d.ts.map +1 -0
  160. package/dist/shadertypes/{textures → texture-types}/texture-format-table.js +10 -9
  161. package/dist/shadertypes/texture-types/texture-format-table.js.map +1 -0
  162. package/dist/shadertypes/{textures → texture-types}/texture-formats.d.ts +51 -17
  163. package/dist/shadertypes/texture-types/texture-formats.d.ts.map +1 -0
  164. package/dist/shadertypes/{textures → texture-types}/texture-formats.js +1 -0
  165. package/dist/shadertypes/texture-types/texture-formats.js.map +1 -0
  166. package/dist/shadertypes/texture-types/texture-layout.d.ts +5 -0
  167. package/dist/shadertypes/texture-types/texture-layout.d.ts.map +1 -0
  168. package/dist/shadertypes/texture-types/texture-layout.js +41 -0
  169. package/dist/shadertypes/texture-types/texture-layout.js.map +1 -0
  170. package/dist/shadertypes/vertex-types/vertex-format-decoder.d.ts +24 -0
  171. package/dist/shadertypes/vertex-types/vertex-format-decoder.d.ts.map +1 -0
  172. package/dist/shadertypes/vertex-types/vertex-format-decoder.js +106 -0
  173. package/dist/shadertypes/vertex-types/vertex-format-decoder.js.map +1 -0
  174. package/dist/shadertypes/vertex-types/vertex-formats.d.ts +50 -0
  175. package/dist/shadertypes/vertex-types/vertex-formats.d.ts.map +1 -0
  176. package/dist/shadertypes/vertex-types/vertex-formats.js.map +1 -0
  177. package/dist/utils/array-equal.d.ts +1 -1
  178. package/dist/utils/array-equal.d.ts.map +1 -1
  179. package/dist/utils/array-equal.js +15 -9
  180. package/dist/utils/array-equal.js.map +1 -1
  181. package/dist/utils/assert.d.ts +5 -0
  182. package/dist/utils/assert.d.ts.map +1 -0
  183. package/dist/utils/assert.js +17 -0
  184. package/dist/utils/assert.js.map +1 -0
  185. package/dist/utils/stats-manager.d.ts.map +1 -1
  186. package/dist/utils/stats-manager.js +61 -1
  187. package/dist/utils/stats-manager.js.map +1 -1
  188. package/package.json +6 -6
  189. package/src/adapter/canvas-context.ts +7 -556
  190. package/src/adapter/canvas-observer.ts +130 -0
  191. package/src/adapter/canvas-surface.ts +521 -0
  192. package/src/adapter/device.ts +308 -24
  193. package/src/adapter/presentation-context.ts +16 -0
  194. package/src/adapter/resources/buffer.ts +13 -5
  195. package/src/adapter/resources/command-buffer.ts +4 -2
  196. package/src/adapter/resources/command-encoder.ts +101 -10
  197. package/src/adapter/resources/compute-pipeline.ts +2 -2
  198. package/src/adapter/resources/fence.ts +32 -0
  199. package/src/adapter/resources/framebuffer.ts +16 -13
  200. package/src/adapter/resources/query-set.ts +17 -1
  201. package/src/adapter/resources/render-pipeline.ts +52 -16
  202. package/src/adapter/resources/resource.ts +289 -14
  203. package/src/adapter/resources/shader.ts +28 -28
  204. package/src/adapter/resources/shared-render-pipeline.ts +40 -0
  205. package/src/adapter/resources/texture-view.ts +1 -1
  206. package/src/adapter/resources/texture.ts +427 -49
  207. package/src/adapter/types/attachments.ts +1 -1
  208. package/src/adapter/types/buffer-layout.ts +1 -1
  209. package/src/adapter/types/parameters.ts +4 -1
  210. package/src/adapter/types/shader-layout.ts +15 -9
  211. package/src/adapter/types/uniforms.ts +12 -0
  212. package/src/adapter-utils/bind-groups.ts +71 -0
  213. package/src/adapter-utils/format-compiler-log.ts +23 -15
  214. package/src/adapter-utils/get-attribute-from-layouts.ts +8 -11
  215. package/src/factories/bind-group-factory.ts +139 -0
  216. package/src/factories/core-module-state.ts +11 -0
  217. package/src/factories/pipeline-factory.ts +328 -0
  218. package/src/factories/shader-factory.ts +103 -0
  219. package/src/index.ts +70 -26
  220. package/src/portable/shader-block-writer.ts +254 -0
  221. package/src/portable/uniform-block.ts +1 -1
  222. package/src/portable/uniform-store.ts +98 -40
  223. package/src/shadertypes/data-types/data-type-decoder.ts +105 -0
  224. package/src/shadertypes/data-types/data-types.ts +100 -48
  225. package/src/shadertypes/data-types/decode-data-types.ts +2 -1
  226. package/src/{image-utils → shadertypes/image-types}/image-types.ts +0 -7
  227. package/src/shadertypes/shader-types/shader-block-layout.ts +340 -0
  228. package/src/shadertypes/{data-types/decode-shader-types.ts → shader-types/shader-type-decoder.ts} +88 -14
  229. package/src/shadertypes/shader-types/shader-types.ts +207 -0
  230. package/src/shadertypes/{textures → texture-types}/pixel-utils.ts +4 -4
  231. package/src/shadertypes/{textures → texture-types}/texture-format-decoder.ts +166 -45
  232. package/src/shadertypes/{textures → texture-types}/texture-format-generics.ts +42 -48
  233. package/src/shadertypes/{textures → texture-types}/texture-format-table.ts +10 -9
  234. package/src/shadertypes/{textures → texture-types}/texture-formats.ts +73 -17
  235. package/src/shadertypes/texture-types/texture-layout.ts +60 -0
  236. package/src/shadertypes/vertex-types/vertex-format-decoder.ts +131 -0
  237. package/src/shadertypes/vertex-types/vertex-formats.ts +183 -0
  238. package/src/utils/array-equal.ts +21 -9
  239. package/src/utils/assert.ts +18 -0
  240. package/src/utils/stats-manager.ts +76 -2
  241. package/dist/image-utils/image-types.d.ts.map +0 -1
  242. package/dist/image-utils/image-types.js.map +0 -1
  243. package/dist/portable/uniform-buffer-layout.d.ts +0 -28
  244. package/dist/portable/uniform-buffer-layout.d.ts.map +0 -1
  245. package/dist/portable/uniform-buffer-layout.js +0 -96
  246. package/dist/portable/uniform-buffer-layout.js.map +0 -1
  247. package/dist/shadertypes/data-types/decode-shader-types.d.ts +0 -17
  248. package/dist/shadertypes/data-types/decode-shader-types.d.ts.map +0 -1
  249. package/dist/shadertypes/data-types/decode-shader-types.js.map +0 -1
  250. package/dist/shadertypes/data-types/shader-types.d.ts +0 -45
  251. package/dist/shadertypes/data-types/shader-types.d.ts.map +0 -1
  252. package/dist/shadertypes/data-types/shader-types.js.map +0 -1
  253. package/dist/shadertypes/textures/pixel-utils.d.ts.map +0 -1
  254. package/dist/shadertypes/textures/pixel-utils.js.map +0 -1
  255. package/dist/shadertypes/textures/texture-format-decoder.d.ts +0 -18
  256. package/dist/shadertypes/textures/texture-format-decoder.d.ts.map +0 -1
  257. package/dist/shadertypes/textures/texture-format-decoder.js.map +0 -1
  258. package/dist/shadertypes/textures/texture-format-generics.d.ts +0 -33
  259. package/dist/shadertypes/textures/texture-format-generics.d.ts.map +0 -1
  260. package/dist/shadertypes/textures/texture-format-generics.js.map +0 -1
  261. package/dist/shadertypes/textures/texture-format-table.d.ts.map +0 -1
  262. package/dist/shadertypes/textures/texture-format-table.js.map +0 -1
  263. package/dist/shadertypes/textures/texture-formats.d.ts.map +0 -1
  264. package/dist/shadertypes/textures/texture-formats.js.map +0 -1
  265. package/dist/shadertypes/vertex-arrays/decode-vertex-format.d.ts +0 -18
  266. package/dist/shadertypes/vertex-arrays/decode-vertex-format.d.ts.map +0 -1
  267. package/dist/shadertypes/vertex-arrays/decode-vertex-format.js +0 -100
  268. package/dist/shadertypes/vertex-arrays/decode-vertex-format.js.map +0 -1
  269. package/dist/shadertypes/vertex-arrays/vertex-formats.d.ts +0 -27
  270. package/dist/shadertypes/vertex-arrays/vertex-formats.d.ts.map +0 -1
  271. package/dist/shadertypes/vertex-arrays/vertex-formats.js.map +0 -1
  272. package/src/portable/uniform-buffer-layout.ts +0 -118
  273. package/src/shadertypes/data-types/shader-types.ts +0 -87
  274. package/src/shadertypes/vertex-arrays/decode-vertex-format.ts +0 -124
  275. package/src/shadertypes/vertex-arrays/vertex-formats.ts +0 -91
  276. /package/dist/{image-utils → shadertypes/image-types}/image-types.js +0 -0
  277. /package/dist/shadertypes/{textures → texture-types}/pixel-utils.d.ts +0 -0
  278. /package/dist/shadertypes/{textures → texture-types}/texture-format-generics.js +0 -0
  279. /package/dist/shadertypes/{textures → texture-types}/texture-format-table.d.ts +0 -0
  280. /package/dist/shadertypes/{vertex-arrays → vertex-types}/vertex-formats.js +0 -0
@@ -2,15 +2,15 @@
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
- import type {TextureFormat} from '../../shadertypes/textures/texture-formats';
6
- import type {
7
- VariableShaderType,
8
- AttributeShaderType
9
- } from '../../shadertypes/data-types/shader-types';
10
- import type {Buffer} from '../resources/buffer';
11
- import type {Sampler} from '../resources/sampler';
12
- import type {Texture} from '../resources/texture';
13
- import type {TextureView} from '../resources/texture-view';
5
+ import {type TextureFormat} from '../../shadertypes/texture-types/texture-formats';
6
+ import {
7
+ type VariableShaderType,
8
+ type AttributeShaderType
9
+ } from '../../shadertypes/shader-types/shader-types';
10
+ import {type Buffer} from '../resources/buffer';
11
+ import {type Sampler} from '../resources/sampler';
12
+ import {type Texture} from '../resources/texture';
13
+ import {type TextureView} from '../resources/texture-view';
14
14
 
15
15
  /**
16
16
  * Describes all shader binding points for a `RenderPipeline` or `ComputePipeline`
@@ -166,6 +166,12 @@ export type Binding =
166
166
  | Buffer
167
167
  | {buffer: Buffer; offset?: number; size?: number};
168
168
 
169
+ /** Named binding map */
170
+ export type Bindings = Record<string, Binding>;
171
+
172
+ /** Bindings partitioned by bind-group index */
173
+ export type BindingsByGroup = Partial<Record<number, Bindings>>;
174
+
169
175
  // SHADER LAYOUTS
170
176
 
171
177
  /**
@@ -8,3 +8,15 @@ import {NumericArray} from '@math.gl/types';
8
8
 
9
9
  /** Valid values for uniforms. @note boolean values get converted to 0 or 1 before setting */
10
10
  export type UniformValue = number | boolean | Readonly<NumericArray>; // Float32Array> | Readonly<Int32Array> | Readonly<Uint32Array> | Readonly<number[]>;
11
+
12
+ /** Recursive uniform value tree used by uniform-buffer packing utilities. */
13
+ export type CompositeUniformValue =
14
+ | UniformValue
15
+ | CompositeUniformValueStruct
16
+ | CompositeUniformValueArray;
17
+
18
+ export type CompositeUniformValueStruct = {
19
+ [name: string]: CompositeUniformValue | undefined;
20
+ };
21
+
22
+ export type CompositeUniformValueArray = ReadonlyArray<CompositeUniformValue | undefined>;
@@ -0,0 +1,71 @@
1
+ // luma.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {
6
+ BindingDeclaration,
7
+ Bindings,
8
+ BindingsByGroup,
9
+ ComputeShaderLayout,
10
+ ShaderLayout
11
+ } from '../adapter/types/shader-layout';
12
+ import {log} from '../utils/log';
13
+
14
+ type AnyShaderLayout = Pick<ShaderLayout | ComputeShaderLayout, 'bindings'>;
15
+
16
+ export function getShaderLayoutBinding(
17
+ shaderLayout: AnyShaderLayout,
18
+ bindingName: string,
19
+ options?: {ignoreWarnings?: boolean}
20
+ ): BindingDeclaration | null {
21
+ const bindingLayout = shaderLayout.bindings.find(
22
+ binding =>
23
+ binding.name === bindingName ||
24
+ `${binding.name.toLocaleLowerCase()}uniforms` === bindingName.toLocaleLowerCase()
25
+ );
26
+
27
+ if (!bindingLayout && !options?.ignoreWarnings) {
28
+ log.warn(`Binding ${bindingName} not set: Not found in shader layout.`)();
29
+ }
30
+
31
+ return bindingLayout || null;
32
+ }
33
+
34
+ export function normalizeBindingsByGroup(
35
+ shaderLayout: AnyShaderLayout,
36
+ bindingsOrBindGroups?: Bindings | BindingsByGroup
37
+ ): BindingsByGroup {
38
+ if (!bindingsOrBindGroups) {
39
+ return {};
40
+ }
41
+
42
+ if (areBindingsGrouped(bindingsOrBindGroups)) {
43
+ const bindGroups = bindingsOrBindGroups as BindingsByGroup;
44
+ return Object.fromEntries(
45
+ Object.entries(bindGroups).map(([group, bindings]) => [Number(group), {...bindings}])
46
+ ) as BindingsByGroup;
47
+ }
48
+
49
+ const bindGroups: BindingsByGroup = {};
50
+ for (const [bindingName, binding] of Object.entries(bindingsOrBindGroups as Bindings)) {
51
+ const bindingLayout = getShaderLayoutBinding(shaderLayout, bindingName);
52
+ const group = bindingLayout?.group ?? 0;
53
+ bindGroups[group] ||= {};
54
+ bindGroups[group][bindingName] = binding;
55
+ }
56
+
57
+ return bindGroups;
58
+ }
59
+
60
+ export function flattenBindingsByGroup(bindGroups: BindingsByGroup): Bindings {
61
+ const bindings: Bindings = {};
62
+ for (const groupBindings of Object.values(bindGroups)) {
63
+ Object.assign(bindings, groupBindings);
64
+ }
65
+ return bindings;
66
+ }
67
+
68
+ function areBindingsGrouped(bindingsOrBindGroups: Bindings | BindingsByGroup): boolean {
69
+ const keys = Object.keys(bindingsOrBindGroups);
70
+ return keys.length > 0 && keys.every(key => /^\d+$/.test(key));
71
+ }
@@ -21,25 +21,33 @@ export function formatCompilerLog(
21
21
  switch (options?.showSourceCode || 'no') {
22
22
  case 'all':
23
23
  // Parse the error - note: browser and driver dependent
24
- let currentMessage = 0;
24
+ let currentMessageIndex = 0;
25
25
  for (let lineNum = 1; lineNum <= lines.length; lineNum++) {
26
- formattedLog += getNumberedLine(lines[lineNum - 1], lineNum, options);
27
- while (log.length > currentMessage && log[currentMessage].lineNum === lineNum) {
28
- const message = log[currentMessage++];
29
- formattedLog += formatCompilerMessage(message, lines, message.lineNum, {
26
+ const line = lines[lineNum - 1];
27
+ const currentMessage = log[currentMessageIndex];
28
+ if (line && currentMessage) {
29
+ formattedLog += getNumberedLine(line, lineNum, options);
30
+ }
31
+ while (log.length > currentMessageIndex && currentMessage.lineNum === lineNum) {
32
+ const message = log[currentMessageIndex++];
33
+ if (message) {
34
+ formattedLog += formatCompilerMessage(message, lines, message.lineNum, {
35
+ ...options,
36
+ inlineSource: false
37
+ });
38
+ }
39
+ }
40
+ }
41
+ // Print any remaining messages
42
+ while (log.length > currentMessageIndex) {
43
+ const message = log[currentMessageIndex++];
44
+ if (message) {
45
+ formattedLog += formatCompilerMessage(message, [], 0, {
30
46
  ...options,
31
47
  inlineSource: false
32
48
  });
33
49
  }
34
50
  }
35
- // Print any remaining messages
36
- while (log.length > currentMessage) {
37
- const message = log[currentMessage++];
38
- formattedLog += formatCompilerMessage(message, [], 0, {
39
- ...options,
40
- inlineSource: false
41
- });
42
- }
43
51
  return formattedLog;
44
52
 
45
53
  case 'issues':
@@ -75,9 +83,9 @@ ${numberedLines}${positionIndicator}${message.type.toUpperCase()}: ${message.mes
75
83
 
76
84
  `;
77
85
  }
78
- const color = message.type === 'error' ? 'red' : '#8B4000'; // dark orange
86
+ const color = message.type === 'error' ? 'red' : 'orange';
79
87
  return options?.html
80
- ? `<div class='luma-compiler-log-error' style="color:${color};"><b> ${message.type.toUpperCase()}: ${
88
+ ? `<div class='luma-compiler-log-${message.type}' style="color:${color};"><b> ${message.type.toUpperCase()}: ${
81
89
  message.message
82
90
  }</b></div>`
83
91
  : `${message.type.toUpperCase()}: ${message.message}`;
@@ -4,13 +4,10 @@
4
4
 
5
5
  import {log} from '../utils/log';
6
6
  import type {PrimitiveDataType, NormalizedDataType} from '../shadertypes/data-types/data-types';
7
- import type {AttributeShaderType} from '../shadertypes/data-types/shader-types';
8
- import type {VertexFormat} from '../shadertypes/vertex-arrays/vertex-formats';
9
- import {getAttributeShaderTypeInfo} from '../shadertypes/data-types/decode-shader-types';
10
- import {
11
- getVertexFormatInfo,
12
- getCompatibleVertexFormat
13
- } from '../shadertypes/vertex-arrays/decode-vertex-format';
7
+ import type {AttributeShaderType} from '../shadertypes/shader-types/shader-types';
8
+ import type {VertexFormat} from '../shadertypes/vertex-types/vertex-formats';
9
+ import {shaderTypeDecoder} from '../shadertypes/shader-types/shader-type-decoder';
10
+ import {vertexFormatDecoder} from '../shadertypes/vertex-types/vertex-format-decoder';
14
11
  import type {ShaderLayout, AttributeDeclaration} from '../adapter/types/shader-layout';
15
12
  import type {BufferLayout} from '../adapter/types/buffer-layout';
16
13
 
@@ -112,10 +109,10 @@ function getAttributeInfoFromLayouts(
112
109
  return null;
113
110
  }
114
111
 
115
- const attributeTypeInfo = getAttributeShaderTypeInfo(shaderDeclaration.type);
116
- const defaultVertexFormat = getCompatibleVertexFormat(attributeTypeInfo);
112
+ const attributeTypeInfo = shaderTypeDecoder.getAttributeShaderTypeInfo(shaderDeclaration.type);
113
+ const defaultVertexFormat = vertexFormatDecoder.getCompatibleVertexFormat(attributeTypeInfo);
117
114
  const vertexFormat = bufferMapping?.vertexFormat || defaultVertexFormat;
118
- const vertexFormatInfo = getVertexFormatInfo(vertexFormat);
115
+ const vertexFormatInfo = vertexFormatDecoder.getVertexFormatInfo(vertexFormat);
119
116
 
120
117
  return {
121
118
  attributeName: bufferMapping?.attributeName || shaderDeclaration.name,
@@ -217,7 +214,7 @@ function getAttributeFromAttributesList(
217
214
  // Calculate a default byte stride if not provided
218
215
  if (typeof bufferLayout.byteStride !== 'number') {
219
216
  for (const attributeMapping of bufferLayout.attributes || []) {
220
- const info = getVertexFormatInfo(attributeMapping.format);
217
+ const info = vertexFormatDecoder.getVertexFormatInfo(attributeMapping.format);
221
218
  // @ts-ignore
222
219
  byteStride += info.byteLength;
223
220
  }
@@ -0,0 +1,139 @@
1
+ // luma.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {
6
+ Bindings,
7
+ BindingsByGroup,
8
+ ComputeShaderLayout,
9
+ ShaderLayout
10
+ } from '../adapter/types/shader-layout';
11
+ import type {Device} from '../adapter/device';
12
+ import type {ComputePipeline} from '../adapter/resources/compute-pipeline';
13
+ import type {RenderPipeline} from '../adapter/resources/render-pipeline';
14
+ import {normalizeBindingsByGroup} from '../adapter-utils/bind-groups';
15
+
16
+ type AnyPipeline = RenderPipeline | ComputePipeline;
17
+ type AnyShaderLayout = ShaderLayout | ComputeShaderLayout;
18
+ type BindGroupCacheKeys = Partial<Record<number, object>>;
19
+ type BindGroupMap = Partial<Record<number, unknown>>;
20
+ type LayoutCache = Partial<Record<number, object>>;
21
+ type LayoutBindGroupCache = {
22
+ bindGroupsBySource: WeakMap<object, unknown | null>;
23
+ emptyBindGroup?: unknown;
24
+ };
25
+
26
+ export class BindGroupFactory {
27
+ readonly device: Device;
28
+
29
+ private readonly _layoutCacheByPipeline: WeakMap<AnyPipeline, LayoutCache> = new WeakMap();
30
+ private readonly _bindGroupCacheByLayout: WeakMap<object, LayoutBindGroupCache> = new WeakMap();
31
+
32
+ constructor(device: Device) {
33
+ this.device = device;
34
+ }
35
+
36
+ getBindGroups(
37
+ pipeline: AnyPipeline,
38
+ bindings?: Bindings | BindingsByGroup,
39
+ bindGroupCacheKeys?: BindGroupCacheKeys
40
+ ): BindGroupMap {
41
+ if (this.device.type !== 'webgpu' || pipeline.shaderLayout.bindings.length === 0) {
42
+ return {};
43
+ }
44
+
45
+ const bindingsByGroup = normalizeBindingsByGroup(pipeline.shaderLayout, bindings);
46
+ const resolvedBindGroups: BindGroupMap = {};
47
+
48
+ for (const group of getBindGroupIndicesUpToMax(pipeline.shaderLayout.bindings)) {
49
+ const groupBindings = bindingsByGroup[group];
50
+ const bindGroupLayout = this._getBindGroupLayout(pipeline, group);
51
+
52
+ if (!groupBindings || Object.keys(groupBindings).length === 0) {
53
+ if (!hasBindingsInGroup(pipeline.shaderLayout.bindings, group)) {
54
+ resolvedBindGroups[group] = this._getEmptyBindGroup(
55
+ bindGroupLayout,
56
+ pipeline.shaderLayout,
57
+ group
58
+ );
59
+ }
60
+ continue;
61
+ }
62
+
63
+ const bindGroupCacheKey = bindGroupCacheKeys?.[group];
64
+ if (bindGroupCacheKey) {
65
+ const layoutCache = this._getLayoutBindGroupCache(bindGroupLayout);
66
+ if (layoutCache.bindGroupsBySource.has(bindGroupCacheKey)) {
67
+ resolvedBindGroups[group] = layoutCache.bindGroupsBySource.get(bindGroupCacheKey) || null;
68
+ continue;
69
+ }
70
+
71
+ const bindGroup = this.device._createBindGroupWebGPU(
72
+ bindGroupLayout,
73
+ pipeline.shaderLayout,
74
+ groupBindings,
75
+ group
76
+ );
77
+ layoutCache.bindGroupsBySource.set(bindGroupCacheKey, bindGroup);
78
+ resolvedBindGroups[group] = bindGroup;
79
+ } else {
80
+ resolvedBindGroups[group] = this.device._createBindGroupWebGPU(
81
+ bindGroupLayout,
82
+ pipeline.shaderLayout,
83
+ groupBindings,
84
+ group
85
+ );
86
+ }
87
+ }
88
+
89
+ return resolvedBindGroups;
90
+ }
91
+
92
+ private _getBindGroupLayout(pipeline: AnyPipeline, group: number): object {
93
+ let layoutCache = this._layoutCacheByPipeline.get(pipeline);
94
+ if (!layoutCache) {
95
+ layoutCache = {};
96
+ this._layoutCacheByPipeline.set(pipeline, layoutCache);
97
+ }
98
+
99
+ layoutCache[group] ||= this.device._createBindGroupLayoutWebGPU(pipeline, group) as object;
100
+ return layoutCache[group];
101
+ }
102
+
103
+ private _getEmptyBindGroup(
104
+ bindGroupLayout: object,
105
+ shaderLayout: AnyShaderLayout,
106
+ group: number
107
+ ): unknown {
108
+ const layoutCache = this._getLayoutBindGroupCache(bindGroupLayout);
109
+ layoutCache.emptyBindGroup ||=
110
+ this.device._createBindGroupWebGPU(bindGroupLayout, shaderLayout, {}, group) || null;
111
+ return layoutCache.emptyBindGroup;
112
+ }
113
+
114
+ private _getLayoutBindGroupCache(bindGroupLayout: object): LayoutBindGroupCache {
115
+ let layoutCache = this._bindGroupCacheByLayout.get(bindGroupLayout);
116
+ if (!layoutCache) {
117
+ layoutCache = {bindGroupsBySource: new WeakMap()};
118
+ this._bindGroupCacheByLayout.set(bindGroupLayout, layoutCache);
119
+ }
120
+ return layoutCache;
121
+ }
122
+ }
123
+
124
+ export function _getDefaultBindGroupFactory(device: Device): BindGroupFactory {
125
+ device._factories.bindGroupFactory ||= new BindGroupFactory(device);
126
+ return device._factories.bindGroupFactory as BindGroupFactory;
127
+ }
128
+
129
+ function getBindGroupIndicesUpToMax(bindings: AnyShaderLayout['bindings']): number[] {
130
+ const maxGroup = bindings.reduce(
131
+ (highestGroup, binding) => Math.max(highestGroup, binding.group),
132
+ -1
133
+ );
134
+ return Array.from({length: maxGroup + 1}, (_, group) => group);
135
+ }
136
+
137
+ function hasBindingsInGroup(bindings: AnyShaderLayout['bindings'], group: number): boolean {
138
+ return bindings.some(binding => binding.group === group);
139
+ }
@@ -0,0 +1,11 @@
1
+ // luma.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {PipelineFactory} from './pipeline-factory';
6
+ import type {ShaderFactory} from './shader-factory';
7
+
8
+ export type CoreModuleState = {
9
+ defaultPipelineFactory?: PipelineFactory;
10
+ defaultShaderFactory?: ShaderFactory;
11
+ };