@luma.gl/webgl 9.0.10 → 9.1.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 (123) hide show
  1. package/dist/adapter/converters/device-parameters.d.ts.map +1 -1
  2. package/dist/adapter/converters/device-parameters.js +12 -1
  3. package/dist/adapter/converters/texture-formats.d.ts +22 -16
  4. package/dist/adapter/converters/texture-formats.d.ts.map +1 -1
  5. package/dist/adapter/converters/texture-formats.js +31 -32
  6. package/dist/adapter/device-helpers/webgl-device-features.js +1 -1
  7. package/dist/adapter/device-helpers/webgl-device-limits.js +1 -1
  8. package/dist/adapter/helpers/webgl-texture-utils.d.ts +300 -0
  9. package/dist/adapter/helpers/webgl-texture-utils.d.ts.map +1 -0
  10. package/dist/adapter/helpers/webgl-texture-utils.js +368 -0
  11. package/dist/adapter/helpers/webgl-topology-utils.d.ts.map +1 -1
  12. package/dist/adapter/helpers/webgl-topology-utils.js +0 -4
  13. package/dist/adapter/resources/webgl-buffer.d.ts.map +1 -1
  14. package/dist/adapter/resources/webgl-buffer.js +2 -2
  15. package/dist/adapter/resources/webgl-command-buffer.d.ts.map +1 -1
  16. package/dist/adapter/resources/webgl-command-buffer.js +6 -9
  17. package/dist/adapter/resources/webgl-framebuffer.d.ts +32 -5
  18. package/dist/adapter/resources/webgl-framebuffer.d.ts.map +1 -1
  19. package/dist/adapter/resources/webgl-framebuffer.js +42 -60
  20. package/dist/adapter/resources/webgl-render-pass.d.ts +3 -2
  21. package/dist/adapter/resources/webgl-render-pass.d.ts.map +1 -1
  22. package/dist/adapter/resources/webgl-render-pass.js +1 -3
  23. package/dist/adapter/resources/webgl-render-pipeline.d.ts.map +1 -1
  24. package/dist/adapter/resources/webgl-render-pipeline.js +45 -20
  25. package/dist/adapter/resources/webgl-shader.d.ts.map +1 -1
  26. package/dist/adapter/resources/webgl-shader.js +2 -2
  27. package/dist/adapter/resources/webgl-texture-view.d.ts +1 -1
  28. package/dist/adapter/resources/webgl-texture-view.d.ts.map +1 -1
  29. package/dist/adapter/resources/webgl-texture-view.js +1 -1
  30. package/dist/adapter/resources/webgl-texture.d.ts +58 -172
  31. package/dist/adapter/resources/webgl-texture.d.ts.map +1 -1
  32. package/dist/adapter/resources/webgl-texture.js +402 -510
  33. package/dist/adapter/resources/webgl-vertex-array.d.ts +3 -2
  34. package/dist/adapter/resources/webgl-vertex-array.d.ts.map +1 -1
  35. package/dist/adapter/resources/webgl-vertex-array.js +2 -2
  36. package/dist/adapter/webgl-canvas-context.d.ts +3 -1
  37. package/dist/adapter/webgl-canvas-context.d.ts.map +1 -1
  38. package/dist/adapter/webgl-canvas-context.js +2 -0
  39. package/dist/adapter/webgl-device.d.ts +4 -3
  40. package/dist/adapter/webgl-device.d.ts.map +1 -1
  41. package/dist/adapter/webgl-device.js +6 -5
  42. package/dist/classic/accessor.d.ts +22 -1
  43. package/dist/classic/accessor.d.ts.map +1 -1
  44. package/dist/classic/accessor.js +1 -9
  45. package/dist/classic/clear.d.ts.map +1 -1
  46. package/dist/classic/clear.js +2 -5
  47. package/dist/classic/copy-and-blit.d.ts +2 -1
  48. package/dist/classic/copy-and-blit.d.ts.map +1 -1
  49. package/dist/classic/copy-and-blit.js +11 -9
  50. package/dist/classic/format-utils.d.ts.map +1 -1
  51. package/dist/classic/format-utils.js +0 -3
  52. package/dist/classic/typed-array-utils.d.ts +1 -1
  53. package/dist/classic/typed-array-utils.d.ts.map +1 -1
  54. package/dist/context/debug/spector.d.ts.map +1 -1
  55. package/dist/context/debug/spector.js +2 -1
  56. package/dist/context/debug/webgl-developer-tools.d.ts +1 -1
  57. package/dist/context/debug/webgl-developer-tools.d.ts.map +1 -1
  58. package/dist/context/debug/webgl-developer-tools.js +2 -5
  59. package/dist/context/parameters/webgl-parameter-tables.js +1 -1
  60. package/dist/context/state-tracker/track-context-state.d.ts.map +1 -1
  61. package/dist/context/state-tracker/track-context-state.js +5 -6
  62. package/dist/dist.dev.js +870 -1261
  63. package/dist/dist.min.js +2 -2
  64. package/dist/index.cjs +859 -1137
  65. package/dist/index.cjs.map +4 -4
  66. package/dist/index.d.ts +0 -4
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +0 -3
  69. package/dist/utils/fill-array.d.ts +8 -0
  70. package/dist/utils/fill-array.d.ts.map +1 -0
  71. package/dist/utils/fill-array.js +26 -0
  72. package/dist/utils/load-script.d.ts +8 -0
  73. package/dist/utils/load-script.d.ts.map +1 -0
  74. package/dist/utils/load-script.js +26 -0
  75. package/dist/utils/split-uniforms-and-bindings.d.ts +9 -0
  76. package/dist/utils/split-uniforms-and-bindings.d.ts.map +1 -0
  77. package/dist/utils/split-uniforms-and-bindings.js +20 -0
  78. package/package.json +6 -5
  79. package/src/adapter/converters/device-parameters.ts +13 -1
  80. package/src/adapter/converters/texture-formats.ts +45 -42
  81. package/src/adapter/device-helpers/webgl-device-features.ts +1 -1
  82. package/src/adapter/device-helpers/webgl-device-limits.ts +1 -1
  83. package/src/adapter/helpers/webgl-texture-utils.ts +481 -0
  84. package/src/adapter/helpers/webgl-topology-utils.ts +0 -4
  85. package/src/adapter/resources/webgl-buffer.ts +2 -2
  86. package/src/adapter/resources/webgl-command-buffer.ts +8 -10
  87. package/src/adapter/resources/webgl-framebuffer.ts +22 -56
  88. package/src/adapter/resources/webgl-render-pass.ts +4 -5
  89. package/src/adapter/resources/webgl-render-pipeline.ts +48 -23
  90. package/src/adapter/resources/webgl-shader.ts +3 -3
  91. package/src/adapter/resources/webgl-texture-view.ts +1 -3
  92. package/src/adapter/resources/webgl-texture.ts +432 -784
  93. package/src/adapter/resources/webgl-vertex-array.ts +8 -7
  94. package/src/adapter/webgl-canvas-context.ts +4 -1
  95. package/src/adapter/webgl-device.ts +10 -18
  96. package/src/classic/accessor.ts +31 -11
  97. package/src/classic/clear.ts +3 -6
  98. package/src/classic/copy-and-blit.ts +19 -19
  99. package/src/classic/format-utils.ts +0 -3
  100. package/src/classic/typed-array-utils.ts +1 -1
  101. package/src/context/debug/spector.ts +2 -1
  102. package/src/context/debug/webgl-developer-tools.ts +3 -7
  103. package/src/context/parameters/webgl-parameter-tables.ts +3 -3
  104. package/src/context/state-tracker/track-context-state.ts +5 -6
  105. package/src/index.ts +0 -6
  106. package/src/utils/fill-array.ts +35 -0
  107. package/src/utils/load-script.ts +30 -0
  108. package/src/utils/split-uniforms-and-bindings.ts +31 -0
  109. package/dist/adapter/objects/constants-to-keys.d.ts +0 -3
  110. package/dist/adapter/objects/constants-to-keys.d.ts.map +0 -1
  111. package/dist/adapter/objects/constants-to-keys.js +0 -22
  112. package/dist/adapter/objects/webgl-renderbuffer.d.ts +0 -43
  113. package/dist/adapter/objects/webgl-renderbuffer.d.ts.map +0 -1
  114. package/dist/adapter/objects/webgl-renderbuffer.js +0 -95
  115. package/dist/adapter/objects/webgl-resource.d.ts +0 -32
  116. package/dist/adapter/objects/webgl-resource.d.ts.map +0 -1
  117. package/dist/adapter/objects/webgl-resource.js +0 -114
  118. package/src/.DS_Store +0 -0
  119. package/src/adapter/.DS_Store +0 -0
  120. package/src/adapter/objects/constants-to-keys.ts +0 -27
  121. package/src/adapter/objects/webgl-renderbuffer.ts +0 -132
  122. package/src/adapter/objects/webgl-resource.ts +0 -183
  123. package/src/context/.DS_Store +0 -0
@@ -0,0 +1,481 @@
1
+ // luma.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ //
6
+ // WebGL... the texture API from hell... hopefully made simpler
7
+ //
8
+
9
+ import type {ExternalImage} from '@luma.gl/core';
10
+ // import {Buffer} from '@luma.gl/core';
11
+ import {
12
+ GL,
13
+ GLTextureTarget,
14
+ GLTextureCubeMapTarget,
15
+ GLTexelDataFormat,
16
+ GLPixelType
17
+ } from '@luma.gl/constants';
18
+
19
+ import {TypedArray} from '@math.gl/types';
20
+
21
+ /** A "border" parameter is required in many WebGL texture APIs, but must always be 0... */
22
+ const BORDER = 0;
23
+
24
+ export type WebGLSetTextureOptions = {
25
+ dimension: '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d';
26
+ height: number;
27
+ width: number;
28
+ depth?: number;
29
+ level?: number;
30
+ glTarget: GLTextureTarget;
31
+ glInternalFormat: GL;
32
+ glFormat: GLTexelDataFormat;
33
+ glType: GLPixelType;
34
+ compressed?: boolean;
35
+
36
+ byteOffset?: number;
37
+ byteLength?: number;
38
+ };
39
+
40
+ /**
41
+ * @param {*} pixels, data -
42
+ * null - create empty texture of specified format
43
+ * Typed array - init from image data in typed array
44
+ * Buffer|WebGLBuffer - (WEBGL2) init from image data in WebGLBuffer
45
+ * HTMLImageElement|Image - Inits with content of image. Auto width/height
46
+ * HTMLCanvasElement - Inits with contents of canvas. Auto width/height
47
+ * HTMLVideoElement - Creates video texture. Auto width/height
48
+ *
49
+ * @param x - xOffset from where texture to be updated
50
+ * @param y - yOffset from where texture to be updated
51
+ * @param width - width of the sub image to be updated
52
+ * @param height - height of the sub image to be updated
53
+ * @param level - mip level to be updated
54
+ * @param {GLenum} format - internal format of image data.
55
+ * @param {GLenum} type
56
+ * - format of array (autodetect from type) or
57
+ * - (WEBGL2) format of buffer or ArrayBufferView
58
+ * @param {GLenum} dataFormat - format of image data.
59
+ * @param {Number} offset - (WEBGL2) offset from start of buffer
60
+ * @parameters - temporary settings to be applied, can be used to supply pixel store settings.
61
+ */
62
+ export type WebGLCopyTextureOptions = {
63
+ dimension: '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d';
64
+ level?: number;
65
+ height: number;
66
+ width: number;
67
+ depth?: number;
68
+ x?: number;
69
+ y?: number;
70
+ z?: number;
71
+
72
+ glTarget: GLTextureTarget;
73
+ glInternalFormat: GL;
74
+ glFormat: GL;
75
+ glType: GL;
76
+ compressed?: boolean;
77
+
78
+ byteOffset?: number;
79
+ byteLength?: number;
80
+ };
81
+
82
+ /**
83
+ * Initializes a texture memory space
84
+ * Clear all the textures and mip levels of a two-dimensional or array texture at the same time.
85
+ * On some implementations faster than repeatedly setting levels
86
+ *
87
+ * @note From WebGL 2 spec section 3.7.6:
88
+ * @see https://registry.khronos.org/webgl/specs/latest/2.0/
89
+ * - The image contents are set as if a buffer of sufficient size initialized to 0 would be passed to each level's texImage2D/3D
90
+ * - texStorage2D should be considered a preferred alternative to texImage2D. It may have lower memory costs than texImage2D in some implementations.
91
+ * - Once texStorage*D has been called, the texture is immutable and can only be updated with texSubImage*(), not texImage()
92
+ */
93
+ export function initializeTextureStorage(
94
+ gl: WebGL2RenderingContext,
95
+ levels: number,
96
+ options: WebGLSetTextureOptions
97
+ ): void {
98
+ const {dimension, width, height, depth = 0} = options;
99
+ const {glInternalFormat} = options;
100
+ const glTarget = options.glTarget; // getCubeTargetWebGL(options.glTarget, dimension, depth);
101
+ switch (dimension) {
102
+ case '2d-array':
103
+ case '3d':
104
+ gl.texStorage3D(glTarget, levels, glInternalFormat, width, height, depth);
105
+ break;
106
+
107
+ default:
108
+ gl.texStorage2D(glTarget, levels, glInternalFormat, width, height);
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Copy a region of compressed data from a GPU memory buffer into this texture.
114
+ */
115
+ export function copyCPUImageToMipLevel(
116
+ gl: WebGL2RenderingContext,
117
+ image: ExternalImage,
118
+ options: WebGLCopyTextureOptions
119
+ ): void {
120
+ const {dimension, width, height, depth = 0, level = 0} = options;
121
+ const {x = 0, y = 0, z = 0} = options;
122
+ const {glFormat, glType} = options;
123
+ const glTarget = getCubeTargetWebGL(options.glTarget, dimension, depth);
124
+
125
+ // width = size.width,
126
+ // height = size.height
127
+
128
+ switch (dimension) {
129
+ case '2d-array':
130
+ case '3d':
131
+ // prettier-ignore
132
+ gl.texSubImage3D(glTarget, level, x, y, z, width, height, depth, glFormat, glType, image);
133
+ break;
134
+
135
+ case '2d':
136
+ case 'cube':
137
+ // prettier-ignore
138
+ gl.texSubImage2D(glTarget, level, x, y, width, height, glFormat, glType, image);
139
+ break;
140
+
141
+ default:
142
+ throw new Error(dimension);
143
+ }
144
+ }
145
+
146
+ /**
147
+ * Copy a region of data from a CPU memory buffer into this texture.
148
+ */
149
+ export function copyCPUDataToMipLevel(
150
+ gl: WebGL2RenderingContext,
151
+ typedArray: TypedArray,
152
+ options: WebGLCopyTextureOptions
153
+ ): void {
154
+ const {dimension, width, height, depth = 0, level = 0, byteOffset = 0} = options;
155
+ const {x = 0, y = 0, z = 0} = options;
156
+ const {glFormat, glType, compressed} = options;
157
+ const glTarget = getCubeTargetWebGL(options.glTarget, dimension, depth);
158
+
159
+ switch (dimension) {
160
+ case '2d-array':
161
+ case '3d':
162
+ if (compressed) {
163
+ // prettier-ignore
164
+ gl.compressedTexSubImage3D(glTarget, level, x, y, z, width, height, depth, glFormat, typedArray, byteOffset); // , byteLength
165
+ } else {
166
+ // prettier-ignore
167
+ gl.texSubImage3D(glTarget, level, x, y, z, width, height, depth, glFormat, glType, typedArray, byteOffset); // , byteLength
168
+ }
169
+ break;
170
+
171
+ case '2d':
172
+ case 'cube':
173
+ if (compressed) {
174
+ // prettier-ignore
175
+ gl.compressedTexSubImage2D(glTarget, level, x, y, width, height, glFormat, typedArray, byteOffset); // , byteLength
176
+ } else {
177
+ // prettier-ignore
178
+ gl.texSubImage2D(glTarget, level, x, y, width, height, glFormat, glType, typedArray, byteOffset); // , byteLength
179
+ }
180
+ break;
181
+
182
+ default:
183
+ throw new Error(dimension);
184
+ }
185
+ }
186
+
187
+ /**
188
+ * Copy a region of compressed data from a GPU memory buffer into this texture.
189
+ */
190
+ export function copyGPUBufferToMipLevel(
191
+ gl: WebGL2RenderingContext,
192
+ webglBuffer: WebGLBuffer,
193
+ byteLength: number,
194
+ options: WebGLCopyTextureOptions
195
+ ): void {
196
+ const {dimension, width, height, depth = 0, level = 0, byteOffset = 0} = options;
197
+ const {x = 0, y = 0, z = 0} = options;
198
+ const {glFormat, glType, compressed} = options;
199
+ const glTarget = getCubeTargetWebGL(options.glTarget, dimension, depth);
200
+
201
+ gl.bindBuffer(GL.PIXEL_UNPACK_BUFFER, webglBuffer);
202
+
203
+ switch (dimension) {
204
+ case '2d-array':
205
+ case '3d':
206
+ // 3 dimensional textures requires 3D texture functions
207
+ if (compressed) {
208
+ // TODO enable extension?
209
+ // prettier-ignore
210
+ gl.compressedTexSubImage3D(glTarget, level, x, y, z, width, height, depth, glFormat, byteLength, byteOffset);
211
+ } else {
212
+ // prettier-ignore
213
+ gl.texSubImage3D(glTarget, level, x, y, z, width, height, depth, glFormat, glType, byteOffset);
214
+ }
215
+ break;
216
+
217
+ case '2d':
218
+ case 'cube':
219
+ if (compressed) {
220
+ // prettier-ignore
221
+ gl.compressedTexSubImage2D(glTarget, level, x, y, width, height, glFormat, byteLength, byteOffset);
222
+ } else {
223
+ // prettier-ignore
224
+ gl.texSubImage2D(glTarget, level, x, y, width, height, BORDER, glFormat, byteOffset);
225
+ }
226
+ break;
227
+
228
+ default:
229
+ throw new Error(dimension);
230
+ }
231
+ }
232
+
233
+ // INTERNAL HELPERS
234
+
235
+ /** Convert a WebGPU style texture constant to a WebGL style texture constant */
236
+ export function getWebGLTextureTarget(
237
+ dimension: '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d'
238
+ ): GLTextureTarget {
239
+ // prettier-ignore
240
+ switch (dimension) {
241
+ case '1d': break; // not supported in any WebGL version
242
+ case '2d': return GL.TEXTURE_2D; // supported in WebGL1
243
+ case '3d': return GL.TEXTURE_3D; // supported in WebGL2
244
+ case 'cube': return GL.TEXTURE_CUBE_MAP; // supported in WebGL1
245
+ case '2d-array': return GL.TEXTURE_2D_ARRAY; // supported in WebGL2
246
+ case 'cube-array': break; // not supported in any WebGL version
247
+ }
248
+ throw new Error(dimension);
249
+ }
250
+
251
+ /**
252
+ * In WebGL, cube maps specify faces by overriding target instead of using the depth parameter.
253
+ * @returns glTarget unchanged, if dimension !== 'cube'.
254
+ */
255
+ function getCubeTargetWebGL(
256
+ glTarget: GLTextureTarget,
257
+ dimension: '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d',
258
+ level: number
259
+ ): GLTextureTarget | GLTextureCubeMapTarget {
260
+ return dimension === 'cube' ? GL.TEXTURE_CUBE_MAP_POSITIVE_X + level : glTarget;
261
+ }
262
+
263
+ // texImage methods
264
+
265
+ /**
266
+ * Clear a texture mip level.
267
+ * Wrapper for the messy WebGL texture API
268
+ *
269
+ export function clearMipLevel(gl: WebGL2RenderingContext, options: WebGLSetTextureOptions): void {
270
+ const {dimension, width, height, depth = 0, level = 0} = options;
271
+ const {glInternalFormat, glFormat, glType, compressed} = options;
272
+ const glTarget = getCubeTargetWebGL(options.glTarget, dimension, depth);
273
+
274
+ switch (dimension) {
275
+ case '2d-array':
276
+ case '3d':
277
+ if (compressed) {
278
+ // prettier-ignore
279
+ gl.compressedTexImage3D(glTarget, level, glInternalFormat, width, height, depth, BORDER, null);
280
+ } else {
281
+ // prettier-ignore
282
+ gl.texImage3D( glTarget, level, glInternalFormat, width, height, depth, BORDER, glFormat, glType, null);
283
+ }
284
+ break;
285
+
286
+ case '2d':
287
+ case 'cube':
288
+ if (compressed) {
289
+ // prettier-ignore
290
+ gl.compressedTexImage2D(glTarget, level, glInternalFormat, width, height, BORDER, null);
291
+ } else {
292
+ // prettier-ignore
293
+ gl.texImage2D(glTarget, level, glInternalFormat, width, height, BORDER, glFormat, glType, null);
294
+ }
295
+ break;
296
+
297
+ default:
298
+ throw new Error(dimension);
299
+ }
300
+ }
301
+
302
+ /**
303
+ * Set a texture mip level to the contents of an external image.
304
+ * Wrapper for the messy WebGL texture API
305
+ * @note Corresponds to WebGPU device.queue.copyExternalImageToTexture()
306
+ *
307
+ export function setMipLevelFromExternalImage(
308
+ gl: WebGL2RenderingContext,
309
+ image: ExternalImage,
310
+ options: WebGLSetTextureOptions
311
+ ): void {
312
+ const {dimension, width, height, depth = 0, level = 0} = options;
313
+ const {glInternalFormat, glType} = options;
314
+
315
+ const glTarget = getCubeTargetWebGL(options.glTarget, dimension, depth);
316
+
317
+ // TODO - we can't change texture width (due to WebGPU limitations) -
318
+ // and the width/heigh of an external image is implicit, so why do we need to extract it?
319
+ // So what width height do we supply? The image size or the texture size?
320
+ // const {width, height} = Texture.getExternalImageSize(image);
321
+
322
+ switch (dimension) {
323
+ case '2d-array':
324
+ case '3d':
325
+ // prettier-ignore
326
+ gl.texImage3D(glTarget, level, glInternalFormat, width, height, depth, BORDER, glInternalFormat, glType, image);
327
+ break;
328
+
329
+ case '2d':
330
+ case 'cube':
331
+ // prettier-ignore
332
+ gl.texImage2D(glTarget, level, glInternalFormat, width, height, BORDER, glInternalFormat, glType, image);
333
+ break;
334
+
335
+ default:
336
+ throw new Error(dimension);
337
+ }
338
+ }
339
+
340
+ /**
341
+ * Set a texture mip level from CPU memory
342
+ * Wrapper for the messy WebGL texture API
343
+ * @note Not available (directly) in WebGPU
344
+ *
345
+ export function setMipLevelFromTypedArray(
346
+ gl: WebGL2RenderingContext,
347
+ data: TypedArray,
348
+ parameters: {},
349
+ options: {
350
+ dimension: '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d';
351
+ height: number;
352
+ width: number;
353
+ depth?: number;
354
+ level?: number;
355
+ offset?: number;
356
+ glTarget: GLTextureTarget;
357
+ glInternalFormat: GL;
358
+ glFormat: GL;
359
+ glType: GL;
360
+ compressed?: boolean;
361
+ }
362
+ ): void {
363
+ const {dimension, width, height, depth = 0, level = 0, offset = 0} = options;
364
+ const {glInternalFormat, glFormat, glType, compressed} = options;
365
+
366
+ const glTarget = getCubeTargetWebGL(options.glTarget, dimension, depth);
367
+
368
+ withGLParameters(gl, parameters, () => {
369
+ switch (dimension) {
370
+ case '2d-array':
371
+ case '3d':
372
+ if (compressed) {
373
+ // prettier-ignore
374
+ gl.compressedTexImage3D(glTarget, level, glInternalFormat, width, height, depth, BORDER, data);
375
+ } else {
376
+ // prettier-ignore
377
+ gl.texImage3D( glTarget, level, glInternalFormat, width, height, depth, BORDER, glFormat, glType, data);
378
+ }
379
+ break;
380
+
381
+ case '2d':
382
+ if (compressed) {
383
+ // prettier-ignore
384
+ gl.compressedTexImage2D(glTarget, level, glInternalFormat, width, height, BORDER, data);
385
+ } else {
386
+ // prettier-ignore
387
+ gl.texImage2D( glTarget, level, glInternalFormat, width, height, BORDER, glFormat, glType, data, offset);
388
+ }
389
+ break;
390
+
391
+ default:
392
+ throw new Error(dimension);
393
+ }
394
+ });
395
+ }
396
+
397
+ /**
398
+ * Set a texture level from CPU memory
399
+ * @note Not available (directly) in WebGPU
400
+ _setMipLevelFromTypedArray(
401
+ depth: number,
402
+ level: number,
403
+ data: TextureLevelData,
404
+ offset = 0,
405
+ parameters
406
+ ): void {
407
+ withGLParameters(this.gl, parameters, () => {
408
+ switch (this.props.dimension) {
409
+ case '2d-array':
410
+ case '3d':
411
+ if (this.compressed) {
412
+ // prettier-ignore
413
+ this.device.gl.compressedTexImage3D(this.glTarget, level, this.glInternalFormat, data.width, data.height, depth, BORDER, data.data);
414
+ } else {
415
+ // prettier-ignore
416
+ this.gl.texImage3D( this.glTarget, level, this.glInternalFormat, this.width, this.height, depth, BORDER, this.glFormat, this.glType, data.data);
417
+ }
418
+ break;
419
+
420
+ case '2d':
421
+ if (this.compressed) {
422
+ // prettier-ignore
423
+ this.device.gl.compressedTexImage2D(this.glTarget, level, this.glInternalFormat, data.width, data.height, BORDER, data.data);
424
+ } else {
425
+ // prettier-ignore
426
+ this.device.gl.texImage2D( this.glTarget, level, this.glInternalFormat, this.width, this.height, BORDER, this.glFormat, this.glType, data.data, offset);
427
+ }
428
+ break;
429
+
430
+ default:
431
+ throw new Error(this.props.dimension);
432
+ }
433
+ });
434
+ }
435
+
436
+ * Set a texture level from a GPU buffer
437
+ *
438
+ export function setMipLevelFromGPUBuffer(
439
+ gl: WebGL2RenderingContext,
440
+ buffer: Buffer,
441
+ options: WebGLSetTextureOptions
442
+ ): void {
443
+ const {dimension, width, height, depth = 0, level = 0, byteOffset = 0} = options;
444
+ const {glInternalFormat, glFormat, glType, compressed} = options;
445
+ const glTarget = getCubeTargetWebGL(options.glTarget, dimension, depth);
446
+
447
+ const webglBuffer = buffer as WEBGLBuffer;
448
+ const imageSize = buffer.byteLength;
449
+
450
+ // In WebGL the source buffer is not a parameter. Instead it needs to be bound to a special bind point
451
+ gl.bindBuffer(GL.PIXEL_UNPACK_BUFFER, webglBuffer.handle);
452
+
453
+ switch (dimension) {
454
+ case '2d-array':
455
+ case '3d':
456
+ if (compressed) {
457
+ // prettier-ignore
458
+ gl.compressedTexImage3D(glTarget, level, glInternalFormat, width, height, depth, BORDER, imageSize, byteOffset);
459
+ } else {
460
+ // prettier-ignore
461
+ gl.texImage3D(glTarget, level, glInternalFormat, width, height, depth, BORDER, glFormat, glType, byteOffset);
462
+ }
463
+ break;
464
+
465
+ case '2d':
466
+ if (compressed) {
467
+ // prettier-ignore
468
+ gl.compressedTexImage2D(glTarget, level, glInternalFormat, width, height, BORDER, imageSize, byteOffset);
469
+ } else {
470
+ // prettier-ignore
471
+ gl.texImage2D(glTarget, level, glInternalFormat, width, height, BORDER, glFormat, glType, byteOffset);
472
+ }
473
+ break;
474
+
475
+ default:
476
+ throw new Error(dimension);
477
+ }
478
+
479
+ gl.bindBuffer(GL.PIXEL_UNPACK_BUFFER, null);
480
+ }
481
+ */
@@ -86,10 +86,8 @@ export function getGLDrawMode(
86
86
  case 'point-list': return GL.POINTS;
87
87
  case 'line-list': return GL.LINES;
88
88
  case 'line-strip': return GL.LINE_STRIP;
89
- case 'line-loop-webgl': return GL.LINE_LOOP;
90
89
  case 'triangle-list': return GL.TRIANGLES;
91
90
  case 'triangle-strip': return GL.TRIANGLE_STRIP;
92
- case 'triangle-fan-webgl': return GL.TRIANGLE_FAN;
93
91
  default: throw new Error(topology);
94
92
  }
95
93
  }
@@ -101,10 +99,8 @@ export function getGLPrimitive(topology: PrimitiveTopology): GL.POINTS | GL.LINE
101
99
  case 'point-list': return GL.POINTS;
102
100
  case 'line-list': return GL.LINES;
103
101
  case 'line-strip': return GL.LINES;
104
- case 'line-loop-webgl': return GL.LINES;
105
102
  case 'triangle-list': return GL.TRIANGLES;
106
103
  case 'triangle-strip': return GL.TRIANGLES;
107
- case 'triangle-fan-webgl': return GL.TRIANGLES;
108
104
  default: throw new Error(topology);
109
105
  }
110
106
  }
@@ -3,7 +3,7 @@
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
5
  import type {BufferProps} from '@luma.gl/core';
6
- import {Buffer, assert} from '@luma.gl/core';
6
+ import {Buffer} from '@luma.gl/core';
7
7
  import {GL} from '@luma.gl/constants';
8
8
  import {WebGLDevice} from '../webgl-device';
9
9
 
@@ -74,7 +74,7 @@ export class WEBGLBuffer extends Buffer {
74
74
 
75
75
  // Allocate a GPU buffer of specified size.
76
76
  _initWithByteLength(byteLength: number): this {
77
- assert(byteLength >= 0);
77
+ // assert(byteLength >= 0);
78
78
 
79
79
  // Workaround needed for Safari (#291):
80
80
  // gl.bufferData with size equal to 0 crashes. Instead create zero sized array.
@@ -15,11 +15,7 @@ import {WebGLDevice} from '../webgl-device';
15
15
  import {WEBGLBuffer} from './webgl-buffer';
16
16
  import {WEBGLTexture} from './webgl-texture';
17
17
  import {WEBGLFramebuffer} from './webgl-framebuffer';
18
- import {getWebGLTextureParameters} from '../converters/texture-formats';
19
-
20
- function cast<T>(value: unknown): T {
21
- return value as T;
22
- }
18
+ import {getTextureFormatWebGL} from '../converters/texture-formats';
23
19
 
24
20
  type CopyBufferToBufferCommand = {
25
21
  name: 'copy-buffer-to-buffer';
@@ -77,8 +73,8 @@ export class WEBGLCommandBuffer extends CommandBuffer {
77
73
  }
78
74
 
79
75
  function _copyBufferToBuffer(device: WebGLDevice, options: CopyBufferToBufferOptions): void {
80
- const source = cast<WEBGLBuffer>(options.source);
81
- const destination = cast<WEBGLBuffer>(options.destination);
76
+ const source = options.source as WEBGLBuffer;
77
+ const destination = options.destination as WEBGLBuffer;
82
78
 
83
79
  // {In WebGL2 we can p}erform the copy on the GPU
84
80
  // Use GL.COPY_READ_BUFFER+GL.COPY_WRITE_BUFFER avoid disturbing other targets and locking type
@@ -158,8 +154,10 @@ function _copyTextureToBuffer(device: WebGLDevice, options: CopyTextureToBufferO
158
154
  const webglBuffer = destination as WEBGLBuffer;
159
155
  const sourceWidth = width || framebuffer.width;
160
156
  const sourceHeight = height || framebuffer.height;
161
- const sourceParams = getWebGLTextureParameters(framebuffer.texture.props.format);
162
- const sourceFormat = sourceParams.dataFormat;
157
+ const sourceParams = getTextureFormatWebGL(
158
+ framebuffer.colorAttachments[0].texture.props.format
159
+ );
160
+ const sourceFormat = sourceParams.format;
163
161
  const sourceType = sourceParams.type;
164
162
 
165
163
  // if (!target) {
@@ -268,7 +266,7 @@ function _copyTextureToTexture(device: WebGLDevice, options: CopyTextureToTextur
268
266
  width = Number.isFinite(width) ? width : texture.width;
269
267
  height = Number.isFinite(height) ? height : texture.height;
270
268
  texture.bind(0);
271
- textureTarget = texture.target;
269
+ textureTarget = texture.glTarget;
272
270
  } else {
273
271
  throw new Error('invalid destination');
274
272
  }