@luma.gl/webgl 9.1.0-alpha.9 → 9.1.0-beta.3

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