@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
@@ -0,0 +1,54 @@
1
+ import { Device } from "../adapter/device.js";
2
+ import { ComputePipeline, type ComputePipelineProps } from "../adapter/resources/compute-pipeline.js";
3
+ import { RenderPipeline, type RenderPipelineProps } from "../adapter/resources/render-pipeline.js";
4
+ import type { SharedRenderPipeline } from "../adapter/resources/shared-render-pipeline.js";
5
+ export type PipelineFactoryProps = RenderPipelineProps;
6
+ /**
7
+ * Efficiently creates / caches pipelines
8
+ */
9
+ export declare class PipelineFactory {
10
+ static defaultProps: Required<PipelineFactoryProps>;
11
+ /** Get the singleton default pipeline factory for the specified device */
12
+ static getDefaultPipelineFactory(device: Device): PipelineFactory;
13
+ readonly device: Device;
14
+ private _hashCounter;
15
+ private readonly _hashes;
16
+ private readonly _renderPipelineCache;
17
+ private readonly _computePipelineCache;
18
+ private readonly _sharedRenderPipelineCache;
19
+ get [Symbol.toStringTag](): string;
20
+ toString(): string;
21
+ constructor(device: Device);
22
+ /**
23
+ * WebGL has two cache layers with different priorities:
24
+ * - `_sharedRenderPipelineCache` owns `WEBGLSharedRenderPipeline` / `WebGLProgram` reuse.
25
+ * - `_renderPipelineCache` owns `RenderPipeline` wrapper reuse.
26
+ *
27
+ * Shared WebGL program reuse is the hard requirement. Wrapper reuse is beneficial,
28
+ * but wrapper cache misses are acceptable if that keeps the cache logic simple and
29
+ * prevents incorrect cache hits.
30
+ *
31
+ * In particular, wrapper hash logic must never force program creation or linked-program
32
+ * introspection just to decide whether a shared WebGL program can be reused.
33
+ */
34
+ /** Return a RenderPipeline matching supplied props. Reuses an equivalent pipeline if already created. */
35
+ createRenderPipeline(props: RenderPipelineProps): RenderPipeline;
36
+ /** Return a ComputePipeline matching supplied props. Reuses an equivalent pipeline if already created. */
37
+ createComputePipeline(props: ComputePipelineProps): ComputePipeline;
38
+ release(pipeline: RenderPipeline | ComputePipeline): void;
39
+ createSharedRenderPipeline(props: RenderPipelineProps): SharedRenderPipeline;
40
+ releaseSharedRenderPipeline(pipeline: RenderPipeline): void;
41
+ /** Destroy a cached pipeline, removing it from the cache if configured to do so. */
42
+ private _destroyPipeline;
43
+ /** Get the appropriate cache for the type of pipeline */
44
+ private _getCache;
45
+ /** Calculate a hash based on all the inputs for a compute pipeline */
46
+ private _hashComputePipeline;
47
+ /** Calculate a hash based on all the inputs for a render pipeline */
48
+ private _hashRenderPipeline;
49
+ private _hashSharedRenderPipeline;
50
+ private _getHash;
51
+ private _getWebGLVaryingHash;
52
+ private _getWebGPUAttachmentHash;
53
+ }
54
+ //# sourceMappingURL=pipeline-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-factory.d.ts","sourceRoot":"","sources":["../../src/factories/pipeline-factory.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,MAAM,EAAC,6BAA0B;AACzC,OAAO,EAAC,eAAe,EAAE,KAAK,oBAAoB,EAAC,iDAA8C;AACjG,OAAO,EAAC,cAAc,EAAE,KAAK,mBAAmB,EAAC,gDAA6C;AAE9F,OAAO,KAAK,EAAC,oBAAoB,EAAC,uDAAoD;AAKtF,MAAM,MAAM,oBAAoB,GAAG,mBAAmB,CAAC;AAIvD;;GAEG;AACH,qBAAa,eAAe;IAC1B,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,oBAAoB,CAAC,CAAoC;IAEvF,0EAA0E;IAC1E,MAAM,CAAC,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe;IAMjE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAiD;IACtF,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAkD;IACxF,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAuD;IAElG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,CAEjC;IAED,QAAQ,IAAI,MAAM;gBAIN,MAAM,EAAE,MAAM;IAI1B;;;;;;;;;;;OAWG;IACH,yGAAyG;IACzG,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,GAAG,cAAc;IAuChE,0GAA0G;IAC1G,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,GAAG,eAAe;IAkCnE,OAAO,CAAC,QAAQ,EAAE,cAAc,GAAG,eAAe,GAAG,IAAI;IAuBzD,0BAA0B,CAAC,KAAK,EAAE,mBAAmB,GAAG,oBAAoB;IAY5E,2BAA2B,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAoB3D,oFAAoF;IACpF,OAAO,CAAC,gBAAgB;IAexB,yDAAyD;IACzD,OAAO,CAAC,SAAS;IAsBjB,sEAAsE;IACtE,OAAO,CAAC,oBAAoB;IAO5B,qEAAqE;IACrE,OAAO,CAAC,mBAAmB;IAqD3B,OAAO,CAAC,yBAAyB;IAOjC,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,oBAAoB;IAK5B,OAAO,CAAC,wBAAwB;CAejC"}
@@ -0,0 +1,270 @@
1
+ // luma.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { ComputePipeline } from "../adapter/resources/compute-pipeline.js";
5
+ import { RenderPipeline } from "../adapter/resources/render-pipeline.js";
6
+ import { log } from "../utils/log.js";
7
+ import { uid } from "../utils/uid.js";
8
+ /**
9
+ * Efficiently creates / caches pipelines
10
+ */
11
+ export class PipelineFactory {
12
+ static defaultProps = { ...RenderPipeline.defaultProps };
13
+ /** Get the singleton default pipeline factory for the specified device */
14
+ static getDefaultPipelineFactory(device) {
15
+ const moduleData = device.getModuleData('@luma.gl/core');
16
+ moduleData.defaultPipelineFactory ||= new PipelineFactory(device);
17
+ return moduleData.defaultPipelineFactory;
18
+ }
19
+ device;
20
+ _hashCounter = 0;
21
+ _hashes = {};
22
+ _renderPipelineCache = {};
23
+ _computePipelineCache = {};
24
+ _sharedRenderPipelineCache = {};
25
+ get [Symbol.toStringTag]() {
26
+ return 'PipelineFactory';
27
+ }
28
+ toString() {
29
+ return `PipelineFactory(${this.device.id})`;
30
+ }
31
+ constructor(device) {
32
+ this.device = device;
33
+ }
34
+ /**
35
+ * WebGL has two cache layers with different priorities:
36
+ * - `_sharedRenderPipelineCache` owns `WEBGLSharedRenderPipeline` / `WebGLProgram` reuse.
37
+ * - `_renderPipelineCache` owns `RenderPipeline` wrapper reuse.
38
+ *
39
+ * Shared WebGL program reuse is the hard requirement. Wrapper reuse is beneficial,
40
+ * but wrapper cache misses are acceptable if that keeps the cache logic simple and
41
+ * prevents incorrect cache hits.
42
+ *
43
+ * In particular, wrapper hash logic must never force program creation or linked-program
44
+ * introspection just to decide whether a shared WebGL program can be reused.
45
+ */
46
+ /** Return a RenderPipeline matching supplied props. Reuses an equivalent pipeline if already created. */
47
+ createRenderPipeline(props) {
48
+ if (!this.device.props._cachePipelines) {
49
+ return this.device.createRenderPipeline(props);
50
+ }
51
+ const allProps = { ...RenderPipeline.defaultProps, ...props };
52
+ const cache = this._renderPipelineCache;
53
+ const hash = this._hashRenderPipeline(allProps);
54
+ let pipeline = cache[hash]?.resource;
55
+ if (!pipeline) {
56
+ const sharedRenderPipeline = this.device.type === 'webgl' && this.device.props._sharePipelines
57
+ ? this.createSharedRenderPipeline(allProps)
58
+ : undefined;
59
+ pipeline = this.device.createRenderPipeline({
60
+ ...allProps,
61
+ id: allProps.id ? `${allProps.id}-cached` : uid('unnamed-cached'),
62
+ _sharedRenderPipeline: sharedRenderPipeline
63
+ });
64
+ pipeline.hash = hash;
65
+ cache[hash] = { resource: pipeline, useCount: 1 };
66
+ if (this.device.props.debugFactories) {
67
+ log.log(3, `${this}: ${pipeline} created, count=${cache[hash].useCount}`)();
68
+ }
69
+ }
70
+ else {
71
+ cache[hash].useCount++;
72
+ if (this.device.props.debugFactories) {
73
+ log.log(3, `${this}: ${cache[hash].resource} reused, count=${cache[hash].useCount}, (id=${props.id})`)();
74
+ }
75
+ }
76
+ return pipeline;
77
+ }
78
+ /** Return a ComputePipeline matching supplied props. Reuses an equivalent pipeline if already created. */
79
+ createComputePipeline(props) {
80
+ if (!this.device.props._cachePipelines) {
81
+ return this.device.createComputePipeline(props);
82
+ }
83
+ const allProps = { ...ComputePipeline.defaultProps, ...props };
84
+ const cache = this._computePipelineCache;
85
+ const hash = this._hashComputePipeline(allProps);
86
+ let pipeline = cache[hash]?.resource;
87
+ if (!pipeline) {
88
+ pipeline = this.device.createComputePipeline({
89
+ ...allProps,
90
+ id: allProps.id ? `${allProps.id}-cached` : undefined
91
+ });
92
+ pipeline.hash = hash;
93
+ cache[hash] = { resource: pipeline, useCount: 1 };
94
+ if (this.device.props.debugFactories) {
95
+ log.log(3, `${this}: ${pipeline} created, count=${cache[hash].useCount}`)();
96
+ }
97
+ }
98
+ else {
99
+ cache[hash].useCount++;
100
+ if (this.device.props.debugFactories) {
101
+ log.log(3, `${this}: ${cache[hash].resource} reused, count=${cache[hash].useCount}, (id=${props.id})`)();
102
+ }
103
+ }
104
+ return pipeline;
105
+ }
106
+ release(pipeline) {
107
+ if (!this.device.props._cachePipelines) {
108
+ pipeline.destroy();
109
+ return;
110
+ }
111
+ const cache = this._getCache(pipeline);
112
+ const hash = pipeline.hash;
113
+ cache[hash].useCount--;
114
+ if (cache[hash].useCount === 0) {
115
+ this._destroyPipeline(pipeline);
116
+ if (this.device.props.debugFactories) {
117
+ log.log(3, `${this}: ${pipeline} released and destroyed`)();
118
+ }
119
+ }
120
+ else if (cache[hash].useCount < 0) {
121
+ log.error(`${this}: ${pipeline} released, useCount < 0, resetting`)();
122
+ cache[hash].useCount = 0;
123
+ }
124
+ else if (this.device.props.debugFactories) {
125
+ log.log(3, `${this}: ${pipeline} released, count=${cache[hash].useCount}`)();
126
+ }
127
+ }
128
+ createSharedRenderPipeline(props) {
129
+ const sharedPipelineHash = this._hashSharedRenderPipeline(props);
130
+ let sharedCacheItem = this._sharedRenderPipelineCache[sharedPipelineHash];
131
+ if (!sharedCacheItem) {
132
+ const sharedRenderPipeline = this.device._createSharedRenderPipelineWebGL(props);
133
+ sharedCacheItem = { resource: sharedRenderPipeline, useCount: 0 };
134
+ this._sharedRenderPipelineCache[sharedPipelineHash] = sharedCacheItem;
135
+ }
136
+ sharedCacheItem.useCount++;
137
+ return sharedCacheItem.resource;
138
+ }
139
+ releaseSharedRenderPipeline(pipeline) {
140
+ if (!pipeline.sharedRenderPipeline) {
141
+ return;
142
+ }
143
+ const sharedPipelineHash = this._hashSharedRenderPipeline(pipeline.sharedRenderPipeline.props);
144
+ const sharedCacheItem = this._sharedRenderPipelineCache[sharedPipelineHash];
145
+ if (!sharedCacheItem) {
146
+ return;
147
+ }
148
+ sharedCacheItem.useCount--;
149
+ if (sharedCacheItem.useCount === 0) {
150
+ sharedCacheItem.resource.destroy();
151
+ delete this._sharedRenderPipelineCache[sharedPipelineHash];
152
+ }
153
+ }
154
+ // PRIVATE
155
+ /** Destroy a cached pipeline, removing it from the cache if configured to do so. */
156
+ _destroyPipeline(pipeline) {
157
+ const cache = this._getCache(pipeline);
158
+ if (!this.device.props._destroyPipelines) {
159
+ return false;
160
+ }
161
+ delete cache[pipeline.hash];
162
+ pipeline.destroy();
163
+ if (pipeline instanceof RenderPipeline) {
164
+ this.releaseSharedRenderPipeline(pipeline);
165
+ }
166
+ return true;
167
+ }
168
+ /** Get the appropriate cache for the type of pipeline */
169
+ _getCache(pipeline) {
170
+ let cache;
171
+ if (pipeline instanceof ComputePipeline) {
172
+ cache = this._computePipelineCache;
173
+ }
174
+ if (pipeline instanceof RenderPipeline) {
175
+ cache = this._renderPipelineCache;
176
+ }
177
+ if (!cache) {
178
+ throw new Error(`${this}`);
179
+ }
180
+ if (!cache[pipeline.hash]) {
181
+ throw new Error(`${this}: ${pipeline} matched incorrect entry`);
182
+ }
183
+ return cache;
184
+ }
185
+ /** Calculate a hash based on all the inputs for a compute pipeline */
186
+ _hashComputePipeline(props) {
187
+ const { type } = this.device;
188
+ const shaderHash = this._getHash(props.shader.source);
189
+ const shaderLayoutHash = this._getHash(JSON.stringify(props.shaderLayout));
190
+ return `${type}/C/${shaderHash}SL${shaderLayoutHash}`;
191
+ }
192
+ /** Calculate a hash based on all the inputs for a render pipeline */
193
+ _hashRenderPipeline(props) {
194
+ // Backend-specific hashing requirements:
195
+ // - WebGPU hash keys must include every immutable descriptor-shaping input that can
196
+ // change the created `GPURenderPipeline`, including attachment formats.
197
+ // - WebGL hash keys only govern wrapper reuse. They must remain compatible with
198
+ // shared-program reuse and must not depend on linked-program introspection just
199
+ // to decide whether a shared `WebGLProgram` can be reused.
200
+ //
201
+ // General exclusions:
202
+ // - `id`, `handle`: resource identity / caller-supplied handles, not cache shape
203
+ // - `bindings`: mutable per-pipeline compatibility state
204
+ // - `disableWarnings`: logging only, no rendering impact
205
+ // - `vsConstants`, `fsConstants`: currently unused by pipeline creation
206
+ const vsHash = props.vs ? this._getHash(props.vs.source) : 0;
207
+ const fsHash = props.fs ? this._getHash(props.fs.source) : 0;
208
+ const varyingHash = this._getWebGLVaryingHash(props);
209
+ const shaderLayoutHash = this._getHash(JSON.stringify(props.shaderLayout));
210
+ const bufferLayoutHash = this._getHash(JSON.stringify(props.bufferLayout));
211
+ const { type } = this.device;
212
+ switch (type) {
213
+ case 'webgl':
214
+ // WebGL wrappers preserve default topology and parameter semantics for direct
215
+ // callers, even though the underlying linked program may be shared separately.
216
+ // Future WebGL-only additions here must not turn wrapper reuse into a prerequisite
217
+ // for shared `WebGLProgram` reuse.
218
+ const webglParameterHash = this._getHash(JSON.stringify(props.parameters));
219
+ return `${type}/R/${vsHash}/${fsHash}V${varyingHash}T${props.topology}P${webglParameterHash}SL${shaderLayoutHash}BL${bufferLayoutHash}`;
220
+ case 'webgpu':
221
+ default:
222
+ // On WebGPU we need to rebuild the pipeline if topology, entry points,
223
+ // shader/layout data, parameters, bufferLayout or attachment formats change.
224
+ // Attachment formats must stay in the key so screen and offscreen passes do not
225
+ // accidentally alias the same cached `GPURenderPipeline`.
226
+ const entryPointHash = this._getHash(JSON.stringify({
227
+ vertexEntryPoint: props.vertexEntryPoint,
228
+ fragmentEntryPoint: props.fragmentEntryPoint
229
+ }));
230
+ const parameterHash = this._getHash(JSON.stringify(props.parameters));
231
+ const attachmentHash = this._getWebGPUAttachmentHash(props);
232
+ // TODO - Can json.stringify() generate different strings for equivalent objects if order of params is different?
233
+ // create a deepHash() to deduplicate?
234
+ return `${type}/R/${vsHash}/${fsHash}V${varyingHash}T${props.topology}EP${entryPointHash}P${parameterHash}SL${shaderLayoutHash}BL${bufferLayoutHash}A${attachmentHash}`;
235
+ }
236
+ }
237
+ // This is the only gate for shared `WebGLProgram` reuse.
238
+ // Only include inputs that affect program linking or transform-feedback linkage.
239
+ // Wrapper-only concerns such as topology, parameters, attachment formats and layout
240
+ // overrides must not be added here.
241
+ _hashSharedRenderPipeline(props) {
242
+ const vsHash = props.vs ? this._getHash(props.vs.source) : 0;
243
+ const fsHash = props.fs ? this._getHash(props.fs.source) : 0;
244
+ const varyingHash = this._getWebGLVaryingHash(props);
245
+ return `webgl/S/${vsHash}/${fsHash}V${varyingHash}`;
246
+ }
247
+ _getHash(key) {
248
+ if (this._hashes[key] === undefined) {
249
+ this._hashes[key] = this._hashCounter++;
250
+ }
251
+ return this._hashes[key];
252
+ }
253
+ _getWebGLVaryingHash(props) {
254
+ const { varyings = [], bufferMode = null } = props;
255
+ return this._getHash(JSON.stringify({ varyings, bufferMode }));
256
+ }
257
+ _getWebGPUAttachmentHash(props) {
258
+ const colorAttachmentFormats = props.colorAttachmentFormats ?? [
259
+ this.device.preferredColorFormat
260
+ ];
261
+ const depthStencilAttachmentFormat = props.parameters?.depthWriteEnabled
262
+ ? props.depthStencilAttachmentFormat || this.device.preferredDepthFormat
263
+ : null;
264
+ return this._getHash(JSON.stringify({
265
+ colorAttachmentFormats,
266
+ depthStencilAttachmentFormat
267
+ }));
268
+ }
269
+ }
270
+ //# sourceMappingURL=pipeline-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-factory.js","sourceRoot":"","sources":["../../src/factories/pipeline-factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { Device } from "../adapter/device.js";
2
+ import { Shader, type ShaderProps } from "../adapter/resources/shader.js";
3
+ /** Manages a cached pool of Shaders for reuse. */
4
+ export declare class ShaderFactory {
5
+ static readonly defaultProps: Required<ShaderProps>;
6
+ /** Returns the default ShaderFactory for the given {@link Device}, creating one if necessary. */
7
+ static getDefaultShaderFactory(device: Device): ShaderFactory;
8
+ readonly device: Device;
9
+ private readonly _cache;
10
+ get [Symbol.toStringTag](): string;
11
+ toString(): string;
12
+ /** @internal */
13
+ constructor(device: Device);
14
+ /** Requests a {@link Shader} from the cache, creating a new Shader only if necessary. */
15
+ createShader(props: ShaderProps): Shader;
16
+ /** Releases a previously-requested {@link Shader}, destroying it if no users remain. */
17
+ release(shader: Shader): void;
18
+ protected _hashShader(value: Shader | ShaderProps): string;
19
+ }
20
+ //# sourceMappingURL=shader-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader-factory.d.ts","sourceRoot":"","sources":["../../src/factories/shader-factory.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,MAAM,EAAC,6BAA0B;AACzC,OAAO,EAAC,MAAM,EAAE,KAAK,WAAW,EAAC,uCAAoC;AAMrE,kDAAkD;AAClD,qBAAa,aAAa;IACxB,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,WAAW,CAAC,CAA4B;IAE/E,iGAAiG;IACjG,MAAM,CAAC,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa;IAM7D,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IAExD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,CAEjC;IAED,QAAQ,IAAI,MAAM;IAIlB,gBAAgB;gBACJ,MAAM,EAAE,MAAM;IAI1B,yFAAyF;IACzF,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM;IA8BxC,wFAAwF;IACxF,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IA4B7B,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM;CAG3D"}
@@ -0,0 +1,84 @@
1
+ // luma.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import { Shader } from "../adapter/resources/shader.js";
5
+ import { log } from "../utils/log.js";
6
+ /** Manages a cached pool of Shaders for reuse. */
7
+ export class ShaderFactory {
8
+ static defaultProps = { ...Shader.defaultProps };
9
+ /** Returns the default ShaderFactory for the given {@link Device}, creating one if necessary. */
10
+ static getDefaultShaderFactory(device) {
11
+ const moduleData = device.getModuleData('@luma.gl/core');
12
+ moduleData.defaultShaderFactory ||= new ShaderFactory(device);
13
+ return moduleData.defaultShaderFactory;
14
+ }
15
+ device;
16
+ _cache = {};
17
+ get [Symbol.toStringTag]() {
18
+ return 'ShaderFactory';
19
+ }
20
+ toString() {
21
+ return `${this[Symbol.toStringTag]}(${this.device.id})`;
22
+ }
23
+ /** @internal */
24
+ constructor(device) {
25
+ this.device = device;
26
+ }
27
+ /** Requests a {@link Shader} from the cache, creating a new Shader only if necessary. */
28
+ createShader(props) {
29
+ if (!this.device.props._cacheShaders) {
30
+ return this.device.createShader(props);
31
+ }
32
+ const key = this._hashShader(props);
33
+ let cacheEntry = this._cache[key];
34
+ if (!cacheEntry) {
35
+ const resource = this.device.createShader({
36
+ ...props,
37
+ id: props.id ? `${props.id}-cached` : undefined
38
+ });
39
+ this._cache[key] = cacheEntry = { resource, useCount: 1 };
40
+ if (this.device.props.debugFactories) {
41
+ log.log(3, `${this}: Created new shader ${resource.id}`)();
42
+ }
43
+ }
44
+ else {
45
+ cacheEntry.useCount++;
46
+ if (this.device.props.debugFactories) {
47
+ log.log(3, `${this}: Reusing shader ${cacheEntry.resource.id} count=${cacheEntry.useCount}`)();
48
+ }
49
+ }
50
+ return cacheEntry.resource;
51
+ }
52
+ /** Releases a previously-requested {@link Shader}, destroying it if no users remain. */
53
+ release(shader) {
54
+ if (!this.device.props._cacheShaders) {
55
+ shader.destroy();
56
+ return;
57
+ }
58
+ const key = this._hashShader(shader);
59
+ const cacheEntry = this._cache[key];
60
+ if (cacheEntry) {
61
+ cacheEntry.useCount--;
62
+ if (cacheEntry.useCount === 0) {
63
+ if (this.device.props._destroyShaders) {
64
+ delete this._cache[key];
65
+ cacheEntry.resource.destroy();
66
+ if (this.device.props.debugFactories) {
67
+ log.log(3, `${this}: Releasing shader ${shader.id}, destroyed`)();
68
+ }
69
+ }
70
+ }
71
+ else if (cacheEntry.useCount < 0) {
72
+ throw new Error(`ShaderFactory: Shader ${shader.id} released too many times`);
73
+ }
74
+ else if (this.device.props.debugFactories) {
75
+ log.log(3, `${this}: Releasing shader ${shader.id} count=${cacheEntry.useCount}`)();
76
+ }
77
+ }
78
+ }
79
+ // PRIVATE
80
+ _hashShader(value) {
81
+ return `${value.stage}:${value.source}`;
82
+ }
83
+ }
84
+ //# sourceMappingURL=shader-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shader-factory.js","sourceRoot":"","sources":["../../src/factories/shader-factory.ts"],"names":[],"mappings":"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"}