@luma.gl/webgl 9.1.0-alpha.2 → 9.1.0-beta.1

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 (216) 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 +19 -11
  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 -3
  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 +100 -29
  39. package/dist/adapter/helpers/webgl-texture-utils.d.ts.map +1 -1
  40. package/dist/adapter/helpers/webgl-texture-utils.js +231 -240
  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 +71 -76
  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 +49 -21
  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 +45 -23
  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 +33 -21
  78. package/dist/adapter/resources/webgl-texture.d.ts.map +1 -1
  79. package/dist/adapter/resources/webgl-texture.js +172 -242
  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 +21 -0
  86. package/dist/adapter/webgl-adapter.d.ts.map +1 -0
  87. package/dist/adapter/webgl-adapter.js +86 -0
  88. package/dist/adapter/webgl-adapter.js.map +1 -0
  89. package/dist/adapter/webgl-canvas-context.d.ts +4 -6
  90. package/dist/adapter/webgl-canvas-context.d.ts.map +1 -1
  91. package/dist/adapter/webgl-canvas-context.js +13 -17
  92. package/dist/adapter/webgl-canvas-context.js.map +1 -0
  93. package/dist/adapter/webgl-device.d.ts +35 -46
  94. package/dist/adapter/webgl-device.d.ts.map +1 -1
  95. package/dist/adapter/webgl-device.js +100 -156
  96. package/dist/adapter/webgl-device.js.map +1 -0
  97. package/dist/context/debug/spector-types.d.ts +1108 -0
  98. package/dist/context/debug/spector-types.d.ts.map +1 -0
  99. package/dist/context/debug/spector-types.js +698 -0
  100. package/dist/context/debug/spector-types.js.map +1 -0
  101. package/dist/context/debug/spector.d.ts +12 -8
  102. package/dist/context/debug/spector.d.ts.map +1 -1
  103. package/dist/context/debug/spector.js +24 -17
  104. package/dist/context/debug/spector.js.map +1 -0
  105. package/dist/context/debug/webgl-developer-tools.d.ts +2 -3
  106. package/dist/context/debug/webgl-developer-tools.d.ts.map +1 -1
  107. package/dist/context/debug/webgl-developer-tools.js +7 -19
  108. package/dist/context/debug/webgl-developer-tools.js.map +1 -0
  109. package/dist/context/helpers/create-browser-context.d.ts +6 -22
  110. package/dist/context/helpers/create-browser-context.d.ts.map +1 -1
  111. package/dist/context/helpers/create-browser-context.js +41 -32
  112. package/dist/context/helpers/create-browser-context.js.map +1 -0
  113. package/dist/context/helpers/webgl-context-data.js +1 -0
  114. package/dist/context/helpers/webgl-context-data.js.map +1 -0
  115. package/dist/context/helpers/webgl-extensions.js +1 -0
  116. package/dist/context/helpers/webgl-extensions.js.map +1 -0
  117. package/dist/context/parameters/unified-parameter-api.js +1 -0
  118. package/dist/context/parameters/unified-parameter-api.js.map +1 -0
  119. package/dist/context/parameters/webgl-parameter-tables.d.ts +1 -1
  120. package/dist/context/parameters/webgl-parameter-tables.d.ts.map +1 -1
  121. package/dist/context/parameters/webgl-parameter-tables.js +3 -2
  122. package/dist/context/parameters/webgl-parameter-tables.js.map +1 -0
  123. package/dist/context/polyfills/polyfill-webgl1-extensions.d.ts +9 -0
  124. package/dist/context/polyfills/polyfill-webgl1-extensions.d.ts.map +1 -0
  125. package/dist/context/polyfills/polyfill-webgl1-extensions.js +182 -0
  126. package/dist/context/polyfills/polyfill-webgl1-extensions.js.map +1 -0
  127. package/dist/context/state-tracker/deep-array-equal.js +1 -0
  128. package/dist/context/state-tracker/deep-array-equal.js.map +1 -0
  129. package/dist/context/state-tracker/webgl-state-tracker.d.ts +43 -0
  130. package/dist/context/state-tracker/webgl-state-tracker.d.ts.map +1 -0
  131. package/dist/context/state-tracker/{track-context-state.js → webgl-state-tracker.js} +45 -74
  132. package/dist/context/state-tracker/webgl-state-tracker.js.map +1 -0
  133. package/dist/context/state-tracker/with-parameters.d.ts.map +1 -1
  134. package/dist/context/state-tracker/with-parameters.js +6 -4
  135. package/dist/context/state-tracker/with-parameters.js.map +1 -0
  136. package/dist/deprecated/accessor.d.ts.map +1 -0
  137. package/dist/{classic → deprecated}/accessor.js +37 -1
  138. package/dist/deprecated/accessor.js.map +1 -0
  139. package/dist/dist.dev.js +2397 -2430
  140. package/dist/dist.min.js +2 -2
  141. package/dist/index.cjs +2273 -2298
  142. package/dist/index.cjs.map +4 -4
  143. package/dist/index.d.ts +5 -4
  144. package/dist/index.d.ts.map +1 -1
  145. package/dist/index.js +6 -6
  146. package/dist/index.js.map +1 -0
  147. package/dist/types.js +1 -0
  148. package/dist/types.js.map +1 -0
  149. package/dist/utils/fill-array.d.ts +4 -4
  150. package/dist/utils/fill-array.d.ts.map +1 -1
  151. package/dist/utils/fill-array.js +1 -0
  152. package/dist/utils/fill-array.js.map +1 -0
  153. package/dist/utils/load-script.js +1 -0
  154. package/dist/utils/load-script.js.map +1 -0
  155. package/dist/utils/split-uniforms-and-bindings.d.ts +1 -1
  156. package/dist/utils/split-uniforms-and-bindings.d.ts.map +1 -1
  157. package/dist/utils/split-uniforms-and-bindings.js +1 -0
  158. package/dist/utils/split-uniforms-and-bindings.js.map +1 -0
  159. package/dist/utils/uid.d.ts +7 -0
  160. package/dist/utils/uid.d.ts.map +1 -0
  161. package/dist/utils/uid.js +15 -0
  162. package/dist/utils/uid.js.map +1 -0
  163. package/package.json +5 -5
  164. package/src/adapter/converters/device-parameters.ts +21 -15
  165. package/src/adapter/converters/sampler-parameters.ts +6 -4
  166. package/src/adapter/converters/webgl-texture-table.ts +404 -0
  167. package/src/adapter/device-helpers/webgl-device-features.ts +5 -3
  168. package/src/{classic → adapter/helpers}/format-utils.ts +6 -0
  169. package/src/adapter/helpers/get-shader-layout.ts +7 -4
  170. package/src/adapter/helpers/webgl-texture-utils.ts +410 -64
  171. package/src/adapter/resources/webgl-buffer.ts +3 -1
  172. package/src/adapter/resources/webgl-command-buffer.ts +125 -41
  173. package/src/adapter/resources/webgl-command-encoder.ts +6 -0
  174. package/src/adapter/resources/webgl-external-texture.ts +14 -0
  175. package/src/adapter/resources/webgl-framebuffer.ts +80 -86
  176. package/src/adapter/resources/webgl-render-pass.ts +72 -45
  177. package/src/adapter/resources/webgl-render-pipeline.ts +58 -27
  178. package/src/adapter/resources/webgl-shader.ts +15 -7
  179. package/src/adapter/resources/webgl-texture.ts +202 -274
  180. package/src/adapter/webgl-adapter.ts +105 -0
  181. package/src/adapter/webgl-canvas-context.ts +16 -19
  182. package/src/adapter/webgl-device.ts +144 -210
  183. package/src/context/debug/spector-types.ts +1154 -0
  184. package/src/context/debug/spector.ts +38 -29
  185. package/src/context/debug/webgl-developer-tools.ts +8 -31
  186. package/src/context/helpers/create-browser-context.ts +53 -63
  187. package/src/context/parameters/webgl-parameter-tables.ts +2 -2
  188. package/src/context/polyfills/polyfill-webgl1-extensions.ts +202 -0
  189. package/src/context/state-tracker/{track-context-state.ts → webgl-state-tracker.ts} +55 -94
  190. package/src/context/state-tracker/with-parameters.ts +5 -4
  191. package/src/{classic → deprecated}/accessor.ts +44 -3
  192. package/src/index.ts +7 -12
  193. package/src/utils/fill-array.ts +4 -4
  194. package/src/utils/split-uniforms-and-bindings.ts +3 -3
  195. package/src/utils/uid.ts +16 -0
  196. package/dist/adapter/converters/texture-formats.d.ts +0 -83
  197. package/dist/adapter/converters/texture-formats.d.ts.map +0 -1
  198. package/dist/adapter/converters/texture-formats.js +0 -518
  199. package/dist/classic/accessor.d.ts.map +0 -1
  200. package/dist/classic/clear.d.ts +0 -22
  201. package/dist/classic/clear.d.ts.map +0 -1
  202. package/dist/classic/clear.js +0 -86
  203. package/dist/classic/copy-and-blit.d.ts +0 -63
  204. package/dist/classic/copy-and-blit.d.ts.map +0 -1
  205. package/dist/classic/copy-and-blit.js +0 -193
  206. package/dist/classic/format-utils.d.ts.map +0 -1
  207. package/dist/classic/typed-array-utils.d.ts.map +0 -1
  208. package/dist/context/state-tracker/track-context-state.d.ts +0 -22
  209. package/dist/context/state-tracker/track-context-state.d.ts.map +0 -1
  210. package/src/adapter/converters/texture-formats.ts +0 -665
  211. package/src/classic/clear.ts +0 -115
  212. package/src/classic/copy-and-blit.ts +0 -318
  213. /package/dist/{classic → adapter/helpers}/format-utils.d.ts +0 -0
  214. /package/dist/{classic → adapter/helpers}/typed-array-utils.d.ts +0 -0
  215. /package/dist/{classic → deprecated}/accessor.d.ts +0 -0
  216. /package/src/{classic → adapter/helpers}/typed-array-utils.ts +0 -0
@@ -2,21 +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
- import {pushContextState, popContextState} from '../../context/state-tracker/track-context-state';
12
11
  import {WEBGLQuerySet} from './webgl-query-set';
12
+ import {WEBGLFramebuffer} from './webgl-framebuffer';
13
13
 
14
- // Should collapse during minification
15
- const GL_DEPTH_BUFFER_BIT = 0x00000100;
16
- const GL_STENCIL_BUFFER_BIT = 0x00000400;
17
- const GL_COLOR_BUFFER_BIT = 0x00004000;
18
-
19
- const GL_COLOR = 0x1800;
20
14
  const COLOR_CHANNELS = [0x1, 0x2, 0x4, 0x8]; // GPUColorWrite RED, GREEN, BLUE, ALPHA
21
15
 
22
16
  export class WEBGLRenderPass extends RenderPass {
@@ -29,16 +23,42 @@ export class WEBGLRenderPass extends RenderPass {
29
23
  super(device, props);
30
24
  this.device = device;
31
25
 
26
+ // If no viewport is provided, apply reasonably defaults
27
+ let viewport;
28
+ if (!props?.parameters?.viewport) {
29
+ if (props?.framebuffer) {
30
+ // Set the viewport to the size of the framebuffer
31
+ const {width, height} = props.framebuffer;
32
+ viewport = [0, 0, width, height];
33
+ } else {
34
+ // Instead of using our own book-keeping, we can just read the values from the WebGL context
35
+ const [width, height] = device.getDefaultCanvasContext().getDrawingBufferSize();
36
+ viewport = [0, 0, width, height];
37
+ }
38
+ }
39
+
32
40
  // TODO - do parameters (scissorRect) affect the clear operation?
33
- pushContextState(this.device.gl);
34
- this.setParameters(this.props.parameters);
41
+ this.device.pushState();
42
+ this.setParameters({viewport, ...this.props.parameters});
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
+ }
35
55
 
36
56
  // Hack - for now WebGL draws in "immediate mode" (instead of queueing the operations)...
37
57
  this.clear();
38
58
  }
39
59
 
40
60
  end(): void {
41
- popContextState(this.device.gl);
61
+ this.device.popState();
42
62
  // should add commands to CommandEncoder.
43
63
  }
44
64
 
@@ -72,11 +92,11 @@ export class WEBGLRenderPass extends RenderPass {
72
92
  if (parameters.viewport) {
73
93
  // WebGPU viewports are 6 coordinates (X, Y, Z)
74
94
  if (parameters.viewport.length >= 6) {
75
- glParameters.viewport = parameters.viewport.slice(0, 4);
95
+ glParameters.viewport = parameters.viewport.slice(0, 4) as NumberArray4;
76
96
  glParameters.depthRange = [parameters.viewport[4], parameters.viewport[5]];
77
97
  } else {
78
98
  // WebGL viewports are 4 coordinates (X, Y)
79
- glParameters.viewport = parameters.viewport;
99
+ glParameters.viewport = parameters.viewport as NumberArray4;
80
100
  }
81
101
  }
82
102
  if (parameters.scissorRect) {
@@ -125,16 +145,24 @@ export class WEBGLRenderPass extends RenderPass {
125
145
 
126
146
  let clearMask = 0;
127
147
 
128
- if (this.props.clearColor !== false) {
129
- 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;
130
158
  glParameters.clearColor = this.props.clearColor;
131
159
  }
132
160
  if (this.props.clearDepth !== false) {
133
- clearMask |= GL_DEPTH_BUFFER_BIT;
161
+ clearMask |= GL.DEPTH_BUFFER_BIT;
134
162
  glParameters.clearDepth = this.props.clearDepth;
135
163
  }
136
164
  if (this.props.clearStencil !== false) {
137
- clearMask |= GL_STENCIL_BUFFER_BIT;
165
+ clearMask |= GL.STENCIL_BUFFER_BIT;
138
166
  glParameters.clearStencil = this.props.clearStencil;
139
167
  }
140
168
 
@@ -143,11 +171,6 @@ export class WEBGLRenderPass extends RenderPass {
143
171
  withGLParameters(this.device.gl, glParameters, () => {
144
172
  this.device.gl.clear(clearMask);
145
173
  });
146
-
147
- // TODO - clear multiple color attachments
148
- // for (attachment of this.framebuffer.colorAttachments) {
149
- // this.clearColorBuffer
150
- // }
151
174
  }
152
175
  }
153
176
 
@@ -158,40 +181,44 @@ export class WEBGLRenderPass extends RenderPass {
158
181
  withGLParameters(this.device.gl, {framebuffer: this.props.framebuffer}, () => {
159
182
  // Method selection per OpenGL ES 3 docs
160
183
  switch (value.constructor) {
184
+ case Int8Array:
185
+ case Int16Array:
161
186
  case Int32Array:
162
- this.device.gl.clearBufferiv(GL_COLOR, drawBuffer, value);
187
+ this.device.gl.clearBufferiv(GL.COLOR, drawBuffer, value);
163
188
  break;
189
+ case Uint8Array:
190
+ case Uint8ClampedArray:
191
+ case Uint16Array:
164
192
  case Uint32Array:
165
- this.device.gl.clearBufferuiv(GL_COLOR, drawBuffer, value);
193
+ this.device.gl.clearBufferuiv(GL.COLOR, drawBuffer, value);
166
194
  break;
167
195
  case Float32Array:
168
- default:
169
- this.device.gl.clearBufferfv(GL_COLOR, drawBuffer, value);
196
+ this.device.gl.clearBufferfv(GL.COLOR, drawBuffer, value);
170
197
  break;
198
+ default:
199
+ throw new Error('clearColorBuffer: color must be typed array');
171
200
  }
172
201
  });
173
202
  }
174
203
 
175
- // clearDepthStencil() {
176
- // const GL_DEPTH = 0x1801;
177
- // const GL_STENCIL = 0x1802;
178
- // const GL_DEPTH_STENCIL = 0x84f9;
179
-
180
- // case GL_DEPTH:
181
- // this.device.gl.clearBufferfv(GL_DEPTH, 0, [value]);
182
- // break;
204
+ /*
205
+ clearDepthStencil() {
206
+ case GL.DEPTH:
207
+ this.device.gl.clearBufferfv(GL.DEPTH, 0, [value]);
208
+ break;
183
209
 
184
- // case GL_STENCIL:
185
- // this.device.gl.clearBufferiv(GL_STENCIL, 0, [value]);
186
- // break;
210
+ case GL_STENCIL:
211
+ this.device.gl.clearBufferiv(GL.STENCIL, 0, [value]);
212
+ break;
187
213
 
188
- // case GL_DEPTH_STENCIL:
189
- // const [depth, stencil] = value;
190
- // this.device.gl.clearBufferfi(GL_DEPTH_STENCIL, 0, depth, stencil);
191
- // break;
214
+ case GL.DEPTH_STENCIL:
215
+ const [depth, stencil] = value;
216
+ this.device.gl.clearBufferfi(GL.DEPTH_STENCIL, 0, depth, stencil);
217
+ break;
192
218
 
193
- // default:
194
- // assert(false, ERR_ARGUMENTS);
195
- // }
196
- // });
219
+ default:
220
+ assert(false, ERR_ARGUMENTS);
221
+ }
222
+ });
223
+ */
197
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,16 +117,17 @@ 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(
115
- `Unknown binding "${name}" in render pipeline "${this.id}", expected one of ${validBindings}`
129
+ `No binding "${name}" in render pipeline "${this.id}", expected one of ${validBindings}`,
130
+ value
116
131
  )();
117
132
  }
118
133
  continue; // eslint-disable-line no-continue
@@ -309,22 +324,37 @@ export class WEBGLRenderPipeline extends RenderPipeline {
309
324
  }
310
325
 
311
326
  /** Report link status. First, check for shader compilation failures if linking fails */
312
- _reportLinkStatus(status: 'success' | 'linking' | 'validation') {
327
+ async _reportLinkStatus(status: 'success' | 'linking' | 'validation'): Promise<void> {
313
328
  switch (status) {
314
329
  case 'success':
315
330
  return;
316
331
 
317
332
  default:
318
333
  // First check for shader compilation failures if linking fails
319
- if (this.vs.compilationStatus === 'error') {
320
- this.vs.debugShader();
321
- 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;
322
343
  }
323
- if (this.fs?.compilationStatus === 'error') {
324
- this.fs.debugShader();
325
- 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;
326
354
  }
327
- 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}`);
328
358
  }
329
359
  }
330
360
 
@@ -391,11 +421,12 @@ export class WEBGLRenderPipeline extends RenderPipeline {
391
421
  }
392
422
  }
393
423
 
394
- for (const [, texture] of Object.entries(this.bindings)) {
395
- if (texture instanceof WEBGLTexture) {
396
- texture.update();
397
- }
398
- }
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
+ // }
399
430
 
400
431
  return texturesRenderable;
401
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 100\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
  }