@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 {FramebufferProps, TextureFormat} from '@luma.gl/core';
@@ -6,16 +7,18 @@ import {Framebuffer, Texture, assert} from '@luma.gl/core';
6
7
  import {GL} from '@luma.gl/constants';
7
8
  import {WebGLDevice} from '../webgl-device';
8
9
  import {WEBGLTexture} from './webgl-texture';
9
- import {WEBGLRenderbuffer} from '../objects/webgl-renderbuffer';
10
+ import {WEBGLTextureView} from './webgl-texture-view';
10
11
  import {getDepthStencilAttachmentWebGL} from '../converters/texture-formats';
11
12
 
12
- export type TextureAttachment = [Texture, number?, number?];
13
- export type Attachment = WEBGLTexture | WEBGLRenderbuffer | TextureAttachment;
13
+ // TODO - for now we don't see a usage for renderbuffers in WebGL 2.
14
+ // import {WEBGLRenderbuffer} from '../objects/webgl-renderbuffer';
15
+
16
+ export type Attachment = WEBGLTextureView | WEBGLTexture; // | WEBGLRenderbuffer;
14
17
 
15
18
  /** luma.gl Framebuffer, WebGL implementation */
16
19
  export class WEBGLFramebuffer extends Framebuffer {
17
20
  device: WebGLDevice;
18
- gl: WebGLRenderingContext;
21
+ gl: WebGL2RenderingContext;
19
22
  handle: WebGLFramebuffer;
20
23
 
21
24
  get texture() {
@@ -45,26 +48,30 @@ export class WEBGLFramebuffer extends Framebuffer {
45
48
 
46
49
  // Walk the attachments
47
50
  for (let i = 0; i < this.colorAttachments.length; ++i) {
48
- const attachment = this.colorAttachments[i];
51
+ const attachment = this.colorAttachments[i] as WEBGLTextureView;
49
52
  const attachmentPoint = GL.COLOR_ATTACHMENT0 + i;
50
53
  if (attachment) {
51
- this._attachOne(attachmentPoint, attachment as WEBGLTexture);
54
+ this._attachOne(attachmentPoint, attachment);
52
55
  }
53
56
  }
54
57
 
55
58
  if (this.depthStencilAttachment) {
56
59
  this._attachOne(
57
- getDepthStencilAttachmentWebGL(this.depthStencilAttachment.format),
58
- this.depthStencilAttachment as WEBGLTexture
60
+ getDepthStencilAttachmentWebGL(this.depthStencilAttachment.props.format),
61
+ this.depthStencilAttachment as WEBGLTextureView
59
62
  );
60
63
  }
61
64
 
62
- this.gl.bindFramebuffer(GL.FRAMEBUFFER, null);
63
- }
65
+ /** Check the status */
66
+ // @ts-expect-error
67
+ if (props.check !== false) {
68
+ const status = this.gl.checkFramebufferStatus(GL.FRAMEBUFFER) as GL;
69
+ if (status !== GL.FRAMEBUFFER_COMPLETE) {
70
+ throw new Error(`Framebuffer ${_getFrameBufferStatus(status)}`);
71
+ }
72
+ }
64
73
 
65
- // @ts-expect-error
66
- if (props.check !== false) {
67
- this._checkStatus();
74
+ this.gl.bindFramebuffer(GL.FRAMEBUFFER, null);
68
75
  }
69
76
  }
70
77
 
@@ -79,32 +86,20 @@ export class WEBGLFramebuffer extends Framebuffer {
79
86
 
80
87
  // PRIVATE
81
88
 
82
- /** Check the status */
83
- protected _checkStatus(): void {
84
- const {gl} = this;
85
- // TODO - should we really rely on this trick?
86
- const prevHandle = gl.bindFramebuffer(GL.FRAMEBUFFER, this.handle) as unknown as WebGLFramebuffer;
87
- const status = gl.checkFramebufferStatus(GL.FRAMEBUFFER);
88
- gl.bindFramebuffer(GL.FRAMEBUFFER, prevHandle || null);
89
- if (status !== gl.FRAMEBUFFER_COMPLETE) {
90
- throw new Error(`Framebuffer ${_getFrameBufferStatus(status)}`);
91
- }
92
- }
93
-
94
89
  /** In WebGL we must use renderbuffers for depth/stencil attachments (unless we have extensions) */
95
90
  protected override createDepthStencilTexture(format: TextureFormat): Texture {
96
- return new WEBGLRenderbuffer(this.device, {
97
- id: `${this.id}-depth-stencil`, // TODO misleading if not depth and stencil?
91
+ // return new WEBGLRenderbuffer(this.device, {
92
+ return new WEBGLTexture(this.device, {
93
+ id: `${this.id}-depth-stencil`,
98
94
  format,
99
- // dataFormat: GL.DEPTH_STENCIL,
100
- // type: GL.UNSIGNED_INT_24_8,
101
95
  width: this.width,
102
- height: this.height
103
- }) as unknown as WEBGLTexture;
96
+ height: this.height,
97
+ mipmaps: false
98
+ });
104
99
  }
105
100
 
106
- /**
107
- * Attachment resize is expected to be a noop if size is same
101
+ /**
102
+ * Attachment resize is expected to be a noop if size is same
108
103
  */
109
104
  protected override resizeAttachments(width: number, height: number): this {
110
105
  // for default framebuffer, just update the stored size
@@ -125,47 +120,57 @@ export class WEBGLFramebuffer extends Framebuffer {
125
120
  // TODO Not clear that this is better than default destroy/create implementation
126
121
 
127
122
  for (const colorAttachment of this.colorAttachments) {
128
- (colorAttachment as WEBGLTexture).resize({width, height});
123
+ (colorAttachment.texture as WEBGLTexture).resize({width, height});
129
124
  }
130
125
  if (this.depthStencilAttachment) {
131
- (this.depthStencilAttachment as WEBGLTexture).resize({width, height});
126
+ (this.depthStencilAttachment.texture as WEBGLTexture).resize({width, height});
132
127
  }
133
128
  return this;
134
129
  }
135
130
 
136
131
  /** Attach one attachment */
137
- protected _attachOne(
138
- attachmentPoint: GL,
139
- attachment: Attachment
140
- ): WEBGLTexture | WEBGLRenderbuffer {
141
- if (attachment instanceof WEBGLRenderbuffer) {
142
- this._attachWEBGLRenderbuffer(attachmentPoint, attachment);
143
- return attachment;
144
- } else if (Array.isArray(attachment)) {
132
+ protected _attachOne(attachmentPoint: GL, attachment: Attachment): WEBGLTexture {
133
+ // if (attachment instanceof WEBGLRenderbuffer) {
134
+ // this._attachWEBGLRenderbuffer(attachmentPoint, attachment);
135
+ // return attachment;
136
+ // }
137
+ if (Array.isArray(attachment)) {
145
138
  const [texture, layer = 0, level = 0] = attachment;
146
139
  this._attachTexture(attachmentPoint, texture as unknown as WEBGLTexture, layer, level);
147
140
  return texture as unknown as WEBGLTexture;
148
- } else if (attachment instanceof WEBGLTexture) {
141
+ }
142
+ if (attachment instanceof WEBGLTexture) {
149
143
  this._attachTexture(attachmentPoint, attachment, 0, 0);
150
144
  return attachment;
151
145
  }
146
+ if (attachment instanceof WEBGLTextureView) {
147
+ const textureView = attachment;
148
+ this._attachTexture(
149
+ attachmentPoint,
150
+ textureView.texture,
151
+ textureView.props.baseMipLevel,
152
+ textureView.props.baseArrayLayer
153
+ );
154
+ return attachment.texture;
155
+ }
152
156
  throw new Error('attach');
153
157
  }
154
158
 
155
- protected _attachWEBGLRenderbuffer(attachment: GL, renderbuffer: WEBGLRenderbuffer): void {
156
- this.gl.framebufferRenderbuffer(
157
- GL.FRAMEBUFFER,
158
- attachment,
159
- GL.RENDERBUFFER,
160
- renderbuffer.handle
161
- );
162
- }
159
+ // TODO - we do not seem to need render buffers in WebGL 2
160
+ // protected _attachWEBGLRenderbuffer(attachment: GL, renderbuffer: WEBGLRenderbuffer): void {
161
+ // this.gl.framebufferRenderbuffer(
162
+ // GL.FRAMEBUFFER,
163
+ // attachment,
164
+ // GL.RENDERBUFFER,
165
+ // renderbuffer.handle
166
+ // );
167
+ // }
163
168
 
164
169
  /**
165
170
  * @param attachment
166
171
  * @param texture
167
172
  * @param layer = 0 - index into WEBGLTextureArray and Texture3D or face for `TextureCubeMap`
168
- * @param level = 0 - mipmapLevel (must be 0 in WebGL1)
173
+ * @param level = 0 - mipmapLevel
169
174
  */
170
175
  protected _attachTexture(
171
176
  attachment: GL,
@@ -173,14 +178,14 @@ export class WEBGLFramebuffer extends Framebuffer {
173
178
  layer: number,
174
179
  level: number
175
180
  ): void {
176
- const {gl, gl2} = this.device;
181
+ const {gl} = this.device;
182
+
177
183
  gl.bindTexture(texture.target, texture.handle);
178
184
 
179
185
  switch (texture.target) {
180
186
  case GL.TEXTURE_2D_ARRAY:
181
187
  case GL.TEXTURE_3D:
182
- this.device.assertWebGL2();
183
- gl2?.framebufferTextureLayer(GL.FRAMEBUFFER, attachment, texture.target, level, layer);
188
+ gl.framebufferTextureLayer(GL.FRAMEBUFFER, attachment, texture.target, level, layer);
184
189
  break;
185
190
 
186
191
  case GL.TEXTURE_CUBE_MAP:
@@ -207,7 +212,9 @@ export class WEBGLFramebuffer extends Framebuffer {
207
212
  function mapIndexToCubeMapFace(layer: number | GL): GL {
208
213
  // TEXTURE_CUBE_MAP_POSITIVE_X is a big value (0x8515)
209
214
  // if smaller assume layer is index, otherwise assume it is already a cube map face constant
210
- return layer < (GL.TEXTURE_CUBE_MAP_POSITIVE_X as number) ? layer + GL.TEXTURE_CUBE_MAP_POSITIVE_X : layer;
215
+ return layer < (GL.TEXTURE_CUBE_MAP_POSITIVE_X as number)
216
+ ? layer + GL.TEXTURE_CUBE_MAP_POSITIVE_X
217
+ : layer;
211
218
  }
212
219
 
213
220
  // Helper METHODS
@@ -0,0 +1,171 @@
1
+ // WebGL2 Query (also handles disjoint timer extensions)
2
+ import {QuerySet, QuerySetProps} from '@luma.gl/core';
3
+ import {GL} from '@luma.gl/constants';
4
+ import {WebGLDevice} from '../webgl-device';
5
+
6
+ /**
7
+ * Asynchronous queries for different kinds of information
8
+ */
9
+ export class WEBGLQuerySet extends QuerySet {
10
+ device: WebGLDevice;
11
+ handle: WebGLQuery;
12
+
13
+ target: number | null = null;
14
+ _queryPending = false;
15
+ _pollingPromise: Promise<any> | null = null;
16
+
17
+ override get [Symbol.toStringTag](): string {
18
+ return 'Query';
19
+ }
20
+
21
+ // Create a query class
22
+ constructor(device: WebGLDevice, props: QuerySetProps) {
23
+ super(device, props);
24
+ this.device = device;
25
+
26
+ if (props.count > 1) {
27
+ throw new Error('WebGL QuerySet can only have one value');
28
+ }
29
+
30
+ this.handle = this.device.gl.createQuery();
31
+ Object.seal(this);
32
+ }
33
+
34
+ override destroy() {
35
+ this.device.gl.deleteQuery(this.handle);
36
+ }
37
+
38
+ // FOR RENDER PASS AND COMMAND ENCODER
39
+
40
+ /**
41
+ * Shortcut for timer query (dependent on extension in both WebGL1 and 2)
42
+ * Measures GPU time delta between this call and a matching `end` call in the
43
+ * GPU instruction stream.
44
+ */
45
+ beginTimestampQuery(): void {
46
+ return this._begin(GL.TIME_ELAPSED_EXT);
47
+ }
48
+
49
+ endTimestampQuery(): void {
50
+ this._end();
51
+ }
52
+
53
+ // Shortcut for occlusion queries
54
+ beginOcclusionQuery(options?: {conservative?: boolean}): void {
55
+ return this._begin(
56
+ options?.conservative ? GL.ANY_SAMPLES_PASSED_CONSERVATIVE : GL.ANY_SAMPLES_PASSED
57
+ );
58
+ }
59
+
60
+ endOcclusionQuery() {
61
+ this._end();
62
+ }
63
+
64
+ // Shortcut for transformFeedbackQuery
65
+ beginTransformFeedbackQuery(): void {
66
+ return this._begin(GL.TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
67
+ }
68
+
69
+ endTransformFeedbackQuery(): void {
70
+ this._end();
71
+ }
72
+
73
+ async resolveQuery(): Promise<bigint[]> {
74
+ const value = await this.pollQuery();
75
+ return [value];
76
+ }
77
+
78
+ // PRIVATE METHODS
79
+
80
+ /**
81
+ * Due to OpenGL API limitations, after calling `begin()` on one Query
82
+ * instance, `end()` must be called on that same instance before
83
+ * calling `begin()` on another query. While there can be multiple
84
+ * outstanding queries representing disjoint `begin()`/`end()` intervals.
85
+ * It is not possible to interleave or overlap `begin` and `end` calls.
86
+ */
87
+ protected _begin(target: number): void {
88
+ // Don't start a new query if one is already active.
89
+ if (this._queryPending) {
90
+ return;
91
+ }
92
+
93
+ this.target = target;
94
+ this.device.gl.beginQuery(this.target, this.handle);
95
+
96
+ return;
97
+ }
98
+
99
+ // ends the current query
100
+ protected _end(): void {
101
+ // Can't end a new query if the last one hasn't been resolved.
102
+ if (this._queryPending) {
103
+ return;
104
+ }
105
+
106
+ if (this.target) {
107
+ this.device.gl.endQuery(this.target);
108
+ this.target = null;
109
+ this._queryPending = true;
110
+ }
111
+ return;
112
+ }
113
+
114
+ // Returns true if the query result is available
115
+ isResultAvailable(): boolean {
116
+ if (!this._queryPending) {
117
+ return false;
118
+ }
119
+
120
+ const resultAvailable = this.device.gl.getQueryParameter(
121
+ this.handle,
122
+ GL.QUERY_RESULT_AVAILABLE
123
+ );
124
+ if (resultAvailable) {
125
+ this._queryPending = false;
126
+ }
127
+ return resultAvailable;
128
+ }
129
+
130
+ // Timing query is disjoint, i.e. results are invalid
131
+ isTimerDisjoint(): boolean {
132
+ return this.device.gl.getParameter(GL.GPU_DISJOINT_EXT);
133
+ }
134
+
135
+ // Returns query result.
136
+ getResult(): any {
137
+ return this.device.gl.getQueryParameter(this.handle, GL.QUERY_RESULT);
138
+ }
139
+
140
+ // Returns the query result, converted to milliseconds to match JavaScript conventions.
141
+ getTimerMilliseconds() {
142
+ return this.getResult() / 1e6;
143
+ }
144
+
145
+ // Polls the query
146
+ pollQuery(limit: number = Number.POSITIVE_INFINITY): Promise<any> {
147
+ if (this._pollingPromise) {
148
+ return this._pollingPromise;
149
+ }
150
+
151
+ let counter = 0;
152
+
153
+ this._pollingPromise = new Promise((resolve, reject) => {
154
+ const poll = () => {
155
+ if (this.isResultAvailable()) {
156
+ resolve(this.getResult());
157
+ this._pollingPromise = null;
158
+ } else if (counter++ > limit) {
159
+ reject('Timed out');
160
+ this._pollingPromise = null;
161
+ } else {
162
+ requestAnimationFrame(poll);
163
+ }
164
+ };
165
+
166
+ requestAnimationFrame(poll);
167
+ });
168
+
169
+ return this._pollingPromise;
170
+ }
171
+ }
@@ -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 {RenderPass, RenderPassProps, NumberArray, RenderPassParameters} from '@luma.gl/core';
@@ -7,6 +8,7 @@ import {GL, GLParameters} from '@luma.gl/constants';
7
8
  import {withGLParameters} from '../../context/state-tracker/with-parameters';
8
9
  import {setGLParameters} from '../../context/parameters/unified-parameter-api';
9
10
  import {pushContextState, popContextState} from '../../context/state-tracker/track-context-state';
11
+ import {WEBGLQuerySet} from './webgl-query-set';
10
12
 
11
13
  // Should collapse during minification
12
14
  const GL_DEPTH_BUFFER_BIT = 0x00000100;
@@ -36,7 +38,7 @@ export class WEBGLRenderPass extends RenderPass {
36
38
  end(): void {
37
39
  popContextState(this.device.gl);
38
40
  if (this.props.framebuffer) {
39
- setGLParameters(this.device, {framebuffer: null});
41
+ setGLParameters(this.device.gl, {framebuffer: null});
40
42
  }
41
43
  // should add commands to CommandEncoder.
42
44
  }
@@ -45,8 +47,6 @@ export class WEBGLRenderPass extends RenderPass {
45
47
  popDebugGroup(): void {}
46
48
  insertDebugMarker(markerLabel: string): void {}
47
49
 
48
- // writeTimestamp(querySet: GPUQuerySet, queryIndex: number): void;
49
-
50
50
  // beginOcclusionQuery(queryIndex: number): void;
51
51
  // endOcclusionQuery(): void;
52
52
 
@@ -99,10 +99,20 @@ export class WEBGLRenderPass extends RenderPass {
99
99
 
100
100
  this.glParameters = glParameters;
101
101
 
102
- setGLParameters(this.device, glParameters);
102
+ setGLParameters(this.device.gl, glParameters);
103
+ }
104
+
105
+ beginOcclusionQuery(queryIndex: number): void {
106
+ const webglQuerySet = this.props.occlusionQuerySet as WEBGLQuerySet;
107
+ webglQuerySet?.beginOcclusionQuery();
103
108
  }
104
109
 
105
- // Internal
110
+ override endOcclusionQuery(): void {
111
+ const webglQuerySet = this.props.occlusionQuerySet as WEBGLQuerySet;
112
+ webglQuerySet?.endOcclusionQuery();
113
+ }
114
+
115
+ // PRIVATE
106
116
 
107
117
  /**
108
118
  * Optionally clears depth, color and stencil buffers based on parameters
@@ -127,33 +137,33 @@ export class WEBGLRenderPass extends RenderPass {
127
137
 
128
138
  if (clearMask !== 0) {
129
139
  // Temporarily set any clear "colors" and call clear
130
- withGLParameters(this.device, glParameters, () => {
140
+ withGLParameters(this.device.gl, glParameters, () => {
131
141
  this.device.gl.clear(clearMask);
132
142
  });
133
143
 
134
144
  // TODO - clear multiple color attachments
135
145
  // for (attachment of this.framebuffer.colorAttachments) {
136
- // this.clearColorBuffer
146
+ // this.clearColorBuffer
137
147
  // }
138
148
  }
139
149
  }
140
150
 
141
- /**
142
- * WebGL2 - clear a specific color buffer
151
+ /**
152
+ * WebGL2 - clear a specific color buffer
143
153
  */
144
154
  protected clearColorBuffer(drawBuffer: number = 0, value: NumberArray = [0, 0, 0, 0]) {
145
- withGLParameters(this.device.gl2, {framebuffer: this.props.framebuffer}, () => {
155
+ withGLParameters(this.device.gl, {framebuffer: this.props.framebuffer}, () => {
146
156
  // Method selection per OpenGL ES 3 docs
147
157
  switch (value.constructor) {
148
158
  case Int32Array:
149
- this.device.gl2.clearBufferiv(GL_COLOR, drawBuffer, value);
159
+ this.device.gl.clearBufferiv(GL_COLOR, drawBuffer, value);
150
160
  break;
151
161
  case Uint32Array:
152
- this.device.gl2.clearBufferuiv(GL_COLOR, drawBuffer, value);
162
+ this.device.gl.clearBufferuiv(GL_COLOR, drawBuffer, value);
153
163
  break;
154
164
  case Float32Array:
155
165
  default:
156
- this.device.gl2.clearBufferfv(GL_COLOR, drawBuffer, value);
166
+ this.device.gl.clearBufferfv(GL_COLOR, drawBuffer, value);
157
167
  break;
158
168
  }
159
169
  });
@@ -165,16 +175,16 @@ export class WEBGLRenderPass extends RenderPass {
165
175
  // const GL_DEPTH_STENCIL = 0x84f9;
166
176
 
167
177
  // case GL_DEPTH:
168
- // this.device.gl2.clearBufferfv(GL_DEPTH, 0, [value]);
178
+ // this.device.gl.clearBufferfv(GL_DEPTH, 0, [value]);
169
179
  // break;
170
180
 
171
181
  // case GL_STENCIL:
172
- // this.device.gl2.clearBufferiv(GL_STENCIL, 0, [value]);
182
+ // this.device.gl.clearBufferiv(GL_STENCIL, 0, [value]);
173
183
  // break;
174
184
 
175
185
  // case GL_DEPTH_STENCIL:
176
186
  // const [depth, stencil] = value;
177
- // this.device.gl2.clearBufferfi(GL_DEPTH_STENCIL, 0, depth, stencil);
187
+ // this.device.gl.clearBufferfi(GL_DEPTH_STENCIL, 0, depth, stencil);
178
188
  // break;
179
189
 
180
190
  // default:
@@ -182,4 +192,3 @@ export class WEBGLRenderPass extends RenderPass {
182
192
  // }
183
193
  // });
184
194
  }
185
-