@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,11 +1,12 @@
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 {TextureFormat, DeviceFeature} from '@luma.gl/core';
5
6
  import {decodeTextureFormat} from '@luma.gl/core';
6
- import {GL} from '@luma.gl/constants';
7
- import {isWebGL2} from '../../context/context/webgl-checks';
8
- import { getGLFromVertexType } from './vertex-formats';
7
+ import {GL, GLExtensions} from '@luma.gl/constants';
8
+ import {getWebGLExtension} from '../../context/helpers/webgl-extensions';
9
+ import {getGLFromVertexType} from './vertex-formats';
9
10
 
10
11
  /* eslint-disable camelcase */
11
12
 
@@ -19,6 +20,16 @@ const texture_compression_etc1_webgl: DeviceFeature = 'texture-compression-etc1-
19
20
  const texture_compression_pvrtc_webgl: DeviceFeature = 'texture-compression-pvrtc-webgl';
20
21
  const texture_compression_atc_webgl: DeviceFeature = 'texture-compression-atc-webgl';
21
22
 
23
+ const float32_renderable: DeviceFeature = 'float32-renderable-webgl';
24
+ const float16_renderable: DeviceFeature = 'float16-renderable-webgl';
25
+ const rgb9e5ufloat_renderable: DeviceFeature = 'rgb9e5ufloat_renderable-webgl';
26
+ const snorm8_renderable: DeviceFeature = 'snorm8-renderable-webgl';
27
+ const norm16_renderable: DeviceFeature = 'norm16-renderable-webgl';
28
+ const snorm16_renderable: DeviceFeature = 'snorm16-renderable-webgl';
29
+
30
+ const float32_filterable: DeviceFeature = 'float32-filterable';
31
+ const float16_filterable: DeviceFeature = 'float16-filterable-webgl';
32
+
22
33
  // Define local webgl extension strings to optimize minification
23
34
  const X_S3TC = 'WEBGL_compressed_texture_s3tc'; // BC1, BC2, BC3
24
35
  const X_S3TC_SRGB = 'WEBGL_compressed_texture_s3tc_srgb'; // BC1, BC2, BC3
@@ -31,55 +42,58 @@ const X_PVRTC = 'WEBGL_compressed_texture_pvrtc';
31
42
  const X_ATC = 'WEBGL_compressed_texture_atc';
32
43
 
33
44
  // Define local webgl extension strings to optimize minification
34
- const EXT_SRGB = 'EXT_sRGB'; // https://developer.mozilla.org/en-US/docs/Web/API/EXT_sRGB
35
- const EXT_TEXTURE_NORM16 = 'EXT_texture_norm16';
36
- const EXT_FLOAT_WEBGL1 = 'WEBGL_color_buffer_float';
37
- const EXT_FLOAT_RENDER_WEBGL2 = 'EXT_color_buffer_float';
38
- // const EXT_HALF_FLOAT_WEBGL1 = 'EXT_color_buffer_half_float';
39
- // const DEPTH = 'WEBGL_depth_texture';
40
-
41
- const checkExtension = (gl: WebGLRenderingContext, extension: string): boolean =>
42
- gl.getExtension(extension);
43
- const checkExtensions = (gl: WebGLRenderingContext, extensions: string[]): boolean =>
44
- extensions.every(extension => gl.getExtension(extension));
45
+ const EXT_texture_norm16 = 'EXT_texture_norm16';
46
+ const EXT_render_snorm = 'EXT_render_snorm';
47
+ const EXT_color_buffer_float = 'EXT_color_buffer_float';
45
48
 
46
49
  // prettier-ignore
47
- const TEXTURE_FEATURE_CHECKS: Partial<Record<DeviceFeature, (gl: WebGLRenderingContext) => boolean> > = {
48
- 'texture-blend-float-webgl1': (gl) => isWebGL2(gl) ? true : checkExtension(gl, 'EXT_float_blend'),
49
- 'texture-formats-srgb-webgl1': (gl) => (isWebGL2(gl) ? true : checkExtension(gl, EXT_SRGB)),
50
- 'texture-formats-depth-webgl1': (gl) => isWebGL2(gl) ? true : checkExtension(gl, 'WEBGL_depth_texture'),
51
- 'texture-formats-float32-webgl1': (gl) => isWebGL2(gl) ? true : checkExtension(gl, 'OES_texture_float'),
52
- 'texture-formats-float16-webgl1': (gl) => isWebGL2(gl) ? true : checkExtension(gl, 'OES_texture_half_float'),
53
- 'texture-formats-norm16-webgl': (gl) => isWebGL2(gl) ? checkExtension(gl, EXT_TEXTURE_NORM16) : false,
54
- 'texture-filter-linear-float32-webgl': (gl) => checkExtension(gl, 'OES_texture_float_linear'),
55
- 'texture-filter-linear-float16-webgl': (gl) => checkExtension(gl, 'OES_texture_half_float_linear'),
56
- 'texture-filter-anisotropic-webgl': (gl) => checkExtension(gl, 'EXT_texture_filter_anisotropic'),
57
- 'texture-renderable-float32-webgl': (gl) => checkExtension(gl, 'EXT_color_buffer_float'), // [false, 'EXT_color_buffer_float'],
58
- 'texture-renderable-float16-webgl': (gl) => checkExtension(gl, 'EXT_color_buffer_half_float'),
59
-
60
- 'texture-compression-bc': (gl) => checkExtensions(gl, [X_S3TC, X_S3TC_SRGB, X_RGTC, X_BPTC]),
61
- 'texture-compression-bc5-webgl': (gl) => checkExtensions(gl, [X_RGTC]),
62
- // 'texture-compression-bc7-webgl': gl => checkExtensions(gl, [X_BPTC]),
63
- // 'texture-compression-bc3-srgb-webgl': gl => checkExtensions(gl, [X_S3TC_SRGB]),
64
- // 'texture-compression-bc3-webgl': gl => checkExtensions(gl, [X_S3TC]),
65
- 'texture-compression-etc2': (gl) => checkExtensions(gl, [X_ETC2]),
66
- 'texture-compression-astc': (gl) => checkExtensions(gl, [X_ASTC]),
67
- 'texture-compression-etc1-webgl': (gl) => checkExtensions(gl, [X_ETC1]),
68
- 'texture-compression-pvrtc-webgl': (gl) => checkExtensions(gl, [X_PVRTC]),
69
- 'texture-compression-atc-webgl': (gl) => checkExtensions(gl, [X_ATC])
50
+ export const TEXTURE_FEATURES: Partial<Record<DeviceFeature, string[]>> = {
51
+ 'float32-renderable-webgl': ['EXT_color_buffer_float'],
52
+ 'float16-renderable-webgl': ['EXT_color_buffer_half_float'],
53
+ 'rgb9e5ufloat_renderable-webgl': ['WEBGL_render_shared_exponent'],
54
+ 'snorm8-renderable-webgl': [EXT_render_snorm],
55
+ 'norm16-renderable-webgl': [EXT_texture_norm16],
56
+ 'snorm16-renderable-webgl': [EXT_texture_norm16, EXT_render_snorm],
57
+
58
+ 'float32-filterable': ['OES_texture_float_linear'],
59
+ 'float16-filterable-webgl': ['OES_texture_half_float_linear'],
60
+ 'texture-filterable-anisotropic-webgl': ['EXT_texture_filter_anisotropic'],
61
+
62
+ 'texture-blend-float-webgl': ['EXT_float_blend'],
63
+
64
+ 'texture-compression-bc': [X_S3TC, X_S3TC_SRGB, X_RGTC, X_BPTC],
65
+ // 'texture-compression-bc3-srgb-webgl': [X_S3TC_SRGB],
66
+ // 'texture-compression-bc3-webgl': [X_S3TC],
67
+ 'texture-compression-bc5-webgl': [X_RGTC],
68
+ 'texture-compression-bc7-webgl': [X_BPTC],
69
+ 'texture-compression-etc2': [X_ETC2],
70
+ 'texture-compression-astc': [X_ASTC],
71
+ 'texture-compression-etc1-webgl': [X_ETC1],
72
+ 'texture-compression-pvrtc-webgl': [X_PVRTC],
73
+ 'texture-compression-atc-webgl': [X_ATC]
70
74
  };
71
75
 
72
- export function checkTextureFeature(gl: WebGLRenderingContext, feature: DeviceFeature): boolean {
73
- return TEXTURE_FEATURE_CHECKS[feature]?.(gl) || false;
76
+ /** Return a list of texture feature strings (for Device.features). Mainly compressed texture support */
77
+ // export function getTextureFeatures(
78
+ // gl: WebGL2RenderingContext,
79
+ // extensions: GLExtensions
80
+ // ): DeviceFeature[] {
81
+ // const textureFeatures = Object.keys(TEXTURE_FEATURES) as DeviceFeature[];
82
+ // return textureFeatures.filter(feature => checkTextureFeature(gl, feature, extensions));
83
+ // }
84
+
85
+ export function isTextureFeature(feature: DeviceFeature): boolean {
86
+ return feature in TEXTURE_FEATURES;
74
87
  }
75
88
 
76
- const checkTextureFeatures = (gl: WebGLRenderingContext, features: DeviceFeature[]): boolean =>
77
- features.every(feature => checkTextureFeature(gl, feature));
78
-
79
- /** Return a list of texture feature strings (for Device.features). Mainly compressed texture support */
80
- export function getTextureFeatures(gl: WebGLRenderingContext): DeviceFeature[] {
81
- const textureFeatures = Object.keys(TEXTURE_FEATURE_CHECKS) as DeviceFeature[];
82
- return textureFeatures.filter(feature => checkTextureFeature(gl, feature));
89
+ /** Checks a texture feature (for Device.features). Mainly compressed texture support */
90
+ export function checkTextureFeature(
91
+ gl: WebGL2RenderingContext,
92
+ feature: DeviceFeature,
93
+ extensions: GLExtensions
94
+ ): boolean {
95
+ const textureExtensions = TEXTURE_FEATURES[feature] || [];
96
+ return textureExtensions.every(extension => getWebGLExtension(gl, extension, extensions));
83
97
  }
84
98
 
85
99
  // TEXTURE FORMATS
@@ -87,9 +101,6 @@ export function getTextureFeatures(gl: WebGLRenderingContext): DeviceFeature[] {
87
101
  /** Map a format to webgl and constants */
88
102
  type Format = {
89
103
  gl?: GL;
90
- /** If a different unsized format is needed in WebGL1 */
91
- gl1?: GL;
92
- gl1ext?: string;
93
104
  /** format requires WebGL2, when using a WebGL 1 context, color renderbuffer formats are limited */
94
105
  gl2ext?: string;
95
106
 
@@ -119,59 +130,58 @@ type Format = {
119
130
  attachment?: GL.DEPTH_ATTACHMENT | GL.STENCIL_ATTACHMENT | GL.DEPTH_STENCIL_ATTACHMENT;
120
131
  /** if depthTexture is set this is a depth/stencil format that can be set to a texture */
121
132
  depthTexture?: boolean;
122
-
123
- renderbuffer?: boolean
133
+ /** @deprecated can this format be used with renderbuffers */
134
+ rb?: boolean;
124
135
  };
125
136
 
126
137
  // TABLES
127
138
 
128
- /**
139
+ /**
129
140
  * Texture format data -
130
141
  * Exported but can change without notice
131
142
  */
132
143
  // prettier-ignore
133
144
  export const TEXTURE_FORMATS: Record<TextureFormat, Format> = {
134
- // Unsized formats that leave the precision up to the driver.
135
- // TODO - Fix bpp constants
136
- // 'r8unorm-unsized': {gl: GL.LUMINANCE, b: 4, c: 2, bpp: 4},
137
- 'rgb8unorm-unsized': {gl: GL.RGB, gl1: GL.RGB, b: 4, c: 2, bpp: 4,
145
+ // Unsized formats that leave the precision up to the driver. TODO - Fix bpp constants
146
+ 'rgb8unorm-unsized': {gl: GL.RGB, b: 4, c: 2, bpp: 4,
138
147
  dataFormat: GL.RGB, types: [GL.UNSIGNED_BYTE, GL.UNSIGNED_SHORT_5_6_5]},
139
- 'rgba8unorm-unsized': {gl: GL.RGBA, gl1: GL.RGBA, b: 4, c: 2, bpp: 4,
148
+ 'rgba8unorm-unsized': {gl: GL.RGBA, b: 4, c: 2, bpp: 4,
140
149
  dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE, GL.UNSIGNED_SHORT_4_4_4_4, GL.UNSIGNED_SHORT_5_5_5_1]},
150
+ // 'r8unorm-unsized': {gl: GL.LUMINANCE, b: 4, c: 2, bpp: 4},
141
151
  // 'rgb8unorm-srgb-unsized': {gl: GL.SRGB_EXT, b: 4, c: 2, bpp: 4, gl1Ext: SRGB},
142
152
  // 'rgba8unorm-srgb-unsized': {gl: GL.SRGB_ALPHA_EXT, b: 4, c: 2, bpp: 4, gl1Ext: SRGB},
143
153
 
144
154
  // 8-bit formats
145
- 'r8unorm': {gl: GL.R8, b: 1, c: 1, renderbuffer: true},
146
- 'r8snorm': {gl: GL.R8_SNORM, b: 1, c: 1},
147
- 'r8uint': {gl: GL.R8UI, b: 1, c: 1, renderbuffer: true},
148
- 'r8sint': {gl: GL.R8I, b: 1, c: 1, renderbuffer: true},
155
+ 'r8unorm': {gl: GL.R8, b: 1, c: 1, rb: true},
156
+ 'r8snorm': {gl: GL.R8_SNORM, b: 1, c: 1, render: snorm8_renderable},
157
+ 'r8uint': {gl: GL.R8UI, b: 1, c: 1, rb: true},
158
+ 'r8sint': {gl: GL.R8I, b: 1, c: 1, rb: true},
149
159
 
150
160
  // 16-bit formats
151
- 'rg8unorm': {gl: GL.RG8, b: 2, c: 2, renderbuffer: true},
152
- 'rg8snorm': {gl: GL.RG8_SNORM, b: 2, c: 2},
153
- 'rg8uint': {gl: GL.RG8UI, b: 2, c: 2, renderbuffer: true},
154
- 'rg8sint': {gl: GL.RG8I, b: 2, c: 2, renderbuffer: true},
161
+ 'rg8unorm': {gl: GL.RG8, b: 2, c: 2, rb: true},
162
+ 'rg8snorm': {gl: GL.RG8_SNORM, b: 2, c: 2, render: snorm8_renderable},
163
+ 'rg8uint': {gl: GL.RG8UI, b: 2, c: 2, rb: true},
164
+ 'rg8sint': {gl: GL.RG8I, b: 2, c: 2, rb: true},
155
165
 
156
- 'r16uint': {gl: GL.R16UI, b: 2, c: 1, renderbuffer: true},
157
- 'r16sint': {gl: GL.R16I, b: 2, c: 1, renderbuffer: true},
158
- 'r16float': {gl: GL.R16F, b: 2, c: 1, render: 'texture-renderable-float16-webgl', filter: 'texture-filter-linear-float16-webgl', renderbuffer: true},
159
- 'r16unorm-webgl': {gl: GL.R16_EXT, b:2, c:1, f: 'texture-formats-norm16-webgl', renderbuffer: true, x: EXT_TEXTURE_NORM16},
160
- 'r16snorm-webgl': {gl: GL.R16_SNORM_EXT, b:2, c:1, f: 'texture-formats-norm16-webgl', x: EXT_TEXTURE_NORM16},
166
+ 'r16uint': {gl: GL.R16UI, b: 2, c: 1, rb: true},
167
+ 'r16sint': {gl: GL.R16I, b: 2, c: 1, rb: true},
168
+ 'r16float': {gl: GL.R16F, b: 2, c: 1, render: float16_renderable, filter: 'float16-filterable-webgl', rb: true},
169
+ 'r16unorm-webgl': {gl: GL.R16_EXT, b:2, c:1, f: norm16_renderable, rb: true},
170
+ 'r16snorm-webgl': {gl: GL.R16_SNORM_EXT, b:2, c:1, f: snorm16_renderable},
161
171
 
162
172
  // Packed 16-bit formats
163
- 'rgba4unorm-webgl': {gl: GL.RGBA4, b: 2, c: 4, wgpu: false, renderbuffer: true},
164
- 'rgb565unorm-webgl': {gl: GL.RGB565, b: 2, c: 4, wgpu: false, renderbuffer: true},
165
- 'rgb5a1unorm-webgl': {gl: GL.RGB5_A1, b: 2, c: 4, wgpu: false, renderbuffer: true},
173
+ 'rgba4unorm-webgl': {gl: GL.RGBA4, b: 2, c: 4, wgpu: false, rb: true},
174
+ 'rgb565unorm-webgl': {gl: GL.RGB565, b: 2, c: 4, wgpu: false, rb: true},
175
+ 'rgb5a1unorm-webgl': {gl: GL.RGB5_A1, b: 2, c: 4, wgpu: false, rb: true},
166
176
 
167
177
  // 24-bit formats
168
178
  'rgb8unorm-webgl': {gl: GL.RGB8, b: 3, c: 3, wgpu: false},
169
179
  'rgb8snorm-webgl': {gl: GL.RGB8_SNORM, b: 3, c: 3, wgpu: false},
170
180
 
171
181
  // 32-bit formats
172
- 'rgba8unorm': {gl: GL.RGBA8, gl1: GL.RGBA, b: 4, c: 2, bpp: 4},
173
- 'rgba8unorm-srgb': {gl: GL.SRGB8_ALPHA8, gl1: GL.SRGB_ALPHA_EXT, b: 4, c: 4, gl1ext: EXT_SRGB, bpp: 4},
174
- 'rgba8snorm': {gl: GL.RGBA8_SNORM, b: 4, c: 4},
182
+ 'rgba8unorm': {gl: GL.RGBA8, b: 4, c: 2, bpp: 4},
183
+ 'rgba8unorm-srgb': {gl: GL.SRGB8_ALPHA8, b: 4, c: 4, bpp: 4},
184
+ 'rgba8snorm': {gl: GL.RGBA8_SNORM, b: 4, c: 4, render: snorm8_renderable},
175
185
  'rgba8uint': {gl: GL.RGBA8UI, b: 4, c: 4, bpp: 4},
176
186
  'rgba8sint': {gl: GL.RGBA8I, b: 4, c: 4, bpp: 4},
177
187
  // reverse colors, webgpu only
@@ -181,58 +191,62 @@ export const TEXTURE_FORMATS: Record<TextureFormat, Format> = {
181
191
  'rg16uint': {gl: GL.RG16UI, b: 4, c: 1, bpp: 4},
182
192
  'rg16sint': {gl: GL.RG16I, b: 4, c: 2, bpp: 4},
183
193
  // When using a WebGL 2 context and the EXT_color_buffer_float WebGL2 extension
184
- 'rg16float': {gl: GL.RG16F, bpp: 4, b: 4, c: 2, render: 'texture-renderable-float16-webgl', filter: 'texture-filter-linear-float16-webgl', renderbuffer: true},
185
- 'rg16unorm-webgl': {gl: GL.RG16_EXT, b:2, c:2, f: 'texture-formats-norm16-webgl', x: EXT_TEXTURE_NORM16},
186
- 'rg16snorm-webgl': {gl: GL.RG16_SNORM_EXT, b:2, c:2, f: 'texture-formats-norm16-webgl', x: EXT_TEXTURE_NORM16},
194
+ 'rg16float': {gl: GL.RG16F, bpp: 4, b: 4, c: 2, render: float16_renderable, filter: float16_filterable, rb: true},
195
+ 'rg16unorm-webgl': {gl: GL.RG16_EXT, b:2, c:2, render: norm16_renderable},
196
+ 'rg16snorm-webgl': {gl: GL.RG16_SNORM_EXT, b:2, c:2, render: snorm16_renderable},
187
197
 
188
- 'r32uint': {gl: GL.R32UI, b: 4, c: 1, bpp: 4, renderbuffer: true},
189
- 'r32sint': {gl: GL.R32I, b: 4, c: 1, bpp: 4, renderbuffer: true},
190
- 'r32float': {gl: GL.R32F, bpp: 4, b: 4, c: 1, render: 'texture-renderable-float32-webgl', filter: 'texture-filter-linear-float32-webgl'},
198
+ 'r32uint': {gl: GL.R32UI, b: 4, c: 1, bpp: 4, rb: true},
199
+ 'r32sint': {gl: GL.R32I, b: 4, c: 1, bpp: 4, rb: true},
200
+ 'r32float': {gl: GL.R32F, bpp: 4, b: 4, c: 1, render: float32_renderable, filter: float32_filterable},
191
201
 
192
202
  // Packed 32-bit formats
193
- 'rgb9e5ufloat': {gl: GL.RGB9_E5, b: 4, c: 3, p: 1, render: 'texture-renderable-float16-webgl', filter: 'texture-filter-linear-float16-webgl'},
194
- 'rg11b10ufloat': {gl: GL.R11F_G11F_B10F, b: 4, c: 3, p: 1,render: 'texture-renderable-float32-webgl', renderbuffer: true},
195
- 'rgb10a2unorm': {gl: GL.RGB10_A2, b: 4, c: 4, p: 1, renderbuffer: true},
196
- // webgl2 only
197
- 'rgb10a2unorm-webgl': {b: 4, c: 4, gl: GL.RGB10_A2UI, p: 1, wgpu: false, bpp: 4, renderbuffer: true},
203
+ 'rgb9e5ufloat': {gl: GL.RGB9_E5, b: 4, c: 3, p: 1, render: rgb9e5ufloat_renderable}, // , filter: true},
204
+ 'rg11b10ufloat': {gl: GL.R11F_G11F_B10F, b: 4, c: 3, p: 1,render: float32_renderable, rb: true},
205
+ 'rgb10a2unorm': {gl: GL.RGB10_A2, b: 4, c: 4, p: 1, rb: true},
206
+ 'rgb10a2uint-webgl': {b: 4, c: 4, gl: GL.RGB10_A2UI, p: 1, wgpu: false, bpp: 4, rb: true},
198
207
 
199
208
  // 48-bit formats
200
- 'rgb16unorm-webgl': {gl: GL.RGB16_EXT, b:2, c:3, f: 'texture-formats-norm16-webgl', x: EXT_TEXTURE_NORM16},
201
- 'rgb16snorm-webgl': {gl: GL.RGB16_SNORM_EXT, b:2, c:3, f: 'texture-formats-norm16-webgl', x: EXT_TEXTURE_NORM16},
209
+ 'rgb16unorm-webgl': {gl: GL.RGB16_EXT, b:2, c:3, f: norm16_renderable}, // rgb not renderable
210
+ 'rgb16snorm-webgl': {gl: GL.RGB16_SNORM_EXT, b:2, c:3, f: norm16_renderable}, // rgb not renderable
202
211
 
203
212
  // 64-bit formats
204
- 'rg32uint': {gl: GL.RG32UI, b: 8, c: 2, renderbuffer: true},
205
- 'rg32sint': {gl: GL.RG32I, b: 8, c: 2, renderbuffer: true},
206
- 'rg32float': {gl: GL.RG32F, b: 8, c: 2, render: 'texture-renderable-float32-webgl', filter: 'texture-filter-linear-float32-webgl', renderbuffer: true},
207
- 'rgba16uint': {gl: GL.RGBA16UI, b: 8, c: 4, renderbuffer: true},
208
- 'rgba16sint': {gl: GL.RGBA16I, b: 8, c: 4, renderbuffer: true},
209
- 'rgba16float': {gl: GL.RGBA16F, gl1: GL.RGBA, b: 8, c: 4, render: 'texture-renderable-float16-webgl', filter: 'texture-filter-linear-float16-webgl'},
210
- 'rgba16unorm-webgl': {gl: GL.RGBA16_EXT, b:2, c:4, f: 'texture-formats-norm16-webgl', renderbuffer: true, x: EXT_TEXTURE_NORM16},
211
- 'rgba16snorm-webgl': {gl: GL.RGBA16_SNORM_EXT, b:2, c:4, f: 'texture-formats-norm16-webgl', x: EXT_TEXTURE_NORM16},
213
+ 'rg32uint': {gl: GL.RG32UI, b: 8, c: 2, rb: true},
214
+ 'rg32sint': {gl: GL.RG32I, b: 8, c: 2, rb: true},
215
+ 'rg32float': {gl: GL.RG32F, b: 8, c: 2, render: float32_renderable, filter: float32_filterable, rb: true},
216
+ 'rgba16uint': {gl: GL.RGBA16UI, b: 8, c: 4, rb: true},
217
+ 'rgba16sint': {gl: GL.RGBA16I, b: 8, c: 4, rb: true},
218
+ 'rgba16float': {gl: GL.RGBA16F, b: 8, c: 4, render: float16_renderable, filter: float16_filterable},
219
+ 'rgba16unorm-webgl': {gl: GL.RGBA16_EXT, b:2, c:4, render: norm16_renderable, rb: true},
220
+ 'rgba16snorm-webgl': {gl: GL.RGBA16_SNORM_EXT, b:2, c:4, render: snorm16_renderable},
212
221
 
213
222
  // 96-bit formats (deprecated!)
214
- 'rgb32float-webgl': {gl: GL.RGB32F, gl1: GL.RGB, render: 'texture-renderable-float32-webgl', filter: 'texture-filter-linear-float32-webgl',
215
- gl2ext: EXT_FLOAT_RENDER_WEBGL2, gl1ext: EXT_FLOAT_WEBGL1, // WebGL1 render buffers are supported with GL.RGB32F
216
- dataFormat: GL.RGB, types: [GL.FLOAT]},
223
+ 'rgb32float-webgl': {gl: GL.RGB32F, render: float32_renderable, filter: float32_filterable,
224
+ gl2ext: EXT_color_buffer_float, dataFormat: GL.RGB, types: [GL.FLOAT]},
217
225
 
218
226
  // 128-bit formats
219
- 'rgba32uint': {gl: GL.RGBA32UI, b: 16, c: 4, renderbuffer: true},
220
- 'rgba32sint': {gl: GL.RGBA32I, b: 16, c: 4, renderbuffer: true},
221
- 'rgba32float': {gl: GL.RGBA32F, b: 16, c: 4, render: 'texture-renderable-float32-webgl', filter: 'texture-filter-linear-float32-webgl', renderbuffer: true},
227
+ 'rgba32uint': {gl: GL.RGBA32UI, b: 16, c: 4, rb: true},
228
+ 'rgba32sint': {gl: GL.RGBA32I, b: 16, c: 4, rb: true},
229
+ 'rgba32float': {gl: GL.RGBA32F, b: 16, c: 4, render: float32_renderable, filter: float32_filterable, rb: true},
222
230
 
223
231
  // Depth and stencil formats
224
- 'stencil8': {gl: GL.STENCIL_INDEX8, gl1: GL.STENCIL_INDEX8, b: 1, c: 1, attachment: GL.STENCIL_ATTACHMENT, renderbuffer: true}, // 8 stencil bits
232
+ 'stencil8': {gl: GL.STENCIL_INDEX8, b: 1, c: 1, attachment: GL.STENCIL_ATTACHMENT, rb: true}, // 8 stencil bits
225
233
 
226
- 'depth16unorm': {gl: GL.DEPTH_COMPONENT16, gl1: GL.DEPTH_COMPONENT16, b: 2, c: 1, attachment: GL.DEPTH_ATTACHMENT, renderbuffer: true}, // 16 depth bits
227
- 'depth24plus': {gl: GL.DEPTH_COMPONENT24, b: 3, c: 1, attachment: GL.DEPTH_ATTACHMENT},
228
- 'depth32float': {gl: GL.DEPTH_COMPONENT32F, b: 4, c: 1, attachment: GL.DEPTH_ATTACHMENT, renderbuffer: true},
234
+ 'depth16unorm': {gl: GL.DEPTH_COMPONENT16, b: 2, c: 1, attachment: GL.DEPTH_ATTACHMENT,
235
+ dataFormat: GL.DEPTH_COMPONENT, types: [GL.UNSIGNED_SHORT], rb: true}, // 16 depth bits
236
+ 'depth24plus': {gl: GL.DEPTH_COMPONENT24, b: 3, c: 1, attachment: GL.DEPTH_ATTACHMENT,
237
+ dataFormat: GL.DEPTH_COMPONENT, types: [GL.UNSIGNED_INT]},
238
+ 'depth32float': {gl: GL.DEPTH_COMPONENT32F, b: 4, c: 1, attachment: GL.DEPTH_ATTACHMENT,
239
+ dataFormat: GL.DEPTH_COMPONENT, types: [GL.FLOAT], rb: true},
229
240
 
230
241
  // The depth component of the "depth24plus" and "depth24plus-stencil8" formats may be implemented as either a 24-bit depth value or a "depth32float" value.
231
- 'depth24plus-stencil8': {gl: GL.DEPTH_STENCIL, gl1: GL.DEPTH_STENCIL, b: 4, c: 2, p: 1, attachment: GL.DEPTH_STENCIL_ATTACHMENT, renderbuffer: true, depthTexture: true},
242
+ 'depth24plus-stencil8': {gl: GL.DEPTH24_STENCIL8, b: 4, c: 2, p: 1, attachment: GL.DEPTH_STENCIL_ATTACHMENT, rb: true, depthTexture: true,
243
+ dataFormat: GL.DEPTH_STENCIL, types: [GL.UNSIGNED_INT_24_8]},
232
244
  // "depth24unorm-stencil8" feature
233
- 'depth24unorm-stencil8': {gl: GL.DEPTH24_STENCIL8, b: 4, c: 2, p: 1, attachment: GL.DEPTH_STENCIL_ATTACHMENT, renderbuffer: true},
234
- // "depth32float-stencil8" feature
235
- 'depth32float-stencil8': {gl: GL.DEPTH32F_STENCIL8, b: 5, c: 2, p: 1, attachment: GL.DEPTH_STENCIL_ATTACHMENT, renderbuffer: true},
245
+ 'depth24unorm-stencil8': {gl: GL.DEPTH24_STENCIL8, b: 4, c: 2, p: 1, attachment: GL.DEPTH_STENCIL_ATTACHMENT,
246
+ dataFormat: GL.DEPTH_STENCIL, types: [GL.UNSIGNED_INT_24_8], rb: true},
247
+ // "depth32float-stencil8" feature - TODO below is render buffer only?
248
+ 'depth32float-stencil8': {gl: GL.DEPTH32F_STENCIL8, b: 5, c: 2, p: 1, attachment: GL.DEPTH_STENCIL_ATTACHMENT,
249
+ dataFormat: GL.DEPTH_STENCIL, types: [GL.FLOAT_32_UNSIGNED_INT_24_8_REV], rb: true},
236
250
 
237
251
  // BC compressed formats: check device.features.has("texture-compression-bc");
238
252
 
@@ -319,8 +333,8 @@ export const TEXTURE_FORMATS: Record<TextureFormat, Format> = {
319
333
  };
320
334
 
321
335
  /** Legal combinations for internalFormat, format and type *
322
- // [GL.DEPTH_COMPONENT]: {types: [GL.UNSIGNED_SHORT, GL.UNSIGNED_INT, GL.UNSIGNED_INT_24_8], gl1ext: DEPTH},
323
- // [GL.DEPTH_STENCIL]: {gl1ext: DEPTH},
336
+ // [GL.DEPTH_COMPONENT]: {types: [GL.UNSIGNED_SHORT, GL.UNSIGNED_INT, GL.UNSIGNED_INT_24_8]},
337
+ // [GL.DEPTH_STENCIL]: ,
324
338
  // Sized texture format
325
339
  // R
326
340
  [GL.R8]: {dataFormat: GL.RED, types: [GL.UNSIGNED_BYTE], gl2: true},
@@ -332,19 +346,19 @@ export const TEXTURE_FORMATS: Record<TextureFormat, Format> = {
332
346
  [GL.RG8UI]: {dataFormat: GL.RG_INTEGER, types: [GL.UNSIGNED_BYTE], gl2: true},
333
347
  // // RGB
334
348
  [GL.RGB8]: {dataFormat: GL.RGB, types: [GL.UNSIGNED_BYTE], gl2: true},
335
- [GL.SRGB8]: {dataFormat: GL.RGB, types: [GL.UNSIGNED_BYTE], gl2: true, gl1ext: EXT_SRGB},
336
- [GL.RGB16F]: {dataFormat: GL.RGB, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true, gl1ext: EXT_HALF_FLOAT_WEBGL1},
349
+ [GL.SRGB8]: {dataFormat: GL.RGB, types: [GL.UNSIGNED_BYTE], gl2: true},
350
+ [GL.RGB16F]: {dataFormat: GL.RGB, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true},
337
351
  [GL.RGB8UI]: {dataFormat: GL.RGB_INTEGER, types: [GL.UNSIGNED_BYTE], gl2: true},
338
352
  // // RGBA
339
353
 
340
354
  [GL.RGB565]: {dataFormat: GL.RGB, types: [GL.UNSIGNED_BYTE, GL.UNSIGNED_SHORT_5_6_5], gl2: true},
341
355
  [GL.R11F_G11F_B10F]: {dataFormat: GL.RGB, types: [GL.UNSIGNED_INT_10F_11F_11F_REV, GL.HALF_FLOAT, GL.FLOAT], gl2: true},
342
- [GL.RGB9_E5]: {dataFormat: GL.RGB, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true, gl1ext: EXT_HALF_FLOAT_WEBGL1},
356
+ [GL.RGB9_E5]: {dataFormat: GL.RGB, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true},
343
357
  [GL.RGBA8]: {dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE], gl2: true},
344
358
  [GL.SRGB8_ALPHA8]: {dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE], gl2: true, gl1ext: EXT_SRGB},
345
359
  [GL.RGB5_A1]: {dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE, GL.UNSIGNED_SHORT_5_5_5_1], gl2: true},
346
360
  [GL.RGBA4]: {dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE, GL.UNSIGNED_SHORT_4_4_4_4], gl2: true},
347
- [GL.RGBA16F]: {dataFormat: GL.RGBA, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true, gl1ext: EXT_HALF_FLOAT_WEBGL1},
361
+ [GL.RGBA16F]: {dataFormat: GL.RGBA, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true},
348
362
  [GL.RGBA8UI]: {dataFormat: GL.RGBA_INTEGER, types: [GL.UNSIGNED_BYTE], gl2: true}
349
363
  */
350
364
 
@@ -407,7 +421,7 @@ export const RENDERBUFFER_FORMATS: Record<string, RenderbufferFormat> = {
407
421
  [GL.RG32F]: {ext: EXT_FLOAT_WEBGL2, bpp: 8},
408
422
  // TODO - can't get WEBGL_color_buffer_float to work on renderbuffers
409
423
  [GL.RGBA32F]: {ext: EXT_FLOAT_WEBGL2, bpp: 16},
410
- // [GL.RGBA32F]: {ext: EXT_FLOAT_WEBGL2, gl1: EXT_FLOAT_WEBGL1},
424
+ // [GL.RGBA32F]: {ext: EXT_FLOAT_WEBGL2},
411
425
  [GL.R11F_G11F_B10F]: {ext: EXT_FLOAT_WEBGL2, bpp: 4}
412
426
  };
413
427
  */
@@ -445,32 +459,33 @@ const TYPE_SIZES = {
445
459
 
446
460
  /** Checks if a texture format is supported */
447
461
  export function isTextureFormatSupported(
448
- gl: WebGLRenderingContext,
449
- formatOrGL: TextureFormat | GL
462
+ gl: WebGL2RenderingContext,
463
+ format: TextureFormat,
464
+ extensions: GLExtensions
450
465
  ): boolean {
451
- const format = convertGLToTextureFormat(formatOrGL);
452
466
  const info = TEXTURE_FORMATS[format];
453
467
  if (!info) {
454
468
  return false;
455
469
  }
456
470
  // Check that we have a GL constant
457
- if (isWebGL2(gl) ? info.gl === undefined : info.gl1 === undefined) {
471
+ if (info.gl === undefined) {
458
472
  return false;
459
473
  }
460
474
  // Check extensions
461
- const extension = info.x || (isWebGL2(gl) ? info.gl2ext || info.gl1ext : info.gl1ext);
475
+ const extension = info.x || info.gl2ext;
462
476
  if (extension) {
463
- return Boolean(gl.getExtension(extension));
477
+ return Boolean(getWebGLExtension(gl, extension, extensions));
464
478
  }
465
- // if (info.gl1 === undefined && info.gl2 === undefined) {
466
- // // No info - always supported
467
- // }
468
479
  return true;
469
480
  }
470
481
 
471
- export function isRenderbufferFormatSupported(gl: WebGLRenderingContext, format: TextureFormat): boolean {
482
+ export function isRenderbufferFormatSupported(
483
+ gl: WebGL2RenderingContext,
484
+ format: TextureFormat,
485
+ extensions: GLExtensions
486
+ ): boolean {
472
487
  // Note: Order is important since the function call initializes extensions.
473
- return isTextureFormatSupported(gl, format) && TEXTURE_FORMATS[format]?.renderbuffer;
488
+ return isTextureFormatSupported(gl, format, extensions) && TEXTURE_FORMATS[format]?.rb;
474
489
  }
475
490
 
476
491
  /**
@@ -480,9 +495,7 @@ export function convertGLToTextureFormat(format: GL | TextureFormat): TextureFor
480
495
  if (typeof format === 'string') {
481
496
  return format;
482
497
  }
483
- const entry = Object.entries(TEXTURE_FORMATS).find(
484
- ([, entry]) => entry.gl === format || entry.gl1 === format
485
- );
498
+ const entry = Object.entries(TEXTURE_FORMATS).find(([, entry]) => entry.gl === format);
486
499
  if (!entry) {
487
500
  throw new Error(`Unknown texture format ${format}`);
488
501
  }
@@ -492,9 +505,9 @@ export function convertGLToTextureFormat(format: GL | TextureFormat): TextureFor
492
505
  /**
493
506
  * Map WebGPU style texture format strings to GL constants
494
507
  */
495
- export function convertTextureFormatToGL(format: TextureFormat, isWebGL2: boolean): GL | undefined {
508
+ export function convertTextureFormatToGL(format: TextureFormat): GL | undefined {
496
509
  const formatInfo = TEXTURE_FORMATS[format];
497
- const webglFormat = isWebGL2 ? formatInfo?.gl : formatInfo?.gl1;
510
+ const webglFormat = formatInfo?.gl;
498
511
  if (webglFormat === undefined) {
499
512
  throw new Error(`Unsupported texture format ${format}`);
500
513
  }
@@ -503,8 +516,9 @@ export function convertTextureFormatToGL(format: TextureFormat, isWebGL2: boolea
503
516
 
504
517
  /** Checks if a texture format is supported */
505
518
  export function getTextureFormatSupport(
506
- gl: WebGLRenderingContext,
507
- formatOrGL: TextureFormat | GL
519
+ gl: WebGL2RenderingContext,
520
+ format: TextureFormat,
521
+ extensions: GLExtensions
508
522
  ): {
509
523
  supported: boolean;
510
524
  filterable?: boolean;
@@ -512,7 +526,6 @@ export function getTextureFormatSupport(
512
526
  blendable?: boolean;
513
527
  storable?: boolean;
514
528
  } {
515
- const format = convertGLToTextureFormat(formatOrGL);
516
529
  const info = TEXTURE_FORMATS[format];
517
530
  if (!info) {
518
531
  return {supported: false};
@@ -523,21 +536,21 @@ export function getTextureFormatSupport(
523
536
  // } catch {}
524
537
 
525
538
  // Support Check that we have a GL constant
526
- let supported = isWebGL2(gl) ? info.gl === undefined : info.gl1 === undefined;
527
- supported = supported && checkTextureFeatures(gl, [info.f]);
539
+ let supported = info.gl === undefined;
540
+ supported = supported && checkTextureFeature(gl, info.f, extensions);
528
541
 
529
542
  // Filtering
530
543
  // const filterable = info.filter
531
- // ? checkTextureFeatures(gl, [info.filter])
544
+ // ? checkTextureFeature(gl, infofilter])
532
545
  // : decoded && !decoded.signed;
533
546
  // const renderable = info.filter
534
- // ? checkTextureFeatures(gl, [info.render])
547
+ // ? checkTextureFeature(gl, inforender])
535
548
  // : decoded && !decoded.signed;
536
549
 
537
550
  return {
538
551
  supported,
539
- renderable: supported && checkTextureFeatures(gl, [info.render]),
540
- filterable: supported && checkTextureFeatures(gl, [info.filter]),
552
+ renderable: supported && checkTextureFeature(gl, info.render, extensions),
553
+ filterable: supported && checkTextureFeature(gl, info.filter, extensions),
541
554
  blendable: false, // tod,
542
555
  storable: false
543
556
  };
@@ -545,11 +558,14 @@ export function getTextureFormatSupport(
545
558
 
546
559
  /** Checks whether linear filtering (interpolated sampling) is available for floating point textures */
547
560
  export function isTextureFormatFilterable(
548
- gl: WebGLRenderingContext,
549
- formatOrGL: TextureFormat | GL
561
+ gl: WebGL2RenderingContext,
562
+ format: TextureFormat,
563
+ extensions: GLExtensions
550
564
  ): boolean {
551
- const format = convertGLToTextureFormat(formatOrGL);
552
- if (!isTextureFormatSupported(gl, format)) {
565
+ if (!isTextureFormatSupported(gl, format, extensions)) {
566
+ return false;
567
+ }
568
+ if (format.startsWith('depth') || format.startsWith('stencil')) {
553
569
  return false;
554
570
  }
555
571
  try {
@@ -561,31 +577,20 @@ export function isTextureFormatFilterable(
561
577
  return false;
562
578
  }
563
579
  if (format.endsWith('32float')) {
564
- return Boolean(gl.getExtension('OES_texture_float_linear'));
580
+ return Boolean(getWebGLExtension(gl, 'OES_texture_float_linear, extensions', extensions));
565
581
  }
566
582
  if (format.endsWith('16float')) {
567
- return Boolean(gl.getExtension('OES_texture_half_float_linear'));
583
+ return Boolean(getWebGLExtension(gl, 'OES_texture_half_float_linear, extensions', extensions));
568
584
  }
569
- // if (typeof format === 'string') {
570
- // if (format === 'rgba32float') {
571
- // return gl.device.features.has('texture-renderable-rgba32float-webgl');
572
- // }
573
- // if (format.endsWith('32float')) {
574
- // return gl.device.features.has('texture-renderable-float32-webgl');
575
- // }
576
- // if (format.endsWith('16float')) {
577
- // return gl.device.features.has('texture-renderable-float16-webgl');
578
- // }
579
- // }
580
585
  return true;
581
586
  }
582
587
 
583
588
  export function isTextureFormatRenderable(
584
- gl: WebGLRenderingContext,
585
- formatOrGL: TextureFormat | GL
589
+ gl: WebGL2RenderingContext,
590
+ format: TextureFormat,
591
+ extensions: GLExtensions
586
592
  ): boolean {
587
- const format = convertGLToTextureFormat(formatOrGL);
588
- if (!isTextureFormatSupported(gl, format)) {
593
+ if (!isTextureFormatSupported(gl, format, extensions)) {
589
594
  return false;
590
595
  }
591
596
  if (typeof format === 'number') {
@@ -595,20 +600,20 @@ export function isTextureFormatRenderable(
595
600
  return true;
596
601
  }
597
602
 
598
- export function getWebGLTextureParameters(formatOrGL: TextureFormat | GL, isWebGL2: boolean) {
599
- const format = convertGLToTextureFormat(formatOrGL);
600
- const webglFormat = convertTextureFormatToGL(format, isWebGL2);
603
+ /** Get parameters necessary to work with format in WebGL: internalFormat, dataFormat, type, compressed, */
604
+ export function getWebGLTextureParameters(format: TextureFormat) {
605
+ const formatData = TEXTURE_FORMATS[format];
606
+ const webglFormat = convertTextureFormatToGL(format);
601
607
  const decoded = decodeTextureFormat(format);
602
608
  return {
603
609
  format: webglFormat,
604
- dataFormat: getWebGLPixelDataFormat(
605
- decoded.format,
606
- decoded.integer,
607
- decoded.normalized,
608
- webglFormat
609
- ),
610
+ dataFormat:
611
+ formatData?.dataFormat ||
612
+ getWebGLPixelDataFormat(decoded.format, decoded.integer, decoded.normalized, webglFormat),
610
613
  // depth formats don't have a type
611
- type: decoded.dataType ? getGLFromVertexType(decoded.dataType) : GL.UNSIGNED_BYTE,
614
+ type: decoded.dataType
615
+ ? getGLFromVertexType(decoded.dataType)
616
+ : formatData?.types?.[0] || GL.UNSIGNED_BYTE,
612
617
  // @ts-expect-error
613
618
  compressed: decoded.compressed
614
619
  };
@@ -624,59 +629,10 @@ export function getDepthStencilAttachmentWebGL(
624
629
  return info.attachment;
625
630
  }
626
631
 
627
- /**
628
- * function to test if Float 32 bit format texture can be bound as color attachment
629
- * @todo Generalize to check arbitrary formats?
630
- */
631
- export function _checkFloat32ColorAttachment(
632
- gl: WebGLRenderingContext,
633
- internalFormat = gl.RGBA,
634
- srcFormat = GL.RGBA,
635
- srcType = GL.UNSIGNED_BYTE
636
- ) {
637
- let texture: WebGLTexture | null = null;
638
- let framebuffer: WebGLFramebuffer | null = null;
639
- try {
640
- texture = gl.createTexture();
641
- gl.bindTexture(GL.TEXTURE_2D, texture);
642
-
643
- const level = 0;
644
- const width = 1;
645
- const height = 1;
646
- const border = 0;
647
- const pixel = new Uint8Array([0, 0, 255, 255]); // opaque blue
648
- gl.texImage2D(
649
- gl.TEXTURE_2D,
650
- level,
651
- internalFormat,
652
- width,
653
- height,
654
- border,
655
- srcFormat,
656
- srcType,
657
- pixel
658
- );
659
-
660
- framebuffer = gl.createFramebuffer();
661
- gl.bindFramebuffer(GL.FRAMEBUFFER, framebuffer);
662
- gl.framebufferTexture2D(GL.FRAMEBUFFER, GL.COLOR_ATTACHMENT0, GL.TEXTURE_2D, texture, 0);
663
- const status = gl.checkFramebufferStatus(GL.FRAMEBUFFER) as GL === GL.FRAMEBUFFER_COMPLETE;
664
-
665
- gl.bindTexture(GL.TEXTURE_2D, null);
666
- return status;
667
- } finally {
668
- gl.deleteTexture(texture);
669
- gl.deleteFramebuffer(framebuffer);
670
- }
671
- }
672
-
673
632
  /** TODO - VERY roundabout legacy way of calculating bytes per pixel */
674
- export function getTextureFormatBytesPerPixel(
675
- formatOrGL: TextureFormat | GL,
676
- isWebGL2: boolean
677
- ): number {
678
- const format = convertGLToTextureFormat(formatOrGL);
679
- const params = getWebGLTextureParameters(format, isWebGL2);
633
+ export function getTextureFormatBytesPerPixel(format: TextureFormat): number {
634
+ // TODO remove webgl1 support
635
+ const params = getWebGLTextureParameters(format);
680
636
  // NOTE(Tarek): Default to RGBA bytes
681
637
  const channels = DATA_FORMAT_CHANNELS[params.dataFormat] || 4;
682
638
  const channelSize = TYPE_SIZES[params.type] || 1;