@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.
- package/dist/adapter/converters/device-parameters.js +14 -9
- package/dist/adapter/converters/device-parameters.js.map +1 -1
- package/dist/adapter/converters/shader-formats.d.ts +67 -8
- package/dist/adapter/converters/shader-formats.d.ts.map +1 -1
- package/dist/adapter/converters/shader-formats.js +82 -52
- package/dist/adapter/converters/shader-formats.js.map +1 -1
- package/dist/adapter/converters/webgl-shadertypes.d.ts +20 -0
- package/dist/adapter/converters/webgl-shadertypes.d.ts.map +1 -0
- package/dist/adapter/converters/webgl-shadertypes.js +123 -0
- package/dist/adapter/converters/webgl-shadertypes.js.map +1 -0
- package/dist/adapter/converters/webgl-texture-table.js +5 -5
- package/dist/adapter/converters/webgl-texture-table.js.map +1 -1
- package/dist/adapter/converters/{vertex-formats.d.ts → webgl-vertex-formats.d.ts} +4 -4
- package/dist/adapter/converters/webgl-vertex-formats.d.ts.map +1 -0
- package/dist/adapter/converters/{vertex-formats.js → webgl-vertex-formats.js} +1 -1
- package/dist/adapter/converters/webgl-vertex-formats.js.map +1 -0
- package/dist/adapter/device-helpers/webgl-device-features.d.ts.map +1 -1
- package/dist/adapter/device-helpers/webgl-device-features.js.map +1 -1
- package/dist/adapter/device-helpers/webgl-device-limits.d.ts +1 -1
- package/dist/adapter/device-helpers/webgl-device-limits.d.ts.map +1 -1
- package/dist/adapter/device-helpers/webgl-device-limits.js +1 -1
- package/dist/adapter/device-helpers/webgl-device-limits.js.map +1 -1
- package/dist/adapter/helpers/format-utils.d.ts +3 -2
- package/dist/adapter/helpers/format-utils.d.ts.map +1 -1
- package/dist/adapter/helpers/format-utils.js.map +1 -1
- package/dist/adapter/helpers/{get-shader-layout.d.ts → get-shader-layout-from-glsl.d.ts} +1 -1
- package/dist/adapter/helpers/get-shader-layout-from-glsl.d.ts.map +1 -0
- package/dist/adapter/helpers/{get-shader-layout.js → get-shader-layout-from-glsl.js} +12 -35
- package/dist/adapter/helpers/get-shader-layout-from-glsl.js.map +1 -0
- package/dist/adapter/helpers/set-uniform.d.ts +2 -2
- package/dist/adapter/helpers/set-uniform.d.ts.map +1 -1
- package/dist/adapter/helpers/set-uniform.js.map +1 -1
- package/dist/adapter/helpers/webgl-texture-utils.d.ts +2 -25
- package/dist/adapter/helpers/webgl-texture-utils.d.ts.map +1 -1
- package/dist/adapter/helpers/webgl-texture-utils.js +10 -99
- package/dist/adapter/helpers/webgl-texture-utils.js.map +1 -1
- 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-buffer.js.map +1 -1
- package/dist/adapter/resources/webgl-command-buffer.d.ts +2 -2
- package/dist/adapter/resources/webgl-command-buffer.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-command-buffer.js +4 -4
- package/dist/adapter/resources/webgl-command-buffer.js.map +1 -1
- package/dist/adapter/resources/webgl-command-encoder.d.ts +6 -2
- package/dist/adapter/resources/webgl-command-encoder.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-command-encoder.js +9 -4
- package/dist/adapter/resources/webgl-command-encoder.js.map +1 -1
- package/dist/adapter/resources/webgl-external-texture.js +1 -0
- package/dist/adapter/resources/webgl-external-texture.js.map +1 -1
- package/dist/adapter/resources/webgl-query-set.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-query-set.js +5 -1
- package/dist/adapter/resources/webgl-query-set.js.map +1 -1
- package/dist/adapter/resources/webgl-render-pass.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-render-pass.js +8 -5
- package/dist/adapter/resources/webgl-render-pass.js.map +1 -1
- package/dist/adapter/resources/webgl-render-pipeline.d.ts +2 -3
- package/dist/adapter/resources/webgl-render-pipeline.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-render-pipeline.js +16 -20
- package/dist/adapter/resources/webgl-render-pipeline.js.map +1 -1
- package/dist/adapter/resources/webgl-sampler.js +1 -1
- package/dist/adapter/resources/webgl-sampler.js.map +1 -1
- package/dist/adapter/resources/webgl-shader.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-shader.js +4 -1
- package/dist/adapter/resources/webgl-shader.js.map +1 -1
- package/dist/adapter/resources/webgl-texture-view.js +1 -1
- package/dist/adapter/resources/webgl-texture-view.js.map +1 -1
- package/dist/adapter/resources/webgl-texture.d.ts +21 -66
- package/dist/adapter/resources/webgl-texture.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-texture.js +148 -324
- package/dist/adapter/resources/webgl-texture.js.map +1 -1
- package/dist/adapter/resources/webgl-transform-feedback.d.ts +1 -1
- package/dist/adapter/resources/webgl-transform-feedback.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-transform-feedback.js +1 -1
- package/dist/adapter/resources/webgl-transform-feedback.js.map +1 -1
- package/dist/adapter/resources/webgl-vertex-array.d.ts +1 -1
- package/dist/adapter/resources/webgl-vertex-array.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-vertex-array.js +3 -2
- package/dist/adapter/resources/webgl-vertex-array.js.map +1 -1
- package/dist/adapter/webgl-adapter.d.ts +4 -3
- package/dist/adapter/webgl-adapter.d.ts.map +1 -1
- package/dist/adapter/webgl-adapter.js +16 -7
- package/dist/adapter/webgl-adapter.js.map +1 -1
- package/dist/adapter/webgl-canvas-context.d.ts +1 -19
- package/dist/adapter/webgl-canvas-context.d.ts.map +1 -1
- package/dist/adapter/webgl-canvas-context.js +3 -31
- package/dist/adapter/webgl-canvas-context.js.map +1 -1
- package/dist/adapter/webgl-device.d.ts +8 -15
- package/dist/adapter/webgl-device.d.ts.map +1 -1
- package/dist/adapter/webgl-device.js +15 -16
- package/dist/adapter/webgl-device.js.map +1 -1
- package/dist/context/debug/spector-types.d.ts.map +1 -1
- package/dist/context/debug/spector-types.js +3 -0
- package/dist/context/debug/spector-types.js.map +1 -1
- package/dist/context/debug/spector.js.map +1 -1
- package/dist/context/debug/webgl-developer-tools.js.map +1 -1
- package/dist/context/helpers/webgl-extensions.d.ts.map +1 -1
- package/dist/context/helpers/webgl-extensions.js +3 -0
- package/dist/context/helpers/webgl-extensions.js.map +1 -1
- package/dist/context/parameters/unified-parameter-api.d.ts.map +1 -1
- package/dist/context/parameters/unified-parameter-api.js +7 -0
- package/dist/context/parameters/unified-parameter-api.js.map +1 -1
- package/dist/context/parameters/webgl-parameter-tables.d.ts +1 -1
- package/dist/context/parameters/webgl-parameter-tables.d.ts.map +1 -1
- package/dist/context/parameters/webgl-parameter-tables.js +1 -0
- package/dist/context/parameters/webgl-parameter-tables.js.map +1 -1
- package/dist/context/polyfills/polyfill-webgl1-extensions.d.ts.map +1 -1
- package/dist/context/polyfills/polyfill-webgl1-extensions.js +1 -0
- package/dist/context/polyfills/polyfill-webgl1-extensions.js.map +1 -1
- package/dist/context/state-tracker/deep-array-equal.d.ts +2 -1
- package/dist/context/state-tracker/deep-array-equal.d.ts.map +1 -1
- package/dist/context/state-tracker/deep-array-equal.js +4 -5
- package/dist/context/state-tracker/deep-array-equal.js.map +1 -1
- package/dist/context/state-tracker/webgl-state-tracker.d.ts.map +1 -1
- package/dist/context/state-tracker/webgl-state-tracker.js +4 -1
- package/dist/context/state-tracker/webgl-state-tracker.js.map +1 -1
- package/dist/context/state-tracker/with-parameters.js.map +1 -1
- package/dist/dist.dev.js +4719 -4777
- package/dist/dist.min.js +2 -2
- package/dist/index.cjs +3848 -3944
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +1 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -3
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/src/adapter/converters/device-parameters.ts +19 -9
- package/src/adapter/converters/shader-formats.ts +50 -24
- package/src/adapter/converters/webgl-shadertypes.ts +152 -0
- package/src/adapter/converters/webgl-texture-table.ts +7 -7
- package/src/adapter/converters/{vertex-formats.ts → webgl-vertex-formats.ts} +3 -3
- package/src/adapter/device-helpers/webgl-device-features.ts +1 -1
- package/src/adapter/device-helpers/webgl-device-limits.ts +1 -1
- package/src/adapter/helpers/format-utils.ts +2 -2
- package/src/adapter/helpers/{get-shader-layout.ts → get-shader-layout-from-glsl.ts} +20 -50
- package/src/adapter/helpers/set-uniform.ts +2 -2
- package/src/adapter/helpers/webgl-texture-utils.ts +12 -127
- package/src/adapter/resources/webgl-buffer.ts +2 -2
- package/src/adapter/resources/webgl-command-buffer.ts +5 -5
- package/src/adapter/resources/webgl-command-encoder.ts +17 -8
- package/src/adapter/resources/webgl-query-set.ts +5 -1
- package/src/adapter/resources/webgl-render-pass.ts +11 -8
- package/src/adapter/resources/webgl-render-pipeline.ts +20 -30
- package/src/adapter/resources/webgl-sampler.ts +1 -1
- package/src/adapter/resources/webgl-shader.ts +4 -1
- package/src/adapter/resources/webgl-texture-view.ts +1 -1
- package/src/adapter/resources/webgl-texture.ts +180 -398
- package/src/adapter/resources/webgl-transform-feedback.ts +2 -2
- package/src/adapter/resources/webgl-vertex-array.ts +4 -3
- package/src/adapter/webgl-adapter.ts +20 -8
- package/src/adapter/webgl-canvas-context.ts +3 -32
- package/src/adapter/webgl-device.ts +21 -25
- package/src/context/debug/spector-types.ts +5 -0
- package/src/context/debug/spector.ts +1 -1
- package/src/context/debug/webgl-developer-tools.ts +8 -3
- package/src/context/helpers/webgl-extensions.ts +3 -0
- package/src/context/parameters/unified-parameter-api.ts +9 -2
- package/src/context/parameters/webgl-parameter-tables.ts +2 -0
- package/src/context/polyfills/polyfill-webgl1-extensions.ts +1 -0
- package/src/context/state-tracker/deep-array-equal.ts +11 -6
- package/src/context/state-tracker/webgl-state-tracker.ts +5 -1
- package/src/context/state-tracker/with-parameters.ts +1 -1
- package/src/index.ts +1 -5
- package/dist/adapter/converters/vertex-formats.d.ts.map +0 -1
- package/dist/adapter/converters/vertex-formats.js.map +0 -1
- package/dist/adapter/helpers/decode-webgl-types.d.ts +0 -26
- package/dist/adapter/helpers/decode-webgl-types.d.ts.map +0 -1
- package/dist/adapter/helpers/decode-webgl-types.js +0 -102
- package/dist/adapter/helpers/decode-webgl-types.js.map +0 -1
- package/dist/adapter/helpers/get-shader-layout.d.ts.map +0 -1
- package/dist/adapter/helpers/get-shader-layout.js.map +0 -1
- package/dist/adapter/helpers/typed-array-utils.d.ts +0 -44
- package/dist/adapter/helpers/typed-array-utils.d.ts.map +0 -1
- package/dist/adapter/helpers/typed-array-utils.js +0 -107
- package/dist/adapter/helpers/typed-array-utils.js.map +0 -1
- package/dist/deprecated/accessor.d.ts +0 -53
- package/dist/deprecated/accessor.d.ts.map +0 -1
- package/dist/deprecated/accessor.js +0 -177
- package/dist/deprecated/accessor.js.map +0 -1
- package/dist/utils/split-uniforms-and-bindings.d.ts +0 -9
- package/dist/utils/split-uniforms-and-bindings.d.ts.map +0 -1
- package/dist/utils/split-uniforms-and-bindings.js +0 -21
- package/dist/utils/split-uniforms-and-bindings.js.map +0 -1
- package/src/adapter/helpers/decode-webgl-types.ts +0 -134
- package/src/adapter/helpers/typed-array-utils.ts +0 -129
- package/src/deprecated/accessor.ts +0 -225
- 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 {
|
|
10
|
-
import
|
|
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 {
|
|
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
|
-
|
|
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?.
|
|
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.
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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():
|
|
34
|
-
this.commandBuffer
|
|
38
|
+
override finish(): WEBGLCommandBuffer {
|
|
39
|
+
return this.commandBuffer;
|
|
35
40
|
}
|
|
36
41
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
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 = [
|
|
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
|
-
|
|
117
|
+
glParameters[GL.STENCIL_REF] = parameters.stencilReference;
|
|
115
118
|
}
|
|
116
119
|
|
|
117
|
-
if (parameters
|
|
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 =
|
|
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(
|
|
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' | '
|
|
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(
|
|
325
|
+
throw new Error(`${this} ${errorType} during compilation of ${this.vs}`);
|
|
338
326
|
case 'pending':
|
|
339
|
-
this.vs.asyncCompilationStatus
|
|
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(
|
|
337
|
+
throw new Error(`${this} ${errorType} during compilation of ${this.fs}`);
|
|
349
338
|
case 'pending':
|
|
350
|
-
this.fs.asyncCompilationStatus
|
|
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
|
-
|
|
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' | '
|
|
356
|
+
_getLinkStatus(): 'success' | 'link-error' | 'validation-error' {
|
|
367
357
|
const {gl} = this.device;
|
|
368
|
-
const linked = gl.getProgramParameter(this.handle,
|
|
358
|
+
const linked = gl.getProgramParameter(this.handle, GL.LINK_STATUS);
|
|
369
359
|
if (!linked) {
|
|
370
360
|
this.linkStatus = 'error';
|
|
371
|
-
return '
|
|
361
|
+
return 'link-error';
|
|
372
362
|
}
|
|
373
363
|
|
|
374
364
|
gl.validateProgram(this.handle);
|
|
375
|
-
const validated = gl.getProgramParameter(this.handle,
|
|
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 =
|
|
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(() =>
|
|
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 {
|
|
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';
|