@luma.gl/webgl 9.1.0-beta.9 → 9.2.0-alpha.1

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 (189) hide show
  1. package/dist/adapter/converters/device-parameters.js +14 -9
  2. package/dist/adapter/converters/device-parameters.js.map +1 -1
  3. package/dist/adapter/converters/shader-formats.d.ts +67 -8
  4. package/dist/adapter/converters/shader-formats.d.ts.map +1 -1
  5. package/dist/adapter/converters/shader-formats.js +82 -52
  6. package/dist/adapter/converters/shader-formats.js.map +1 -1
  7. package/dist/adapter/converters/webgl-shadertypes.d.ts +20 -0
  8. package/dist/adapter/converters/webgl-shadertypes.d.ts.map +1 -0
  9. package/dist/adapter/converters/webgl-shadertypes.js +123 -0
  10. package/dist/adapter/converters/webgl-shadertypes.js.map +1 -0
  11. package/dist/adapter/converters/webgl-texture-table.js +6 -6
  12. package/dist/adapter/converters/webgl-texture-table.js.map +1 -1
  13. package/dist/adapter/converters/{vertex-formats.d.ts → webgl-vertex-formats.d.ts} +4 -4
  14. package/dist/adapter/converters/webgl-vertex-formats.d.ts.map +1 -0
  15. package/dist/adapter/converters/{vertex-formats.js → webgl-vertex-formats.js} +1 -1
  16. package/dist/adapter/converters/webgl-vertex-formats.js.map +1 -0
  17. package/dist/adapter/device-helpers/webgl-device-features.d.ts.map +1 -1
  18. package/dist/adapter/device-helpers/webgl-device-features.js.map +1 -1
  19. package/dist/adapter/device-helpers/webgl-device-limits.d.ts +1 -1
  20. package/dist/adapter/device-helpers/webgl-device-limits.d.ts.map +1 -1
  21. package/dist/adapter/device-helpers/webgl-device-limits.js +1 -1
  22. package/dist/adapter/device-helpers/webgl-device-limits.js.map +1 -1
  23. package/dist/adapter/helpers/format-utils.d.ts +3 -2
  24. package/dist/adapter/helpers/format-utils.d.ts.map +1 -1
  25. package/dist/adapter/helpers/format-utils.js.map +1 -1
  26. package/dist/adapter/helpers/{get-shader-layout.d.ts → get-shader-layout-from-glsl.d.ts} +1 -1
  27. package/dist/adapter/helpers/get-shader-layout-from-glsl.d.ts.map +1 -0
  28. package/dist/adapter/helpers/{get-shader-layout.js → get-shader-layout-from-glsl.js} +12 -35
  29. package/dist/adapter/helpers/get-shader-layout-from-glsl.js.map +1 -0
  30. package/dist/adapter/helpers/set-uniform.d.ts +2 -2
  31. package/dist/adapter/helpers/set-uniform.d.ts.map +1 -1
  32. package/dist/adapter/helpers/set-uniform.js.map +1 -1
  33. package/dist/adapter/helpers/webgl-texture-utils.d.ts +2 -25
  34. package/dist/adapter/helpers/webgl-texture-utils.d.ts.map +1 -1
  35. package/dist/adapter/helpers/webgl-texture-utils.js +10 -99
  36. package/dist/adapter/helpers/webgl-texture-utils.js.map +1 -1
  37. package/dist/adapter/resources/webgl-buffer.d.ts.map +1 -1
  38. package/dist/adapter/resources/webgl-buffer.js +5 -3
  39. package/dist/adapter/resources/webgl-buffer.js.map +1 -1
  40. package/dist/adapter/resources/webgl-command-buffer.d.ts +2 -2
  41. package/dist/adapter/resources/webgl-command-buffer.d.ts.map +1 -1
  42. package/dist/adapter/resources/webgl-command-buffer.js +4 -4
  43. package/dist/adapter/resources/webgl-command-buffer.js.map +1 -1
  44. package/dist/adapter/resources/webgl-command-encoder.d.ts +6 -2
  45. package/dist/adapter/resources/webgl-command-encoder.d.ts.map +1 -1
  46. package/dist/adapter/resources/webgl-command-encoder.js +9 -4
  47. package/dist/adapter/resources/webgl-command-encoder.js.map +1 -1
  48. package/dist/adapter/resources/webgl-external-texture.js +1 -0
  49. package/dist/adapter/resources/webgl-external-texture.js.map +1 -1
  50. package/dist/adapter/resources/webgl-framebuffer.js +2 -2
  51. package/dist/adapter/resources/webgl-framebuffer.js.map +1 -1
  52. package/dist/adapter/resources/webgl-query-set.d.ts.map +1 -1
  53. package/dist/adapter/resources/webgl-query-set.js +5 -1
  54. package/dist/adapter/resources/webgl-query-set.js.map +1 -1
  55. package/dist/adapter/resources/webgl-render-pass.d.ts.map +1 -1
  56. package/dist/adapter/resources/webgl-render-pass.js +11 -6
  57. package/dist/adapter/resources/webgl-render-pass.js.map +1 -1
  58. package/dist/adapter/resources/webgl-render-pipeline.d.ts +3 -3
  59. package/dist/adapter/resources/webgl-render-pipeline.d.ts.map +1 -1
  60. package/dist/adapter/resources/webgl-render-pipeline.js +27 -24
  61. package/dist/adapter/resources/webgl-render-pipeline.js.map +1 -1
  62. package/dist/adapter/resources/webgl-sampler.js +1 -1
  63. package/dist/adapter/resources/webgl-sampler.js.map +1 -1
  64. package/dist/adapter/resources/webgl-shader.d.ts.map +1 -1
  65. package/dist/adapter/resources/webgl-shader.js +9 -2
  66. package/dist/adapter/resources/webgl-shader.js.map +1 -1
  67. package/dist/adapter/resources/webgl-texture-view.js +1 -1
  68. package/dist/adapter/resources/webgl-texture-view.js.map +1 -1
  69. package/dist/adapter/resources/webgl-texture.d.ts +21 -66
  70. package/dist/adapter/resources/webgl-texture.d.ts.map +1 -1
  71. package/dist/adapter/resources/webgl-texture.js +148 -319
  72. package/dist/adapter/resources/webgl-texture.js.map +1 -1
  73. package/dist/adapter/resources/webgl-transform-feedback.d.ts +1 -1
  74. package/dist/adapter/resources/webgl-transform-feedback.d.ts.map +1 -1
  75. package/dist/adapter/resources/webgl-transform-feedback.js +1 -1
  76. package/dist/adapter/resources/webgl-transform-feedback.js.map +1 -1
  77. package/dist/adapter/resources/webgl-vertex-array.d.ts +1 -1
  78. package/dist/adapter/resources/webgl-vertex-array.d.ts.map +1 -1
  79. package/dist/adapter/resources/webgl-vertex-array.js +3 -2
  80. package/dist/adapter/resources/webgl-vertex-array.js.map +1 -1
  81. package/dist/adapter/webgl-adapter.d.ts +4 -3
  82. package/dist/adapter/webgl-adapter.d.ts.map +1 -1
  83. package/dist/adapter/webgl-adapter.js +16 -7
  84. package/dist/adapter/webgl-adapter.js.map +1 -1
  85. package/dist/adapter/webgl-canvas-context.d.ts +3 -24
  86. package/dist/adapter/webgl-canvas-context.d.ts.map +1 -1
  87. package/dist/adapter/webgl-canvas-context.js +5 -44
  88. package/dist/adapter/webgl-canvas-context.js.map +1 -1
  89. package/dist/adapter/webgl-device.d.ts +17 -20
  90. package/dist/adapter/webgl-device.d.ts.map +1 -1
  91. package/dist/adapter/webgl-device.js +30 -28
  92. package/dist/adapter/webgl-device.js.map +1 -1
  93. package/dist/context/debug/spector-types.d.ts.map +1 -1
  94. package/dist/context/debug/spector-types.js +3 -0
  95. package/dist/context/debug/spector-types.js.map +1 -1
  96. package/dist/context/debug/spector.js.map +1 -1
  97. package/dist/context/debug/webgl-developer-tools.js.map +1 -1
  98. package/dist/context/helpers/webgl-extensions.d.ts.map +1 -1
  99. package/dist/context/helpers/webgl-extensions.js +3 -0
  100. package/dist/context/helpers/webgl-extensions.js.map +1 -1
  101. package/dist/context/parameters/unified-parameter-api.d.ts.map +1 -1
  102. package/dist/context/parameters/unified-parameter-api.js +7 -0
  103. package/dist/context/parameters/unified-parameter-api.js.map +1 -1
  104. package/dist/context/parameters/webgl-parameter-tables.d.ts +1 -1
  105. package/dist/context/parameters/webgl-parameter-tables.d.ts.map +1 -1
  106. package/dist/context/parameters/webgl-parameter-tables.js +1 -0
  107. package/dist/context/parameters/webgl-parameter-tables.js.map +1 -1
  108. package/dist/context/polyfills/polyfill-webgl1-extensions.d.ts.map +1 -1
  109. package/dist/context/polyfills/polyfill-webgl1-extensions.js +1 -0
  110. package/dist/context/polyfills/polyfill-webgl1-extensions.js.map +1 -1
  111. package/dist/context/state-tracker/deep-array-equal.d.ts +2 -1
  112. package/dist/context/state-tracker/deep-array-equal.d.ts.map +1 -1
  113. package/dist/context/state-tracker/deep-array-equal.js +4 -5
  114. package/dist/context/state-tracker/deep-array-equal.js.map +1 -1
  115. package/dist/context/state-tracker/webgl-state-tracker.d.ts.map +1 -1
  116. package/dist/context/state-tracker/webgl-state-tracker.js +4 -1
  117. package/dist/context/state-tracker/webgl-state-tracker.js.map +1 -1
  118. package/dist/context/state-tracker/with-parameters.js.map +1 -1
  119. package/dist/dist.dev.js +4720 -4771
  120. package/dist/dist.min.js +2 -2
  121. package/dist/index.cjs +3849 -3938
  122. package/dist/index.cjs.map +4 -4
  123. package/dist/index.d.ts +1 -3
  124. package/dist/index.d.ts.map +1 -1
  125. package/dist/index.js +1 -3
  126. package/dist/index.js.map +1 -1
  127. package/package.json +4 -4
  128. package/src/adapter/converters/device-parameters.ts +19 -9
  129. package/src/adapter/converters/shader-formats.ts +50 -24
  130. package/src/adapter/converters/webgl-shadertypes.ts +152 -0
  131. package/src/adapter/converters/webgl-texture-table.ts +9 -9
  132. package/src/adapter/converters/{vertex-formats.ts → webgl-vertex-formats.ts} +3 -3
  133. package/src/adapter/device-helpers/webgl-device-features.ts +1 -1
  134. package/src/adapter/device-helpers/webgl-device-limits.ts +1 -1
  135. package/src/adapter/helpers/format-utils.ts +2 -2
  136. package/src/adapter/helpers/{get-shader-layout.ts → get-shader-layout-from-glsl.ts} +20 -50
  137. package/src/adapter/helpers/set-uniform.ts +2 -2
  138. package/src/adapter/helpers/webgl-texture-utils.ts +12 -127
  139. package/src/adapter/resources/webgl-buffer.ts +5 -3
  140. package/src/adapter/resources/webgl-command-buffer.ts +5 -5
  141. package/src/adapter/resources/webgl-command-encoder.ts +17 -8
  142. package/src/adapter/resources/webgl-framebuffer.ts +2 -2
  143. package/src/adapter/resources/webgl-query-set.ts +5 -1
  144. package/src/adapter/resources/webgl-render-pass.ts +15 -9
  145. package/src/adapter/resources/webgl-render-pipeline.ts +32 -35
  146. package/src/adapter/resources/webgl-sampler.ts +1 -1
  147. package/src/adapter/resources/webgl-shader.ts +11 -2
  148. package/src/adapter/resources/webgl-texture-view.ts +1 -1
  149. package/src/adapter/resources/webgl-texture.ts +180 -393
  150. package/src/adapter/resources/webgl-transform-feedback.ts +2 -2
  151. package/src/adapter/resources/webgl-vertex-array.ts +4 -3
  152. package/src/adapter/webgl-adapter.ts +20 -8
  153. package/src/adapter/webgl-canvas-context.ts +7 -47
  154. package/src/adapter/webgl-device.ts +46 -41
  155. package/src/context/debug/spector-types.ts +5 -0
  156. package/src/context/debug/spector.ts +1 -1
  157. package/src/context/debug/webgl-developer-tools.ts +8 -3
  158. package/src/context/helpers/webgl-extensions.ts +3 -0
  159. package/src/context/parameters/unified-parameter-api.ts +9 -2
  160. package/src/context/parameters/webgl-parameter-tables.ts +2 -0
  161. package/src/context/polyfills/polyfill-webgl1-extensions.ts +1 -0
  162. package/src/context/state-tracker/deep-array-equal.ts +11 -6
  163. package/src/context/state-tracker/webgl-state-tracker.ts +5 -1
  164. package/src/context/state-tracker/with-parameters.ts +1 -1
  165. package/src/index.ts +1 -5
  166. package/dist/adapter/converters/vertex-formats.d.ts.map +0 -1
  167. package/dist/adapter/converters/vertex-formats.js.map +0 -1
  168. package/dist/adapter/helpers/decode-webgl-types.d.ts +0 -26
  169. package/dist/adapter/helpers/decode-webgl-types.d.ts.map +0 -1
  170. package/dist/adapter/helpers/decode-webgl-types.js +0 -102
  171. package/dist/adapter/helpers/decode-webgl-types.js.map +0 -1
  172. package/dist/adapter/helpers/get-shader-layout.d.ts.map +0 -1
  173. package/dist/adapter/helpers/get-shader-layout.js.map +0 -1
  174. package/dist/adapter/helpers/typed-array-utils.d.ts +0 -44
  175. package/dist/adapter/helpers/typed-array-utils.d.ts.map +0 -1
  176. package/dist/adapter/helpers/typed-array-utils.js +0 -107
  177. package/dist/adapter/helpers/typed-array-utils.js.map +0 -1
  178. package/dist/deprecated/accessor.d.ts +0 -53
  179. package/dist/deprecated/accessor.d.ts.map +0 -1
  180. package/dist/deprecated/accessor.js +0 -177
  181. package/dist/deprecated/accessor.js.map +0 -1
  182. package/dist/utils/split-uniforms-and-bindings.d.ts +0 -9
  183. package/dist/utils/split-uniforms-and-bindings.d.ts.map +0 -1
  184. package/dist/utils/split-uniforms-and-bindings.js +0 -21
  185. package/dist/utils/split-uniforms-and-bindings.js.map +0 -1
  186. package/src/adapter/helpers/decode-webgl-types.ts +0 -134
  187. package/src/adapter/helpers/typed-array-utils.ts +0 -129
  188. package/src/deprecated/accessor.ts +0 -225
  189. package/src/utils/split-uniforms-and-bindings.ts +0 -31
@@ -2,13 +2,10 @@
2
2
  // SPDX-License-Identifier: MIT
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
- //
6
- // WebGL... the texture API from hell... hopefully made simpler
7
- //
5
+ // @ts-nocheck This file will be deleted in upcoming refactor
8
6
 
9
- import {TypedArray} from '@math.gl/types';
10
- import type {ExternalImage} from '@luma.gl/core';
11
- import {Buffer, Texture, Framebuffer, FramebufferProps} from '@luma.gl/core';
7
+ import type {Buffer, Texture, FramebufferProps} from '@luma.gl/core';
8
+ import {Framebuffer, getTypedArrayFromDataType, getDataTypeFromTypedArray} from '@luma.gl/core';
12
9
  import {
13
10
  GL,
14
11
  GLTextureTarget,
@@ -18,12 +15,12 @@ import {
18
15
  GLDataType
19
16
  } from '@luma.gl/constants';
20
17
 
18
+ import {convertDataTypeToGLDataType} from '../converters/webgl-shadertypes';
21
19
  import {WEBGLFramebuffer} from '../resources/webgl-framebuffer';
22
- import {getGLTypeFromTypedArray, getTypedArrayFromGLType} from './typed-array-utils';
23
20
  import {glFormatToComponents, glTypeToBytes} from './format-utils';
24
21
  import {WEBGLBuffer} from '../resources/webgl-buffer';
25
22
  import {WEBGLTexture} from '../resources/webgl-texture';
26
- import {withGLParameters} from '../../context/state-tracker/with-parameters';
23
+ import {convertGLDataTypeToDataType} from '../converters/shader-formats';
27
24
 
28
25
  /** A "border" parameter is required in many WebGL texture APIs, but must always be 0... */
29
26
  const BORDER = 0;
@@ -83,120 +80,6 @@ export type WebGLCopyTextureOptions = {
83
80
  byteLength?: number;
84
81
  };
85
82
 
86
- /**
87
- * Initializes a texture memory space
88
- * Clear all the textures and mip levels of a two-dimensional or array texture at the same time.
89
- * On some implementations faster than repeatedly setting levels
90
- *
91
- * @note From WebGL 2 spec section 3.7.6:
92
- * @see https://registry.khronos.org/webgl/specs/latest/2.0/
93
- * - The image contents are set as if a buffer of sufficient size initialized to 0 would be passed to each level's texImage2D/3D
94
- * - texStorage2D should be considered a preferred alternative to texImage2D. It may have lower memory costs than texImage2D in some implementations.
95
- * - Once texStorage*D has been called, the texture is immutable and can only be updated with texSubImage*(), not texImage()
96
- */
97
- export function initializeTextureStorage(
98
- gl: WebGL2RenderingContext,
99
- levels: number,
100
- options: WebGLSetTextureOptions
101
- ): void {
102
- const {dimension, width, height, depth = 0} = options;
103
- const {glInternalFormat} = options;
104
- const glTarget = options.glTarget; // getWebGLCubeFaceTarget(options.glTarget, dimension, depth);
105
- switch (dimension) {
106
- case '2d-array':
107
- case '3d':
108
- gl.texStorage3D(glTarget, levels, glInternalFormat, width, height, depth);
109
- break;
110
-
111
- default:
112
- gl.texStorage2D(glTarget, levels, glInternalFormat, width, height);
113
- }
114
- }
115
-
116
- /**
117
- * Copy a region of compressed data from a GPU memory buffer into this texture.
118
- */
119
- export function copyExternalImageToMipLevel(
120
- gl: WebGL2RenderingContext,
121
- handle: WebGLTexture,
122
- image: ExternalImage,
123
- options: WebGLCopyTextureOptions & {flipY?: boolean}
124
- ): void {
125
- const {width, height} = options;
126
- const {dimension, depth = 0, mipLevel = 0} = options;
127
- const {x = 0, y = 0, z = 0} = options;
128
- const {glFormat, glType} = options;
129
-
130
- const glTarget = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);
131
-
132
- const glParameters = options.flipY ? {[GL.UNPACK_FLIP_Y_WEBGL]: true} : {};
133
- withGLParameters(gl, glParameters, () => {
134
- switch (dimension) {
135
- case '2d-array':
136
- case '3d':
137
- gl.bindTexture(glTarget, handle);
138
- // prettier-ignore
139
- gl.texSubImage3D(glTarget, mipLevel, x, y, z, width, height, depth, glFormat, glType, image);
140
- gl.bindTexture(glTarget, null);
141
- break;
142
-
143
- case '2d':
144
- case 'cube':
145
- gl.bindTexture(glTarget, handle);
146
- // prettier-ignore
147
- gl.texSubImage2D(glTarget, mipLevel, x, y, width, height, glFormat, glType, image);
148
- gl.bindTexture(glTarget, null);
149
- break;
150
-
151
- default:
152
- throw new Error(dimension);
153
- }
154
- });
155
- }
156
-
157
- /**
158
- * Copy a region of data from a CPU memory buffer into this texture.
159
- */
160
- export function copyCPUDataToMipLevel(
161
- gl: WebGL2RenderingContext,
162
- typedArray: TypedArray,
163
- options: WebGLCopyTextureOptions
164
- ): void {
165
- const {dimension, width, height, depth = 0, mipLevel = 0, byteOffset = 0} = options;
166
- const {x = 0, y = 0, z = 0} = options;
167
- const {glFormat, glType, compressed} = options;
168
- const glTarget = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);
169
-
170
- // gl.bindTexture(glTarget, null);
171
-
172
- switch (dimension) {
173
- case '2d-array':
174
- case '3d':
175
- if (compressed) {
176
- // prettier-ignore
177
- gl.compressedTexSubImage3D(glTarget, mipLevel, x, y, z, width, height, depth, glFormat, typedArray, byteOffset); // , byteLength
178
- } else {
179
- // prettier-ignore
180
- gl.texSubImage3D(glTarget, mipLevel, x, y, z, width, height, depth, glFormat, glType, typedArray, byteOffset); // , byteLength
181
- }
182
- break;
183
-
184
- case '2d':
185
- case 'cube':
186
- if (compressed) {
187
- // prettier-ignore
188
- gl.compressedTexSubImage2D(glTarget, mipLevel, x, y, width, height, glFormat, typedArray, byteOffset); // , byteLength
189
- } else {
190
- // prettier-ignore
191
- gl.texSubImage2D(glTarget, mipLevel, x, y, width, height, glFormat, glType, typedArray, byteOffset); // , byteLength
192
- }
193
- break;
194
-
195
- default:
196
- throw new Error(dimension);
197
- }
198
- }
199
-
200
83
  /**
201
84
  * Copy a region of compressed data from a GPU memory buffer into this texture.
202
85
  */
@@ -570,7 +453,8 @@ export function readPixelsToArray(
570
453
  target = getPixelArray(target, sourceType, sourceFormat, sourceWidth, sourceHeight, sourceDepth);
571
454
 
572
455
  // Pixel array available, if necessary, deduce type from it.
573
- sourceType = sourceType || getGLTypeFromTypedArray(target);
456
+ const signedType = getDataTypeFromTypedArray(target);
457
+ sourceType = sourceType || convertDataTypeToGLDataType(signedType);
574
458
 
575
459
  // Note: luma.gl overrides bindFramebuffer so that we can reliably restore the previous framebuffer (this is the only function for which we do that)
576
460
  const prevHandle = gl.bindFramebuffer(
@@ -717,7 +601,7 @@ export function copyToTexture(
717
601
  texture = destinationTexture;
718
602
  width = Number.isFinite(width) ? width : texture.width;
719
603
  height = Number.isFinite(height) ? height : texture.height;
720
- texture?.bind(0);
604
+ texture?._bind(0);
721
605
  // @ts-ignore
722
606
  textureTarget = texture.target;
723
607
  } else {
@@ -769,7 +653,7 @@ export function copyToTexture(
769
653
  }
770
654
  }
771
655
  if (texture) {
772
- texture.unbind();
656
+ texture._unbind();
773
657
  }
774
658
  // @ts-expect-error
775
659
  device.gl.bindFramebuffer(GL.FRAMEBUFFER, prevHandle || null);
@@ -817,10 +701,11 @@ function getPixelArray(
817
701
  if (pixelArray) {
818
702
  return pixelArray;
819
703
  }
820
- // const formatInfo = decodeTextureFormat(format);
704
+ // const formatInfo = getTextureFormatInfo(format);
821
705
  // Allocate pixel array if not already available, using supplied type
822
706
  glType ||= GL.UNSIGNED_BYTE;
823
- const ArrayType = getTypedArrayFromGLType(glType, {clamped: false});
707
+ const shaderType = convertGLDataTypeToDataType(glType);
708
+ const ArrayType = getTypedArrayFromDataType(shaderType);
824
709
  const components = glFormatToComponents(glFormat);
825
710
  // TODO - check for composite type (components = 1).
826
711
  return new ArrayType(width * height * components) as Uint8Array | Uint16Array | Float32Array;
@@ -21,9 +21,9 @@ export class WEBGLBuffer extends Buffer {
21
21
  readonly glIndexType: GL.UNSIGNED_SHORT | GL.UNSIGNED_INT = GL.UNSIGNED_SHORT;
22
22
 
23
23
  /** Number of bytes allocated on the GPU for this buffer */
24
- byteLength: number;
24
+ byteLength: number = 0;
25
25
  /** Number of bytes used */
26
- bytesUsed: number;
26
+ bytesUsed: number = 0;
27
27
 
28
28
  constructor(device: WebGLDevice, props: BufferProps = {}) {
29
29
  super(device, props);
@@ -33,7 +33,9 @@ export class WEBGLBuffer extends Buffer {
33
33
 
34
34
  const handle = typeof props === 'object' ? props.handle : undefined;
35
35
  this.handle = handle || this.gl.createBuffer();
36
- device.setSpectorMetadata(this.handle, {...this.props, data: typeof this.props.data});
36
+ device._setWebGLDebugMetadata(this.handle, this, {
37
+ spector: {...this.props, data: typeof this.props.data}
38
+ });
37
39
 
38
40
  // - In WebGL1, need to make sure we use GL.ELEMENT_ARRAY_BUFFER when initializing element buffers
39
41
  // otherwise buffer type will lock to generic (non-element) buffer
@@ -73,7 +73,7 @@ export class WEBGLCommandBuffer extends CommandBuffer {
73
73
  this.device = device;
74
74
  }
75
75
 
76
- submitCommands(commands: Command[] = this.commands) {
76
+ _executeCommands(commands: Command[] = this.commands) {
77
77
  for (const command of commands) {
78
78
  switch (command.name) {
79
79
  case 'copy-buffer-to-buffer':
@@ -285,13 +285,13 @@ function _copyTextureToTexture(device: WebGLDevice, options: CopyTextureToTextur
285
285
  // TODO - support gl.readBuffer (WebGL2 only)
286
286
  // const prevBuffer = gl.readBuffer(attachment);
287
287
 
288
- let texture: WEBGLTexture = null;
288
+ let texture: WEBGLTexture;
289
289
  let textureTarget: GL;
290
290
  if (destinationTexture instanceof WEBGLTexture) {
291
291
  texture = destinationTexture;
292
292
  width = Number.isFinite(width) ? width : texture.width;
293
293
  height = Number.isFinite(height) ? height : texture.height;
294
- texture.bind(0);
294
+ texture._bind(0);
295
295
  textureTarget = texture.glTarget;
296
296
  } else {
297
297
  throw new Error('invalid destination');
@@ -329,7 +329,7 @@ function _copyTextureToTexture(device: WebGLDevice, options: CopyTextureToTextur
329
329
  }
330
330
 
331
331
  if (texture) {
332
- texture.unbind();
332
+ texture._unbind();
333
333
  }
334
334
  device.gl.bindFramebuffer(GL.FRAMEBUFFER, prevHandle);
335
335
  if (destroyFramebuffer) {
@@ -413,7 +413,7 @@ function getFramebuffer(source: Texture | Framebuffer): {
413
413
  * Returns number of components in a specific readPixels WebGL format
414
414
  * @todo use shadertypes utils instead?
415
415
  */
416
- export function glFormatToComponents(format): 1 | 2 | 3 | 4 {
416
+ export function glFormatToComponents(format: GL): 1 | 2 | 3 | 4 {
417
417
  switch (format) {
418
418
  case GL.ALPHA:
419
419
  case GL.R32F:
@@ -4,21 +4,26 @@
4
4
 
5
5
  import {CommandEncoder, CommandEncoderProps} from '@luma.gl/core';
6
6
  import type {
7
+ RenderPassProps,
8
+ ComputePass,
9
+ ComputePassProps,
10
+ QuerySet,
11
+ Buffer,
7
12
  CopyBufferToBufferOptions,
8
13
  CopyBufferToTextureOptions,
9
14
  CopyTextureToBufferOptions,
10
- CopyTextureToTextureOptions,
15
+ CopyTextureToTextureOptions
11
16
  // ClearTextureOptions,
12
17
  // ReadTextureOptions,
13
- QuerySet,
14
- Buffer
15
18
  } from '@luma.gl/core';
16
19
 
17
20
  import {WEBGLCommandBuffer} from './webgl-command-buffer';
21
+ import {WEBGLRenderPass} from './webgl-render-pass';
18
22
  import {WebGLDevice} from '../webgl-device';
19
23
 
20
24
  export class WEBGLCommandEncoder extends CommandEncoder {
21
25
  readonly device: WebGLDevice;
26
+ readonly handle = null;
22
27
 
23
28
  readonly commandBuffer: WEBGLCommandBuffer;
24
29
 
@@ -30,13 +35,17 @@ export class WEBGLCommandEncoder extends CommandEncoder {
30
35
 
31
36
  override destroy(): void {}
32
37
 
33
- override finish(): void {
34
- this.commandBuffer.submitCommands();
38
+ override finish(): WEBGLCommandBuffer {
39
+ return this.commandBuffer;
35
40
  }
36
41
 
37
- // beginRenderPass(GPURenderPassDescriptor descriptor): GPURenderPassEncoder;
38
- // beginComputePass(optional GPUComputePassDescriptor descriptor = {}): GPUComputePassEncoder;
39
- // finish(options?: {id?: string}): GPUCommandBuffer;
42
+ beginRenderPass(props: RenderPassProps): WEBGLRenderPass {
43
+ return new WEBGLRenderPass(this.device, props);
44
+ }
45
+
46
+ beginComputePass(props: ComputePassProps): ComputePass {
47
+ throw new Error('ComputePass not supported in WebGL');
48
+ }
40
49
 
41
50
  copyBufferToBuffer(options: CopyBufferToBufferOptions): void {
42
51
  this.commandBuffer.commands.push({name: 'copy-buffer-to-buffer', options});
@@ -33,8 +33,8 @@ export class WEBGLFramebuffer extends Framebuffer {
33
33
  this.props.handle || isDefaultFramebuffer ? this.props.handle : this.gl.createFramebuffer();
34
34
 
35
35
  if (!isDefaultFramebuffer) {
36
- // default framebuffer handle is null, so we can't set spector metadata...
37
- device.setSpectorMetadata(this.handle, {id: this.props.id, props: this.props});
36
+ // default framebuffer handle is null, so we can't set debug metadata...
37
+ device._setWebGLDebugMetadata(this.handle, this, {spector: this.props});
38
38
 
39
39
  // Auto create textures for attachments if needed
40
40
  this.autoCreateAttachmentTextures();
@@ -27,7 +27,11 @@ export class WEBGLQuerySet extends QuerySet {
27
27
  throw new Error('WebGL QuerySet can only have one value');
28
28
  }
29
29
 
30
- this.handle = this.device.gl.createQuery();
30
+ const handle = this.device.gl.createQuery();
31
+ if (!handle) {
32
+ throw new Error('WebGL query not supported');
33
+ }
34
+ this.handle = handle;
31
35
  Object.seal(this);
32
36
  }
33
37
 
@@ -9,21 +9,22 @@ import {GL, GLParameters} from '@luma.gl/constants';
9
9
  import {withGLParameters} from '../../context/state-tracker/with-parameters';
10
10
  import {setGLParameters} from '../../context/parameters/unified-parameter-api';
11
11
  import {WEBGLQuerySet} from './webgl-query-set';
12
+ import {WEBGLFramebuffer} from './webgl-framebuffer';
12
13
 
13
- const COLOR_CHANNELS = [0x1, 0x2, 0x4, 0x8]; // GPUColorWrite RED, GREEN, BLUE, ALPHA
14
+ const COLOR_CHANNELS: NumberArray4 = [0x1, 0x2, 0x4, 0x8]; // GPUColorWrite RED, GREEN, BLUE, ALPHA
14
15
 
15
16
  export class WEBGLRenderPass extends RenderPass {
16
17
  readonly device: WebGLDevice;
17
18
 
18
19
  /** Parameters that should be applied before each draw call */
19
- glParameters: GLParameters;
20
+ glParameters: GLParameters = {};
20
21
 
21
22
  constructor(device: WebGLDevice, props: RenderPassProps) {
22
23
  super(device, props);
23
24
  this.device = device;
24
25
 
25
26
  // If no viewport is provided, apply reasonably defaults
26
- let viewport;
27
+ let viewport: NumberArray4 | undefined;
27
28
  if (!props?.parameters?.viewport) {
28
29
  if (props?.framebuffer) {
29
30
  // Set the viewport to the size of the framebuffer
@@ -31,7 +32,7 @@ export class WEBGLRenderPass extends RenderPass {
31
32
  viewport = [0, 0, width, height];
32
33
  } else {
33
34
  // Instead of using our own book-keeping, we can just read the values from the WebGL context
34
- const [width, height] = device.getCanvasContext().getDrawingBufferSize();
35
+ const [width, height] = device.getDefaultCanvasContext().getDrawingBufferSize();
35
36
  viewport = [0, 0, width, height];
36
37
  }
37
38
  }
@@ -41,7 +42,9 @@ export class WEBGLRenderPass extends RenderPass {
41
42
  this.setParameters({viewport, ...this.props.parameters});
42
43
 
43
44
  // Specify mapping of draw buffer locations to color attachments
44
- if (this.props.framebuffer) {
45
+ const webglFramebuffer = this.props.framebuffer as WEBGLFramebuffer;
46
+ // Default framebuffers can only be set to GL.BACK or GL.NONE
47
+ if (this.props.framebuffer && webglFramebuffer?.handle) {
45
48
  const drawBuffers = this.props.framebuffer.colorAttachments.map(
46
49
  (_, i) => GL.COLOR_ATTACHMENT0 + i
47
50
  );
@@ -90,7 +93,10 @@ export class WEBGLRenderPass extends RenderPass {
90
93
  // WebGPU viewports are 6 coordinates (X, Y, Z)
91
94
  if (parameters.viewport.length >= 6) {
92
95
  glParameters.viewport = parameters.viewport.slice(0, 4) as NumberArray4;
93
- glParameters.depthRange = [parameters.viewport[4], parameters.viewport[5]];
96
+ glParameters.depthRange = [
97
+ parameters.viewport[4] as number,
98
+ parameters.viewport[5] as number
99
+ ];
94
100
  } else {
95
101
  // WebGL viewports are 4 coordinates (X, Y)
96
102
  glParameters.viewport = parameters.viewport as NumberArray4;
@@ -108,12 +114,12 @@ export class WEBGLRenderPass extends RenderPass {
108
114
  console.warn('RenderPassParameters.stencilReference not yet implemented in WebGL');
109
115
  // parameters.stencilFunc = [func, ref, mask];
110
116
  // Does this work?
111
- parameters[GL.STENCIL_REF] = parameters.stencilReference;
117
+ glParameters[GL.STENCIL_REF] = parameters.stencilReference;
112
118
  }
113
119
 
114
- if (parameters.colorMask) {
120
+ if ('colorMask' in parameters) {
115
121
  glParameters.colorMask = COLOR_CHANNELS.map(channel =>
116
- Boolean(channel & parameters.colorMask)
122
+ Boolean(channel & (parameters.colorMask as number))
117
123
  );
118
124
  }
119
125
 
@@ -16,10 +16,9 @@ import {RenderPipeline, log} from '@luma.gl/core';
16
16
  // import {getAttributeInfosFromLayouts} from '@luma.gl/core';
17
17
  import {GL} from '@luma.gl/constants';
18
18
 
19
- import {getShaderLayoutFromGLSL} from '../helpers/get-shader-layout';
19
+ import {getShaderLayoutFromGLSL} from '../helpers/get-shader-layout-from-glsl';
20
20
  import {withDeviceAndGLParameters} from '../converters/device-parameters';
21
21
  import {setUniform} from '../helpers/set-uniform';
22
- import {splitUniformsAndBindings} from '../../utils/split-uniforms-and-bindings';
23
22
  // import {copyUniform, checkUniformValues} from '../../classes/uniforms';
24
23
 
25
24
  import {WebGLDevice} from '../webgl-device';
@@ -57,11 +56,15 @@ export class WEBGLRenderPipeline extends RenderPipeline {
57
56
  _uniformCount: number = 0;
58
57
  _uniformSetters: Record<string, Function> = {}; // TODO are these used?
59
58
 
59
+ override get [Symbol.toStringTag]() {
60
+ return 'WEBGLRenderPipeline';
61
+ }
62
+
60
63
  constructor(device: WebGLDevice, props: RenderPipelineProps) {
61
64
  super(device, props);
62
65
  this.device = device;
63
66
  this.handle = this.props.handle || this.device.gl.createProgram();
64
- this.device.setSpectorMetadata(this.handle, {id: this.props.id});
67
+ this.device._setWebGLDebugMetadata(this.handle, this, {spector: {id: this.props.id}});
65
68
 
66
69
  // Create shaders if needed
67
70
  this.vs = props.vs as WEBGLShader;
@@ -78,20 +81,26 @@ export class WEBGLRenderPipeline extends RenderPipeline {
78
81
  }
79
82
 
80
83
  this._linkShaders();
81
-
82
- log.time(1, `RenderPipeline ${this.id} - shaderLayout introspection`)();
84
+ log.time(3, `RenderPipeline ${this.id} - shaderLayout introspection`)();
83
85
  this.introspectedLayout = getShaderLayoutFromGLSL(this.device.gl, this.handle);
84
- log.timeEnd(1, `RenderPipeline ${this.id} - shaderLayout introspection`)();
86
+ log.timeEnd(3, `RenderPipeline ${this.id} - shaderLayout introspection`)();
85
87
 
86
88
  // Merge provided layout with introspected layout
87
- this.shaderLayout = mergeShaderLayout(this.introspectedLayout, props.shaderLayout);
89
+ this.shaderLayout = props.shaderLayout
90
+ ? mergeShaderLayout(this.introspectedLayout, props.shaderLayout)
91
+ : this.introspectedLayout;
88
92
  }
89
93
 
90
94
  override destroy(): void {
91
95
  if (this.handle) {
96
+ // log.error(`Deleting program ${this.id}`)();
97
+ this.device.gl.useProgram(null);
92
98
  this.device.gl.deleteProgram(this.handle);
93
- // this.handle = null;
94
99
  this.destroyed = true;
100
+ // @ts-expect-error
101
+ this.handle.destroyed = true;
102
+ // @ts-ignore
103
+ this.handle = null;
95
104
  }
96
105
  }
97
106
 
@@ -143,7 +152,7 @@ export class WEBGLRenderPipeline extends RenderPipeline {
143
152
  value instanceof WEBGLFramebuffer
144
153
  )
145
154
  ) {
146
- throw new Error('texture value');
155
+ throw new Error(`${this} Bad texture binding for ${name}`);
147
156
  }
148
157
  break;
149
158
  case 'sampler':
@@ -269,21 +278,6 @@ export class WEBGLRenderPipeline extends RenderPipeline {
269
278
  return true;
270
279
  }
271
280
 
272
- // DEPRECATED METHODS
273
-
274
- override setUniformsWebGL(uniforms: Record<string, UniformValue>) {
275
- const {bindings} = splitUniformsAndBindings(uniforms);
276
- Object.keys(bindings).forEach(name => {
277
- log.warn(
278
- `Unsupported value "${JSON.stringify(
279
- bindings[name]
280
- )}" used in setUniforms() for key ${name}. Use setBindings() instead?`
281
- )();
282
- });
283
- // TODO - check against layout
284
- Object.assign(this.uniforms, uniforms);
285
- }
286
-
287
281
  // PRIVATE METHODS
288
282
 
289
283
  // setAttributes(attributes: Record<string, Buffer>): void {}
@@ -317,19 +311,21 @@ export class WEBGLRenderPipeline extends RenderPipeline {
317
311
  }
318
312
 
319
313
  /** Report link status. First, check for shader compilation failures if linking fails */
320
- async _reportLinkStatus(status: 'success' | 'linking' | 'validation'): Promise<void> {
314
+ async _reportLinkStatus(status: 'success' | 'link-error' | 'validation-error'): Promise<void> {
321
315
  switch (status) {
322
316
  case 'success':
323
317
  return;
324
318
 
325
319
  default:
320
+ const errorType = status === 'link-error' ? 'Link error' : 'Validation error';
326
321
  // First check for shader compilation failures if linking fails
327
322
  switch (this.vs.compilationStatus) {
328
323
  case 'error':
329
324
  this.vs.debugShader();
330
- throw new Error(`Error during compilation of shader ${this.vs.id}`);
325
+ throw new Error(`${this} ${errorType} during compilation of ${this.vs}`);
331
326
  case 'pending':
332
- this.vs.asyncCompilationStatus.then(() => this.vs.debugShader());
327
+ await this.vs.asyncCompilationStatus;
328
+ this.vs.debugShader();
333
329
  break;
334
330
  case 'success':
335
331
  break;
@@ -338,16 +334,17 @@ export class WEBGLRenderPipeline extends RenderPipeline {
338
334
  switch (this.fs?.compilationStatus) {
339
335
  case 'error':
340
336
  this.fs.debugShader();
341
- throw new Error(`Error during compilation of shader ${this.fs.id}`);
337
+ throw new Error(`${this} ${errorType} during compilation of ${this.fs}`);
342
338
  case 'pending':
343
- this.fs.asyncCompilationStatus.then(() => this.fs.debugShader());
339
+ await this.fs.asyncCompilationStatus;
340
+ this.fs.debugShader();
344
341
  break;
345
342
  case 'success':
346
343
  break;
347
344
  }
348
345
 
349
346
  const linkErrorLog = this.device.gl.getProgramInfoLog(this.handle);
350
- throw new Error(`Error during ${status}: ${linkErrorLog}`);
347
+ this.device.reportError(new Error(`${errorType} during ${status}: ${linkErrorLog}`));
351
348
  }
352
349
  }
353
350
 
@@ -356,19 +353,19 @@ export class WEBGLRenderPipeline extends RenderPipeline {
356
353
  * TODO - Load log even when no error reported, to catch warnings?
357
354
  * https://gamedev.stackexchange.com/questions/30429/how-to-detect-glsl-warnings
358
355
  */
359
- _getLinkStatus(): 'success' | 'linking' | 'validation' {
356
+ _getLinkStatus(): 'success' | 'link-error' | 'validation-error' {
360
357
  const {gl} = this.device;
361
- const linked = gl.getProgramParameter(this.handle, gl.LINK_STATUS);
358
+ const linked = gl.getProgramParameter(this.handle, GL.LINK_STATUS);
362
359
  if (!linked) {
363
360
  this.linkStatus = 'error';
364
- return 'linking';
361
+ return 'link-error';
365
362
  }
366
363
 
367
364
  gl.validateProgram(this.handle);
368
- const validated = gl.getProgramParameter(this.handle, gl.VALIDATE_STATUS);
365
+ const validated = gl.getProgramParameter(this.handle, GL.VALIDATE_STATUS);
369
366
  if (!validated) {
370
367
  this.linkStatus = 'error';
371
- return 'validation';
368
+ return 'validation-error';
372
369
  }
373
370
 
374
371
  this.linkStatus = 'success';
@@ -21,7 +21,7 @@ export class WEBGLSampler extends Sampler {
21
21
  super(device, props);
22
22
  this.device = device;
23
23
  this.parameters = convertSamplerParametersToWebGL(props);
24
- this.handle = this.handle || this.device.gl.createSampler();
24
+ this.handle = props.handle || this.device.gl.createSampler();
25
25
  this._setSamplerParameters(this.parameters);
26
26
  }
27
27
 
@@ -27,6 +27,10 @@ export class WEBGLShader extends Shader {
27
27
  default:
28
28
  throw new Error(this.props.stage);
29
29
  }
30
+
31
+ // default framebuffer handle is null, so we can't set spector metadata...
32
+ device._setWebGLDebugMetadata(this.handle, this, {spector: this.props});
33
+
30
34
  this._compile(this.source);
31
35
  }
32
36
 
@@ -34,13 +38,18 @@ export class WEBGLShader extends Shader {
34
38
  if (this.handle) {
35
39
  this.removeStats();
36
40
  this.device.gl.deleteShader(this.handle);
37
- // this.handle = null;
38
41
  this.destroyed = true;
42
+ // @ts-expect-error
43
+ this.handle.destroyed = true;
44
+ // this.handle = null;
39
45
  }
40
46
  }
41
47
 
42
48
  get asyncCompilationStatus(): Promise<'pending' | 'success' | 'error'> {
43
- return this._waitForCompilationComplete().then(() => this.compilationStatus);
49
+ return this._waitForCompilationComplete().then(() => {
50
+ this._getCompilationStatus();
51
+ return this.compilationStatus;
52
+ });
44
53
  }
45
54
 
46
55
  override async getCompilationInfo(): Promise<readonly CompilerMessage[]> {
@@ -3,7 +3,7 @@
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
5
  import type {Device, TextureViewProps} from '@luma.gl/core';
6
- // import {decodeTextureFormat} from '@luma.gl/core';
6
+ // import {getTextureFormatInfo} from '@luma.gl/core';
7
7
  import {TextureView, Texture} from '@luma.gl/core';
8
8
 
9
9
  import {WebGLDevice} from '../webgl-device';