@luma.gl/webgl 9.0.0-beta.5 → 9.0.0-beta.7
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 +128 -71
- package/dist/adapter/converters/sampler-parameters.d.ts.map +1 -1
- package/dist/adapter/converters/sampler-parameters.js +20 -19
- package/dist/adapter/converters/shader-formats.d.ts.map +1 -1
- package/dist/adapter/converters/shader-formats.js +40 -20
- package/dist/adapter/converters/texture-formats.d.ts +16 -11
- package/dist/adapter/converters/texture-formats.d.ts.map +1 -1
- package/dist/adapter/converters/texture-formats.js +224 -205
- package/dist/adapter/converters/vertex-formats.d.ts.map +1 -1
- package/dist/adapter/converters/vertex-formats.js +22 -21
- package/dist/adapter/device-helpers/webgl-device-features.d.ts +19 -5
- package/dist/adapter/device-helpers/webgl-device-features.d.ts.map +1 -1
- package/dist/adapter/device-helpers/webgl-device-features.js +89 -43
- package/dist/adapter/device-helpers/webgl-device-info.d.ts +2 -1
- package/dist/adapter/device-helpers/webgl-device-info.d.ts.map +1 -1
- package/dist/adapter/device-helpers/webgl-device-info.js +22 -19
- package/dist/adapter/device-helpers/webgl-device-limits.d.ts +33 -48
- package/dist/adapter/device-helpers/webgl-device-limits.d.ts.map +1 -1
- package/dist/adapter/device-helpers/webgl-device-limits.js +42 -87
- package/dist/adapter/helpers/decode-webgl-types.d.ts.map +1 -1
- package/dist/adapter/helpers/decode-webgl-types.js +47 -46
- package/dist/adapter/helpers/get-shader-layout.d.ts.map +1 -1
- package/dist/adapter/helpers/get-shader-layout.js +35 -34
- package/dist/adapter/helpers/parse-shader-compiler-log.d.ts.map +1 -1
- package/dist/adapter/helpers/parse-shader-compiler-log.js +3 -2
- package/dist/adapter/helpers/set-uniform.d.ts.map +1 -1
- package/dist/adapter/helpers/set-uniform.js +42 -41
- package/dist/adapter/helpers/webgl-topology-utils.d.ts.map +1 -1
- package/dist/adapter/helpers/webgl-topology-utils.js +40 -39
- package/dist/adapter/objects/constants-to-keys.d.ts.map +1 -1
- package/dist/adapter/objects/constants-to-keys.js +2 -1
- 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 +30 -17
- package/dist/adapter/objects/webgl-resource.d.ts +2 -24
- package/dist/adapter/objects/webgl-resource.d.ts.map +1 -1
- package/dist/adapter/objects/webgl-resource.js +6 -101
- package/dist/adapter/resources/webgl-buffer.d.ts +1 -1
- package/dist/adapter/resources/webgl-buffer.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-buffer.js +16 -15
- 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 +32 -31
- 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 +4 -2
- package/dist/adapter/resources/webgl-external-texture.js +6 -5
- package/dist/adapter/resources/webgl-framebuffer.d.ts +6 -10
- package/dist/adapter/resources/webgl-framebuffer.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-framebuffer.js +60 -53
- 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 +20 -12
- package/dist/adapter/resources/webgl-render-pipeline.d.ts +4 -5
- package/dist/adapter/resources/webgl-render-pipeline.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-render-pipeline.js +52 -61
- package/dist/adapter/resources/webgl-sampler.d.ts +1 -1
- package/dist/adapter/resources/webgl-sampler.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-sampler.js +5 -4
- package/dist/adapter/resources/webgl-shader.d.ts +3 -2
- package/dist/adapter/resources/webgl-shader.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-shader.js +15 -9
- 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 +6 -4
- package/dist/adapter/resources/webgl-texture.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-texture.js +39 -32
- package/dist/adapter/resources/webgl-transform-feedback.d.ts +1 -1
- package/dist/adapter/resources/webgl-transform-feedback.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-transform-feedback.js +10 -10
- 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 +10 -9
- 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 +3 -2
- package/dist/adapter/webgl-device.d.ts +35 -30
- package/dist/adapter/webgl-device.d.ts.map +1 -1
- package/dist/adapter/webgl-device.js +110 -109
- package/dist/classic/accessor.d.ts.map +1 -1
- package/dist/classic/accessor.js +8 -7
- package/dist/classic/clear.d.ts.map +1 -1
- package/dist/classic/clear.js +5 -4
- 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 +19 -19
- package/dist/classic/format-utils.d.ts.map +1 -1
- package/dist/classic/format-utils.js +16 -15
- package/dist/classic/typed-array-utils.d.ts.map +1 -1
- package/dist/classic/typed-array-utils.js +20 -19
- package/dist/context/debug/spector.d.ts.map +1 -1
- package/dist/context/debug/spector.js +2 -1
- package/dist/context/debug/webgl-developer-tools.d.ts.map +1 -1
- package/dist/context/debug/webgl-developer-tools.js +7 -6
- package/dist/context/{context → helpers}/create-browser-context.d.ts.map +1 -1
- package/dist/context/{context → helpers}/create-browser-context.js +2 -1
- package/dist/context/{context/context-data.d.ts → helpers/webgl-context-data.d.ts} +2 -3
- 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 +7 -11
- package/dist/context/parameters/webgl-parameter-tables.d.ts +12 -13
- package/dist/context/parameters/webgl-parameter-tables.d.ts.map +1 -1
- package/dist/context/parameters/webgl-parameter-tables.js +302 -295
- package/dist/context/state-tracker/deep-array-equal.d.ts.map +1 -1
- package/dist/context/state-tracker/deep-array-equal.js +2 -1
- package/dist/context/state-tracker/track-context-state.d.ts.map +1 -1
- package/dist/context/state-tracker/track-context-state.js +5 -4
- 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 +6 -8
- package/dist/dist.dev.js +1635 -1387
- package/dist/index.cjs +1766 -1534
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +25 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -23
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -1
- package/dist.min.js +6 -6
- package/package.json +4 -4
- package/src/adapter/converters/device-parameters.ts +114 -27
- package/src/adapter/converters/sampler-parameters.ts +12 -3
- package/src/adapter/converters/shader-formats.ts +47 -22
- package/src/adapter/converters/texture-formats.ts +138 -114
- package/src/adapter/converters/vertex-formats.ts +3 -3
- package/src/adapter/device-helpers/webgl-device-features.ts +102 -50
- package/src/adapter/device-helpers/webgl-device-info.ts +28 -19
- package/src/adapter/device-helpers/webgl-device-limits.ts +46 -150
- package/src/adapter/helpers/decode-webgl-types.ts +13 -7
- package/src/adapter/helpers/get-shader-layout.ts +4 -3
- package/src/adapter/helpers/parse-shader-compiler-log.ts +10 -6
- package/src/adapter/helpers/set-uniform.ts +2 -1
- package/src/adapter/helpers/webgl-topology-utils.ts +10 -3
- package/src/adapter/objects/constants-to-keys.ts +2 -1
- package/src/adapter/objects/webgl-renderbuffer.ts +36 -14
- package/src/adapter/objects/webgl-resource.ts +7 -125
- package/src/adapter/resources/webgl-buffer.ts +4 -3
- package/src/adapter/resources/webgl-command-buffer.ts +5 -5
- package/src/adapter/resources/webgl-command-encoder.ts +14 -11
- package/src/adapter/resources/webgl-external-texture.ts +6 -5
- package/src/adapter/resources/webgl-framebuffer.ts +61 -53
- package/src/adapter/resources/webgl-query-set.ts +171 -0
- package/src/adapter/resources/webgl-render-pass.ts +20 -11
- package/src/adapter/resources/webgl-render-pipeline.ts +54 -54
- package/src/adapter/resources/webgl-sampler.ts +2 -1
- package/src/adapter/resources/webgl-shader.ts +12 -5
- package/src/adapter/resources/webgl-texture-view.ts +28 -0
- package/src/adapter/resources/webgl-texture.ts +14 -3
- package/src/adapter/resources/webgl-transform-feedback.ts +2 -7
- package/src/adapter/resources/webgl-vertex-array.ts +4 -3
- package/src/adapter/webgl-canvas-context.ts +6 -4
- package/src/adapter/webgl-device.ts +116 -107
- package/src/classic/accessor.ts +5 -4
- package/src/classic/clear.ts +14 -8
- package/src/classic/copy-and-blit.ts +11 -4
- 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 +27 -14
- package/src/context/{context → helpers}/create-browser-context.ts +3 -2
- package/src/context/helpers/webgl-context-data.ts +31 -0
- 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 +69 -32
- package/src/context/state-tracker/deep-array-equal.ts +2 -1
- package/src/context/state-tracker/track-context-state.ts +11 -6
- package/src/context/state-tracker/with-parameters.ts +8 -8
- package/src/index.ts +7 -6
- package/src/types.ts +2 -1
- package/dist/adapter/device-helpers/device-features.d.ts +0 -6
- package/dist/adapter/device-helpers/device-features.d.ts.map +0 -1
- package/dist/adapter/device-helpers/device-features.js +0 -65
- package/dist/adapter/device-helpers/device-limits.d.ts +0 -50
- package/dist/adapter/device-helpers/device-limits.d.ts.map +0 -1
- package/dist/adapter/device-helpers/device-limits.js +0 -92
- 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 -87
- package/dist/context/context/context-data.d.ts.map +0 -1
- package/dist/context/context/context-data.js +0 -33
- package/src/context/context/context-data.ts +0 -44
- /package/dist/context/{context → helpers}/create-browser-context.d.ts +0 -0
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
// luma.gl
|
|
1
|
+
// luma.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
2
3
|
// Copyright (c) vis.gl contributors
|
|
3
4
|
import { Framebuffer, assert } from '@luma.gl/core';
|
|
4
5
|
import { GL } from '@luma.gl/constants';
|
|
5
|
-
import { WEBGLTexture } from
|
|
6
|
-
import {
|
|
7
|
-
import { getDepthStencilAttachmentWebGL } from
|
|
6
|
+
import { WEBGLTexture } from "./webgl-texture.js";
|
|
7
|
+
import { WEBGLTextureView } from "./webgl-texture-view.js";
|
|
8
|
+
import { getDepthStencilAttachmentWebGL } from "../converters/texture-formats.js";
|
|
8
9
|
/** luma.gl Framebuffer, WebGL implementation */
|
|
9
10
|
export class WEBGLFramebuffer extends Framebuffer {
|
|
10
11
|
device;
|
|
@@ -27,23 +28,27 @@ export class WEBGLFramebuffer extends Framebuffer {
|
|
|
27
28
|
// Auto create textures for attachments if needed
|
|
28
29
|
this.autoCreateAttachmentTextures();
|
|
29
30
|
/** Attach from a map of attachments */
|
|
30
|
-
this.gl.bindFramebuffer(
|
|
31
|
+
this.gl.bindFramebuffer(36160, this.handle);
|
|
31
32
|
// Walk the attachments
|
|
32
33
|
for (let i = 0; i < this.colorAttachments.length; ++i) {
|
|
33
34
|
const attachment = this.colorAttachments[i];
|
|
34
|
-
const attachmentPoint =
|
|
35
|
+
const attachmentPoint = 36064 + i;
|
|
35
36
|
if (attachment) {
|
|
36
37
|
this._attachOne(attachmentPoint, attachment);
|
|
37
38
|
}
|
|
38
39
|
}
|
|
39
40
|
if (this.depthStencilAttachment) {
|
|
40
|
-
this._attachOne(getDepthStencilAttachmentWebGL(this.depthStencilAttachment.format), this.depthStencilAttachment);
|
|
41
|
+
this._attachOne(getDepthStencilAttachmentWebGL(this.depthStencilAttachment.props.format), this.depthStencilAttachment);
|
|
41
42
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
/** Check the status */
|
|
44
|
+
// @ts-expect-error
|
|
45
|
+
if (props.check !== false) {
|
|
46
|
+
const status = this.gl.checkFramebufferStatus(36160);
|
|
47
|
+
if (status !== 36053) {
|
|
48
|
+
throw new Error(`Framebuffer ${_getFrameBufferStatus(status)}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
this.gl.bindFramebuffer(36160, null);
|
|
47
52
|
}
|
|
48
53
|
}
|
|
49
54
|
/** destroys any auto created resources etc. */
|
|
@@ -55,26 +60,15 @@ export class WEBGLFramebuffer extends Framebuffer {
|
|
|
55
60
|
}
|
|
56
61
|
}
|
|
57
62
|
// PRIVATE
|
|
58
|
-
/** Check the status */
|
|
59
|
-
_checkStatus() {
|
|
60
|
-
const { gl } = this;
|
|
61
|
-
// TODO - should we really rely on this trick?
|
|
62
|
-
const prevHandle = gl.bindFramebuffer(GL.FRAMEBUFFER, this.handle);
|
|
63
|
-
const status = gl.checkFramebufferStatus(GL.FRAMEBUFFER);
|
|
64
|
-
gl.bindFramebuffer(GL.FRAMEBUFFER, prevHandle || null);
|
|
65
|
-
if (status !== gl.FRAMEBUFFER_COMPLETE) {
|
|
66
|
-
throw new Error(`Framebuffer ${_getFrameBufferStatus(status)}`);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
63
|
/** In WebGL we must use renderbuffers for depth/stencil attachments (unless we have extensions) */
|
|
70
64
|
createDepthStencilTexture(format) {
|
|
71
|
-
return new WEBGLRenderbuffer(this.device, {
|
|
72
|
-
|
|
65
|
+
// return new WEBGLRenderbuffer(this.device, {
|
|
66
|
+
return new WEBGLTexture(this.device, {
|
|
67
|
+
id: `${this.id}-depth-stencil`,
|
|
73
68
|
format,
|
|
74
|
-
// dataFormat: GL.DEPTH_STENCIL,
|
|
75
|
-
// type: GL.UNSIGNED_INT_24_8,
|
|
76
69
|
width: this.width,
|
|
77
|
-
height: this.height
|
|
70
|
+
height: this.height,
|
|
71
|
+
mipmaps: false
|
|
78
72
|
});
|
|
79
73
|
}
|
|
80
74
|
/**
|
|
@@ -96,33 +90,44 @@ export class WEBGLFramebuffer extends Framebuffer {
|
|
|
96
90
|
}
|
|
97
91
|
// TODO Not clear that this is better than default destroy/create implementation
|
|
98
92
|
for (const colorAttachment of this.colorAttachments) {
|
|
99
|
-
colorAttachment.resize({ width, height });
|
|
93
|
+
colorAttachment.texture.resize({ width, height });
|
|
100
94
|
}
|
|
101
95
|
if (this.depthStencilAttachment) {
|
|
102
|
-
this.depthStencilAttachment.resize({ width, height });
|
|
96
|
+
this.depthStencilAttachment.texture.resize({ width, height });
|
|
103
97
|
}
|
|
104
98
|
return this;
|
|
105
99
|
}
|
|
106
100
|
/** Attach one attachment */
|
|
107
101
|
_attachOne(attachmentPoint, attachment) {
|
|
108
|
-
if (attachment instanceof WEBGLRenderbuffer) {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
}
|
|
112
|
-
|
|
102
|
+
// if (attachment instanceof WEBGLRenderbuffer) {
|
|
103
|
+
// this._attachWEBGLRenderbuffer(attachmentPoint, attachment);
|
|
104
|
+
// return attachment;
|
|
105
|
+
// }
|
|
106
|
+
if (Array.isArray(attachment)) {
|
|
113
107
|
const [texture, layer = 0, level = 0] = attachment;
|
|
114
108
|
this._attachTexture(attachmentPoint, texture, layer, level);
|
|
115
109
|
return texture;
|
|
116
110
|
}
|
|
117
|
-
|
|
111
|
+
if (attachment instanceof WEBGLTexture) {
|
|
118
112
|
this._attachTexture(attachmentPoint, attachment, 0, 0);
|
|
119
113
|
return attachment;
|
|
120
114
|
}
|
|
115
|
+
if (attachment instanceof WEBGLTextureView) {
|
|
116
|
+
const textureView = attachment;
|
|
117
|
+
this._attachTexture(attachmentPoint, textureView.texture, textureView.props.baseMipLevel, textureView.props.baseArrayLayer);
|
|
118
|
+
return attachment.texture;
|
|
119
|
+
}
|
|
121
120
|
throw new Error('attach');
|
|
122
121
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
122
|
+
// TODO - we do not seem to need render buffers in WebGL 2
|
|
123
|
+
// protected _attachWEBGLRenderbuffer(attachment: GL, renderbuffer: WEBGLRenderbuffer): void {
|
|
124
|
+
// this.gl.framebufferRenderbuffer(
|
|
125
|
+
// GL.FRAMEBUFFER,
|
|
126
|
+
// attachment,
|
|
127
|
+
// GL.RENDERBUFFER,
|
|
128
|
+
// renderbuffer.handle
|
|
129
|
+
// );
|
|
130
|
+
// }
|
|
126
131
|
/**
|
|
127
132
|
* @param attachment
|
|
128
133
|
* @param texture
|
|
@@ -133,17 +138,17 @@ export class WEBGLFramebuffer extends Framebuffer {
|
|
|
133
138
|
const { gl } = this.device;
|
|
134
139
|
gl.bindTexture(texture.target, texture.handle);
|
|
135
140
|
switch (texture.target) {
|
|
136
|
-
case
|
|
137
|
-
case
|
|
138
|
-
gl.framebufferTextureLayer(
|
|
141
|
+
case 35866:
|
|
142
|
+
case 32879:
|
|
143
|
+
gl.framebufferTextureLayer(36160, attachment, texture.target, level, layer);
|
|
139
144
|
break;
|
|
140
|
-
case
|
|
145
|
+
case 34067:
|
|
141
146
|
// layer must be a cubemap face (or if index, converted to cube map face)
|
|
142
147
|
const face = mapIndexToCubeMapFace(layer);
|
|
143
|
-
gl.framebufferTexture2D(
|
|
148
|
+
gl.framebufferTexture2D(36160, attachment, face, texture.handle, level);
|
|
144
149
|
break;
|
|
145
|
-
case
|
|
146
|
-
gl.framebufferTexture2D(
|
|
150
|
+
case 3553:
|
|
151
|
+
gl.framebufferTexture2D(36160, attachment, 3553, texture.handle, level);
|
|
147
152
|
break;
|
|
148
153
|
default:
|
|
149
154
|
assert(false, 'Illegal texture type');
|
|
@@ -156,24 +161,26 @@ export class WEBGLFramebuffer extends Framebuffer {
|
|
|
156
161
|
function mapIndexToCubeMapFace(layer) {
|
|
157
162
|
// TEXTURE_CUBE_MAP_POSITIVE_X is a big value (0x8515)
|
|
158
163
|
// if smaller assume layer is index, otherwise assume it is already a cube map face constant
|
|
159
|
-
return layer <
|
|
164
|
+
return layer < 34069
|
|
165
|
+
? layer + 34069
|
|
166
|
+
: layer;
|
|
160
167
|
}
|
|
161
168
|
// Helper METHODS
|
|
162
169
|
// Get a string describing the framebuffer error if installed
|
|
163
170
|
function _getFrameBufferStatus(status) {
|
|
164
171
|
switch (status) {
|
|
165
|
-
case
|
|
172
|
+
case 36053:
|
|
166
173
|
return 'success';
|
|
167
|
-
case
|
|
174
|
+
case 36054:
|
|
168
175
|
return 'Mismatched attachments';
|
|
169
|
-
case
|
|
176
|
+
case 36055:
|
|
170
177
|
return 'No attachments';
|
|
171
|
-
case
|
|
178
|
+
case 36057:
|
|
172
179
|
return 'Height/width mismatch';
|
|
173
|
-
case
|
|
180
|
+
case 36061:
|
|
174
181
|
return 'Unsupported or split attachments';
|
|
175
182
|
// WebGL2
|
|
176
|
-
case
|
|
183
|
+
case 36182:
|
|
177
184
|
return 'Samples mismatch';
|
|
178
185
|
// OVR_multiview2 extension
|
|
179
186
|
// case GL.FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR: return 'baseViewIndex mismatch';
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { QuerySet, QuerySetProps } from '@luma.gl/core';
|
|
2
|
+
import { WebGLDevice } from "../webgl-device.js";
|
|
3
|
+
/**
|
|
4
|
+
* Asynchronous queries for different kinds of information
|
|
5
|
+
*/
|
|
6
|
+
export declare class WEBGLQuerySet extends QuerySet {
|
|
7
|
+
device: WebGLDevice;
|
|
8
|
+
handle: WebGLQuery;
|
|
9
|
+
target: number | null;
|
|
10
|
+
_queryPending: boolean;
|
|
11
|
+
_pollingPromise: Promise<any> | null;
|
|
12
|
+
get [Symbol.toStringTag](): string;
|
|
13
|
+
constructor(device: WebGLDevice, props: QuerySetProps);
|
|
14
|
+
destroy(): void;
|
|
15
|
+
/**
|
|
16
|
+
* Shortcut for timer query (dependent on extension in both WebGL1 and 2)
|
|
17
|
+
* Measures GPU time delta between this call and a matching `end` call in the
|
|
18
|
+
* GPU instruction stream.
|
|
19
|
+
*/
|
|
20
|
+
beginTimestampQuery(): void;
|
|
21
|
+
endTimestampQuery(): void;
|
|
22
|
+
beginOcclusionQuery(options?: {
|
|
23
|
+
conservative?: boolean;
|
|
24
|
+
}): void;
|
|
25
|
+
endOcclusionQuery(): void;
|
|
26
|
+
beginTransformFeedbackQuery(): void;
|
|
27
|
+
endTransformFeedbackQuery(): void;
|
|
28
|
+
resolveQuery(): Promise<bigint[]>;
|
|
29
|
+
/**
|
|
30
|
+
* Due to OpenGL API limitations, after calling `begin()` on one Query
|
|
31
|
+
* instance, `end()` must be called on that same instance before
|
|
32
|
+
* calling `begin()` on another query. While there can be multiple
|
|
33
|
+
* outstanding queries representing disjoint `begin()`/`end()` intervals.
|
|
34
|
+
* It is not possible to interleave or overlap `begin` and `end` calls.
|
|
35
|
+
*/
|
|
36
|
+
protected _begin(target: number): void;
|
|
37
|
+
protected _end(): void;
|
|
38
|
+
isResultAvailable(): boolean;
|
|
39
|
+
isTimerDisjoint(): boolean;
|
|
40
|
+
getResult(): any;
|
|
41
|
+
getTimerMilliseconds(): number;
|
|
42
|
+
pollQuery(limit?: number): Promise<any>;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=webgl-query-set.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgl-query-set.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgl-query-set.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,QAAQ,EAAE,aAAa,EAAC,MAAM,eAAe,CAAC;AAEtD,OAAO,EAAC,WAAW,EAAC,2BAAwB;AAE5C;;GAEG;AACH,qBAAa,aAAc,SAAQ,QAAQ;IACzC,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IAEnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC7B,aAAa,UAAS;IACtB,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAQ;IAE5C,IAAa,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,CAE1C;gBAGW,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa;IAY5C,OAAO;IAMhB;;;;OAIG;IACH,mBAAmB,IAAI,IAAI;IAI3B,iBAAiB,IAAI,IAAI;IAKzB,mBAAmB,CAAC,OAAO,CAAC,EAAE;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAC,GAAG,IAAI;IAM7D,iBAAiB;IAKjB,2BAA2B,IAAI,IAAI;IAInC,yBAAyB,IAAI,IAAI;IAI3B,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAOvC;;;;;;OAMG;IACH,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAatC,SAAS,CAAC,IAAI,IAAI,IAAI;IAetB,iBAAiB,IAAI,OAAO;IAgB5B,eAAe,IAAI,OAAO;IAK1B,SAAS,IAAI,GAAG;IAKhB,oBAAoB;IAKpB,SAAS,CAAC,KAAK,GAAE,MAAiC,GAAG,OAAO,CAAC,GAAG,CAAC;CAyBlE"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
// WebGL2 Query (also handles disjoint timer extensions)
|
|
2
|
+
import { QuerySet } from '@luma.gl/core';
|
|
3
|
+
import { GL } from '@luma.gl/constants';
|
|
4
|
+
/**
|
|
5
|
+
* Asynchronous queries for different kinds of information
|
|
6
|
+
*/
|
|
7
|
+
export class WEBGLQuerySet extends QuerySet {
|
|
8
|
+
device;
|
|
9
|
+
handle;
|
|
10
|
+
target = null;
|
|
11
|
+
_queryPending = false;
|
|
12
|
+
_pollingPromise = null;
|
|
13
|
+
get [Symbol.toStringTag]() {
|
|
14
|
+
return 'Query';
|
|
15
|
+
}
|
|
16
|
+
// Create a query class
|
|
17
|
+
constructor(device, props) {
|
|
18
|
+
super(device, props);
|
|
19
|
+
this.device = device;
|
|
20
|
+
if (props.count > 1) {
|
|
21
|
+
throw new Error('WebGL QuerySet can only have one value');
|
|
22
|
+
}
|
|
23
|
+
this.handle = this.device.gl.createQuery();
|
|
24
|
+
Object.seal(this);
|
|
25
|
+
}
|
|
26
|
+
destroy() {
|
|
27
|
+
this.device.gl.deleteQuery(this.handle);
|
|
28
|
+
}
|
|
29
|
+
// FOR RENDER PASS AND COMMAND ENCODER
|
|
30
|
+
/**
|
|
31
|
+
* Shortcut for timer query (dependent on extension in both WebGL1 and 2)
|
|
32
|
+
* Measures GPU time delta between this call and a matching `end` call in the
|
|
33
|
+
* GPU instruction stream.
|
|
34
|
+
*/
|
|
35
|
+
beginTimestampQuery() {
|
|
36
|
+
return this._begin(35007);
|
|
37
|
+
}
|
|
38
|
+
endTimestampQuery() {
|
|
39
|
+
this._end();
|
|
40
|
+
}
|
|
41
|
+
// Shortcut for occlusion queries
|
|
42
|
+
beginOcclusionQuery(options) {
|
|
43
|
+
return this._begin(options?.conservative ? 36202 : 35887);
|
|
44
|
+
}
|
|
45
|
+
endOcclusionQuery() {
|
|
46
|
+
this._end();
|
|
47
|
+
}
|
|
48
|
+
// Shortcut for transformFeedbackQuery
|
|
49
|
+
beginTransformFeedbackQuery() {
|
|
50
|
+
return this._begin(35976);
|
|
51
|
+
}
|
|
52
|
+
endTransformFeedbackQuery() {
|
|
53
|
+
this._end();
|
|
54
|
+
}
|
|
55
|
+
async resolveQuery() {
|
|
56
|
+
const value = await this.pollQuery();
|
|
57
|
+
return [value];
|
|
58
|
+
}
|
|
59
|
+
// PRIVATE METHODS
|
|
60
|
+
/**
|
|
61
|
+
* Due to OpenGL API limitations, after calling `begin()` on one Query
|
|
62
|
+
* instance, `end()` must be called on that same instance before
|
|
63
|
+
* calling `begin()` on another query. While there can be multiple
|
|
64
|
+
* outstanding queries representing disjoint `begin()`/`end()` intervals.
|
|
65
|
+
* It is not possible to interleave or overlap `begin` and `end` calls.
|
|
66
|
+
*/
|
|
67
|
+
_begin(target) {
|
|
68
|
+
// Don't start a new query if one is already active.
|
|
69
|
+
if (this._queryPending) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
this.target = target;
|
|
73
|
+
this.device.gl.beginQuery(this.target, this.handle);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
// ends the current query
|
|
77
|
+
_end() {
|
|
78
|
+
// Can't end a new query if the last one hasn't been resolved.
|
|
79
|
+
if (this._queryPending) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (this.target) {
|
|
83
|
+
this.device.gl.endQuery(this.target);
|
|
84
|
+
this.target = null;
|
|
85
|
+
this._queryPending = true;
|
|
86
|
+
}
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
// Returns true if the query result is available
|
|
90
|
+
isResultAvailable() {
|
|
91
|
+
if (!this._queryPending) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
const resultAvailable = this.device.gl.getQueryParameter(this.handle, 34919);
|
|
95
|
+
if (resultAvailable) {
|
|
96
|
+
this._queryPending = false;
|
|
97
|
+
}
|
|
98
|
+
return resultAvailable;
|
|
99
|
+
}
|
|
100
|
+
// Timing query is disjoint, i.e. results are invalid
|
|
101
|
+
isTimerDisjoint() {
|
|
102
|
+
return this.device.gl.getParameter(36795);
|
|
103
|
+
}
|
|
104
|
+
// Returns query result.
|
|
105
|
+
getResult() {
|
|
106
|
+
return this.device.gl.getQueryParameter(this.handle, 34918);
|
|
107
|
+
}
|
|
108
|
+
// Returns the query result, converted to milliseconds to match JavaScript conventions.
|
|
109
|
+
getTimerMilliseconds() {
|
|
110
|
+
return this.getResult() / 1e6;
|
|
111
|
+
}
|
|
112
|
+
// Polls the query
|
|
113
|
+
pollQuery(limit = Number.POSITIVE_INFINITY) {
|
|
114
|
+
if (this._pollingPromise) {
|
|
115
|
+
return this._pollingPromise;
|
|
116
|
+
}
|
|
117
|
+
let counter = 0;
|
|
118
|
+
this._pollingPromise = new Promise((resolve, reject) => {
|
|
119
|
+
const poll = () => {
|
|
120
|
+
if (this.isResultAvailable()) {
|
|
121
|
+
resolve(this.getResult());
|
|
122
|
+
this._pollingPromise = null;
|
|
123
|
+
}
|
|
124
|
+
else if (counter++ > limit) {
|
|
125
|
+
reject('Timed out');
|
|
126
|
+
this._pollingPromise = null;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
requestAnimationFrame(poll);
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
requestAnimationFrame(poll);
|
|
133
|
+
});
|
|
134
|
+
return this._pollingPromise;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { RenderPass, RenderPassProps, NumberArray, RenderPassParameters } from '@luma.gl/core';
|
|
2
|
-
import { WebGLDevice } from
|
|
2
|
+
import { WebGLDevice } from "../webgl-device.js";
|
|
3
3
|
import { GLParameters } from '@luma.gl/constants';
|
|
4
4
|
export declare class WEBGLRenderPass extends RenderPass {
|
|
5
5
|
readonly device: WebGLDevice;
|
|
@@ -14,6 +14,8 @@ export declare class WEBGLRenderPass extends RenderPass {
|
|
|
14
14
|
* Maps RenderPass parameters to GL parameters
|
|
15
15
|
*/
|
|
16
16
|
setParameters(parameters?: RenderPassParameters): void;
|
|
17
|
+
beginOcclusionQuery(queryIndex: number): void;
|
|
18
|
+
endOcclusionQuery(): void;
|
|
17
19
|
/**
|
|
18
20
|
* Optionally clears depth, color and stencil buffers based on parameters
|
|
19
21
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgl-render-pass.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgl-render-pass.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"webgl-render-pass.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgl-render-pass.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,oBAAoB,EAAC,MAAM,eAAe,CAAC;AAC7F,OAAO,EAAC,WAAW,EAAC,2BAAwB;AAC5C,OAAO,EAAK,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAapD,qBAAa,eAAgB,SAAQ,UAAU;IAC7C,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAE7B,8DAA8D;IAC9D,YAAY,EAAE,YAAY,CAAC;gBAEf,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe;IAYvD,GAAG,IAAI,IAAI;IAQX,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IACxC,aAAa,IAAI,IAAI;IACrB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAO5C;;OAEG;IACH,aAAa,CAAC,UAAU,GAAE,oBAAyB,GAAG,IAAI;IA+C1D,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAKpC,iBAAiB,IAAI,IAAI;IAOlC;;OAEG;IACH,SAAS,CAAC,KAAK,IAAI,IAAI;IA+BvB;;OAEG;IACH,SAAS,CAAC,gBAAgB,CAAC,UAAU,GAAE,MAAU,EAAE,KAAK,GAAE,WAA0B;CAwCrF"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
// luma.gl
|
|
1
|
+
// luma.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
2
3
|
// Copyright (c) vis.gl contributors
|
|
3
4
|
import { RenderPass } from '@luma.gl/core';
|
|
4
5
|
import { GL } from '@luma.gl/constants';
|
|
5
|
-
import { withGLParameters } from
|
|
6
|
-
import { setGLParameters } from
|
|
7
|
-
import { pushContextState, popContextState } from
|
|
6
|
+
import { withGLParameters } from "../../context/state-tracker/with-parameters.js";
|
|
7
|
+
import { setGLParameters } from "../../context/parameters/unified-parameter-api.js";
|
|
8
|
+
import { pushContextState, popContextState } from "../../context/state-tracker/track-context-state.js";
|
|
8
9
|
// Should collapse during minification
|
|
9
10
|
const GL_DEPTH_BUFFER_BIT = 0x00000100;
|
|
10
11
|
const GL_STENCIL_BUFFER_BIT = 0x00000400;
|
|
@@ -26,14 +27,13 @@ export class WEBGLRenderPass extends RenderPass {
|
|
|
26
27
|
end() {
|
|
27
28
|
popContextState(this.device.gl);
|
|
28
29
|
if (this.props.framebuffer) {
|
|
29
|
-
setGLParameters(this.device, { framebuffer: null });
|
|
30
|
+
setGLParameters(this.device.gl, { framebuffer: null });
|
|
30
31
|
}
|
|
31
32
|
// should add commands to CommandEncoder.
|
|
32
33
|
}
|
|
33
34
|
pushDebugGroup(groupLabel) { }
|
|
34
35
|
popDebugGroup() { }
|
|
35
36
|
insertDebugMarker(markerLabel) { }
|
|
36
|
-
// writeTimestamp(querySet: GPUQuerySet, queryIndex: number): void;
|
|
37
37
|
// beginOcclusionQuery(queryIndex: number): void;
|
|
38
38
|
// endOcclusionQuery(): void;
|
|
39
39
|
// executeBundles(bundles: Iterable<GPURenderBundle>): void;
|
|
@@ -50,7 +50,7 @@ export class WEBGLRenderPass extends RenderPass {
|
|
|
50
50
|
glParameters.depthMask = !this.props.depthReadOnly;
|
|
51
51
|
}
|
|
52
52
|
glParameters.stencilMask = this.props.stencilReadOnly ? 0 : 1;
|
|
53
|
-
glParameters[
|
|
53
|
+
glParameters[35977] = this.props.discard;
|
|
54
54
|
// Map the four renderpass parameters to WebGL parameters
|
|
55
55
|
if (parameters.viewport) {
|
|
56
56
|
// WebGPU viewports are 6 coordinates (X, Y, Z)
|
|
@@ -75,12 +75,20 @@ export class WEBGLRenderPass extends RenderPass {
|
|
|
75
75
|
console.warn('RenderPassParameters.stencilReference not yet implemented in WebGL');
|
|
76
76
|
// parameters.stencilFunc = [func, ref, mask];
|
|
77
77
|
// Does this work?
|
|
78
|
-
parameters[
|
|
78
|
+
parameters[2967] = parameters.stencilReference;
|
|
79
79
|
}
|
|
80
80
|
this.glParameters = glParameters;
|
|
81
|
-
setGLParameters(this.device, glParameters);
|
|
81
|
+
setGLParameters(this.device.gl, glParameters);
|
|
82
82
|
}
|
|
83
|
-
|
|
83
|
+
beginOcclusionQuery(queryIndex) {
|
|
84
|
+
const webglQuerySet = this.props.occlusionQuerySet;
|
|
85
|
+
webglQuerySet?.beginOcclusionQuery();
|
|
86
|
+
}
|
|
87
|
+
endOcclusionQuery() {
|
|
88
|
+
const webglQuerySet = this.props.occlusionQuerySet;
|
|
89
|
+
webglQuerySet?.endOcclusionQuery();
|
|
90
|
+
}
|
|
91
|
+
// PRIVATE
|
|
84
92
|
/**
|
|
85
93
|
* Optionally clears depth, color and stencil buffers based on parameters
|
|
86
94
|
*/
|
|
@@ -101,12 +109,12 @@ export class WEBGLRenderPass extends RenderPass {
|
|
|
101
109
|
}
|
|
102
110
|
if (clearMask !== 0) {
|
|
103
111
|
// Temporarily set any clear "colors" and call clear
|
|
104
|
-
withGLParameters(this.device, glParameters, () => {
|
|
112
|
+
withGLParameters(this.device.gl, glParameters, () => {
|
|
105
113
|
this.device.gl.clear(clearMask);
|
|
106
114
|
});
|
|
107
115
|
// TODO - clear multiple color attachments
|
|
108
116
|
// for (attachment of this.framebuffer.colorAttachments) {
|
|
109
|
-
// this.clearColorBuffer
|
|
117
|
+
// this.clearColorBuffer
|
|
110
118
|
// }
|
|
111
119
|
}
|
|
112
120
|
}
|
|
@@ -2,9 +2,9 @@ import type { UniformValue, RenderPipelineProps, Binding } from '@luma.gl/core';
|
|
|
2
2
|
import type { ShaderLayout } from '@luma.gl/core';
|
|
3
3
|
import type { RenderPass, VertexArray } from '@luma.gl/core';
|
|
4
4
|
import { RenderPipeline } from '@luma.gl/core';
|
|
5
|
-
import { WebGLDevice } from
|
|
6
|
-
import { WEBGLShader } from
|
|
7
|
-
import { WEBGLTransformFeedback } from
|
|
5
|
+
import { WebGLDevice } from "../webgl-device.js";
|
|
6
|
+
import { WEBGLShader } from "./webgl-shader.js";
|
|
7
|
+
import { WEBGLTransformFeedback } from "./webgl-transform-feedback.js";
|
|
8
8
|
/** Creates a new render pipeline */
|
|
9
9
|
export declare class WEBGLRenderPipeline extends RenderPipeline {
|
|
10
10
|
/** The WebGL device that created this render pipeline */
|
|
@@ -32,8 +32,6 @@ export declare class WEBGLRenderPipeline extends RenderPipeline {
|
|
|
32
32
|
* @todo needed for portable model
|
|
33
33
|
*/
|
|
34
34
|
setBindings(bindings: Record<string, Binding>): void;
|
|
35
|
-
/** This function is @deprecated, use uniform buffers */
|
|
36
|
-
setUniforms(uniforms: Record<string, UniformValue>): void;
|
|
37
35
|
/** @todo needed for portable model
|
|
38
36
|
* @note The WebGL API is offers many ways to draw things
|
|
39
37
|
* This function unifies those ways into a single call using common parameters with sane defaults
|
|
@@ -51,6 +49,7 @@ export declare class WEBGLRenderPipeline extends RenderPipeline {
|
|
|
51
49
|
baseVertex?: number;
|
|
52
50
|
transformFeedback?: WEBGLTransformFeedback;
|
|
53
51
|
}): boolean;
|
|
52
|
+
setUniformsWebGL(uniforms: Record<string, UniformValue>): void;
|
|
54
53
|
protected _linkShaders(): Promise<void>;
|
|
55
54
|
/** Report link status. First, check for shader compilation failures if linking fails */
|
|
56
55
|
_reportLinkStatus(status: 'success' | 'linking' | 'validation'): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgl-render-pipeline.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgl-render-pipeline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"webgl-render-pipeline.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgl-render-pipeline.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,YAAY,EAAE,mBAAmB,EAAE,OAAO,EAAC,MAAM,eAAe,CAAC;AAC9E,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAC,UAAU,EAAE,WAAW,EAAC,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAC,cAAc,EAAsC,MAAM,eAAe,CAAC;AAUlF,OAAO,EAAC,WAAW,EAAC,2BAAwB;AAE5C,OAAO,EAAC,WAAW,EAAC,0BAAuB;AAK3C,OAAO,EAAC,sBAAsB,EAAC,sCAAmC;AAKlE,oCAAoC;AACpC,qBAAa,mBAAoB,SAAQ,cAAc;IACrD,yDAAyD;IACzD,MAAM,EAAE,WAAW,CAAC;IACpB,yCAAyC;IACzC,MAAM,EAAE,YAAY,CAAC;IACrB,oBAAoB;IACpB,EAAE,EAAE,WAAW,CAAC;IAChB,sBAAsB;IACtB,EAAE,EAAE,WAAW,CAAC;IAChB,mEAAmE;IACnE,kBAAkB,EAAE,YAAY,CAAC;IAEjC,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAM;IAC5C,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;IACvC,qBAAqB;IACrB,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAQ;IAEjC,aAAa,EAAE,MAAM,CAAK;IAC1B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAM;gBAEnC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,mBAAmB;IAyClD,OAAO,IAAI,IAAI;IAQxB;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAuDpD;;;OAGG;IACH,IAAI,CAAC,OAAO,EAAE;QACZ,UAAU,EAAE,UAAU,CAAC;QACvB,wBAAwB;QACxB,WAAW,EAAE,WAAW,CAAC;QACzB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,iBAAiB,CAAC,EAAE,sBAAsB,CAAC;KAC5C,GAAG,OAAO;IAgGF,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC;cAkBhD,YAAY;IA2B5B,wFAAwF;IACxF,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,YAAY;IAmB9D;;;;OAIG;IACH,cAAc,IAAI,SAAS,GAAG,SAAS,GAAG,YAAY;IAmBtD,6DAA6D;IACvD,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB3C;;;;OAIG;IACH,sBAAsB;IAatB,iDAAiD;IACjD,cAAc;IAyFd;;;OAGG;IACH,cAAc;CASf"}
|