@luma.gl/webgl 9.0.17 → 9.1.0-alpha.10

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 (144) hide show
  1. package/dist/adapter/converters/device-parameters.d.ts.map +1 -1
  2. package/dist/adapter/converters/device-parameters.js +30 -12
  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 +39 -47
  6. package/dist/adapter/device-helpers/webgl-device-features.d.ts.map +1 -1
  7. package/dist/adapter/device-helpers/webgl-device-features.js +1 -2
  8. package/dist/adapter/device-helpers/webgl-device-limits.js +1 -1
  9. package/dist/adapter/helpers/webgl-texture-utils.d.ts +300 -0
  10. package/dist/adapter/helpers/webgl-texture-utils.d.ts.map +1 -0
  11. package/dist/adapter/helpers/webgl-texture-utils.js +370 -0
  12. package/dist/adapter/helpers/webgl-topology-utils.d.ts.map +1 -1
  13. package/dist/adapter/helpers/webgl-topology-utils.js +0 -4
  14. package/dist/adapter/resources/webgl-buffer.d.ts.map +1 -1
  15. package/dist/adapter/resources/webgl-buffer.js +2 -2
  16. package/dist/adapter/resources/webgl-command-buffer.d.ts.map +1 -1
  17. package/dist/adapter/resources/webgl-command-buffer.js +6 -9
  18. package/dist/adapter/resources/webgl-framebuffer.d.ts +32 -5
  19. package/dist/adapter/resources/webgl-framebuffer.d.ts.map +1 -1
  20. package/dist/adapter/resources/webgl-framebuffer.js +42 -60
  21. package/dist/adapter/resources/webgl-render-pass.d.ts +3 -2
  22. package/dist/adapter/resources/webgl-render-pass.d.ts.map +1 -1
  23. package/dist/adapter/resources/webgl-render-pass.js +18 -7
  24. package/dist/adapter/resources/webgl-render-pipeline.d.ts.map +1 -1
  25. package/dist/adapter/resources/webgl-render-pipeline.js +46 -21
  26. package/dist/adapter/resources/webgl-shader.d.ts.map +1 -1
  27. package/dist/adapter/resources/webgl-shader.js +3 -3
  28. package/dist/adapter/resources/webgl-texture-view.d.ts +1 -1
  29. package/dist/adapter/resources/webgl-texture-view.d.ts.map +1 -1
  30. package/dist/adapter/resources/webgl-texture-view.js +1 -1
  31. package/dist/adapter/resources/webgl-texture.d.ts +76 -172
  32. package/dist/adapter/resources/webgl-texture.d.ts.map +1 -1
  33. package/dist/adapter/resources/webgl-texture.js +397 -511
  34. package/dist/adapter/resources/webgl-vertex-array.d.ts +3 -2
  35. package/dist/adapter/resources/webgl-vertex-array.d.ts.map +1 -1
  36. package/dist/adapter/resources/webgl-vertex-array.js +2 -2
  37. package/dist/adapter/webgl-adapter.d.ts +21 -0
  38. package/dist/adapter/webgl-adapter.d.ts.map +1 -0
  39. package/dist/adapter/webgl-adapter.js +91 -0
  40. package/dist/adapter/webgl-canvas-context.d.ts +3 -1
  41. package/dist/adapter/webgl-canvas-context.d.ts.map +1 -1
  42. package/dist/adapter/webgl-canvas-context.js +2 -0
  43. package/dist/adapter/webgl-device.d.ts +19 -30
  44. package/dist/adapter/webgl-device.d.ts.map +1 -1
  45. package/dist/adapter/webgl-device.js +35 -114
  46. package/dist/classic/accessor.d.ts +22 -1
  47. package/dist/classic/accessor.d.ts.map +1 -1
  48. package/dist/classic/accessor.js +1 -9
  49. package/dist/classic/clear.d.ts.map +1 -1
  50. package/dist/classic/clear.js +2 -5
  51. package/dist/classic/copy-and-blit.d.ts +3 -1
  52. package/dist/classic/copy-and-blit.d.ts.map +1 -1
  53. package/dist/classic/copy-and-blit.js +21 -18
  54. package/dist/classic/format-utils.d.ts.map +1 -1
  55. package/dist/classic/format-utils.js +0 -3
  56. package/dist/classic/typed-array-utils.d.ts +1 -1
  57. package/dist/classic/typed-array-utils.d.ts.map +1 -1
  58. package/dist/context/debug/spector-types.d.ts +1108 -0
  59. package/dist/context/debug/spector-types.d.ts.map +1 -0
  60. package/dist/context/debug/spector-types.js +697 -0
  61. package/dist/context/debug/spector.d.ts +12 -8
  62. package/dist/context/debug/spector.d.ts.map +1 -1
  63. package/dist/context/debug/spector.js +25 -18
  64. package/dist/context/debug/webgl-developer-tools.d.ts +1 -1
  65. package/dist/context/debug/webgl-developer-tools.d.ts.map +1 -1
  66. package/dist/context/debug/webgl-developer-tools.js +2 -5
  67. package/dist/context/parameters/webgl-parameter-tables.js +1 -1
  68. package/dist/context/polyfills/polyfill-webgl1-extensions.d.ts +9 -0
  69. package/dist/context/polyfills/polyfill-webgl1-extensions.d.ts.map +1 -0
  70. package/dist/context/polyfills/polyfill-webgl1-extensions.js +181 -0
  71. package/dist/context/state-tracker/webgl-state-tracker.d.ts +43 -0
  72. package/dist/context/state-tracker/webgl-state-tracker.d.ts.map +1 -0
  73. package/dist/context/state-tracker/{track-context-state.js → webgl-state-tracker.js} +46 -77
  74. package/dist/context/state-tracker/with-parameters.d.ts.map +1 -1
  75. package/dist/context/state-tracker/with-parameters.js +5 -4
  76. package/dist/dist.dev.js +1112 -1380
  77. package/dist/dist.min.js +2 -2
  78. package/dist/index.cjs +1122 -1284
  79. package/dist/index.cjs.map +4 -4
  80. package/dist/index.d.ts +3 -5
  81. package/dist/index.d.ts.map +1 -1
  82. package/dist/index.js +3 -5
  83. package/dist/utils/fill-array.d.ts +8 -0
  84. package/dist/utils/fill-array.d.ts.map +1 -0
  85. package/dist/utils/fill-array.js +26 -0
  86. package/dist/utils/load-script.d.ts +8 -0
  87. package/dist/utils/load-script.d.ts.map +1 -0
  88. package/dist/utils/load-script.js +26 -0
  89. package/dist/utils/split-uniforms-and-bindings.d.ts +9 -0
  90. package/dist/utils/split-uniforms-and-bindings.d.ts.map +1 -0
  91. package/dist/utils/split-uniforms-and-bindings.js +20 -0
  92. package/dist/utils/uid.d.ts +7 -0
  93. package/dist/utils/uid.d.ts.map +1 -0
  94. package/dist/utils/uid.js +14 -0
  95. package/package.json +6 -5
  96. package/src/adapter/converters/device-parameters.ts +31 -13
  97. package/src/adapter/converters/texture-formats.ts +51 -56
  98. package/src/adapter/device-helpers/webgl-device-features.ts +1 -2
  99. package/src/adapter/device-helpers/webgl-device-limits.ts +1 -1
  100. package/src/adapter/helpers/webgl-texture-utils.ts +484 -0
  101. package/src/adapter/helpers/webgl-topology-utils.ts +0 -4
  102. package/src/adapter/resources/webgl-buffer.ts +2 -2
  103. package/src/adapter/resources/webgl-command-buffer.ts +8 -10
  104. package/src/adapter/resources/webgl-framebuffer.ts +22 -56
  105. package/src/adapter/resources/webgl-render-pass.ts +21 -9
  106. package/src/adapter/resources/webgl-render-pipeline.ts +50 -24
  107. package/src/adapter/resources/webgl-shader.ts +4 -4
  108. package/src/adapter/resources/webgl-texture-view.ts +1 -3
  109. package/src/adapter/resources/webgl-texture.ts +445 -784
  110. package/src/adapter/resources/webgl-vertex-array.ts +8 -7
  111. package/src/adapter/webgl-adapter.ts +113 -0
  112. package/src/adapter/webgl-canvas-context.ts +4 -1
  113. package/src/adapter/webgl-device.ts +40 -151
  114. package/src/classic/accessor.ts +31 -11
  115. package/src/classic/clear.ts +3 -6
  116. package/src/classic/copy-and-blit.ts +32 -27
  117. package/src/classic/format-utils.ts +0 -3
  118. package/src/classic/typed-array-utils.ts +1 -1
  119. package/src/context/debug/spector-types.ts +1154 -0
  120. package/src/context/debug/spector.ts +40 -30
  121. package/src/context/debug/webgl-developer-tools.ts +3 -7
  122. package/src/context/parameters/webgl-parameter-tables.ts +3 -3
  123. package/src/context/polyfills/polyfill-webgl1-extensions.ts +202 -0
  124. package/src/context/state-tracker/{track-context-state.ts → webgl-state-tracker.ts} +57 -97
  125. package/src/context/state-tracker/with-parameters.ts +5 -4
  126. package/src/index.ts +5 -13
  127. package/src/utils/fill-array.ts +35 -0
  128. package/src/utils/load-script.ts +30 -0
  129. package/src/utils/split-uniforms-and-bindings.ts +31 -0
  130. package/src/utils/uid.ts +16 -0
  131. package/dist/adapter/objects/constants-to-keys.d.ts +0 -3
  132. package/dist/adapter/objects/constants-to-keys.d.ts.map +0 -1
  133. package/dist/adapter/objects/constants-to-keys.js +0 -22
  134. package/dist/adapter/objects/webgl-renderbuffer.d.ts +0 -43
  135. package/dist/adapter/objects/webgl-renderbuffer.d.ts.map +0 -1
  136. package/dist/adapter/objects/webgl-renderbuffer.js +0 -95
  137. package/dist/adapter/objects/webgl-resource.d.ts +0 -32
  138. package/dist/adapter/objects/webgl-resource.d.ts.map +0 -1
  139. package/dist/adapter/objects/webgl-resource.js +0 -114
  140. package/dist/context/state-tracker/track-context-state.d.ts +0 -22
  141. package/dist/context/state-tracker/track-context-state.d.ts.map +0 -1
  142. package/src/adapter/objects/constants-to-keys.ts +0 -27
  143. package/src/adapter/objects/webgl-renderbuffer.ts +0 -132
  144. package/src/adapter/objects/webgl-resource.ts +0 -183
@@ -0,0 +1,484 @@
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; // getWebGLCubeFaceTarget(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 = getWebGLCubeFaceTarget(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 = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);
158
+
159
+ // gl.bindTexture(glTarget, null);
160
+
161
+ switch (dimension) {
162
+ case '2d-array':
163
+ case '3d':
164
+ if (compressed) {
165
+ // prettier-ignore
166
+ gl.compressedTexSubImage3D(glTarget, level, x, y, z, width, height, depth, glFormat, typedArray, byteOffset); // , byteLength
167
+ } else {
168
+ // prettier-ignore
169
+ gl.texSubImage3D(glTarget, level, x, y, z, width, height, depth, glFormat, glType, typedArray, byteOffset); // , byteLength
170
+ }
171
+ break;
172
+
173
+ case '2d':
174
+ case 'cube':
175
+ if (compressed) {
176
+ // prettier-ignore
177
+ gl.compressedTexSubImage2D(glTarget, level, x, y, width, height, glFormat, typedArray, byteOffset); // , byteLength
178
+ } else {
179
+ // prettier-ignore
180
+ gl.texSubImage2D(glTarget, level, x, y, width, height, glFormat, glType, typedArray, byteOffset); // , byteLength
181
+ }
182
+ break;
183
+
184
+ default:
185
+ throw new Error(dimension);
186
+ }
187
+ }
188
+
189
+ /**
190
+ * Copy a region of compressed data from a GPU memory buffer into this texture.
191
+ */
192
+ export function copyGPUBufferToMipLevel(
193
+ gl: WebGL2RenderingContext,
194
+ webglBuffer: WebGLBuffer,
195
+ byteLength: number,
196
+ options: WebGLCopyTextureOptions
197
+ ): void {
198
+ const {dimension, width, height, depth = 0, level = 0, byteOffset = 0} = options;
199
+ const {x = 0, y = 0, z = 0} = options;
200
+ const {glFormat, glType, compressed} = options;
201
+ const glTarget = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);
202
+
203
+ gl.bindBuffer(GL.PIXEL_UNPACK_BUFFER, webglBuffer);
204
+
205
+ switch (dimension) {
206
+ case '2d-array':
207
+ case '3d':
208
+ // 3 dimensional textures requires 3D texture functions
209
+ if (compressed) {
210
+ // TODO enable extension?
211
+ // prettier-ignore
212
+ gl.compressedTexSubImage3D(glTarget, level, x, y, z, width, height, depth, glFormat, byteLength, byteOffset);
213
+ } else {
214
+ // prettier-ignore
215
+ gl.texSubImage3D(glTarget, level, x, y, z, width, height, depth, glFormat, glType, byteOffset);
216
+ }
217
+ break;
218
+
219
+ case '2d':
220
+ case 'cube':
221
+ if (compressed) {
222
+ // prettier-ignore
223
+ gl.compressedTexSubImage2D(glTarget, level, x, y, width, height, glFormat, byteLength, byteOffset);
224
+ } else {
225
+ // prettier-ignore
226
+ gl.texSubImage2D(glTarget, level, x, y, width, height, BORDER, glFormat, byteOffset);
227
+ }
228
+ break;
229
+
230
+ default:
231
+ throw new Error(dimension);
232
+ }
233
+ }
234
+
235
+ // INTERNAL HELPERS
236
+
237
+ /** Convert a WebGPU style texture constant to a WebGL style texture constant */
238
+ export function getWebGLTextureTarget(
239
+ dimension: '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d'
240
+ ): GLTextureTarget {
241
+ // prettier-ignore
242
+ switch (dimension) {
243
+ case '1d': break; // not supported in any WebGL version
244
+ case '2d': return GL.TEXTURE_2D; // supported in WebGL1
245
+ case '3d': return GL.TEXTURE_3D; // supported in WebGL2
246
+ case 'cube': return GL.TEXTURE_CUBE_MAP; // supported in WebGL1
247
+ case '2d-array': return GL.TEXTURE_2D_ARRAY; // supported in WebGL2
248
+ case 'cube-array': break; // not supported in any WebGL version
249
+ }
250
+ throw new Error(dimension);
251
+ }
252
+
253
+ /**
254
+ * In WebGL, cube maps specify faces by overriding target instead of using the depth parameter.
255
+ * @note We still bind the texture using GL.TEXTURE_CUBE_MAP, but we need to use the face-specific target when setting mip levels.
256
+ * @returns glTarget unchanged, if dimension !== 'cube'.
257
+ */
258
+ function getWebGLCubeFaceTarget(
259
+ glTarget: GLTextureTarget,
260
+ dimension: '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d',
261
+ level: number
262
+ ): GLTextureTarget | GLTextureCubeMapTarget {
263
+ return dimension === 'cube' ? GL.TEXTURE_CUBE_MAP_POSITIVE_X + level : glTarget;
264
+ }
265
+
266
+ // texImage methods
267
+
268
+ /**
269
+ * Clear a texture mip level.
270
+ * Wrapper for the messy WebGL texture API
271
+ *
272
+ export function clearMipLevel(gl: WebGL2RenderingContext, options: WebGLSetTextureOptions): void {
273
+ const {dimension, width, height, depth = 0, level = 0} = options;
274
+ const {glInternalFormat, glFormat, glType, compressed} = options;
275
+ const glTarget = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);
276
+
277
+ switch (dimension) {
278
+ case '2d-array':
279
+ case '3d':
280
+ if (compressed) {
281
+ // prettier-ignore
282
+ gl.compressedTexImage3D(glTarget, level, glInternalFormat, width, height, depth, BORDER, null);
283
+ } else {
284
+ // prettier-ignore
285
+ gl.texImage3D( glTarget, level, glInternalFormat, width, height, depth, BORDER, glFormat, glType, null);
286
+ }
287
+ break;
288
+
289
+ case '2d':
290
+ case 'cube':
291
+ if (compressed) {
292
+ // prettier-ignore
293
+ gl.compressedTexImage2D(glTarget, level, glInternalFormat, width, height, BORDER, null);
294
+ } else {
295
+ // prettier-ignore
296
+ gl.texImage2D(glTarget, level, glInternalFormat, width, height, BORDER, glFormat, glType, null);
297
+ }
298
+ break;
299
+
300
+ default:
301
+ throw new Error(dimension);
302
+ }
303
+ }
304
+
305
+ /**
306
+ * Set a texture mip level to the contents of an external image.
307
+ * Wrapper for the messy WebGL texture API
308
+ * @note Corresponds to WebGPU device.queue.copyExternalImageToTexture()
309
+ *
310
+ export function setMipLevelFromExternalImage(
311
+ gl: WebGL2RenderingContext,
312
+ image: ExternalImage,
313
+ options: WebGLSetTextureOptions
314
+ ): void {
315
+ const {dimension, width, height, depth = 0, level = 0} = options;
316
+ const {glInternalFormat, glType} = options;
317
+
318
+ const glTarget = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);
319
+
320
+ // TODO - we can't change texture width (due to WebGPU limitations) -
321
+ // and the width/heigh of an external image is implicit, so why do we need to extract it?
322
+ // So what width height do we supply? The image size or the texture size?
323
+ // const {width, height} = Texture.getExternalImageSize(image);
324
+
325
+ switch (dimension) {
326
+ case '2d-array':
327
+ case '3d':
328
+ // prettier-ignore
329
+ gl.texImage3D(glTarget, level, glInternalFormat, width, height, depth, BORDER, glInternalFormat, glType, image);
330
+ break;
331
+
332
+ case '2d':
333
+ case 'cube':
334
+ // prettier-ignore
335
+ gl.texImage2D(glTarget, level, glInternalFormat, width, height, BORDER, glInternalFormat, glType, image);
336
+ break;
337
+
338
+ default:
339
+ throw new Error(dimension);
340
+ }
341
+ }
342
+
343
+ /**
344
+ * Set a texture mip level from CPU memory
345
+ * Wrapper for the messy WebGL texture API
346
+ * @note Not available (directly) in WebGPU
347
+ *
348
+ export function setMipLevelFromTypedArray(
349
+ gl: WebGL2RenderingContext,
350
+ data: TypedArray,
351
+ parameters: {},
352
+ options: {
353
+ dimension: '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d';
354
+ height: number;
355
+ width: number;
356
+ depth?: number;
357
+ level?: number;
358
+ offset?: number;
359
+ glTarget: GLTextureTarget;
360
+ glInternalFormat: GL;
361
+ glFormat: GL;
362
+ glType: GL;
363
+ compressed?: boolean;
364
+ }
365
+ ): void {
366
+ const {dimension, width, height, depth = 0, level = 0, offset = 0} = options;
367
+ const {glInternalFormat, glFormat, glType, compressed} = options;
368
+
369
+ const glTarget = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);
370
+
371
+ withGLParameters(gl, parameters, () => {
372
+ switch (dimension) {
373
+ case '2d-array':
374
+ case '3d':
375
+ if (compressed) {
376
+ // prettier-ignore
377
+ gl.compressedTexImage3D(glTarget, level, glInternalFormat, width, height, depth, BORDER, data);
378
+ } else {
379
+ // prettier-ignore
380
+ gl.texImage3D( glTarget, level, glInternalFormat, width, height, depth, BORDER, glFormat, glType, data);
381
+ }
382
+ break;
383
+
384
+ case '2d':
385
+ if (compressed) {
386
+ // prettier-ignore
387
+ gl.compressedTexImage2D(glTarget, level, glInternalFormat, width, height, BORDER, data);
388
+ } else {
389
+ // prettier-ignore
390
+ gl.texImage2D( glTarget, level, glInternalFormat, width, height, BORDER, glFormat, glType, data, offset);
391
+ }
392
+ break;
393
+
394
+ default:
395
+ throw new Error(dimension);
396
+ }
397
+ });
398
+ }
399
+
400
+ /**
401
+ * Set a texture level from CPU memory
402
+ * @note Not available (directly) in WebGPU
403
+ _setMipLevelFromTypedArray(
404
+ depth: number,
405
+ level: number,
406
+ data: TextureLevelData,
407
+ offset = 0,
408
+ parameters
409
+ ): void {
410
+ withGLParameters(this.gl, parameters, () => {
411
+ switch (this.props.dimension) {
412
+ case '2d-array':
413
+ case '3d':
414
+ if (this.compressed) {
415
+ // prettier-ignore
416
+ this.device.gl.compressedTexImage3D(this.glTarget, level, this.glInternalFormat, data.width, data.height, depth, BORDER, data.data);
417
+ } else {
418
+ // prettier-ignore
419
+ this.gl.texImage3D( this.glTarget, level, this.glInternalFormat, this.width, this.height, depth, BORDER, this.glFormat, this.glType, data.data);
420
+ }
421
+ break;
422
+
423
+ case '2d':
424
+ if (this.compressed) {
425
+ // prettier-ignore
426
+ this.device.gl.compressedTexImage2D(this.glTarget, level, this.glInternalFormat, data.width, data.height, BORDER, data.data);
427
+ } else {
428
+ // prettier-ignore
429
+ this.device.gl.texImage2D( this.glTarget, level, this.glInternalFormat, this.width, this.height, BORDER, this.glFormat, this.glType, data.data, offset);
430
+ }
431
+ break;
432
+
433
+ default:
434
+ throw new Error(this.props.dimension);
435
+ }
436
+ });
437
+ }
438
+
439
+ * Set a texture level from a GPU buffer
440
+ *
441
+ export function setMipLevelFromGPUBuffer(
442
+ gl: WebGL2RenderingContext,
443
+ buffer: Buffer,
444
+ options: WebGLSetTextureOptions
445
+ ): void {
446
+ const {dimension, width, height, depth = 0, level = 0, byteOffset = 0} = options;
447
+ const {glInternalFormat, glFormat, glType, compressed} = options;
448
+ const glTarget = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);
449
+
450
+ const webglBuffer = buffer as WEBGLBuffer;
451
+ const imageSize = buffer.byteLength;
452
+
453
+ // In WebGL the source buffer is not a parameter. Instead it needs to be bound to a special bind point
454
+ gl.bindBuffer(GL.PIXEL_UNPACK_BUFFER, webglBuffer.handle);
455
+
456
+ switch (dimension) {
457
+ case '2d-array':
458
+ case '3d':
459
+ if (compressed) {
460
+ // prettier-ignore
461
+ gl.compressedTexImage3D(glTarget, level, glInternalFormat, width, height, depth, BORDER, imageSize, byteOffset);
462
+ } else {
463
+ // prettier-ignore
464
+ gl.texImage3D(glTarget, level, glInternalFormat, width, height, depth, BORDER, glFormat, glType, byteOffset);
465
+ }
466
+ break;
467
+
468
+ case '2d':
469
+ if (compressed) {
470
+ // prettier-ignore
471
+ gl.compressedTexImage2D(glTarget, level, glInternalFormat, width, height, BORDER, imageSize, byteOffset);
472
+ } else {
473
+ // prettier-ignore
474
+ gl.texImage2D(glTarget, level, glInternalFormat, width, height, BORDER, glFormat, glType, byteOffset);
475
+ }
476
+ break;
477
+
478
+ default:
479
+ throw new Error(dimension);
480
+ }
481
+
482
+ gl.bindBuffer(GL.PIXEL_UNPACK_BUFFER, null);
483
+ }
484
+ */
@@ -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
  }