@luma.gl/webgl 9.0.0-alpha.9 → 9.0.0-beta.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 (553) hide show
  1. package/LICENSE +3 -1
  2. package/dist/adapter/converters/device-parameters.d.ts +12 -3
  3. package/dist/adapter/converters/device-parameters.d.ts.map +1 -1
  4. package/dist/adapter/converters/device-parameters.js +300 -146
  5. package/dist/adapter/converters/sampler-parameters.d.ts +3 -13
  6. package/dist/adapter/converters/sampler-parameters.d.ts.map +1 -1
  7. package/dist/adapter/converters/sampler-parameters.js +74 -219
  8. package/dist/adapter/converters/shader-formats.d.ts +9 -0
  9. package/dist/adapter/converters/shader-formats.d.ts.map +1 -0
  10. package/dist/adapter/converters/shader-formats.js +59 -0
  11. package/dist/adapter/converters/texture-formats.d.ts +41 -57
  12. package/dist/adapter/converters/texture-formats.d.ts.map +1 -1
  13. package/dist/adapter/converters/texture-formats.js +490 -925
  14. package/dist/adapter/converters/vertex-formats.d.ts +9 -3
  15. package/dist/adapter/converters/vertex-formats.d.ts.map +1 -1
  16. package/dist/adapter/converters/vertex-formats.js +56 -33
  17. package/dist/adapter/device-helpers/webgl-device-features.d.ts +20 -0
  18. package/dist/adapter/device-helpers/webgl-device-features.d.ts.map +1 -0
  19. package/dist/adapter/device-helpers/webgl-device-features.js +98 -0
  20. package/dist/adapter/device-helpers/webgl-device-info.d.ts +5 -0
  21. package/dist/adapter/device-helpers/webgl-device-info.d.ts.map +1 -0
  22. package/dist/adapter/device-helpers/webgl-device-info.js +90 -0
  23. package/dist/adapter/device-helpers/webgl-device-limits.d.ts +35 -0
  24. package/dist/adapter/device-helpers/webgl-device-limits.d.ts.map +1 -0
  25. package/dist/adapter/device-helpers/webgl-device-limits.js +47 -0
  26. package/dist/adapter/helpers/decode-webgl-types.d.ts +26 -0
  27. package/dist/adapter/helpers/decode-webgl-types.d.ts.map +1 -0
  28. package/dist/adapter/helpers/decode-webgl-types.js +101 -0
  29. package/dist/adapter/helpers/get-shader-layout.d.ts +2 -49
  30. package/dist/adapter/helpers/get-shader-layout.d.ts.map +1 -1
  31. package/dist/adapter/helpers/get-shader-layout.js +263 -307
  32. package/dist/adapter/helpers/parse-shader-compiler-log.d.ts +1 -1
  33. package/dist/adapter/helpers/parse-shader-compiler-log.d.ts.map +1 -1
  34. package/dist/adapter/helpers/parse-shader-compiler-log.js +48 -33
  35. package/dist/adapter/helpers/set-uniform.d.ts +3 -2
  36. package/dist/adapter/helpers/set-uniform.d.ts.map +1 -1
  37. package/dist/adapter/helpers/set-uniform.js +66 -111
  38. package/dist/adapter/helpers/webgl-topology-utils.d.ts +16 -0
  39. package/dist/adapter/helpers/webgl-topology-utils.d.ts.map +1 -0
  40. package/dist/adapter/helpers/webgl-topology-utils.js +88 -0
  41. package/dist/adapter/objects/constants-to-keys.d.ts +2 -4
  42. package/dist/adapter/objects/constants-to-keys.d.ts.map +1 -1
  43. package/dist/adapter/objects/constants-to-keys.js +18 -38
  44. package/dist/adapter/objects/webgl-renderbuffer.d.ts +15 -12
  45. package/dist/adapter/objects/webgl-renderbuffer.d.ts.map +1 -1
  46. package/dist/adapter/objects/webgl-renderbuffer.js +92 -91
  47. package/dist/adapter/objects/webgl-resource.d.ts +6 -31
  48. package/dist/adapter/objects/webgl-resource.d.ts.map +1 -1
  49. package/dist/adapter/objects/webgl-resource.js +103 -205
  50. package/dist/adapter/resources/webgl-buffer.d.ts +20 -16
  51. package/dist/adapter/resources/webgl-buffer.d.ts.map +1 -1
  52. package/dist/adapter/resources/webgl-buffer.js +163 -155
  53. package/dist/adapter/resources/webgl-command-buffer.d.ts +15 -9
  54. package/dist/adapter/resources/webgl-command-buffer.d.ts.map +1 -1
  55. package/dist/adapter/resources/webgl-command-buffer.js +283 -58
  56. package/dist/adapter/resources/webgl-command-encoder.d.ts +12 -6
  57. package/dist/adapter/resources/webgl-command-encoder.d.ts.map +1 -1
  58. package/dist/adapter/resources/webgl-command-encoder.js +36 -52
  59. package/dist/adapter/resources/webgl-external-texture.js +93 -1
  60. package/dist/adapter/resources/webgl-framebuffer.d.ts +21 -29
  61. package/dist/adapter/resources/webgl-framebuffer.d.ts.map +1 -1
  62. package/dist/adapter/resources/webgl-framebuffer.js +184 -261
  63. package/dist/adapter/resources/webgl-query-set.d.ts +44 -0
  64. package/dist/adapter/resources/webgl-query-set.d.ts.map +1 -0
  65. package/dist/adapter/resources/webgl-query-set.js +136 -0
  66. package/dist/adapter/resources/webgl-render-pass.d.ts +21 -4
  67. package/dist/adapter/resources/webgl-render-pass.d.ts.map +1 -1
  68. package/dist/adapter/resources/webgl-render-pass.js +140 -20
  69. package/dist/adapter/resources/webgl-render-pipeline.d.ts +44 -21
  70. package/dist/adapter/resources/webgl-render-pipeline.d.ts.map +1 -1
  71. package/dist/adapter/resources/webgl-render-pipeline.js +371 -413
  72. package/dist/adapter/resources/webgl-sampler.d.ts +5 -6
  73. package/dist/adapter/resources/webgl-sampler.d.ts.map +1 -1
  74. package/dist/adapter/resources/webgl-sampler.js +46 -46
  75. package/dist/adapter/resources/webgl-shader.d.ts +16 -6
  76. package/dist/adapter/resources/webgl-shader.d.ts.map +1 -1
  77. package/dist/adapter/resources/webgl-shader.js +113 -72
  78. package/dist/adapter/resources/webgl-texture-view.d.ts +14 -0
  79. package/dist/adapter/resources/webgl-texture-view.d.ts.map +1 -0
  80. package/dist/adapter/resources/webgl-texture-view.js +18 -0
  81. package/dist/adapter/resources/webgl-texture.d.ts +53 -35
  82. package/dist/adapter/resources/webgl-texture.d.ts.map +1 -1
  83. package/dist/adapter/resources/webgl-texture.js +623 -822
  84. package/dist/adapter/resources/webgl-transform-feedback.d.ts +47 -0
  85. package/dist/adapter/resources/webgl-transform-feedback.d.ts.map +1 -0
  86. package/dist/adapter/resources/webgl-transform-feedback.js +162 -0
  87. package/dist/adapter/resources/webgl-vertex-array.d.ts +67 -0
  88. package/dist/adapter/resources/webgl-vertex-array.d.ts.map +1 -0
  89. package/dist/adapter/resources/webgl-vertex-array.js +239 -0
  90. package/dist/adapter/webgl-canvas-context.d.ts +6 -7
  91. package/dist/adapter/webgl-canvas-context.d.ts.map +1 -1
  92. package/dist/adapter/webgl-canvas-context.js +61 -50
  93. package/dist/adapter/webgl-device.d.ts +112 -55
  94. package/dist/adapter/webgl-device.d.ts.map +1 -1
  95. package/dist/adapter/webgl-device.js +453 -331
  96. package/dist/classic/accessor.d.ts +3 -3
  97. package/dist/classic/accessor.d.ts.map +1 -1
  98. package/dist/classic/accessor.js +135 -130
  99. package/dist/classic/clear.d.ts +22 -0
  100. package/dist/classic/clear.d.ts.map +1 -0
  101. package/dist/classic/clear.js +89 -0
  102. package/dist/classic/copy-and-blit.d.ts +62 -0
  103. package/dist/classic/copy-and-blit.d.ts.map +1 -0
  104. package/dist/classic/copy-and-blit.js +191 -0
  105. package/dist/classic/format-utils.d.ts +3 -0
  106. package/dist/classic/format-utils.d.ts.map +1 -0
  107. package/dist/classic/format-utils.js +44 -0
  108. package/dist/classic/typed-array-utils.d.ts +17 -17
  109. package/dist/classic/typed-array-utils.d.ts.map +1 -1
  110. package/dist/classic/typed-array-utils.js +96 -102
  111. package/dist/context/debug/spector.d.ts +1 -2
  112. package/dist/context/debug/spector.d.ts.map +1 -1
  113. package/dist/context/debug/spector.js +56 -63
  114. package/dist/context/debug/webgl-developer-tools.d.ts +2 -3
  115. package/dist/context/debug/webgl-developer-tools.d.ts.map +1 -1
  116. package/dist/context/debug/webgl-developer-tools.js +106 -102
  117. package/dist/context/helpers/create-browser-context.d.ts +35 -0
  118. package/dist/context/helpers/create-browser-context.d.ts.map +1 -0
  119. package/dist/context/helpers/create-browser-context.js +67 -0
  120. package/dist/context/helpers/webgl-context-data.d.ts +13 -0
  121. package/dist/context/helpers/webgl-context-data.d.ts.map +1 -0
  122. package/dist/context/helpers/webgl-context-data.js +21 -0
  123. package/dist/context/helpers/webgl-extensions.d.ts +4 -0
  124. package/dist/context/helpers/webgl-extensions.d.ts.map +1 -0
  125. package/dist/context/helpers/webgl-extensions.js +10 -0
  126. package/dist/context/parameters/unified-parameter-api.d.ts +4 -5
  127. package/dist/context/parameters/unified-parameter-api.d.ts.map +1 -1
  128. package/dist/context/parameters/unified-parameter-api.js +91 -54
  129. package/dist/context/parameters/webgl-parameter-tables.d.ts +115 -106
  130. package/dist/context/parameters/webgl-parameter-tables.d.ts.map +1 -1
  131. package/dist/context/parameters/webgl-parameter-tables.js +463 -423
  132. package/dist/context/state-tracker/deep-array-equal.d.ts.map +1 -1
  133. package/dist/context/state-tracker/deep-array-equal.js +19 -18
  134. package/dist/context/state-tracker/track-context-state.d.ts +4 -4
  135. package/dist/context/state-tracker/track-context-state.d.ts.map +1 -1
  136. package/dist/context/state-tracker/track-context-state.js +192 -163
  137. package/dist/context/state-tracker/with-parameters.d.ts +2 -2
  138. package/dist/context/state-tracker/with-parameters.d.ts.map +1 -1
  139. package/dist/context/state-tracker/with-parameters.js +44 -32
  140. package/dist/dist.dev.js +6574 -0
  141. package/dist/dist.min.js +10 -0
  142. package/dist/index.cjs +5586 -0
  143. package/dist/index.cjs.map +7 -0
  144. package/dist/index.d.ts +25 -32
  145. package/dist/index.d.ts.map +1 -1
  146. package/dist/index.js +37 -28
  147. package/dist/types.d.ts +3 -1
  148. package/dist/types.d.ts.map +1 -1
  149. package/dist/types.js +3 -1
  150. package/dist.min.js +19 -0
  151. package/package.json +22 -15
  152. package/src/adapter/converters/device-parameters.ts +217 -54
  153. package/src/adapter/converters/sampler-parameters.ts +46 -126
  154. package/src/adapter/converters/shader-formats.ts +69 -0
  155. package/src/adapter/converters/texture-formats.ts +369 -340
  156. package/src/adapter/converters/vertex-formats.ts +71 -10
  157. package/src/adapter/device-helpers/webgl-device-features.ts +121 -0
  158. package/src/adapter/device-helpers/webgl-device-info.ts +111 -0
  159. package/src/adapter/device-helpers/webgl-device-limits.ts +53 -0
  160. package/src/adapter/helpers/{uniforms.ts → decode-webgl-types.ts} +38 -25
  161. package/src/adapter/helpers/get-shader-layout.ts +104 -158
  162. package/src/adapter/helpers/parse-shader-compiler-log.ts +31 -11
  163. package/src/adapter/helpers/set-uniform.ts +39 -36
  164. package/src/adapter/helpers/webgl-topology-utils.ts +110 -0
  165. package/src/adapter/objects/constants-to-keys.ts +8 -26
  166. package/src/adapter/objects/webgl-renderbuffer.ts +68 -40
  167. package/src/adapter/objects/webgl-resource.ts +16 -156
  168. package/src/adapter/resources/webgl-buffer.ts +103 -112
  169. package/src/adapter/resources/webgl-command-buffer.ts +333 -41
  170. package/src/adapter/resources/webgl-command-encoder.ts +33 -22
  171. package/src/adapter/resources/webgl-external-texture.ts +11 -8
  172. package/src/adapter/resources/webgl-framebuffer.ts +125 -165
  173. package/src/adapter/resources/webgl-query-set.ts +171 -0
  174. package/src/adapter/resources/webgl-render-pass.ts +176 -6
  175. package/src/adapter/resources/webgl-render-pipeline.ts +308 -229
  176. package/src/adapter/resources/webgl-sampler.ts +19 -18
  177. package/src/adapter/resources/webgl-shader.ts +91 -32
  178. package/src/adapter/resources/webgl-texture-view.ts +28 -0
  179. package/src/adapter/resources/webgl-texture.ts +147 -184
  180. package/src/adapter/resources/webgl-transform-feedback.ts +196 -0
  181. package/src/adapter/resources/webgl-vertex-array.ts +282 -0
  182. package/src/adapter/webgl-canvas-context.ts +23 -22
  183. package/src/adapter/webgl-device.ts +411 -196
  184. package/src/classic/accessor.ts +12 -8
  185. package/src/classic/clear.ts +118 -0
  186. package/src/classic/copy-and-blit.ts +318 -0
  187. package/src/classic/format-utils.ts +47 -0
  188. package/src/classic/typed-array-utils.ts +19 -31
  189. package/src/context/debug/spector.ts +16 -10
  190. package/src/context/debug/webgl-developer-tools.ts +52 -32
  191. package/src/context/helpers/create-browser-context.ts +116 -0
  192. package/src/context/helpers/webgl-context-data.ts +31 -0
  193. package/src/context/helpers/webgl-extensions.ts +17 -0
  194. package/src/context/parameters/unified-parameter-api.ts +11 -16
  195. package/src/context/parameters/webgl-parameter-tables.ts +171 -121
  196. package/src/context/state-tracker/deep-array-equal.ts +3 -0
  197. package/src/context/state-tracker/track-context-state.ts +35 -26
  198. package/src/context/state-tracker/with-parameters.ts +12 -3
  199. package/src/index.ts +41 -55
  200. package/src/types.ts +6 -0
  201. package/dist/adapter/converters/device-parameters.js.map +0 -1
  202. package/dist/adapter/converters/renderbuffer-formats.d.ts +0 -16
  203. package/dist/adapter/converters/renderbuffer-formats.d.ts.map +0 -1
  204. package/dist/adapter/converters/renderbuffer-formats.js +0 -185
  205. package/dist/adapter/converters/renderbuffer-formats.js.map +0 -1
  206. package/dist/adapter/converters/sampler-parameters.js.map +0 -1
  207. package/dist/adapter/converters/texture-formats.js.map +0 -1
  208. package/dist/adapter/converters/vertex-formats.js.map +0 -1
  209. package/dist/adapter/device-helpers/device-features.d.ts +0 -9
  210. package/dist/adapter/device-helpers/device-features.d.ts.map +0 -1
  211. package/dist/adapter/device-helpers/device-features.js +0 -112
  212. package/dist/adapter/device-helpers/device-features.js.map +0 -1
  213. package/dist/adapter/device-helpers/device-limits.d.ts +0 -52
  214. package/dist/adapter/device-helpers/device-limits.d.ts.map +0 -1
  215. package/dist/adapter/device-helpers/device-limits.js +0 -91
  216. package/dist/adapter/device-helpers/device-limits.js.map +0 -1
  217. package/dist/adapter/device-helpers/get-device-info.d.ts +0 -4
  218. package/dist/adapter/device-helpers/get-device-info.d.ts.map +0 -1
  219. package/dist/adapter/device-helpers/get-device-info.js +0 -44
  220. package/dist/adapter/device-helpers/get-device-info.js.map +0 -1
  221. package/dist/adapter/device-helpers/is-old-ie.d.ts +0 -2
  222. package/dist/adapter/device-helpers/is-old-ie.d.ts.map +0 -1
  223. package/dist/adapter/device-helpers/is-old-ie.js +0 -8
  224. package/dist/adapter/device-helpers/is-old-ie.js.map +0 -1
  225. package/dist/adapter/helpers/attribute-utils.d.ts +0 -11
  226. package/dist/adapter/helpers/attribute-utils.d.ts.map +0 -1
  227. package/dist/adapter/helpers/attribute-utils.js +0 -81
  228. package/dist/adapter/helpers/attribute-utils.js.map +0 -1
  229. package/dist/adapter/helpers/get-shader-layout.js.map +0 -1
  230. package/dist/adapter/helpers/parse-shader-compiler-log.js.map +0 -1
  231. package/dist/adapter/helpers/set-uniform.js.map +0 -1
  232. package/dist/adapter/helpers/uniforms.d.ts +0 -26
  233. package/dist/adapter/helpers/uniforms.d.ts.map +0 -1
  234. package/dist/adapter/helpers/uniforms.js +0 -99
  235. package/dist/adapter/helpers/uniforms.js.map +0 -1
  236. package/dist/adapter/objects/constants-to-keys.js.map +0 -1
  237. package/dist/adapter/objects/webgl-renderbuffer.js.map +0 -1
  238. package/dist/adapter/objects/webgl-resource.js.map +0 -1
  239. package/dist/adapter/objects/webgl-vertex-array-object.d.ts +0 -27
  240. package/dist/adapter/objects/webgl-vertex-array-object.d.ts.map +0 -1
  241. package/dist/adapter/objects/webgl-vertex-array-object.js +0 -84
  242. package/dist/adapter/objects/webgl-vertex-array-object.js.map +0 -1
  243. package/dist/adapter/resources/webgl-buffer.js.map +0 -1
  244. package/dist/adapter/resources/webgl-command-buffer.js.map +0 -1
  245. package/dist/adapter/resources/webgl-command-encoder.js.map +0 -1
  246. package/dist/adapter/resources/webgl-external-texture.js.map +0 -1
  247. package/dist/adapter/resources/webgl-framebuffer.js.map +0 -1
  248. package/dist/adapter/resources/webgl-render-pass.js.map +0 -1
  249. package/dist/adapter/resources/webgl-render-pipeline.js.map +0 -1
  250. package/dist/adapter/resources/webgl-sampler.js.map +0 -1
  251. package/dist/adapter/resources/webgl-shader.js.map +0 -1
  252. package/dist/adapter/resources/webgl-texture.js.map +0 -1
  253. package/dist/adapter/webgl-canvas-context.js.map +0 -1
  254. package/dist/adapter/webgl-device.js.map +0 -1
  255. package/dist/bundle.d.ts +0 -2
  256. package/dist/bundle.d.ts.map +0 -1
  257. package/dist/bundle.js +0 -5
  258. package/dist/bundle.js.map +0 -1
  259. package/dist/classic/accessor.js.map +0 -1
  260. package/dist/classic/buffer.d.ts +0 -95
  261. package/dist/classic/buffer.d.ts.map +0 -1
  262. package/dist/classic/buffer.js +0 -392
  263. package/dist/classic/buffer.js.map +0 -1
  264. package/dist/classic/typed-array-utils.js.map +0 -1
  265. package/dist/context/context/context-state.d.ts +0 -18
  266. package/dist/context/context/context-state.d.ts.map +0 -1
  267. package/dist/context/context/context-state.js +0 -26
  268. package/dist/context/context/context-state.js.map +0 -1
  269. package/dist/context/context/create-browser-context.d.ts +0 -41
  270. package/dist/context/context/create-browser-context.d.ts.map +0 -1
  271. package/dist/context/context/create-browser-context.js +0 -61
  272. package/dist/context/context/create-browser-context.js.map +0 -1
  273. package/dist/context/context/create-headless-context.d.ts +0 -9
  274. package/dist/context/context/create-headless-context.d.ts.map +0 -1
  275. package/dist/context/context/create-headless-context.js +0 -43
  276. package/dist/context/context/create-headless-context.js.map +0 -1
  277. package/dist/context/context/device-pixels.d.ts +0 -25
  278. package/dist/context/context/device-pixels.d.ts.map +0 -1
  279. package/dist/context/context/device-pixels.js +0 -103
  280. package/dist/context/context/device-pixels.js.map +0 -1
  281. package/dist/context/context/webgl-checks.d.ts +0 -13
  282. package/dist/context/context/webgl-checks.d.ts.map +0 -1
  283. package/dist/context/context/webgl-checks.js +0 -34
  284. package/dist/context/context/webgl-checks.js.map +0 -1
  285. package/dist/context/debug/spector.js.map +0 -1
  286. package/dist/context/debug/webgl-developer-tools.js.map +0 -1
  287. package/dist/context/parameters/unified-parameter-api.js.map +0 -1
  288. package/dist/context/parameters/webgl-parameter-tables.js.map +0 -1
  289. package/dist/context/polyfill/get-parameter-polyfill.d.ts +0 -2
  290. package/dist/context/polyfill/get-parameter-polyfill.d.ts.map +0 -1
  291. package/dist/context/polyfill/get-parameter-polyfill.js +0 -91
  292. package/dist/context/polyfill/get-parameter-polyfill.js.map +0 -1
  293. package/dist/context/polyfill/polyfill-context.d.ts +0 -5
  294. package/dist/context/polyfill/polyfill-context.d.ts.map +0 -1
  295. package/dist/context/polyfill/polyfill-context.js +0 -91
  296. package/dist/context/polyfill/polyfill-context.js.map +0 -1
  297. package/dist/context/polyfill/polyfill-table.d.ts +0 -48
  298. package/dist/context/polyfill/polyfill-table.d.ts.map +0 -1
  299. package/dist/context/polyfill/polyfill-table.js +0 -160
  300. package/dist/context/polyfill/polyfill-table.js.map +0 -1
  301. package/dist/context/polyfill/polyfill-vertex-array-object.d.ts +0 -2
  302. package/dist/context/polyfill/polyfill-vertex-array-object.d.ts.map +0 -1
  303. package/dist/context/polyfill/polyfill-vertex-array-object.js +0 -335
  304. package/dist/context/polyfill/polyfill-vertex-array-object.js.map +0 -1
  305. package/dist/context/state-tracker/deep-array-equal.js.map +0 -1
  306. package/dist/context/state-tracker/track-context-state.js.map +0 -1
  307. package/dist/context/state-tracker/with-parameters.js.map +0 -1
  308. package/dist/es5/adapter/converters/device-parameters.js +0 -185
  309. package/dist/es5/adapter/converters/device-parameters.js.map +0 -1
  310. package/dist/es5/adapter/converters/renderbuffer-formats.js +0 -163
  311. package/dist/es5/adapter/converters/renderbuffer-formats.js.map +0 -1
  312. package/dist/es5/adapter/converters/sampler-parameters.js +0 -245
  313. package/dist/es5/adapter/converters/sampler-parameters.js.map +0 -1
  314. package/dist/es5/adapter/converters/texture-formats.js +0 -1031
  315. package/dist/es5/adapter/converters/texture-formats.js.map +0 -1
  316. package/dist/es5/adapter/converters/vertex-formats.js +0 -45
  317. package/dist/es5/adapter/converters/vertex-formats.js.map +0 -1
  318. package/dist/es5/adapter/device-helpers/device-features.js +0 -155
  319. package/dist/es5/adapter/device-helpers/device-features.js.map +0 -1
  320. package/dist/es5/adapter/device-helpers/device-limits.js +0 -64
  321. package/dist/es5/adapter/device-helpers/device-limits.js.map +0 -1
  322. package/dist/es5/adapter/device-helpers/get-device-info.js +0 -55
  323. package/dist/es5/adapter/device-helpers/get-device-info.js.map +0 -1
  324. package/dist/es5/adapter/device-helpers/is-old-ie.js +0 -16
  325. package/dist/es5/adapter/device-helpers/is-old-ie.js.map +0 -1
  326. package/dist/es5/adapter/helpers/attribute-utils.js +0 -91
  327. package/dist/es5/adapter/helpers/attribute-utils.js.map +0 -1
  328. package/dist/es5/adapter/helpers/get-shader-layout.js +0 -391
  329. package/dist/es5/adapter/helpers/get-shader-layout.js.map +0 -1
  330. package/dist/es5/adapter/helpers/parse-shader-compiler-log.js +0 -72
  331. package/dist/es5/adapter/helpers/parse-shader-compiler-log.js.map +0 -1
  332. package/dist/es5/adapter/helpers/set-uniform.js +0 -125
  333. package/dist/es5/adapter/helpers/set-uniform.js.map +0 -1
  334. package/dist/es5/adapter/helpers/uniforms.js +0 -112
  335. package/dist/es5/adapter/helpers/uniforms.js.map +0 -1
  336. package/dist/es5/adapter/objects/constants-to-keys.js +0 -54
  337. package/dist/es5/adapter/objects/constants-to-keys.js.map +0 -1
  338. package/dist/es5/adapter/objects/webgl-renderbuffer.js +0 -150
  339. package/dist/es5/adapter/objects/webgl-renderbuffer.js.map +0 -1
  340. package/dist/es5/adapter/objects/webgl-resource.js +0 -292
  341. package/dist/es5/adapter/objects/webgl-resource.js.map +0 -1
  342. package/dist/es5/adapter/objects/webgl-vertex-array-object.js +0 -137
  343. package/dist/es5/adapter/objects/webgl-vertex-array-object.js.map +0 -1
  344. package/dist/es5/adapter/resources/webgl-buffer.js +0 -243
  345. package/dist/es5/adapter/resources/webgl-buffer.js.map +0 -1
  346. package/dist/es5/adapter/resources/webgl-command-buffer.js +0 -96
  347. package/dist/es5/adapter/resources/webgl-command-buffer.js.map +0 -1
  348. package/dist/es5/adapter/resources/webgl-command-encoder.js +0 -98
  349. package/dist/es5/adapter/resources/webgl-command-encoder.js.map +0 -1
  350. package/dist/es5/adapter/resources/webgl-external-texture.js +0 -2
  351. package/dist/es5/adapter/resources/webgl-external-texture.js.map +0 -1
  352. package/dist/es5/adapter/resources/webgl-framebuffer.js +0 -346
  353. package/dist/es5/adapter/resources/webgl-framebuffer.js.map +0 -1
  354. package/dist/es5/adapter/resources/webgl-render-pass.js +0 -62
  355. package/dist/es5/adapter/resources/webgl-render-pass.js.map +0 -1
  356. package/dist/es5/adapter/resources/webgl-render-pipeline.js +0 -530
  357. package/dist/es5/adapter/resources/webgl-render-pipeline.js.map +0 -1
  358. package/dist/es5/adapter/resources/webgl-sampler.js +0 -96
  359. package/dist/es5/adapter/resources/webgl-sampler.js.map +0 -1
  360. package/dist/es5/adapter/resources/webgl-shader.js +0 -150
  361. package/dist/es5/adapter/resources/webgl-shader.js.map +0 -1
  362. package/dist/es5/adapter/resources/webgl-texture.js +0 -986
  363. package/dist/es5/adapter/resources/webgl-texture.js.map +0 -1
  364. package/dist/es5/adapter/webgl-canvas-context.js +0 -97
  365. package/dist/es5/adapter/webgl-canvas-context.js.map +0 -1
  366. package/dist/es5/adapter/webgl-device.js +0 -463
  367. package/dist/es5/adapter/webgl-device.js.map +0 -1
  368. package/dist/es5/bundle.js +0 -7
  369. package/dist/es5/bundle.js.map +0 -1
  370. package/dist/es5/classic/accessor.js +0 -181
  371. package/dist/es5/classic/accessor.js.map +0 -1
  372. package/dist/es5/classic/buffer.js +0 -478
  373. package/dist/es5/classic/buffer.js.map +0 -1
  374. package/dist/es5/classic/typed-array-utils.js +0 -126
  375. package/dist/es5/classic/typed-array-utils.js.map +0 -1
  376. package/dist/es5/context/context/context-state.js +0 -31
  377. package/dist/es5/context/context/context-state.js.map +0 -1
  378. package/dist/es5/context/context/create-browser-context.js +0 -83
  379. package/dist/es5/context/context/create-browser-context.js.map +0 -1
  380. package/dist/es5/context/context/create-headless-context.js +0 -60
  381. package/dist/es5/context/context/create-headless-context.js.map +0 -1
  382. package/dist/es5/context/context/device-pixels.js +0 -121
  383. package/dist/es5/context/context/device-pixels.js.map +0 -1
  384. package/dist/es5/context/context/webgl-checks.js +0 -54
  385. package/dist/es5/context/context/webgl-checks.js.map +0 -1
  386. package/dist/es5/context/debug/spector.js +0 -133
  387. package/dist/es5/context/debug/spector.js.map +0 -1
  388. package/dist/es5/context/debug/webgl-developer-tools.js +0 -198
  389. package/dist/es5/context/debug/webgl-developer-tools.js.map +0 -1
  390. package/dist/es5/context/parameters/unified-parameter-api.js +0 -97
  391. package/dist/es5/context/parameters/unified-parameter-api.js.map +0 -1
  392. package/dist/es5/context/parameters/webgl-parameter-tables.js +0 -392
  393. package/dist/es5/context/parameters/webgl-parameter-tables.js.map +0 -1
  394. package/dist/es5/context/polyfill/get-parameter-polyfill.js +0 -81
  395. package/dist/es5/context/polyfill/get-parameter-polyfill.js.map +0 -1
  396. package/dist/es5/context/polyfill/polyfill-context.js +0 -134
  397. package/dist/es5/context/polyfill/polyfill-context.js.map +0 -1
  398. package/dist/es5/context/polyfill/polyfill-table.js +0 -166
  399. package/dist/es5/context/polyfill/polyfill-table.js.map +0 -1
  400. package/dist/es5/context/polyfill/polyfill-vertex-array-object.js +0 -341
  401. package/dist/es5/context/polyfill/polyfill-vertex-array-object.js.map +0 -1
  402. package/dist/es5/context/state-tracker/deep-array-equal.js +0 -28
  403. package/dist/es5/context/state-tracker/deep-array-equal.js.map +0 -1
  404. package/dist/es5/context/state-tracker/track-context-state.js +0 -211
  405. package/dist/es5/context/state-tracker/track-context-state.js.map +0 -1
  406. package/dist/es5/context/state-tracker/with-parameters.js +0 -44
  407. package/dist/es5/context/state-tracker/with-parameters.js.map +0 -1
  408. package/dist/es5/index.js +0 -290
  409. package/dist/es5/index.js.map +0 -1
  410. package/dist/es5/init.js +0 -10
  411. package/dist/es5/init.js.map +0 -1
  412. package/dist/es5/types/webgl.js +0 -6
  413. package/dist/es5/types/webgl.js.map +0 -1
  414. package/dist/es5/types.js +0 -2
  415. package/dist/es5/types.js.map +0 -1
  416. package/dist/esm/adapter/converters/device-parameters.js +0 -168
  417. package/dist/esm/adapter/converters/device-parameters.js.map +0 -1
  418. package/dist/esm/adapter/converters/renderbuffer-formats.js +0 -185
  419. package/dist/esm/adapter/converters/renderbuffer-formats.js.map +0 -1
  420. package/dist/esm/adapter/converters/sampler-parameters.js +0 -227
  421. package/dist/esm/adapter/converters/sampler-parameters.js.map +0 -1
  422. package/dist/esm/adapter/converters/texture-formats.js +0 -954
  423. package/dist/esm/adapter/converters/texture-formats.js.map +0 -1
  424. package/dist/esm/adapter/converters/vertex-formats.js +0 -35
  425. package/dist/esm/adapter/converters/vertex-formats.js.map +0 -1
  426. package/dist/esm/adapter/device-helpers/device-features.js +0 -112
  427. package/dist/esm/adapter/device-helpers/device-features.js.map +0 -1
  428. package/dist/esm/adapter/device-helpers/device-limits.js +0 -91
  429. package/dist/esm/adapter/device-helpers/device-limits.js.map +0 -1
  430. package/dist/esm/adapter/device-helpers/get-device-info.js +0 -44
  431. package/dist/esm/adapter/device-helpers/get-device-info.js.map +0 -1
  432. package/dist/esm/adapter/device-helpers/is-old-ie.js +0 -8
  433. package/dist/esm/adapter/device-helpers/is-old-ie.js.map +0 -1
  434. package/dist/esm/adapter/helpers/attribute-utils.js +0 -81
  435. package/dist/esm/adapter/helpers/attribute-utils.js.map +0 -1
  436. package/dist/esm/adapter/helpers/get-shader-layout.js +0 -330
  437. package/dist/esm/adapter/helpers/get-shader-layout.js.map +0 -1
  438. package/dist/esm/adapter/helpers/parse-shader-compiler-log.js +0 -37
  439. package/dist/esm/adapter/helpers/parse-shader-compiler-log.js.map +0 -1
  440. package/dist/esm/adapter/helpers/set-uniform.js +0 -115
  441. package/dist/esm/adapter/helpers/set-uniform.js.map +0 -1
  442. package/dist/esm/adapter/helpers/uniforms.js +0 -99
  443. package/dist/esm/adapter/helpers/uniforms.js.map +0 -1
  444. package/dist/esm/adapter/objects/constants-to-keys.js +0 -42
  445. package/dist/esm/adapter/objects/constants-to-keys.js.map +0 -1
  446. package/dist/esm/adapter/objects/webgl-renderbuffer.js +0 -94
  447. package/dist/esm/adapter/objects/webgl-renderbuffer.js.map +0 -1
  448. package/dist/esm/adapter/objects/webgl-resource.js +0 -216
  449. package/dist/esm/adapter/objects/webgl-resource.js.map +0 -1
  450. package/dist/esm/adapter/objects/webgl-vertex-array-object.js +0 -84
  451. package/dist/esm/adapter/objects/webgl-vertex-array-object.js.map +0 -1
  452. package/dist/esm/adapter/resources/webgl-buffer.js +0 -164
  453. package/dist/esm/adapter/resources/webgl-buffer.js.map +0 -1
  454. package/dist/esm/adapter/resources/webgl-command-buffer.js +0 -65
  455. package/dist/esm/adapter/resources/webgl-command-buffer.js.map +0 -1
  456. package/dist/esm/adapter/resources/webgl-command-encoder.js +0 -53
  457. package/dist/esm/adapter/resources/webgl-command-encoder.js.map +0 -1
  458. package/dist/esm/adapter/resources/webgl-external-texture.js +0 -2
  459. package/dist/esm/adapter/resources/webgl-external-texture.js.map +0 -1
  460. package/dist/esm/adapter/resources/webgl-framebuffer.js +0 -267
  461. package/dist/esm/adapter/resources/webgl-framebuffer.js.map +0 -1
  462. package/dist/esm/adapter/resources/webgl-render-pass.js +0 -21
  463. package/dist/esm/adapter/resources/webgl-render-pass.js.map +0 -1
  464. package/dist/esm/adapter/resources/webgl-render-pipeline.js +0 -428
  465. package/dist/esm/adapter/resources/webgl-render-pipeline.js.map +0 -1
  466. package/dist/esm/adapter/resources/webgl-sampler.js +0 -50
  467. package/dist/esm/adapter/resources/webgl-sampler.js.map +0 -1
  468. package/dist/esm/adapter/resources/webgl-shader.js +0 -76
  469. package/dist/esm/adapter/resources/webgl-shader.js.map +0 -1
  470. package/dist/esm/adapter/resources/webgl-texture.js +0 -834
  471. package/dist/esm/adapter/resources/webgl-texture.js.map +0 -1
  472. package/dist/esm/adapter/webgl-canvas-context.js +0 -54
  473. package/dist/esm/adapter/webgl-canvas-context.js.map +0 -1
  474. package/dist/esm/adapter/webgl-device.js +0 -337
  475. package/dist/esm/adapter/webgl-device.js.map +0 -1
  476. package/dist/esm/bundle.js +0 -5
  477. package/dist/esm/bundle.js.map +0 -1
  478. package/dist/esm/classic/accessor.js +0 -144
  479. package/dist/esm/classic/accessor.js.map +0 -1
  480. package/dist/esm/classic/buffer.js +0 -392
  481. package/dist/esm/classic/buffer.js.map +0 -1
  482. package/dist/esm/classic/typed-array-utils.js +0 -112
  483. package/dist/esm/classic/typed-array-utils.js.map +0 -1
  484. package/dist/esm/context/context/context-state.js +0 -26
  485. package/dist/esm/context/context/context-state.js.map +0 -1
  486. package/dist/esm/context/context/create-browser-context.js +0 -61
  487. package/dist/esm/context/context/create-browser-context.js.map +0 -1
  488. package/dist/esm/context/context/create-headless-context.js +0 -43
  489. package/dist/esm/context/context/create-headless-context.js.map +0 -1
  490. package/dist/esm/context/context/device-pixels.js +0 -103
  491. package/dist/esm/context/context/device-pixels.js.map +0 -1
  492. package/dist/esm/context/context/webgl-checks.js +0 -34
  493. package/dist/esm/context/context/webgl-checks.js.map +0 -1
  494. package/dist/esm/context/debug/spector.js +0 -76
  495. package/dist/esm/context/debug/spector.js.map +0 -1
  496. package/dist/esm/context/debug/webgl-developer-tools.js +0 -121
  497. package/dist/esm/context/debug/webgl-developer-tools.js.map +0 -1
  498. package/dist/esm/context/parameters/unified-parameter-api.js +0 -63
  499. package/dist/esm/context/parameters/unified-parameter-api.js.map +0 -1
  500. package/dist/esm/context/parameters/webgl-parameter-tables.js +0 -445
  501. package/dist/esm/context/parameters/webgl-parameter-tables.js.map +0 -1
  502. package/dist/esm/context/polyfill/get-parameter-polyfill.js +0 -91
  503. package/dist/esm/context/polyfill/get-parameter-polyfill.js.map +0 -1
  504. package/dist/esm/context/polyfill/polyfill-context.js +0 -91
  505. package/dist/esm/context/polyfill/polyfill-context.js.map +0 -1
  506. package/dist/esm/context/polyfill/polyfill-table.js +0 -160
  507. package/dist/esm/context/polyfill/polyfill-table.js.map +0 -1
  508. package/dist/esm/context/polyfill/polyfill-vertex-array-object.js +0 -335
  509. package/dist/esm/context/polyfill/polyfill-vertex-array-object.js.map +0 -1
  510. package/dist/esm/context/state-tracker/deep-array-equal.js +0 -21
  511. package/dist/esm/context/state-tracker/deep-array-equal.js.map +0 -1
  512. package/dist/esm/context/state-tracker/track-context-state.js +0 -183
  513. package/dist/esm/context/state-tracker/track-context-state.js.map +0 -1
  514. package/dist/esm/context/state-tracker/with-parameters.js +0 -36
  515. package/dist/esm/context/state-tracker/with-parameters.js.map +0 -1
  516. package/dist/esm/index.js +0 -28
  517. package/dist/esm/index.js.map +0 -1
  518. package/dist/esm/init.js +0 -4
  519. package/dist/esm/init.js.map +0 -1
  520. package/dist/esm/types/webgl.js +0 -2
  521. package/dist/esm/types/webgl.js.map +0 -1
  522. package/dist/esm/types.js +0 -2
  523. package/dist/esm/types.js.map +0 -1
  524. package/dist/index.js.map +0 -1
  525. package/dist/init.d.ts +0 -2
  526. package/dist/init.d.ts.map +0 -1
  527. package/dist/init.js +0 -4
  528. package/dist/init.js.map +0 -1
  529. package/dist/types/webgl.d.ts +0 -145
  530. package/dist/types/webgl.d.ts.map +0 -1
  531. package/dist/types/webgl.js +0 -2
  532. package/dist/types/webgl.js.map +0 -1
  533. package/dist/types.js.map +0 -1
  534. package/src/adapter/converters/renderbuffer-formats.ts +0 -92
  535. package/src/adapter/device-helpers/device-features.ts +0 -158
  536. package/src/adapter/device-helpers/device-limits.ts +0 -153
  537. package/src/adapter/device-helpers/get-device-info.ts +0 -49
  538. package/src/adapter/device-helpers/is-old-ie.ts +0 -11
  539. package/src/adapter/helpers/attribute-utils.ts +0 -61
  540. package/src/adapter/objects/webgl-vertex-array-object.ts +0 -111
  541. package/src/bundle.ts +0 -4
  542. package/src/classic/buffer.ts +0 -474
  543. package/src/context/context/context-state.ts +0 -41
  544. package/src/context/context/create-browser-context.ts +0 -118
  545. package/src/context/context/create-headless-context.ts +0 -48
  546. package/src/context/context/device-pixels.ts +0 -158
  547. package/src/context/context/webgl-checks.ts +0 -49
  548. package/src/context/polyfill/get-parameter-polyfill.ts +0 -118
  549. package/src/context/polyfill/polyfill-context.ts +0 -97
  550. package/src/context/polyfill/polyfill-table.ts +0 -162
  551. package/src/context/polyfill/polyfill-vertex-array-object.ts +0 -360
  552. package/src/init.ts +0 -4
  553. package/src/types/webgl.ts +0 -284
@@ -1,48 +1,52 @@
1
- import type {
2
- RenderPipelineProps,
3
- RenderPass,
4
- Buffer,
5
- Binding,
6
- ShaderLayout,
7
- PrimitiveTopology,
8
- BindingLayout,
9
- AttributeLayout
10
- } from '@luma.gl/api';
11
- import {RenderPipeline, cast, log, decodeVertexFormat} from '@luma.gl/api';
12
- import GL from '@luma.gl/constants';
13
-
14
- import type {GLParameters} from '../../types/webgl';
15
- import {getWebGLDataType} from '../converters/texture-formats';
1
+ // luma.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {UniformValue, RenderPipelineProps, Binding} from '@luma.gl/core';
6
+ import type {ShaderLayout} from '@luma.gl/core';
7
+ import type {RenderPass, VertexArray} from '@luma.gl/core';
8
+ import {RenderPipeline, cast, splitUniformsAndBindings, log} from '@luma.gl/core';
9
+ import {mergeShaderLayout} from '@luma.gl/core';
10
+ // import {mergeShaderLayout, getAttributeInfosFromLayouts} from '@luma.gl/core';
11
+ import {GL} from '@luma.gl/constants';
12
+
16
13
  import {getShaderLayout} from '../helpers/get-shader-layout';
17
- import {withDeviceParameters, withGLParameters} from '../converters/device-parameters';
14
+ import {withDeviceAndGLParameters} from '../converters/device-parameters';
18
15
  import {setUniform} from '../helpers/set-uniform';
19
16
  // import {copyUniform, checkUniformValues} from '../../classes/uniforms';
20
17
 
21
- import WebGLDevice from '../webgl-device';
22
- import WEBGLBuffer from './webgl-buffer';
23
- import WEBGLShader from './webgl-shader';
24
- import WEBGLTexture from './webgl-texture';
25
- import WEBGLVertexArrayObject from '../objects/webgl-vertex-array-object';
18
+ import {WebGLDevice} from '../webgl-device';
19
+ import {WEBGLBuffer} from './webgl-buffer';
20
+ import {WEBGLShader} from './webgl-shader';
21
+ import {WEBGLFramebuffer} from './webgl-framebuffer';
22
+ import {WEBGLTexture} from './webgl-texture';
23
+ import {WEBGLTextureView} from './webgl-texture-view';
24
+ import {WEBGLRenderPass} from './webgl-render-pass';
25
+ import {WEBGLTransformFeedback} from './webgl-transform-feedback';
26
+ import {getGLDrawMode} from '../helpers/webgl-topology-utils';
26
27
 
27
28
  const LOG_PROGRAM_PERF_PRIORITY = 4;
28
29
 
29
30
  /** Creates a new render pipeline */
30
- export default class WEBGLRenderPipeline extends RenderPipeline {
31
+ export class WEBGLRenderPipeline extends RenderPipeline {
32
+ /** The WebGL device that created this render pipeline */
31
33
  device: WebGLDevice;
34
+ /** Handle to underlying WebGL program */
32
35
  handle: WebGLProgram;
36
+ /** vertex shader */
33
37
  vs: WEBGLShader;
38
+ /** fragment shader */
34
39
  fs: WEBGLShader;
35
- layout: ShaderLayout;
36
-
37
- // configuration: ProgramConfiguration;
38
- // Experimental flag to avoid deleting Program object while it is cached
40
+ /** The layout extracted from shader by WebGL introspection APIs */
41
+ introspectedLayout: ShaderLayout;
42
+
43
+ /** Uniforms set on this model */
44
+ uniforms: Record<string, UniformValue> = {};
45
+ /** Bindings set on this model */
46
+ bindings: Record<string, Binding> = {};
47
+ /** WebGL varyings */
39
48
  varyings: string[] | null = null;
40
- vertexArrayObject: WEBGLVertexArrayObject;
41
- _indexBuffer?: Buffer;
42
- uniforms: Record<string, any> = {};
43
- bindings: Record<string, any> = {};
44
- _textureUniforms: Record<string, any> = {};
45
- _textureIndexCounter: number = 0;
49
+
46
50
  _uniformCount: number = 0;
47
51
  _uniformSetters: Record<string, Function> = {}; // TODO are these used?
48
52
 
@@ -50,8 +54,7 @@ export default class WEBGLRenderPipeline extends RenderPipeline {
50
54
  super(device, props);
51
55
  this.device = device;
52
56
  this.handle = this.props.handle || this.device.gl.createProgram();
53
- // @ts-expect-error
54
- this.handle.__SPECTOR_Metadata = {id: this.props.id};
57
+ this.device.setSpectorMetadata(this.handle, {id: this.props.id});
55
58
 
56
59
  // Create shaders if needed
57
60
  this.vs = cast<WEBGLShader>(props.vs);
@@ -63,18 +66,32 @@ export default class WEBGLRenderPipeline extends RenderPipeline {
63
66
  // @ts-expect-error WebGL only
64
67
  const {varyings, bufferMode = GL.SEPARATE_ATTRIBS} = props;
65
68
  if (varyings && varyings.length > 0) {
66
- this.device.assertWebGL2();
67
69
  this.varyings = varyings;
68
- this.device.gl2?.transformFeedbackVaryings(this.handle, varyings, bufferMode);
70
+ this.device.gl.transformFeedbackVaryings(this.handle, varyings, bufferMode);
69
71
  }
70
72
 
71
- this._compileAndLink();
73
+ this._linkShaders();
72
74
 
73
- this.layout = props.layout || getShaderLayout(this.device.gl, this.handle);
74
- this.vertexArrayObject = new WEBGLVertexArrayObject(this.device);
75
+ log.time(0, `RenderPipeline ${this.id} - shaderLayout introspection`)();
76
+ this.introspectedLayout = getShaderLayout(this.device.gl, this.handle);
77
+ log.timeEnd(0, `RenderPipeline ${this.id} - shaderLayout introspection`)();
78
+
79
+ // Merge provided layout with introspected layout
80
+ this.shaderLayout = mergeShaderLayout(this.introspectedLayout, props.shaderLayout);
81
+
82
+ // WebGPU has more restrictive topology support than WebGL
83
+ switch (this.props.topology) {
84
+ case 'triangle-fan-webgl':
85
+ case 'line-loop-webgl':
86
+ log.warn(
87
+ `Primitive topology ${this.props.topology} is deprecated and will be removed in v9.1`
88
+ );
89
+ break;
90
+ default:
91
+ }
75
92
  }
76
93
 
77
- destroy(): void {
94
+ override destroy(): void {
78
95
  if (this.handle) {
79
96
  this.device.gl.deleteProgram(this.handle);
80
97
  // this.handle = null;
@@ -82,51 +99,35 @@ export default class WEBGLRenderPipeline extends RenderPipeline {
82
99
  }
83
100
  }
84
101
 
85
- setIndexBuffer(indexBuffer: Buffer): void {
86
- const webglBuffer = cast<WEBGLBuffer>(indexBuffer);
87
- this.vertexArrayObject.setElementBuffer(webglBuffer);
88
- this._indexBuffer = indexBuffer;
89
- }
90
-
91
- /** @todo needed for portable model */
92
- setAttributes(attributes: Record<string, Buffer>): void {
93
- for (const [name, buffer] of Object.entries(attributes)) {
94
- const webglBuffer = cast<WEBGLBuffer>(buffer);
95
- const attribute = getAttributeLayout(this.layout, name);
96
- if (!attribute) {
97
- log.warn(`Ignoring buffer supplied for unknown attribute "${name}" in pipeline "${this.id}" (buffer "${buffer.id}")`)();
98
- continue;
99
- }
100
- const decoded = decodeVertexFormat(attribute.format);
101
- const {type: typeString, components: size, byteLength: stride, normalized, integer} = decoded;
102
- const divisor = attribute.stepMode === 'instance' ? 1 : 0;
103
- const type = getWebGLDataType(typeString);
104
- this.vertexArrayObject.setBuffer(attribute.location, webglBuffer, {
105
- size,
106
- type,
107
- stride,
108
- offset: 0,
109
- normalized,
110
- integer,
111
- divisor: attribute.stepMode === 'instance' ? 1 : 0
112
- });
113
- }
114
- }
115
-
116
- /** @todo needed for portable model */
102
+ /**
103
+ * Bindings include: textures, samplers and uniform buffers
104
+ * @todo needed for portable model
105
+ */
117
106
  setBindings(bindings: Record<string, Binding>): void {
118
107
  // if (log.priority >= 2) {
119
108
  // checkUniformValues(uniforms, this.id, this._uniformSetters);
120
109
  // }
121
110
 
122
111
  for (const [name, value] of Object.entries(bindings)) {
123
- const binding = this.layout.bindings.find((binding) => binding.name === name);
112
+ // Accept both `xyz` and `xyzUniforms` as valid names for `xyzUniforms` uniform block
113
+ // This convention allows shaders to name uniform blocks as `uniform appUniforms {} app;`
114
+ // and reference them as `app` from both GLSL and JS.
115
+ // TODO - this is rather hacky - we could also remap the name directly in the shader layout.
116
+ const binding =
117
+ this.shaderLayout.bindings.find(binding => binding.name === name) ||
118
+ this.shaderLayout.bindings.find(binding => binding.name === `${name}Uniforms`);
119
+
124
120
  if (!binding) {
125
- log.warn(`Unknown binding ${name} in render pipeline ${this.id}`)();
126
- continue;
121
+ const validBindings = this.shaderLayout.bindings
122
+ .map(binding => `"${binding.name}"`)
123
+ .join(', ');
124
+ log.warn(
125
+ `Unknown binding "${name}" in render pipeline "${this.id}", expected one of ${validBindings}`
126
+ )();
127
+ continue; // eslint-disable-line no-continue
127
128
  }
128
129
  if (!value) {
129
- log.warn(`Unsetting binding ${name} in render pipeline ${this.id}`)();
130
+ log.warn(`Unsetting binding "${name}" in render pipeline "${this.id}"`)();
130
131
  }
131
132
  switch (binding.type) {
132
133
  case 'uniform':
@@ -136,7 +137,13 @@ export default class WEBGLRenderPipeline extends RenderPipeline {
136
137
  }
137
138
  break;
138
139
  case 'texture':
139
- if (!(value instanceof WEBGLTexture)) {
140
+ if (
141
+ !(
142
+ value instanceof WEBGLTextureView ||
143
+ value instanceof WEBGLTexture ||
144
+ value instanceof WEBGLFramebuffer
145
+ )
146
+ ) {
140
147
  throw new Error('texture value');
141
148
  }
142
149
  break;
@@ -151,17 +158,14 @@ export default class WEBGLRenderPipeline extends RenderPipeline {
151
158
  }
152
159
  }
153
160
 
154
- setUniforms(uniforms: Record<string, any>) {
155
- // TODO - check against layout
156
- Object.assign(this.uniforms, uniforms);
157
- }
158
-
159
161
  /** @todo needed for portable model
160
162
  * @note The WebGL API is offers many ways to draw things
161
163
  * This function unifies those ways into a single call using common parameters with sane defaults
162
164
  */
163
165
  draw(options: {
164
- renderPass?: RenderPass;
166
+ renderPass: RenderPass;
167
+ /** vertex attributes */
168
+ vertexArray: VertexArray;
165
169
  vertexCount?: number;
166
170
  indexCount?: number;
167
171
  instanceCount?: number;
@@ -169,82 +173,122 @@ export default class WEBGLRenderPipeline extends RenderPipeline {
169
173
  firstIndex?: number;
170
174
  firstInstance?: number;
171
175
  baseVertex?: number;
176
+ transformFeedback?: WEBGLTransformFeedback;
172
177
  }): boolean {
173
178
  const {
174
- renderPass = this.device.getDefaultRenderPass(),
179
+ renderPass,
180
+ vertexArray,
175
181
  vertexCount,
176
- indexCount,
182
+ // indexCount,
177
183
  instanceCount,
178
184
  firstVertex = 0,
179
- firstIndex,
180
- firstInstance,
181
- baseVertex
185
+ // firstIndex,
186
+ // firstInstance,
187
+ // baseVertex,
188
+ transformFeedback
182
189
  } = options;
183
190
 
184
- const drawMode = getDrawMode(this.props.topology);
185
- const isIndexed: boolean = Boolean(this._indexBuffer);
186
- const indexType = this._indexBuffer?.props.indexType === 'uint16' ? GL.UNSIGNED_SHORT : GL.UNSIGNED_INT;
187
- const isInstanced: boolean = Number(options.instanceCount) > 0;
191
+ const glDrawMode = getGLDrawMode(this.props.topology);
192
+ const isIndexed: boolean = Boolean(vertexArray.indexBuffer);
193
+ const glIndexType = (vertexArray.indexBuffer as WEBGLBuffer)?.glIndexType;
194
+ const isInstanced: boolean = Number(instanceCount) > 0;
195
+
196
+ // If we are using async linking, we need to wait until linking completes
197
+ if (this.linkStatus !== 'success') {
198
+ log.info(2, `RenderPipeline:${this.id}.draw() aborted - waiting for shader linking`)();
199
+ return false;
200
+ }
188
201
 
189
202
  // Avoid WebGL draw call when not rendering any data or values are incomplete
190
203
  // Note: async textures set as uniforms might still be loading.
191
204
  // Now that all uniforms have been updated, check if any texture
192
205
  // in the uniforms is not yet initialized, then we don't draw
193
- if (!this._areTexturesRenderable() || options.vertexCount === 0) {
194
- // (isInstanced && instanceCount === 0)
206
+ if (!this._areTexturesRenderable() || vertexCount === 0) {
207
+ log.info(2, `RenderPipeline:${this.id}.draw() aborted - textures not yet loaded`)();
195
208
  return false;
196
209
  }
197
210
 
211
+ // (isInstanced && instanceCount === 0)
212
+ if (vertexCount === 0) {
213
+ log.info(2, `RenderPipeline:${this.id}.draw() aborted - no vertices to draw`)();
214
+ return true;
215
+ }
216
+
198
217
  this.device.gl.useProgram(this.handle);
199
218
 
200
- this.vertexArrayObject.bind(() => {
201
- const primitiveMode = getGLPrimitive(this.props.topology);
202
- const transformFeedback: any = null;
203
- if (transformFeedback) {
204
- transformFeedback.begin(primitiveMode);
205
- }
219
+ // Note: Rebinds constant attributes before each draw call
220
+ vertexArray.bindBeforeRender(renderPass);
206
221
 
207
- // We have to apply bindings before every draw call since other draw calls will overwrite
208
- this._applyBindings();
209
- this._applyUniforms();
210
-
211
- // TODO - double context push/pop
212
- withDeviceParameters(this.device, this.props.parameters, () => {
213
- withGLParameters(this.device, {framebuffer: renderPass.props.framebuffer}, () => {
214
- // TODO - Use polyfilled WebGL2RenderingContext instead of ANGLE extension
215
- if (isIndexed && isInstanced) {
216
- // ANGLE_instanced_arrays extension
217
- this.device.gl2?.drawElementsInstanced(
218
- drawMode,
219
- vertexCount || 0, // indexCount?
220
- indexType,
221
- firstVertex,
222
- instanceCount || 0
223
- );
224
- // } else if (isIndexed && this.device.isWebGL2 && !isNaN(start) && !isNaN(end)) {
225
- // this.device.gl2.drawRangeElements(drawMode, start, end, vertexCount, indexType, offset);
226
- } else if (isIndexed) {
227
- this.device.gl.drawElements(drawMode, vertexCount || 0, indexType, firstVertex); // indexCount?
228
- } else if (isInstanced) {
229
- this.device.gl2?.drawArraysInstanced(drawMode, firstVertex, vertexCount || 0, instanceCount || 0);
230
- } else {
231
- this.device.gl.drawArrays(drawMode, firstVertex, vertexCount || 0);
232
- }
233
- });
222
+ if (transformFeedback) {
223
+ transformFeedback.begin(this.props.topology);
224
+ }
225
+
226
+ // We have to apply bindings before every draw call since other draw calls will overwrite
227
+ this._applyBindings();
228
+ this._applyUniforms();
229
+
230
+ const webglRenderPass = renderPass as WEBGLRenderPass;
231
+
232
+ withDeviceAndGLParameters(
233
+ this.device,
234
+ this.props.parameters,
235
+ webglRenderPass.glParameters,
236
+ () => {
237
+ if (isIndexed && isInstanced) {
238
+ this.device.gl.drawElementsInstanced(
239
+ glDrawMode,
240
+ vertexCount || 0, // indexCount?
241
+ glIndexType,
242
+ firstVertex,
243
+ instanceCount || 0
244
+ );
245
+ // } else if (isIndexed && this.device.isWebGL2 && !isNaN(start) && !isNaN(end)) {
246
+ // this.device.gldrawRangeElements(glDrawMode, start, end, vertexCount, glIndexType, offset);
247
+ } else if (isIndexed) {
248
+ this.device.gl.drawElements(glDrawMode, vertexCount || 0, glIndexType, firstVertex); // indexCount?
249
+ } else if (isInstanced) {
250
+ this.device.gl.drawArraysInstanced(
251
+ glDrawMode,
252
+ firstVertex,
253
+ vertexCount || 0,
254
+ instanceCount || 0
255
+ );
256
+ } else {
257
+ this.device.gl.drawArrays(glDrawMode, firstVertex, vertexCount || 0);
258
+ }
234
259
 
235
260
  if (transformFeedback) {
236
261
  transformFeedback.end();
237
262
  }
238
- });
239
- });
263
+ }
264
+ );
265
+
266
+ vertexArray.unbindAfterRender(renderPass);
240
267
 
241
268
  return true;
242
269
  }
243
270
 
271
+ // DEPRECATED METHODS
272
+
273
+ override setUniformsWebGL(uniforms: Record<string, UniformValue>) {
274
+ const {bindings} = splitUniformsAndBindings(uniforms);
275
+ Object.keys(bindings).forEach(name => {
276
+ log.warn(
277
+ `Unsupported value "${JSON.stringify(
278
+ bindings[name]
279
+ )}" used in setUniforms() for key ${name}. Use setBindings() instead?`
280
+ )();
281
+ });
282
+ // TODO - check against layout
283
+ Object.assign(this.uniforms, uniforms);
284
+ }
285
+
286
+ // PRIVATE METHODS
287
+
244
288
  // setAttributes(attributes: Record<string, Buffer>): void {}
245
289
  // setBindings(bindings: Record<string, Binding>): void {}
246
290
 
247
- protected _compileAndLink() {
291
+ protected async _linkShaders() {
248
292
  const {gl} = this.device;
249
293
  gl.attachShader(this.handle, this.vs.handle);
250
294
  gl.attachShader(this.handle, this.fs.handle);
@@ -252,23 +296,89 @@ export default class WEBGLRenderPipeline extends RenderPipeline {
252
296
  gl.linkProgram(this.handle);
253
297
  log.timeEnd(LOG_PROGRAM_PERF_PRIORITY, `linkProgram for ${this.id}`)();
254
298
 
255
- // Avoid checking program linking error in production
256
- // @ts-expect-error
257
- if (gl.debug || log.level > 0) {
258
- const linked = gl.getProgramParameter(this.handle, gl.LINK_STATUS);
259
- if (!linked) {
260
- throw new Error(`Error linking: ${gl.getProgramInfoLog(this.handle)}`);
261
- }
299
+ // TODO Avoid checking program linking error in production
300
+ if (log.level === 0) {
301
+ // return;
302
+ }
262
303
 
263
- gl.validateProgram(this.handle);
264
- const validated = gl.getProgramParameter(this.handle, gl.VALIDATE_STATUS);
265
- if (!validated) {
266
- throw new Error(`Error validating: ${gl.getProgramInfoLog(this.handle)}`);
267
- }
304
+ if (!this.device.features.has('compilation-status-async-webgl')) {
305
+ const status = this._getLinkStatus();
306
+ this._reportLinkStatus(status);
307
+ return;
268
308
  }
309
+
310
+ // async case
311
+ log.once(1, 'RenderPipeline linking is asynchronous')();
312
+ await this._waitForLinkComplete();
313
+ log.info(2, `RenderPipeline ${this.id} - async linking complete: ${this.linkStatus}`)();
314
+ const status = this._getLinkStatus();
315
+ this._reportLinkStatus(status);
269
316
  }
270
317
 
271
- // PRIVATE METHODS
318
+ /** Report link status. First, check for shader compilation failures if linking fails */
319
+ _reportLinkStatus(status: 'success' | 'linking' | 'validation') {
320
+ switch (status) {
321
+ case 'success':
322
+ return;
323
+
324
+ default:
325
+ // First check for shader compilation failures if linking fails
326
+ if (this.vs.compilationStatus === 'error') {
327
+ this.vs.debugShader();
328
+ throw new Error(`Error during compilation of shader ${this.vs.id}`);
329
+ }
330
+ if (this.fs?.compilationStatus === 'error') {
331
+ this.vs.debugShader();
332
+ throw new Error(`Error during compilation of shader ${this.fs.id}`);
333
+ }
334
+ throw new Error(`Error during ${status}: ${this.device.gl.getProgramInfoLog(this.handle)}`);
335
+ }
336
+ }
337
+
338
+ /**
339
+ * Get the shader compilation status
340
+ * TODO - Load log even when no error reported, to catch warnings?
341
+ * https://gamedev.stackexchange.com/questions/30429/how-to-detect-glsl-warnings
342
+ */
343
+ _getLinkStatus(): 'success' | 'linking' | 'validation' {
344
+ const {gl} = this.device;
345
+ const linked = gl.getProgramParameter(this.handle, gl.LINK_STATUS);
346
+ if (!linked) {
347
+ this.linkStatus = 'error';
348
+ return 'linking';
349
+ }
350
+
351
+ gl.validateProgram(this.handle);
352
+ const validated = gl.getProgramParameter(this.handle, gl.VALIDATE_STATUS);
353
+ if (!validated) {
354
+ this.linkStatus = 'error';
355
+ return 'validation';
356
+ }
357
+
358
+ this.linkStatus = 'success';
359
+ return 'success';
360
+ }
361
+
362
+ /** Use KHR_parallel_shader_compile extension if available */
363
+ async _waitForLinkComplete(): Promise<void> {
364
+ const waitMs = async (ms: number) => await new Promise(resolve => setTimeout(resolve, ms));
365
+ const DELAY_MS = 10; // Shader compilation is typically quite fast (with some exceptions)
366
+
367
+ // If status polling is not available, we can't wait for completion. Just wait a little to minimize blocking
368
+ if (!this.device.features.has('compilation-status-async-webgl')) {
369
+ await waitMs(DELAY_MS);
370
+ return;
371
+ }
372
+
373
+ const {gl} = this.device;
374
+ for (;;) {
375
+ const complete = gl.getProgramParameter(this.handle, GL.COMPLETION_STATUS_KHR);
376
+ if (complete) {
377
+ return;
378
+ }
379
+ await waitMs(DELAY_MS);
380
+ }
381
+ }
272
382
 
273
383
  /**
274
384
  * Checks if all texture-values uniforms are renderable (i.e. loaded)
@@ -278,14 +388,9 @@ export default class WEBGLRenderPipeline extends RenderPipeline {
278
388
  _areTexturesRenderable() {
279
389
  let texturesRenderable = true;
280
390
 
281
- for (const [name, texture] of Object.entries(this._textureUniforms)) {
282
- texture.update();
283
- texturesRenderable = texturesRenderable && texture.loaded;
284
- }
285
-
286
- for (const [name, texture] of Object.entries(this.bindings)) {
287
- // texture.update();
288
- if (texture.loaded !== undefined) {
391
+ for (const [, texture] of Object.entries(this.bindings)) {
392
+ if (texture instanceof WEBGLTexture) {
393
+ texture.update();
289
394
  texturesRenderable = texturesRenderable && texture.loaded;
290
395
  }
291
396
  }
@@ -293,19 +398,22 @@ export default class WEBGLRenderPipeline extends RenderPipeline {
293
398
  return texturesRenderable;
294
399
  }
295
400
 
296
- /** Apply any bindings */
401
+ /** Apply any bindings (before each draw call) */
297
402
  _applyBindings() {
298
- this.device.gl.useProgram(this.handle);
299
-
300
- const {gl2} = this.device;
301
- if (!gl2) {
302
- throw new Error('bindings');
403
+ // If we are using async linking, we need to wait until linking completes
404
+ if (this.linkStatus !== 'success') {
405
+ return;
303
406
  }
304
407
 
408
+ const {gl} = this.device;
409
+ gl.useProgram(this.handle);
410
+
305
411
  let textureUnit = 0;
306
412
  let uniformBufferIndex = 0;
307
- for (const binding of this.layout.bindings) {
308
- const value = this.bindings[binding.name];
413
+ for (const binding of this.shaderLayout.bindings) {
414
+ // Accept both `xyz` and `xyzUniforms` as valid names for `xyzUniforms` uniform block
415
+ const value =
416
+ this.bindings[binding.name] || this.bindings[binding.name.replace(/Uniforms$/, '')];
309
417
  if (!value) {
310
418
  throw new Error(`No value for binding ${binding.name} in ${this.id}`);
311
419
  }
@@ -313,20 +421,23 @@ export default class WEBGLRenderPipeline extends RenderPipeline {
313
421
  case 'uniform':
314
422
  // Set buffer
315
423
  const {name} = binding;
316
- const location = gl2.getUniformBlockIndex(this.handle, name);
317
- if (location === GL.INVALID_INDEX) {
424
+ const location = gl.getUniformBlockIndex(this.handle, name);
425
+ if ((location as GL) === GL.INVALID_INDEX) {
318
426
  throw new Error(`Invalid uniform block name ${name}`);
319
427
  }
320
- gl2.uniformBlockBinding(this.handle, uniformBufferIndex, location);
428
+ gl.uniformBlockBinding(this.handle, uniformBufferIndex, location);
321
429
  // console.debug(binding, location);
322
430
  if (value instanceof WEBGLBuffer) {
323
- gl2.bindBufferBase(GL.UNIFORM_BUFFER, uniformBufferIndex, value.handle);
431
+ gl.bindBufferBase(GL.UNIFORM_BUFFER, uniformBufferIndex, value.handle);
324
432
  } else {
325
- gl2.bindBufferRange(
433
+ gl.bindBufferRange(
326
434
  GL.UNIFORM_BUFFER,
327
435
  uniformBufferIndex,
436
+ // @ts-expect-error
328
437
  value.buffer.handle,
438
+ // @ts-expect-error
329
439
  value.offset || 0,
440
+ // @ts-expect-error
330
441
  value.size || value.buffer.byteLength - value.offset
331
442
  );
332
443
  }
@@ -334,13 +445,35 @@ export default class WEBGLRenderPipeline extends RenderPipeline {
334
445
  break;
335
446
 
336
447
  case 'texture':
337
- if (!(value instanceof WEBGLTexture)) {
448
+ if (
449
+ !(
450
+ value instanceof WEBGLTextureView ||
451
+ value instanceof WEBGLTexture ||
452
+ value instanceof WEBGLFramebuffer
453
+ )
454
+ ) {
338
455
  throw new Error('texture');
339
456
  }
340
- const texture: WEBGLTexture = value;
341
- gl2.activeTexture(GL.TEXTURE0 + textureUnit);
342
- gl2.bindTexture(texture.target, texture.handle);
343
- // gl2.bindSampler(textureUnit, sampler.handle);
457
+ let texture: WEBGLTexture;
458
+ if (value instanceof WEBGLTextureView) {
459
+ texture = value.texture;
460
+ } else if (value instanceof WEBGLTexture) {
461
+ texture = value;
462
+ } else if (
463
+ value instanceof WEBGLFramebuffer &&
464
+ value.colorAttachments[0] instanceof WEBGLTextureView
465
+ ) {
466
+ log.warn(
467
+ 'Passing framebuffer in texture binding may be deprecated. Use fbo.colorAttachments[0] instead'
468
+ )();
469
+ texture = value.colorAttachments[0].texture;
470
+ } else {
471
+ throw new Error('No texture');
472
+ }
473
+
474
+ gl.activeTexture(GL.TEXTURE0 + textureUnit);
475
+ gl.bindTexture(texture.target, texture.handle);
476
+ // gl.bindSampler(textureUnit, sampler.handle);
344
477
  textureUnit += 1;
345
478
  break;
346
479
 
@@ -355,71 +488,17 @@ export default class WEBGLRenderPipeline extends RenderPipeline {
355
488
  }
356
489
  }
357
490
 
491
+ /**
492
+ * Due to program sharing, uniforms need to be reset before every draw call
493
+ * (though caching will avoid redundant WebGL calls)
494
+ */
358
495
  _applyUniforms() {
359
- for (const uniformLayout of this.layout.uniforms || []) {
496
+ for (const uniformLayout of this.shaderLayout.uniforms || []) {
360
497
  const {name, location, type, textureUnit} = uniformLayout;
361
- const value = this.uniforms[name] || textureUnit;
498
+ const value = this.uniforms[name] ?? textureUnit;
362
499
  if (value !== undefined) {
363
500
  setUniform(this.device.gl, location, type, value);
364
501
  }
365
502
  }
366
503
  }
367
504
  }
368
-
369
- /** Get the primitive type for transform feedback */
370
- function getDrawMode(
371
- topology: PrimitiveTopology
372
- ): GL.POINTS | GL.LINES | GL.LINE_STRIP | GL.LINE_LOOP | GL.TRIANGLES | GL.TRIANGLE_STRIP | GL.TRIANGLE_FAN {
373
- // prettier-ignore
374
- switch (topology) {
375
- case 'point-list': return GL.POINTS;
376
- case 'line-list': return GL.LINES;
377
- case 'line-strip': return GL.LINE_STRIP;
378
- case 'line-loop': return GL.LINE_LOOP;
379
- case 'triangle-list': return GL.TRIANGLES;
380
- case 'triangle-strip': return GL.TRIANGLE_STRIP;
381
- case 'triangle-fan': return GL.TRIANGLE_FAN;
382
- default: throw new Error(topology);
383
- }
384
- }
385
-
386
- /** Get the primitive type for transform feedback */
387
- function getGLPrimitive(topology: PrimitiveTopology): GL.POINTS | GL.LINES | GL.TRIANGLES {
388
- // prettier-ignore
389
- switch (topology) {
390
- case 'point-list': return GL.POINTS;
391
- case 'line-list': return GL.LINES;
392
- case 'line-strip': return GL.LINES;
393
- case 'line-loop': return GL.LINES;
394
- case 'triangle-list': return GL.TRIANGLES;
395
- case 'triangle-strip': return GL.TRIANGLES;
396
- case 'triangle-fan': return GL.TRIANGLES;
397
- default: throw new Error(topology);
398
- }
399
- }
400
-
401
- function getAttributesByLocation(
402
- attributes: Record<string, Buffer>,
403
- layout: ShaderLayout
404
- ): Record<number, Buffer> {
405
- const byLocation: Record<number, Buffer> = {};
406
- for (const [name, buffer] of Object.entries(attributes)) {
407
- const attribute = getAttributeLayout(layout, name);
408
- if (attribute) {
409
- byLocation[attribute.location] = buffer;
410
- }
411
- }
412
- return byLocation;
413
- }
414
-
415
- function getAttributeLayout(layout: ShaderLayout, name: string): AttributeLayout | null {
416
- return layout.attributes.find((binding) => binding.name === name) || null;
417
- }
418
-
419
- function getBindingLayout(layout: ShaderLayout, name: string): BindingLayout {
420
- const binding = layout.bindings.find((binding) => binding.name === name);
421
- if (!binding) {
422
- throw new Error(`Unknown binding ${name}`);
423
- }
424
- return binding;
425
- }