@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.
- package/dist/adapter/converters/device-parameters.d.ts.map +1 -1
- package/dist/adapter/converters/device-parameters.js +30 -12
- package/dist/adapter/converters/texture-formats.d.ts +22 -16
- package/dist/adapter/converters/texture-formats.d.ts.map +1 -1
- package/dist/adapter/converters/texture-formats.js +39 -47
- package/dist/adapter/device-helpers/webgl-device-features.d.ts.map +1 -1
- package/dist/adapter/device-helpers/webgl-device-features.js +1 -2
- package/dist/adapter/device-helpers/webgl-device-limits.js +1 -1
- package/dist/adapter/helpers/webgl-texture-utils.d.ts +300 -0
- package/dist/adapter/helpers/webgl-texture-utils.d.ts.map +1 -0
- package/dist/adapter/helpers/webgl-texture-utils.js +370 -0
- package/dist/adapter/helpers/webgl-topology-utils.d.ts.map +1 -1
- package/dist/adapter/helpers/webgl-topology-utils.js +0 -4
- package/dist/adapter/resources/webgl-buffer.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-buffer.js +2 -2
- package/dist/adapter/resources/webgl-command-buffer.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-command-buffer.js +6 -9
- package/dist/adapter/resources/webgl-framebuffer.d.ts +32 -5
- package/dist/adapter/resources/webgl-framebuffer.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-framebuffer.js +42 -60
- package/dist/adapter/resources/webgl-render-pass.d.ts +3 -2
- package/dist/adapter/resources/webgl-render-pass.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-render-pass.js +18 -7
- package/dist/adapter/resources/webgl-render-pipeline.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-render-pipeline.js +46 -21
- package/dist/adapter/resources/webgl-shader.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-shader.js +3 -3
- package/dist/adapter/resources/webgl-texture-view.d.ts +1 -1
- package/dist/adapter/resources/webgl-texture-view.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-texture-view.js +1 -1
- package/dist/adapter/resources/webgl-texture.d.ts +76 -172
- package/dist/adapter/resources/webgl-texture.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-texture.js +397 -511
- package/dist/adapter/resources/webgl-vertex-array.d.ts +3 -2
- package/dist/adapter/resources/webgl-vertex-array.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-vertex-array.js +2 -2
- package/dist/adapter/webgl-adapter.d.ts +21 -0
- package/dist/adapter/webgl-adapter.d.ts.map +1 -0
- package/dist/adapter/webgl-adapter.js +91 -0
- package/dist/adapter/webgl-canvas-context.d.ts +3 -1
- package/dist/adapter/webgl-canvas-context.d.ts.map +1 -1
- package/dist/adapter/webgl-canvas-context.js +2 -0
- package/dist/adapter/webgl-device.d.ts +19 -30
- package/dist/adapter/webgl-device.d.ts.map +1 -1
- package/dist/adapter/webgl-device.js +35 -114
- package/dist/classic/accessor.d.ts +22 -1
- package/dist/classic/accessor.d.ts.map +1 -1
- package/dist/classic/accessor.js +1 -9
- package/dist/classic/clear.d.ts.map +1 -1
- package/dist/classic/clear.js +2 -5
- package/dist/classic/copy-and-blit.d.ts +3 -1
- package/dist/classic/copy-and-blit.d.ts.map +1 -1
- package/dist/classic/copy-and-blit.js +21 -18
- package/dist/classic/format-utils.d.ts.map +1 -1
- package/dist/classic/format-utils.js +0 -3
- package/dist/classic/typed-array-utils.d.ts +1 -1
- package/dist/classic/typed-array-utils.d.ts.map +1 -1
- package/dist/context/debug/spector-types.d.ts +1108 -0
- package/dist/context/debug/spector-types.d.ts.map +1 -0
- package/dist/context/debug/spector-types.js +697 -0
- package/dist/context/debug/spector.d.ts +12 -8
- package/dist/context/debug/spector.d.ts.map +1 -1
- package/dist/context/debug/spector.js +25 -18
- package/dist/context/debug/webgl-developer-tools.d.ts +1 -1
- package/dist/context/debug/webgl-developer-tools.d.ts.map +1 -1
- package/dist/context/debug/webgl-developer-tools.js +2 -5
- package/dist/context/parameters/webgl-parameter-tables.js +1 -1
- package/dist/context/polyfills/polyfill-webgl1-extensions.d.ts +9 -0
- package/dist/context/polyfills/polyfill-webgl1-extensions.d.ts.map +1 -0
- package/dist/context/polyfills/polyfill-webgl1-extensions.js +181 -0
- package/dist/context/state-tracker/webgl-state-tracker.d.ts +43 -0
- package/dist/context/state-tracker/webgl-state-tracker.d.ts.map +1 -0
- package/dist/context/state-tracker/{track-context-state.js → webgl-state-tracker.js} +46 -77
- package/dist/context/state-tracker/with-parameters.d.ts.map +1 -1
- package/dist/context/state-tracker/with-parameters.js +5 -4
- package/dist/dist.dev.js +1112 -1380
- package/dist/dist.min.js +2 -2
- package/dist/index.cjs +1122 -1284
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +3 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -5
- package/dist/utils/fill-array.d.ts +8 -0
- package/dist/utils/fill-array.d.ts.map +1 -0
- package/dist/utils/fill-array.js +26 -0
- package/dist/utils/load-script.d.ts +8 -0
- package/dist/utils/load-script.d.ts.map +1 -0
- package/dist/utils/load-script.js +26 -0
- package/dist/utils/split-uniforms-and-bindings.d.ts +9 -0
- package/dist/utils/split-uniforms-and-bindings.d.ts.map +1 -0
- package/dist/utils/split-uniforms-and-bindings.js +20 -0
- package/dist/utils/uid.d.ts +7 -0
- package/dist/utils/uid.d.ts.map +1 -0
- package/dist/utils/uid.js +14 -0
- package/package.json +6 -5
- package/src/adapter/converters/device-parameters.ts +31 -13
- package/src/adapter/converters/texture-formats.ts +51 -56
- package/src/adapter/device-helpers/webgl-device-features.ts +1 -2
- package/src/adapter/device-helpers/webgl-device-limits.ts +1 -1
- package/src/adapter/helpers/webgl-texture-utils.ts +484 -0
- package/src/adapter/helpers/webgl-topology-utils.ts +0 -4
- package/src/adapter/resources/webgl-buffer.ts +2 -2
- package/src/adapter/resources/webgl-command-buffer.ts +8 -10
- package/src/adapter/resources/webgl-framebuffer.ts +22 -56
- package/src/adapter/resources/webgl-render-pass.ts +21 -9
- package/src/adapter/resources/webgl-render-pipeline.ts +50 -24
- package/src/adapter/resources/webgl-shader.ts +4 -4
- package/src/adapter/resources/webgl-texture-view.ts +1 -3
- package/src/adapter/resources/webgl-texture.ts +445 -784
- package/src/adapter/resources/webgl-vertex-array.ts +8 -7
- package/src/adapter/webgl-adapter.ts +113 -0
- package/src/adapter/webgl-canvas-context.ts +4 -1
- package/src/adapter/webgl-device.ts +40 -151
- package/src/classic/accessor.ts +31 -11
- package/src/classic/clear.ts +3 -6
- package/src/classic/copy-and-blit.ts +32 -27
- package/src/classic/format-utils.ts +0 -3
- package/src/classic/typed-array-utils.ts +1 -1
- package/src/context/debug/spector-types.ts +1154 -0
- package/src/context/debug/spector.ts +40 -30
- package/src/context/debug/webgl-developer-tools.ts +3 -7
- package/src/context/parameters/webgl-parameter-tables.ts +3 -3
- package/src/context/polyfills/polyfill-webgl1-extensions.ts +202 -0
- package/src/context/state-tracker/{track-context-state.ts → webgl-state-tracker.ts} +57 -97
- package/src/context/state-tracker/with-parameters.ts +5 -4
- package/src/index.ts +5 -13
- package/src/utils/fill-array.ts +35 -0
- package/src/utils/load-script.ts +30 -0
- package/src/utils/split-uniforms-and-bindings.ts +31 -0
- package/src/utils/uid.ts +16 -0
- package/dist/adapter/objects/constants-to-keys.d.ts +0 -3
- package/dist/adapter/objects/constants-to-keys.d.ts.map +0 -1
- package/dist/adapter/objects/constants-to-keys.js +0 -22
- package/dist/adapter/objects/webgl-renderbuffer.d.ts +0 -43
- package/dist/adapter/objects/webgl-renderbuffer.d.ts.map +0 -1
- package/dist/adapter/objects/webgl-renderbuffer.js +0 -95
- package/dist/adapter/objects/webgl-resource.d.ts +0 -32
- package/dist/adapter/objects/webgl-resource.d.ts.map +0 -1
- package/dist/adapter/objects/webgl-resource.js +0 -114
- package/dist/context/state-tracker/track-context-state.d.ts +0 -22
- package/dist/context/state-tracker/track-context-state.d.ts.map +0 -1
- package/src/adapter/objects/constants-to-keys.ts +0 -27
- package/src/adapter/objects/webgl-renderbuffer.ts +0 -132
- 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
|
|
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 {
|
|
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 =
|
|
81
|
-
const 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 =
|
|
162
|
-
|
|
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.
|
|
269
|
+
textureTarget = texture.glTarget;
|
|
272
270
|
} else {
|
|
273
271
|
throw new Error('invalid destination');
|
|
274
272
|
}
|