@luma.gl/webgl 9.0.0-beta.1 → 9.0.0-beta.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 +295 -156
- package/dist/adapter/converters/sampler-parameters.d.ts +0 -4
- package/dist/adapter/converters/sampler-parameters.d.ts.map +1 -1
- package/dist/adapter/converters/sampler-parameters.js +73 -67
- package/dist/adapter/converters/shader-formats.d.ts.map +1 -1
- package/dist/adapter/converters/shader-formats.js +53 -46
- package/dist/adapter/converters/texture-formats.d.ts +17 -21
- package/dist/adapter/converters/texture-formats.d.ts.map +1 -1
- package/dist/adapter/converters/texture-formats.js +481 -879
- package/dist/adapter/converters/vertex-formats.d.ts.map +1 -1
- package/dist/adapter/converters/vertex-formats.js +53 -61
- package/dist/adapter/device-helpers/webgl-device-features.d.ts +20 -0
- package/dist/adapter/device-helpers/webgl-device-features.d.ts.map +1 -0
- package/dist/adapter/device-helpers/webgl-device-features.js +98 -0
- package/dist/adapter/device-helpers/webgl-device-info.d.ts +5 -0
- package/dist/adapter/device-helpers/webgl-device-info.d.ts.map +1 -0
- package/dist/adapter/device-helpers/webgl-device-info.js +90 -0
- package/dist/adapter/device-helpers/webgl-device-limits.d.ts +35 -0
- package/dist/adapter/device-helpers/webgl-device-limits.d.ts.map +1 -0
- package/dist/adapter/device-helpers/webgl-device-limits.js +47 -0
- package/dist/adapter/helpers/decode-webgl-types.d.ts.map +1 -1
- package/dist/adapter/helpers/decode-webgl-types.js +88 -76
- 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 +261 -225
- package/dist/adapter/helpers/parse-shader-compiler-log.d.ts.map +1 -1
- package/dist/adapter/helpers/parse-shader-compiler-log.js +47 -37
- package/dist/adapter/helpers/set-uniform.d.ts +1 -1
- package/dist/adapter/helpers/set-uniform.d.ts.map +1 -1
- package/dist/adapter/helpers/set-uniform.js +68 -82
- package/dist/adapter/helpers/webgl-topology-utils.d.ts.map +1 -1
- package/dist/adapter/helpers/webgl-topology-utils.js +78 -93
- package/dist/adapter/objects/constants-to-keys.d.ts +1 -1
- package/dist/adapter/objects/constants-to-keys.d.ts.map +1 -1
- package/dist/adapter/objects/constants-to-keys.js +19 -12
- package/dist/adapter/objects/webgl-renderbuffer.d.ts +2 -2
- package/dist/adapter/objects/webgl-renderbuffer.d.ts.map +1 -1
- package/dist/adapter/objects/webgl-renderbuffer.js +86 -77
- package/dist/adapter/objects/webgl-resource.d.ts +3 -25
- package/dist/adapter/objects/webgl-resource.d.ts.map +1 -1
- package/dist/adapter/objects/webgl-resource.js +102 -147
- package/dist/adapter/resources/webgl-buffer.d.ts +3 -4
- package/dist/adapter/resources/webgl-buffer.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-buffer.js +159 -117
- package/dist/adapter/resources/webgl-command-buffer.d.ts +1 -1
- package/dist/adapter/resources/webgl-command-buffer.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-command-buffer.js +266 -168
- package/dist/adapter/resources/webgl-command-encoder.d.ts +8 -3
- package/dist/adapter/resources/webgl-command-encoder.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-command-encoder.js +33 -39
- package/dist/adapter/resources/webgl-external-texture.js +93 -1
- package/dist/adapter/resources/webgl-framebuffer.d.ts +8 -12
- package/dist/adapter/resources/webgl-framebuffer.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-framebuffer.js +174 -139
- package/dist/adapter/resources/webgl-query-set.d.ts +44 -0
- package/dist/adapter/resources/webgl-query-set.d.ts.map +1 -0
- package/dist/adapter/resources/webgl-query-set.js +136 -0
- package/dist/adapter/resources/webgl-render-pass.d.ts +3 -1
- package/dist/adapter/resources/webgl-render-pass.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-render-pass.js +124 -90
- package/dist/adapter/resources/webgl-render-pipeline.d.ts +15 -6
- package/dist/adapter/resources/webgl-render-pipeline.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-render-pipeline.js +362 -221
- package/dist/adapter/resources/webgl-sampler.d.ts +1 -3
- package/dist/adapter/resources/webgl-sampler.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-sampler.js +43 -33
- package/dist/adapter/resources/webgl-shader.d.ts +12 -2
- package/dist/adapter/resources/webgl-shader.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-shader.js +114 -47
- package/dist/adapter/resources/webgl-texture-view.d.ts +14 -0
- package/dist/adapter/resources/webgl-texture-view.d.ts.map +1 -0
- package/dist/adapter/resources/webgl-texture-view.js +18 -0
- package/dist/adapter/resources/webgl-texture.d.ts +8 -10
- package/dist/adapter/resources/webgl-texture.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-texture.js +616 -694
- package/dist/adapter/resources/webgl-transform-feedback.d.ts +2 -2
- package/dist/adapter/resources/webgl-transform-feedback.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-transform-feedback.js +141 -143
- package/dist/adapter/resources/webgl-vertex-array.d.ts +3 -3
- package/dist/adapter/resources/webgl-vertex-array.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-vertex-array.js +229 -157
- package/dist/adapter/webgl-canvas-context.d.ts +2 -2
- package/dist/adapter/webgl-canvas-context.d.ts.map +1 -1
- package/dist/adapter/webgl-canvas-context.js +58 -36
- package/dist/adapter/webgl-device.d.ts +50 -44
- package/dist/adapter/webgl-device.d.ts.map +1 -1
- package/dist/adapter/webgl-device.js +427 -352
- package/dist/classic/accessor.d.ts.map +1 -1
- package/dist/classic/accessor.js +132 -101
- package/dist/classic/clear.d.ts +2 -2
- package/dist/classic/clear.d.ts.map +1 -1
- package/dist/classic/clear.js +73 -72
- package/dist/classic/copy-and-blit.d.ts +1 -1
- package/dist/classic/copy-and-blit.d.ts.map +1 -1
- package/dist/classic/copy-and-blit.js +174 -175
- package/dist/classic/format-utils.d.ts +2 -2
- package/dist/classic/format-utils.d.ts.map +1 -1
- package/dist/classic/format-utils.js +39 -32
- package/dist/classic/typed-array-utils.d.ts.map +1 -1
- package/dist/classic/typed-array-utils.js +96 -81
- package/dist/context/debug/spector.d.ts.map +1 -1
- package/dist/context/debug/spector.js +55 -50
- package/dist/context/debug/webgl-developer-tools.d.ts +1 -2
- package/dist/context/debug/webgl-developer-tools.d.ts.map +1 -1
- package/dist/context/debug/webgl-developer-tools.js +104 -77
- package/dist/context/{context → helpers}/create-browser-context.d.ts +1 -6
- package/dist/context/helpers/create-browser-context.d.ts.map +1 -0
- package/dist/context/helpers/create-browser-context.js +67 -0
- package/dist/context/{polyfill/context-data.d.ts → helpers/webgl-context-data.d.ts} +2 -2
- package/dist/context/helpers/webgl-context-data.d.ts.map +1 -0
- package/dist/context/helpers/webgl-context-data.js +21 -0
- package/dist/context/helpers/webgl-extensions.d.ts +4 -0
- package/dist/context/helpers/webgl-extensions.d.ts.map +1 -0
- package/dist/context/helpers/webgl-extensions.js +10 -0
- package/dist/context/parameters/unified-parameter-api.d.ts +3 -4
- package/dist/context/parameters/unified-parameter-api.d.ts.map +1 -1
- package/dist/context/parameters/unified-parameter-api.js +92 -47
- package/dist/context/parameters/webgl-parameter-tables.d.ts +109 -99
- package/dist/context/parameters/webgl-parameter-tables.d.ts.map +1 -1
- package/dist/context/parameters/webgl-parameter-tables.js +463 -404
- package/dist/context/state-tracker/deep-array-equal.d.ts.map +1 -1
- package/dist/context/state-tracker/deep-array-equal.js +19 -14
- package/dist/context/state-tracker/track-context-state.d.ts +4 -4
- package/dist/context/state-tracker/track-context-state.d.ts.map +1 -1
- package/dist/context/state-tracker/track-context-state.js +188 -123
- package/dist/context/state-tracker/with-parameters.d.ts +2 -3
- package/dist/context/state-tracker/with-parameters.d.ts.map +1 -1
- package/dist/context/state-tracker/with-parameters.js +42 -28
- package/dist/dist.dev.js +4465 -7235
- package/dist/dist.min.js +10 -0
- package/dist/index.cjs +2146 -3116
- package/dist/index.cjs.map +7 -0
- package/dist/index.d.ts +25 -31
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -10
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -1
- package/dist.min.js +9 -42
- package/package.json +10 -15
- package/src/adapter/converters/device-parameters.ts +114 -28
- package/src/adapter/converters/sampler-parameters.ts +12 -20
- package/src/adapter/converters/shader-formats.ts +47 -22
- package/src/adapter/converters/texture-formats.ts +183 -227
- package/src/adapter/converters/vertex-formats.ts +3 -3
- package/src/adapter/device-helpers/webgl-device-features.ts +121 -0
- package/src/adapter/device-helpers/{get-device-info.ts → webgl-device-info.ts} +30 -22
- package/src/adapter/device-helpers/webgl-device-limits.ts +53 -0
- package/src/adapter/helpers/decode-webgl-types.ts +13 -7
- package/src/adapter/helpers/get-shader-layout.ts +21 -31
- package/src/adapter/helpers/parse-shader-compiler-log.ts +10 -6
- package/src/adapter/helpers/set-uniform.ts +3 -4
- package/src/adapter/helpers/webgl-topology-utils.ts +10 -3
- package/src/adapter/objects/constants-to-keys.ts +3 -2
- package/src/adapter/objects/webgl-renderbuffer.ts +38 -16
- package/src/adapter/objects/webgl-resource.ts +8 -141
- package/src/adapter/resources/webgl-buffer.ts +10 -14
- package/src/adapter/resources/webgl-command-buffer.ts +24 -34
- package/src/adapter/resources/webgl-command-encoder.ts +14 -11
- package/src/adapter/resources/webgl-external-texture.ts +7 -7
- package/src/adapter/resources/webgl-framebuffer.ts +65 -58
- package/src/adapter/resources/webgl-query-set.ts +171 -0
- package/src/adapter/resources/webgl-render-pass.ts +27 -18
- package/src/adapter/resources/webgl-render-pipeline.ts +148 -73
- package/src/adapter/resources/webgl-sampler.ts +7 -10
- package/src/adapter/resources/webgl-shader.ts +65 -11
- package/src/adapter/resources/webgl-texture-view.ts +28 -0
- package/src/adapter/resources/webgl-texture.ts +43 -106
- package/src/adapter/resources/webgl-transform-feedback.ts +16 -22
- package/src/adapter/resources/webgl-vertex-array.ts +20 -21
- package/src/adapter/webgl-canvas-context.ts +7 -11
- package/src/adapter/webgl-device.ts +142 -162
- package/src/classic/accessor.ts +5 -4
- package/src/classic/clear.ts +25 -20
- package/src/classic/copy-and-blit.ts +12 -6
- package/src/classic/format-utils.ts +2 -1
- package/src/classic/typed-array-utils.ts +3 -7
- package/src/context/debug/spector.ts +9 -6
- package/src/context/debug/webgl-developer-tools.ts +31 -20
- package/src/context/{context → helpers}/create-browser-context.ts +9 -33
- package/src/context/{polyfill/context-data.ts → helpers/webgl-context-data.ts} +3 -2
- package/src/context/helpers/webgl-extensions.ts +17 -0
- package/src/context/parameters/unified-parameter-api.ts +6 -17
- package/src/context/parameters/webgl-parameter-tables.ts +118 -90
- package/src/context/state-tracker/deep-array-equal.ts +2 -1
- package/src/context/state-tracker/track-context-state.ts +29 -23
- package/src/context/state-tracker/with-parameters.ts +8 -8
- package/src/index.ts +16 -56
- package/src/types.ts +2 -1
- package/dist/adapter/converters/device-parameters.js.map +0 -1
- package/dist/adapter/converters/sampler-parameters.js.map +0 -1
- package/dist/adapter/converters/shader-formats.js.map +0 -1
- package/dist/adapter/converters/texture-formats.js.map +0 -1
- package/dist/adapter/converters/vertex-formats.js.map +0 -1
- package/dist/adapter/device-helpers/device-features.d.ts +0 -9
- package/dist/adapter/device-helpers/device-features.d.ts.map +0 -1
- package/dist/adapter/device-helpers/device-features.js +0 -96
- package/dist/adapter/device-helpers/device-features.js.map +0 -1
- package/dist/adapter/device-helpers/device-limits.d.ts +0 -52
- package/dist/adapter/device-helpers/device-limits.d.ts.map +0 -1
- package/dist/adapter/device-helpers/device-limits.js +0 -87
- package/dist/adapter/device-helpers/device-limits.js.map +0 -1
- package/dist/adapter/device-helpers/get-device-info.d.ts +0 -4
- package/dist/adapter/device-helpers/get-device-info.d.ts.map +0 -1
- package/dist/adapter/device-helpers/get-device-info.js +0 -71
- package/dist/adapter/device-helpers/get-device-info.js.map +0 -1
- package/dist/adapter/device-helpers/is-old-ie.d.ts +0 -2
- package/dist/adapter/device-helpers/is-old-ie.d.ts.map +0 -1
- package/dist/adapter/device-helpers/is-old-ie.js +0 -9
- package/dist/adapter/device-helpers/is-old-ie.js.map +0 -1
- package/dist/adapter/helpers/decode-webgl-types.js.map +0 -1
- package/dist/adapter/helpers/get-shader-layout.js.map +0 -1
- package/dist/adapter/helpers/parse-shader-compiler-log.js.map +0 -1
- package/dist/adapter/helpers/set-uniform.js.map +0 -1
- package/dist/adapter/helpers/webgl-topology-utils.js.map +0 -1
- package/dist/adapter/objects/constants-to-keys.js.map +0 -1
- package/dist/adapter/objects/webgl-renderbuffer.js.map +0 -1
- package/dist/adapter/objects/webgl-resource.js.map +0 -1
- package/dist/adapter/resources/webgl-buffer.js.map +0 -1
- package/dist/adapter/resources/webgl-command-buffer.js.map +0 -1
- package/dist/adapter/resources/webgl-command-encoder.js.map +0 -1
- package/dist/adapter/resources/webgl-external-texture.js.map +0 -1
- package/dist/adapter/resources/webgl-framebuffer.js.map +0 -1
- package/dist/adapter/resources/webgl-render-pass.js.map +0 -1
- package/dist/adapter/resources/webgl-render-pipeline.js.map +0 -1
- package/dist/adapter/resources/webgl-sampler.js.map +0 -1
- package/dist/adapter/resources/webgl-shader.js.map +0 -1
- package/dist/adapter/resources/webgl-texture.js.map +0 -1
- package/dist/adapter/resources/webgl-transform-feedback.js.map +0 -1
- package/dist/adapter/resources/webgl-vertex-array.js.map +0 -1
- package/dist/adapter/webgl-canvas-context.js.map +0 -1
- package/dist/adapter/webgl-device.js.map +0 -1
- package/dist/classic/accessor.js.map +0 -1
- package/dist/classic/clear.js.map +0 -1
- package/dist/classic/copy-and-blit.js.map +0 -1
- package/dist/classic/format-utils.js.map +0 -1
- package/dist/classic/typed-array-utils.js.map +0 -1
- package/dist/context/context/create-browser-context.d.ts.map +0 -1
- package/dist/context/context/create-browser-context.js +0 -53
- package/dist/context/context/create-browser-context.js.map +0 -1
- package/dist/context/context/create-headless-context.d.ts +0 -9
- package/dist/context/context/create-headless-context.d.ts.map +0 -1
- package/dist/context/context/create-headless-context.js +0 -42
- package/dist/context/context/create-headless-context.js.map +0 -1
- package/dist/context/context/webgl-checks.d.ts +0 -13
- package/dist/context/context/webgl-checks.d.ts.map +0 -1
- package/dist/context/context/webgl-checks.js +0 -31
- package/dist/context/context/webgl-checks.js.map +0 -1
- package/dist/context/debug/spector.js.map +0 -1
- package/dist/context/debug/webgl-developer-tools.js.map +0 -1
- package/dist/context/parameters/unified-parameter-api.js.map +0 -1
- package/dist/context/parameters/webgl-parameter-tables.js.map +0 -1
- package/dist/context/polyfill/context-data.d.ts.map +0 -1
- package/dist/context/polyfill/context-data.js +0 -12
- package/dist/context/polyfill/context-data.js.map +0 -1
- package/dist/context/polyfill/get-parameter-polyfill.d.ts +0 -2
- package/dist/context/polyfill/get-parameter-polyfill.d.ts.map +0 -1
- package/dist/context/polyfill/get-parameter-polyfill.js +0 -85
- package/dist/context/polyfill/get-parameter-polyfill.js.map +0 -1
- package/dist/context/polyfill/polyfill-context.d.ts +0 -5
- package/dist/context/polyfill/polyfill-context.d.ts.map +0 -1
- package/dist/context/polyfill/polyfill-context.js +0 -87
- package/dist/context/polyfill/polyfill-context.js.map +0 -1
- package/dist/context/polyfill/polyfill-table.d.ts +0 -48
- package/dist/context/polyfill/polyfill-table.d.ts.map +0 -1
- package/dist/context/polyfill/polyfill-table.js +0 -137
- package/dist/context/polyfill/polyfill-table.js.map +0 -1
- package/dist/context/polyfill/polyfill-vertex-array-object.d.ts +0 -2
- package/dist/context/polyfill/polyfill-vertex-array-object.d.ts.map +0 -1
- package/dist/context/polyfill/polyfill-vertex-array-object.js +0 -265
- package/dist/context/polyfill/polyfill-vertex-array-object.js.map +0 -1
- package/dist/context/state-tracker/deep-array-equal.js.map +0 -1
- package/dist/context/state-tracker/track-context-state.js.map +0 -1
- package/dist/context/state-tracker/with-parameters.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/types.js.map +0 -1
- package/src/adapter/device-helpers/device-features.ts +0 -161
- package/src/adapter/device-helpers/device-limits.ts +0 -155
- package/src/adapter/device-helpers/is-old-ie.ts +0 -14
- package/src/context/context/create-headless-context.ts +0 -51
- package/src/context/context/webgl-checks.ts +0 -51
- package/src/context/polyfill/get-parameter-polyfill.ts +0 -122
- package/src/context/polyfill/polyfill-context.ts +0 -104
- package/src/context/polyfill/polyfill-table.ts +0 -167
- package/src/context/polyfill/polyfill-vertex-array-object.ts +0 -365
|
@@ -1,245 +1,386 @@
|
|
|
1
|
+
// luma.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
1
4
|
import { RenderPipeline, cast, splitUniformsAndBindings, log } from '@luma.gl/core';
|
|
2
5
|
import { mergeShaderLayout } from '@luma.gl/core';
|
|
6
|
+
// import {mergeShaderLayout, getAttributeInfosFromLayouts} from '@luma.gl/core';
|
|
7
|
+
import { GL } from '@luma.gl/constants';
|
|
3
8
|
import { getShaderLayout } from "../helpers/get-shader-layout.js";
|
|
4
9
|
import { withDeviceAndGLParameters } from "../converters/device-parameters.js";
|
|
5
10
|
import { setUniform } from "../helpers/set-uniform.js";
|
|
6
11
|
import { WEBGLBuffer } from "./webgl-buffer.js";
|
|
7
12
|
import { WEBGLFramebuffer } from "./webgl-framebuffer.js";
|
|
8
13
|
import { WEBGLTexture } from "./webgl-texture.js";
|
|
14
|
+
import { WEBGLTextureView } from "./webgl-texture-view.js";
|
|
9
15
|
import { getGLDrawMode } from "../helpers/webgl-topology-utils.js";
|
|
10
16
|
const LOG_PROGRAM_PERF_PRIORITY = 4;
|
|
17
|
+
/** Creates a new render pipeline */
|
|
11
18
|
export class WEBGLRenderPipeline extends RenderPipeline {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
this
|
|
23
|
-
|
|
24
|
-
this
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
19
|
+
/** The WebGL device that created this render pipeline */
|
|
20
|
+
device;
|
|
21
|
+
/** Handle to underlying WebGL program */
|
|
22
|
+
handle;
|
|
23
|
+
/** vertex shader */
|
|
24
|
+
vs;
|
|
25
|
+
/** fragment shader */
|
|
26
|
+
fs;
|
|
27
|
+
/** The layout extracted from shader by WebGL introspection APIs */
|
|
28
|
+
introspectedLayout;
|
|
29
|
+
/** Uniforms set on this model */
|
|
30
|
+
uniforms = {};
|
|
31
|
+
/** Bindings set on this model */
|
|
32
|
+
bindings = {};
|
|
33
|
+
/** WebGL varyings */
|
|
34
|
+
varyings = null;
|
|
35
|
+
_uniformCount = 0;
|
|
36
|
+
_uniformSetters = {}; // TODO are these used?
|
|
37
|
+
constructor(device, props) {
|
|
38
|
+
super(device, props);
|
|
39
|
+
this.device = device;
|
|
40
|
+
this.handle = this.props.handle || this.device.gl.createProgram();
|
|
41
|
+
this.device.setSpectorMetadata(this.handle, { id: this.props.id });
|
|
42
|
+
// Create shaders if needed
|
|
43
|
+
this.vs = cast(props.vs);
|
|
44
|
+
this.fs = cast(props.fs);
|
|
45
|
+
// assert(this.vs.stage === 'vertex');
|
|
46
|
+
// assert(this.fs.stage === 'fragment');
|
|
47
|
+
// Setup varyings if supplied
|
|
48
|
+
// @ts-expect-error WebGL only
|
|
49
|
+
const { varyings, bufferMode = 35981 } = props;
|
|
50
|
+
if (varyings && varyings.length > 0) {
|
|
51
|
+
this.varyings = varyings;
|
|
52
|
+
this.device.gl.transformFeedbackVaryings(this.handle, varyings, bufferMode);
|
|
53
|
+
}
|
|
54
|
+
this._linkShaders();
|
|
55
|
+
log.time(0, `RenderPipeline ${this.id} - shaderLayout introspection`)();
|
|
56
|
+
this.introspectedLayout = getShaderLayout(this.device.gl, this.handle);
|
|
57
|
+
log.timeEnd(0, `RenderPipeline ${this.id} - shaderLayout introspection`)();
|
|
58
|
+
// Merge provided layout with introspected layout
|
|
59
|
+
this.shaderLayout = mergeShaderLayout(this.introspectedLayout, props.shaderLayout);
|
|
60
|
+
// WebGPU has more restrictive topology support than WebGL
|
|
61
|
+
switch (this.props.topology) {
|
|
62
|
+
case 'triangle-fan-webgl':
|
|
63
|
+
case 'line-loop-webgl':
|
|
64
|
+
log.warn(`Primitive topology ${this.props.topology} is deprecated and will be removed in v9.1`);
|
|
65
|
+
break;
|
|
66
|
+
default:
|
|
67
|
+
}
|
|
40
68
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
log.warn(`Primitive topology ${this.props.topology} is deprecated and will be removed in v9.1`);
|
|
48
|
-
break;
|
|
49
|
-
default:
|
|
69
|
+
destroy() {
|
|
70
|
+
if (this.handle) {
|
|
71
|
+
this.device.gl.deleteProgram(this.handle);
|
|
72
|
+
// this.handle = null;
|
|
73
|
+
this.destroyed = true;
|
|
74
|
+
}
|
|
50
75
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
76
|
+
/**
|
|
77
|
+
* Bindings include: textures, samplers and uniform buffers
|
|
78
|
+
* @todo needed for portable model
|
|
79
|
+
*/
|
|
80
|
+
setBindings(bindings) {
|
|
81
|
+
// if (log.priority >= 2) {
|
|
82
|
+
// checkUniformValues(uniforms, this.id, this._uniformSetters);
|
|
83
|
+
// }
|
|
84
|
+
for (const [name, value] of Object.entries(bindings)) {
|
|
85
|
+
// Accept both `xyz` and `xyzUniforms` as valid names for `xyzUniforms` uniform block
|
|
86
|
+
// This convention allows shaders to name uniform blocks as `uniform appUniforms {} app;`
|
|
87
|
+
// and reference them as `app` from both GLSL and JS.
|
|
88
|
+
// TODO - this is rather hacky - we could also remap the name directly in the shader layout.
|
|
89
|
+
const binding = this.shaderLayout.bindings.find(binding => binding.name === name) ||
|
|
90
|
+
this.shaderLayout.bindings.find(binding => binding.name === `${name}Uniforms`);
|
|
91
|
+
if (!binding) {
|
|
92
|
+
const validBindings = this.shaderLayout.bindings
|
|
93
|
+
.map(binding => `"${binding.name}"`)
|
|
94
|
+
.join(', ');
|
|
95
|
+
log.warn(`Unknown binding "${name}" in render pipeline "${this.id}", expected one of ${validBindings}`)();
|
|
96
|
+
continue; // eslint-disable-line no-continue
|
|
97
|
+
}
|
|
98
|
+
if (!value) {
|
|
99
|
+
log.warn(`Unsetting binding "${name}" in render pipeline "${this.id}"`)();
|
|
100
|
+
}
|
|
101
|
+
switch (binding.type) {
|
|
102
|
+
case 'uniform':
|
|
103
|
+
// @ts-expect-error
|
|
104
|
+
if (!(value instanceof WEBGLBuffer) && !(value.buffer instanceof WEBGLBuffer)) {
|
|
105
|
+
throw new Error('buffer value');
|
|
106
|
+
}
|
|
107
|
+
break;
|
|
108
|
+
case 'texture':
|
|
109
|
+
if (!(value instanceof WEBGLTextureView ||
|
|
110
|
+
value instanceof WEBGLTexture ||
|
|
111
|
+
value instanceof WEBGLFramebuffer)) {
|
|
112
|
+
throw new Error('texture value');
|
|
113
|
+
}
|
|
114
|
+
break;
|
|
115
|
+
case 'sampler':
|
|
116
|
+
log.warn(`Ignoring sampler ${name}`)();
|
|
117
|
+
break;
|
|
118
|
+
default:
|
|
119
|
+
throw new Error(binding.type);
|
|
120
|
+
}
|
|
121
|
+
this.bindings[name] = value;
|
|
122
|
+
}
|
|
56
123
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
124
|
+
/** @todo needed for portable model
|
|
125
|
+
* @note The WebGL API is offers many ways to draw things
|
|
126
|
+
* This function unifies those ways into a single call using common parameters with sane defaults
|
|
127
|
+
*/
|
|
128
|
+
draw(options) {
|
|
129
|
+
const { renderPass, vertexArray, vertexCount,
|
|
130
|
+
// indexCount,
|
|
131
|
+
instanceCount, firstVertex = 0,
|
|
132
|
+
// firstIndex,
|
|
133
|
+
// firstInstance,
|
|
134
|
+
// baseVertex,
|
|
135
|
+
transformFeedback } = options;
|
|
136
|
+
const glDrawMode = getGLDrawMode(this.props.topology);
|
|
137
|
+
const isIndexed = Boolean(vertexArray.indexBuffer);
|
|
138
|
+
const glIndexType = vertexArray.indexBuffer?.glIndexType;
|
|
139
|
+
const isInstanced = Number(instanceCount) > 0;
|
|
140
|
+
// If we are using async linking, we need to wait until linking completes
|
|
141
|
+
if (this.linkStatus !== 'success') {
|
|
142
|
+
log.info(2, `RenderPipeline:${this.id}.draw() aborted - waiting for shader linking`)();
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
// Avoid WebGL draw call when not rendering any data or values are incomplete
|
|
146
|
+
// Note: async textures set as uniforms might still be loading.
|
|
147
|
+
// Now that all uniforms have been updated, check if any texture
|
|
148
|
+
// in the uniforms is not yet initialized, then we don't draw
|
|
149
|
+
if (!this._areTexturesRenderable() || vertexCount === 0) {
|
|
150
|
+
log.info(2, `RenderPipeline:${this.id}.draw() aborted - textures not yet loaded`)();
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
// (isInstanced && instanceCount === 0)
|
|
154
|
+
if (vertexCount === 0) {
|
|
155
|
+
log.info(2, `RenderPipeline:${this.id}.draw() aborted - no vertices to draw`)();
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
this.device.gl.useProgram(this.handle);
|
|
159
|
+
// Note: Rebinds constant attributes before each draw call
|
|
160
|
+
vertexArray.bindBeforeRender(renderPass);
|
|
161
|
+
if (transformFeedback) {
|
|
162
|
+
transformFeedback.begin(this.props.topology);
|
|
163
|
+
}
|
|
164
|
+
// We have to apply bindings before every draw call since other draw calls will overwrite
|
|
165
|
+
this._applyBindings();
|
|
166
|
+
this._applyUniforms();
|
|
167
|
+
const webglRenderPass = renderPass;
|
|
168
|
+
withDeviceAndGLParameters(this.device, this.props.parameters, webglRenderPass.glParameters, () => {
|
|
169
|
+
if (isIndexed && isInstanced) {
|
|
170
|
+
this.device.gl.drawElementsInstanced(glDrawMode, vertexCount || 0, // indexCount?
|
|
171
|
+
glIndexType, firstVertex, instanceCount || 0);
|
|
172
|
+
// } else if (isIndexed && this.device.isWebGL2 && !isNaN(start) && !isNaN(end)) {
|
|
173
|
+
// this.device.gldrawRangeElements(glDrawMode, start, end, vertexCount, glIndexType, offset);
|
|
174
|
+
}
|
|
175
|
+
else if (isIndexed) {
|
|
176
|
+
this.device.gl.drawElements(glDrawMode, vertexCount || 0, glIndexType, firstVertex); // indexCount?
|
|
177
|
+
}
|
|
178
|
+
else if (isInstanced) {
|
|
179
|
+
this.device.gl.drawArraysInstanced(glDrawMode, firstVertex, vertexCount || 0, instanceCount || 0);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
this.device.gl.drawArrays(glDrawMode, firstVertex, vertexCount || 0);
|
|
183
|
+
}
|
|
184
|
+
if (transformFeedback) {
|
|
185
|
+
transformFeedback.end();
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
vertexArray.unbindAfterRender(renderPass);
|
|
189
|
+
return true;
|
|
87
190
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
Object.assign(this.uniforms, uniforms);
|
|
97
|
-
}
|
|
98
|
-
draw(options) {
|
|
99
|
-
var _vertexArray$indexBuf;
|
|
100
|
-
const {
|
|
101
|
-
renderPass,
|
|
102
|
-
vertexArray,
|
|
103
|
-
vertexCount,
|
|
104
|
-
instanceCount,
|
|
105
|
-
firstVertex = 0,
|
|
106
|
-
transformFeedback
|
|
107
|
-
} = options;
|
|
108
|
-
const glDrawMode = getGLDrawMode(this.props.topology);
|
|
109
|
-
const isIndexed = Boolean(vertexArray.indexBuffer);
|
|
110
|
-
const glIndexType = (_vertexArray$indexBuf = vertexArray.indexBuffer) === null || _vertexArray$indexBuf === void 0 ? void 0 : _vertexArray$indexBuf.glIndexType;
|
|
111
|
-
const isInstanced = Number(instanceCount) > 0;
|
|
112
|
-
if (!this._areTexturesRenderable() || vertexCount === 0) {
|
|
113
|
-
return false;
|
|
191
|
+
// DEPRECATED METHODS
|
|
192
|
+
setUniformsWebGL(uniforms) {
|
|
193
|
+
const { bindings } = splitUniformsAndBindings(uniforms);
|
|
194
|
+
Object.keys(bindings).forEach(name => {
|
|
195
|
+
log.warn(`Unsupported value "${JSON.stringify(bindings[name])}" used in setUniforms() for key ${name}. Use setBindings() instead?`)();
|
|
196
|
+
});
|
|
197
|
+
// TODO - check against layout
|
|
198
|
+
Object.assign(this.uniforms, uniforms);
|
|
114
199
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
200
|
+
// PRIVATE METHODS
|
|
201
|
+
// setAttributes(attributes: Record<string, Buffer>): void {}
|
|
202
|
+
// setBindings(bindings: Record<string, Binding>): void {}
|
|
203
|
+
async _linkShaders() {
|
|
204
|
+
const { gl } = this.device;
|
|
205
|
+
gl.attachShader(this.handle, this.vs.handle);
|
|
206
|
+
gl.attachShader(this.handle, this.fs.handle);
|
|
207
|
+
log.time(LOG_PROGRAM_PERF_PRIORITY, `linkProgram for ${this.id}`)();
|
|
208
|
+
gl.linkProgram(this.handle);
|
|
209
|
+
log.timeEnd(LOG_PROGRAM_PERF_PRIORITY, `linkProgram for ${this.id}`)();
|
|
210
|
+
// TODO Avoid checking program linking error in production
|
|
211
|
+
if (log.level === 0) {
|
|
212
|
+
// return;
|
|
213
|
+
}
|
|
214
|
+
if (!this.device.features.has('compilation-status-async-webgl')) {
|
|
215
|
+
const status = this._getLinkStatus();
|
|
216
|
+
this._reportLinkStatus(status);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
// async case
|
|
220
|
+
log.once(1, 'RenderPipeline linking is asynchronous')();
|
|
221
|
+
await this._waitForLinkComplete();
|
|
222
|
+
log.info(2, `RenderPipeline ${this.id} - async linking complete: ${this.linkStatus}`)();
|
|
223
|
+
const status = this._getLinkStatus();
|
|
224
|
+
this._reportLinkStatus(status);
|
|
119
225
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
vertexArray.unbindAfterRender(renderPass);
|
|
140
|
-
return true;
|
|
141
|
-
}
|
|
142
|
-
_compileAndLink() {
|
|
143
|
-
const {
|
|
144
|
-
gl
|
|
145
|
-
} = this.device;
|
|
146
|
-
gl.attachShader(this.handle, this.vs.handle);
|
|
147
|
-
gl.attachShader(this.handle, this.fs.handle);
|
|
148
|
-
log.time(LOG_PROGRAM_PERF_PRIORITY, `linkProgram for ${this.id}`)();
|
|
149
|
-
gl.linkProgram(this.handle);
|
|
150
|
-
log.timeEnd(LOG_PROGRAM_PERF_PRIORITY, `linkProgram for ${this.id}`)();
|
|
151
|
-
if (!gl.debug && log.level === 0) {}
|
|
152
|
-
const linked = gl.getProgramParameter(this.handle, 35714);
|
|
153
|
-
if (!linked) {
|
|
154
|
-
throw new Error(`Error linking: ${gl.getProgramInfoLog(this.handle)}`);
|
|
226
|
+
/** Report link status. First, check for shader compilation failures if linking fails */
|
|
227
|
+
_reportLinkStatus(status) {
|
|
228
|
+
switch (status) {
|
|
229
|
+
case 'success':
|
|
230
|
+
return;
|
|
231
|
+
default:
|
|
232
|
+
// First check for shader compilation failures if linking fails
|
|
233
|
+
if (this.vs.compilationStatus === 'error') {
|
|
234
|
+
this.vs.debugShader();
|
|
235
|
+
throw new Error(`Error during compilation of shader ${this.vs.id}`);
|
|
236
|
+
}
|
|
237
|
+
if (this.fs?.compilationStatus === 'error') {
|
|
238
|
+
this.vs.debugShader();
|
|
239
|
+
throw new Error(`Error during compilation of shader ${this.fs.id}`);
|
|
240
|
+
}
|
|
241
|
+
throw new Error(`Error during ${status}: ${this.device.gl.getProgramInfoLog(this.handle)}`);
|
|
242
|
+
}
|
|
155
243
|
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
244
|
+
/**
|
|
245
|
+
* Get the shader compilation status
|
|
246
|
+
* TODO - Load log even when no error reported, to catch warnings?
|
|
247
|
+
* https://gamedev.stackexchange.com/questions/30429/how-to-detect-glsl-warnings
|
|
248
|
+
*/
|
|
249
|
+
_getLinkStatus() {
|
|
250
|
+
const { gl } = this.device;
|
|
251
|
+
const linked = gl.getProgramParameter(this.handle, 35714);
|
|
252
|
+
if (!linked) {
|
|
253
|
+
this.linkStatus = 'error';
|
|
254
|
+
return 'linking';
|
|
255
|
+
}
|
|
256
|
+
gl.validateProgram(this.handle);
|
|
257
|
+
const validated = gl.getProgramParameter(this.handle, 35715);
|
|
258
|
+
if (!validated) {
|
|
259
|
+
this.linkStatus = 'error';
|
|
260
|
+
return 'validation';
|
|
261
|
+
}
|
|
262
|
+
this.linkStatus = 'success';
|
|
263
|
+
return 'success';
|
|
160
264
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
265
|
+
/** Use KHR_parallel_shader_compile extension if available */
|
|
266
|
+
async _waitForLinkComplete() {
|
|
267
|
+
const waitMs = async (ms) => await new Promise(resolve => setTimeout(resolve, ms));
|
|
268
|
+
const DELAY_MS = 10; // Shader compilation is typically quite fast (with some exceptions)
|
|
269
|
+
// If status polling is not available, we can't wait for completion. Just wait a little to minimize blocking
|
|
270
|
+
if (!this.device.features.has('compilation-status-async-webgl')) {
|
|
271
|
+
await waitMs(DELAY_MS);
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
const { gl } = this.device;
|
|
275
|
+
for (;;) {
|
|
276
|
+
const complete = gl.getProgramParameter(this.handle, 37297);
|
|
277
|
+
if (complete) {
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
await waitMs(DELAY_MS);
|
|
281
|
+
}
|
|
169
282
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
283
|
+
/**
|
|
284
|
+
* Checks if all texture-values uniforms are renderable (i.e. loaded)
|
|
285
|
+
* Update a texture if needed (e.g. from video)
|
|
286
|
+
* Note: This is currently done before every draw call
|
|
287
|
+
*/
|
|
288
|
+
_areTexturesRenderable() {
|
|
289
|
+
let texturesRenderable = true;
|
|
290
|
+
for (const [, texture] of Object.entries(this.bindings)) {
|
|
291
|
+
if (texture instanceof WEBGLTexture) {
|
|
292
|
+
texture.update();
|
|
293
|
+
texturesRenderable = texturesRenderable && texture.loaded;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return texturesRenderable;
|
|
179
297
|
}
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
298
|
+
/** Apply any bindings (before each draw call) */
|
|
299
|
+
_applyBindings() {
|
|
300
|
+
// If we are using async linking, we need to wait until linking completes
|
|
301
|
+
if (this.linkStatus !== 'success') {
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
const { gl } = this.device;
|
|
305
|
+
gl.useProgram(this.handle);
|
|
306
|
+
let textureUnit = 0;
|
|
307
|
+
let uniformBufferIndex = 0;
|
|
308
|
+
for (const binding of this.shaderLayout.bindings) {
|
|
309
|
+
// Accept both `xyz` and `xyzUniforms` as valid names for `xyzUniforms` uniform block
|
|
310
|
+
const value = this.bindings[binding.name] || this.bindings[binding.name.replace(/Uniforms$/, '')];
|
|
311
|
+
if (!value) {
|
|
312
|
+
throw new Error(`No value for binding ${binding.name} in ${this.id}`);
|
|
313
|
+
}
|
|
314
|
+
switch (binding.type) {
|
|
315
|
+
case 'uniform':
|
|
316
|
+
// Set buffer
|
|
317
|
+
const { name } = binding;
|
|
318
|
+
const location = gl.getUniformBlockIndex(this.handle, name);
|
|
319
|
+
if (location === 4294967295) {
|
|
320
|
+
throw new Error(`Invalid uniform block name ${name}`);
|
|
321
|
+
}
|
|
322
|
+
gl.uniformBlockBinding(this.handle, uniformBufferIndex, location);
|
|
323
|
+
// console.debug(binding, location);
|
|
324
|
+
if (value instanceof WEBGLBuffer) {
|
|
325
|
+
gl.bindBufferBase(35345, uniformBufferIndex, value.handle);
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
gl.bindBufferRange(35345, uniformBufferIndex,
|
|
329
|
+
// @ts-expect-error
|
|
330
|
+
value.buffer.handle,
|
|
331
|
+
// @ts-expect-error
|
|
332
|
+
value.offset || 0,
|
|
333
|
+
// @ts-expect-error
|
|
334
|
+
value.size || value.buffer.byteLength - value.offset);
|
|
335
|
+
}
|
|
336
|
+
uniformBufferIndex += 1;
|
|
337
|
+
break;
|
|
338
|
+
case 'texture':
|
|
339
|
+
if (!(value instanceof WEBGLTextureView ||
|
|
340
|
+
value instanceof WEBGLTexture ||
|
|
341
|
+
value instanceof WEBGLFramebuffer)) {
|
|
342
|
+
throw new Error('texture');
|
|
343
|
+
}
|
|
344
|
+
let texture;
|
|
345
|
+
if (value instanceof WEBGLTextureView) {
|
|
346
|
+
texture = value.texture;
|
|
347
|
+
}
|
|
348
|
+
else if (value instanceof WEBGLTexture) {
|
|
349
|
+
texture = value;
|
|
350
|
+
}
|
|
351
|
+
else if (value instanceof WEBGLFramebuffer &&
|
|
352
|
+
value.colorAttachments[0] instanceof WEBGLTextureView) {
|
|
353
|
+
log.warn('Passing framebuffer in texture binding may be deprecated. Use fbo.colorAttachments[0] instead')();
|
|
354
|
+
texture = value.colorAttachments[0].texture;
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
throw new Error('No texture');
|
|
358
|
+
}
|
|
359
|
+
gl.activeTexture(33984 + textureUnit);
|
|
360
|
+
gl.bindTexture(texture.target, texture.handle);
|
|
361
|
+
// gl.bindSampler(textureUnit, sampler.handle);
|
|
362
|
+
textureUnit += 1;
|
|
363
|
+
break;
|
|
364
|
+
case 'sampler':
|
|
365
|
+
// ignore
|
|
366
|
+
break;
|
|
367
|
+
case 'storage':
|
|
368
|
+
case 'read-only-storage':
|
|
369
|
+
throw new Error(`binding type '${binding.type}' not supported in WebGL`);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
227
372
|
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
setUniform(this.device.gl, location, type, value);
|
|
241
|
-
}
|
|
373
|
+
/**
|
|
374
|
+
* Due to program sharing, uniforms need to be reset before every draw call
|
|
375
|
+
* (though caching will avoid redundant WebGL calls)
|
|
376
|
+
*/
|
|
377
|
+
_applyUniforms() {
|
|
378
|
+
for (const uniformLayout of this.shaderLayout.uniforms || []) {
|
|
379
|
+
const { name, location, type, textureUnit } = uniformLayout;
|
|
380
|
+
const value = this.uniforms[name] ?? textureUnit;
|
|
381
|
+
if (value !== undefined) {
|
|
382
|
+
setUniform(this.device.gl, location, type, value);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
242
385
|
}
|
|
243
|
-
}
|
|
244
386
|
}
|
|
245
|
-
//# sourceMappingURL=webgl-render-pipeline.js.map
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { Sampler, SamplerProps } from '@luma.gl/core';
|
|
2
2
|
import { GLSamplerParameters } from '@luma.gl/constants';
|
|
3
|
-
import type { WebGLDevice } from
|
|
3
|
+
import type { WebGLDevice } from "../webgl-device.js";
|
|
4
4
|
/**
|
|
5
5
|
* Sampler object -
|
|
6
|
-
* Under WebGL2 we create an actual WebGL sampler
|
|
7
|
-
* Under WebGL1, we just store the sampler parameters
|
|
8
6
|
* so that they can be set directly on the texture
|
|
9
7
|
* https://github.com/WebGLSamples/WebGL2Samples/blob/master/samples/sampler_object.html
|
|
10
8
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgl-sampler.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgl-sampler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"webgl-sampler.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgl-sampler.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,OAAO,EAAE,YAAY,EAAC,MAAM,eAAe,CAAC;AACpD,OAAO,EAAK,mBAAmB,EAAC,MAAM,oBAAoB,CAAC;AAE3D,OAAO,KAAK,EAAC,WAAW,EAAC,2BAAwB;AAEjD;;;;GAIG;AACH,qBAAa,YAAa,SAAQ,OAAO;IACvC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,mBAAmB,CAAC;gBAE7B,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY;IAQ3C,OAAO,IAAI,IAAI;IAQf,QAAQ,IAAI,MAAM;IAI3B,4CAA4C;IAC5C,OAAO,CAAC,qBAAqB;CAgB9B"}
|