@luma.gl/webgl 9.0.0-alpha.20 → 9.0.0-alpha.23

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 (157) hide show
  1. package/dist/adapter/converters/device-parameters.d.ts +1 -1
  2. package/dist/adapter/converters/device-parameters.d.ts.map +1 -1
  3. package/dist/adapter/converters/device-parameters.js +10 -10
  4. package/dist/adapter/converters/device-parameters.js.map +1 -1
  5. package/dist/adapter/converters/sampler-parameters.d.ts +1 -1
  6. package/dist/adapter/converters/sampler-parameters.d.ts.map +1 -1
  7. package/dist/adapter/converters/sampler-parameters.js +1 -1
  8. package/dist/adapter/converters/sampler-parameters.js.map +1 -1
  9. package/dist/adapter/converters/texture-formats.d.ts +27 -38
  10. package/dist/adapter/converters/texture-formats.d.ts.map +1 -1
  11. package/dist/adapter/converters/texture-formats.js +152 -114
  12. package/dist/adapter/converters/texture-formats.js.map +1 -1
  13. package/dist/adapter/helpers/attribute-utils.d.ts +1 -1
  14. package/dist/adapter/helpers/attribute-utils.d.ts.map +1 -1
  15. package/dist/adapter/helpers/attribute-utils.js +1 -1
  16. package/dist/adapter/helpers/attribute-utils.js.map +1 -1
  17. package/dist/adapter/helpers/get-shader-info.d.ts.map +1 -1
  18. package/dist/adapter/helpers/get-shader-info.js.map +1 -1
  19. package/dist/adapter/helpers/get-shader-layout.js +1 -1
  20. package/dist/adapter/helpers/get-shader-layout.js.map +1 -1
  21. package/dist/adapter/helpers/uniforms.d.ts +7 -8
  22. package/dist/adapter/helpers/uniforms.d.ts.map +1 -1
  23. package/dist/adapter/helpers/uniforms.js +4 -4
  24. package/dist/adapter/helpers/uniforms.js.map +1 -1
  25. package/dist/adapter/objects/constants-to-keys.d.ts +0 -2
  26. package/dist/adapter/objects/constants-to-keys.d.ts.map +1 -1
  27. package/dist/adapter/objects/constants-to-keys.js +0 -20
  28. package/dist/adapter/objects/constants-to-keys.js.map +1 -1
  29. package/dist/adapter/objects/webgl-renderbuffer.d.ts +14 -11
  30. package/dist/adapter/objects/webgl-renderbuffer.d.ts.map +1 -1
  31. package/dist/adapter/objects/webgl-renderbuffer.js +31 -21
  32. package/dist/adapter/objects/webgl-renderbuffer.js.map +1 -1
  33. package/dist/adapter/objects/webgl-resource.d.ts +2 -3
  34. package/dist/adapter/objects/webgl-resource.d.ts.map +1 -1
  35. package/dist/adapter/objects/webgl-resource.js +6 -9
  36. package/dist/adapter/objects/webgl-resource.js.map +1 -1
  37. package/dist/adapter/objects/webgl-vertex-array-object.d.ts +6 -6
  38. package/dist/adapter/objects/webgl-vertex-array-object.d.ts.map +1 -1
  39. package/dist/adapter/objects/webgl-vertex-array-object.js +2 -2
  40. package/dist/adapter/objects/webgl-vertex-array-object.js.map +1 -1
  41. package/dist/adapter/resources/webgl-buffer.d.ts +2 -2
  42. package/dist/adapter/resources/webgl-buffer.d.ts.map +1 -1
  43. package/dist/adapter/resources/webgl-buffer.js +4 -3
  44. package/dist/adapter/resources/webgl-buffer.js.map +1 -1
  45. package/dist/adapter/resources/webgl-command-buffer.d.ts +9 -3
  46. package/dist/adapter/resources/webgl-command-buffer.d.ts.map +1 -1
  47. package/dist/adapter/resources/webgl-command-buffer.js +168 -25
  48. package/dist/adapter/resources/webgl-command-buffer.js.map +1 -1
  49. package/dist/adapter/resources/webgl-command-encoder.d.ts +5 -4
  50. package/dist/adapter/resources/webgl-command-encoder.d.ts.map +1 -1
  51. package/dist/adapter/resources/webgl-command-encoder.js +7 -3
  52. package/dist/adapter/resources/webgl-command-encoder.js.map +1 -1
  53. package/dist/adapter/resources/webgl-external-texture.js.map +1 -1
  54. package/dist/adapter/resources/webgl-framebuffer.d.ts +18 -21
  55. package/dist/adapter/resources/webgl-framebuffer.d.ts.map +1 -1
  56. package/dist/adapter/resources/webgl-framebuffer.js +36 -86
  57. package/dist/adapter/resources/webgl-framebuffer.js.map +1 -1
  58. package/dist/adapter/resources/webgl-render-pass.d.ts +18 -3
  59. package/dist/adapter/resources/webgl-render-pass.d.ts.map +1 -1
  60. package/dist/adapter/resources/webgl-render-pass.js +81 -1
  61. package/dist/adapter/resources/webgl-render-pass.js.map +1 -1
  62. package/dist/adapter/resources/webgl-render-pipeline.d.ts +5 -5
  63. package/dist/adapter/resources/webgl-render-pipeline.d.ts.map +1 -1
  64. package/dist/adapter/resources/webgl-render-pipeline.js +7 -8
  65. package/dist/adapter/resources/webgl-render-pipeline.js.map +1 -1
  66. package/dist/adapter/resources/webgl-sampler.d.ts +3 -3
  67. package/dist/adapter/resources/webgl-sampler.d.ts.map +1 -1
  68. package/dist/adapter/resources/webgl-sampler.js +2 -2
  69. package/dist/adapter/resources/webgl-sampler.js.map +1 -1
  70. package/dist/adapter/resources/webgl-shader.d.ts +2 -2
  71. package/dist/adapter/resources/webgl-shader.d.ts.map +1 -1
  72. package/dist/adapter/resources/webgl-shader.js +1 -1
  73. package/dist/adapter/resources/webgl-shader.js.map +1 -1
  74. package/dist/adapter/resources/webgl-texture.d.ts +41 -21
  75. package/dist/adapter/resources/webgl-texture.d.ts.map +1 -1
  76. package/dist/adapter/resources/webgl-texture.js +35 -33
  77. package/dist/adapter/resources/webgl-texture.js.map +1 -1
  78. package/dist/adapter/webgl-canvas-context.d.ts +4 -5
  79. package/dist/adapter/webgl-canvas-context.d.ts.map +1 -1
  80. package/dist/adapter/webgl-canvas-context.js +2 -2
  81. package/dist/adapter/webgl-canvas-context.js.map +1 -1
  82. package/dist/adapter/webgl-device.d.ts +22 -15
  83. package/dist/adapter/webgl-device.d.ts.map +1 -1
  84. package/dist/adapter/webgl-device.js +29 -11
  85. package/dist/adapter/webgl-device.js.map +1 -1
  86. package/dist/classic/accessor.d.ts +1 -1
  87. package/dist/classic/accessor.d.ts.map +1 -1
  88. package/dist/classic/accessor.js +1 -1
  89. package/dist/classic/accessor.js.map +1 -1
  90. package/dist/classic/buffer.d.ts +3 -4
  91. package/dist/classic/buffer.d.ts.map +1 -1
  92. package/dist/classic/buffer.js +4 -10
  93. package/dist/classic/buffer.js.map +1 -1
  94. package/dist/classic/typed-array-utils.d.ts +15 -17
  95. package/dist/classic/typed-array-utils.d.ts.map +1 -1
  96. package/dist/classic/typed-array-utils.js +1 -1
  97. package/dist/classic/typed-array-utils.js.map +1 -1
  98. package/dist/context/context/create-browser-context.js.map +1 -1
  99. package/dist/context/parameters/unified-parameter-api.d.ts +1 -1
  100. package/dist/context/parameters/unified-parameter-api.d.ts.map +1 -1
  101. package/dist/context/parameters/unified-parameter-api.js +1 -1
  102. package/dist/context/parameters/unified-parameter-api.js.map +1 -1
  103. package/dist/context/parameters/webgl-parameter-tables.d.ts +1 -2
  104. package/dist/context/parameters/webgl-parameter-tables.d.ts.map +1 -1
  105. package/dist/context/parameters/webgl-parameter-tables.js +1 -1
  106. package/dist/context/parameters/webgl-parameter-tables.js.map +1 -1
  107. package/dist/context/state-tracker/with-parameters.js +1 -1
  108. package/dist/context/state-tracker/with-parameters.js.map +1 -1
  109. package/dist/dist.dev.js +1107 -676
  110. package/dist/index.cjs +1088 -901
  111. package/dist/index.d.ts +18 -17
  112. package/dist/index.d.ts.map +1 -1
  113. package/dist/index.js +17 -16
  114. package/dist/index.js.map +1 -1
  115. package/dist.min.js +22 -21
  116. package/package.json +7 -4
  117. package/src/adapter/converters/device-parameters.ts +47 -23
  118. package/src/adapter/converters/sampler-parameters.ts +1 -2
  119. package/src/adapter/converters/texture-formats.ts +242 -161
  120. package/src/adapter/helpers/attribute-utils.ts +1 -2
  121. package/src/adapter/helpers/get-shader-info.ts +3 -0
  122. package/src/adapter/helpers/get-shader-layout.ts +1 -1
  123. package/src/adapter/helpers/uniforms.ts +9 -10
  124. package/src/adapter/objects/constants-to-keys.ts +0 -25
  125. package/src/adapter/objects/webgl-renderbuffer.ts +35 -32
  126. package/src/adapter/objects/webgl-resource.ts +6 -10
  127. package/src/adapter/objects/webgl-vertex-array-object.ts +6 -6
  128. package/src/adapter/resources/webgl-buffer.ts +6 -7
  129. package/src/adapter/resources/webgl-command-buffer.ts +330 -23
  130. package/src/adapter/resources/webgl-command-encoder.ts +9 -4
  131. package/src/adapter/resources/webgl-external-texture.ts +1 -1
  132. package/src/adapter/resources/webgl-framebuffer.ts +75 -123
  133. package/src/adapter/resources/webgl-render-pass.ts +148 -4
  134. package/src/adapter/resources/webgl-render-pipeline.ts +12 -9
  135. package/src/adapter/resources/webgl-sampler.ts +3 -4
  136. package/src/adapter/resources/webgl-shader.ts +2 -2
  137. package/src/adapter/resources/webgl-texture.ts +64 -46
  138. package/src/adapter/webgl-canvas-context.ts +5 -5
  139. package/src/adapter/webgl-device.ts +47 -18
  140. package/src/classic/accessor.ts +1 -1
  141. package/src/classic/buffer.ts +7 -7
  142. package/src/classic/typed-array-utils.ts +15 -26
  143. package/src/context/context/create-browser-context.ts +2 -2
  144. package/src/context/parameters/unified-parameter-api.ts +2 -2
  145. package/src/context/parameters/webgl-parameter-tables.ts +2 -2
  146. package/src/context/state-tracker/with-parameters.ts +1 -1
  147. package/src/index.ts +24 -22
  148. package/dist/adapter/converters/renderbuffer-formats.d.ts +0 -16
  149. package/dist/adapter/converters/renderbuffer-formats.d.ts.map +0 -1
  150. package/dist/adapter/converters/renderbuffer-formats.js +0 -181
  151. package/dist/adapter/converters/renderbuffer-formats.js.map +0 -1
  152. package/dist/types/webgl.d.ts +0 -145
  153. package/dist/types/webgl.d.ts.map +0 -1
  154. package/dist/types/webgl.js +0 -2
  155. package/dist/types/webgl.js.map +0 -1
  156. package/src/adapter/converters/renderbuffer-formats.ts +0 -92
  157. package/src/types/webgl.ts +0 -286
@@ -6,21 +6,26 @@ import type {
6
6
  CopyTextureToTextureOptions
7
7
  } from '@luma.gl/api';
8
8
 
9
- import CommandBuffer from './webgl-command-buffer';
10
- import WebGLDevice from '../webgl-device';
9
+ import {WEBGLCommandBuffer} from './webgl-command-buffer';
10
+ import {WebGLDevice} from '../webgl-device';
11
11
 
12
- export default class WEBGLCommandEncoder extends CommandEncoder {
12
+ export class WEBGLCommandEncoder extends CommandEncoder {
13
13
  readonly device: WebGLDevice;
14
14
 
15
- readonly commandBuffer = new CommandBuffer();
15
+ readonly commandBuffer: WEBGLCommandBuffer;
16
16
 
17
17
  constructor(device: WebGLDevice, props: CommandEncoderProps) {
18
18
  super(props);
19
19
  this.device = device;
20
+ this.commandBuffer = new WEBGLCommandBuffer(device);
20
21
  }
21
22
 
22
23
  override destroy(): void {}
23
24
 
25
+ override finish(): void {
26
+ this.commandBuffer.submitCommands();
27
+ }
28
+
24
29
  // beginRenderPass(GPURenderPassDescriptor descriptor): GPURenderPassEncoder;
25
30
  // beginComputePass(optional GPUComputePassDescriptor descriptor = {}): GPUComputePassEncoder;
26
31
  // finish(options?: {id?: string}): GPUCommandBuffer;
@@ -1,5 +1,5 @@
1
1
  /*
2
- export default class WEBGLExternalTexture extends WEBGLTexture {
2
+ export class WEBGLExternalTexture extends WEBGLTexture {
3
3
  readonly device: WebGLDevice;
4
4
  readonly gl: WebGLRenderingContext;
5
5
  readonly gl2: WebGL2RenderingContext | null;
@@ -1,59 +1,65 @@
1
1
  // luma.gl, MIT license
2
2
 
3
- import type {FramebufferProps, ColorTextureFormat} from '@luma.gl/api';
4
- import {Framebuffer, Texture, log, assert} from '@luma.gl/api';
3
+ import type {FramebufferProps, TextureFormat} from '@luma.gl/api';
4
+ import {Framebuffer, Texture, assert} from '@luma.gl/api';
5
5
  import GL from '@luma.gl/constants';
6
- import WebGLDevice from '../webgl-device';
7
- import WebGLTexture from './webgl-texture';
8
- import Renderbuffer from '../objects/webgl-renderbuffer';
9
- import {getWebGLTextureFormat, getWebGLDepthStencilAttachment} from '../converters/texture-formats';
6
+ import {WebGLDevice} from '../webgl-device';
7
+ import {WEBGLTexture} from './webgl-texture';
8
+ import {WEBGLRenderbuffer} from '../objects/webgl-renderbuffer';
9
+ import {getDepthStencilAttachmentWebGL} from '../converters/texture-formats';
10
10
 
11
11
  export type TextureAttachment = [Texture, number?, number?];
12
- export type Attachment = WebGLTexture | Renderbuffer | TextureAttachment;
12
+ export type Attachment = WEBGLTexture | WEBGLRenderbuffer | TextureAttachment;
13
13
 
14
14
  /** luma.gl Framebuffer, WebGL implementation */
15
- export default class WEBGLFramebuffer extends Framebuffer {
15
+ export class WEBGLFramebuffer extends Framebuffer {
16
16
  device: WebGLDevice;
17
17
  gl: WebGLRenderingContext;
18
18
  handle: WebGLFramebuffer;
19
19
 
20
- get texture() { return this.colorAttachments[0]; }
21
- readonly colorAttachments: WebGLTexture[] = [];
22
- readonly depthStencilAttachment: WebGLTexture | null = null;
23
- protected _ownResources: (WebGLTexture | Renderbuffer)[] = [];
20
+ get texture() {
21
+ return this.colorAttachments[0];
22
+ }
24
23
 
25
24
  constructor(device: WebGLDevice, props: FramebufferProps) {
26
25
  super(device, props);
26
+
27
+ // WebGL default framebuffer handle is null
28
+ const isDefaultFramebuffer = props.handle === null;
29
+
27
30
  this.device = device;
28
31
  this.gl = device.gl;
29
- this.handle = this.props.handle !== undefined ? this.props.handle : this.gl.createFramebuffer();
32
+ this.handle =
33
+ this.props.handle || isDefaultFramebuffer ? this.props.handle : this.gl.createFramebuffer();
30
34
 
31
- if (this.handle) { // default framebuffer is null...
35
+ if (!isDefaultFramebuffer) {
36
+ // default framebuffer handle is null, so we can't set spector metadata...
32
37
  device.setSpectorMetadata(this.handle, {id: this.props.id, props: this.props});
33
- }
34
38
 
35
- this.colorAttachments = this._createColorAttachments();
36
- // @ts-expect-error
37
- this.depthStencilAttachment = this._createDepthStencilAttachment();
39
+ // Auto create textures for attachments if needed
40
+ this.autoCreateAttachmentTextures();
38
41
 
39
- /** Attach from a map of attachments */
40
- const prevHandle = this.gl.bindFramebuffer(GL.FRAMEBUFFER, this.handle);
42
+ /** Attach from a map of attachments */
43
+ this.gl.bindFramebuffer(GL.FRAMEBUFFER, this.handle);
41
44
 
42
- // Walk the attachments
43
- for (let i = 0; i < this.colorAttachments.length; ++i) {
44
- const attachment = this.colorAttachments[i];
45
- const attachmentPoint = GL.COLOR_ATTACHMENT0 + i;
46
- if (attachment) {
47
- this._attachOne(attachmentPoint, attachment);
45
+ // Walk the attachments
46
+ for (let i = 0; i < this.colorAttachments.length; ++i) {
47
+ const attachment = this.colorAttachments[i];
48
+ const attachmentPoint = GL.COLOR_ATTACHMENT0 + i;
49
+ if (attachment) {
50
+ this._attachOne(attachmentPoint, attachment as WEBGLTexture);
51
+ }
48
52
  }
49
- }
50
53
 
51
- if (this.props.depthStencilAttachment) {
52
- this._attachOne(getWebGLDepthStencilAttachment(this.depthStencilAttachment.format), this.depthStencilAttachment);
53
- }
54
+ if (this.depthStencilAttachment) {
55
+ this._attachOne(
56
+ getDepthStencilAttachmentWebGL(this.depthStencilAttachment.format),
57
+ this.depthStencilAttachment as WEBGLTexture
58
+ );
59
+ }
54
60
 
55
- // @ts-expect-error
56
- this.gl.bindFramebuffer(GL.FRAMEBUFFER, prevHandle || null);
61
+ this.gl.bindFramebuffer(GL.FRAMEBUFFER, null);
62
+ }
57
63
 
58
64
  // @ts-expect-error
59
65
  if (props.check !== false) {
@@ -61,14 +67,12 @@ export default class WEBGLFramebuffer extends Framebuffer {
61
67
  }
62
68
  }
63
69
 
70
+ /** destroys any auto created resources etc. */
64
71
  override destroy(): void {
65
- if (this.handle !== null) {
66
- for (const resource of this._ownResources) {
67
- resource.destroy();
68
- }
72
+ super.destroy(); // destroys owned resources etc.
73
+ if (!this.destroyed && this.handle !== null) {
69
74
  this.gl.deleteFramebuffer(this.handle);
70
75
  // this.handle = null;
71
- this.destroyed = true;
72
76
  }
73
77
  }
74
78
 
@@ -77,92 +81,31 @@ export default class WEBGLFramebuffer extends Framebuffer {
77
81
  /** Check the status */
78
82
  protected _checkStatus(): void {
79
83
  const {gl} = this;
80
- const prevHandle = gl.bindFramebuffer(GL.FRAMEBUFFER, this.handle);
84
+ // TODO - should we really rely on this trick?
85
+ const prevHandle = gl.bindFramebuffer(GL.FRAMEBUFFER, this.handle) as unknown as WebGLFramebuffer;
81
86
  const status = gl.checkFramebufferStatus(GL.FRAMEBUFFER);
82
- // @ts-expect-error
83
87
  gl.bindFramebuffer(GL.FRAMEBUFFER, prevHandle || null);
84
88
  if (status !== gl.FRAMEBUFFER_COMPLETE) {
85
89
  throw new Error(`Framebuffer ${_getFrameBufferStatus(status)}`);
86
90
  }
87
91
  }
88
92
 
89
- _createColorAttachments(): WebGLTexture[] {
90
- return this.props.colorAttachments.map(colorAttachment => {
91
- if (!colorAttachment) {
92
- return undefined;
93
- }
94
- if (colorAttachment instanceof WebGLTexture) {
95
- return colorAttachment;
96
- }
97
- // if (typeof colorAttachment === 'default') {
98
- // return this._createColorAttachment('rgba8unorm', this.width, this.height);
99
- // }
100
- // @ts-expect-error
101
- return this._createColorAttachment(colorAttachment, this.width, this.height);
102
- });
103
- }
104
-
105
- /** Create a color attachment */
106
- protected _createColorAttachment(format: ColorTextureFormat, width: number, height: number): WebGLTexture {
107
- const texture = this.device._createTexture({
108
- id: `${this.id}-color`,
109
- data: null, // reserves texture memory, but texels are undefined
110
- format,
111
- // type: GL.UNSIGNED_BYTE,
112
- width,
113
- height,
114
- // Note: Mipmapping can be disabled by texture resource when we resize the texture
115
- // to a non-power-of-two dimenstion (NPOT texture) under WebGL1. To have consistant
116
- // behavior we always disable mipmaps.
117
- mipmaps: false,
118
- // Set MIN and MAG filtering parameters so mipmaps are not used in sampling.
119
- // Use LINEAR so subpixel algos like fxaa work.
120
- // Set WRAP modes that support NPOT textures too.
121
- sampler: {
122
- minFilter: 'linear',
123
- magFilter: 'linear',
124
- addressModeU: 'clamp-to-edge',
125
- addressModeV: 'clamp-to-edge'
126
- },
127
- // parameters: {
128
- // [GL.TEXTURE_MIN_FILTER]: GL.LINEAR,
129
- // [GL.TEXTURE_MAG_FILTER]: GL.LINEAR,
130
- // [GL.TEXTURE_WRAP_S]: GL.CLAMP_TO_EDGE,
131
- // [GL.TEXTURE_WRAP_T]: GL.CLAMP_TO_EDGE
132
- // }
133
- }) ;
134
- this._ownResources.push(texture);
135
- return texture;
136
- }
137
-
138
- /** Create a depth stencil attachment GL.DEPTH24_STENCIL8 */
139
- protected _createDepthStencilAttachment(): Renderbuffer | WebGLTexture {
140
- if (!this.props.depthStencilAttachment) {
141
- return undefined;
142
- }
143
- if (this.props.depthStencilAttachment instanceof Renderbuffer) {
144
- return this.props.depthStencilAttachment;
145
- }
146
- if (this.props.depthStencilAttachment instanceof Texture) {
147
- return this.props.depthStencilAttachment as unknown as WebGLTexture;
148
- }
149
- const format = this.props.depthStencilAttachment;
150
- const webglFormat = getWebGLTextureFormat(this.gl, format);
151
-
152
- const texture = new Renderbuffer(this.device, {
93
+ /** In WebGL we must use renderbuffers for depth/stencil attachments (unless we have extensions) */
94
+ protected override createDepthStencilTexture(format: TextureFormat): Texture {
95
+ return new WEBGLRenderbuffer(this.device, {
153
96
  id: `${this.id}-depth-stencil`, // TODO misleading if not depth and stencil?
154
- format: webglFormat,
97
+ format,
155
98
  // dataFormat: GL.DEPTH_STENCIL,
156
99
  // type: GL.UNSIGNED_INT_24_8,
157
100
  width: this.width,
158
101
  height: this.height
159
- });
160
- this._ownResources.push(texture);
161
- return texture;
102
+ }) as unknown as WEBGLTexture;
162
103
  }
163
104
 
164
- /** Attachment resize is expected to be a noop if size is same */
165
- protected _resizeAttachments(width: number, height: number): this {
105
+ /**
106
+ * Attachment resize is expected to be a noop if size is same
107
+ */
108
+ protected override resizeAttachments(width: number, height: number): this {
166
109
  // for default framebuffer, just update the stored size
167
110
  if (this.handle === null) {
168
111
  // assert(width === undefined && height === undefined);
@@ -170,6 +113,7 @@ export default class WEBGLFramebuffer extends Framebuffer {
170
113
  this.height = this.gl.drawingBufferHeight;
171
114
  return this;
172
115
  }
116
+
173
117
  if (width === undefined) {
174
118
  width = this.gl.drawingBufferWidth;
175
119
  }
@@ -177,34 +121,37 @@ export default class WEBGLFramebuffer extends Framebuffer {
177
121
  height = this.gl.drawingBufferHeight;
178
122
  }
179
123
 
180
- if (width !== this.width && height !== this.height) {
181
- log.log(2, `Resizing framebuffer ${this.id} to ${width}x${height}`)();
182
- }
124
+ // TODO Not clear that this is better than default destroy/create implementation
183
125
 
184
126
  for (const colorAttachment of this.colorAttachments) {
185
- colorAttachment.resize({width, height});
127
+ (colorAttachment as WEBGLTexture).resize({width, height});
128
+ }
129
+ if (this.depthStencilAttachment) {
130
+ (this.depthStencilAttachment as WEBGLTexture).resize({width, height});
186
131
  }
187
- this.depthStencilAttachment?.resize({width, height});
188
132
  return this;
189
133
  }
190
134
 
191
135
  /** Attach one attachment */
192
- protected _attachOne(attachmentPoint: GL, attachment: Attachment): WebGLTexture | Renderbuffer {
193
- if (attachment instanceof Renderbuffer) {
194
- this._attachRenderbuffer(attachmentPoint, attachment);
136
+ protected _attachOne(
137
+ attachmentPoint: GL,
138
+ attachment: Attachment
139
+ ): WEBGLTexture | WEBGLRenderbuffer {
140
+ if (attachment instanceof WEBGLRenderbuffer) {
141
+ this._attachWEBGLRenderbuffer(attachmentPoint, attachment);
195
142
  return attachment;
196
143
  } else if (Array.isArray(attachment)) {
197
144
  const [texture, layer = 0, level = 0] = attachment;
198
- this._attachTexture(attachmentPoint, texture as unknown as WebGLTexture, layer, level);
199
- return texture as unknown as WebGLTexture;
200
- } else if (attachment instanceof WebGLTexture) {
145
+ this._attachTexture(attachmentPoint, texture as unknown as WEBGLTexture, layer, level);
146
+ return texture as unknown as WEBGLTexture;
147
+ } else if (attachment instanceof WEBGLTexture) {
201
148
  this._attachTexture(attachmentPoint, attachment, 0, 0);
202
149
  return attachment;
203
150
  }
204
151
  throw new Error('attach');
205
152
  }
206
153
 
207
- protected _attachRenderbuffer(attachment: GL, renderbuffer: Renderbuffer): void {
154
+ protected _attachWEBGLRenderbuffer(attachment: GL, renderbuffer: WEBGLRenderbuffer): void {
208
155
  this.gl.framebufferRenderbuffer(
209
156
  GL.FRAMEBUFFER,
210
157
  attachment,
@@ -216,10 +163,15 @@ export default class WEBGLFramebuffer extends Framebuffer {
216
163
  /**
217
164
  * @param attachment
218
165
  * @param texture
219
- * @param layer = 0 - index into WebGLTextureArray and Texture3D or face for `TextureCubeMap`
166
+ * @param layer = 0 - index into WEBGLTextureArray and Texture3D or face for `TextureCubeMap`
220
167
  * @param level = 0 - mipmapLevel (must be 0 in WebGL1)
221
168
  */
222
- protected _attachTexture(attachment: GL, texture: WebGLTexture, layer: number, level: number): void {
169
+ protected _attachTexture(
170
+ attachment: GL,
171
+ texture: WEBGLTexture,
172
+ layer: number,
173
+ level: number
174
+ ): void {
223
175
  const {gl, gl2} = this.device;
224
176
  gl.bindTexture(texture.target, texture.handle);
225
177
 
@@ -1,15 +1,36 @@
1
- import {RenderPass, RenderPassProps} from '@luma.gl/api';
2
- import WebGLDevice from '../webgl-device';
1
+ import {RenderPass, RenderPassProps, NumericArray, RenderPassParameters} from '@luma.gl/api';
2
+ import {WebGLDevice} from '../webgl-device';
3
+ import {GL, GLParameters} from '@luma.gl/constants';
4
+ import {withParameters} from '../../context/state-tracker/with-parameters';
3
5
 
4
- export default class WEBGLRenderPass extends RenderPass {
6
+ // Should collapse during minification
7
+
8
+ const GL_DEPTH_BUFFER_BIT = 0x00000100;
9
+ const GL_STENCIL_BUFFER_BIT = 0x00000400;
10
+ const GL_COLOR_BUFFER_BIT = 0x00004000;
11
+
12
+ const GL_COLOR = 0x1800;
13
+
14
+ export class WEBGLRenderPass extends RenderPass {
5
15
  readonly device: WebGLDevice;
6
16
 
17
+ /** Parameters that should be applied before each draw call */
18
+ glParameters: GLParameters;
19
+
7
20
  constructor(device: WebGLDevice, props: RenderPassProps) {
8
21
  super(device, props);
9
22
  this.device = device;
23
+
24
+ // TODO - do parameters (scissorRect) affect the clear operation?
25
+ this.setParameters(this.props.parameters);
26
+
27
+ // Hack - for now WebGL draws in "immediate mode" (instead of queueing the operations)...
28
+ this.clear();
10
29
  }
11
30
 
12
- end(): void {}
31
+ end(): void {
32
+ // should add commands to CommandEncoder.
33
+ }
13
34
 
14
35
  pushDebugGroup(groupLabel: string): void {}
15
36
  popDebugGroup(): void {}
@@ -21,4 +42,127 @@ export default class WEBGLRenderPass extends RenderPass {
21
42
  // endOcclusionQuery(): void;
22
43
 
23
44
  // executeBundles(bundles: Iterable<GPURenderBundle>): void;
45
+
46
+ /**
47
+ * Maps RenderPass parameters to GL parameters
48
+ */
49
+ setParameters(parameters: RenderPassParameters = {}): void {
50
+ const glParameters: GLParameters = {};
51
+
52
+ // Framebuffers are specified using parameters in WebGL
53
+ if (this.props.framebuffer) {
54
+ glParameters.framebuffer = this.props.framebuffer;
55
+ }
56
+
57
+ if (this.props.depthReadOnly) {
58
+ glParameters.depthMask = !this.props.depthReadOnly;
59
+ }
60
+
61
+ glParameters.stencilMask = this.props.stencilReadOnly ? 0 : 1;
62
+
63
+ glParameters[GL.RASTERIZER_DISCARD] = this.props.discard;
64
+
65
+ // Map the four renderpass parameters to WebGL parameters
66
+ if (parameters.viewport) {
67
+ glParameters.viewport = parameters.viewport;
68
+ glParameters.depthRange = [parameters.viewport[4], parameters.viewport[5]];
69
+ }
70
+ glParameters.scissorTest = Boolean(parameters.scissorRect);
71
+ if (parameters.scissorRect) {
72
+ glParameters.scissor = parameters.scissorRect;
73
+ }
74
+ if (parameters.blendConstant) {
75
+ glParameters.blendColor = parameters.blendConstant;
76
+ }
77
+ if (parameters.stencilReference) {
78
+ // eslint-disable-next-line no-console
79
+ console.warn('RenderPassParameters.stencilReference not yet implemented in WebGL');
80
+ // parameters.stencilFunc = [func, ref, mask];
81
+ // Does this work?
82
+ parameters[GL.STENCIL_REF] = parameters.stencilReference;
83
+ }
84
+
85
+ this.glParameters = glParameters;
86
+ }
87
+
88
+ // Internal
89
+
90
+ /**
91
+ * Optionally clears depth, color and stencil buffers based on parameters
92
+ */
93
+ protected clear(): void {
94
+ const glParameters: GLParameters = {...this.glParameters};
95
+
96
+ let clearMask = 0;
97
+
98
+ if (this.props.clearColor !== false) {
99
+ clearMask |= GL_COLOR_BUFFER_BIT;
100
+ glParameters.clearColor = this.props.clearColor;
101
+ }
102
+ if (this.props.clearDepth !== false) {
103
+ clearMask |= GL_DEPTH_BUFFER_BIT;
104
+ glParameters.clearDepth = this.props.clearDepth;
105
+ }
106
+ if (this.props.clearStencil !== false) {
107
+ clearMask |= GL_STENCIL_BUFFER_BIT;
108
+ glParameters.clearStencil = this.props.clearStencil;
109
+ }
110
+
111
+ if (clearMask !== 0) {
112
+ // Temporarily set any clear "colors" and call clear
113
+ withParameters(this.device, glParameters, () => {
114
+ this.device.gl.clear(clearMask);
115
+ });
116
+
117
+ // TODO - clear multiple color attachments
118
+ // for (attachment of this.framebuffer.colorAttachments) {
119
+ // this.clearColorBuffer
120
+ // }
121
+ }
122
+ }
123
+
124
+ /**
125
+ * WebGL2 - clear a specific color buffer
126
+ */
127
+ protected clearColorBuffer(drawBuffer: number = 0, value: NumericArray = [0, 0, 0, 0]) {
128
+ withParameters(this.device.gl2, {framebuffer: this.props.framebuffer}, () => {
129
+ // Method selection per OpenGL ES 3 docs
130
+ switch (value.constructor) {
131
+ case Int32Array:
132
+ this.device.gl2.clearBufferiv(GL_COLOR, drawBuffer, value);
133
+ break;
134
+ case Uint32Array:
135
+ this.device.gl2.clearBufferuiv(GL_COLOR, drawBuffer, value);
136
+ break;
137
+ case Float32Array:
138
+ default:
139
+ this.device.gl2.clearBufferfv(GL_COLOR, drawBuffer, value);
140
+ break;
141
+ }
142
+ });
143
+ }
144
+
145
+ // clearDepthStencil() {
146
+ // const GL_DEPTH = 0x1801;
147
+ // const GL_STENCIL = 0x1802;
148
+ // const GL_DEPTH_STENCIL = 0x84f9;
149
+
150
+ // case GL_DEPTH:
151
+ // this.device.gl2.clearBufferfv(GL_DEPTH, 0, [value]);
152
+ // break;
153
+
154
+ // case GL_STENCIL:
155
+ // this.device.gl2.clearBufferiv(GL_STENCIL, 0, [value]);
156
+ // break;
157
+
158
+ // case GL_DEPTH_STENCIL:
159
+ // const [depth, stencil] = value;
160
+ // this.device.gl2.clearBufferfi(GL_DEPTH_STENCIL, 0, depth, stencil);
161
+ // break;
162
+
163
+ // default:
164
+ // assert(false, ERR_ARGUMENTS);
165
+ // }
166
+ // });
24
167
  }
168
+
@@ -17,16 +17,17 @@ import {withDeviceParameters, withGLParameters} from '../converters/device-param
17
17
  import {setUniform} from '../helpers/set-uniform';
18
18
  // import {copyUniform, checkUniformValues} from '../../classes/uniforms';
19
19
 
20
- import WebGLDevice from '../webgl-device';
21
- import WEBGLBuffer from './webgl-buffer';
22
- import WEBGLShader from './webgl-shader';
23
- import WEBGLTexture from './webgl-texture';
24
- import WEBGLVertexArrayObject from '../objects/webgl-vertex-array-object';
20
+ import {WebGLDevice} from '../webgl-device';
21
+ import {WEBGLBuffer} from './webgl-buffer';
22
+ import {WEBGLShader} from './webgl-shader';
23
+ import {WEBGLTexture} from './webgl-texture';
24
+ import {WEBGLVertexArrayObject} from '../objects/webgl-vertex-array-object';
25
+ import {WEBGLRenderPass} from './webgl-render-pass';
25
26
 
26
27
  const LOG_PROGRAM_PERF_PRIORITY = 4;
27
28
 
28
29
  /** Creates a new render pipeline */
29
- export default class WEBGLRenderPipeline extends RenderPipeline {
30
+ export class WEBGLRenderPipeline extends RenderPipeline {
30
31
  device: WebGLDevice;
31
32
  handle: WebGLProgram;
32
33
  vs: WEBGLShader;
@@ -159,7 +160,7 @@ export default class WEBGLRenderPipeline extends RenderPipeline {
159
160
  * This function unifies those ways into a single call using common parameters with sane defaults
160
161
  */
161
162
  draw(options: {
162
- renderPass?: RenderPass;
163
+ renderPass: RenderPass;
163
164
  vertexCount?: number;
164
165
  indexCount?: number;
165
166
  instanceCount?: number;
@@ -169,7 +170,7 @@ export default class WEBGLRenderPipeline extends RenderPipeline {
169
170
  baseVertex?: number;
170
171
  }): boolean {
171
172
  const {
172
- renderPass = this.device.getDefaultRenderPass(),
173
+ renderPass,
173
174
  vertexCount,
174
175
  // indexCount,
175
176
  instanceCount,
@@ -206,9 +207,11 @@ export default class WEBGLRenderPipeline extends RenderPipeline {
206
207
  this._applyBindings();
207
208
  this._applyUniforms();
208
209
 
210
+ const webglRenderPass = renderPass as WEBGLRenderPass;
211
+
209
212
  // TODO - double context push/pop
210
213
  withDeviceParameters(this.device, this.props.parameters, () => {
211
- withGLParameters(this.device, {framebuffer: renderPass.props.framebuffer}, () => {
214
+ withGLParameters(this.device, webglRenderPass.glParameters, () => {
212
215
  // TODO - Use polyfilled WebGL2RenderingContext instead of ANGLE extension
213
216
  if (isIndexed && isInstanced) {
214
217
  // ANGLE_instanced_arrays extension
@@ -1,10 +1,9 @@
1
1
  // luma.gl, MIT license
2
2
 
3
3
  import {Sampler, SamplerProps} from '@luma.gl/api';
4
- import GL from '@luma.gl/constants';
5
- import type {GLSamplerParameters} from '../../types/webgl';
4
+ import {GL, GLSamplerParameters} from '@luma.gl/constants';
6
5
  import {convertSamplerParametersToWebGL} from '../converters/sampler-parameters';
7
- import type WebGLDevice from '../webgl-device';
6
+ import type {WebGLDevice} from '../webgl-device';
8
7
 
9
8
  /**
10
9
  * Sampler object -
@@ -13,7 +12,7 @@ import type WebGLDevice from '../webgl-device';
13
12
  * so that they can be set directly on the texture
14
13
  * https://github.com/WebGLSamples/WebGL2Samples/blob/master/samples/sampler_object.html
15
14
  */
16
- export default class WEBGLSampler extends Sampler {
15
+ export class WEBGLSampler extends Sampler {
17
16
  readonly device: WebGLDevice;
18
17
  readonly handle: WebGLSampler;
19
18
  readonly parameters: GLSamplerParameters;
@@ -3,12 +3,12 @@ import {log, uid, Shader, ShaderProps, CompilerMessage, formatCompilerLog} from
3
3
  import GL from '@luma.gl/constants';
4
4
  import {getShaderInfo} from '../helpers/get-shader-info';
5
5
  import {parseShaderCompilerLog} from '../helpers/parse-shader-compiler-log';
6
- import WebGLDevice from '../webgl-device';
6
+ import {WebGLDevice} from '../webgl-device';
7
7
 
8
8
  /**
9
9
  * An immutable compiled shader program that execute portions of the GPU Pipeline
10
10
  */
11
- export default class WEBGLShader extends Shader {
11
+ export class WEBGLShader extends Shader {
12
12
  readonly device: WebGLDevice;
13
13
  readonly handle: WebGLShader;
14
14