@luma.gl/webgl 9.1.0-alpha.9 → 9.1.0-beta.3
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 +3 -3
- package/dist/adapter/converters/device-parameters.d.ts.map +1 -1
- package/dist/adapter/converters/device-parameters.js +1 -0
- package/dist/adapter/converters/device-parameters.js.map +1 -0
- package/dist/adapter/converters/sampler-parameters.js +7 -4
- package/dist/adapter/converters/sampler-parameters.js.map +1 -0
- package/dist/adapter/converters/shader-formats.js +1 -0
- package/dist/adapter/converters/shader-formats.js.map +1 -0
- package/dist/adapter/converters/vertex-formats.js +1 -0
- package/dist/adapter/converters/vertex-formats.js.map +1 -0
- package/dist/adapter/converters/webgl-texture-table.d.ts +40 -0
- package/dist/adapter/converters/webgl-texture-table.d.ts.map +1 -0
- package/dist/adapter/converters/webgl-texture-table.js +304 -0
- package/dist/adapter/converters/webgl-texture-table.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 +2 -2
- package/dist/adapter/device-helpers/webgl-device-features.js.map +1 -0
- package/dist/adapter/device-helpers/webgl-device-info.js +1 -0
- package/dist/adapter/device-helpers/webgl-device-info.js.map +1 -0
- package/dist/adapter/device-helpers/webgl-device-limits.js +1 -0
- package/dist/adapter/device-helpers/webgl-device-limits.js.map +1 -0
- package/dist/adapter/helpers/decode-webgl-types.js +1 -0
- package/dist/adapter/helpers/decode-webgl-types.js.map +1 -0
- package/dist/adapter/helpers/format-utils.d.ts.map +1 -0
- package/dist/{classic → adapter/helpers}/format-utils.js +7 -0
- package/dist/adapter/helpers/format-utils.js.map +1 -0
- package/dist/adapter/helpers/get-shader-layout.d.ts +1 -1
- package/dist/adapter/helpers/get-shader-layout.d.ts.map +1 -1
- package/dist/adapter/helpers/get-shader-layout.js +5 -4
- package/dist/adapter/helpers/get-shader-layout.js.map +1 -0
- package/dist/adapter/helpers/parse-shader-compiler-log.js +1 -0
- package/dist/adapter/helpers/parse-shader-compiler-log.js.map +1 -0
- package/dist/adapter/helpers/set-uniform.js +1 -0
- package/dist/adapter/helpers/set-uniform.js.map +1 -0
- package/dist/adapter/helpers/typed-array-utils.d.ts.map +1 -0
- package/dist/{classic → adapter/helpers}/typed-array-utils.js +1 -0
- package/dist/adapter/helpers/typed-array-utils.js.map +1 -0
- package/dist/adapter/helpers/webgl-texture-utils.d.ts +96 -25
- package/dist/adapter/helpers/webgl-texture-utils.d.ts.map +1 -1
- package/dist/adapter/helpers/webgl-texture-utils.js +225 -236
- package/dist/adapter/helpers/webgl-texture-utils.js.map +1 -0
- package/dist/adapter/helpers/webgl-topology-utils.js +1 -0
- package/dist/adapter/helpers/webgl-topology-utils.js.map +1 -0
- package/dist/adapter/resources/webgl-buffer.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-buffer.js +4 -1
- package/dist/adapter/resources/webgl-buffer.js.map +1 -0
- package/dist/adapter/resources/webgl-command-buffer.d.ts +59 -2
- package/dist/adapter/resources/webgl-command-buffer.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-command-buffer.js +89 -32
- package/dist/adapter/resources/webgl-command-buffer.js.map +1 -0
- package/dist/adapter/resources/webgl-command-encoder.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-command-encoder.js +4 -0
- package/dist/adapter/resources/webgl-command-encoder.js.map +1 -0
- package/dist/adapter/resources/webgl-external-texture.js +15 -0
- package/dist/adapter/resources/webgl-external-texture.js.map +1 -0
- package/dist/adapter/resources/webgl-framebuffer.d.ts +33 -35
- package/dist/adapter/resources/webgl-framebuffer.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-framebuffer.js +70 -75
- package/dist/adapter/resources/webgl-framebuffer.js.map +1 -0
- package/dist/adapter/resources/webgl-query-set.js +1 -0
- package/dist/adapter/resources/webgl-query-set.js.map +1 -0
- package/dist/adapter/resources/webgl-render-pass.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-render-pass.js +33 -18
- package/dist/adapter/resources/webgl-render-pass.js.map +1 -0
- package/dist/adapter/resources/webgl-render-pipeline.d.ts +3 -4
- package/dist/adapter/resources/webgl-render-pipeline.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-render-pipeline.js +44 -22
- package/dist/adapter/resources/webgl-render-pipeline.js.map +1 -0
- package/dist/adapter/resources/webgl-sampler.js +1 -0
- package/dist/adapter/resources/webgl-sampler.js.map +1 -0
- package/dist/adapter/resources/webgl-shader.d.ts +1 -0
- package/dist/adapter/resources/webgl-shader.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-shader.js +13 -6
- package/dist/adapter/resources/webgl-shader.js.map +1 -0
- package/dist/adapter/resources/webgl-texture-view.js +1 -0
- package/dist/adapter/resources/webgl-texture-view.js.map +1 -0
- package/dist/adapter/resources/webgl-texture.d.ts +32 -20
- package/dist/adapter/resources/webgl-texture.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-texture.js +163 -218
- package/dist/adapter/resources/webgl-texture.js.map +1 -0
- package/dist/adapter/resources/webgl-transform-feedback.js +1 -0
- package/dist/adapter/resources/webgl-transform-feedback.js.map +1 -0
- package/dist/adapter/resources/webgl-vertex-array.js +1 -0
- package/dist/adapter/resources/webgl-vertex-array.js.map +1 -0
- package/dist/adapter/webgl-adapter.d.ts.map +1 -1
- package/dist/adapter/webgl-adapter.js +5 -10
- package/dist/adapter/webgl-adapter.js.map +1 -0
- package/dist/adapter/webgl-canvas-context.d.ts +4 -6
- package/dist/adapter/webgl-canvas-context.d.ts.map +1 -1
- package/dist/adapter/webgl-canvas-context.js +13 -17
- package/dist/adapter/webgl-canvas-context.js.map +1 -0
- package/dist/adapter/webgl-device.d.ts +20 -19
- package/dist/adapter/webgl-device.d.ts.map +1 -1
- package/dist/adapter/webgl-device.js +75 -51
- package/dist/adapter/webgl-device.js.map +1 -0
- package/dist/context/debug/spector-types.js +2 -1
- package/dist/context/debug/spector-types.js.map +1 -0
- package/dist/context/debug/spector.d.ts +5 -5
- package/dist/context/debug/spector.d.ts.map +1 -1
- package/dist/context/debug/spector.js +7 -6
- package/dist/context/debug/spector.js.map +1 -0
- package/dist/context/debug/webgl-developer-tools.d.ts +2 -3
- package/dist/context/debug/webgl-developer-tools.d.ts.map +1 -1
- package/dist/context/debug/webgl-developer-tools.js +7 -19
- package/dist/context/debug/webgl-developer-tools.js.map +1 -0
- package/dist/context/helpers/create-browser-context.d.ts +6 -22
- package/dist/context/helpers/create-browser-context.d.ts.map +1 -1
- package/dist/context/helpers/create-browser-context.js +41 -32
- package/dist/context/helpers/create-browser-context.js.map +1 -0
- package/dist/context/helpers/webgl-context-data.js +1 -0
- package/dist/context/helpers/webgl-context-data.js.map +1 -0
- package/dist/context/helpers/webgl-extensions.js +1 -0
- package/dist/context/helpers/webgl-extensions.js.map +1 -0
- package/dist/context/parameters/unified-parameter-api.js +1 -0
- package/dist/context/parameters/unified-parameter-api.js.map +1 -0
- 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 +3 -2
- package/dist/context/parameters/webgl-parameter-tables.js.map +1 -0
- package/dist/context/polyfills/polyfill-webgl1-extensions.js +1 -0
- package/dist/context/polyfills/polyfill-webgl1-extensions.js.map +1 -0
- package/dist/context/state-tracker/deep-array-equal.js +1 -0
- package/dist/context/state-tracker/deep-array-equal.js.map +1 -0
- package/dist/context/state-tracker/webgl-state-tracker.js +1 -0
- package/dist/context/state-tracker/webgl-state-tracker.js.map +1 -0
- package/dist/context/state-tracker/with-parameters.js +1 -0
- package/dist/context/state-tracker/with-parameters.js.map +1 -0
- package/dist/deprecated/accessor.d.ts.map +1 -0
- package/dist/{classic → deprecated}/accessor.js +37 -1
- package/dist/deprecated/accessor.js.map +1 -0
- package/dist/dist.dev.js +2234 -2373
- package/dist/dist.min.js +2 -2
- package/dist/index.cjs +2124 -2256
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -4
- package/dist/index.js.map +1 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/fill-array.d.ts +4 -4
- package/dist/utils/fill-array.d.ts.map +1 -1
- package/dist/utils/fill-array.js +1 -0
- package/dist/utils/fill-array.js.map +1 -0
- package/dist/utils/load-script.js +1 -0
- package/dist/utils/load-script.js.map +1 -0
- package/dist/utils/split-uniforms-and-bindings.d.ts +1 -1
- package/dist/utils/split-uniforms-and-bindings.d.ts.map +1 -1
- package/dist/utils/split-uniforms-and-bindings.js +1 -0
- package/dist/utils/split-uniforms-and-bindings.js.map +1 -0
- package/dist/utils/uid.js +1 -0
- package/dist/utils/uid.js.map +1 -0
- package/package.json +5 -5
- package/src/adapter/converters/device-parameters.ts +3 -3
- package/src/adapter/converters/sampler-parameters.ts +6 -4
- package/src/adapter/converters/webgl-texture-table.ts +404 -0
- package/src/adapter/device-helpers/webgl-device-features.ts +5 -2
- package/src/{classic → adapter/helpers}/format-utils.ts +6 -0
- package/src/adapter/helpers/get-shader-layout.ts +7 -4
- package/src/adapter/helpers/webgl-texture-utils.ts +400 -57
- package/src/adapter/resources/webgl-buffer.ts +3 -1
- package/src/adapter/resources/webgl-command-buffer.ts +125 -41
- package/src/adapter/resources/webgl-command-encoder.ts +6 -0
- package/src/adapter/resources/webgl-external-texture.ts +14 -0
- package/src/adapter/resources/webgl-framebuffer.ts +79 -85
- package/src/adapter/resources/webgl-render-pass.ts +56 -42
- package/src/adapter/resources/webgl-render-pipeline.ts +56 -26
- package/src/adapter/resources/webgl-shader.ts +15 -7
- package/src/adapter/resources/webgl-texture.ts +188 -250
- package/src/adapter/webgl-adapter.ts +4 -12
- package/src/adapter/webgl-canvas-context.ts +16 -19
- package/src/adapter/webgl-device.ts +125 -88
- package/src/context/debug/spector-types.ts +1 -1
- package/src/context/debug/spector.ts +11 -11
- package/src/context/debug/webgl-developer-tools.ts +8 -31
- package/src/context/helpers/create-browser-context.ts +53 -63
- package/src/context/parameters/webgl-parameter-tables.ts +2 -2
- package/src/{classic → deprecated}/accessor.ts +44 -3
- package/src/index.ts +2 -5
- package/src/utils/fill-array.ts +4 -4
- package/src/utils/split-uniforms-and-bindings.ts +3 -3
- package/dist/adapter/converters/texture-formats.d.ts +0 -83
- package/dist/adapter/converters/texture-formats.d.ts.map +0 -1
- package/dist/adapter/converters/texture-formats.js +0 -511
- package/dist/classic/accessor.d.ts.map +0 -1
- package/dist/classic/clear.d.ts +0 -22
- package/dist/classic/clear.d.ts.map +0 -1
- package/dist/classic/clear.js +0 -86
- package/dist/classic/copy-and-blit.d.ts +0 -64
- package/dist/classic/copy-and-blit.d.ts.map +0 -1
- package/dist/classic/copy-and-blit.js +0 -194
- package/dist/classic/format-utils.d.ts.map +0 -1
- package/dist/classic/typed-array-utils.d.ts.map +0 -1
- package/src/adapter/converters/texture-formats.ts +0 -657
- package/src/classic/clear.ts +0 -115
- package/src/classic/copy-and-blit.ts +0 -323
- /package/dist/{classic → adapter/helpers}/format-utils.d.ts +0 -0
- /package/dist/{classic → adapter/helpers}/typed-array-utils.d.ts +0 -0
- /package/dist/{classic → deprecated}/accessor.d.ts +0 -0
- /package/src/{classic → adapter/helpers}/typed-array-utils.ts +0 -0
|
@@ -2,20 +2,15 @@
|
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
|
|
5
|
-
import {NumericArray} from '@math.gl/types';
|
|
5
|
+
import {NumericArray, NumberArray4} from '@math.gl/types';
|
|
6
6
|
import {RenderPass, RenderPassProps, RenderPassParameters} from '@luma.gl/core';
|
|
7
7
|
import {WebGLDevice} from '../webgl-device';
|
|
8
8
|
import {GL, GLParameters} from '@luma.gl/constants';
|
|
9
9
|
import {withGLParameters} from '../../context/state-tracker/with-parameters';
|
|
10
10
|
import {setGLParameters} from '../../context/parameters/unified-parameter-api';
|
|
11
11
|
import {WEBGLQuerySet} from './webgl-query-set';
|
|
12
|
+
import {WEBGLFramebuffer} from './webgl-framebuffer';
|
|
12
13
|
|
|
13
|
-
// Should collapse during minification
|
|
14
|
-
const GL_DEPTH_BUFFER_BIT = 0x00000100;
|
|
15
|
-
const GL_STENCIL_BUFFER_BIT = 0x00000400;
|
|
16
|
-
const GL_COLOR_BUFFER_BIT = 0x00004000;
|
|
17
|
-
|
|
18
|
-
const GL_COLOR = 0x1800;
|
|
19
14
|
const COLOR_CHANNELS = [0x1, 0x2, 0x4, 0x8]; // GPUColorWrite RED, GREEN, BLUE, ALPHA
|
|
20
15
|
|
|
21
16
|
export class WEBGLRenderPass extends RenderPass {
|
|
@@ -37,7 +32,7 @@ export class WEBGLRenderPass extends RenderPass {
|
|
|
37
32
|
viewport = [0, 0, width, height];
|
|
38
33
|
} else {
|
|
39
34
|
// Instead of using our own book-keeping, we can just read the values from the WebGL context
|
|
40
|
-
const [width, height] = device.
|
|
35
|
+
const [width, height] = device.getDefaultCanvasContext().getDrawingBufferSize();
|
|
41
36
|
viewport = [0, 0, width, height];
|
|
42
37
|
}
|
|
43
38
|
}
|
|
@@ -46,6 +41,18 @@ export class WEBGLRenderPass extends RenderPass {
|
|
|
46
41
|
this.device.pushState();
|
|
47
42
|
this.setParameters({viewport, ...this.props.parameters});
|
|
48
43
|
|
|
44
|
+
// Specify mapping of draw buffer locations to color attachments
|
|
45
|
+
const webglFramebuffer = this.props.framebuffer as WEBGLFramebuffer;
|
|
46
|
+
// Default framebuffers can only be set to GL.BACK or GL.NONE
|
|
47
|
+
if (webglFramebuffer?.handle) {
|
|
48
|
+
const drawBuffers = this.props.framebuffer.colorAttachments.map(
|
|
49
|
+
(_, i) => GL.COLOR_ATTACHMENT0 + i
|
|
50
|
+
);
|
|
51
|
+
this.device.gl.drawBuffers(drawBuffers);
|
|
52
|
+
} else {
|
|
53
|
+
this.device.gl.drawBuffers([GL.BACK]);
|
|
54
|
+
}
|
|
55
|
+
|
|
49
56
|
// Hack - for now WebGL draws in "immediate mode" (instead of queueing the operations)...
|
|
50
57
|
this.clear();
|
|
51
58
|
}
|
|
@@ -85,11 +92,11 @@ export class WEBGLRenderPass extends RenderPass {
|
|
|
85
92
|
if (parameters.viewport) {
|
|
86
93
|
// WebGPU viewports are 6 coordinates (X, Y, Z)
|
|
87
94
|
if (parameters.viewport.length >= 6) {
|
|
88
|
-
glParameters.viewport = parameters.viewport.slice(0, 4);
|
|
95
|
+
glParameters.viewport = parameters.viewport.slice(0, 4) as NumberArray4;
|
|
89
96
|
glParameters.depthRange = [parameters.viewport[4], parameters.viewport[5]];
|
|
90
97
|
} else {
|
|
91
98
|
// WebGL viewports are 4 coordinates (X, Y)
|
|
92
|
-
glParameters.viewport = parameters.viewport;
|
|
99
|
+
glParameters.viewport = parameters.viewport as NumberArray4;
|
|
93
100
|
}
|
|
94
101
|
}
|
|
95
102
|
if (parameters.scissorRect) {
|
|
@@ -138,16 +145,24 @@ export class WEBGLRenderPass extends RenderPass {
|
|
|
138
145
|
|
|
139
146
|
let clearMask = 0;
|
|
140
147
|
|
|
141
|
-
if (this.props.
|
|
142
|
-
|
|
148
|
+
if (this.props.clearColors) {
|
|
149
|
+
this.props.clearColors.forEach((color, drawBufferIndex) => {
|
|
150
|
+
if (color) {
|
|
151
|
+
this.clearColorBuffer(drawBufferIndex, color);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (this.props.clearColor !== false && this.props.clearColors === undefined) {
|
|
157
|
+
clearMask |= GL.COLOR_BUFFER_BIT;
|
|
143
158
|
glParameters.clearColor = this.props.clearColor;
|
|
144
159
|
}
|
|
145
160
|
if (this.props.clearDepth !== false) {
|
|
146
|
-
clearMask |=
|
|
161
|
+
clearMask |= GL.DEPTH_BUFFER_BIT;
|
|
147
162
|
glParameters.clearDepth = this.props.clearDepth;
|
|
148
163
|
}
|
|
149
164
|
if (this.props.clearStencil !== false) {
|
|
150
|
-
clearMask |=
|
|
165
|
+
clearMask |= GL.STENCIL_BUFFER_BIT;
|
|
151
166
|
glParameters.clearStencil = this.props.clearStencil;
|
|
152
167
|
}
|
|
153
168
|
|
|
@@ -156,11 +171,6 @@ export class WEBGLRenderPass extends RenderPass {
|
|
|
156
171
|
withGLParameters(this.device.gl, glParameters, () => {
|
|
157
172
|
this.device.gl.clear(clearMask);
|
|
158
173
|
});
|
|
159
|
-
|
|
160
|
-
// TODO - clear multiple color attachments
|
|
161
|
-
// for (attachment of this.framebuffer.colorAttachments) {
|
|
162
|
-
// this.clearColorBuffer
|
|
163
|
-
// }
|
|
164
174
|
}
|
|
165
175
|
}
|
|
166
176
|
|
|
@@ -171,40 +181,44 @@ export class WEBGLRenderPass extends RenderPass {
|
|
|
171
181
|
withGLParameters(this.device.gl, {framebuffer: this.props.framebuffer}, () => {
|
|
172
182
|
// Method selection per OpenGL ES 3 docs
|
|
173
183
|
switch (value.constructor) {
|
|
184
|
+
case Int8Array:
|
|
185
|
+
case Int16Array:
|
|
174
186
|
case Int32Array:
|
|
175
|
-
this.device.gl.clearBufferiv(
|
|
187
|
+
this.device.gl.clearBufferiv(GL.COLOR, drawBuffer, value);
|
|
176
188
|
break;
|
|
189
|
+
case Uint8Array:
|
|
190
|
+
case Uint8ClampedArray:
|
|
191
|
+
case Uint16Array:
|
|
177
192
|
case Uint32Array:
|
|
178
|
-
this.device.gl.clearBufferuiv(
|
|
193
|
+
this.device.gl.clearBufferuiv(GL.COLOR, drawBuffer, value);
|
|
179
194
|
break;
|
|
180
195
|
case Float32Array:
|
|
181
|
-
|
|
182
|
-
this.device.gl.clearBufferfv(GL_COLOR, drawBuffer, value);
|
|
196
|
+
this.device.gl.clearBufferfv(GL.COLOR, drawBuffer, value);
|
|
183
197
|
break;
|
|
198
|
+
default:
|
|
199
|
+
throw new Error('clearColorBuffer: color must be typed array');
|
|
184
200
|
}
|
|
185
201
|
});
|
|
186
202
|
}
|
|
187
203
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
// case GL_DEPTH:
|
|
194
|
-
// this.device.gl.clearBufferfv(GL_DEPTH, 0, [value]);
|
|
195
|
-
// break;
|
|
204
|
+
/*
|
|
205
|
+
clearDepthStencil() {
|
|
206
|
+
case GL.DEPTH:
|
|
207
|
+
this.device.gl.clearBufferfv(GL.DEPTH, 0, [value]);
|
|
208
|
+
break;
|
|
196
209
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
210
|
+
case GL_STENCIL:
|
|
211
|
+
this.device.gl.clearBufferiv(GL.STENCIL, 0, [value]);
|
|
212
|
+
break;
|
|
200
213
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
214
|
+
case GL.DEPTH_STENCIL:
|
|
215
|
+
const [depth, stencil] = value;
|
|
216
|
+
this.device.gl.clearBufferfi(GL.DEPTH_STENCIL, 0, depth, stencil);
|
|
217
|
+
break;
|
|
205
218
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
219
|
+
default:
|
|
220
|
+
assert(false, ERR_ARGUMENTS);
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
*/
|
|
210
224
|
}
|
|
@@ -2,14 +2,21 @@
|
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
|
|
5
|
-
import type {
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
import type {
|
|
6
|
+
RenderPipelineProps,
|
|
7
|
+
RenderPipelineParameters,
|
|
8
|
+
PrimitiveTopology,
|
|
9
|
+
ShaderLayout,
|
|
10
|
+
UniformValue,
|
|
11
|
+
Binding,
|
|
12
|
+
RenderPass,
|
|
13
|
+
VertexArray
|
|
14
|
+
} from '@luma.gl/core';
|
|
8
15
|
import {RenderPipeline, log} from '@luma.gl/core';
|
|
9
16
|
// import {getAttributeInfosFromLayouts} from '@luma.gl/core';
|
|
10
17
|
import {GL} from '@luma.gl/constants';
|
|
11
18
|
|
|
12
|
-
import {
|
|
19
|
+
import {getShaderLayoutFromGLSL} from '../helpers/get-shader-layout';
|
|
13
20
|
import {withDeviceAndGLParameters} from '../converters/device-parameters';
|
|
14
21
|
import {setUniform} from '../helpers/set-uniform';
|
|
15
22
|
import {splitUniformsAndBindings} from '../../utils/split-uniforms-and-bindings';
|
|
@@ -50,11 +57,15 @@ export class WEBGLRenderPipeline extends RenderPipeline {
|
|
|
50
57
|
_uniformCount: number = 0;
|
|
51
58
|
_uniformSetters: Record<string, Function> = {}; // TODO are these used?
|
|
52
59
|
|
|
60
|
+
override get [Symbol.toStringTag]() {
|
|
61
|
+
return 'WEBGLRenderPipeline';
|
|
62
|
+
}
|
|
63
|
+
|
|
53
64
|
constructor(device: WebGLDevice, props: RenderPipelineProps) {
|
|
54
65
|
super(device, props);
|
|
55
66
|
this.device = device;
|
|
56
67
|
this.handle = this.props.handle || this.device.gl.createProgram();
|
|
57
|
-
this.device.
|
|
68
|
+
this.device._setWebGLDebugMetadata(this.handle, this, {spector: {id: this.props.id}});
|
|
58
69
|
|
|
59
70
|
// Create shaders if needed
|
|
60
71
|
this.vs = props.vs as WEBGLShader;
|
|
@@ -71,10 +82,9 @@ export class WEBGLRenderPipeline extends RenderPipeline {
|
|
|
71
82
|
}
|
|
72
83
|
|
|
73
84
|
this._linkShaders();
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
log.timeEnd(1, `RenderPipeline ${this.id} - shaderLayout introspection`)();
|
|
85
|
+
log.time(3, `RenderPipeline ${this.id} - shaderLayout introspection`)();
|
|
86
|
+
this.introspectedLayout = getShaderLayoutFromGLSL(this.device.gl, this.handle);
|
|
87
|
+
log.timeEnd(3, `RenderPipeline ${this.id} - shaderLayout introspection`)();
|
|
78
88
|
|
|
79
89
|
// Merge provided layout with introspected layout
|
|
80
90
|
this.shaderLayout = mergeShaderLayout(this.introspectedLayout, props.shaderLayout);
|
|
@@ -82,9 +92,13 @@ export class WEBGLRenderPipeline extends RenderPipeline {
|
|
|
82
92
|
|
|
83
93
|
override destroy(): void {
|
|
84
94
|
if (this.handle) {
|
|
95
|
+
// log.error(`Deleting program ${this.id}`)();
|
|
96
|
+
this.device.gl.useProgram(null);
|
|
85
97
|
this.device.gl.deleteProgram(this.handle);
|
|
86
|
-
// this.handle = null;
|
|
87
98
|
this.destroyed = true;
|
|
99
|
+
// @ts-expect-error
|
|
100
|
+
this.handle.destroyed = true;
|
|
101
|
+
this.handle = null;
|
|
88
102
|
}
|
|
89
103
|
}
|
|
90
104
|
|
|
@@ -103,12 +117,12 @@ export class WEBGLRenderPipeline extends RenderPipeline {
|
|
|
103
117
|
// and reference them as `app` from both GLSL and JS.
|
|
104
118
|
// TODO - this is rather hacky - we could also remap the name directly in the shader layout.
|
|
105
119
|
const binding =
|
|
106
|
-
this.shaderLayout.bindings.find(
|
|
107
|
-
this.shaderLayout.bindings.find(
|
|
120
|
+
this.shaderLayout.bindings.find(binding_ => binding_.name === name) ||
|
|
121
|
+
this.shaderLayout.bindings.find(binding_ => binding_.name === `${name}Uniforms`);
|
|
108
122
|
|
|
109
123
|
if (!binding) {
|
|
110
124
|
const validBindings = this.shaderLayout.bindings
|
|
111
|
-
.map(
|
|
125
|
+
.map(binding_ => `"${binding_.name}"`)
|
|
112
126
|
.join(', ');
|
|
113
127
|
if (!options?.disableWarnings) {
|
|
114
128
|
log.warn(
|
|
@@ -310,22 +324,37 @@ export class WEBGLRenderPipeline extends RenderPipeline {
|
|
|
310
324
|
}
|
|
311
325
|
|
|
312
326
|
/** Report link status. First, check for shader compilation failures if linking fails */
|
|
313
|
-
_reportLinkStatus(status: 'success' | 'linking' | 'validation') {
|
|
327
|
+
async _reportLinkStatus(status: 'success' | 'linking' | 'validation'): Promise<void> {
|
|
314
328
|
switch (status) {
|
|
315
329
|
case 'success':
|
|
316
330
|
return;
|
|
317
331
|
|
|
318
332
|
default:
|
|
319
333
|
// First check for shader compilation failures if linking fails
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
334
|
+
switch (this.vs.compilationStatus) {
|
|
335
|
+
case 'error':
|
|
336
|
+
this.vs.debugShader();
|
|
337
|
+
throw new Error(`Error during compilation of shader ${this.vs.id}`);
|
|
338
|
+
case 'pending':
|
|
339
|
+
this.vs.asyncCompilationStatus.then(() => this.vs.debugShader());
|
|
340
|
+
break;
|
|
341
|
+
case 'success':
|
|
342
|
+
break;
|
|
323
343
|
}
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
344
|
+
|
|
345
|
+
switch (this.fs?.compilationStatus) {
|
|
346
|
+
case 'error':
|
|
347
|
+
this.fs.debugShader();
|
|
348
|
+
throw new Error(`Error during compilation of shader ${this.fs.id}`);
|
|
349
|
+
case 'pending':
|
|
350
|
+
this.fs.asyncCompilationStatus.then(() => this.fs.debugShader());
|
|
351
|
+
break;
|
|
352
|
+
case 'success':
|
|
353
|
+
break;
|
|
327
354
|
}
|
|
328
|
-
|
|
355
|
+
|
|
356
|
+
const linkErrorLog = this.device.gl.getProgramInfoLog(this.handle);
|
|
357
|
+
throw new Error(`Error during ${status}: ${linkErrorLog}`);
|
|
329
358
|
}
|
|
330
359
|
}
|
|
331
360
|
|
|
@@ -392,11 +421,12 @@ export class WEBGLRenderPipeline extends RenderPipeline {
|
|
|
392
421
|
}
|
|
393
422
|
}
|
|
394
423
|
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
}
|
|
424
|
+
// TODO - remove this should be handled by ExternalTexture
|
|
425
|
+
// for (const [, texture] of Object.entries(this.bindings)) {
|
|
426
|
+
// if (texture instanceof WEBGLTexture) {
|
|
427
|
+
// texture.update();
|
|
428
|
+
// }
|
|
429
|
+
// }
|
|
400
430
|
|
|
401
431
|
return texturesRenderable;
|
|
402
432
|
}
|
|
@@ -27,6 +27,10 @@ export class WEBGLShader extends Shader {
|
|
|
27
27
|
default:
|
|
28
28
|
throw new Error(this.props.stage);
|
|
29
29
|
}
|
|
30
|
+
|
|
31
|
+
// default framebuffer handle is null, so we can't set spector metadata...
|
|
32
|
+
device._setWebGLDebugMetadata(this.handle, this, {spector: this.props});
|
|
33
|
+
|
|
30
34
|
this._compile(this.source);
|
|
31
35
|
}
|
|
32
36
|
|
|
@@ -34,19 +38,25 @@ export class WEBGLShader extends Shader {
|
|
|
34
38
|
if (this.handle) {
|
|
35
39
|
this.removeStats();
|
|
36
40
|
this.device.gl.deleteShader(this.handle);
|
|
37
|
-
// this.handle = null;
|
|
38
41
|
this.destroyed = true;
|
|
42
|
+
// @ts-expect-error
|
|
43
|
+
this.handle.destroyed = true;
|
|
44
|
+
// this.handle = null;
|
|
39
45
|
}
|
|
40
46
|
}
|
|
41
47
|
|
|
48
|
+
get asyncCompilationStatus(): Promise<'pending' | 'success' | 'error'> {
|
|
49
|
+
return this._waitForCompilationComplete().then(() => this.compilationStatus);
|
|
50
|
+
}
|
|
51
|
+
|
|
42
52
|
override async getCompilationInfo(): Promise<readonly CompilerMessage[]> {
|
|
43
53
|
await this._waitForCompilationComplete();
|
|
44
54
|
return this.getCompilationInfoSync();
|
|
45
55
|
}
|
|
46
56
|
|
|
47
57
|
override getCompilationInfoSync(): readonly CompilerMessage[] {
|
|
48
|
-
const
|
|
49
|
-
return
|
|
58
|
+
const shaderLog = this.device.gl.getShaderInfoLog(this.handle);
|
|
59
|
+
return shaderLog ? parseShaderCompilerLog(shaderLog) : [];
|
|
50
60
|
}
|
|
51
61
|
|
|
52
62
|
override getTranslatedSource(): string | null {
|
|
@@ -59,16 +69,14 @@ export class WEBGLShader extends Shader {
|
|
|
59
69
|
|
|
60
70
|
/** Compile a shader and get compilation status */
|
|
61
71
|
protected async _compile(source: string): Promise<void> {
|
|
62
|
-
|
|
63
|
-
source.startsWith('#version ') ? source : `#version 300 es\n${source}`;
|
|
64
|
-
source = addGLSLVersion(source);
|
|
72
|
+
source = source.startsWith('#version ') ? source : `#version 300 es\n${source}`;
|
|
65
73
|
|
|
66
74
|
const {gl} = this.device;
|
|
67
75
|
gl.shaderSource(this.handle, source);
|
|
68
76
|
gl.compileShader(this.handle);
|
|
69
77
|
|
|
70
78
|
// For performance reasons, avoid checking shader compilation errors on production
|
|
71
|
-
if (
|
|
79
|
+
if (!this.device.props.debug) {
|
|
72
80
|
this.compilationStatus = 'pending';
|
|
73
81
|
return;
|
|
74
82
|
}
|