@luma.gl/webgl 9.0.0-beta.1 → 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 (285) hide show
  1. package/dist/adapter/converters/device-parameters.d.ts.map +1 -1
  2. package/dist/adapter/converters/device-parameters.js +295 -156
  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 +17 -21
  9. package/dist/adapter/converters/texture-formats.d.ts.map +1 -1
  10. package/dist/adapter/converters/texture-formats.js +481 -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/webgl-device-features.d.ts +20 -0
  14. package/dist/adapter/device-helpers/webgl-device-features.d.ts.map +1 -0
  15. package/dist/adapter/device-helpers/webgl-device-features.js +98 -0
  16. package/dist/adapter/device-helpers/webgl-device-info.d.ts +5 -0
  17. package/dist/adapter/device-helpers/webgl-device-info.d.ts.map +1 -0
  18. package/dist/adapter/device-helpers/webgl-device-info.js +90 -0
  19. package/dist/adapter/device-helpers/webgl-device-limits.d.ts +35 -0
  20. package/dist/adapter/device-helpers/webgl-device-limits.d.ts.map +1 -0
  21. package/dist/adapter/device-helpers/webgl-device-limits.js +47 -0
  22. package/dist/adapter/helpers/decode-webgl-types.d.ts.map +1 -1
  23. package/dist/adapter/helpers/decode-webgl-types.js +88 -76
  24. package/dist/adapter/helpers/get-shader-layout.d.ts +1 -1
  25. package/dist/adapter/helpers/get-shader-layout.d.ts.map +1 -1
  26. package/dist/adapter/helpers/get-shader-layout.js +261 -225
  27. package/dist/adapter/helpers/parse-shader-compiler-log.d.ts.map +1 -1
  28. package/dist/adapter/helpers/parse-shader-compiler-log.js +47 -37
  29. package/dist/adapter/helpers/set-uniform.d.ts +1 -1
  30. package/dist/adapter/helpers/set-uniform.d.ts.map +1 -1
  31. package/dist/adapter/helpers/set-uniform.js +68 -82
  32. package/dist/adapter/helpers/webgl-topology-utils.d.ts.map +1 -1
  33. package/dist/adapter/helpers/webgl-topology-utils.js +78 -93
  34. package/dist/adapter/objects/constants-to-keys.d.ts +1 -1
  35. package/dist/adapter/objects/constants-to-keys.d.ts.map +1 -1
  36. package/dist/adapter/objects/constants-to-keys.js +19 -12
  37. package/dist/adapter/objects/webgl-renderbuffer.d.ts +2 -2
  38. package/dist/adapter/objects/webgl-renderbuffer.d.ts.map +1 -1
  39. package/dist/adapter/objects/webgl-renderbuffer.js +86 -77
  40. package/dist/adapter/objects/webgl-resource.d.ts +3 -25
  41. package/dist/adapter/objects/webgl-resource.d.ts.map +1 -1
  42. package/dist/adapter/objects/webgl-resource.js +102 -147
  43. package/dist/adapter/resources/webgl-buffer.d.ts +3 -4
  44. package/dist/adapter/resources/webgl-buffer.d.ts.map +1 -1
  45. package/dist/adapter/resources/webgl-buffer.js +159 -117
  46. package/dist/adapter/resources/webgl-command-buffer.d.ts +1 -1
  47. package/dist/adapter/resources/webgl-command-buffer.d.ts.map +1 -1
  48. package/dist/adapter/resources/webgl-command-buffer.js +266 -168
  49. package/dist/adapter/resources/webgl-command-encoder.d.ts +8 -3
  50. package/dist/adapter/resources/webgl-command-encoder.d.ts.map +1 -1
  51. package/dist/adapter/resources/webgl-command-encoder.js +33 -39
  52. package/dist/adapter/resources/webgl-external-texture.js +93 -1
  53. package/dist/adapter/resources/webgl-framebuffer.d.ts +8 -12
  54. package/dist/adapter/resources/webgl-framebuffer.d.ts.map +1 -1
  55. package/dist/adapter/resources/webgl-framebuffer.js +174 -139
  56. package/dist/adapter/resources/webgl-query-set.d.ts +44 -0
  57. package/dist/adapter/resources/webgl-query-set.d.ts.map +1 -0
  58. package/dist/adapter/resources/webgl-query-set.js +136 -0
  59. package/dist/adapter/resources/webgl-render-pass.d.ts +3 -1
  60. package/dist/adapter/resources/webgl-render-pass.d.ts.map +1 -1
  61. package/dist/adapter/resources/webgl-render-pass.js +124 -90
  62. package/dist/adapter/resources/webgl-render-pipeline.d.ts +15 -6
  63. package/dist/adapter/resources/webgl-render-pipeline.d.ts.map +1 -1
  64. package/dist/adapter/resources/webgl-render-pipeline.js +362 -221
  65. package/dist/adapter/resources/webgl-sampler.d.ts +1 -3
  66. package/dist/adapter/resources/webgl-sampler.d.ts.map +1 -1
  67. package/dist/adapter/resources/webgl-sampler.js +43 -33
  68. package/dist/adapter/resources/webgl-shader.d.ts +12 -2
  69. package/dist/adapter/resources/webgl-shader.d.ts.map +1 -1
  70. package/dist/adapter/resources/webgl-shader.js +114 -47
  71. package/dist/adapter/resources/webgl-texture-view.d.ts +14 -0
  72. package/dist/adapter/resources/webgl-texture-view.d.ts.map +1 -0
  73. package/dist/adapter/resources/webgl-texture-view.js +18 -0
  74. package/dist/adapter/resources/webgl-texture.d.ts +8 -10
  75. package/dist/adapter/resources/webgl-texture.d.ts.map +1 -1
  76. package/dist/adapter/resources/webgl-texture.js +616 -694
  77. package/dist/adapter/resources/webgl-transform-feedback.d.ts +2 -2
  78. package/dist/adapter/resources/webgl-transform-feedback.d.ts.map +1 -1
  79. package/dist/adapter/resources/webgl-transform-feedback.js +141 -143
  80. package/dist/adapter/resources/webgl-vertex-array.d.ts +3 -3
  81. package/dist/adapter/resources/webgl-vertex-array.d.ts.map +1 -1
  82. package/dist/adapter/resources/webgl-vertex-array.js +229 -157
  83. package/dist/adapter/webgl-canvas-context.d.ts +2 -2
  84. package/dist/adapter/webgl-canvas-context.d.ts.map +1 -1
  85. package/dist/adapter/webgl-canvas-context.js +58 -36
  86. package/dist/adapter/webgl-device.d.ts +50 -44
  87. package/dist/adapter/webgl-device.d.ts.map +1 -1
  88. package/dist/adapter/webgl-device.js +427 -352
  89. package/dist/classic/accessor.d.ts.map +1 -1
  90. package/dist/classic/accessor.js +132 -101
  91. package/dist/classic/clear.d.ts +2 -2
  92. package/dist/classic/clear.d.ts.map +1 -1
  93. package/dist/classic/clear.js +73 -72
  94. package/dist/classic/copy-and-blit.d.ts +1 -1
  95. package/dist/classic/copy-and-blit.d.ts.map +1 -1
  96. package/dist/classic/copy-and-blit.js +174 -175
  97. package/dist/classic/format-utils.d.ts +2 -2
  98. package/dist/classic/format-utils.d.ts.map +1 -1
  99. package/dist/classic/format-utils.js +39 -32
  100. package/dist/classic/typed-array-utils.d.ts.map +1 -1
  101. package/dist/classic/typed-array-utils.js +96 -81
  102. package/dist/context/debug/spector.d.ts.map +1 -1
  103. package/dist/context/debug/spector.js +55 -50
  104. package/dist/context/debug/webgl-developer-tools.d.ts +1 -2
  105. package/dist/context/debug/webgl-developer-tools.d.ts.map +1 -1
  106. package/dist/context/debug/webgl-developer-tools.js +104 -77
  107. package/dist/context/{context → helpers}/create-browser-context.d.ts +1 -6
  108. package/dist/context/helpers/create-browser-context.d.ts.map +1 -0
  109. package/dist/context/helpers/create-browser-context.js +67 -0
  110. package/dist/context/{polyfill/context-data.d.ts → helpers/webgl-context-data.d.ts} +2 -2
  111. package/dist/context/helpers/webgl-context-data.d.ts.map +1 -0
  112. package/dist/context/helpers/webgl-context-data.js +21 -0
  113. package/dist/context/helpers/webgl-extensions.d.ts +4 -0
  114. package/dist/context/helpers/webgl-extensions.d.ts.map +1 -0
  115. package/dist/context/helpers/webgl-extensions.js +10 -0
  116. package/dist/context/parameters/unified-parameter-api.d.ts +3 -4
  117. package/dist/context/parameters/unified-parameter-api.d.ts.map +1 -1
  118. package/dist/context/parameters/unified-parameter-api.js +92 -47
  119. package/dist/context/parameters/webgl-parameter-tables.d.ts +109 -99
  120. package/dist/context/parameters/webgl-parameter-tables.d.ts.map +1 -1
  121. package/dist/context/parameters/webgl-parameter-tables.js +463 -404
  122. package/dist/context/state-tracker/deep-array-equal.d.ts.map +1 -1
  123. package/dist/context/state-tracker/deep-array-equal.js +19 -14
  124. package/dist/context/state-tracker/track-context-state.d.ts +4 -4
  125. package/dist/context/state-tracker/track-context-state.d.ts.map +1 -1
  126. package/dist/context/state-tracker/track-context-state.js +188 -123
  127. package/dist/context/state-tracker/with-parameters.d.ts +2 -3
  128. package/dist/context/state-tracker/with-parameters.d.ts.map +1 -1
  129. package/dist/context/state-tracker/with-parameters.js +42 -28
  130. package/dist/dist.dev.js +4465 -7235
  131. package/dist/dist.min.js +10 -0
  132. package/dist/index.cjs +2146 -3116
  133. package/dist/index.cjs.map +7 -0
  134. package/dist/index.d.ts +25 -31
  135. package/dist/index.d.ts.map +1 -1
  136. package/dist/index.js +19 -10
  137. package/dist/types.d.ts.map +1 -1
  138. package/dist/types.js +3 -1
  139. package/dist.min.js +9 -42
  140. package/package.json +10 -15
  141. package/src/adapter/converters/device-parameters.ts +114 -28
  142. package/src/adapter/converters/sampler-parameters.ts +12 -20
  143. package/src/adapter/converters/shader-formats.ts +47 -22
  144. package/src/adapter/converters/texture-formats.ts +183 -227
  145. package/src/adapter/converters/vertex-formats.ts +3 -3
  146. package/src/adapter/device-helpers/webgl-device-features.ts +121 -0
  147. package/src/adapter/device-helpers/{get-device-info.ts → webgl-device-info.ts} +30 -22
  148. package/src/adapter/device-helpers/webgl-device-limits.ts +53 -0
  149. package/src/adapter/helpers/decode-webgl-types.ts +13 -7
  150. package/src/adapter/helpers/get-shader-layout.ts +21 -31
  151. package/src/adapter/helpers/parse-shader-compiler-log.ts +10 -6
  152. package/src/adapter/helpers/set-uniform.ts +3 -4
  153. package/src/adapter/helpers/webgl-topology-utils.ts +10 -3
  154. package/src/adapter/objects/constants-to-keys.ts +3 -2
  155. package/src/adapter/objects/webgl-renderbuffer.ts +38 -16
  156. package/src/adapter/objects/webgl-resource.ts +8 -141
  157. package/src/adapter/resources/webgl-buffer.ts +10 -14
  158. package/src/adapter/resources/webgl-command-buffer.ts +24 -34
  159. package/src/adapter/resources/webgl-command-encoder.ts +14 -11
  160. package/src/adapter/resources/webgl-external-texture.ts +7 -7
  161. package/src/adapter/resources/webgl-framebuffer.ts +65 -58
  162. package/src/adapter/resources/webgl-query-set.ts +171 -0
  163. package/src/adapter/resources/webgl-render-pass.ts +27 -18
  164. package/src/adapter/resources/webgl-render-pipeline.ts +148 -73
  165. package/src/adapter/resources/webgl-sampler.ts +7 -10
  166. package/src/adapter/resources/webgl-shader.ts +65 -11
  167. package/src/adapter/resources/webgl-texture-view.ts +28 -0
  168. package/src/adapter/resources/webgl-texture.ts +43 -106
  169. package/src/adapter/resources/webgl-transform-feedback.ts +16 -22
  170. package/src/adapter/resources/webgl-vertex-array.ts +20 -21
  171. package/src/adapter/webgl-canvas-context.ts +7 -11
  172. package/src/adapter/webgl-device.ts +142 -162
  173. package/src/classic/accessor.ts +5 -4
  174. package/src/classic/clear.ts +25 -20
  175. package/src/classic/copy-and-blit.ts +12 -6
  176. package/src/classic/format-utils.ts +2 -1
  177. package/src/classic/typed-array-utils.ts +3 -7
  178. package/src/context/debug/spector.ts +9 -6
  179. package/src/context/debug/webgl-developer-tools.ts +31 -20
  180. package/src/context/{context → helpers}/create-browser-context.ts +9 -33
  181. package/src/context/{polyfill/context-data.ts → helpers/webgl-context-data.ts} +3 -2
  182. package/src/context/helpers/webgl-extensions.ts +17 -0
  183. package/src/context/parameters/unified-parameter-api.ts +6 -17
  184. package/src/context/parameters/webgl-parameter-tables.ts +118 -90
  185. package/src/context/state-tracker/deep-array-equal.ts +2 -1
  186. package/src/context/state-tracker/track-context-state.ts +29 -23
  187. package/src/context/state-tracker/with-parameters.ts +8 -8
  188. package/src/index.ts +16 -56
  189. package/src/types.ts +2 -1
  190. package/dist/adapter/converters/device-parameters.js.map +0 -1
  191. package/dist/adapter/converters/sampler-parameters.js.map +0 -1
  192. package/dist/adapter/converters/shader-formats.js.map +0 -1
  193. package/dist/adapter/converters/texture-formats.js.map +0 -1
  194. package/dist/adapter/converters/vertex-formats.js.map +0 -1
  195. package/dist/adapter/device-helpers/device-features.d.ts +0 -9
  196. package/dist/adapter/device-helpers/device-features.d.ts.map +0 -1
  197. package/dist/adapter/device-helpers/device-features.js +0 -96
  198. package/dist/adapter/device-helpers/device-features.js.map +0 -1
  199. package/dist/adapter/device-helpers/device-limits.d.ts +0 -52
  200. package/dist/adapter/device-helpers/device-limits.d.ts.map +0 -1
  201. package/dist/adapter/device-helpers/device-limits.js +0 -87
  202. package/dist/adapter/device-helpers/device-limits.js.map +0 -1
  203. package/dist/adapter/device-helpers/get-device-info.d.ts +0 -4
  204. package/dist/adapter/device-helpers/get-device-info.d.ts.map +0 -1
  205. package/dist/adapter/device-helpers/get-device-info.js +0 -71
  206. package/dist/adapter/device-helpers/get-device-info.js.map +0 -1
  207. package/dist/adapter/device-helpers/is-old-ie.d.ts +0 -2
  208. package/dist/adapter/device-helpers/is-old-ie.d.ts.map +0 -1
  209. package/dist/adapter/device-helpers/is-old-ie.js +0 -9
  210. package/dist/adapter/device-helpers/is-old-ie.js.map +0 -1
  211. package/dist/adapter/helpers/decode-webgl-types.js.map +0 -1
  212. package/dist/adapter/helpers/get-shader-layout.js.map +0 -1
  213. package/dist/adapter/helpers/parse-shader-compiler-log.js.map +0 -1
  214. package/dist/adapter/helpers/set-uniform.js.map +0 -1
  215. package/dist/adapter/helpers/webgl-topology-utils.js.map +0 -1
  216. package/dist/adapter/objects/constants-to-keys.js.map +0 -1
  217. package/dist/adapter/objects/webgl-renderbuffer.js.map +0 -1
  218. package/dist/adapter/objects/webgl-resource.js.map +0 -1
  219. package/dist/adapter/resources/webgl-buffer.js.map +0 -1
  220. package/dist/adapter/resources/webgl-command-buffer.js.map +0 -1
  221. package/dist/adapter/resources/webgl-command-encoder.js.map +0 -1
  222. package/dist/adapter/resources/webgl-external-texture.js.map +0 -1
  223. package/dist/adapter/resources/webgl-framebuffer.js.map +0 -1
  224. package/dist/adapter/resources/webgl-render-pass.js.map +0 -1
  225. package/dist/adapter/resources/webgl-render-pipeline.js.map +0 -1
  226. package/dist/adapter/resources/webgl-sampler.js.map +0 -1
  227. package/dist/adapter/resources/webgl-shader.js.map +0 -1
  228. package/dist/adapter/resources/webgl-texture.js.map +0 -1
  229. package/dist/adapter/resources/webgl-transform-feedback.js.map +0 -1
  230. package/dist/adapter/resources/webgl-vertex-array.js.map +0 -1
  231. package/dist/adapter/webgl-canvas-context.js.map +0 -1
  232. package/dist/adapter/webgl-device.js.map +0 -1
  233. package/dist/classic/accessor.js.map +0 -1
  234. package/dist/classic/clear.js.map +0 -1
  235. package/dist/classic/copy-and-blit.js.map +0 -1
  236. package/dist/classic/format-utils.js.map +0 -1
  237. package/dist/classic/typed-array-utils.js.map +0 -1
  238. package/dist/context/context/create-browser-context.d.ts.map +0 -1
  239. package/dist/context/context/create-browser-context.js +0 -53
  240. package/dist/context/context/create-browser-context.js.map +0 -1
  241. package/dist/context/context/create-headless-context.d.ts +0 -9
  242. package/dist/context/context/create-headless-context.d.ts.map +0 -1
  243. package/dist/context/context/create-headless-context.js +0 -42
  244. package/dist/context/context/create-headless-context.js.map +0 -1
  245. package/dist/context/context/webgl-checks.d.ts +0 -13
  246. package/dist/context/context/webgl-checks.d.ts.map +0 -1
  247. package/dist/context/context/webgl-checks.js +0 -31
  248. package/dist/context/context/webgl-checks.js.map +0 -1
  249. package/dist/context/debug/spector.js.map +0 -1
  250. package/dist/context/debug/webgl-developer-tools.js.map +0 -1
  251. package/dist/context/parameters/unified-parameter-api.js.map +0 -1
  252. package/dist/context/parameters/webgl-parameter-tables.js.map +0 -1
  253. package/dist/context/polyfill/context-data.d.ts.map +0 -1
  254. package/dist/context/polyfill/context-data.js +0 -12
  255. package/dist/context/polyfill/context-data.js.map +0 -1
  256. package/dist/context/polyfill/get-parameter-polyfill.d.ts +0 -2
  257. package/dist/context/polyfill/get-parameter-polyfill.d.ts.map +0 -1
  258. package/dist/context/polyfill/get-parameter-polyfill.js +0 -85
  259. package/dist/context/polyfill/get-parameter-polyfill.js.map +0 -1
  260. package/dist/context/polyfill/polyfill-context.d.ts +0 -5
  261. package/dist/context/polyfill/polyfill-context.d.ts.map +0 -1
  262. package/dist/context/polyfill/polyfill-context.js +0 -87
  263. package/dist/context/polyfill/polyfill-context.js.map +0 -1
  264. package/dist/context/polyfill/polyfill-table.d.ts +0 -48
  265. package/dist/context/polyfill/polyfill-table.d.ts.map +0 -1
  266. package/dist/context/polyfill/polyfill-table.js +0 -137
  267. package/dist/context/polyfill/polyfill-table.js.map +0 -1
  268. package/dist/context/polyfill/polyfill-vertex-array-object.d.ts +0 -2
  269. package/dist/context/polyfill/polyfill-vertex-array-object.d.ts.map +0 -1
  270. package/dist/context/polyfill/polyfill-vertex-array-object.js +0 -265
  271. package/dist/context/polyfill/polyfill-vertex-array-object.js.map +0 -1
  272. package/dist/context/state-tracker/deep-array-equal.js.map +0 -1
  273. package/dist/context/state-tracker/track-context-state.js.map +0 -1
  274. package/dist/context/state-tracker/with-parameters.js.map +0 -1
  275. package/dist/index.js.map +0 -1
  276. package/dist/types.js.map +0 -1
  277. package/src/adapter/device-helpers/device-features.ts +0 -161
  278. package/src/adapter/device-helpers/device-limits.ts +0 -155
  279. package/src/adapter/device-helpers/is-old-ie.ts +0 -14
  280. package/src/context/context/create-headless-context.ts +0 -51
  281. package/src/context/context/webgl-checks.ts +0 -51
  282. package/src/context/polyfill/get-parameter-polyfill.ts +0 -122
  283. package/src/context/polyfill/polyfill-context.ts +0 -104
  284. package/src/context/polyfill/polyfill-table.ts +0 -167
  285. 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
@@ -194,15 +193,27 @@ export class WEBGLRenderPipeline extends RenderPipeline {
194
193
  const glIndexType = (vertexArray.indexBuffer as WEBGLBuffer)?.glIndexType;
195
194
  const isInstanced: boolean = Number(instanceCount) > 0;
196
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
+ }
201
+
197
202
  // Avoid WebGL draw call when not rendering any data or values are incomplete
198
203
  // Note: async textures set as uniforms might still be loading.
199
204
  // Now that all uniforms have been updated, check if any texture
200
205
  // in the uniforms is not yet initialized, then we don't draw
201
206
  if (!this._areTexturesRenderable() || vertexCount === 0) {
202
- // (isInstanced && instanceCount === 0)
207
+ log.info(2, `RenderPipeline:${this.id}.draw() aborted - textures not yet loaded`)();
203
208
  return false;
204
209
  }
205
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
+
206
217
  this.device.gl.useProgram(this.handle);
207
218
 
208
219
  // Note: Rebinds constant attributes before each draw call
@@ -217,31 +228,6 @@ export class WEBGLRenderPipeline extends RenderPipeline {
217
228
  this._applyUniforms();
218
229
 
219
230
  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
231
 
246
232
  withDeviceAndGLParameters(
247
233
  this.device,
@@ -249,8 +235,7 @@ export class WEBGLRenderPipeline extends RenderPipeline {
249
235
  webglRenderPass.glParameters,
250
236
  () => {
251
237
  if (isIndexed && isInstanced) {
252
- // ANGLE_instanced_arrays extension
253
- this.device.gl2?.drawElementsInstanced(
238
+ this.device.gl.drawElementsInstanced(
254
239
  glDrawMode,
255
240
  vertexCount || 0, // indexCount?
256
241
  glIndexType,
@@ -258,11 +243,11 @@ export class WEBGLRenderPipeline extends RenderPipeline {
258
243
  instanceCount || 0
259
244
  );
260
245
  // } else if (isIndexed && this.device.isWebGL2 && !isNaN(start) && !isNaN(end)) {
261
- // this.device.gl2.drawRangeElements(glDrawMode, start, end, vertexCount, glIndexType, offset);
246
+ // this.device.gldrawRangeElements(glDrawMode, start, end, vertexCount, glIndexType, offset);
262
247
  } else if (isIndexed) {
263
248
  this.device.gl.drawElements(glDrawMode, vertexCount || 0, glIndexType, firstVertex); // indexCount?
264
249
  } else if (isInstanced) {
265
- this.device.gl2?.drawArraysInstanced(
250
+ this.device.gl.drawArraysInstanced(
266
251
  glDrawMode,
267
252
  firstVertex,
268
253
  vertexCount || 0,
@@ -283,10 +268,27 @@ export class WEBGLRenderPipeline extends RenderPipeline {
283
268
  return true;
284
269
  }
285
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
+
286
288
  // setAttributes(attributes: Record<string, Buffer>): void {}
287
289
  // setBindings(bindings: Record<string, Binding>): void {}
288
290
 
289
- protected _compileAndLink() {
291
+ protected async _linkShaders() {
290
292
  const {gl} = this.device;
291
293
  gl.attachShader(this.handle, this.vs.handle);
292
294
  gl.attachShader(this.handle, this.fs.handle);
@@ -294,25 +296,89 @@ export class WEBGLRenderPipeline extends RenderPipeline {
294
296
  gl.linkProgram(this.handle);
295
297
  log.timeEnd(LOG_PROGRAM_PERF_PRIORITY, `linkProgram for ${this.id}`)();
296
298
 
297
- // Avoid checking program linking error in production
298
- // @ts-expect-error
299
- if (!gl.debug && log.level === 0) {
299
+ // TODO Avoid checking program linking error in production
300
+ if (log.level === 0) {
300
301
  // return;
301
302
  }
302
303
 
304
+ if (!this.device.features.has('compilation-status-async-webgl')) {
305
+ const status = this._getLinkStatus();
306
+ this._reportLinkStatus(status);
307
+ return;
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);
316
+ }
317
+
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;
303
345
  const linked = gl.getProgramParameter(this.handle, gl.LINK_STATUS);
304
346
  if (!linked) {
305
- throw new Error(`Error linking: ${gl.getProgramInfoLog(this.handle)}`);
347
+ this.linkStatus = 'error';
348
+ return 'linking';
306
349
  }
307
350
 
308
351
  gl.validateProgram(this.handle);
309
352
  const validated = gl.getProgramParameter(this.handle, gl.VALIDATE_STATUS);
310
353
  if (!validated) {
311
- throw new Error(`Error validating: ${gl.getProgramInfoLog(this.handle)}`);
354
+ this.linkStatus = 'error';
355
+ return 'validation';
312
356
  }
357
+
358
+ this.linkStatus = 'success';
359
+ return 'success';
313
360
  }
314
361
 
315
- // PRIVATE METHODS
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
+ }
316
382
 
317
383
  /**
318
384
  * Checks if all texture-values uniforms are renderable (i.e. loaded)
@@ -334,13 +400,14 @@ export class WEBGLRenderPipeline extends RenderPipeline {
334
400
 
335
401
  /** Apply any bindings (before each draw call) */
336
402
  _applyBindings() {
337
- this.device.gl.useProgram(this.handle);
338
-
339
- const {gl2} = this.device;
340
- if (!gl2) {
341
- 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;
342
406
  }
343
407
 
408
+ const {gl} = this.device;
409
+ gl.useProgram(this.handle);
410
+
344
411
  let textureUnit = 0;
345
412
  let uniformBufferIndex = 0;
346
413
  for (const binding of this.shaderLayout.bindings) {
@@ -354,16 +421,16 @@ export class WEBGLRenderPipeline extends RenderPipeline {
354
421
  case 'uniform':
355
422
  // Set buffer
356
423
  const {name} = binding;
357
- const location = gl2.getUniformBlockIndex(this.handle, name);
358
- if (location as GL === GL.INVALID_INDEX) {
424
+ const location = gl.getUniformBlockIndex(this.handle, name);
425
+ if ((location as GL) === GL.INVALID_INDEX) {
359
426
  throw new Error(`Invalid uniform block name ${name}`);
360
427
  }
361
- gl2.uniformBlockBinding(this.handle, uniformBufferIndex, location);
428
+ gl.uniformBlockBinding(this.handle, uniformBufferIndex, location);
362
429
  // console.debug(binding, location);
363
430
  if (value instanceof WEBGLBuffer) {
364
- gl2.bindBufferBase(GL.UNIFORM_BUFFER, uniformBufferIndex, value.handle);
431
+ gl.bindBufferBase(GL.UNIFORM_BUFFER, uniformBufferIndex, value.handle);
365
432
  } else {
366
- gl2.bindBufferRange(
433
+ gl.bindBufferRange(
367
434
  GL.UNIFORM_BUFFER,
368
435
  uniformBufferIndex,
369
436
  // @ts-expect-error
@@ -378,27 +445,35 @@ export class WEBGLRenderPipeline extends RenderPipeline {
378
445
  break;
379
446
 
380
447
  case 'texture':
381
- if (!(value instanceof WEBGLTexture || value instanceof WEBGLFramebuffer)) {
448
+ if (
449
+ !(
450
+ value instanceof WEBGLTextureView ||
451
+ value instanceof WEBGLTexture ||
452
+ value instanceof WEBGLFramebuffer
453
+ )
454
+ ) {
382
455
  throw new Error('texture');
383
456
  }
384
457
  let texture: WEBGLTexture;
385
- if (value instanceof WEBGLTexture) {
458
+ if (value instanceof WEBGLTextureView) {
459
+ texture = value.texture;
460
+ } else if (value instanceof WEBGLTexture) {
386
461
  texture = value;
387
462
  } else if (
388
463
  value instanceof WEBGLFramebuffer &&
389
- value.colorAttachments[0] instanceof WEBGLTexture
464
+ value.colorAttachments[0] instanceof WEBGLTextureView
390
465
  ) {
391
466
  log.warn(
392
467
  'Passing framebuffer in texture binding may be deprecated. Use fbo.colorAttachments[0] instead'
393
468
  )();
394
- texture = value.colorAttachments[0];
469
+ texture = value.colorAttachments[0].texture;
395
470
  } else {
396
471
  throw new Error('No texture');
397
472
  }
398
473
 
399
- gl2.activeTexture(GL.TEXTURE0 + textureUnit);
400
- gl2.bindTexture(texture.target, texture.handle);
401
- // gl2.bindSampler(textureUnit, sampler.handle);
474
+ gl.activeTexture(GL.TEXTURE0 + textureUnit);
475
+ gl.bindTexture(texture.target, texture.handle);
476
+ // gl.bindSampler(textureUnit, sampler.handle);
402
477
  textureUnit += 1;
403
478
  break;
404
479
 
@@ -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
+ }