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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. package/dist/adapter/converters/device-parameters.d.ts.map +1 -1
  2. package/dist/adapter/converters/device-parameters.js +297 -155
  3. package/dist/adapter/converters/sampler-parameters.d.ts +0 -4
  4. package/dist/adapter/converters/sampler-parameters.d.ts.map +1 -1
  5. package/dist/adapter/converters/sampler-parameters.js +73 -67
  6. package/dist/adapter/converters/shader-formats.d.ts.map +1 -1
  7. package/dist/adapter/converters/shader-formats.js +53 -46
  8. package/dist/adapter/converters/texture-formats.d.ts +13 -19
  9. package/dist/adapter/converters/texture-formats.d.ts.map +1 -1
  10. package/dist/adapter/converters/texture-formats.js +474 -879
  11. package/dist/adapter/converters/vertex-formats.d.ts.map +1 -1
  12. package/dist/adapter/converters/vertex-formats.js +53 -61
  13. package/dist/adapter/device-helpers/device-features.d.ts +2 -5
  14. package/dist/adapter/device-helpers/device-features.d.ts.map +1 -1
  15. package/dist/adapter/device-helpers/device-features.js +56 -87
  16. package/dist/adapter/device-helpers/device-limits.d.ts +2 -4
  17. package/dist/adapter/device-helpers/device-limits.d.ts.map +1 -1
  18. package/dist/adapter/device-helpers/device-limits.js +88 -83
  19. package/dist/adapter/device-helpers/get-device-info.d.ts +1 -1
  20. package/dist/adapter/device-helpers/get-device-info.d.ts.map +1 -1
  21. package/dist/adapter/device-helpers/get-device-info.js +79 -63
  22. package/dist/adapter/device-helpers/webgl-device-features.d.ts +19 -0
  23. package/dist/adapter/device-helpers/webgl-device-features.d.ts.map +1 -0
  24. package/dist/adapter/device-helpers/webgl-device-features.js +86 -0
  25. package/dist/adapter/device-helpers/webgl-device-info.d.ts +5 -0
  26. package/dist/adapter/device-helpers/webgl-device-info.d.ts.map +1 -0
  27. package/dist/adapter/device-helpers/webgl-device-info.js +90 -0
  28. package/dist/adapter/device-helpers/webgl-device-limits.d.ts +35 -0
  29. package/dist/adapter/device-helpers/webgl-device-limits.d.ts.map +1 -0
  30. package/dist/adapter/device-helpers/webgl-device-limits.js +47 -0
  31. package/dist/adapter/helpers/decode-webgl-types.d.ts.map +1 -1
  32. package/dist/adapter/helpers/decode-webgl-types.js +88 -76
  33. package/dist/adapter/helpers/get-shader-layout.d.ts +1 -1
  34. package/dist/adapter/helpers/get-shader-layout.d.ts.map +1 -1
  35. package/dist/adapter/helpers/get-shader-layout.js +261 -225
  36. package/dist/adapter/helpers/parse-shader-compiler-log.d.ts.map +1 -1
  37. package/dist/adapter/helpers/parse-shader-compiler-log.js +47 -37
  38. package/dist/adapter/helpers/set-uniform.d.ts +1 -1
  39. package/dist/adapter/helpers/set-uniform.d.ts.map +1 -1
  40. package/dist/adapter/helpers/set-uniform.js +68 -82
  41. package/dist/adapter/helpers/webgl-topology-utils.d.ts.map +1 -1
  42. package/dist/adapter/helpers/webgl-topology-utils.js +78 -93
  43. package/dist/adapter/objects/constants-to-keys.d.ts +1 -1
  44. package/dist/adapter/objects/constants-to-keys.d.ts.map +1 -1
  45. package/dist/adapter/objects/constants-to-keys.js +19 -12
  46. package/dist/adapter/objects/webgl-renderbuffer.d.ts +2 -2
  47. package/dist/adapter/objects/webgl-renderbuffer.d.ts.map +1 -1
  48. package/dist/adapter/objects/webgl-renderbuffer.js +86 -77
  49. package/dist/adapter/objects/webgl-resource.d.ts +3 -25
  50. package/dist/adapter/objects/webgl-resource.d.ts.map +1 -1
  51. package/dist/adapter/objects/webgl-resource.js +102 -146
  52. package/dist/adapter/resources/webgl-buffer.d.ts +3 -4
  53. package/dist/adapter/resources/webgl-buffer.d.ts.map +1 -1
  54. package/dist/adapter/resources/webgl-buffer.js +161 -119
  55. package/dist/adapter/resources/webgl-command-buffer.d.ts +1 -1
  56. package/dist/adapter/resources/webgl-command-buffer.d.ts.map +1 -1
  57. package/dist/adapter/resources/webgl-command-buffer.js +266 -168
  58. package/dist/adapter/resources/webgl-command-encoder.d.ts +8 -3
  59. package/dist/adapter/resources/webgl-command-encoder.d.ts.map +1 -1
  60. package/dist/adapter/resources/webgl-command-encoder.js +33 -39
  61. package/dist/adapter/resources/webgl-external-texture.js +93 -1
  62. package/dist/adapter/resources/webgl-framebuffer.d.ts +8 -10
  63. package/dist/adapter/resources/webgl-framebuffer.d.ts.map +1 -1
  64. package/dist/adapter/resources/webgl-framebuffer.js +167 -137
  65. package/dist/adapter/resources/webgl-query-set.d.ts +44 -0
  66. package/dist/adapter/resources/webgl-query-set.d.ts.map +1 -0
  67. package/dist/adapter/resources/webgl-query-set.js +136 -0
  68. package/dist/adapter/resources/webgl-render-pass.d.ts +3 -1
  69. package/dist/adapter/resources/webgl-render-pass.d.ts.map +1 -1
  70. package/dist/adapter/resources/webgl-render-pass.js +124 -90
  71. package/dist/adapter/resources/webgl-render-pipeline.d.ts +15 -6
  72. package/dist/adapter/resources/webgl-render-pipeline.d.ts.map +1 -1
  73. package/dist/adapter/resources/webgl-render-pipeline.js +356 -221
  74. package/dist/adapter/resources/webgl-sampler.d.ts +1 -3
  75. package/dist/adapter/resources/webgl-sampler.d.ts.map +1 -1
  76. package/dist/adapter/resources/webgl-sampler.js +43 -33
  77. package/dist/adapter/resources/webgl-shader.d.ts +12 -2
  78. package/dist/adapter/resources/webgl-shader.d.ts.map +1 -1
  79. package/dist/adapter/resources/webgl-shader.js +114 -47
  80. package/dist/adapter/resources/webgl-texture-view.d.ts +14 -0
  81. package/dist/adapter/resources/webgl-texture-view.d.ts.map +1 -0
  82. package/dist/adapter/resources/webgl-texture-view.js +18 -0
  83. package/dist/adapter/resources/webgl-texture.d.ts +6 -9
  84. package/dist/adapter/resources/webgl-texture.d.ts.map +1 -1
  85. package/dist/adapter/resources/webgl-texture.js +615 -695
  86. package/dist/adapter/resources/webgl-transform-feedback.d.ts +2 -2
  87. package/dist/adapter/resources/webgl-transform-feedback.d.ts.map +1 -1
  88. package/dist/adapter/resources/webgl-transform-feedback.js +141 -143
  89. package/dist/adapter/resources/webgl-vertex-array.d.ts +3 -3
  90. package/dist/adapter/resources/webgl-vertex-array.d.ts.map +1 -1
  91. package/dist/adapter/resources/webgl-vertex-array.js +229 -157
  92. package/dist/adapter/webgl-canvas-context.d.ts +2 -2
  93. package/dist/adapter/webgl-canvas-context.d.ts.map +1 -1
  94. package/dist/adapter/webgl-canvas-context.js +58 -36
  95. package/dist/adapter/webgl-device.d.ts +34 -40
  96. package/dist/adapter/webgl-device.d.ts.map +1 -1
  97. package/dist/adapter/webgl-device.js +418 -363
  98. package/dist/classic/accessor.d.ts.map +1 -1
  99. package/dist/classic/accessor.js +132 -101
  100. package/dist/classic/clear.d.ts +2 -2
  101. package/dist/classic/clear.d.ts.map +1 -1
  102. package/dist/classic/clear.js +73 -72
  103. package/dist/classic/copy-and-blit.d.ts +1 -1
  104. package/dist/classic/copy-and-blit.d.ts.map +1 -1
  105. package/dist/classic/copy-and-blit.js +175 -175
  106. package/dist/classic/format-utils.d.ts +2 -2
  107. package/dist/classic/format-utils.d.ts.map +1 -1
  108. package/dist/classic/format-utils.js +39 -32
  109. package/dist/classic/typed-array-utils.d.ts.map +1 -1
  110. package/dist/classic/typed-array-utils.js +96 -81
  111. package/dist/context/context/context-data.d.ts +14 -0
  112. package/dist/context/context/context-data.d.ts.map +1 -0
  113. package/dist/context/context/context-data.js +33 -0
  114. package/dist/context/context/create-browser-context.d.ts +1 -6
  115. package/dist/context/context/create-browser-context.d.ts.map +1 -1
  116. package/dist/context/context/create-browser-context.js +62 -49
  117. package/dist/context/debug/spector.d.ts.map +1 -1
  118. package/dist/context/debug/spector.js +55 -50
  119. package/dist/context/debug/webgl-developer-tools.d.ts +1 -2
  120. package/dist/context/debug/webgl-developer-tools.d.ts.map +1 -1
  121. package/dist/context/debug/webgl-developer-tools.js +104 -77
  122. package/dist/context/helpers/create-browser-context.d.ts +35 -0
  123. package/dist/context/helpers/create-browser-context.d.ts.map +1 -0
  124. package/dist/context/helpers/create-browser-context.js +67 -0
  125. package/dist/context/{polyfill/context-data.d.ts → helpers/webgl-context-data.d.ts} +2 -2
  126. package/dist/context/helpers/webgl-context-data.d.ts.map +1 -0
  127. package/dist/context/helpers/webgl-context-data.js +21 -0
  128. package/dist/context/helpers/webgl-extensions.d.ts +4 -0
  129. package/dist/context/helpers/webgl-extensions.d.ts.map +1 -0
  130. package/dist/context/helpers/webgl-extensions.js +10 -0
  131. package/dist/context/parameters/unified-parameter-api.d.ts +3 -3
  132. package/dist/context/parameters/unified-parameter-api.d.ts.map +1 -1
  133. package/dist/context/parameters/unified-parameter-api.js +94 -44
  134. package/dist/context/parameters/webgl-parameter-tables.d.ts +120 -99
  135. package/dist/context/parameters/webgl-parameter-tables.d.ts.map +1 -1
  136. package/dist/context/parameters/webgl-parameter-tables.js +469 -404
  137. package/dist/context/state-tracker/deep-array-equal.d.ts.map +1 -1
  138. package/dist/context/state-tracker/deep-array-equal.js +19 -14
  139. package/dist/context/state-tracker/track-context-state.d.ts +4 -4
  140. package/dist/context/state-tracker/track-context-state.d.ts.map +1 -1
  141. package/dist/context/state-tracker/track-context-state.js +188 -123
  142. package/dist/context/state-tracker/with-parameters.d.ts +2 -2
  143. package/dist/context/state-tracker/with-parameters.d.ts.map +1 -1
  144. package/dist/context/state-tracker/with-parameters.js +43 -26
  145. package/dist/dist.dev.js +3135 -4142
  146. package/dist/index.cjs +1766 -2717
  147. package/dist/index.cjs.map +7 -0
  148. package/dist/index.d.ts +25 -28
  149. package/dist/index.d.ts.map +1 -1
  150. package/dist/index.js +16 -5
  151. package/dist/types.d.ts.map +1 -1
  152. package/dist/types.js +3 -1
  153. package/dist.min.js +9 -42
  154. package/package.json +11 -15
  155. package/src/adapter/converters/device-parameters.ts +105 -17
  156. package/src/adapter/converters/sampler-parameters.ts +12 -20
  157. package/src/adapter/converters/shader-formats.ts +47 -22
  158. package/src/adapter/converters/texture-formats.ts +138 -185
  159. package/src/adapter/converters/vertex-formats.ts +3 -3
  160. package/src/adapter/device-helpers/webgl-device-features.ts +101 -0
  161. package/src/adapter/device-helpers/{get-device-info.ts → webgl-device-info.ts} +30 -22
  162. package/src/adapter/device-helpers/webgl-device-limits.ts +53 -0
  163. package/src/adapter/helpers/decode-webgl-types.ts +13 -7
  164. package/src/adapter/helpers/get-shader-layout.ts +21 -31
  165. package/src/adapter/helpers/parse-shader-compiler-log.ts +10 -6
  166. package/src/adapter/helpers/set-uniform.ts +3 -4
  167. package/src/adapter/helpers/webgl-topology-utils.ts +10 -3
  168. package/src/adapter/objects/constants-to-keys.ts +3 -2
  169. package/src/adapter/objects/webgl-renderbuffer.ts +38 -16
  170. package/src/adapter/objects/webgl-resource.ts +7 -140
  171. package/src/adapter/resources/webgl-buffer.ts +10 -14
  172. package/src/adapter/resources/webgl-command-buffer.ts +24 -34
  173. package/src/adapter/resources/webgl-command-encoder.ts +14 -11
  174. package/src/adapter/resources/webgl-external-texture.ts +5 -5
  175. package/src/adapter/resources/webgl-framebuffer.ts +38 -34
  176. package/src/adapter/resources/webgl-query-set.ts +171 -0
  177. package/src/adapter/resources/webgl-render-pass.ts +24 -15
  178. package/src/adapter/resources/webgl-render-pipeline.ts +138 -70
  179. package/src/adapter/resources/webgl-sampler.ts +7 -10
  180. package/src/adapter/resources/webgl-shader.ts +65 -11
  181. package/src/adapter/resources/webgl-texture-view.ts +28 -0
  182. package/src/adapter/resources/webgl-texture.ts +38 -105
  183. package/src/adapter/resources/webgl-transform-feedback.ts +16 -22
  184. package/src/adapter/resources/webgl-vertex-array.ts +20 -21
  185. package/src/adapter/webgl-canvas-context.ts +7 -11
  186. package/src/adapter/webgl-device.ts +106 -151
  187. package/src/classic/accessor.ts +5 -4
  188. package/src/classic/clear.ts +25 -20
  189. package/src/classic/copy-and-blit.ts +12 -6
  190. package/src/classic/format-utils.ts +2 -1
  191. package/src/classic/typed-array-utils.ts +3 -7
  192. package/src/context/debug/spector.ts +9 -6
  193. package/src/context/debug/webgl-developer-tools.ts +31 -20
  194. package/src/context/{context → helpers}/create-browser-context.ts +9 -33
  195. package/src/context/{polyfill/context-data.ts → helpers/webgl-context-data.ts} +3 -2
  196. package/src/context/helpers/webgl-extensions.ts +17 -0
  197. package/src/context/parameters/unified-parameter-api.ts +5 -4
  198. package/src/context/parameters/webgl-parameter-tables.ts +118 -90
  199. package/src/context/state-tracker/deep-array-equal.ts +2 -1
  200. package/src/context/state-tracker/track-context-state.ts +29 -23
  201. package/src/context/state-tracker/with-parameters.ts +7 -2
  202. package/src/index.ts +4 -18
  203. package/src/types.ts +2 -1
  204. package/dist/adapter/converters/device-parameters.js.map +0 -1
  205. package/dist/adapter/converters/sampler-parameters.js.map +0 -1
  206. package/dist/adapter/converters/shader-formats.js.map +0 -1
  207. package/dist/adapter/converters/texture-formats.js.map +0 -1
  208. package/dist/adapter/converters/vertex-formats.js.map +0 -1
  209. package/dist/adapter/device-helpers/device-features.js.map +0 -1
  210. package/dist/adapter/device-helpers/device-limits.js.map +0 -1
  211. package/dist/adapter/device-helpers/get-device-info.js.map +0 -1
  212. package/dist/adapter/device-helpers/is-old-ie.d.ts +0 -2
  213. package/dist/adapter/device-helpers/is-old-ie.d.ts.map +0 -1
  214. package/dist/adapter/device-helpers/is-old-ie.js +0 -9
  215. package/dist/adapter/device-helpers/is-old-ie.js.map +0 -1
  216. package/dist/adapter/helpers/decode-webgl-types.js.map +0 -1
  217. package/dist/adapter/helpers/get-shader-layout.js.map +0 -1
  218. package/dist/adapter/helpers/parse-shader-compiler-log.js.map +0 -1
  219. package/dist/adapter/helpers/set-uniform.js.map +0 -1
  220. package/dist/adapter/helpers/webgl-topology-utils.js.map +0 -1
  221. package/dist/adapter/objects/constants-to-keys.js.map +0 -1
  222. package/dist/adapter/objects/webgl-renderbuffer.js.map +0 -1
  223. package/dist/adapter/objects/webgl-resource.js.map +0 -1
  224. package/dist/adapter/resources/webgl-buffer.js.map +0 -1
  225. package/dist/adapter/resources/webgl-command-buffer.js.map +0 -1
  226. package/dist/adapter/resources/webgl-command-encoder.js.map +0 -1
  227. package/dist/adapter/resources/webgl-external-texture.js.map +0 -1
  228. package/dist/adapter/resources/webgl-framebuffer.js.map +0 -1
  229. package/dist/adapter/resources/webgl-render-pass.js.map +0 -1
  230. package/dist/adapter/resources/webgl-render-pipeline.js.map +0 -1
  231. package/dist/adapter/resources/webgl-sampler.js.map +0 -1
  232. package/dist/adapter/resources/webgl-shader.js.map +0 -1
  233. package/dist/adapter/resources/webgl-texture.js.map +0 -1
  234. package/dist/adapter/resources/webgl-transform-feedback.js.map +0 -1
  235. package/dist/adapter/resources/webgl-vertex-array.js.map +0 -1
  236. package/dist/adapter/webgl-canvas-context.js.map +0 -1
  237. package/dist/adapter/webgl-device.js.map +0 -1
  238. package/dist/classic/accessor.js.map +0 -1
  239. package/dist/classic/clear.js.map +0 -1
  240. package/dist/classic/copy-and-blit.js.map +0 -1
  241. package/dist/classic/format-utils.js.map +0 -1
  242. package/dist/classic/typed-array-utils.js.map +0 -1
  243. package/dist/context/context/create-browser-context.js.map +0 -1
  244. package/dist/context/context/create-headless-context.d.ts +0 -9
  245. package/dist/context/context/create-headless-context.d.ts.map +0 -1
  246. package/dist/context/context/create-headless-context.js +0 -42
  247. package/dist/context/context/create-headless-context.js.map +0 -1
  248. package/dist/context/context/webgl-checks.d.ts +0 -13
  249. package/dist/context/context/webgl-checks.d.ts.map +0 -1
  250. package/dist/context/context/webgl-checks.js +0 -31
  251. package/dist/context/context/webgl-checks.js.map +0 -1
  252. package/dist/context/debug/spector.js.map +0 -1
  253. package/dist/context/debug/webgl-developer-tools.js.map +0 -1
  254. package/dist/context/parameters/unified-parameter-api.js.map +0 -1
  255. package/dist/context/parameters/webgl-parameter-tables.js.map +0 -1
  256. package/dist/context/polyfill/context-data.d.ts.map +0 -1
  257. package/dist/context/polyfill/context-data.js +0 -12
  258. package/dist/context/polyfill/context-data.js.map +0 -1
  259. package/dist/context/polyfill/get-parameter-polyfill.d.ts +0 -2
  260. package/dist/context/polyfill/get-parameter-polyfill.d.ts.map +0 -1
  261. package/dist/context/polyfill/get-parameter-polyfill.js +0 -85
  262. package/dist/context/polyfill/get-parameter-polyfill.js.map +0 -1
  263. package/dist/context/polyfill/polyfill-context.d.ts +0 -5
  264. package/dist/context/polyfill/polyfill-context.d.ts.map +0 -1
  265. package/dist/context/polyfill/polyfill-context.js +0 -87
  266. package/dist/context/polyfill/polyfill-context.js.map +0 -1
  267. package/dist/context/polyfill/polyfill-table.d.ts +0 -48
  268. package/dist/context/polyfill/polyfill-table.d.ts.map +0 -1
  269. package/dist/context/polyfill/polyfill-table.js +0 -137
  270. package/dist/context/polyfill/polyfill-table.js.map +0 -1
  271. package/dist/context/polyfill/polyfill-vertex-array-object.d.ts +0 -2
  272. package/dist/context/polyfill/polyfill-vertex-array-object.d.ts.map +0 -1
  273. package/dist/context/polyfill/polyfill-vertex-array-object.js +0 -265
  274. package/dist/context/polyfill/polyfill-vertex-array-object.js.map +0 -1
  275. package/dist/context/state-tracker/deep-array-equal.js.map +0 -1
  276. package/dist/context/state-tracker/track-context-state.js.map +0 -1
  277. package/dist/context/state-tracker/with-parameters.js.map +0 -1
  278. package/dist/index.js.map +0 -1
  279. package/dist/types.js.map +0 -1
  280. package/src/adapter/device-helpers/device-features.ts +0 -161
  281. package/src/adapter/device-helpers/device-limits.ts +0 -155
  282. package/src/adapter/device-helpers/is-old-ie.ts +0 -14
  283. package/src/context/context/create-headless-context.ts +0 -51
  284. package/src/context/context/webgl-checks.ts +0 -51
  285. package/src/context/polyfill/get-parameter-polyfill.ts +0 -122
  286. package/src/context/polyfill/polyfill-context.ts +0 -104
  287. package/src/context/polyfill/polyfill-table.ts +0 -167
  288. package/src/context/polyfill/polyfill-vertex-array-object.ts +0 -365
@@ -1,4 +1,5 @@
1
- // luma.gl, MIT license
1
+ // luma.gl
2
+ // SPDX-License-Identifier: MIT
2
3
  // Copyright (c) vis.gl contributors
3
4
 
4
5
  import type {FramebufferProps, TextureFormat} from '@luma.gl/core';
@@ -6,16 +7,16 @@ 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';
10
+ import {WEBGLTextureView} from './webgl-texture-view';
9
11
  import {WEBGLRenderbuffer} from '../objects/webgl-renderbuffer';
10
12
  import {getDepthStencilAttachmentWebGL} from '../converters/texture-formats';
11
13
 
12
- export type TextureAttachment = [Texture, number?, number?];
13
- export type Attachment = WEBGLTexture | WEBGLRenderbuffer | TextureAttachment;
14
+ export type Attachment = WEBGLTextureView | WEBGLTexture | WEBGLRenderbuffer;
14
15
 
15
16
  /** luma.gl Framebuffer, WebGL implementation */
16
17
  export class WEBGLFramebuffer extends Framebuffer {
17
18
  device: WebGLDevice;
18
- gl: WebGLRenderingContext;
19
+ gl: WebGL2RenderingContext;
19
20
  handle: WebGLFramebuffer;
20
21
 
21
22
  get texture() {
@@ -45,26 +46,30 @@ export class WEBGLFramebuffer extends Framebuffer {
45
46
 
46
47
  // Walk the attachments
47
48
  for (let i = 0; i < this.colorAttachments.length; ++i) {
48
- const attachment = this.colorAttachments[i];
49
+ const attachment = this.colorAttachments[i] as WEBGLTextureView;
49
50
  const attachmentPoint = GL.COLOR_ATTACHMENT0 + i;
50
51
  if (attachment) {
51
- this._attachOne(attachmentPoint, attachment as WEBGLTexture);
52
+ this._attachOne(attachmentPoint, attachment);
52
53
  }
53
54
  }
54
55
 
55
56
  if (this.depthStencilAttachment) {
56
57
  this._attachOne(
57
- getDepthStencilAttachmentWebGL(this.depthStencilAttachment.format),
58
- this.depthStencilAttachment as WEBGLTexture
58
+ getDepthStencilAttachmentWebGL(this.depthStencilAttachment.props.format),
59
+ this.depthStencilAttachment as WEBGLTextureView
59
60
  );
60
61
  }
61
62
 
62
- this.gl.bindFramebuffer(GL.FRAMEBUFFER, null);
63
- }
63
+ /** Check the status */
64
+ // @ts-expect-error
65
+ if (props.check !== false) {
66
+ const status = this.gl.checkFramebufferStatus(GL.FRAMEBUFFER) as GL;
67
+ if (status !== GL.FRAMEBUFFER_COMPLETE) {
68
+ throw new Error(`Framebuffer ${_getFrameBufferStatus(status)}`);
69
+ }
70
+ }
64
71
 
65
- // @ts-expect-error
66
- if (props.check !== false) {
67
- this._checkStatus();
72
+ this.gl.bindFramebuffer(GL.FRAMEBUFFER, null);
68
73
  }
69
74
  }
70
75
 
@@ -79,18 +84,6 @@ export class WEBGLFramebuffer extends Framebuffer {
79
84
 
80
85
  // PRIVATE
81
86
 
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
87
  /** In WebGL we must use renderbuffers for depth/stencil attachments (unless we have extensions) */
95
88
  protected override createDepthStencilTexture(format: TextureFormat): Texture {
96
89
  return new WEBGLRenderbuffer(this.device, {
@@ -103,8 +96,8 @@ export class WEBGLFramebuffer extends Framebuffer {
103
96
  }) as unknown as WEBGLTexture;
104
97
  }
105
98
 
106
- /**
107
- * Attachment resize is expected to be a noop if size is same
99
+ /**
100
+ * Attachment resize is expected to be a noop if size is same
108
101
  */
109
102
  protected override resizeAttachments(width: number, height: number): this {
110
103
  // for default framebuffer, just update the stored size
@@ -125,10 +118,10 @@ export class WEBGLFramebuffer extends Framebuffer {
125
118
  // TODO Not clear that this is better than default destroy/create implementation
126
119
 
127
120
  for (const colorAttachment of this.colorAttachments) {
128
- (colorAttachment as WEBGLTexture).resize({width, height});
121
+ (colorAttachment.texture as WEBGLTexture).resize({width, height});
129
122
  }
130
123
  if (this.depthStencilAttachment) {
131
- (this.depthStencilAttachment as WEBGLTexture).resize({width, height});
124
+ (this.depthStencilAttachment.texture as WEBGLTexture).resize({width, height});
132
125
  }
133
126
  return this;
134
127
  }
@@ -148,6 +141,15 @@ export class WEBGLFramebuffer extends Framebuffer {
148
141
  } else if (attachment instanceof WEBGLTexture) {
149
142
  this._attachTexture(attachmentPoint, attachment, 0, 0);
150
143
  return attachment;
144
+ } else if (attachment instanceof WEBGLTextureView) {
145
+ const textureView = attachment;
146
+ this._attachTexture(
147
+ attachmentPoint,
148
+ textureView.texture,
149
+ textureView.props.baseMipLevel,
150
+ textureView.props.baseArrayLayer
151
+ );
152
+ return attachment.texture;
151
153
  }
152
154
  throw new Error('attach');
153
155
  }
@@ -165,7 +167,7 @@ export class WEBGLFramebuffer extends Framebuffer {
165
167
  * @param attachment
166
168
  * @param texture
167
169
  * @param layer = 0 - index into WEBGLTextureArray and Texture3D or face for `TextureCubeMap`
168
- * @param level = 0 - mipmapLevel (must be 0 in WebGL1)
170
+ * @param level = 0 - mipmapLevel
169
171
  */
170
172
  protected _attachTexture(
171
173
  attachment: GL,
@@ -173,14 +175,14 @@ export class WEBGLFramebuffer extends Framebuffer {
173
175
  layer: number,
174
176
  level: number
175
177
  ): void {
176
- const {gl, gl2} = this.device;
178
+ const {gl} = this.device;
179
+
177
180
  gl.bindTexture(texture.target, texture.handle);
178
181
 
179
182
  switch (texture.target) {
180
183
  case GL.TEXTURE_2D_ARRAY:
181
184
  case GL.TEXTURE_3D:
182
- this.device.assertWebGL2();
183
- gl2?.framebufferTextureLayer(GL.FRAMEBUFFER, attachment, texture.target, level, layer);
185
+ gl.framebufferTextureLayer(GL.FRAMEBUFFER, attachment, texture.target, level, layer);
184
186
  break;
185
187
 
186
188
  case GL.TEXTURE_CUBE_MAP:
@@ -207,7 +209,9 @@ export class WEBGLFramebuffer extends Framebuffer {
207
209
  function mapIndexToCubeMapFace(layer: number | GL): GL {
208
210
  // TEXTURE_CUBE_MAP_POSITIVE_X is a big value (0x8515)
209
211
  // 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;
212
+ return layer < (GL.TEXTURE_CUBE_MAP_POSITIVE_X as number)
213
+ ? layer + GL.TEXTURE_CUBE_MAP_POSITIVE_X
214
+ : layer;
211
215
  }
212
216
 
213
217
  // 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;
@@ -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
 
@@ -102,7 +102,17 @@ export class WEBGLRenderPass extends RenderPass {
102
102
  setGLParameters(this.device, glParameters);
103
103
  }
104
104
 
105
- // Internal
105
+ beginOcclusionQuery(queryIndex: number): void {
106
+ const webglQuerySet = this.props.occlusionQuerySet as WEBGLQuerySet;
107
+ webglQuerySet?.beginOcclusionQuery();
108
+ }
109
+
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
@@ -133,27 +143,27 @@ export class WEBGLRenderPass extends RenderPass {
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
-