@luma.gl/webgl 9.0.0-beta.4 → 9.0.0-beta.6

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 (288) hide show
  1. package/dist/adapter/converters/device-parameters.d.ts.map +1 -1
  2. package/dist/adapter/converters/device-parameters.js +297 -155
  3. package/dist/adapter/converters/sampler-parameters.d.ts +0 -4
  4. package/dist/adapter/converters/sampler-parameters.d.ts.map +1 -1
  5. package/dist/adapter/converters/sampler-parameters.js +73 -67
  6. package/dist/adapter/converters/shader-formats.d.ts.map +1 -1
  7. package/dist/adapter/converters/shader-formats.js +53 -46
  8. package/dist/adapter/converters/texture-formats.d.ts +13 -19
  9. package/dist/adapter/converters/texture-formats.d.ts.map +1 -1
  10. package/dist/adapter/converters/texture-formats.js +474 -879
  11. package/dist/adapter/converters/vertex-formats.d.ts.map +1 -1
  12. package/dist/adapter/converters/vertex-formats.js +53 -61
  13. package/dist/adapter/device-helpers/device-features.d.ts +2 -5
  14. package/dist/adapter/device-helpers/device-features.d.ts.map +1 -1
  15. package/dist/adapter/device-helpers/device-features.js +56 -87
  16. package/dist/adapter/device-helpers/device-limits.d.ts +2 -4
  17. package/dist/adapter/device-helpers/device-limits.d.ts.map +1 -1
  18. package/dist/adapter/device-helpers/device-limits.js +88 -83
  19. package/dist/adapter/device-helpers/get-device-info.d.ts +1 -1
  20. package/dist/adapter/device-helpers/get-device-info.d.ts.map +1 -1
  21. package/dist/adapter/device-helpers/get-device-info.js +79 -63
  22. package/dist/adapter/device-helpers/webgl-device-features.d.ts +19 -0
  23. package/dist/adapter/device-helpers/webgl-device-features.d.ts.map +1 -0
  24. package/dist/adapter/device-helpers/webgl-device-features.js +86 -0
  25. package/dist/adapter/device-helpers/webgl-device-info.d.ts +5 -0
  26. package/dist/adapter/device-helpers/webgl-device-info.d.ts.map +1 -0
  27. package/dist/adapter/device-helpers/webgl-device-info.js +90 -0
  28. package/dist/adapter/device-helpers/webgl-device-limits.d.ts +35 -0
  29. package/dist/adapter/device-helpers/webgl-device-limits.d.ts.map +1 -0
  30. package/dist/adapter/device-helpers/webgl-device-limits.js +47 -0
  31. package/dist/adapter/helpers/decode-webgl-types.d.ts.map +1 -1
  32. package/dist/adapter/helpers/decode-webgl-types.js +88 -76
  33. package/dist/adapter/helpers/get-shader-layout.d.ts +1 -1
  34. package/dist/adapter/helpers/get-shader-layout.d.ts.map +1 -1
  35. package/dist/adapter/helpers/get-shader-layout.js +261 -225
  36. package/dist/adapter/helpers/parse-shader-compiler-log.d.ts.map +1 -1
  37. package/dist/adapter/helpers/parse-shader-compiler-log.js +47 -37
  38. package/dist/adapter/helpers/set-uniform.d.ts +1 -1
  39. package/dist/adapter/helpers/set-uniform.d.ts.map +1 -1
  40. package/dist/adapter/helpers/set-uniform.js +68 -82
  41. package/dist/adapter/helpers/webgl-topology-utils.d.ts.map +1 -1
  42. package/dist/adapter/helpers/webgl-topology-utils.js +78 -93
  43. package/dist/adapter/objects/constants-to-keys.d.ts +1 -1
  44. package/dist/adapter/objects/constants-to-keys.d.ts.map +1 -1
  45. package/dist/adapter/objects/constants-to-keys.js +19 -12
  46. package/dist/adapter/objects/webgl-renderbuffer.d.ts +2 -2
  47. package/dist/adapter/objects/webgl-renderbuffer.d.ts.map +1 -1
  48. package/dist/adapter/objects/webgl-renderbuffer.js +86 -77
  49. package/dist/adapter/objects/webgl-resource.d.ts +3 -25
  50. package/dist/adapter/objects/webgl-resource.d.ts.map +1 -1
  51. package/dist/adapter/objects/webgl-resource.js +102 -146
  52. package/dist/adapter/resources/webgl-buffer.d.ts +3 -4
  53. package/dist/adapter/resources/webgl-buffer.d.ts.map +1 -1
  54. package/dist/adapter/resources/webgl-buffer.js +161 -119
  55. package/dist/adapter/resources/webgl-command-buffer.d.ts +1 -1
  56. package/dist/adapter/resources/webgl-command-buffer.d.ts.map +1 -1
  57. package/dist/adapter/resources/webgl-command-buffer.js +266 -168
  58. package/dist/adapter/resources/webgl-command-encoder.d.ts +8 -3
  59. package/dist/adapter/resources/webgl-command-encoder.d.ts.map +1 -1
  60. package/dist/adapter/resources/webgl-command-encoder.js +33 -39
  61. package/dist/adapter/resources/webgl-external-texture.js +93 -1
  62. package/dist/adapter/resources/webgl-framebuffer.d.ts +8 -10
  63. package/dist/adapter/resources/webgl-framebuffer.d.ts.map +1 -1
  64. package/dist/adapter/resources/webgl-framebuffer.js +167 -137
  65. package/dist/adapter/resources/webgl-query-set.d.ts +44 -0
  66. package/dist/adapter/resources/webgl-query-set.d.ts.map +1 -0
  67. package/dist/adapter/resources/webgl-query-set.js +136 -0
  68. package/dist/adapter/resources/webgl-render-pass.d.ts +3 -1
  69. package/dist/adapter/resources/webgl-render-pass.d.ts.map +1 -1
  70. package/dist/adapter/resources/webgl-render-pass.js +124 -90
  71. package/dist/adapter/resources/webgl-render-pipeline.d.ts +15 -6
  72. package/dist/adapter/resources/webgl-render-pipeline.d.ts.map +1 -1
  73. package/dist/adapter/resources/webgl-render-pipeline.js +356 -221
  74. package/dist/adapter/resources/webgl-sampler.d.ts +1 -3
  75. package/dist/adapter/resources/webgl-sampler.d.ts.map +1 -1
  76. package/dist/adapter/resources/webgl-sampler.js +43 -33
  77. package/dist/adapter/resources/webgl-shader.d.ts +12 -2
  78. package/dist/adapter/resources/webgl-shader.d.ts.map +1 -1
  79. package/dist/adapter/resources/webgl-shader.js +114 -47
  80. package/dist/adapter/resources/webgl-texture-view.d.ts +14 -0
  81. package/dist/adapter/resources/webgl-texture-view.d.ts.map +1 -0
  82. package/dist/adapter/resources/webgl-texture-view.js +18 -0
  83. package/dist/adapter/resources/webgl-texture.d.ts +6 -9
  84. package/dist/adapter/resources/webgl-texture.d.ts.map +1 -1
  85. package/dist/adapter/resources/webgl-texture.js +615 -695
  86. package/dist/adapter/resources/webgl-transform-feedback.d.ts +2 -2
  87. package/dist/adapter/resources/webgl-transform-feedback.d.ts.map +1 -1
  88. package/dist/adapter/resources/webgl-transform-feedback.js +141 -143
  89. package/dist/adapter/resources/webgl-vertex-array.d.ts +3 -3
  90. package/dist/adapter/resources/webgl-vertex-array.d.ts.map +1 -1
  91. package/dist/adapter/resources/webgl-vertex-array.js +229 -157
  92. package/dist/adapter/webgl-canvas-context.d.ts +2 -2
  93. package/dist/adapter/webgl-canvas-context.d.ts.map +1 -1
  94. package/dist/adapter/webgl-canvas-context.js +58 -36
  95. package/dist/adapter/webgl-device.d.ts +34 -40
  96. package/dist/adapter/webgl-device.d.ts.map +1 -1
  97. package/dist/adapter/webgl-device.js +418 -363
  98. package/dist/classic/accessor.d.ts.map +1 -1
  99. package/dist/classic/accessor.js +132 -101
  100. package/dist/classic/clear.d.ts +2 -2
  101. package/dist/classic/clear.d.ts.map +1 -1
  102. package/dist/classic/clear.js +73 -72
  103. package/dist/classic/copy-and-blit.d.ts +1 -1
  104. package/dist/classic/copy-and-blit.d.ts.map +1 -1
  105. package/dist/classic/copy-and-blit.js +175 -175
  106. package/dist/classic/format-utils.d.ts +2 -2
  107. package/dist/classic/format-utils.d.ts.map +1 -1
  108. package/dist/classic/format-utils.js +39 -32
  109. package/dist/classic/typed-array-utils.d.ts.map +1 -1
  110. package/dist/classic/typed-array-utils.js +96 -81
  111. package/dist/context/context/context-data.d.ts +14 -0
  112. package/dist/context/context/context-data.d.ts.map +1 -0
  113. package/dist/context/context/context-data.js +33 -0
  114. package/dist/context/context/create-browser-context.d.ts +1 -6
  115. package/dist/context/context/create-browser-context.d.ts.map +1 -1
  116. package/dist/context/context/create-browser-context.js +62 -49
  117. package/dist/context/debug/spector.d.ts.map +1 -1
  118. package/dist/context/debug/spector.js +55 -50
  119. package/dist/context/debug/webgl-developer-tools.d.ts +1 -2
  120. package/dist/context/debug/webgl-developer-tools.d.ts.map +1 -1
  121. package/dist/context/debug/webgl-developer-tools.js +104 -77
  122. package/dist/context/helpers/create-browser-context.d.ts +35 -0
  123. package/dist/context/helpers/create-browser-context.d.ts.map +1 -0
  124. package/dist/context/helpers/create-browser-context.js +67 -0
  125. package/dist/context/{polyfill/context-data.d.ts → helpers/webgl-context-data.d.ts} +2 -2
  126. package/dist/context/helpers/webgl-context-data.d.ts.map +1 -0
  127. package/dist/context/helpers/webgl-context-data.js +21 -0
  128. package/dist/context/helpers/webgl-extensions.d.ts +4 -0
  129. package/dist/context/helpers/webgl-extensions.d.ts.map +1 -0
  130. package/dist/context/helpers/webgl-extensions.js +10 -0
  131. package/dist/context/parameters/unified-parameter-api.d.ts +3 -3
  132. package/dist/context/parameters/unified-parameter-api.d.ts.map +1 -1
  133. package/dist/context/parameters/unified-parameter-api.js +94 -44
  134. package/dist/context/parameters/webgl-parameter-tables.d.ts +120 -99
  135. package/dist/context/parameters/webgl-parameter-tables.d.ts.map +1 -1
  136. package/dist/context/parameters/webgl-parameter-tables.js +469 -404
  137. package/dist/context/state-tracker/deep-array-equal.d.ts.map +1 -1
  138. package/dist/context/state-tracker/deep-array-equal.js +19 -14
  139. package/dist/context/state-tracker/track-context-state.d.ts +4 -4
  140. package/dist/context/state-tracker/track-context-state.d.ts.map +1 -1
  141. package/dist/context/state-tracker/track-context-state.js +188 -123
  142. package/dist/context/state-tracker/with-parameters.d.ts +2 -2
  143. package/dist/context/state-tracker/with-parameters.d.ts.map +1 -1
  144. package/dist/context/state-tracker/with-parameters.js +43 -26
  145. package/dist/dist.dev.js +3135 -4142
  146. package/dist/index.cjs +1766 -2717
  147. package/dist/index.cjs.map +7 -0
  148. package/dist/index.d.ts +25 -28
  149. package/dist/index.d.ts.map +1 -1
  150. package/dist/index.js +16 -5
  151. package/dist/types.d.ts.map +1 -1
  152. package/dist/types.js +3 -1
  153. package/dist.min.js +9 -42
  154. package/package.json +11 -15
  155. package/src/adapter/converters/device-parameters.ts +105 -17
  156. package/src/adapter/converters/sampler-parameters.ts +12 -20
  157. package/src/adapter/converters/shader-formats.ts +47 -22
  158. package/src/adapter/converters/texture-formats.ts +138 -185
  159. package/src/adapter/converters/vertex-formats.ts +3 -3
  160. package/src/adapter/device-helpers/webgl-device-features.ts +101 -0
  161. package/src/adapter/device-helpers/{get-device-info.ts → webgl-device-info.ts} +30 -22
  162. package/src/adapter/device-helpers/webgl-device-limits.ts +53 -0
  163. package/src/adapter/helpers/decode-webgl-types.ts +13 -7
  164. package/src/adapter/helpers/get-shader-layout.ts +21 -31
  165. package/src/adapter/helpers/parse-shader-compiler-log.ts +10 -6
  166. package/src/adapter/helpers/set-uniform.ts +3 -4
  167. package/src/adapter/helpers/webgl-topology-utils.ts +10 -3
  168. package/src/adapter/objects/constants-to-keys.ts +3 -2
  169. package/src/adapter/objects/webgl-renderbuffer.ts +38 -16
  170. package/src/adapter/objects/webgl-resource.ts +7 -140
  171. package/src/adapter/resources/webgl-buffer.ts +10 -14
  172. package/src/adapter/resources/webgl-command-buffer.ts +24 -34
  173. package/src/adapter/resources/webgl-command-encoder.ts +14 -11
  174. package/src/adapter/resources/webgl-external-texture.ts +5 -5
  175. package/src/adapter/resources/webgl-framebuffer.ts +38 -34
  176. package/src/adapter/resources/webgl-query-set.ts +171 -0
  177. package/src/adapter/resources/webgl-render-pass.ts +24 -15
  178. package/src/adapter/resources/webgl-render-pipeline.ts +138 -70
  179. package/src/adapter/resources/webgl-sampler.ts +7 -10
  180. package/src/adapter/resources/webgl-shader.ts +65 -11
  181. package/src/adapter/resources/webgl-texture-view.ts +28 -0
  182. package/src/adapter/resources/webgl-texture.ts +38 -105
  183. package/src/adapter/resources/webgl-transform-feedback.ts +16 -22
  184. package/src/adapter/resources/webgl-vertex-array.ts +20 -21
  185. package/src/adapter/webgl-canvas-context.ts +7 -11
  186. package/src/adapter/webgl-device.ts +106 -151
  187. package/src/classic/accessor.ts +5 -4
  188. package/src/classic/clear.ts +25 -20
  189. package/src/classic/copy-and-blit.ts +12 -6
  190. package/src/classic/format-utils.ts +2 -1
  191. package/src/classic/typed-array-utils.ts +3 -7
  192. package/src/context/debug/spector.ts +9 -6
  193. package/src/context/debug/webgl-developer-tools.ts +31 -20
  194. package/src/context/{context → helpers}/create-browser-context.ts +9 -33
  195. package/src/context/{polyfill/context-data.ts → helpers/webgl-context-data.ts} +3 -2
  196. package/src/context/helpers/webgl-extensions.ts +17 -0
  197. package/src/context/parameters/unified-parameter-api.ts +5 -4
  198. package/src/context/parameters/webgl-parameter-tables.ts +118 -90
  199. package/src/context/state-tracker/deep-array-equal.ts +2 -1
  200. package/src/context/state-tracker/track-context-state.ts +29 -23
  201. package/src/context/state-tracker/with-parameters.ts +7 -2
  202. package/src/index.ts +4 -18
  203. package/src/types.ts +2 -1
  204. package/dist/adapter/converters/device-parameters.js.map +0 -1
  205. package/dist/adapter/converters/sampler-parameters.js.map +0 -1
  206. package/dist/adapter/converters/shader-formats.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.js.map +0 -1
  210. package/dist/adapter/device-helpers/device-limits.js.map +0 -1
  211. package/dist/adapter/device-helpers/get-device-info.js.map +0 -1
  212. package/dist/adapter/device-helpers/is-old-ie.d.ts +0 -2
  213. package/dist/adapter/device-helpers/is-old-ie.d.ts.map +0 -1
  214. package/dist/adapter/device-helpers/is-old-ie.js +0 -9
  215. package/dist/adapter/device-helpers/is-old-ie.js.map +0 -1
  216. package/dist/adapter/helpers/decode-webgl-types.js.map +0 -1
  217. package/dist/adapter/helpers/get-shader-layout.js.map +0 -1
  218. package/dist/adapter/helpers/parse-shader-compiler-log.js.map +0 -1
  219. package/dist/adapter/helpers/set-uniform.js.map +0 -1
  220. package/dist/adapter/helpers/webgl-topology-utils.js.map +0 -1
  221. package/dist/adapter/objects/constants-to-keys.js.map +0 -1
  222. package/dist/adapter/objects/webgl-renderbuffer.js.map +0 -1
  223. package/dist/adapter/objects/webgl-resource.js.map +0 -1
  224. package/dist/adapter/resources/webgl-buffer.js.map +0 -1
  225. package/dist/adapter/resources/webgl-command-buffer.js.map +0 -1
  226. package/dist/adapter/resources/webgl-command-encoder.js.map +0 -1
  227. package/dist/adapter/resources/webgl-external-texture.js.map +0 -1
  228. package/dist/adapter/resources/webgl-framebuffer.js.map +0 -1
  229. package/dist/adapter/resources/webgl-render-pass.js.map +0 -1
  230. package/dist/adapter/resources/webgl-render-pipeline.js.map +0 -1
  231. package/dist/adapter/resources/webgl-sampler.js.map +0 -1
  232. package/dist/adapter/resources/webgl-shader.js.map +0 -1
  233. package/dist/adapter/resources/webgl-texture.js.map +0 -1
  234. package/dist/adapter/resources/webgl-transform-feedback.js.map +0 -1
  235. package/dist/adapter/resources/webgl-vertex-array.js.map +0 -1
  236. package/dist/adapter/webgl-canvas-context.js.map +0 -1
  237. package/dist/adapter/webgl-device.js.map +0 -1
  238. package/dist/classic/accessor.js.map +0 -1
  239. package/dist/classic/clear.js.map +0 -1
  240. package/dist/classic/copy-and-blit.js.map +0 -1
  241. package/dist/classic/format-utils.js.map +0 -1
  242. package/dist/classic/typed-array-utils.js.map +0 -1
  243. package/dist/context/context/create-browser-context.js.map +0 -1
  244. package/dist/context/context/create-headless-context.d.ts +0 -9
  245. package/dist/context/context/create-headless-context.d.ts.map +0 -1
  246. package/dist/context/context/create-headless-context.js +0 -42
  247. package/dist/context/context/create-headless-context.js.map +0 -1
  248. package/dist/context/context/webgl-checks.d.ts +0 -13
  249. package/dist/context/context/webgl-checks.d.ts.map +0 -1
  250. package/dist/context/context/webgl-checks.js +0 -31
  251. package/dist/context/context/webgl-checks.js.map +0 -1
  252. package/dist/context/debug/spector.js.map +0 -1
  253. package/dist/context/debug/webgl-developer-tools.js.map +0 -1
  254. package/dist/context/parameters/unified-parameter-api.js.map +0 -1
  255. package/dist/context/parameters/webgl-parameter-tables.js.map +0 -1
  256. package/dist/context/polyfill/context-data.d.ts.map +0 -1
  257. package/dist/context/polyfill/context-data.js +0 -12
  258. package/dist/context/polyfill/context-data.js.map +0 -1
  259. package/dist/context/polyfill/get-parameter-polyfill.d.ts +0 -2
  260. package/dist/context/polyfill/get-parameter-polyfill.d.ts.map +0 -1
  261. package/dist/context/polyfill/get-parameter-polyfill.js +0 -85
  262. package/dist/context/polyfill/get-parameter-polyfill.js.map +0 -1
  263. package/dist/context/polyfill/polyfill-context.d.ts +0 -5
  264. package/dist/context/polyfill/polyfill-context.d.ts.map +0 -1
  265. package/dist/context/polyfill/polyfill-context.js +0 -87
  266. package/dist/context/polyfill/polyfill-context.js.map +0 -1
  267. package/dist/context/polyfill/polyfill-table.d.ts +0 -48
  268. package/dist/context/polyfill/polyfill-table.d.ts.map +0 -1
  269. package/dist/context/polyfill/polyfill-table.js +0 -137
  270. package/dist/context/polyfill/polyfill-table.js.map +0 -1
  271. package/dist/context/polyfill/polyfill-vertex-array-object.d.ts +0 -2
  272. package/dist/context/polyfill/polyfill-vertex-array-object.d.ts.map +0 -1
  273. package/dist/context/polyfill/polyfill-vertex-array-object.js +0 -265
  274. package/dist/context/polyfill/polyfill-vertex-array-object.js.map +0 -1
  275. package/dist/context/state-tracker/deep-array-equal.js.map +0 -1
  276. package/dist/context/state-tracker/track-context-state.js.map +0 -1
  277. package/dist/context/state-tracker/with-parameters.js.map +0 -1
  278. package/dist/index.js.map +0 -1
  279. package/dist/types.js.map +0 -1
  280. package/src/adapter/device-helpers/device-features.ts +0 -161
  281. package/src/adapter/device-helpers/device-limits.ts +0 -155
  282. package/src/adapter/device-helpers/is-old-ie.ts +0 -14
  283. package/src/context/context/create-headless-context.ts +0 -51
  284. package/src/context/context/webgl-checks.ts +0 -51
  285. package/src/context/polyfill/get-parameter-polyfill.ts +0 -122
  286. package/src/context/polyfill/polyfill-context.ts +0 -104
  287. package/src/context/polyfill/polyfill-table.ts +0 -167
  288. package/src/context/polyfill/polyfill-vertex-array-object.ts +0 -365
@@ -1,4 +1,5 @@
1
- // luma.gl, MIT license
1
+ // luma.gl
2
+ // SPDX-License-Identifier: MIT
2
3
  // Copyright (c) vis.gl contributors
3
4
 
4
5
  import type {UniformValue, RenderPipelineProps, Binding} from '@luma.gl/core';
@@ -19,7 +20,7 @@ import {WEBGLBuffer} from './webgl-buffer';
19
20
  import {WEBGLShader} from './webgl-shader';
20
21
  import {WEBGLFramebuffer} from './webgl-framebuffer';
21
22
  import {WEBGLTexture} from './webgl-texture';
22
- // import {WEBGLVertexArray} from './webgl-vertex-array';
23
+ import {WEBGLTextureView} from './webgl-texture-view';
23
24
  import {WEBGLRenderPass} from './webgl-render-pass';
24
25
  import {WEBGLTransformFeedback} from './webgl-transform-feedback';
25
26
  import {getGLDrawMode} from '../helpers/webgl-topology-utils';
@@ -65,14 +66,16 @@ export class WEBGLRenderPipeline extends RenderPipeline {
65
66
  // @ts-expect-error WebGL only
66
67
  const {varyings, bufferMode = GL.SEPARATE_ATTRIBS} = props;
67
68
  if (varyings && varyings.length > 0) {
68
- this.device.assertWebGL2();
69
69
  this.varyings = varyings;
70
- this.device.gl2?.transformFeedbackVaryings(this.handle, varyings, bufferMode);
70
+ this.device.gl.transformFeedbackVaryings(this.handle, varyings, bufferMode);
71
71
  }
72
72
 
73
- this._compileAndLink();
73
+ this._linkShaders();
74
74
 
75
+ log.time(0, `RenderPipeline ${this.id} - shaderLayout introspection`)();
75
76
  this.introspectedLayout = getShaderLayout(this.device.gl, this.handle);
77
+ log.timeEnd(0, `RenderPipeline ${this.id} - shaderLayout introspection`)();
78
+
76
79
  // Merge provided layout with introspected layout
77
80
  this.shaderLayout = mergeShaderLayout(this.introspectedLayout, props.shaderLayout);
78
81
 
@@ -80,7 +83,9 @@ export class WEBGLRenderPipeline extends RenderPipeline {
80
83
  switch (this.props.topology) {
81
84
  case 'triangle-fan-webgl':
82
85
  case 'line-loop-webgl':
83
- log.warn(`Primitive topology ${this.props.topology} is deprecated and will be removed in v9.1`);
86
+ log.warn(
87
+ `Primitive topology ${this.props.topology} is deprecated and will be removed in v9.1`
88
+ );
84
89
  break;
85
90
  default:
86
91
  }
@@ -132,7 +137,13 @@ export class WEBGLRenderPipeline extends RenderPipeline {
132
137
  }
133
138
  break;
134
139
  case 'texture':
135
- if (!(value instanceof WEBGLTexture || value instanceof WEBGLFramebuffer)) {
140
+ if (
141
+ !(
142
+ value instanceof WEBGLTextureView ||
143
+ value instanceof WEBGLTexture ||
144
+ value instanceof WEBGLFramebuffer
145
+ )
146
+ ) {
136
147
  throw new Error('texture value');
137
148
  }
138
149
  break;
@@ -147,18 +158,6 @@ export class WEBGLRenderPipeline extends RenderPipeline {
147
158
  }
148
159
  }
149
160
 
150
- /** This function is @deprecated, use uniform buffers */
151
- setUniforms(uniforms: Record<string, UniformValue>) {
152
- const {bindings} = splitUniformsAndBindings(uniforms);
153
- Object.keys(bindings).forEach(name => {
154
- log.warn(
155
- `Unsupported value "${JSON.stringify(bindings[name])}" used in setUniforms() for key ${name}. Use setBindings() instead?`
156
- )();
157
- });
158
- // TODO - check against layout
159
- Object.assign(this.uniforms, uniforms);
160
- }
161
-
162
161
  /** @todo needed for portable model
163
162
  * @note The WebGL API is offers many ways to draw things
164
163
  * This function unifies those ways into a single call using common parameters with sane defaults
@@ -176,6 +175,11 @@ export class WEBGLRenderPipeline extends RenderPipeline {
176
175
  baseVertex?: number;
177
176
  transformFeedback?: WEBGLTransformFeedback;
178
177
  }): boolean {
178
+ // If we are using async linking, we need to wait until linking completes
179
+ if (this.linkStatus !== 'success') {
180
+ return false;
181
+ }
182
+
179
183
  const {
180
184
  renderPass,
181
185
  vertexArray,
@@ -217,31 +221,6 @@ export class WEBGLRenderPipeline extends RenderPipeline {
217
221
  this._applyUniforms();
218
222
 
219
223
  const webglRenderPass = renderPass as WEBGLRenderPass;
220
- // // TODO - Use polyfilled WebGL2RenderingContext instead of ANGLE extension
221
- // if (isIndexed && isInstanced) {
222
- // // ANGLE_instanced_arrays extension
223
- // this.device.gl2?.drawElementsInstanced(
224
- // drawMode,
225
- // vertexCount || 0, // indexCount?
226
- // indexType,
227
- // firstVertex,
228
- // instanceCount || 0
229
- // );
230
- // // } else if (isIndexed && this.device.isWebGL2 && !isNaN(start) && !isNaN(end)) {
231
- // // this.device.gl2.drawRangeElements(drawMode, start, end, vertexCount, indexType, offset);
232
- // } else if (isIndexed) {
233
- // this.device.gl.drawElements(drawMode, vertexCount || 0, indexType, firstVertex); // indexCount?
234
- // } else if (isInstanced) {
235
- // this.device.gl2?.drawArraysInstanced(
236
- // drawMode,
237
- // firstVertex,
238
- // vertexCount || 0,
239
- // instanceCount || 0
240
- // );
241
- // } else {
242
- // this.device.gl.drawArrays(drawMode, firstVertex, vertexCount || 0);
243
- // }
244
- // });
245
224
 
246
225
  withDeviceAndGLParameters(
247
226
  this.device,
@@ -249,8 +228,7 @@ export class WEBGLRenderPipeline extends RenderPipeline {
249
228
  webglRenderPass.glParameters,
250
229
  () => {
251
230
  if (isIndexed && isInstanced) {
252
- // ANGLE_instanced_arrays extension
253
- this.device.gl2?.drawElementsInstanced(
231
+ this.device.gl.drawElementsInstanced(
254
232
  glDrawMode,
255
233
  vertexCount || 0, // indexCount?
256
234
  glIndexType,
@@ -258,11 +236,11 @@ export class WEBGLRenderPipeline extends RenderPipeline {
258
236
  instanceCount || 0
259
237
  );
260
238
  // } else if (isIndexed && this.device.isWebGL2 && !isNaN(start) && !isNaN(end)) {
261
- // this.device.gl2.drawRangeElements(glDrawMode, start, end, vertexCount, glIndexType, offset);
239
+ // this.device.gldrawRangeElements(glDrawMode, start, end, vertexCount, glIndexType, offset);
262
240
  } else if (isIndexed) {
263
241
  this.device.gl.drawElements(glDrawMode, vertexCount || 0, glIndexType, firstVertex); // indexCount?
264
242
  } else if (isInstanced) {
265
- this.device.gl2?.drawArraysInstanced(
243
+ this.device.gl.drawArraysInstanced(
266
244
  glDrawMode,
267
245
  firstVertex,
268
246
  vertexCount || 0,
@@ -283,10 +261,27 @@ export class WEBGLRenderPipeline extends RenderPipeline {
283
261
  return true;
284
262
  }
285
263
 
264
+ // DEPRECATED METHODS
265
+
266
+ override setUniformsWebGL(uniforms: Record<string, UniformValue>) {
267
+ const {bindings} = splitUniformsAndBindings(uniforms);
268
+ Object.keys(bindings).forEach(name => {
269
+ log.warn(
270
+ `Unsupported value "${JSON.stringify(
271
+ bindings[name]
272
+ )}" used in setUniforms() for key ${name}. Use setBindings() instead?`
273
+ )();
274
+ });
275
+ // TODO - check against layout
276
+ Object.assign(this.uniforms, uniforms);
277
+ }
278
+
279
+ // PRIVATE METHODS
280
+
286
281
  // setAttributes(attributes: Record<string, Buffer>): void {}
287
282
  // setBindings(bindings: Record<string, Binding>): void {}
288
283
 
289
- protected _compileAndLink() {
284
+ protected async _linkShaders() {
290
285
  const {gl} = this.device;
291
286
  gl.attachShader(this.handle, this.vs.handle);
292
287
  gl.attachShader(this.handle, this.fs.handle);
@@ -294,25 +289,89 @@ export class WEBGLRenderPipeline extends RenderPipeline {
294
289
  gl.linkProgram(this.handle);
295
290
  log.timeEnd(LOG_PROGRAM_PERF_PRIORITY, `linkProgram for ${this.id}`)();
296
291
 
297
- // Avoid checking program linking error in production
298
- // @ts-expect-error
299
- if (!gl.debug && log.level === 0) {
292
+ // TODO Avoid checking program linking error in production
293
+ if (log.level === 0) {
300
294
  // return;
301
295
  }
302
296
 
297
+ if (!this.device.features.has('compilation-status-async-webgl')) {
298
+ const status = this._getLinkStatus();
299
+ this._reportLinkStatus(status);
300
+ return;
301
+ }
302
+
303
+ // async case
304
+ log.once(1, 'RenderPipeline linking is asynchronous')();
305
+ await this._waitForLinkComplete();
306
+ log.info(2, `RenderPipeline ${this.id} - async linking complete: ${this.linkStatus}`)();
307
+ const status = this._getLinkStatus();
308
+ this._reportLinkStatus(status);
309
+ }
310
+
311
+ /** Report link status. First, check for shader compilation failures if linking fails */
312
+ _reportLinkStatus(status: 'success' | 'linking' | 'validation') {
313
+ switch (status) {
314
+ case 'success':
315
+ return;
316
+
317
+ default:
318
+ // First check for shader compilation failures if linking fails
319
+ if (this.vs.compilationStatus === 'error') {
320
+ this.vs.debugShader();
321
+ throw new Error(`Error during compilation of shader ${this.vs.id}`);
322
+ }
323
+ if (this.fs?.compilationStatus === 'error') {
324
+ this.vs.debugShader();
325
+ throw new Error(`Error during compilation of shader ${this.fs.id}`);
326
+ }
327
+ throw new Error(`Error during ${status}: ${this.device.gl.getProgramInfoLog(this.handle)}`);
328
+ }
329
+ }
330
+
331
+ /**
332
+ * Get the shader compilation status
333
+ * TODO - Load log even when no error reported, to catch warnings?
334
+ * https://gamedev.stackexchange.com/questions/30429/how-to-detect-glsl-warnings
335
+ */
336
+ _getLinkStatus(): 'success' | 'linking' | 'validation' {
337
+ const {gl} = this.device;
303
338
  const linked = gl.getProgramParameter(this.handle, gl.LINK_STATUS);
304
339
  if (!linked) {
305
- throw new Error(`Error linking: ${gl.getProgramInfoLog(this.handle)}`);
340
+ this.linkStatus = 'error';
341
+ return 'linking';
306
342
  }
307
343
 
308
344
  gl.validateProgram(this.handle);
309
345
  const validated = gl.getProgramParameter(this.handle, gl.VALIDATE_STATUS);
310
346
  if (!validated) {
311
- throw new Error(`Error validating: ${gl.getProgramInfoLog(this.handle)}`);
347
+ this.linkStatus = 'error';
348
+ return 'validation';
312
349
  }
350
+
351
+ this.linkStatus = 'success';
352
+ return 'success';
313
353
  }
314
354
 
315
- // PRIVATE METHODS
355
+ /** Use KHR_parallel_shader_compile extension if available */
356
+ async _waitForLinkComplete(): Promise<void> {
357
+ const waitMs = async (ms: number) => await new Promise(resolve => setTimeout(resolve, ms));
358
+ const DELAY_MS = 10; // Shader compilation is typically quite fast (with some exceptions)
359
+
360
+ // If status polling is not available, we can't wait for completion. Just wait a little to minimize blocking
361
+ if (!this.device.features.has('compilation-status-async-webgl')) {
362
+ await waitMs(DELAY_MS);
363
+ return;
364
+ }
365
+
366
+ const {gl} = this.device;
367
+ for (;;) {
368
+ const complete = gl.getProgramParameter(this.handle, GL.COMPLETION_STATUS_KHR);
369
+ if (complete) {
370
+ return;
371
+ }
372
+ await waitMs(DELAY_MS);
373
+ }
374
+ }
316
375
 
317
376
  /**
318
377
  * Checks if all texture-values uniforms are renderable (i.e. loaded)
@@ -334,13 +393,14 @@ export class WEBGLRenderPipeline extends RenderPipeline {
334
393
 
335
394
  /** Apply any bindings (before each draw call) */
336
395
  _applyBindings() {
337
- this.device.gl.useProgram(this.handle);
338
-
339
- const {gl2} = this.device;
340
- if (!gl2) {
341
- throw new Error('bindings');
396
+ // If we are using async linking, we need to wait until linking completes
397
+ if (this.linkStatus !== 'success') {
398
+ return;
342
399
  }
343
400
 
401
+ const {gl} = this.device;
402
+ gl.useProgram(this.handle);
403
+
344
404
  let textureUnit = 0;
345
405
  let uniformBufferIndex = 0;
346
406
  for (const binding of this.shaderLayout.bindings) {
@@ -354,16 +414,16 @@ export class WEBGLRenderPipeline extends RenderPipeline {
354
414
  case 'uniform':
355
415
  // Set buffer
356
416
  const {name} = binding;
357
- const location = gl2.getUniformBlockIndex(this.handle, name);
358
- if (location as GL === GL.INVALID_INDEX) {
417
+ const location = gl.getUniformBlockIndex(this.handle, name);
418
+ if ((location as GL) === GL.INVALID_INDEX) {
359
419
  throw new Error(`Invalid uniform block name ${name}`);
360
420
  }
361
- gl2.uniformBlockBinding(this.handle, uniformBufferIndex, location);
421
+ gl.uniformBlockBinding(this.handle, uniformBufferIndex, location);
362
422
  // console.debug(binding, location);
363
423
  if (value instanceof WEBGLBuffer) {
364
- gl2.bindBufferBase(GL.UNIFORM_BUFFER, uniformBufferIndex, value.handle);
424
+ gl.bindBufferBase(GL.UNIFORM_BUFFER, uniformBufferIndex, value.handle);
365
425
  } else {
366
- gl2.bindBufferRange(
426
+ gl.bindBufferRange(
367
427
  GL.UNIFORM_BUFFER,
368
428
  uniformBufferIndex,
369
429
  // @ts-expect-error
@@ -378,11 +438,19 @@ export class WEBGLRenderPipeline extends RenderPipeline {
378
438
  break;
379
439
 
380
440
  case 'texture':
381
- if (!(value instanceof WEBGLTexture || value instanceof WEBGLFramebuffer)) {
441
+ if (
442
+ !(
443
+ value instanceof WEBGLTextureView ||
444
+ value instanceof WEBGLTexture ||
445
+ value instanceof WEBGLFramebuffer
446
+ )
447
+ ) {
382
448
  throw new Error('texture');
383
449
  }
384
450
  let texture: WEBGLTexture;
385
- if (value instanceof WEBGLTexture) {
451
+ if (value instanceof WEBGLTextureView) {
452
+ texture = value.texture;
453
+ } else if (value instanceof WEBGLTexture) {
386
454
  texture = value;
387
455
  } else if (
388
456
  value instanceof WEBGLFramebuffer &&
@@ -396,9 +464,9 @@ export class WEBGLRenderPipeline extends RenderPipeline {
396
464
  throw new Error('No texture');
397
465
  }
398
466
 
399
- gl2.activeTexture(GL.TEXTURE0 + textureUnit);
400
- gl2.bindTexture(texture.target, texture.handle);
401
- // gl2.bindSampler(textureUnit, sampler.handle);
467
+ gl.activeTexture(GL.TEXTURE0 + textureUnit);
468
+ gl.bindTexture(texture.target, texture.handle);
469
+ // gl.bindSampler(textureUnit, sampler.handle);
402
470
  textureUnit += 1;
403
471
  break;
404
472
 
@@ -1,4 +1,5 @@
1
- // luma.gl, MIT license
1
+ // luma.gl
2
+ // SPDX-License-Identifier: MIT
2
3
  // Copyright (c) vis.gl contributors
3
4
 
4
5
  import {Sampler, SamplerProps} from '@luma.gl/core';
@@ -8,8 +9,6 @@ import type {WebGLDevice} from '../webgl-device';
8
9
 
9
10
  /**
10
11
  * Sampler object -
11
- * Under WebGL2 we create an actual WebGL sampler
12
- * Under WebGL1, we just store the sampler parameters
13
12
  * so that they can be set directly on the texture
14
13
  * https://github.com/WebGLSamples/WebGL2Samples/blob/master/samples/sampler_object.html
15
14
  */
@@ -22,15 +21,13 @@ export class WEBGLSampler extends Sampler {
22
21
  super(device, props);
23
22
  this.device = device;
24
23
  this.parameters = convertSamplerParametersToWebGL(props);
25
- if (this.device.isWebGL2) {
26
- this.handle = this.handle || this.device.gl2.createSampler();
27
- this._setSamplerParameters(this.parameters);
28
- }
24
+ this.handle = this.handle || this.device.gl.createSampler();
25
+ this._setSamplerParameters(this.parameters);
29
26
  }
30
27
 
31
28
  override destroy(): void {
32
29
  if (this.handle) {
33
- this.device.gl2.deleteSampler(this.handle);
30
+ this.device.gl.deleteSampler(this.handle);
34
31
  // @ts-expect-error read-only/undefined
35
32
  this.handle = undefined;
36
33
  }
@@ -49,10 +46,10 @@ export class WEBGLSampler extends Sampler {
49
46
  switch (param) {
50
47
  case GL.TEXTURE_MIN_LOD:
51
48
  case GL.TEXTURE_MAX_LOD:
52
- this.device.gl2.samplerParameterf(this.handle, param, value);
49
+ this.device.gl.samplerParameterf(this.handle, param, value);
53
50
  break;
54
51
  default:
55
- this.device.gl2.samplerParameteri(this.handle, param, value);
52
+ this.device.gl.samplerParameteri(this.handle, param, value);
56
53
  break;
57
54
  }
58
55
  }
@@ -1,7 +1,8 @@
1
- // luma.gl, MIT license
1
+ // luma.gl
2
+ // SPDX-License-Identifier: MIT
2
3
  // Copyright (c) vis.gl contributors
3
4
 
4
- import {Shader, ShaderProps, CompilerMessage} from '@luma.gl/core';
5
+ import {Shader, ShaderProps, CompilerMessage, log} from '@luma.gl/core';
5
6
  import {GL} from '@luma.gl/constants';
6
7
  import {parseShaderCompilerLog} from '../helpers/parse-shader-compiler-log';
7
8
  import {WebGLDevice} from '../webgl-device';
@@ -39,6 +40,7 @@ export class WEBGLShader extends Shader {
39
40
  }
40
41
 
41
42
  override async getCompilationInfo(): Promise<readonly CompilerMessage[]> {
43
+ await this._waitForCompilationComplete();
42
44
  return this.getCompilationInfoSync();
43
45
  }
44
46
 
@@ -47,9 +49,16 @@ export class WEBGLShader extends Shader {
47
49
  return parseShaderCompilerLog(log);
48
50
  }
49
51
 
52
+ override getTranslatedSource(): string | null {
53
+ const extensions = this.device.getExtension('WEBGL_debug_shaders');
54
+ const ext = extensions.WEBGL_debug_shaders;
55
+ return ext?.getTranslatedShaderSource(this.handle);
56
+ }
57
+
50
58
  // PRIVATE METHODS
51
59
 
52
- _compile(source: string): void {
60
+ /** Compile a shader and get compilation status */
61
+ protected async _compile(source: string): Promise<void> {
53
62
  const addGLSLVersion = (source: string) =>
54
63
  source.startsWith('#version ') ? source : `#version 100\n${source}`;
55
64
  source = addGLSLVersion(source);
@@ -58,18 +67,64 @@ export class WEBGLShader extends Shader {
58
67
  gl.shaderSource(this.handle, source);
59
68
  gl.compileShader(this.handle);
60
69
 
61
- // TODO - For performance reasons, avoid checking shader compilation errors on production?
62
- // TODO - Load log even when no error reported, to catch warnings?
63
- // https://gamedev.stackexchange.com/questions/30429/how-to-detect-glsl-warnings
64
- this.compilationStatus = gl.getShaderParameter(this.handle, GL.COMPILE_STATUS) ? 'success' : 'error';
70
+ // For performance reasons, avoid checking shader compilation errors on production
71
+ if (log.level === 0) {
72
+ this.compilationStatus = 'pending';
73
+ return;
74
+ }
65
75
 
66
- // The `Shader` base class will determine if debug window should be opened based on props
76
+ // Sync case - slower, but advantage is that it throws in the constructor, making break on error more useful
77
+ if (!this.device.features.has('compilation-status-async-webgl')) {
78
+ this._getCompilationStatus();
79
+ if (this.compilationStatus === 'error') {
80
+ throw new Error(`GLSL compilation errors in ${this.props.stage} shader ${this.props.id}`);
81
+ }
82
+ // The `Shader` base class will determine if debug window should be opened based on this.compilationStatus
83
+ this.debugShader();
84
+ return;
85
+ }
86
+
87
+ // async case
88
+ log.once(1, 'Shader compilation is asynchronous')();
89
+ await this._waitForCompilationComplete();
90
+ log.info(2, `Shader ${this.id} - async compilation complete: ${this.compilationStatus}`)();
91
+ this._getCompilationStatus();
92
+
93
+ // The `Shader` base class will determine if debug window should be opened based on this.compilationStatus
67
94
  this.debugShader();
95
+ }
68
96
 
69
- if (this.compilationStatus === 'error') {
70
- throw new Error(`GLSL compilation errors in ${this.props.stage} shader ${this.props.id}`);
97
+ /** Use KHR_parallel_shader_compile extension if available */
98
+ protected async _waitForCompilationComplete(): Promise<void> {
99
+ const waitMs = async (ms: number) => await new Promise(resolve => setTimeout(resolve, ms));
100
+ const DELAY_MS = 10; // Shader compilation is typically quite fast (with some exceptions)
101
+
102
+ // If status polling is not available, we can't wait for completion. Just wait a little to minimize blocking
103
+ if (!this.device.features.has('compilation-status-async-webgl')) {
104
+ await waitMs(DELAY_MS);
105
+ return;
106
+ }
107
+
108
+ const {gl} = this.device;
109
+ for (;;) {
110
+ const complete = gl.getShaderParameter(this.handle, GL.COMPLETION_STATUS_KHR);
111
+ if (complete) {
112
+ return;
113
+ }
114
+ await waitMs(DELAY_MS);
71
115
  }
72
116
  }
117
+
118
+ /**
119
+ * Get the shader compilation status
120
+ * TODO - Load log even when no error reported, to catch warnings?
121
+ * https://gamedev.stackexchange.com/questions/30429/how-to-detect-glsl-warnings
122
+ */
123
+ protected _getCompilationStatus() {
124
+ this.compilationStatus = this.device.gl.getShaderParameter(this.handle, GL.COMPILE_STATUS)
125
+ ? 'success'
126
+ : 'error';
127
+ }
73
128
  }
74
129
 
75
130
  // TODO - Original code from luma.gl v8 - keep until new debug functionality has matured
@@ -81,4 +136,3 @@ export class WEBGLShader extends Shader {
81
136
  // log.error(`GLSL compilation errors in ${shaderDescription}\n${formattedLog}`)();
82
137
  // displayShaderLog(parsedLog, source, shaderName);
83
138
  // }
84
-
@@ -0,0 +1,28 @@
1
+ // luma.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {Device, TextureViewProps} from '@luma.gl/core';
6
+ // import {decodeTextureFormat} from '@luma.gl/core';
7
+ import {TextureView, Texture} from '@luma.gl/core';
8
+
9
+ import {WebGLDevice} from '../webgl-device';
10
+ import {WEBGLTexture} from './webgl-texture';
11
+
12
+ export class WEBGLTextureView extends TextureView {
13
+ readonly device: WebGLDevice;
14
+ readonly gl: WebGL2RenderingContext;
15
+ readonly handle: WebGLTexture;
16
+
17
+ readonly texture: WEBGLTexture;
18
+
19
+ constructor(device: Device, props: TextureViewProps & {texture: WEBGLTexture}) {
20
+ super(device, {...Texture.defaultProps, ...props});
21
+
22
+ this.device = device as WebGLDevice;
23
+ this.gl = this.device.gl;
24
+ this.handle = null;
25
+
26
+ this.texture = props.texture;
27
+ }
28
+ }