@luma.gl/webgl 9.1.0-beta.8 → 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 (186) 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 +5 -5
  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 +2 -2
  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-query-set.d.ts.map +1 -1
  51. package/dist/adapter/resources/webgl-query-set.js +5 -1
  52. package/dist/adapter/resources/webgl-query-set.js.map +1 -1
  53. package/dist/adapter/resources/webgl-render-pass.d.ts.map +1 -1
  54. package/dist/adapter/resources/webgl-render-pass.js +8 -5
  55. package/dist/adapter/resources/webgl-render-pass.js.map +1 -1
  56. package/dist/adapter/resources/webgl-render-pipeline.d.ts +2 -3
  57. package/dist/adapter/resources/webgl-render-pipeline.d.ts.map +1 -1
  58. package/dist/adapter/resources/webgl-render-pipeline.js +16 -20
  59. package/dist/adapter/resources/webgl-render-pipeline.js.map +1 -1
  60. package/dist/adapter/resources/webgl-sampler.js +1 -1
  61. package/dist/adapter/resources/webgl-sampler.js.map +1 -1
  62. package/dist/adapter/resources/webgl-shader.d.ts.map +1 -1
  63. package/dist/adapter/resources/webgl-shader.js +4 -1
  64. package/dist/adapter/resources/webgl-shader.js.map +1 -1
  65. package/dist/adapter/resources/webgl-texture-view.js +1 -1
  66. package/dist/adapter/resources/webgl-texture-view.js.map +1 -1
  67. package/dist/adapter/resources/webgl-texture.d.ts +21 -66
  68. package/dist/adapter/resources/webgl-texture.d.ts.map +1 -1
  69. package/dist/adapter/resources/webgl-texture.js +148 -324
  70. package/dist/adapter/resources/webgl-texture.js.map +1 -1
  71. package/dist/adapter/resources/webgl-transform-feedback.d.ts +1 -1
  72. package/dist/adapter/resources/webgl-transform-feedback.d.ts.map +1 -1
  73. package/dist/adapter/resources/webgl-transform-feedback.js +1 -1
  74. package/dist/adapter/resources/webgl-transform-feedback.js.map +1 -1
  75. package/dist/adapter/resources/webgl-vertex-array.d.ts +1 -1
  76. package/dist/adapter/resources/webgl-vertex-array.d.ts.map +1 -1
  77. package/dist/adapter/resources/webgl-vertex-array.js +3 -2
  78. package/dist/adapter/resources/webgl-vertex-array.js.map +1 -1
  79. package/dist/adapter/webgl-adapter.d.ts +4 -3
  80. package/dist/adapter/webgl-adapter.d.ts.map +1 -1
  81. package/dist/adapter/webgl-adapter.js +16 -7
  82. package/dist/adapter/webgl-adapter.js.map +1 -1
  83. package/dist/adapter/webgl-canvas-context.d.ts +1 -19
  84. package/dist/adapter/webgl-canvas-context.d.ts.map +1 -1
  85. package/dist/adapter/webgl-canvas-context.js +3 -31
  86. package/dist/adapter/webgl-canvas-context.js.map +1 -1
  87. package/dist/adapter/webgl-device.d.ts +8 -15
  88. package/dist/adapter/webgl-device.d.ts.map +1 -1
  89. package/dist/adapter/webgl-device.js +15 -16
  90. package/dist/adapter/webgl-device.js.map +1 -1
  91. package/dist/context/debug/spector-types.d.ts.map +1 -1
  92. package/dist/context/debug/spector-types.js +3 -0
  93. package/dist/context/debug/spector-types.js.map +1 -1
  94. package/dist/context/debug/spector.js.map +1 -1
  95. package/dist/context/debug/webgl-developer-tools.js.map +1 -1
  96. package/dist/context/helpers/webgl-extensions.d.ts.map +1 -1
  97. package/dist/context/helpers/webgl-extensions.js +3 -0
  98. package/dist/context/helpers/webgl-extensions.js.map +1 -1
  99. package/dist/context/parameters/unified-parameter-api.d.ts.map +1 -1
  100. package/dist/context/parameters/unified-parameter-api.js +7 -0
  101. package/dist/context/parameters/unified-parameter-api.js.map +1 -1
  102. package/dist/context/parameters/webgl-parameter-tables.d.ts +1 -1
  103. package/dist/context/parameters/webgl-parameter-tables.d.ts.map +1 -1
  104. package/dist/context/parameters/webgl-parameter-tables.js +1 -0
  105. package/dist/context/parameters/webgl-parameter-tables.js.map +1 -1
  106. package/dist/context/polyfills/polyfill-webgl1-extensions.d.ts.map +1 -1
  107. package/dist/context/polyfills/polyfill-webgl1-extensions.js +1 -0
  108. package/dist/context/polyfills/polyfill-webgl1-extensions.js.map +1 -1
  109. package/dist/context/state-tracker/deep-array-equal.d.ts +2 -1
  110. package/dist/context/state-tracker/deep-array-equal.d.ts.map +1 -1
  111. package/dist/context/state-tracker/deep-array-equal.js +4 -5
  112. package/dist/context/state-tracker/deep-array-equal.js.map +1 -1
  113. package/dist/context/state-tracker/webgl-state-tracker.d.ts.map +1 -1
  114. package/dist/context/state-tracker/webgl-state-tracker.js +4 -1
  115. package/dist/context/state-tracker/webgl-state-tracker.js.map +1 -1
  116. package/dist/context/state-tracker/with-parameters.js.map +1 -1
  117. package/dist/dist.dev.js +4719 -4777
  118. package/dist/dist.min.js +2 -2
  119. package/dist/index.cjs +3848 -3944
  120. package/dist/index.cjs.map +4 -4
  121. package/dist/index.d.ts +1 -3
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js +1 -3
  124. package/dist/index.js.map +1 -1
  125. package/package.json +4 -4
  126. package/src/adapter/converters/device-parameters.ts +19 -9
  127. package/src/adapter/converters/shader-formats.ts +50 -24
  128. package/src/adapter/converters/webgl-shadertypes.ts +152 -0
  129. package/src/adapter/converters/webgl-texture-table.ts +7 -7
  130. package/src/adapter/converters/{vertex-formats.ts → webgl-vertex-formats.ts} +3 -3
  131. package/src/adapter/device-helpers/webgl-device-features.ts +1 -1
  132. package/src/adapter/device-helpers/webgl-device-limits.ts +1 -1
  133. package/src/adapter/helpers/format-utils.ts +2 -2
  134. package/src/adapter/helpers/{get-shader-layout.ts → get-shader-layout-from-glsl.ts} +20 -50
  135. package/src/adapter/helpers/set-uniform.ts +2 -2
  136. package/src/adapter/helpers/webgl-texture-utils.ts +12 -127
  137. package/src/adapter/resources/webgl-buffer.ts +2 -2
  138. package/src/adapter/resources/webgl-command-buffer.ts +5 -5
  139. package/src/adapter/resources/webgl-command-encoder.ts +17 -8
  140. package/src/adapter/resources/webgl-query-set.ts +5 -1
  141. package/src/adapter/resources/webgl-render-pass.ts +11 -8
  142. package/src/adapter/resources/webgl-render-pipeline.ts +20 -30
  143. package/src/adapter/resources/webgl-sampler.ts +1 -1
  144. package/src/adapter/resources/webgl-shader.ts +4 -1
  145. package/src/adapter/resources/webgl-texture-view.ts +1 -1
  146. package/src/adapter/resources/webgl-texture.ts +180 -398
  147. package/src/adapter/resources/webgl-transform-feedback.ts +2 -2
  148. package/src/adapter/resources/webgl-vertex-array.ts +4 -3
  149. package/src/adapter/webgl-adapter.ts +20 -8
  150. package/src/adapter/webgl-canvas-context.ts +3 -32
  151. package/src/adapter/webgl-device.ts +21 -25
  152. package/src/context/debug/spector-types.ts +5 -0
  153. package/src/context/debug/spector.ts +1 -1
  154. package/src/context/debug/webgl-developer-tools.ts +8 -3
  155. package/src/context/helpers/webgl-extensions.ts +3 -0
  156. package/src/context/parameters/unified-parameter-api.ts +9 -2
  157. package/src/context/parameters/webgl-parameter-tables.ts +2 -0
  158. package/src/context/polyfills/polyfill-webgl1-extensions.ts +1 -0
  159. package/src/context/state-tracker/deep-array-equal.ts +11 -6
  160. package/src/context/state-tracker/webgl-state-tracker.ts +5 -1
  161. package/src/context/state-tracker/with-parameters.ts +1 -1
  162. package/src/index.ts +1 -5
  163. package/dist/adapter/converters/vertex-formats.d.ts.map +0 -1
  164. package/dist/adapter/converters/vertex-formats.js.map +0 -1
  165. package/dist/adapter/helpers/decode-webgl-types.d.ts +0 -26
  166. package/dist/adapter/helpers/decode-webgl-types.d.ts.map +0 -1
  167. package/dist/adapter/helpers/decode-webgl-types.js +0 -102
  168. package/dist/adapter/helpers/decode-webgl-types.js.map +0 -1
  169. package/dist/adapter/helpers/get-shader-layout.d.ts.map +0 -1
  170. package/dist/adapter/helpers/get-shader-layout.js.map +0 -1
  171. package/dist/adapter/helpers/typed-array-utils.d.ts +0 -44
  172. package/dist/adapter/helpers/typed-array-utils.d.ts.map +0 -1
  173. package/dist/adapter/helpers/typed-array-utils.js +0 -107
  174. package/dist/adapter/helpers/typed-array-utils.js.map +0 -1
  175. package/dist/deprecated/accessor.d.ts +0 -53
  176. package/dist/deprecated/accessor.d.ts.map +0 -1
  177. package/dist/deprecated/accessor.js +0 -177
  178. package/dist/deprecated/accessor.js.map +0 -1
  179. package/dist/utils/split-uniforms-and-bindings.d.ts +0 -9
  180. package/dist/utils/split-uniforms-and-bindings.d.ts.map +0 -1
  181. package/dist/utils/split-uniforms-and-bindings.js +0 -21
  182. package/dist/utils/split-uniforms-and-bindings.js.map +0 -1
  183. package/src/adapter/helpers/decode-webgl-types.ts +0 -134
  184. package/src/adapter/helpers/typed-array-utils.ts +0 -129
  185. package/src/deprecated/accessor.ts +0 -225
  186. 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);
@@ -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});
@@ -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
 
@@ -11,20 +11,20 @@ import {setGLParameters} from '../../context/parameters/unified-parameter-api';
11
11
  import {WEBGLQuerySet} from './webgl-query-set';
12
12
  import {WEBGLFramebuffer} from './webgl-framebuffer';
13
13
 
14
- 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
15
15
 
16
16
  export class WEBGLRenderPass extends RenderPass {
17
17
  readonly device: WebGLDevice;
18
18
 
19
19
  /** Parameters that should be applied before each draw call */
20
- glParameters: GLParameters;
20
+ glParameters: GLParameters = {};
21
21
 
22
22
  constructor(device: WebGLDevice, props: RenderPassProps) {
23
23
  super(device, props);
24
24
  this.device = device;
25
25
 
26
26
  // If no viewport is provided, apply reasonably defaults
27
- let viewport;
27
+ let viewport: NumberArray4 | undefined;
28
28
  if (!props?.parameters?.viewport) {
29
29
  if (props?.framebuffer) {
30
30
  // Set the viewport to the size of the framebuffer
@@ -44,7 +44,7 @@ export class WEBGLRenderPass extends RenderPass {
44
44
  // Specify mapping of draw buffer locations to color attachments
45
45
  const webglFramebuffer = this.props.framebuffer as WEBGLFramebuffer;
46
46
  // Default framebuffers can only be set to GL.BACK or GL.NONE
47
- if (webglFramebuffer?.handle) {
47
+ if (this.props.framebuffer && webglFramebuffer?.handle) {
48
48
  const drawBuffers = this.props.framebuffer.colorAttachments.map(
49
49
  (_, i) => GL.COLOR_ATTACHMENT0 + i
50
50
  );
@@ -93,7 +93,10 @@ export class WEBGLRenderPass extends RenderPass {
93
93
  // WebGPU viewports are 6 coordinates (X, Y, Z)
94
94
  if (parameters.viewport.length >= 6) {
95
95
  glParameters.viewport = parameters.viewport.slice(0, 4) as NumberArray4;
96
- glParameters.depthRange = [parameters.viewport[4], parameters.viewport[5]];
96
+ glParameters.depthRange = [
97
+ parameters.viewport[4] as number,
98
+ parameters.viewport[5] as number
99
+ ];
97
100
  } else {
98
101
  // WebGL viewports are 4 coordinates (X, Y)
99
102
  glParameters.viewport = parameters.viewport as NumberArray4;
@@ -111,12 +114,12 @@ export class WEBGLRenderPass extends RenderPass {
111
114
  console.warn('RenderPassParameters.stencilReference not yet implemented in WebGL');
112
115
  // parameters.stencilFunc = [func, ref, mask];
113
116
  // Does this work?
114
- parameters[GL.STENCIL_REF] = parameters.stencilReference;
117
+ glParameters[GL.STENCIL_REF] = parameters.stencilReference;
115
118
  }
116
119
 
117
- if (parameters.colorMask) {
120
+ if ('colorMask' in parameters) {
118
121
  glParameters.colorMask = COLOR_CHANNELS.map(channel =>
119
- Boolean(channel & parameters.colorMask)
122
+ Boolean(channel & (parameters.colorMask as number))
120
123
  );
121
124
  }
122
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';
@@ -87,7 +86,9 @@ export class WEBGLRenderPipeline extends RenderPipeline {
87
86
  log.timeEnd(3, `RenderPipeline ${this.id} - shaderLayout introspection`)();
88
87
 
89
88
  // Merge provided layout with introspected layout
90
- this.shaderLayout = mergeShaderLayout(this.introspectedLayout, props.shaderLayout);
89
+ this.shaderLayout = props.shaderLayout
90
+ ? mergeShaderLayout(this.introspectedLayout, props.shaderLayout)
91
+ : this.introspectedLayout;
91
92
  }
92
93
 
93
94
  override destroy(): void {
@@ -98,6 +99,7 @@ export class WEBGLRenderPipeline extends RenderPipeline {
98
99
  this.destroyed = true;
99
100
  // @ts-expect-error
100
101
  this.handle.destroyed = true;
102
+ // @ts-ignore
101
103
  this.handle = null;
102
104
  }
103
105
  }
@@ -150,7 +152,7 @@ export class WEBGLRenderPipeline extends RenderPipeline {
150
152
  value instanceof WEBGLFramebuffer
151
153
  )
152
154
  ) {
153
- throw new Error('texture value');
155
+ throw new Error(`${this} Bad texture binding for ${name}`);
154
156
  }
155
157
  break;
156
158
  case 'sampler':
@@ -276,21 +278,6 @@ export class WEBGLRenderPipeline extends RenderPipeline {
276
278
  return true;
277
279
  }
278
280
 
279
- // DEPRECATED METHODS
280
-
281
- override setUniformsWebGL(uniforms: Record<string, UniformValue>) {
282
- const {bindings} = splitUniformsAndBindings(uniforms);
283
- Object.keys(bindings).forEach(name => {
284
- log.warn(
285
- `Unsupported value "${JSON.stringify(
286
- bindings[name]
287
- )}" used in setUniforms() for key ${name}. Use setBindings() instead?`
288
- )();
289
- });
290
- // TODO - check against layout
291
- Object.assign(this.uniforms, uniforms);
292
- }
293
-
294
281
  // PRIVATE METHODS
295
282
 
296
283
  // setAttributes(attributes: Record<string, Buffer>): void {}
@@ -324,19 +311,21 @@ export class WEBGLRenderPipeline extends RenderPipeline {
324
311
  }
325
312
 
326
313
  /** Report link status. First, check for shader compilation failures if linking fails */
327
- async _reportLinkStatus(status: 'success' | 'linking' | 'validation'): Promise<void> {
314
+ async _reportLinkStatus(status: 'success' | 'link-error' | 'validation-error'): Promise<void> {
328
315
  switch (status) {
329
316
  case 'success':
330
317
  return;
331
318
 
332
319
  default:
320
+ const errorType = status === 'link-error' ? 'Link error' : 'Validation error';
333
321
  // First check for shader compilation failures if linking fails
334
322
  switch (this.vs.compilationStatus) {
335
323
  case 'error':
336
324
  this.vs.debugShader();
337
- throw new Error(`Error during compilation of shader ${this.vs.id}`);
325
+ throw new Error(`${this} ${errorType} during compilation of ${this.vs}`);
338
326
  case 'pending':
339
- this.vs.asyncCompilationStatus.then(() => this.vs.debugShader());
327
+ await this.vs.asyncCompilationStatus;
328
+ this.vs.debugShader();
340
329
  break;
341
330
  case 'success':
342
331
  break;
@@ -345,16 +334,17 @@ export class WEBGLRenderPipeline extends RenderPipeline {
345
334
  switch (this.fs?.compilationStatus) {
346
335
  case 'error':
347
336
  this.fs.debugShader();
348
- throw new Error(`Error during compilation of shader ${this.fs.id}`);
337
+ throw new Error(`${this} ${errorType} during compilation of ${this.fs}`);
349
338
  case 'pending':
350
- this.fs.asyncCompilationStatus.then(() => this.fs.debugShader());
339
+ await this.fs.asyncCompilationStatus;
340
+ this.fs.debugShader();
351
341
  break;
352
342
  case 'success':
353
343
  break;
354
344
  }
355
345
 
356
346
  const linkErrorLog = this.device.gl.getProgramInfoLog(this.handle);
357
- throw new Error(`Error during ${status}: ${linkErrorLog}`);
347
+ this.device.reportError(new Error(`${errorType} during ${status}: ${linkErrorLog}`));
358
348
  }
359
349
  }
360
350
 
@@ -363,19 +353,19 @@ export class WEBGLRenderPipeline extends RenderPipeline {
363
353
  * TODO - Load log even when no error reported, to catch warnings?
364
354
  * https://gamedev.stackexchange.com/questions/30429/how-to-detect-glsl-warnings
365
355
  */
366
- _getLinkStatus(): 'success' | 'linking' | 'validation' {
356
+ _getLinkStatus(): 'success' | 'link-error' | 'validation-error' {
367
357
  const {gl} = this.device;
368
- const linked = gl.getProgramParameter(this.handle, gl.LINK_STATUS);
358
+ const linked = gl.getProgramParameter(this.handle, GL.LINK_STATUS);
369
359
  if (!linked) {
370
360
  this.linkStatus = 'error';
371
- return 'linking';
361
+ return 'link-error';
372
362
  }
373
363
 
374
364
  gl.validateProgram(this.handle);
375
- const validated = gl.getProgramParameter(this.handle, gl.VALIDATE_STATUS);
365
+ const validated = gl.getProgramParameter(this.handle, GL.VALIDATE_STATUS);
376
366
  if (!validated) {
377
367
  this.linkStatus = 'error';
378
- return 'validation';
368
+ return 'validation-error';
379
369
  }
380
370
 
381
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
 
@@ -46,7 +46,10 @@ export class WEBGLShader extends Shader {
46
46
  }
47
47
 
48
48
  get asyncCompilationStatus(): Promise<'pending' | 'success' | 'error'> {
49
- return this._waitForCompilationComplete().then(() => this.compilationStatus);
49
+ return this._waitForCompilationComplete().then(() => {
50
+ this._getCompilationStatus();
51
+ return this.compilationStatus;
52
+ });
50
53
  }
51
54
 
52
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';