@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.
Files changed (199) hide show
  1. package/dist/adapter/converters/device-parameters.js +14 -9
  2. package/dist/adapter/converters/device-parameters.js.map +1 -1
  3. package/dist/adapter/converters/sampler-parameters.js +13 -2
  4. package/dist/adapter/converters/sampler-parameters.js.map +1 -1
  5. package/dist/adapter/converters/shader-formats.d.ts +67 -8
  6. package/dist/adapter/converters/shader-formats.d.ts.map +1 -1
  7. package/dist/adapter/converters/shader-formats.js +82 -52
  8. package/dist/adapter/converters/shader-formats.js.map +1 -1
  9. package/dist/adapter/converters/webgl-shadertypes.d.ts +20 -0
  10. package/dist/adapter/converters/webgl-shadertypes.d.ts.map +1 -0
  11. package/dist/adapter/converters/webgl-shadertypes.js +122 -0
  12. package/dist/adapter/converters/webgl-shadertypes.js.map +1 -0
  13. package/dist/adapter/converters/webgl-texture-table.d.ts.map +1 -1
  14. package/dist/adapter/converters/webgl-texture-table.js +17 -13
  15. package/dist/adapter/converters/webgl-texture-table.js.map +1 -1
  16. package/dist/adapter/converters/{vertex-formats.d.ts → webgl-vertex-formats.d.ts} +4 -4
  17. package/dist/adapter/converters/webgl-vertex-formats.d.ts.map +1 -0
  18. package/dist/adapter/converters/{vertex-formats.js → webgl-vertex-formats.js} +2 -3
  19. package/dist/adapter/converters/webgl-vertex-formats.js.map +1 -0
  20. package/dist/adapter/device-helpers/webgl-device-features.d.ts.map +1 -1
  21. package/dist/adapter/device-helpers/webgl-device-features.js.map +1 -1
  22. package/dist/adapter/device-helpers/webgl-device-limits.d.ts +1 -1
  23. package/dist/adapter/device-helpers/webgl-device-limits.d.ts.map +1 -1
  24. package/dist/adapter/device-helpers/webgl-device-limits.js +1 -1
  25. package/dist/adapter/device-helpers/webgl-device-limits.js.map +1 -1
  26. package/dist/adapter/helpers/format-utils.d.ts +3 -2
  27. package/dist/adapter/helpers/format-utils.d.ts.map +1 -1
  28. package/dist/adapter/helpers/format-utils.js.map +1 -1
  29. package/dist/adapter/helpers/{get-shader-layout.d.ts → get-shader-layout-from-glsl.d.ts} +1 -1
  30. package/dist/adapter/helpers/get-shader-layout-from-glsl.d.ts.map +1 -0
  31. package/dist/adapter/helpers/{get-shader-layout.js → get-shader-layout-from-glsl.js} +12 -35
  32. package/dist/adapter/helpers/get-shader-layout-from-glsl.js.map +1 -0
  33. package/dist/adapter/helpers/set-uniform.d.ts +2 -2
  34. package/dist/adapter/helpers/set-uniform.d.ts.map +1 -1
  35. package/dist/adapter/helpers/set-uniform.js.map +1 -1
  36. package/dist/adapter/helpers/webgl-texture-utils.d.ts +2 -242
  37. package/dist/adapter/helpers/webgl-texture-utils.d.ts.map +1 -1
  38. package/dist/adapter/helpers/webgl-texture-utils.js +10 -99
  39. package/dist/adapter/helpers/webgl-texture-utils.js.map +1 -1
  40. package/dist/adapter/resources/webgl-buffer.d.ts +7 -7
  41. package/dist/adapter/resources/webgl-buffer.d.ts.map +1 -1
  42. package/dist/adapter/resources/webgl-buffer.js +29 -18
  43. package/dist/adapter/resources/webgl-buffer.js.map +1 -1
  44. package/dist/adapter/resources/webgl-command-buffer.d.ts +4 -3
  45. package/dist/adapter/resources/webgl-command-buffer.d.ts.map +1 -1
  46. package/dist/adapter/resources/webgl-command-buffer.js +5 -4
  47. package/dist/adapter/resources/webgl-command-buffer.js.map +1 -1
  48. package/dist/adapter/resources/webgl-command-encoder.d.ts +6 -2
  49. package/dist/adapter/resources/webgl-command-encoder.d.ts.map +1 -1
  50. package/dist/adapter/resources/webgl-command-encoder.js +9 -4
  51. package/dist/adapter/resources/webgl-command-encoder.js.map +1 -1
  52. package/dist/adapter/resources/webgl-external-texture.js +1 -0
  53. package/dist/adapter/resources/webgl-external-texture.js.map +1 -1
  54. package/dist/adapter/resources/webgl-framebuffer.d.ts +2 -2
  55. package/dist/adapter/resources/webgl-framebuffer.d.ts.map +1 -1
  56. package/dist/adapter/resources/webgl-framebuffer.js +2 -2
  57. package/dist/adapter/resources/webgl-framebuffer.js.map +1 -1
  58. package/dist/adapter/resources/webgl-query-set.d.ts +2 -2
  59. package/dist/adapter/resources/webgl-query-set.d.ts.map +1 -1
  60. package/dist/adapter/resources/webgl-query-set.js +5 -1
  61. package/dist/adapter/resources/webgl-query-set.js.map +1 -1
  62. package/dist/adapter/resources/webgl-render-pass.d.ts +1 -0
  63. package/dist/adapter/resources/webgl-render-pass.d.ts.map +1 -1
  64. package/dist/adapter/resources/webgl-render-pass.js +16 -13
  65. package/dist/adapter/resources/webgl-render-pass.js.map +1 -1
  66. package/dist/adapter/resources/webgl-render-pipeline.d.ts +5 -5
  67. package/dist/adapter/resources/webgl-render-pipeline.d.ts.map +1 -1
  68. package/dist/adapter/resources/webgl-render-pipeline.js +28 -24
  69. package/dist/adapter/resources/webgl-render-pipeline.js.map +1 -1
  70. package/dist/adapter/resources/webgl-sampler.js +1 -1
  71. package/dist/adapter/resources/webgl-sampler.js.map +1 -1
  72. package/dist/adapter/resources/webgl-shader.d.ts.map +1 -1
  73. package/dist/adapter/resources/webgl-shader.js +9 -2
  74. package/dist/adapter/resources/webgl-shader.js.map +1 -1
  75. package/dist/adapter/resources/webgl-texture-view.js +1 -1
  76. package/dist/adapter/resources/webgl-texture-view.js.map +1 -1
  77. package/dist/adapter/resources/webgl-texture.d.ts +21 -66
  78. package/dist/adapter/resources/webgl-texture.d.ts.map +1 -1
  79. package/dist/adapter/resources/webgl-texture.js +152 -320
  80. package/dist/adapter/resources/webgl-texture.js.map +1 -1
  81. package/dist/adapter/resources/webgl-transform-feedback.d.ts +1 -1
  82. package/dist/adapter/resources/webgl-transform-feedback.d.ts.map +1 -1
  83. package/dist/adapter/resources/webgl-transform-feedback.js +1 -1
  84. package/dist/adapter/resources/webgl-transform-feedback.js.map +1 -1
  85. package/dist/adapter/resources/webgl-vertex-array.d.ts +1 -1
  86. package/dist/adapter/resources/webgl-vertex-array.d.ts.map +1 -1
  87. package/dist/adapter/resources/webgl-vertex-array.js +3 -2
  88. package/dist/adapter/resources/webgl-vertex-array.js.map +1 -1
  89. package/dist/adapter/webgl-adapter.d.ts +4 -3
  90. package/dist/adapter/webgl-adapter.d.ts.map +1 -1
  91. package/dist/adapter/webgl-adapter.js +43 -30
  92. package/dist/adapter/webgl-adapter.js.map +1 -1
  93. package/dist/adapter/webgl-canvas-context.d.ts +3 -24
  94. package/dist/adapter/webgl-canvas-context.d.ts.map +1 -1
  95. package/dist/adapter/webgl-canvas-context.js +5 -44
  96. package/dist/adapter/webgl-canvas-context.js.map +1 -1
  97. package/dist/adapter/webgl-device.d.ts +19 -20
  98. package/dist/adapter/webgl-device.d.ts.map +1 -1
  99. package/dist/adapter/webgl-device.js +44 -31
  100. package/dist/adapter/webgl-device.js.map +1 -1
  101. package/dist/context/debug/spector-types.d.ts.map +1 -1
  102. package/dist/context/debug/spector-types.js +3 -0
  103. package/dist/context/debug/spector-types.js.map +1 -1
  104. package/dist/context/debug/spector.js.map +1 -1
  105. package/dist/context/debug/webgl-developer-tools.js +1 -0
  106. package/dist/context/debug/webgl-developer-tools.js.map +1 -1
  107. package/dist/context/helpers/webgl-extensions.d.ts.map +1 -1
  108. package/dist/context/helpers/webgl-extensions.js +3 -0
  109. package/dist/context/helpers/webgl-extensions.js.map +1 -1
  110. package/dist/context/parameters/unified-parameter-api.d.ts.map +1 -1
  111. package/dist/context/parameters/unified-parameter-api.js +7 -0
  112. package/dist/context/parameters/unified-parameter-api.js.map +1 -1
  113. package/dist/context/parameters/webgl-parameter-tables.d.ts +1 -1
  114. package/dist/context/parameters/webgl-parameter-tables.d.ts.map +1 -1
  115. package/dist/context/parameters/webgl-parameter-tables.js +1 -0
  116. package/dist/context/parameters/webgl-parameter-tables.js.map +1 -1
  117. package/dist/context/polyfills/polyfill-webgl1-extensions.d.ts.map +1 -1
  118. package/dist/context/polyfills/polyfill-webgl1-extensions.js +1 -0
  119. package/dist/context/polyfills/polyfill-webgl1-extensions.js.map +1 -1
  120. package/dist/context/state-tracker/deep-array-equal.d.ts +2 -1
  121. package/dist/context/state-tracker/deep-array-equal.d.ts.map +1 -1
  122. package/dist/context/state-tracker/deep-array-equal.js +4 -5
  123. package/dist/context/state-tracker/deep-array-equal.js.map +1 -1
  124. package/dist/context/state-tracker/webgl-state-tracker.d.ts.map +1 -1
  125. package/dist/context/state-tracker/webgl-state-tracker.js +4 -1
  126. package/dist/context/state-tracker/webgl-state-tracker.js.map +1 -1
  127. package/dist/context/state-tracker/with-parameters.js.map +1 -1
  128. package/dist/dist.dev.js +4788 -4801
  129. package/dist/dist.min.js +2 -2
  130. package/dist/index.cjs +3906 -3960
  131. package/dist/index.cjs.map +4 -4
  132. package/dist/index.d.ts +1 -3
  133. package/dist/index.d.ts.map +1 -1
  134. package/dist/index.js +1 -3
  135. package/dist/index.js.map +1 -1
  136. package/package.json +4 -4
  137. package/src/adapter/converters/device-parameters.ts +19 -9
  138. package/src/adapter/converters/sampler-parameters.ts +13 -2
  139. package/src/adapter/converters/shader-formats.ts +50 -24
  140. package/src/adapter/converters/webgl-shadertypes.ts +151 -0
  141. package/src/adapter/converters/webgl-texture-table.ts +21 -15
  142. package/src/adapter/converters/{vertex-formats.ts → webgl-vertex-formats.ts} +4 -5
  143. package/src/adapter/device-helpers/webgl-device-features.ts +1 -1
  144. package/src/adapter/device-helpers/webgl-device-limits.ts +1 -1
  145. package/src/adapter/helpers/format-utils.ts +2 -2
  146. package/src/adapter/helpers/{get-shader-layout.ts → get-shader-layout-from-glsl.ts} +20 -50
  147. package/src/adapter/helpers/set-uniform.ts +2 -2
  148. package/src/adapter/helpers/webgl-texture-utils.ts +12 -348
  149. package/src/adapter/resources/webgl-buffer.ts +43 -23
  150. package/src/adapter/resources/webgl-command-buffer.ts +9 -8
  151. package/src/adapter/resources/webgl-command-encoder.ts +18 -9
  152. package/src/adapter/resources/webgl-framebuffer.ts +4 -4
  153. package/src/adapter/resources/webgl-query-set.ts +7 -3
  154. package/src/adapter/resources/webgl-render-pass.ts +20 -17
  155. package/src/adapter/resources/webgl-render-pipeline.ts +38 -37
  156. package/src/adapter/resources/webgl-sampler.ts +1 -1
  157. package/src/adapter/resources/webgl-shader.ts +11 -2
  158. package/src/adapter/resources/webgl-texture-view.ts +1 -1
  159. package/src/adapter/resources/webgl-texture.ts +184 -394
  160. package/src/adapter/resources/webgl-transform-feedback.ts +2 -2
  161. package/src/adapter/resources/webgl-vertex-array.ts +4 -3
  162. package/src/adapter/webgl-adapter.ts +46 -33
  163. package/src/adapter/webgl-canvas-context.ts +7 -47
  164. package/src/adapter/webgl-device.ts +64 -44
  165. package/src/context/debug/spector-types.ts +5 -0
  166. package/src/context/debug/spector.ts +1 -1
  167. package/src/context/debug/webgl-developer-tools.ts +9 -3
  168. package/src/context/helpers/webgl-extensions.ts +3 -0
  169. package/src/context/parameters/unified-parameter-api.ts +9 -2
  170. package/src/context/parameters/webgl-parameter-tables.ts +2 -0
  171. package/src/context/polyfills/polyfill-webgl1-extensions.ts +1 -0
  172. package/src/context/state-tracker/deep-array-equal.ts +11 -6
  173. package/src/context/state-tracker/webgl-state-tracker.ts +5 -1
  174. package/src/context/state-tracker/with-parameters.ts +1 -1
  175. package/src/index.ts +1 -5
  176. package/dist/adapter/converters/vertex-formats.d.ts.map +0 -1
  177. package/dist/adapter/converters/vertex-formats.js.map +0 -1
  178. package/dist/adapter/helpers/decode-webgl-types.d.ts +0 -26
  179. package/dist/adapter/helpers/decode-webgl-types.d.ts.map +0 -1
  180. package/dist/adapter/helpers/decode-webgl-types.js +0 -102
  181. package/dist/adapter/helpers/decode-webgl-types.js.map +0 -1
  182. package/dist/adapter/helpers/get-shader-layout.d.ts.map +0 -1
  183. package/dist/adapter/helpers/get-shader-layout.js.map +0 -1
  184. package/dist/adapter/helpers/typed-array-utils.d.ts +0 -44
  185. package/dist/adapter/helpers/typed-array-utils.d.ts.map +0 -1
  186. package/dist/adapter/helpers/typed-array-utils.js +0 -107
  187. package/dist/adapter/helpers/typed-array-utils.js.map +0 -1
  188. package/dist/deprecated/accessor.d.ts +0 -53
  189. package/dist/deprecated/accessor.d.ts.map +0 -1
  190. package/dist/deprecated/accessor.js +0 -177
  191. package/dist/deprecated/accessor.js.map +0 -1
  192. package/dist/utils/split-uniforms-and-bindings.d.ts +0 -9
  193. package/dist/utils/split-uniforms-and-bindings.d.ts.map +0 -1
  194. package/dist/utils/split-uniforms-and-bindings.js +0 -21
  195. package/dist/utils/split-uniforms-and-bindings.js.map +0 -1
  196. package/src/adapter/helpers/decode-webgl-types.ts +0 -134
  197. package/src/adapter/helpers/typed-array-utils.ts +0 -129
  198. package/src/deprecated/accessor.ts +0 -225
  199. 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
- // ReadTextureOptions
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: {}; // ReadTextureOptions;
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
- submitCommands(commands: Command[] = this.commands) {
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 = null;
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.bind(0);
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.unbind();
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
- // ReadTextureOptions,
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(): void {
34
- this.commandBuffer.submitCommands();
38
+ override finish(): WEBGLCommandBuffer {
39
+ return this.commandBuffer;
35
40
  }
36
41
 
37
- // beginRenderPass(GPURenderPassDescriptor descriptor): GPURenderPassEncoder;
38
- // beginComputePass(optional GPUComputePassDescriptor descriptor = {}): GPUComputePassEncoder;
39
- // finish(options?: {id?: string}): GPUCommandBuffer;
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 spector metadata...
37
- device.setSpectorMetadata(this.handle, {id: this.props.id, props: this.props});
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
- this.handle = this.device.gl.createQuery();
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.getCanvasContext().getDrawingBufferSize();
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
- if (webglFramebuffer?.handle) {
47
- if (this.props.framebuffer) {
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
- }
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 = [parameters.viewport[4], parameters.viewport[5]];
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
- parameters[GL.STENCIL_REF] = parameters.stencilReference;
118
+ glParameters[GL.STENCIL_REF] = parameters.stencilReference;
116
119
  }
117
120
 
118
- if (parameters.colorMask) {
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.setSpectorMetadata(this.handle, {id: this.props.id});
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(1, `RenderPipeline ${this.id} - shaderLayout introspection`)();
86
+ log.timeEnd(3, `RenderPipeline ${this.id} - shaderLayout introspection`)();
85
87
 
86
88
  // Merge provided layout with introspected layout
87
- this.shaderLayout = mergeShaderLayout(this.introspectedLayout, props.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('texture value');
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' | 'linking' | 'validation'): Promise<void> {
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(`Error during compilation of shader ${this.vs.id}`);
325
+ throw new Error(`${this} ${errorType} during compilation of ${this.vs}`);
331
326
  case 'pending':
332
- this.vs.asyncCompilationStatus.then(() => this.vs.debugShader());
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(`Error during compilation of shader ${this.fs.id}`);
337
+ throw new Error(`${this} ${errorType} during compilation of ${this.fs}`);
342
338
  case 'pending':
343
- this.fs.asyncCompilationStatus.then(() => this.fs.debugShader());
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
- throw new Error(`Error during ${status}: ${linkErrorLog}`);
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' | 'linking' | 'validation' {
360
+ _getLinkStatus(): 'success' | 'link-error' | 'validation-error' {
360
361
  const {gl} = this.device;
361
- const linked = gl.getProgramParameter(this.handle, gl.LINK_STATUS);
362
+ const linked = gl.getProgramParameter(this.handle, GL.LINK_STATUS);
362
363
  if (!linked) {
363
364
  this.linkStatus = 'error';
364
- return 'linking';
365
+ return 'link-error';
365
366
  }
366
367
 
367
368
  gl.validateProgram(this.handle);
368
- const validated = gl.getProgramParameter(this.handle, gl.VALIDATE_STATUS);
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 = this.handle || this.device.gl.createSampler();
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(() => this.compilationStatus);
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 {decodeTextureFormat} from '@luma.gl/core';
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';