@luma.gl/webgl 9.1.9 → 9.2.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapter/converters/device-parameters.js +14 -9
- package/dist/adapter/converters/device-parameters.js.map +1 -1
- package/dist/adapter/converters/sampler-parameters.js +13 -2
- package/dist/adapter/converters/sampler-parameters.js.map +1 -1
- package/dist/adapter/converters/shader-formats.d.ts +67 -8
- package/dist/adapter/converters/shader-formats.d.ts.map +1 -1
- package/dist/adapter/converters/shader-formats.js +82 -52
- package/dist/adapter/converters/shader-formats.js.map +1 -1
- package/dist/adapter/converters/webgl-shadertypes.d.ts +20 -0
- package/dist/adapter/converters/webgl-shadertypes.d.ts.map +1 -0
- package/dist/adapter/converters/webgl-shadertypes.js +122 -0
- package/dist/adapter/converters/webgl-shadertypes.js.map +1 -0
- package/dist/adapter/converters/webgl-texture-table.d.ts.map +1 -1
- package/dist/adapter/converters/webgl-texture-table.js +17 -13
- package/dist/adapter/converters/webgl-texture-table.js.map +1 -1
- package/dist/adapter/converters/{vertex-formats.d.ts → webgl-vertex-formats.d.ts} +4 -4
- package/dist/adapter/converters/webgl-vertex-formats.d.ts.map +1 -0
- package/dist/adapter/converters/{vertex-formats.js → webgl-vertex-formats.js} +2 -3
- package/dist/adapter/converters/webgl-vertex-formats.js.map +1 -0
- package/dist/adapter/device-helpers/webgl-device-features.d.ts.map +1 -1
- package/dist/adapter/device-helpers/webgl-device-features.js.map +1 -1
- package/dist/adapter/device-helpers/webgl-device-limits.d.ts +1 -1
- package/dist/adapter/device-helpers/webgl-device-limits.d.ts.map +1 -1
- package/dist/adapter/device-helpers/webgl-device-limits.js +1 -1
- package/dist/adapter/device-helpers/webgl-device-limits.js.map +1 -1
- package/dist/adapter/helpers/format-utils.d.ts +3 -2
- package/dist/adapter/helpers/format-utils.d.ts.map +1 -1
- package/dist/adapter/helpers/format-utils.js.map +1 -1
- package/dist/adapter/helpers/{get-shader-layout.d.ts → get-shader-layout-from-glsl.d.ts} +1 -1
- package/dist/adapter/helpers/get-shader-layout-from-glsl.d.ts.map +1 -0
- package/dist/adapter/helpers/{get-shader-layout.js → get-shader-layout-from-glsl.js} +12 -35
- package/dist/adapter/helpers/get-shader-layout-from-glsl.js.map +1 -0
- package/dist/adapter/helpers/set-uniform.d.ts +2 -2
- package/dist/adapter/helpers/set-uniform.d.ts.map +1 -1
- package/dist/adapter/helpers/set-uniform.js.map +1 -1
- package/dist/adapter/helpers/webgl-texture-utils.d.ts +2 -242
- package/dist/adapter/helpers/webgl-texture-utils.d.ts.map +1 -1
- package/dist/adapter/helpers/webgl-texture-utils.js +10 -99
- package/dist/adapter/helpers/webgl-texture-utils.js.map +1 -1
- package/dist/adapter/resources/webgl-buffer.d.ts +7 -7
- package/dist/adapter/resources/webgl-buffer.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-buffer.js +29 -18
- package/dist/adapter/resources/webgl-buffer.js.map +1 -1
- package/dist/adapter/resources/webgl-command-buffer.d.ts +4 -3
- package/dist/adapter/resources/webgl-command-buffer.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-command-buffer.js +5 -4
- package/dist/adapter/resources/webgl-command-buffer.js.map +1 -1
- package/dist/adapter/resources/webgl-command-encoder.d.ts +6 -2
- package/dist/adapter/resources/webgl-command-encoder.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-command-encoder.js +9 -4
- package/dist/adapter/resources/webgl-command-encoder.js.map +1 -1
- package/dist/adapter/resources/webgl-external-texture.js +1 -0
- package/dist/adapter/resources/webgl-external-texture.js.map +1 -1
- package/dist/adapter/resources/webgl-framebuffer.d.ts +2 -2
- package/dist/adapter/resources/webgl-framebuffer.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-framebuffer.js +2 -2
- package/dist/adapter/resources/webgl-framebuffer.js.map +1 -1
- package/dist/adapter/resources/webgl-query-set.d.ts +2 -2
- package/dist/adapter/resources/webgl-query-set.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-query-set.js +5 -1
- package/dist/adapter/resources/webgl-query-set.js.map +1 -1
- package/dist/adapter/resources/webgl-render-pass.d.ts +1 -0
- package/dist/adapter/resources/webgl-render-pass.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-render-pass.js +16 -13
- package/dist/adapter/resources/webgl-render-pass.js.map +1 -1
- package/dist/adapter/resources/webgl-render-pipeline.d.ts +5 -5
- package/dist/adapter/resources/webgl-render-pipeline.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-render-pipeline.js +28 -24
- package/dist/adapter/resources/webgl-render-pipeline.js.map +1 -1
- package/dist/adapter/resources/webgl-sampler.js +1 -1
- package/dist/adapter/resources/webgl-sampler.js.map +1 -1
- package/dist/adapter/resources/webgl-shader.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-shader.js +9 -2
- package/dist/adapter/resources/webgl-shader.js.map +1 -1
- package/dist/adapter/resources/webgl-texture-view.js +1 -1
- package/dist/adapter/resources/webgl-texture-view.js.map +1 -1
- package/dist/adapter/resources/webgl-texture.d.ts +21 -66
- package/dist/adapter/resources/webgl-texture.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-texture.js +152 -320
- package/dist/adapter/resources/webgl-texture.js.map +1 -1
- package/dist/adapter/resources/webgl-transform-feedback.d.ts +1 -1
- package/dist/adapter/resources/webgl-transform-feedback.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-transform-feedback.js +1 -1
- package/dist/adapter/resources/webgl-transform-feedback.js.map +1 -1
- package/dist/adapter/resources/webgl-vertex-array.d.ts +1 -1
- package/dist/adapter/resources/webgl-vertex-array.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-vertex-array.js +3 -2
- package/dist/adapter/resources/webgl-vertex-array.js.map +1 -1
- package/dist/adapter/webgl-adapter.d.ts +4 -3
- package/dist/adapter/webgl-adapter.d.ts.map +1 -1
- package/dist/adapter/webgl-adapter.js +43 -30
- package/dist/adapter/webgl-adapter.js.map +1 -1
- package/dist/adapter/webgl-canvas-context.d.ts +3 -24
- package/dist/adapter/webgl-canvas-context.d.ts.map +1 -1
- package/dist/adapter/webgl-canvas-context.js +5 -44
- package/dist/adapter/webgl-canvas-context.js.map +1 -1
- package/dist/adapter/webgl-device.d.ts +19 -20
- package/dist/adapter/webgl-device.d.ts.map +1 -1
- package/dist/adapter/webgl-device.js +44 -31
- package/dist/adapter/webgl-device.js.map +1 -1
- package/dist/context/debug/spector-types.d.ts.map +1 -1
- package/dist/context/debug/spector-types.js +3 -0
- package/dist/context/debug/spector-types.js.map +1 -1
- package/dist/context/debug/spector.js.map +1 -1
- package/dist/context/debug/webgl-developer-tools.js +1 -0
- package/dist/context/debug/webgl-developer-tools.js.map +1 -1
- package/dist/context/helpers/webgl-extensions.d.ts.map +1 -1
- package/dist/context/helpers/webgl-extensions.js +3 -0
- package/dist/context/helpers/webgl-extensions.js.map +1 -1
- package/dist/context/parameters/unified-parameter-api.d.ts.map +1 -1
- package/dist/context/parameters/unified-parameter-api.js +7 -0
- package/dist/context/parameters/unified-parameter-api.js.map +1 -1
- package/dist/context/parameters/webgl-parameter-tables.d.ts +1 -1
- package/dist/context/parameters/webgl-parameter-tables.d.ts.map +1 -1
- package/dist/context/parameters/webgl-parameter-tables.js +1 -0
- package/dist/context/parameters/webgl-parameter-tables.js.map +1 -1
- package/dist/context/polyfills/polyfill-webgl1-extensions.d.ts.map +1 -1
- package/dist/context/polyfills/polyfill-webgl1-extensions.js +1 -0
- package/dist/context/polyfills/polyfill-webgl1-extensions.js.map +1 -1
- package/dist/context/state-tracker/deep-array-equal.d.ts +2 -1
- package/dist/context/state-tracker/deep-array-equal.d.ts.map +1 -1
- package/dist/context/state-tracker/deep-array-equal.js +4 -5
- package/dist/context/state-tracker/deep-array-equal.js.map +1 -1
- package/dist/context/state-tracker/webgl-state-tracker.d.ts.map +1 -1
- package/dist/context/state-tracker/webgl-state-tracker.js +4 -1
- package/dist/context/state-tracker/webgl-state-tracker.js.map +1 -1
- package/dist/context/state-tracker/with-parameters.js.map +1 -1
- package/dist/dist.dev.js +4788 -4801
- package/dist/dist.min.js +2 -2
- package/dist/index.cjs +3906 -3960
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +1 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -3
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/src/adapter/converters/device-parameters.ts +19 -9
- package/src/adapter/converters/sampler-parameters.ts +13 -2
- package/src/adapter/converters/shader-formats.ts +50 -24
- package/src/adapter/converters/webgl-shadertypes.ts +151 -0
- package/src/adapter/converters/webgl-texture-table.ts +21 -15
- package/src/adapter/converters/{vertex-formats.ts → webgl-vertex-formats.ts} +4 -5
- package/src/adapter/device-helpers/webgl-device-features.ts +1 -1
- package/src/adapter/device-helpers/webgl-device-limits.ts +1 -1
- package/src/adapter/helpers/format-utils.ts +2 -2
- package/src/adapter/helpers/{get-shader-layout.ts → get-shader-layout-from-glsl.ts} +20 -50
- package/src/adapter/helpers/set-uniform.ts +2 -2
- package/src/adapter/helpers/webgl-texture-utils.ts +12 -348
- package/src/adapter/resources/webgl-buffer.ts +43 -23
- package/src/adapter/resources/webgl-command-buffer.ts +9 -8
- package/src/adapter/resources/webgl-command-encoder.ts +18 -9
- package/src/adapter/resources/webgl-framebuffer.ts +4 -4
- package/src/adapter/resources/webgl-query-set.ts +7 -3
- package/src/adapter/resources/webgl-render-pass.ts +20 -17
- package/src/adapter/resources/webgl-render-pipeline.ts +38 -37
- package/src/adapter/resources/webgl-sampler.ts +1 -1
- package/src/adapter/resources/webgl-shader.ts +11 -2
- package/src/adapter/resources/webgl-texture-view.ts +1 -1
- package/src/adapter/resources/webgl-texture.ts +184 -394
- package/src/adapter/resources/webgl-transform-feedback.ts +2 -2
- package/src/adapter/resources/webgl-vertex-array.ts +4 -3
- package/src/adapter/webgl-adapter.ts +46 -33
- package/src/adapter/webgl-canvas-context.ts +7 -47
- package/src/adapter/webgl-device.ts +64 -44
- package/src/context/debug/spector-types.ts +5 -0
- package/src/context/debug/spector.ts +1 -1
- package/src/context/debug/webgl-developer-tools.ts +9 -3
- package/src/context/helpers/webgl-extensions.ts +3 -0
- package/src/context/parameters/unified-parameter-api.ts +9 -2
- package/src/context/parameters/webgl-parameter-tables.ts +2 -0
- package/src/context/polyfills/polyfill-webgl1-extensions.ts +1 -0
- package/src/context/state-tracker/deep-array-equal.ts +11 -6
- package/src/context/state-tracker/webgl-state-tracker.ts +5 -1
- package/src/context/state-tracker/with-parameters.ts +1 -1
- package/src/index.ts +1 -5
- package/dist/adapter/converters/vertex-formats.d.ts.map +0 -1
- package/dist/adapter/converters/vertex-formats.js.map +0 -1
- package/dist/adapter/helpers/decode-webgl-types.d.ts +0 -26
- package/dist/adapter/helpers/decode-webgl-types.d.ts.map +0 -1
- package/dist/adapter/helpers/decode-webgl-types.js +0 -102
- package/dist/adapter/helpers/decode-webgl-types.js.map +0 -1
- package/dist/adapter/helpers/get-shader-layout.d.ts.map +0 -1
- package/dist/adapter/helpers/get-shader-layout.js.map +0 -1
- package/dist/adapter/helpers/typed-array-utils.d.ts +0 -44
- package/dist/adapter/helpers/typed-array-utils.d.ts.map +0 -1
- package/dist/adapter/helpers/typed-array-utils.js +0 -107
- package/dist/adapter/helpers/typed-array-utils.js.map +0 -1
- package/dist/deprecated/accessor.d.ts +0 -53
- package/dist/deprecated/accessor.d.ts.map +0 -1
- package/dist/deprecated/accessor.js +0 -177
- package/dist/deprecated/accessor.js.map +0 -1
- package/dist/utils/split-uniforms-and-bindings.d.ts +0 -9
- package/dist/utils/split-uniforms-and-bindings.d.ts.map +0 -1
- package/dist/utils/split-uniforms-and-bindings.js +0 -21
- package/dist/utils/split-uniforms-and-bindings.js.map +0 -1
- package/src/adapter/helpers/decode-webgl-types.ts +0 -134
- package/src/adapter/helpers/typed-array-utils.ts +0 -129
- package/src/deprecated/accessor.ts +0 -225
- package/src/utils/split-uniforms-and-bindings.ts +0 -31
|
@@ -8,7 +8,7 @@ import type {
|
|
|
8
8
|
CopyTextureToBufferOptions,
|
|
9
9
|
CopyTextureToTextureOptions
|
|
10
10
|
// ClearTextureOptions,
|
|
11
|
-
//
|
|
11
|
+
// TextureReadOptions
|
|
12
12
|
} from '@luma.gl/core';
|
|
13
13
|
import {CommandBuffer, Texture, Framebuffer} from '@luma.gl/core';
|
|
14
14
|
import {
|
|
@@ -53,7 +53,7 @@ type ClearTextureCommand = {
|
|
|
53
53
|
|
|
54
54
|
type ReadTextureCommand = {
|
|
55
55
|
name: 'read-texture';
|
|
56
|
-
options: {}; //
|
|
56
|
+
options: {}; // TextureReadOptions;
|
|
57
57
|
};
|
|
58
58
|
|
|
59
59
|
type Command =
|
|
@@ -65,7 +65,8 @@ type Command =
|
|
|
65
65
|
| ReadTextureCommand;
|
|
66
66
|
|
|
67
67
|
export class WEBGLCommandBuffer extends CommandBuffer {
|
|
68
|
-
device: WebGLDevice;
|
|
68
|
+
readonly device: WebGLDevice;
|
|
69
|
+
readonly handle = null;
|
|
69
70
|
commands: Command[] = [];
|
|
70
71
|
|
|
71
72
|
constructor(device: WebGLDevice) {
|
|
@@ -73,7 +74,7 @@ export class WEBGLCommandBuffer extends CommandBuffer {
|
|
|
73
74
|
this.device = device;
|
|
74
75
|
}
|
|
75
76
|
|
|
76
|
-
|
|
77
|
+
_executeCommands(commands: Command[] = this.commands) {
|
|
77
78
|
for (const command of commands) {
|
|
78
79
|
switch (command.name) {
|
|
79
80
|
case 'copy-buffer-to-buffer':
|
|
@@ -285,13 +286,13 @@ function _copyTextureToTexture(device: WebGLDevice, options: CopyTextureToTextur
|
|
|
285
286
|
// TODO - support gl.readBuffer (WebGL2 only)
|
|
286
287
|
// const prevBuffer = gl.readBuffer(attachment);
|
|
287
288
|
|
|
288
|
-
let texture: WEBGLTexture
|
|
289
|
+
let texture: WEBGLTexture;
|
|
289
290
|
let textureTarget: GL;
|
|
290
291
|
if (destinationTexture instanceof WEBGLTexture) {
|
|
291
292
|
texture = destinationTexture;
|
|
292
293
|
width = Number.isFinite(width) ? width : texture.width;
|
|
293
294
|
height = Number.isFinite(height) ? height : texture.height;
|
|
294
|
-
texture.
|
|
295
|
+
texture._bind(0);
|
|
295
296
|
textureTarget = texture.glTarget;
|
|
296
297
|
} else {
|
|
297
298
|
throw new Error('invalid destination');
|
|
@@ -329,7 +330,7 @@ function _copyTextureToTexture(device: WebGLDevice, options: CopyTextureToTextur
|
|
|
329
330
|
}
|
|
330
331
|
|
|
331
332
|
if (texture) {
|
|
332
|
-
texture.
|
|
333
|
+
texture._unbind();
|
|
333
334
|
}
|
|
334
335
|
device.gl.bindFramebuffer(GL.FRAMEBUFFER, prevHandle);
|
|
335
336
|
if (destroyFramebuffer) {
|
|
@@ -413,7 +414,7 @@ function getFramebuffer(source: Texture | Framebuffer): {
|
|
|
413
414
|
* Returns number of components in a specific readPixels WebGL format
|
|
414
415
|
* @todo use shadertypes utils instead?
|
|
415
416
|
*/
|
|
416
|
-
export function glFormatToComponents(format): 1 | 2 | 3 | 4 {
|
|
417
|
+
export function glFormatToComponents(format: GL): 1 | 2 | 3 | 4 {
|
|
417
418
|
switch (format) {
|
|
418
419
|
case GL.ALPHA:
|
|
419
420
|
case GL.R32F:
|
|
@@ -4,21 +4,26 @@
|
|
|
4
4
|
|
|
5
5
|
import {CommandEncoder, CommandEncoderProps} from '@luma.gl/core';
|
|
6
6
|
import type {
|
|
7
|
+
RenderPassProps,
|
|
8
|
+
ComputePass,
|
|
9
|
+
ComputePassProps,
|
|
10
|
+
QuerySet,
|
|
11
|
+
Buffer,
|
|
7
12
|
CopyBufferToBufferOptions,
|
|
8
13
|
CopyBufferToTextureOptions,
|
|
9
14
|
CopyTextureToBufferOptions,
|
|
10
|
-
CopyTextureToTextureOptions
|
|
15
|
+
CopyTextureToTextureOptions
|
|
11
16
|
// ClearTextureOptions,
|
|
12
|
-
//
|
|
13
|
-
QuerySet,
|
|
14
|
-
Buffer
|
|
17
|
+
// TextureReadOptions,
|
|
15
18
|
} from '@luma.gl/core';
|
|
16
19
|
|
|
17
20
|
import {WEBGLCommandBuffer} from './webgl-command-buffer';
|
|
21
|
+
import {WEBGLRenderPass} from './webgl-render-pass';
|
|
18
22
|
import {WebGLDevice} from '../webgl-device';
|
|
19
23
|
|
|
20
24
|
export class WEBGLCommandEncoder extends CommandEncoder {
|
|
21
25
|
readonly device: WebGLDevice;
|
|
26
|
+
readonly handle = null;
|
|
22
27
|
|
|
23
28
|
readonly commandBuffer: WEBGLCommandBuffer;
|
|
24
29
|
|
|
@@ -30,13 +35,17 @@ export class WEBGLCommandEncoder extends CommandEncoder {
|
|
|
30
35
|
|
|
31
36
|
override destroy(): void {}
|
|
32
37
|
|
|
33
|
-
override finish():
|
|
34
|
-
this.commandBuffer
|
|
38
|
+
override finish(): WEBGLCommandBuffer {
|
|
39
|
+
return this.commandBuffer;
|
|
35
40
|
}
|
|
36
41
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
42
|
+
beginRenderPass(props: RenderPassProps): WEBGLRenderPass {
|
|
43
|
+
return new WEBGLRenderPass(this.device, props);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
beginComputePass(props: ComputePassProps): ComputePass {
|
|
47
|
+
throw new Error('ComputePass not supported in WebGL');
|
|
48
|
+
}
|
|
40
49
|
|
|
41
50
|
copyBufferToBuffer(options: CopyBufferToBufferOptions): void {
|
|
42
51
|
this.commandBuffer.commands.push({name: 'copy-buffer-to-buffer', options});
|
|
@@ -14,9 +14,9 @@ export type Attachment = WEBGLTextureView | WEBGLTexture; // | WEBGLRenderbuffer
|
|
|
14
14
|
|
|
15
15
|
/** luma.gl Framebuffer, WebGL implementation */
|
|
16
16
|
export class WEBGLFramebuffer extends Framebuffer {
|
|
17
|
-
device: WebGLDevice;
|
|
17
|
+
readonly device: WebGLDevice;
|
|
18
18
|
gl: WebGL2RenderingContext;
|
|
19
|
-
handle: WebGLFramebuffer;
|
|
19
|
+
readonly handle: WebGLFramebuffer;
|
|
20
20
|
|
|
21
21
|
colorAttachments: WEBGLTextureView[] = [];
|
|
22
22
|
depthStencilAttachment: WEBGLTextureView | null = null;
|
|
@@ -33,8 +33,8 @@ export class WEBGLFramebuffer extends Framebuffer {
|
|
|
33
33
|
this.props.handle || isDefaultFramebuffer ? this.props.handle : this.gl.createFramebuffer();
|
|
34
34
|
|
|
35
35
|
if (!isDefaultFramebuffer) {
|
|
36
|
-
// default framebuffer handle is null, so we can't set
|
|
37
|
-
device.
|
|
36
|
+
// default framebuffer handle is null, so we can't set debug metadata...
|
|
37
|
+
device._setWebGLDebugMetadata(this.handle, this, {spector: this.props});
|
|
38
38
|
|
|
39
39
|
// Auto create textures for attachments if needed
|
|
40
40
|
this.autoCreateAttachmentTextures();
|
|
@@ -7,8 +7,8 @@ import {WebGLDevice} from '../webgl-device';
|
|
|
7
7
|
* Asynchronous queries for different kinds of information
|
|
8
8
|
*/
|
|
9
9
|
export class WEBGLQuerySet extends QuerySet {
|
|
10
|
-
device: WebGLDevice;
|
|
11
|
-
handle: WebGLQuery;
|
|
10
|
+
readonly device: WebGLDevice;
|
|
11
|
+
readonly handle: WebGLQuery;
|
|
12
12
|
|
|
13
13
|
target: number | null = null;
|
|
14
14
|
_queryPending = false;
|
|
@@ -27,7 +27,11 @@ export class WEBGLQuerySet extends QuerySet {
|
|
|
27
27
|
throw new Error('WebGL QuerySet can only have one value');
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
const handle = this.device.gl.createQuery();
|
|
31
|
+
if (!handle) {
|
|
32
|
+
throw new Error('WebGL query not supported');
|
|
33
|
+
}
|
|
34
|
+
this.handle = handle;
|
|
31
35
|
Object.seal(this);
|
|
32
36
|
}
|
|
33
37
|
|
|
@@ -11,20 +11,21 @@ import {setGLParameters} from '../../context/parameters/unified-parameter-api';
|
|
|
11
11
|
import {WEBGLQuerySet} from './webgl-query-set';
|
|
12
12
|
import {WEBGLFramebuffer} from './webgl-framebuffer';
|
|
13
13
|
|
|
14
|
-
const COLOR_CHANNELS = [0x1, 0x2, 0x4, 0x8]; // GPUColorWrite RED, GREEN, BLUE, ALPHA
|
|
14
|
+
const COLOR_CHANNELS: NumberArray4 = [0x1, 0x2, 0x4, 0x8]; // GPUColorWrite RED, GREEN, BLUE, ALPHA
|
|
15
15
|
|
|
16
16
|
export class WEBGLRenderPass extends RenderPass {
|
|
17
17
|
readonly device: WebGLDevice;
|
|
18
|
+
readonly handle = null;
|
|
18
19
|
|
|
19
20
|
/** Parameters that should be applied before each draw call */
|
|
20
|
-
glParameters: GLParameters;
|
|
21
|
+
glParameters: GLParameters = {};
|
|
21
22
|
|
|
22
23
|
constructor(device: WebGLDevice, props: RenderPassProps) {
|
|
23
24
|
super(device, props);
|
|
24
25
|
this.device = device;
|
|
25
26
|
|
|
26
27
|
// If no viewport is provided, apply reasonably defaults
|
|
27
|
-
let viewport;
|
|
28
|
+
let viewport: NumberArray4 | undefined;
|
|
28
29
|
if (!props?.parameters?.viewport) {
|
|
29
30
|
if (props?.framebuffer) {
|
|
30
31
|
// Set the viewport to the size of the framebuffer
|
|
@@ -32,7 +33,7 @@ export class WEBGLRenderPass extends RenderPass {
|
|
|
32
33
|
viewport = [0, 0, width, height];
|
|
33
34
|
} else {
|
|
34
35
|
// Instead of using our own book-keeping, we can just read the values from the WebGL context
|
|
35
|
-
const [width, height] = device.
|
|
36
|
+
const [width, height] = device.getDefaultCanvasContext().getDrawingBufferSize();
|
|
36
37
|
viewport = [0, 0, width, height];
|
|
37
38
|
}
|
|
38
39
|
}
|
|
@@ -43,15 +44,14 @@ export class WEBGLRenderPass extends RenderPass {
|
|
|
43
44
|
|
|
44
45
|
// Specify mapping of draw buffer locations to color attachments
|
|
45
46
|
const webglFramebuffer = this.props.framebuffer as WEBGLFramebuffer;
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
47
|
+
// Default framebuffers can only be set to GL.BACK or GL.NONE
|
|
48
|
+
if (this.props.framebuffer && webglFramebuffer?.handle) {
|
|
49
|
+
const drawBuffers = this.props.framebuffer.colorAttachments.map(
|
|
50
|
+
(_, i) => GL.COLOR_ATTACHMENT0 + i
|
|
51
|
+
);
|
|
52
|
+
this.device.gl.drawBuffers(drawBuffers);
|
|
53
|
+
} else {
|
|
54
|
+
this.device.gl.drawBuffers([GL.BACK]);
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
// Hack - for now WebGL draws in "immediate mode" (instead of queueing the operations)...
|
|
@@ -94,7 +94,10 @@ export class WEBGLRenderPass extends RenderPass {
|
|
|
94
94
|
// WebGPU viewports are 6 coordinates (X, Y, Z)
|
|
95
95
|
if (parameters.viewport.length >= 6) {
|
|
96
96
|
glParameters.viewport = parameters.viewport.slice(0, 4) as NumberArray4;
|
|
97
|
-
glParameters.depthRange = [
|
|
97
|
+
glParameters.depthRange = [
|
|
98
|
+
parameters.viewport[4] as number,
|
|
99
|
+
parameters.viewport[5] as number
|
|
100
|
+
];
|
|
98
101
|
} else {
|
|
99
102
|
// WebGL viewports are 4 coordinates (X, Y)
|
|
100
103
|
glParameters.viewport = parameters.viewport as NumberArray4;
|
|
@@ -112,12 +115,12 @@ export class WEBGLRenderPass extends RenderPass {
|
|
|
112
115
|
console.warn('RenderPassParameters.stencilReference not yet implemented in WebGL');
|
|
113
116
|
// parameters.stencilFunc = [func, ref, mask];
|
|
114
117
|
// Does this work?
|
|
115
|
-
|
|
118
|
+
glParameters[GL.STENCIL_REF] = parameters.stencilReference;
|
|
116
119
|
}
|
|
117
120
|
|
|
118
|
-
if (parameters
|
|
121
|
+
if ('colorMask' in parameters) {
|
|
119
122
|
glParameters.colorMask = COLOR_CHANNELS.map(channel =>
|
|
120
|
-
Boolean(channel & parameters.colorMask)
|
|
123
|
+
Boolean(channel & (parameters.colorMask as number))
|
|
121
124
|
);
|
|
122
125
|
}
|
|
123
126
|
|
|
@@ -16,10 +16,9 @@ import {RenderPipeline, log} from '@luma.gl/core';
|
|
|
16
16
|
// import {getAttributeInfosFromLayouts} from '@luma.gl/core';
|
|
17
17
|
import {GL} from '@luma.gl/constants';
|
|
18
18
|
|
|
19
|
-
import {getShaderLayoutFromGLSL} from '../helpers/get-shader-layout';
|
|
19
|
+
import {getShaderLayoutFromGLSL} from '../helpers/get-shader-layout-from-glsl';
|
|
20
20
|
import {withDeviceAndGLParameters} from '../converters/device-parameters';
|
|
21
21
|
import {setUniform} from '../helpers/set-uniform';
|
|
22
|
-
import {splitUniformsAndBindings} from '../../utils/split-uniforms-and-bindings';
|
|
23
22
|
// import {copyUniform, checkUniformValues} from '../../classes/uniforms';
|
|
24
23
|
|
|
25
24
|
import {WebGLDevice} from '../webgl-device';
|
|
@@ -37,9 +36,9 @@ const LOG_PROGRAM_PERF_PRIORITY = 4;
|
|
|
37
36
|
/** Creates a new render pipeline */
|
|
38
37
|
export class WEBGLRenderPipeline extends RenderPipeline {
|
|
39
38
|
/** The WebGL device that created this render pipeline */
|
|
40
|
-
device: WebGLDevice;
|
|
39
|
+
readonly device: WebGLDevice;
|
|
41
40
|
/** Handle to underlying WebGL program */
|
|
42
|
-
handle: WebGLProgram;
|
|
41
|
+
readonly handle: WebGLProgram;
|
|
43
42
|
/** vertex shader */
|
|
44
43
|
vs: WEBGLShader;
|
|
45
44
|
/** fragment shader */
|
|
@@ -57,11 +56,15 @@ export class WEBGLRenderPipeline extends RenderPipeline {
|
|
|
57
56
|
_uniformCount: number = 0;
|
|
58
57
|
_uniformSetters: Record<string, Function> = {}; // TODO are these used?
|
|
59
58
|
|
|
59
|
+
override get [Symbol.toStringTag]() {
|
|
60
|
+
return 'WEBGLRenderPipeline';
|
|
61
|
+
}
|
|
62
|
+
|
|
60
63
|
constructor(device: WebGLDevice, props: RenderPipelineProps) {
|
|
61
64
|
super(device, props);
|
|
62
65
|
this.device = device;
|
|
63
66
|
this.handle = this.props.handle || this.device.gl.createProgram();
|
|
64
|
-
this.device.
|
|
67
|
+
this.device._setWebGLDebugMetadata(this.handle, this, {spector: {id: this.props.id}});
|
|
65
68
|
|
|
66
69
|
// Create shaders if needed
|
|
67
70
|
this.vs = props.vs as WEBGLShader;
|
|
@@ -78,20 +81,26 @@ export class WEBGLRenderPipeline extends RenderPipeline {
|
|
|
78
81
|
}
|
|
79
82
|
|
|
80
83
|
this._linkShaders();
|
|
81
|
-
|
|
82
|
-
log.time(1, `RenderPipeline ${this.id} - shaderLayout introspection`)();
|
|
84
|
+
log.time(3, `RenderPipeline ${this.id} - shaderLayout introspection`)();
|
|
83
85
|
this.introspectedLayout = getShaderLayoutFromGLSL(this.device.gl, this.handle);
|
|
84
|
-
log.timeEnd(
|
|
86
|
+
log.timeEnd(3, `RenderPipeline ${this.id} - shaderLayout introspection`)();
|
|
85
87
|
|
|
86
88
|
// Merge provided layout with introspected layout
|
|
87
|
-
this.shaderLayout =
|
|
89
|
+
this.shaderLayout = props.shaderLayout
|
|
90
|
+
? mergeShaderLayout(this.introspectedLayout, props.shaderLayout)
|
|
91
|
+
: this.introspectedLayout;
|
|
88
92
|
}
|
|
89
93
|
|
|
90
94
|
override destroy(): void {
|
|
91
95
|
if (this.handle) {
|
|
96
|
+
// log.error(`Deleting program ${this.id}`)();
|
|
97
|
+
this.device.gl.useProgram(null);
|
|
92
98
|
this.device.gl.deleteProgram(this.handle);
|
|
93
|
-
// this.handle = null;
|
|
94
99
|
this.destroyed = true;
|
|
100
|
+
// @ts-expect-error
|
|
101
|
+
this.handle.destroyed = true;
|
|
102
|
+
// @ts-ignore
|
|
103
|
+
this.handle = null;
|
|
95
104
|
}
|
|
96
105
|
}
|
|
97
106
|
|
|
@@ -143,7 +152,7 @@ export class WEBGLRenderPipeline extends RenderPipeline {
|
|
|
143
152
|
value instanceof WEBGLFramebuffer
|
|
144
153
|
)
|
|
145
154
|
) {
|
|
146
|
-
throw new Error(
|
|
155
|
+
throw new Error(`${this} Bad texture binding for ${name}`);
|
|
147
156
|
}
|
|
148
157
|
break;
|
|
149
158
|
case 'sampler':
|
|
@@ -269,21 +278,6 @@ export class WEBGLRenderPipeline extends RenderPipeline {
|
|
|
269
278
|
return true;
|
|
270
279
|
}
|
|
271
280
|
|
|
272
|
-
// DEPRECATED METHODS
|
|
273
|
-
|
|
274
|
-
override setUniformsWebGL(uniforms: Record<string, UniformValue>) {
|
|
275
|
-
const {bindings} = splitUniformsAndBindings(uniforms);
|
|
276
|
-
Object.keys(bindings).forEach(name => {
|
|
277
|
-
log.warn(
|
|
278
|
-
`Unsupported value "${JSON.stringify(
|
|
279
|
-
bindings[name]
|
|
280
|
-
)}" used in setUniforms() for key ${name}. Use setBindings() instead?`
|
|
281
|
-
)();
|
|
282
|
-
});
|
|
283
|
-
// TODO - check against layout
|
|
284
|
-
Object.assign(this.uniforms, uniforms);
|
|
285
|
-
}
|
|
286
|
-
|
|
287
281
|
// PRIVATE METHODS
|
|
288
282
|
|
|
289
283
|
// setAttributes(attributes: Record<string, Buffer>): void {}
|
|
@@ -317,19 +311,21 @@ export class WEBGLRenderPipeline extends RenderPipeline {
|
|
|
317
311
|
}
|
|
318
312
|
|
|
319
313
|
/** Report link status. First, check for shader compilation failures if linking fails */
|
|
320
|
-
async _reportLinkStatus(status: 'success' | '
|
|
314
|
+
async _reportLinkStatus(status: 'success' | 'link-error' | 'validation-error'): Promise<void> {
|
|
321
315
|
switch (status) {
|
|
322
316
|
case 'success':
|
|
323
317
|
return;
|
|
324
318
|
|
|
325
319
|
default:
|
|
320
|
+
const errorType = status === 'link-error' ? 'Link error' : 'Validation error';
|
|
326
321
|
// First check for shader compilation failures if linking fails
|
|
327
322
|
switch (this.vs.compilationStatus) {
|
|
328
323
|
case 'error':
|
|
329
324
|
this.vs.debugShader();
|
|
330
|
-
throw new Error(
|
|
325
|
+
throw new Error(`${this} ${errorType} during compilation of ${this.vs}`);
|
|
331
326
|
case 'pending':
|
|
332
|
-
this.vs.asyncCompilationStatus
|
|
327
|
+
await this.vs.asyncCompilationStatus;
|
|
328
|
+
this.vs.debugShader();
|
|
333
329
|
break;
|
|
334
330
|
case 'success':
|
|
335
331
|
break;
|
|
@@ -338,16 +334,21 @@ export class WEBGLRenderPipeline extends RenderPipeline {
|
|
|
338
334
|
switch (this.fs?.compilationStatus) {
|
|
339
335
|
case 'error':
|
|
340
336
|
this.fs.debugShader();
|
|
341
|
-
throw new Error(
|
|
337
|
+
throw new Error(`${this} ${errorType} during compilation of ${this.fs}`);
|
|
342
338
|
case 'pending':
|
|
343
|
-
this.fs.asyncCompilationStatus
|
|
339
|
+
await this.fs.asyncCompilationStatus;
|
|
340
|
+
this.fs.debugShader();
|
|
344
341
|
break;
|
|
345
342
|
case 'success':
|
|
346
343
|
break;
|
|
347
344
|
}
|
|
348
345
|
|
|
349
346
|
const linkErrorLog = this.device.gl.getProgramInfoLog(this.handle);
|
|
350
|
-
|
|
347
|
+
this.device.reportError(
|
|
348
|
+
new Error(`${errorType} during ${status}: ${linkErrorLog}`),
|
|
349
|
+
this
|
|
350
|
+
)();
|
|
351
|
+
this.device.debug();
|
|
351
352
|
}
|
|
352
353
|
}
|
|
353
354
|
|
|
@@ -356,19 +357,19 @@ export class WEBGLRenderPipeline extends RenderPipeline {
|
|
|
356
357
|
* TODO - Load log even when no error reported, to catch warnings?
|
|
357
358
|
* https://gamedev.stackexchange.com/questions/30429/how-to-detect-glsl-warnings
|
|
358
359
|
*/
|
|
359
|
-
_getLinkStatus(): 'success' | '
|
|
360
|
+
_getLinkStatus(): 'success' | 'link-error' | 'validation-error' {
|
|
360
361
|
const {gl} = this.device;
|
|
361
|
-
const linked = gl.getProgramParameter(this.handle,
|
|
362
|
+
const linked = gl.getProgramParameter(this.handle, GL.LINK_STATUS);
|
|
362
363
|
if (!linked) {
|
|
363
364
|
this.linkStatus = 'error';
|
|
364
|
-
return '
|
|
365
|
+
return 'link-error';
|
|
365
366
|
}
|
|
366
367
|
|
|
367
368
|
gl.validateProgram(this.handle);
|
|
368
|
-
const validated = gl.getProgramParameter(this.handle,
|
|
369
|
+
const validated = gl.getProgramParameter(this.handle, GL.VALIDATE_STATUS);
|
|
369
370
|
if (!validated) {
|
|
370
371
|
this.linkStatus = 'error';
|
|
371
|
-
return 'validation';
|
|
372
|
+
return 'validation-error';
|
|
372
373
|
}
|
|
373
374
|
|
|
374
375
|
this.linkStatus = 'success';
|
|
@@ -21,7 +21,7 @@ export class WEBGLSampler extends Sampler {
|
|
|
21
21
|
super(device, props);
|
|
22
22
|
this.device = device;
|
|
23
23
|
this.parameters = convertSamplerParametersToWebGL(props);
|
|
24
|
-
this.handle =
|
|
24
|
+
this.handle = props.handle || this.device.gl.createSampler();
|
|
25
25
|
this._setSamplerParameters(this.parameters);
|
|
26
26
|
}
|
|
27
27
|
|
|
@@ -27,6 +27,10 @@ export class WEBGLShader extends Shader {
|
|
|
27
27
|
default:
|
|
28
28
|
throw new Error(this.props.stage);
|
|
29
29
|
}
|
|
30
|
+
|
|
31
|
+
// default framebuffer handle is null, so we can't set spector metadata...
|
|
32
|
+
device._setWebGLDebugMetadata(this.handle, this, {spector: this.props});
|
|
33
|
+
|
|
30
34
|
this._compile(this.source);
|
|
31
35
|
}
|
|
32
36
|
|
|
@@ -34,13 +38,18 @@ export class WEBGLShader extends Shader {
|
|
|
34
38
|
if (this.handle) {
|
|
35
39
|
this.removeStats();
|
|
36
40
|
this.device.gl.deleteShader(this.handle);
|
|
37
|
-
// this.handle = null;
|
|
38
41
|
this.destroyed = true;
|
|
42
|
+
// @ts-expect-error
|
|
43
|
+
this.handle.destroyed = true;
|
|
44
|
+
// this.handle = null;
|
|
39
45
|
}
|
|
40
46
|
}
|
|
41
47
|
|
|
42
48
|
get asyncCompilationStatus(): Promise<'pending' | 'success' | 'error'> {
|
|
43
|
-
return this._waitForCompilationComplete().then(() =>
|
|
49
|
+
return this._waitForCompilationComplete().then(() => {
|
|
50
|
+
this._getCompilationStatus();
|
|
51
|
+
return this.compilationStatus;
|
|
52
|
+
});
|
|
44
53
|
}
|
|
45
54
|
|
|
46
55
|
override async getCompilationInfo(): Promise<readonly CompilerMessage[]> {
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
|
|
5
5
|
import type {Device, TextureViewProps} from '@luma.gl/core';
|
|
6
|
-
// import {
|
|
6
|
+
// import {getTextureFormatInfo} from '@luma.gl/core';
|
|
7
7
|
import {TextureView, Texture} from '@luma.gl/core';
|
|
8
8
|
|
|
9
9
|
import {WebGLDevice} from '../webgl-device';
|