@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,4 +1,5 @@
|
|
|
1
|
-
// luma.gl
|
|
1
|
+
// luma.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
2
3
|
// Copyright (c) vis.gl contributors
|
|
3
4
|
|
|
4
5
|
import type {FramebufferProps, TextureFormat} from '@luma.gl/core';
|
|
@@ -6,16 +7,18 @@ import {Framebuffer, Texture, assert} from '@luma.gl/core';
|
|
|
6
7
|
import {GL} from '@luma.gl/constants';
|
|
7
8
|
import {WebGLDevice} from '../webgl-device';
|
|
8
9
|
import {WEBGLTexture} from './webgl-texture';
|
|
9
|
-
import {
|
|
10
|
+
import {WEBGLTextureView} from './webgl-texture-view';
|
|
10
11
|
import {getDepthStencilAttachmentWebGL} from '../converters/texture-formats';
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
// TODO - for now we don't see a usage for renderbuffers in WebGL 2.
|
|
14
|
+
// import {WEBGLRenderbuffer} from '../objects/webgl-renderbuffer';
|
|
15
|
+
|
|
16
|
+
export type Attachment = WEBGLTextureView | WEBGLTexture; // | WEBGLRenderbuffer;
|
|
14
17
|
|
|
15
18
|
/** luma.gl Framebuffer, WebGL implementation */
|
|
16
19
|
export class WEBGLFramebuffer extends Framebuffer {
|
|
17
20
|
device: WebGLDevice;
|
|
18
|
-
gl:
|
|
21
|
+
gl: WebGL2RenderingContext;
|
|
19
22
|
handle: WebGLFramebuffer;
|
|
20
23
|
|
|
21
24
|
get texture() {
|
|
@@ -45,26 +48,30 @@ export class WEBGLFramebuffer extends Framebuffer {
|
|
|
45
48
|
|
|
46
49
|
// Walk the attachments
|
|
47
50
|
for (let i = 0; i < this.colorAttachments.length; ++i) {
|
|
48
|
-
const attachment = this.colorAttachments[i];
|
|
51
|
+
const attachment = this.colorAttachments[i] as WEBGLTextureView;
|
|
49
52
|
const attachmentPoint = GL.COLOR_ATTACHMENT0 + i;
|
|
50
53
|
if (attachment) {
|
|
51
|
-
this._attachOne(attachmentPoint, attachment
|
|
54
|
+
this._attachOne(attachmentPoint, attachment);
|
|
52
55
|
}
|
|
53
56
|
}
|
|
54
57
|
|
|
55
58
|
if (this.depthStencilAttachment) {
|
|
56
59
|
this._attachOne(
|
|
57
|
-
getDepthStencilAttachmentWebGL(this.depthStencilAttachment.format),
|
|
58
|
-
this.depthStencilAttachment as
|
|
60
|
+
getDepthStencilAttachmentWebGL(this.depthStencilAttachment.props.format),
|
|
61
|
+
this.depthStencilAttachment as WEBGLTextureView
|
|
59
62
|
);
|
|
60
63
|
}
|
|
61
64
|
|
|
62
|
-
|
|
63
|
-
|
|
65
|
+
/** Check the status */
|
|
66
|
+
// @ts-expect-error
|
|
67
|
+
if (props.check !== false) {
|
|
68
|
+
const status = this.gl.checkFramebufferStatus(GL.FRAMEBUFFER) as GL;
|
|
69
|
+
if (status !== GL.FRAMEBUFFER_COMPLETE) {
|
|
70
|
+
throw new Error(`Framebuffer ${_getFrameBufferStatus(status)}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
64
73
|
|
|
65
|
-
|
|
66
|
-
if (props.check !== false) {
|
|
67
|
-
this._checkStatus();
|
|
74
|
+
this.gl.bindFramebuffer(GL.FRAMEBUFFER, null);
|
|
68
75
|
}
|
|
69
76
|
}
|
|
70
77
|
|
|
@@ -79,32 +86,20 @@ export class WEBGLFramebuffer extends Framebuffer {
|
|
|
79
86
|
|
|
80
87
|
// PRIVATE
|
|
81
88
|
|
|
82
|
-
/** Check the status */
|
|
83
|
-
protected _checkStatus(): void {
|
|
84
|
-
const {gl} = this;
|
|
85
|
-
// TODO - should we really rely on this trick?
|
|
86
|
-
const prevHandle = gl.bindFramebuffer(GL.FRAMEBUFFER, this.handle) as unknown as WebGLFramebuffer;
|
|
87
|
-
const status = gl.checkFramebufferStatus(GL.FRAMEBUFFER);
|
|
88
|
-
gl.bindFramebuffer(GL.FRAMEBUFFER, prevHandle || null);
|
|
89
|
-
if (status !== gl.FRAMEBUFFER_COMPLETE) {
|
|
90
|
-
throw new Error(`Framebuffer ${_getFrameBufferStatus(status)}`);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
89
|
/** In WebGL we must use renderbuffers for depth/stencil attachments (unless we have extensions) */
|
|
95
90
|
protected override createDepthStencilTexture(format: TextureFormat): Texture {
|
|
96
|
-
return new WEBGLRenderbuffer(this.device, {
|
|
97
|
-
|
|
91
|
+
// return new WEBGLRenderbuffer(this.device, {
|
|
92
|
+
return new WEBGLTexture(this.device, {
|
|
93
|
+
id: `${this.id}-depth-stencil`,
|
|
98
94
|
format,
|
|
99
|
-
// dataFormat: GL.DEPTH_STENCIL,
|
|
100
|
-
// type: GL.UNSIGNED_INT_24_8,
|
|
101
95
|
width: this.width,
|
|
102
|
-
height: this.height
|
|
103
|
-
|
|
96
|
+
height: this.height,
|
|
97
|
+
mipmaps: false
|
|
98
|
+
});
|
|
104
99
|
}
|
|
105
100
|
|
|
106
|
-
/**
|
|
107
|
-
* Attachment resize is expected to be a noop if size is same
|
|
101
|
+
/**
|
|
102
|
+
* Attachment resize is expected to be a noop if size is same
|
|
108
103
|
*/
|
|
109
104
|
protected override resizeAttachments(width: number, height: number): this {
|
|
110
105
|
// for default framebuffer, just update the stored size
|
|
@@ -125,47 +120,57 @@ export class WEBGLFramebuffer extends Framebuffer {
|
|
|
125
120
|
// TODO Not clear that this is better than default destroy/create implementation
|
|
126
121
|
|
|
127
122
|
for (const colorAttachment of this.colorAttachments) {
|
|
128
|
-
(colorAttachment as WEBGLTexture).resize({width, height});
|
|
123
|
+
(colorAttachment.texture as WEBGLTexture).resize({width, height});
|
|
129
124
|
}
|
|
130
125
|
if (this.depthStencilAttachment) {
|
|
131
|
-
(this.depthStencilAttachment as WEBGLTexture).resize({width, height});
|
|
126
|
+
(this.depthStencilAttachment.texture as WEBGLTexture).resize({width, height});
|
|
132
127
|
}
|
|
133
128
|
return this;
|
|
134
129
|
}
|
|
135
130
|
|
|
136
131
|
/** Attach one attachment */
|
|
137
|
-
protected _attachOne(
|
|
138
|
-
|
|
139
|
-
attachment
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
return attachment;
|
|
144
|
-
} else if (Array.isArray(attachment)) {
|
|
132
|
+
protected _attachOne(attachmentPoint: GL, attachment: Attachment): WEBGLTexture {
|
|
133
|
+
// if (attachment instanceof WEBGLRenderbuffer) {
|
|
134
|
+
// this._attachWEBGLRenderbuffer(attachmentPoint, attachment);
|
|
135
|
+
// return attachment;
|
|
136
|
+
// }
|
|
137
|
+
if (Array.isArray(attachment)) {
|
|
145
138
|
const [texture, layer = 0, level = 0] = attachment;
|
|
146
139
|
this._attachTexture(attachmentPoint, texture as unknown as WEBGLTexture, layer, level);
|
|
147
140
|
return texture as unknown as WEBGLTexture;
|
|
148
|
-
}
|
|
141
|
+
}
|
|
142
|
+
if (attachment instanceof WEBGLTexture) {
|
|
149
143
|
this._attachTexture(attachmentPoint, attachment, 0, 0);
|
|
150
144
|
return attachment;
|
|
151
145
|
}
|
|
146
|
+
if (attachment instanceof WEBGLTextureView) {
|
|
147
|
+
const textureView = attachment;
|
|
148
|
+
this._attachTexture(
|
|
149
|
+
attachmentPoint,
|
|
150
|
+
textureView.texture,
|
|
151
|
+
textureView.props.baseMipLevel,
|
|
152
|
+
textureView.props.baseArrayLayer
|
|
153
|
+
);
|
|
154
|
+
return attachment.texture;
|
|
155
|
+
}
|
|
152
156
|
throw new Error('attach');
|
|
153
157
|
}
|
|
154
158
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
159
|
+
// TODO - we do not seem to need render buffers in WebGL 2
|
|
160
|
+
// protected _attachWEBGLRenderbuffer(attachment: GL, renderbuffer: WEBGLRenderbuffer): void {
|
|
161
|
+
// this.gl.framebufferRenderbuffer(
|
|
162
|
+
// GL.FRAMEBUFFER,
|
|
163
|
+
// attachment,
|
|
164
|
+
// GL.RENDERBUFFER,
|
|
165
|
+
// renderbuffer.handle
|
|
166
|
+
// );
|
|
167
|
+
// }
|
|
163
168
|
|
|
164
169
|
/**
|
|
165
170
|
* @param attachment
|
|
166
171
|
* @param texture
|
|
167
172
|
* @param layer = 0 - index into WEBGLTextureArray and Texture3D or face for `TextureCubeMap`
|
|
168
|
-
* @param level
|
|
173
|
+
* @param level = 0 - mipmapLevel
|
|
169
174
|
*/
|
|
170
175
|
protected _attachTexture(
|
|
171
176
|
attachment: GL,
|
|
@@ -173,14 +178,14 @@ export class WEBGLFramebuffer extends Framebuffer {
|
|
|
173
178
|
layer: number,
|
|
174
179
|
level: number
|
|
175
180
|
): void {
|
|
176
|
-
const {gl
|
|
181
|
+
const {gl} = this.device;
|
|
182
|
+
|
|
177
183
|
gl.bindTexture(texture.target, texture.handle);
|
|
178
184
|
|
|
179
185
|
switch (texture.target) {
|
|
180
186
|
case GL.TEXTURE_2D_ARRAY:
|
|
181
187
|
case GL.TEXTURE_3D:
|
|
182
|
-
|
|
183
|
-
gl2?.framebufferTextureLayer(GL.FRAMEBUFFER, attachment, texture.target, level, layer);
|
|
188
|
+
gl.framebufferTextureLayer(GL.FRAMEBUFFER, attachment, texture.target, level, layer);
|
|
184
189
|
break;
|
|
185
190
|
|
|
186
191
|
case GL.TEXTURE_CUBE_MAP:
|
|
@@ -207,7 +212,9 @@ export class WEBGLFramebuffer extends Framebuffer {
|
|
|
207
212
|
function mapIndexToCubeMapFace(layer: number | GL): GL {
|
|
208
213
|
// TEXTURE_CUBE_MAP_POSITIVE_X is a big value (0x8515)
|
|
209
214
|
// if smaller assume layer is index, otherwise assume it is already a cube map face constant
|
|
210
|
-
return layer < (GL.TEXTURE_CUBE_MAP_POSITIVE_X as number)
|
|
215
|
+
return layer < (GL.TEXTURE_CUBE_MAP_POSITIVE_X as number)
|
|
216
|
+
? layer + GL.TEXTURE_CUBE_MAP_POSITIVE_X
|
|
217
|
+
: layer;
|
|
211
218
|
}
|
|
212
219
|
|
|
213
220
|
// Helper METHODS
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
// WebGL2 Query (also handles disjoint timer extensions)
|
|
2
|
+
import {QuerySet, QuerySetProps} from '@luma.gl/core';
|
|
3
|
+
import {GL} from '@luma.gl/constants';
|
|
4
|
+
import {WebGLDevice} from '../webgl-device';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Asynchronous queries for different kinds of information
|
|
8
|
+
*/
|
|
9
|
+
export class WEBGLQuerySet extends QuerySet {
|
|
10
|
+
device: WebGLDevice;
|
|
11
|
+
handle: WebGLQuery;
|
|
12
|
+
|
|
13
|
+
target: number | null = null;
|
|
14
|
+
_queryPending = false;
|
|
15
|
+
_pollingPromise: Promise<any> | null = null;
|
|
16
|
+
|
|
17
|
+
override get [Symbol.toStringTag](): string {
|
|
18
|
+
return 'Query';
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Create a query class
|
|
22
|
+
constructor(device: WebGLDevice, props: QuerySetProps) {
|
|
23
|
+
super(device, props);
|
|
24
|
+
this.device = device;
|
|
25
|
+
|
|
26
|
+
if (props.count > 1) {
|
|
27
|
+
throw new Error('WebGL QuerySet can only have one value');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
this.handle = this.device.gl.createQuery();
|
|
31
|
+
Object.seal(this);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
override destroy() {
|
|
35
|
+
this.device.gl.deleteQuery(this.handle);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// FOR RENDER PASS AND COMMAND ENCODER
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Shortcut for timer query (dependent on extension in both WebGL1 and 2)
|
|
42
|
+
* Measures GPU time delta between this call and a matching `end` call in the
|
|
43
|
+
* GPU instruction stream.
|
|
44
|
+
*/
|
|
45
|
+
beginTimestampQuery(): void {
|
|
46
|
+
return this._begin(GL.TIME_ELAPSED_EXT);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
endTimestampQuery(): void {
|
|
50
|
+
this._end();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Shortcut for occlusion queries
|
|
54
|
+
beginOcclusionQuery(options?: {conservative?: boolean}): void {
|
|
55
|
+
return this._begin(
|
|
56
|
+
options?.conservative ? GL.ANY_SAMPLES_PASSED_CONSERVATIVE : GL.ANY_SAMPLES_PASSED
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
endOcclusionQuery() {
|
|
61
|
+
this._end();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Shortcut for transformFeedbackQuery
|
|
65
|
+
beginTransformFeedbackQuery(): void {
|
|
66
|
+
return this._begin(GL.TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
endTransformFeedbackQuery(): void {
|
|
70
|
+
this._end();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async resolveQuery(): Promise<bigint[]> {
|
|
74
|
+
const value = await this.pollQuery();
|
|
75
|
+
return [value];
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// PRIVATE METHODS
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Due to OpenGL API limitations, after calling `begin()` on one Query
|
|
82
|
+
* instance, `end()` must be called on that same instance before
|
|
83
|
+
* calling `begin()` on another query. While there can be multiple
|
|
84
|
+
* outstanding queries representing disjoint `begin()`/`end()` intervals.
|
|
85
|
+
* It is not possible to interleave or overlap `begin` and `end` calls.
|
|
86
|
+
*/
|
|
87
|
+
protected _begin(target: number): void {
|
|
88
|
+
// Don't start a new query if one is already active.
|
|
89
|
+
if (this._queryPending) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
this.target = target;
|
|
94
|
+
this.device.gl.beginQuery(this.target, this.handle);
|
|
95
|
+
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// ends the current query
|
|
100
|
+
protected _end(): void {
|
|
101
|
+
// Can't end a new query if the last one hasn't been resolved.
|
|
102
|
+
if (this._queryPending) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (this.target) {
|
|
107
|
+
this.device.gl.endQuery(this.target);
|
|
108
|
+
this.target = null;
|
|
109
|
+
this._queryPending = true;
|
|
110
|
+
}
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Returns true if the query result is available
|
|
115
|
+
isResultAvailable(): boolean {
|
|
116
|
+
if (!this._queryPending) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const resultAvailable = this.device.gl.getQueryParameter(
|
|
121
|
+
this.handle,
|
|
122
|
+
GL.QUERY_RESULT_AVAILABLE
|
|
123
|
+
);
|
|
124
|
+
if (resultAvailable) {
|
|
125
|
+
this._queryPending = false;
|
|
126
|
+
}
|
|
127
|
+
return resultAvailable;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Timing query is disjoint, i.e. results are invalid
|
|
131
|
+
isTimerDisjoint(): boolean {
|
|
132
|
+
return this.device.gl.getParameter(GL.GPU_DISJOINT_EXT);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Returns query result.
|
|
136
|
+
getResult(): any {
|
|
137
|
+
return this.device.gl.getQueryParameter(this.handle, GL.QUERY_RESULT);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Returns the query result, converted to milliseconds to match JavaScript conventions.
|
|
141
|
+
getTimerMilliseconds() {
|
|
142
|
+
return this.getResult() / 1e6;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Polls the query
|
|
146
|
+
pollQuery(limit: number = Number.POSITIVE_INFINITY): Promise<any> {
|
|
147
|
+
if (this._pollingPromise) {
|
|
148
|
+
return this._pollingPromise;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
let counter = 0;
|
|
152
|
+
|
|
153
|
+
this._pollingPromise = new Promise((resolve, reject) => {
|
|
154
|
+
const poll = () => {
|
|
155
|
+
if (this.isResultAvailable()) {
|
|
156
|
+
resolve(this.getResult());
|
|
157
|
+
this._pollingPromise = null;
|
|
158
|
+
} else if (counter++ > limit) {
|
|
159
|
+
reject('Timed out');
|
|
160
|
+
this._pollingPromise = null;
|
|
161
|
+
} else {
|
|
162
|
+
requestAnimationFrame(poll);
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
requestAnimationFrame(poll);
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
return this._pollingPromise;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
// luma.gl
|
|
1
|
+
// luma.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
2
3
|
// Copyright (c) vis.gl contributors
|
|
3
4
|
|
|
4
5
|
import {RenderPass, RenderPassProps, NumberArray, RenderPassParameters} from '@luma.gl/core';
|
|
@@ -7,6 +8,7 @@ import {GL, GLParameters} from '@luma.gl/constants';
|
|
|
7
8
|
import {withGLParameters} from '../../context/state-tracker/with-parameters';
|
|
8
9
|
import {setGLParameters} from '../../context/parameters/unified-parameter-api';
|
|
9
10
|
import {pushContextState, popContextState} from '../../context/state-tracker/track-context-state';
|
|
11
|
+
import {WEBGLQuerySet} from './webgl-query-set';
|
|
10
12
|
|
|
11
13
|
// Should collapse during minification
|
|
12
14
|
const GL_DEPTH_BUFFER_BIT = 0x00000100;
|
|
@@ -36,7 +38,7 @@ export class WEBGLRenderPass extends RenderPass {
|
|
|
36
38
|
end(): void {
|
|
37
39
|
popContextState(this.device.gl);
|
|
38
40
|
if (this.props.framebuffer) {
|
|
39
|
-
setGLParameters(this.device, {framebuffer: null});
|
|
41
|
+
setGLParameters(this.device.gl, {framebuffer: null});
|
|
40
42
|
}
|
|
41
43
|
// should add commands to CommandEncoder.
|
|
42
44
|
}
|
|
@@ -45,8 +47,6 @@ export class WEBGLRenderPass extends RenderPass {
|
|
|
45
47
|
popDebugGroup(): void {}
|
|
46
48
|
insertDebugMarker(markerLabel: string): void {}
|
|
47
49
|
|
|
48
|
-
// writeTimestamp(querySet: GPUQuerySet, queryIndex: number): void;
|
|
49
|
-
|
|
50
50
|
// beginOcclusionQuery(queryIndex: number): void;
|
|
51
51
|
// endOcclusionQuery(): void;
|
|
52
52
|
|
|
@@ -99,10 +99,20 @@ export class WEBGLRenderPass extends RenderPass {
|
|
|
99
99
|
|
|
100
100
|
this.glParameters = glParameters;
|
|
101
101
|
|
|
102
|
-
setGLParameters(this.device, glParameters);
|
|
102
|
+
setGLParameters(this.device.gl, glParameters);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
beginOcclusionQuery(queryIndex: number): void {
|
|
106
|
+
const webglQuerySet = this.props.occlusionQuerySet as WEBGLQuerySet;
|
|
107
|
+
webglQuerySet?.beginOcclusionQuery();
|
|
103
108
|
}
|
|
104
109
|
|
|
105
|
-
|
|
110
|
+
override endOcclusionQuery(): void {
|
|
111
|
+
const webglQuerySet = this.props.occlusionQuerySet as WEBGLQuerySet;
|
|
112
|
+
webglQuerySet?.endOcclusionQuery();
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// PRIVATE
|
|
106
116
|
|
|
107
117
|
/**
|
|
108
118
|
* Optionally clears depth, color and stencil buffers based on parameters
|
|
@@ -127,33 +137,33 @@ export class WEBGLRenderPass extends RenderPass {
|
|
|
127
137
|
|
|
128
138
|
if (clearMask !== 0) {
|
|
129
139
|
// Temporarily set any clear "colors" and call clear
|
|
130
|
-
withGLParameters(this.device, glParameters, () => {
|
|
140
|
+
withGLParameters(this.device.gl, glParameters, () => {
|
|
131
141
|
this.device.gl.clear(clearMask);
|
|
132
142
|
});
|
|
133
143
|
|
|
134
144
|
// TODO - clear multiple color attachments
|
|
135
145
|
// for (attachment of this.framebuffer.colorAttachments) {
|
|
136
|
-
// this.clearColorBuffer
|
|
146
|
+
// this.clearColorBuffer
|
|
137
147
|
// }
|
|
138
148
|
}
|
|
139
149
|
}
|
|
140
150
|
|
|
141
|
-
/**
|
|
142
|
-
* WebGL2 - clear a specific color buffer
|
|
151
|
+
/**
|
|
152
|
+
* WebGL2 - clear a specific color buffer
|
|
143
153
|
*/
|
|
144
154
|
protected clearColorBuffer(drawBuffer: number = 0, value: NumberArray = [0, 0, 0, 0]) {
|
|
145
|
-
withGLParameters(this.device.
|
|
155
|
+
withGLParameters(this.device.gl, {framebuffer: this.props.framebuffer}, () => {
|
|
146
156
|
// Method selection per OpenGL ES 3 docs
|
|
147
157
|
switch (value.constructor) {
|
|
148
158
|
case Int32Array:
|
|
149
|
-
this.device.
|
|
159
|
+
this.device.gl.clearBufferiv(GL_COLOR, drawBuffer, value);
|
|
150
160
|
break;
|
|
151
161
|
case Uint32Array:
|
|
152
|
-
this.device.
|
|
162
|
+
this.device.gl.clearBufferuiv(GL_COLOR, drawBuffer, value);
|
|
153
163
|
break;
|
|
154
164
|
case Float32Array:
|
|
155
165
|
default:
|
|
156
|
-
this.device.
|
|
166
|
+
this.device.gl.clearBufferfv(GL_COLOR, drawBuffer, value);
|
|
157
167
|
break;
|
|
158
168
|
}
|
|
159
169
|
});
|
|
@@ -165,16 +175,16 @@ export class WEBGLRenderPass extends RenderPass {
|
|
|
165
175
|
// const GL_DEPTH_STENCIL = 0x84f9;
|
|
166
176
|
|
|
167
177
|
// case GL_DEPTH:
|
|
168
|
-
// this.device.
|
|
178
|
+
// this.device.gl.clearBufferfv(GL_DEPTH, 0, [value]);
|
|
169
179
|
// break;
|
|
170
180
|
|
|
171
181
|
// case GL_STENCIL:
|
|
172
|
-
// this.device.
|
|
182
|
+
// this.device.gl.clearBufferiv(GL_STENCIL, 0, [value]);
|
|
173
183
|
// break;
|
|
174
184
|
|
|
175
185
|
// case GL_DEPTH_STENCIL:
|
|
176
186
|
// const [depth, stencil] = value;
|
|
177
|
-
// this.device.
|
|
187
|
+
// this.device.gl.clearBufferfi(GL_DEPTH_STENCIL, 0, depth, stencil);
|
|
178
188
|
// break;
|
|
179
189
|
|
|
180
190
|
// default:
|
|
@@ -182,4 +192,3 @@ export class WEBGLRenderPass extends RenderPass {
|
|
|
182
192
|
// }
|
|
183
193
|
// });
|
|
184
194
|
}
|
|
185
|
-
|