@luma.gl/webgl 9.2.6 → 9.3.0-alpha.11

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 (247) hide show
  1. package/dist/adapter/converters/device-parameters.d.ts +1 -1
  2. package/dist/adapter/converters/device-parameters.d.ts.map +1 -1
  3. package/dist/adapter/converters/device-parameters.js +4 -1
  4. package/dist/adapter/converters/device-parameters.js.map +1 -1
  5. package/dist/adapter/converters/sampler-parameters.d.ts +1 -1
  6. package/dist/adapter/converters/sampler-parameters.d.ts.map +1 -1
  7. package/dist/adapter/converters/sampler-parameters.js +1 -1
  8. package/dist/adapter/converters/sampler-parameters.js.map +1 -1
  9. package/dist/adapter/converters/shader-formats.d.ts +1 -64
  10. package/dist/adapter/converters/shader-formats.d.ts.map +1 -1
  11. package/dist/adapter/converters/shader-formats.js +1 -64
  12. package/dist/adapter/converters/shader-formats.js.map +1 -1
  13. package/dist/adapter/converters/webgl-shadertypes.d.ts +1 -3
  14. package/dist/adapter/converters/webgl-shadertypes.d.ts.map +1 -1
  15. package/dist/adapter/converters/webgl-shadertypes.js +2 -7
  16. package/dist/adapter/converters/webgl-shadertypes.js.map +1 -1
  17. package/dist/adapter/converters/webgl-texture-table.d.ts +8 -4
  18. package/dist/adapter/converters/webgl-texture-table.d.ts.map +1 -1
  19. package/dist/adapter/converters/webgl-texture-table.js +125 -61
  20. package/dist/adapter/converters/webgl-texture-table.js.map +1 -1
  21. package/dist/adapter/converters/webgl-vertex-formats.d.ts +1 -1
  22. package/dist/adapter/converters/webgl-vertex-formats.d.ts.map +1 -1
  23. package/dist/adapter/converters/webgl-vertex-formats.js +4 -4
  24. package/dist/adapter/converters/webgl-vertex-formats.js.map +1 -1
  25. package/dist/adapter/device-helpers/webgl-device-features.d.ts +1 -1
  26. package/dist/adapter/device-helpers/webgl-device-features.d.ts.map +1 -1
  27. package/dist/adapter/device-helpers/webgl-device-features.js +1 -2
  28. package/dist/adapter/device-helpers/webgl-device-features.js.map +1 -1
  29. package/dist/adapter/device-helpers/webgl-device-info.d.ts +1 -1
  30. package/dist/adapter/device-helpers/webgl-device-info.d.ts.map +1 -1
  31. package/dist/adapter/device-helpers/webgl-device-info.js +6 -1
  32. package/dist/adapter/device-helpers/webgl-device-info.js.map +1 -1
  33. package/dist/adapter/device-helpers/webgl-device-limits.d.ts +1 -1
  34. package/dist/adapter/device-helpers/webgl-device-limits.d.ts.map +1 -1
  35. package/dist/adapter/device-helpers/webgl-device-limits.js +2 -2
  36. package/dist/adapter/device-helpers/webgl-device-limits.js.map +1 -1
  37. package/dist/adapter/helpers/format-utils.d.ts +1 -1
  38. package/dist/adapter/helpers/format-utils.d.ts.map +1 -1
  39. package/dist/adapter/helpers/format-utils.js +1 -1
  40. package/dist/adapter/helpers/format-utils.js.map +1 -1
  41. package/dist/adapter/helpers/get-shader-layout-from-glsl.js +36 -22
  42. package/dist/adapter/helpers/get-shader-layout-from-glsl.js.map +1 -1
  43. package/dist/adapter/helpers/parse-shader-compiler-log.d.ts +1 -1
  44. package/dist/adapter/helpers/parse-shader-compiler-log.d.ts.map +1 -1
  45. package/dist/adapter/helpers/parse-shader-compiler-log.js +22 -2
  46. package/dist/adapter/helpers/parse-shader-compiler-log.js.map +1 -1
  47. package/dist/adapter/helpers/set-uniform.d.ts +1 -1
  48. package/dist/adapter/helpers/set-uniform.d.ts.map +1 -1
  49. package/dist/adapter/helpers/set-uniform.js +2 -2
  50. package/dist/adapter/helpers/set-uniform.js.map +1 -1
  51. package/dist/adapter/helpers/webgl-texture-utils.d.ts +1 -1
  52. package/dist/adapter/helpers/webgl-texture-utils.d.ts.map +1 -1
  53. package/dist/adapter/helpers/webgl-texture-utils.js +9 -9
  54. package/dist/adapter/helpers/webgl-texture-utils.js.map +1 -1
  55. package/dist/adapter/helpers/webgl-topology-utils.d.ts +1 -1
  56. package/dist/adapter/helpers/webgl-topology-utils.d.ts.map +1 -1
  57. package/dist/adapter/helpers/webgl-topology-utils.js +3 -3
  58. package/dist/adapter/helpers/webgl-topology-utils.js.map +1 -1
  59. package/dist/adapter/resources/webgl-buffer.d.ts +1 -1
  60. package/dist/adapter/resources/webgl-buffer.d.ts.map +1 -1
  61. package/dist/adapter/resources/webgl-buffer.js +20 -5
  62. package/dist/adapter/resources/webgl-buffer.js.map +1 -1
  63. package/dist/adapter/resources/webgl-command-buffer.d.ts +7 -8
  64. package/dist/adapter/resources/webgl-command-buffer.d.ts.map +1 -1
  65. package/dist/adapter/resources/webgl-command-buffer.js +33 -43
  66. package/dist/adapter/resources/webgl-command-buffer.js.map +1 -1
  67. package/dist/adapter/resources/webgl-command-encoder.d.ts +6 -5
  68. package/dist/adapter/resources/webgl-command-encoder.d.ts.map +1 -1
  69. package/dist/adapter/resources/webgl-command-encoder.js +23 -8
  70. package/dist/adapter/resources/webgl-command-encoder.js.map +1 -1
  71. package/dist/adapter/resources/webgl-fence.d.ts +14 -0
  72. package/dist/adapter/resources/webgl-fence.d.ts.map +1 -0
  73. package/dist/adapter/resources/webgl-fence.js +49 -0
  74. package/dist/adapter/resources/webgl-fence.js.map +1 -0
  75. package/dist/adapter/resources/webgl-framebuffer.d.ts +3 -1
  76. package/dist/adapter/resources/webgl-framebuffer.d.ts.map +1 -1
  77. package/dist/adapter/resources/webgl-framebuffer.js +10 -1
  78. package/dist/adapter/resources/webgl-framebuffer.js.map +1 -1
  79. package/dist/adapter/resources/webgl-query-set.d.ts +37 -31
  80. package/dist/adapter/resources/webgl-query-set.d.ts.map +1 -1
  81. package/dist/adapter/resources/webgl-query-set.js +247 -96
  82. package/dist/adapter/resources/webgl-query-set.js.map +1 -1
  83. package/dist/adapter/resources/webgl-render-pass.d.ts +1 -1
  84. package/dist/adapter/resources/webgl-render-pass.d.ts.map +1 -1
  85. package/dist/adapter/resources/webgl-render-pass.js +28 -11
  86. package/dist/adapter/resources/webgl-render-pass.js.map +1 -1
  87. package/dist/adapter/resources/webgl-render-pipeline.d.ts +17 -21
  88. package/dist/adapter/resources/webgl-render-pipeline.d.ts.map +1 -1
  89. package/dist/adapter/resources/webgl-render-pipeline.js +94 -192
  90. package/dist/adapter/resources/webgl-render-pipeline.js.map +1 -1
  91. package/dist/adapter/resources/webgl-sampler.d.ts +1 -1
  92. package/dist/adapter/resources/webgl-sampler.d.ts.map +1 -1
  93. package/dist/adapter/resources/webgl-sampler.js +1 -1
  94. package/dist/adapter/resources/webgl-sampler.js.map +1 -1
  95. package/dist/adapter/resources/webgl-shader.d.ts +1 -1
  96. package/dist/adapter/resources/webgl-shader.d.ts.map +1 -1
  97. package/dist/adapter/resources/webgl-shader.js +15 -8
  98. package/dist/adapter/resources/webgl-shader.js.map +1 -1
  99. package/dist/adapter/resources/webgl-shared-render-pipeline.d.ts +24 -0
  100. package/dist/adapter/resources/webgl-shared-render-pipeline.d.ts.map +1 -0
  101. package/dist/adapter/resources/webgl-shared-render-pipeline.js +155 -0
  102. package/dist/adapter/resources/webgl-shared-render-pipeline.js.map +1 -0
  103. package/dist/adapter/resources/webgl-texture.d.ts +42 -4
  104. package/dist/adapter/resources/webgl-texture.d.ts.map +1 -1
  105. package/dist/adapter/resources/webgl-texture.js +289 -65
  106. package/dist/adapter/resources/webgl-texture.js.map +1 -1
  107. package/dist/adapter/resources/webgl-transform-feedback.js +6 -6
  108. package/dist/adapter/resources/webgl-transform-feedback.js.map +1 -1
  109. package/dist/adapter/resources/webgl-vertex-array.d.ts +2 -2
  110. package/dist/adapter/resources/webgl-vertex-array.d.ts.map +1 -1
  111. package/dist/adapter/resources/webgl-vertex-array.js +1 -1
  112. package/dist/adapter/resources/webgl-vertex-array.js.map +1 -1
  113. package/dist/adapter/webgl-adapter.d.ts.map +1 -1
  114. package/dist/adapter/webgl-adapter.js +22 -23
  115. package/dist/adapter/webgl-adapter.js.map +1 -1
  116. package/dist/adapter/webgl-canvas-context.d.ts +2 -2
  117. package/dist/adapter/webgl-canvas-context.d.ts.map +1 -1
  118. package/dist/adapter/webgl-canvas-context.js +16 -6
  119. package/dist/adapter/webgl-canvas-context.js.map +1 -1
  120. package/dist/adapter/webgl-device.d.ts +10 -5
  121. package/dist/adapter/webgl-device.d.ts.map +1 -1
  122. package/dist/adapter/webgl-device.js +78 -28
  123. package/dist/adapter/webgl-device.js.map +1 -1
  124. package/dist/adapter/webgl-presentation-context.d.ts +21 -0
  125. package/dist/adapter/webgl-presentation-context.d.ts.map +1 -0
  126. package/dist/adapter/webgl-presentation-context.js +64 -0
  127. package/dist/adapter/webgl-presentation-context.js.map +1 -0
  128. package/dist/constants/index.d.ts +3 -0
  129. package/dist/constants/index.d.ts.map +1 -0
  130. package/dist/constants/index.js +5 -0
  131. package/dist/constants/index.js.map +1 -0
  132. package/dist/constants/webgl-constants.d.ts +822 -0
  133. package/dist/constants/webgl-constants.d.ts.map +1 -0
  134. package/dist/constants/webgl-constants.js +928 -0
  135. package/dist/constants/webgl-constants.js.map +1 -0
  136. package/dist/constants/webgl-types.d.ts +480 -0
  137. package/dist/constants/webgl-types.d.ts.map +1 -0
  138. package/dist/constants/webgl-types.js +6 -0
  139. package/dist/constants/webgl-types.js.map +1 -0
  140. package/dist/context/debug/spector.d.ts.map +1 -1
  141. package/dist/context/debug/spector.js +4 -4
  142. package/dist/context/debug/spector.js.map +1 -1
  143. package/dist/context/debug/webgl-developer-tools.js +11 -9
  144. package/dist/context/debug/webgl-developer-tools.js.map +1 -1
  145. package/dist/context/helpers/create-browser-context.d.ts.map +1 -1
  146. package/dist/context/helpers/create-browser-context.js +46 -36
  147. package/dist/context/helpers/create-browser-context.js.map +1 -1
  148. package/dist/context/helpers/webgl-context-data.d.ts +5 -1
  149. package/dist/context/helpers/webgl-context-data.d.ts.map +1 -1
  150. package/dist/context/helpers/webgl-context-data.js +9 -10
  151. package/dist/context/helpers/webgl-context-data.js.map +1 -1
  152. package/dist/context/helpers/webgl-extensions.d.ts +1 -1
  153. package/dist/context/helpers/webgl-extensions.d.ts.map +1 -1
  154. package/dist/context/parameters/unified-parameter-api.d.ts +2 -2
  155. package/dist/context/parameters/unified-parameter-api.d.ts.map +1 -1
  156. package/dist/context/parameters/unified-parameter-api.js +2 -2
  157. package/dist/context/parameters/unified-parameter-api.js.map +1 -1
  158. package/dist/context/parameters/webgl-parameter-tables.d.ts +1 -1
  159. package/dist/context/parameters/webgl-parameter-tables.d.ts.map +1 -1
  160. package/dist/context/parameters/webgl-parameter-tables.js +1 -1
  161. package/dist/context/parameters/webgl-parameter-tables.js.map +1 -1
  162. package/dist/context/polyfills/polyfill-webgl1-extensions.js +1 -1
  163. package/dist/context/polyfills/polyfill-webgl1-extensions.js.map +1 -1
  164. package/dist/context/state-tracker/webgl-state-tracker.js +2 -2
  165. package/dist/context/state-tracker/webgl-state-tracker.js.map +1 -1
  166. package/dist/dist.dev.js +1898 -997
  167. package/dist/dist.min.js +2 -2
  168. package/dist/index.cjs +3 -5255
  169. package/dist/index.cjs.map +4 -4
  170. package/dist/index.d.ts +3 -0
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js +2 -0
  173. package/dist/index.js.map +1 -1
  174. package/dist/utils/fill-array.js +1 -1
  175. package/dist/utils/fill-array.js.map +1 -1
  176. package/dist/webgl-constants.d.ts +2 -0
  177. package/dist/webgl-constants.d.ts.map +1 -0
  178. package/dist/webgl-constants.js +5 -0
  179. package/dist/webgl-constants.js.map +1 -0
  180. package/dist/webgl-types.d.ts +2 -0
  181. package/dist/webgl-types.d.ts.map +1 -0
  182. package/dist/{types.js → webgl-types.js} +1 -1
  183. package/dist/webgl-types.js.map +1 -0
  184. package/package.json +19 -5
  185. package/src/adapter/converters/device-parameters.ts +6 -2
  186. package/src/adapter/converters/sampler-parameters.ts +1 -1
  187. package/src/adapter/converters/shader-formats.ts +1 -66
  188. package/src/adapter/converters/webgl-shadertypes.ts +2 -10
  189. package/src/adapter/converters/webgl-texture-table.ts +160 -68
  190. package/src/adapter/converters/webgl-vertex-formats.ts +4 -4
  191. package/src/adapter/device-helpers/webgl-device-features.ts +2 -3
  192. package/src/adapter/device-helpers/webgl-device-info.ts +7 -1
  193. package/src/adapter/device-helpers/webgl-device-limits.ts +2 -2
  194. package/src/adapter/helpers/format-utils.ts +1 -1
  195. package/src/adapter/helpers/get-shader-layout-from-glsl.ts +44 -24
  196. package/src/adapter/helpers/parse-shader-compiler-log.ts +25 -3
  197. package/src/adapter/helpers/set-uniform.ts +2 -2
  198. package/src/adapter/helpers/webgl-texture-utils.ts +9 -9
  199. package/src/adapter/helpers/webgl-topology-utils.ts +3 -3
  200. package/src/adapter/resources/webgl-buffer.ts +17 -5
  201. package/src/adapter/resources/webgl-command-buffer.ts +48 -52
  202. package/src/adapter/resources/webgl-command-encoder.ts +28 -11
  203. package/src/adapter/resources/webgl-fence.ts +55 -0
  204. package/src/adapter/resources/webgl-framebuffer.ts +12 -1
  205. package/src/adapter/resources/webgl-query-set.ts +295 -101
  206. package/src/adapter/resources/webgl-render-pass.ts +30 -13
  207. package/src/adapter/resources/webgl-render-pipeline.ts +131 -227
  208. package/src/adapter/resources/webgl-sampler.ts +1 -1
  209. package/src/adapter/resources/webgl-shader.ts +15 -8
  210. package/src/adapter/resources/webgl-shared-render-pipeline.ts +211 -0
  211. package/src/adapter/resources/webgl-texture.ts +458 -84
  212. package/src/adapter/resources/webgl-transform-feedback.ts +6 -6
  213. package/src/adapter/resources/webgl-vertex-array.ts +1 -1
  214. package/src/adapter/webgl-adapter.ts +26 -24
  215. package/src/adapter/webgl-canvas-context.ts +19 -8
  216. package/src/adapter/webgl-device.ts +94 -35
  217. package/src/adapter/webgl-presentation-context.ts +93 -0
  218. package/src/constants/index.d.ts.map +1 -0
  219. package/src/constants/index.js.map +1 -0
  220. package/src/constants/index.ts +31 -0
  221. package/src/constants/webgl-constants.d.ts.map +1 -0
  222. package/src/constants/webgl-constants.js.map +1 -0
  223. package/src/constants/webgl-constants.ts +1051 -0
  224. package/src/constants/webgl-types.d.ts.map +1 -0
  225. package/src/constants/webgl-types.js.map +1 -0
  226. package/src/constants/webgl-types.ts +813 -0
  227. package/src/context/debug/spector.ts +4 -4
  228. package/src/context/debug/webgl-developer-tools.ts +20 -9
  229. package/src/context/helpers/create-browser-context.ts +54 -43
  230. package/src/context/helpers/webgl-context-data.ts +17 -11
  231. package/src/context/helpers/webgl-extensions.ts +1 -1
  232. package/src/context/parameters/unified-parameter-api.ts +3 -3
  233. package/src/context/parameters/webgl-parameter-tables.ts +1 -1
  234. package/src/context/polyfills/polyfill-webgl1-extensions.ts +1 -1
  235. package/src/context/state-tracker/webgl-state-tracker.ts +2 -2
  236. package/src/index.ts +27 -0
  237. package/src/utils/fill-array.ts +1 -1
  238. package/src/webgl-constants.d.ts.map +1 -0
  239. package/src/webgl-constants.js.map +1 -0
  240. package/src/webgl-constants.ts +5 -0
  241. package/src/webgl-types.d.ts.map +1 -0
  242. package/src/webgl-types.js.map +1 -0
  243. package/src/webgl-types.ts +29 -0
  244. package/dist/types.d.ts +0 -11
  245. package/dist/types.d.ts.map +0 -1
  246. package/dist/types.js.map +0 -1
  247. package/src/types.ts +0 -14
@@ -5,7 +5,7 @@
5
5
  // @ts-nocheck This file will be deleted in upcoming refactor
6
6
 
7
7
  import type {Buffer, Texture, FramebufferProps} from '@luma.gl/core';
8
- import {Framebuffer, getTypedArrayConstructor, getDataType} from '@luma.gl/core';
8
+ import {Framebuffer, dataTypeDecoder} from '@luma.gl/core';
9
9
  import {
10
10
  GL,
11
11
  GLTextureTarget,
@@ -13,7 +13,7 @@ import {
13
13
  GLTexelDataFormat,
14
14
  GLPixelType,
15
15
  GLDataType
16
- } from '@luma.gl/constants';
16
+ } from '@luma.gl/webgl/constants';
17
17
 
18
18
  import {convertDataTypeToGLDataType} from '../converters/webgl-shadertypes';
19
19
  import {WEBGLFramebuffer} from '../resources/webgl-framebuffer';
@@ -102,10 +102,10 @@ export function copyGPUBufferToMipLevel(
102
102
  // 3 dimensional textures requires 3D texture functions
103
103
  if (compressed) {
104
104
  // TODO enable extension?
105
- // prettier-ignore
105
+ // biome-ignore format: preserve layout
106
106
  gl.compressedTexSubImage3D(glTarget, mipLevel, x, y, z, width, height, depth, glFormat, byteLength, byteOffset);
107
107
  } else {
108
- // prettier-ignore
108
+ // biome-ignore format: preserve layout
109
109
  gl.texSubImage3D(glTarget, mipLevel, x, y, z, width, height, depth, glFormat, glType, byteOffset);
110
110
  }
111
111
  break;
@@ -113,10 +113,10 @@ export function copyGPUBufferToMipLevel(
113
113
  case '2d':
114
114
  case 'cube':
115
115
  if (compressed) {
116
- // prettier-ignore
116
+ // biome-ignore format: preserve layout
117
117
  gl.compressedTexSubImage2D(glTarget, mipLevel, x, y, width, height, glFormat, byteLength, byteOffset);
118
118
  } else {
119
- // prettier-ignore
119
+ // biome-ignore format: preserve layout
120
120
  gl.texSubImage2D(glTarget, mipLevel, x, y, width, height, BORDER, glFormat, byteOffset);
121
121
  }
122
122
  break;
@@ -132,7 +132,7 @@ export function copyGPUBufferToMipLevel(
132
132
  export function getWebGLTextureTarget(
133
133
  dimension: '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d'
134
134
  ): GLTextureTarget {
135
- // prettier-ignore
135
+ // biome-ignore format: preserve layout
136
136
  switch (dimension) {
137
137
  case '1d': break; // not supported in any WebGL version
138
138
  case '2d': return GL.TEXTURE_2D; // supported in WebGL1
@@ -232,7 +232,7 @@ export function readPixelsToArray(
232
232
  target = getPixelArray(target, sourceType, sourceFormat, sourceWidth, sourceHeight, sourceDepth);
233
233
 
234
234
  // Pixel array available, if necessary, deduce type from it.
235
- const signedType = getDataType(target);
235
+ const signedType = dataTypeDecoder.getDataType(target);
236
236
  sourceType = sourceType || convertDataTypeToGLDataType(signedType);
237
237
 
238
238
  // Note: luma.gl overrides bindFramebuffer so that we can reliably restore the previous framebuffer (this is the only function for which we do that)
@@ -484,7 +484,7 @@ function getPixelArray(
484
484
  // Allocate pixel array if not already available, using supplied type
485
485
  glType ||= GL.UNSIGNED_BYTE;
486
486
  const shaderType = convertGLDataTypeToDataType(glType);
487
- const ArrayType = getTypedArrayConstructor(shaderType);
487
+ const ArrayType = dataTypeDecoder.getTypedArrayConstructor(shaderType);
488
488
  const components = glFormatToComponents(glFormat);
489
489
  // TODO - check for composite type (components = 1).
490
490
  return new ArrayType(width * height * components) as Uint8Array | Uint16Array | Float32Array;
@@ -2,7 +2,7 @@
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
- import {GL, GLPrimitiveTopology, GLPrimitive} from '@luma.gl/constants';
5
+ import {GL, GLPrimitiveTopology, GLPrimitive} from '@luma.gl/webgl/constants';
6
6
  import {PrimitiveTopology} from '@luma.gl/core';
7
7
 
8
8
  // Counts the number of complete primitives given a number of vertices and a drawMode
@@ -81,7 +81,7 @@ export function getGLDrawMode(
81
81
  | GL.TRIANGLES
82
82
  | GL.TRIANGLE_STRIP
83
83
  | GL.TRIANGLE_FAN {
84
- // prettier-ignore
84
+ // biome-ignore format: preserve layout
85
85
  switch (topology) {
86
86
  case 'point-list': return GL.POINTS;
87
87
  case 'line-list': return GL.LINES;
@@ -94,7 +94,7 @@ export function getGLDrawMode(
94
94
 
95
95
  /** Get the primitive type for transform feedback */
96
96
  export function getGLPrimitive(topology: PrimitiveTopology): GL.POINTS | GL.LINES | GL.TRIANGLES {
97
- // prettier-ignore
97
+ // biome-ignore format: preserve layout
98
98
  switch (topology) {
99
99
  case 'point-list': return GL.POINTS;
100
100
  case 'line-list': return GL.LINES;
@@ -4,7 +4,7 @@
4
4
 
5
5
  import type {BufferMapCallback, BufferProps} from '@luma.gl/core';
6
6
  import {Buffer} from '@luma.gl/core';
7
- import {GL} from '@luma.gl/constants';
7
+ import {GL} from '@luma.gl/webgl/constants';
8
8
  import {WebGLDevice} from '../webgl-device';
9
9
 
10
10
  /** WebGL Buffer interface */
@@ -56,8 +56,12 @@ export class WEBGLBuffer extends Buffer {
56
56
  override destroy(): void {
57
57
  if (!this.destroyed && this.handle) {
58
58
  this.removeStats();
59
- this.trackDeallocatedMemory();
60
- this.gl.deleteBuffer(this.handle);
59
+ if (!this.props.handle) {
60
+ this.trackDeallocatedMemory();
61
+ this.gl.deleteBuffer(this.handle);
62
+ } else {
63
+ this.trackDeallocatedReferencedMemory('Buffer');
64
+ }
61
65
  this.destroyed = true;
62
66
  // @ts-expect-error
63
67
  this.handle = null;
@@ -81,7 +85,11 @@ export class WEBGLBuffer extends Buffer {
81
85
  this.byteLength = byteLength;
82
86
 
83
87
  this._setDebugData(data, byteOffset, byteLength);
84
- this.trackAllocatedMemory(byteLength);
88
+ if (!this.props.handle) {
89
+ this.trackAllocatedMemory(byteLength);
90
+ } else {
91
+ this.trackReferencedMemory(byteLength, 'Buffer');
92
+ }
85
93
  }
86
94
 
87
95
  // Allocate a GPU buffer of specified size.
@@ -107,7 +115,11 @@ export class WEBGLBuffer extends Buffer {
107
115
  this.byteLength = byteLength;
108
116
 
109
117
  this._setDebugData(null, 0, byteLength);
110
- this.trackAllocatedMemory(byteLength);
118
+ if (!this.props.handle) {
119
+ this.trackAllocatedMemory(byteLength);
120
+ } else {
121
+ this.trackReferencedMemory(byteLength, 'Buffer');
122
+ }
111
123
 
112
124
  return this;
113
125
  }
@@ -2,29 +2,26 @@
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
- import type {
6
- CopyBufferToBufferOptions,
7
- CopyBufferToTextureOptions,
8
- CopyTextureToBufferOptions,
9
- CopyTextureToTextureOptions
10
- // ClearTextureOptions,
11
- // TextureReadOptions
12
- } from '@luma.gl/core';
13
- import {CommandBuffer, Texture, Framebuffer} from '@luma.gl/core';
14
5
  import {
15
- GL,
16
- GLTextureTarget,
17
- GLTextureCubeMapTarget
18
- // GLTexelDataFormat,
19
- // GLPixelType,
20
- // GLDataType
21
- } from '@luma.gl/constants';
6
+ type CommandBufferProps,
7
+ type CopyBufferToBufferOptions,
8
+ type CopyBufferToTextureOptions,
9
+ type CopyTextureToBufferOptions,
10
+ type CopyTextureToTextureOptions,
11
+ type TextureReadOptions,
12
+ // type ClearTextureOptions,
13
+ CommandBuffer,
14
+ Texture,
15
+ Framebuffer,
16
+ assertDefined
17
+ } from '@luma.gl/core';
18
+ import {GL, type GLTextureTarget, type GLTextureCubeMapTarget} from '@luma.gl/webgl/constants';
22
19
 
20
+ import {getTextureFormatWebGL} from '../converters/webgl-texture-table';
23
21
  import {WebGLDevice} from '../webgl-device';
24
22
  import {WEBGLBuffer} from './webgl-buffer';
25
23
  import {WEBGLTexture} from './webgl-texture';
26
24
  import {WEBGLFramebuffer} from './webgl-framebuffer';
27
- import {getTextureFormatWebGL} from '../converters/webgl-texture-table';
28
25
 
29
26
  type CopyBufferToBufferCommand = {
30
27
  name: 'copy-buffer-to-buffer';
@@ -69,8 +66,8 @@ export class WEBGLCommandBuffer extends CommandBuffer {
69
66
  readonly handle = null;
70
67
  commands: Command[] = [];
71
68
 
72
- constructor(device: WebGLDevice) {
73
- super(device, {});
69
+ constructor(device: WebGLDevice, props: CommandBufferProps = {}) {
70
+ super(device, props);
74
71
  this.device = device;
75
72
  }
76
73
 
@@ -122,8 +119,8 @@ function _copyBufferToBuffer(device: WebGLDevice, options: CopyBufferToBufferOpt
122
119
  * Copies data from a Buffer object into a Texture object
123
120
  * NOTE: doesn't wait for copy to be complete
124
121
  */
125
- function _copyBufferToTexture(device: WebGLDevice, options: CopyBufferToTextureOptions): void {
126
- throw new Error('Not implemented');
122
+ function _copyBufferToTexture(_device: WebGLDevice, _options: CopyBufferToTextureOptions): void {
123
+ throw new Error('copyBufferToTexture is not supported in WebGL');
127
124
  }
128
125
 
129
126
  /**
@@ -132,45 +129,44 @@ function _copyBufferToTexture(device: WebGLDevice, options: CopyBufferToTextureO
132
129
  */
133
130
  function _copyTextureToBuffer(device: WebGLDevice, options: CopyTextureToBufferOptions): void {
134
131
  const {
135
- /** Texture to copy to/from. */
136
132
  sourceTexture,
137
- /** Mip-map level of the texture to copy to/from. (Default 0) */
138
133
  mipLevel = 0,
139
- /** Defines which aspects of the texture to copy to/from. */
140
134
  aspect = 'all',
141
-
142
- /** Width to copy */
143
135
  width = options.sourceTexture.width,
144
- /** Height to copy */
145
136
  height = options.sourceTexture.height,
146
- depthOrArrayLayers = 0,
147
- /** Defines the origin of the copy - the minimum corner of the texture sub-region to copy to/from. */
148
- origin = [0, 0],
149
-
150
- /** Destination buffer */
137
+ depthOrArrayLayers,
138
+ origin = [0, 0, 0],
151
139
  destinationBuffer,
152
- /** Offset, in bytes, from the beginning of the buffer to the start of the image data (default 0) */
153
140
  byteOffset = 0,
154
- /**
155
- * The stride, in bytes, between the beginning of each block row and the subsequent block row.
156
- * Required if there are multiple block rows (i.e. the copy height or depth is more than one block).
157
- */
158
141
  bytesPerRow,
159
- /**
160
- * Number of block rows per single image of the texture.
161
- * rowsPerImage × bytesPerRow is the stride, in bytes, between the beginning of each image of data and the subsequent image.
162
- * Required if there are multiple images (i.e. the copy depth is more than one).
163
- */
164
142
  rowsPerImage
165
143
  } = options;
166
144
 
145
+ if (sourceTexture instanceof Texture) {
146
+ sourceTexture.readBuffer(
147
+ {
148
+ x: origin[0] ?? 0,
149
+ y: origin[1] ?? 0,
150
+ z: origin[2] ?? 0,
151
+ width,
152
+ height,
153
+ depthOrArrayLayers,
154
+ mipLevel,
155
+ aspect,
156
+ byteOffset
157
+ } as TextureReadOptions & {byteOffset?: number},
158
+ destinationBuffer
159
+ );
160
+ return;
161
+ }
162
+
167
163
  // TODO - Not possible to read just stencil or depth part in WebGL?
168
164
  if (aspect !== 'all') {
169
165
  throw new Error('aspect not supported in WebGL');
170
166
  }
171
167
 
172
168
  // TODO - mipLevels are set when attaching texture to framebuffer
173
- if (mipLevel !== 0 || depthOrArrayLayers !== 0 || bytesPerRow || rowsPerImage) {
169
+ if (mipLevel !== 0 || depthOrArrayLayers !== undefined || bytesPerRow || rowsPerImage) {
174
170
  throw new Error('not implemented');
175
171
  }
176
172
 
@@ -181,9 +177,9 @@ function _copyTextureToBuffer(device: WebGLDevice, options: CopyTextureToBufferO
181
177
  const webglBuffer = destinationBuffer as WEBGLBuffer;
182
178
  const sourceWidth = width || framebuffer.width;
183
179
  const sourceHeight = height || framebuffer.height;
184
- const sourceParams = getTextureFormatWebGL(
185
- framebuffer.colorAttachments[0].texture.props.format
186
- );
180
+ const colorAttachment0 = assertDefined(framebuffer.colorAttachments[0]);
181
+
182
+ const sourceParams = getTextureFormatWebGL(colorAttachment0.texture.props.format);
187
183
  const sourceFormat = sourceParams.format;
188
184
  const sourceType = sourceParams.type;
189
185
 
@@ -256,7 +252,7 @@ function _copyTextureToTexture(device: WebGLDevice, options: CopyTextureToTextur
256
252
  origin = [0, 0],
257
253
 
258
254
  /** Defines the origin of the copy - the minimum corner of the texture sub-region to copy to. */
259
- destinationOrigin = [0, 0],
255
+ destinationOrigin = [0, 0, 0],
260
256
 
261
257
  /** Texture to copy to/from. */
262
258
  destinationTexture
@@ -275,7 +271,7 @@ function _copyTextureToTexture(device: WebGLDevice, options: CopyTextureToTextur
275
271
  } = options;
276
272
 
277
273
  const {framebuffer, destroyFramebuffer} = getFramebuffer(sourceTexture);
278
- const [sourceX, sourceY] = origin;
274
+ const [sourceX = 0, sourceY = 0] = origin;
279
275
  const [destinationX, destinationY, destinationZ] = destinationOrigin;
280
276
 
281
277
  // @ts-expect-error native bindFramebuffer is overridden by our state tracker
@@ -349,10 +345,10 @@ function _clearTexture(device: WebGLDevice, options: ClearTextureOptions) {
349
345
  case '2d-array':
350
346
  case '3d':
351
347
  if (compressed) {
352
- // prettier-ignore
348
+ // biome-ignore format: preserve layout
353
349
  device.gl.compressedTexImage3D(glTarget, mipLevel, glInternalFormat, width, height, depth, BORDER, null);
354
350
  } else {
355
- // prettier-ignore
351
+ // biome-ignore format: preserve layout
356
352
  device.gl.texImage3D( glTarget, mipLevel, glInternalFormat, width, height, depth, BORDER, glFormat, glType, null);
357
353
  }
358
354
  break;
@@ -360,10 +356,10 @@ function _clearTexture(device: WebGLDevice, options: ClearTextureOptions) {
360
356
  case '2d':
361
357
  case 'cube':
362
358
  if (compressed) {
363
- // prettier-ignore
359
+ // biome-ignore format: preserve layout
364
360
  device.gl.compressedTexImage2D(glTarget, mipLevel, glInternalFormat, width, height, BORDER, null);
365
361
  } else {
366
- // prettier-ignore
362
+ // biome-ignore format: preserve layout
367
363
  device.gl.texImage2D(glTarget, mipLevel, glInternalFormat, width, height, BORDER, glFormat, glType, null);
368
364
  }
369
365
  break;
@@ -2,7 +2,7 @@
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
- import {CommandEncoder, CommandEncoderProps} from '@luma.gl/core';
5
+ import {CommandBufferProps, CommandEncoder, CommandEncoderProps} from '@luma.gl/core';
6
6
  import type {
7
7
  RenderPassProps,
8
8
  ComputePass,
@@ -20,6 +20,7 @@ import type {
20
20
  import {WEBGLCommandBuffer} from './webgl-command-buffer';
21
21
  import {WEBGLRenderPass} from './webgl-render-pass';
22
22
  import {WebGLDevice} from '../webgl-device';
23
+ import {WEBGLQuerySet} from './webgl-query-set';
23
24
 
24
25
  export class WEBGLCommandEncoder extends CommandEncoder {
25
26
  readonly device: WebGLDevice;
@@ -30,20 +31,29 @@ export class WEBGLCommandEncoder extends CommandEncoder {
30
31
  constructor(device: WebGLDevice, props: CommandEncoderProps) {
31
32
  super(device, props);
32
33
  this.device = device;
33
- this.commandBuffer = new WEBGLCommandBuffer(device);
34
+ this.commandBuffer = new WEBGLCommandBuffer(device, {
35
+ id: `${this.props.id}-command-buffer`
36
+ });
34
37
  }
35
38
 
36
- override destroy(): void {}
39
+ override destroy(): void {
40
+ this.destroyResource();
41
+ }
37
42
 
38
- override finish(): WEBGLCommandBuffer {
43
+ override finish(props?: CommandBufferProps): WEBGLCommandBuffer {
44
+ if (props?.id && this.commandBuffer.id !== props.id) {
45
+ this.commandBuffer.id = props.id;
46
+ this.commandBuffer.props.id = props.id;
47
+ }
48
+ this.destroy();
39
49
  return this.commandBuffer;
40
50
  }
41
51
 
42
- beginRenderPass(props: RenderPassProps): WEBGLRenderPass {
43
- return new WEBGLRenderPass(this.device, props);
52
+ beginRenderPass(props: RenderPassProps = {}): WEBGLRenderPass {
53
+ return new WEBGLRenderPass(this.device, this._applyTimeProfilingToPassProps(props));
44
54
  }
45
55
 
46
- beginComputePass(props: ComputePassProps): ComputePass {
56
+ beginComputePass(props: ComputePassProps = {}): ComputePass {
47
57
  throw new Error('ComputePass not supported in WebGL');
48
58
  }
49
59
 
@@ -73,12 +83,19 @@ export class WEBGLCommandEncoder extends CommandEncoder {
73
83
  override insertDebugMarker(markerLabel: string): void {}
74
84
 
75
85
  override resolveQuerySet(
76
- querySet: QuerySet,
77
- destination: Buffer,
78
- options?: {
86
+ _querySet: QuerySet,
87
+ _destination: Buffer,
88
+ _options?: {
79
89
  firstQuery?: number;
80
90
  queryCount?: number;
81
91
  destinationOffset?: number;
82
92
  }
83
- ): void {}
93
+ ): void {
94
+ throw new Error('resolveQuerySet is not supported in WebGL');
95
+ }
96
+
97
+ writeTimestamp(querySet: QuerySet, queryIndex: number): void {
98
+ const webglQuerySet = querySet as WEBGLQuerySet;
99
+ webglQuerySet.writeTimestamp(queryIndex);
100
+ }
84
101
  }
@@ -0,0 +1,55 @@
1
+ // luma.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import {Fence, type FenceProps} from '@luma.gl/core';
6
+ import {WebGLDevice} from '../webgl-device';
7
+
8
+ /** WebGL fence implemented with gl.fenceSync */
9
+ export class WEBGLFence extends Fence {
10
+ readonly device: WebGLDevice;
11
+ readonly gl: WebGL2RenderingContext;
12
+ readonly handle: WebGLSync;
13
+ readonly signaled: Promise<void>;
14
+ private _signaled = false;
15
+
16
+ constructor(device: WebGLDevice, props: FenceProps = {}) {
17
+ super(device, {});
18
+ this.device = device;
19
+ this.gl = device.gl;
20
+
21
+ const sync = this.props.handle || this.gl.fenceSync(this.gl.SYNC_GPU_COMMANDS_COMPLETE, 0);
22
+ if (!sync) {
23
+ throw new Error('Failed to create WebGL fence');
24
+ }
25
+ this.handle = sync;
26
+
27
+ this.signaled = new Promise(resolve => {
28
+ const poll = () => {
29
+ const status = this.gl.clientWaitSync(this.handle, 0, 0);
30
+ if (status === this.gl.ALREADY_SIGNALED || status === this.gl.CONDITION_SATISFIED) {
31
+ this._signaled = true;
32
+ resolve();
33
+ } else {
34
+ setTimeout(poll, 1);
35
+ }
36
+ };
37
+ poll();
38
+ });
39
+ }
40
+
41
+ isSignaled(): boolean {
42
+ if (this._signaled) {
43
+ return true;
44
+ }
45
+ const status = this.gl.getSyncParameter(this.handle, this.gl.SYNC_STATUS);
46
+ this._signaled = status === this.gl.SIGNALED;
47
+ return this._signaled;
48
+ }
49
+
50
+ destroy(): void {
51
+ if (!this.destroyed) {
52
+ this.gl.deleteSync(this.handle);
53
+ }
54
+ }
55
+ }
@@ -4,7 +4,7 @@
4
4
 
5
5
  import type {FramebufferProps} from '@luma.gl/core';
6
6
  import {Framebuffer} from '@luma.gl/core';
7
- import {GL} from '@luma.gl/constants';
7
+ import {GL} from '@luma.gl/webgl/constants';
8
8
  import {WebGLDevice} from '../webgl-device';
9
9
  import {WEBGLTexture} from './webgl-texture';
10
10
  import {WEBGLTextureView} from './webgl-texture-view';
@@ -137,6 +137,17 @@ export class WEBGLFramebuffer extends Framebuffer {
137
137
 
138
138
  gl.bindTexture(texture.glTarget, null);
139
139
  }
140
+
141
+ /** Default framebuffer resize is managed by canvas size and should be a no-op. */
142
+ protected override resizeAttachments(width: number, height: number): void {
143
+ if (this.handle === null) {
144
+ this.width = width;
145
+ this.height = height;
146
+ return;
147
+ }
148
+
149
+ super.resizeAttachments(width, height);
150
+ }
140
151
  }
141
152
 
142
153
  // Helper functions