@luma.gl/webgl 9.0.0-alpha.34 → 9.0.0-alpha.36

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 (73) hide show
  1. package/dist/adapter/converters/device-parameters.d.ts +9 -0
  2. package/dist/adapter/converters/device-parameters.d.ts.map +1 -1
  3. package/dist/adapter/converters/device-parameters.js +15 -2
  4. package/dist/adapter/converters/device-parameters.js.map +1 -1
  5. package/dist/adapter/resources/webgl-command-buffer.js +0 -1
  6. package/dist/adapter/resources/webgl-command-buffer.js.map +1 -1
  7. package/dist/adapter/resources/webgl-render-pass.d.ts +2 -2
  8. package/dist/adapter/resources/webgl-render-pass.d.ts.map +1 -1
  9. package/dist/adapter/resources/webgl-render-pass.js +5 -3
  10. package/dist/adapter/resources/webgl-render-pass.js.map +1 -1
  11. package/dist/adapter/resources/webgl-render-pipeline.d.ts +23 -28
  12. package/dist/adapter/resources/webgl-render-pipeline.d.ts.map +1 -1
  13. package/dist/adapter/resources/webgl-render-pipeline.js +41 -109
  14. package/dist/adapter/resources/webgl-render-pipeline.js.map +1 -1
  15. package/dist/adapter/resources/webgl-sampler.js.map +1 -1
  16. package/dist/adapter/resources/webgl-shader.js +3 -1
  17. package/dist/adapter/resources/webgl-shader.js.map +1 -1
  18. package/dist/adapter/resources/webgl-texture.js +5 -5
  19. package/dist/adapter/resources/webgl-texture.js.map +1 -1
  20. package/dist/adapter/resources/webgl-vertex-array.d.ts +67 -0
  21. package/dist/adapter/resources/webgl-vertex-array.d.ts.map +1 -0
  22. package/dist/adapter/resources/webgl-vertex-array.js +166 -0
  23. package/dist/adapter/resources/webgl-vertex-array.js.map +1 -0
  24. package/dist/adapter/webgl-device.d.ts +11 -1
  25. package/dist/adapter/webgl-device.d.ts.map +1 -1
  26. package/dist/adapter/webgl-device.js +66 -1
  27. package/dist/adapter/webgl-device.js.map +1 -1
  28. package/dist/classic/clear.js +3 -3
  29. package/dist/classic/clear.js.map +1 -1
  30. package/dist/classic/copy-and-blit.d.ts.map +1 -1
  31. package/dist/classic/copy-and-blit.js +7 -9
  32. package/dist/classic/copy-and-blit.js.map +1 -1
  33. package/dist/context/context/create-browser-context.d.ts.map +1 -1
  34. package/dist/context/context/create-browser-context.js.map +1 -1
  35. package/dist/context/parameters/unified-parameter-api.d.ts +3 -3
  36. package/dist/context/parameters/unified-parameter-api.d.ts.map +1 -1
  37. package/dist/context/parameters/unified-parameter-api.js +4 -4
  38. package/dist/context/parameters/unified-parameter-api.js.map +1 -1
  39. package/dist/context/state-tracker/track-context-state.js +3 -3
  40. package/dist/context/state-tracker/track-context-state.js.map +1 -1
  41. package/dist/context/state-tracker/with-parameters.d.ts +1 -1
  42. package/dist/context/state-tracker/with-parameters.d.ts.map +1 -1
  43. package/dist/context/state-tracker/with-parameters.js +3 -3
  44. package/dist/context/state-tracker/with-parameters.js.map +1 -1
  45. package/dist/dist.dev.js +1273 -1178
  46. package/dist/index.cjs +1026 -971
  47. package/dist/index.d.ts +5 -5
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +5 -5
  50. package/dist/index.js.map +1 -1
  51. package/dist.min.js +22 -22
  52. package/package.json +5 -5
  53. package/src/adapter/converters/device-parameters.ts +34 -2
  54. package/src/adapter/resources/webgl-command-buffer.ts +2 -2
  55. package/src/adapter/resources/webgl-render-pass.ts +8 -6
  56. package/src/adapter/resources/webgl-render-pipeline.ts +141 -173
  57. package/src/adapter/resources/webgl-sampler.ts +1 -1
  58. package/src/adapter/resources/webgl-shader.ts +1 -1
  59. package/src/adapter/resources/webgl-texture.ts +5 -5
  60. package/src/adapter/resources/webgl-vertex-array.ts +278 -0
  61. package/src/adapter/webgl-device.ts +137 -11
  62. package/src/classic/clear.ts +3 -3
  63. package/src/classic/copy-and-blit.ts +19 -15
  64. package/src/context/context/create-browser-context.ts +12 -0
  65. package/src/context/parameters/unified-parameter-api.ts +4 -4
  66. package/src/context/state-tracker/track-context-state.ts +3 -3
  67. package/src/context/state-tracker/with-parameters.ts +3 -3
  68. package/src/index.ts +38 -16
  69. package/dist/adapter/objects/webgl-vertex-array-object.d.ts +0 -55
  70. package/dist/adapter/objects/webgl-vertex-array-object.d.ts.map +0 -1
  71. package/dist/adapter/objects/webgl-vertex-array-object.js +0 -173
  72. package/dist/adapter/objects/webgl-vertex-array-object.js.map +0 -1
  73. package/src/adapter/objects/webgl-vertex-array-object.ts +0 -276
@@ -1,13 +1,11 @@
1
1
  import { RenderPipeline, cast, log } from '@luma.gl/core';
2
- import { mergeShaderLayout, getAttributeInfosFromLayouts } from '@luma.gl/core';
2
+ import { mergeShaderLayout } from '@luma.gl/core';
3
3
  import { GL } from '@luma.gl/constants';
4
- import { getGLFromVertexType } from "../converters/vertex-formats.js";
5
4
  import { getShaderLayout } from "../helpers/get-shader-layout.js";
6
- import { withDeviceParameters, withGLParameters } from "../converters/device-parameters.js";
5
+ import { withDeviceAndGLParameters } from "../converters/device-parameters.js";
7
6
  import { setUniform } from "../helpers/set-uniform.js";
8
7
  import { WEBGLBuffer } from "./webgl-buffer.js";
9
8
  import { WEBGLTexture } from "./webgl-texture.js";
10
- import { WEBGLVertexArrayObject } from "../objects/webgl-vertex-array-object.js";
11
9
  const LOG_PROGRAM_PERF_PRIORITY = 4;
12
10
  export class WEBGLRenderPipeline extends RenderPipeline {
13
11
  constructor(device, props) {
@@ -17,14 +15,9 @@ export class WEBGLRenderPipeline extends RenderPipeline {
17
15
  this.vs = void 0;
18
16
  this.fs = void 0;
19
17
  this.introspectedLayout = void 0;
20
- this.shaderLayout = void 0;
21
- this.bufferLayout = void 0;
22
18
  this.uniforms = {};
23
19
  this.bindings = {};
24
- this.constantAttributes = {};
25
- this._indexBuffer = void 0;
26
20
  this.varyings = null;
27
- this.vertexArrayObject = void 0;
28
21
  this._textureUniforms = {};
29
22
  this._textureIndexCounter = 0;
30
23
  this._uniformCount = 0;
@@ -49,8 +42,6 @@ export class WEBGLRenderPipeline extends RenderPipeline {
49
42
  this._compileAndLink();
50
43
  this.introspectedLayout = getShaderLayout(this.device.gl, this.handle);
51
44
  this.shaderLayout = mergeShaderLayout(this.introspectedLayout, props.shaderLayout);
52
- this.bufferLayout = props.bufferLayout || [];
53
- this.vertexArrayObject = new WEBGLVertexArrayObject(this.device);
54
45
  }
55
46
  destroy() {
56
47
  if (this.handle) {
@@ -58,51 +49,6 @@ export class WEBGLRenderPipeline extends RenderPipeline {
58
49
  this.destroyed = true;
59
50
  }
60
51
  }
61
- setIndexBuffer(indexBuffer) {
62
- const webglBuffer = cast(indexBuffer);
63
- this.vertexArrayObject.setElementBuffer(webglBuffer);
64
- this._indexBuffer = webglBuffer;
65
- }
66
- setAttributes(buffers) {
67
- const attributeInfos = getAttributeInfosFromLayouts(this.shaderLayout, this.bufferLayout);
68
- for (const [bufferName, buffer] of Object.entries(buffers)) {
69
- let set = false;
70
- for (const attributeInfo of Object.values(attributeInfos)) {
71
- if (attributeInfo.bufferName !== bufferName) {
72
- continue;
73
- }
74
- const webglBuffer = cast(buffer);
75
- const glType = getGLFromVertexType(attributeInfo.bufferDataType);
76
- log.log(2, {
77
- setAttribute: attributeInfo.attributeName,
78
- toBuffer: bufferName,
79
- size: attributeInfo.bufferComponents,
80
- type: glType,
81
- stride: attributeInfo.byteStride,
82
- offset: attributeInfo.byteOffset,
83
- normalized: attributeInfo.normalized,
84
- integer: attributeInfo.integer,
85
- divisor: attributeInfo.stepMode === 'instance' ? 1 : 0
86
- })();
87
- this.vertexArrayObject.setBuffer(attributeInfo.location, webglBuffer, {
88
- size: attributeInfo.bufferComponents,
89
- type: glType,
90
- stride: attributeInfo.byteStride,
91
- offset: attributeInfo.byteOffset,
92
- normalized: attributeInfo.normalized,
93
- integer: attributeInfo.integer,
94
- divisor: attributeInfo.stepMode === 'instance' ? 1 : 0
95
- });
96
- set = true;
97
- }
98
- if (!set) {
99
- log.warn(`setAttributes(): Ignoring (buffer "${buffer.id}" for unknown attribute "${name}" in pipeline "${this.id}"`)();
100
- }
101
- }
102
- }
103
- setConstantAttributes(attributes) {
104
- Object.assign(this.constantAttributes, attributes);
105
- }
106
52
  setBindings(bindings) {
107
53
  for (const [name, value] of Object.entries(bindings)) {
108
54
  const binding = this.shaderLayout.bindings.find(binding => binding.name === name);
@@ -137,50 +83,48 @@ export class WEBGLRenderPipeline extends RenderPipeline {
137
83
  Object.assign(this.uniforms, uniforms);
138
84
  }
139
85
  draw(options) {
140
- var _this$_indexBuffer;
86
+ var _vertexArray$indexBuf;
141
87
  const {
142
88
  renderPass,
89
+ vertexArray,
143
90
  vertexCount,
144
91
  instanceCount,
145
92
  firstVertex = 0
146
93
  } = options;
147
- const drawMode = getGLDrawMode(this.props.topology);
148
- const isIndexed = Boolean(this._indexBuffer);
149
- const indexType = (_this$_indexBuffer = this._indexBuffer) === null || _this$_indexBuffer === void 0 ? void 0 : _this$_indexBuffer.glIndexType;
150
- const isInstanced = Number(options.instanceCount) > 0;
151
- if (!this._areTexturesRenderable() || options.vertexCount === 0) {
94
+ const glDrawMode = getGLDrawMode(this.props.topology);
95
+ const isIndexed = Boolean(vertexArray.indexBuffer);
96
+ const glIndexType = (_vertexArray$indexBuf = vertexArray.indexBuffer) === null || _vertexArray$indexBuf === void 0 ? void 0 : _vertexArray$indexBuf.glIndexType;
97
+ const isInstanced = Number(instanceCount) > 0;
98
+ if (!this._areTexturesRenderable() || vertexCount === 0) {
152
99
  return false;
153
100
  }
154
101
  this.device.gl.useProgram(this.handle);
155
- this.vertexArrayObject.bind(() => {
156
- const primitiveMode = getGLPrimitive(this.props.topology);
157
- const transformFeedback = null;
102
+ vertexArray.bindBeforeRender(renderPass);
103
+ const primitiveMode = getGLPrimitive(this.props.topology);
104
+ const transformFeedback = null;
105
+ if (transformFeedback) {
106
+ transformFeedback.begin(primitiveMode);
107
+ }
108
+ this._applyBindings();
109
+ this._applyUniforms();
110
+ const webglRenderPass = renderPass;
111
+ withDeviceAndGLParameters(this.device, this.props.parameters, webglRenderPass.glParameters, () => {
112
+ if (isIndexed && isInstanced) {
113
+ var _this$device$gl2;
114
+ (_this$device$gl2 = this.device.gl2) === null || _this$device$gl2 === void 0 ? void 0 : _this$device$gl2.drawElementsInstanced(glDrawMode, vertexCount || 0, glIndexType, firstVertex, instanceCount || 0);
115
+ } else if (isIndexed) {
116
+ this.device.gl.drawElements(glDrawMode, vertexCount || 0, glIndexType, firstVertex);
117
+ } else if (isInstanced) {
118
+ var _this$device$gl3;
119
+ (_this$device$gl3 = this.device.gl2) === null || _this$device$gl3 === void 0 ? void 0 : _this$device$gl3.drawArraysInstanced(glDrawMode, firstVertex, vertexCount || 0, instanceCount || 0);
120
+ } else {
121
+ this.device.gl.drawArrays(glDrawMode, firstVertex, vertexCount || 0);
122
+ }
158
123
  if (transformFeedback) {
159
- transformFeedback.begin(primitiveMode);
124
+ transformFeedback.end();
160
125
  }
161
- this._applyBindings();
162
- this._applyUniforms();
163
- this._applyConstantAttributes();
164
- const webglRenderPass = renderPass;
165
- withDeviceParameters(this.device, this.props.parameters, () => {
166
- withGLParameters(this.device, webglRenderPass.glParameters, () => {
167
- if (isIndexed && isInstanced) {
168
- var _this$device$gl2;
169
- (_this$device$gl2 = this.device.gl2) === null || _this$device$gl2 === void 0 ? void 0 : _this$device$gl2.drawElementsInstanced(drawMode, vertexCount || 0, indexType, firstVertex, instanceCount || 0);
170
- } else if (isIndexed) {
171
- this.device.gl.drawElements(drawMode, vertexCount || 0, indexType, firstVertex);
172
- } else if (isInstanced) {
173
- var _this$device$gl3;
174
- (_this$device$gl3 = this.device.gl2) === null || _this$device$gl3 === void 0 ? void 0 : _this$device$gl3.drawArraysInstanced(drawMode, firstVertex, vertexCount || 0, instanceCount || 0);
175
- } else {
176
- this.device.gl.drawArrays(drawMode, firstVertex, vertexCount || 0);
177
- }
178
- });
179
- if (transformFeedback) {
180
- transformFeedback.end();
181
- }
182
- });
183
126
  });
127
+ vertexArray.unbindAfterRender(renderPass);
184
128
  return true;
185
129
  }
186
130
  _compileAndLink() {
@@ -192,16 +136,15 @@ export class WEBGLRenderPipeline extends RenderPipeline {
192
136
  log.time(LOG_PROGRAM_PERF_PRIORITY, `linkProgram for ${this.id}`)();
193
137
  gl.linkProgram(this.handle);
194
138
  log.timeEnd(LOG_PROGRAM_PERF_PRIORITY, `linkProgram for ${this.id}`)();
195
- if (gl.debug || log.level > 0) {
196
- const linked = gl.getProgramParameter(this.handle, gl.LINK_STATUS);
197
- if (!linked) {
198
- throw new Error(`Error linking: ${gl.getProgramInfoLog(this.handle)}`);
199
- }
200
- gl.validateProgram(this.handle);
201
- const validated = gl.getProgramParameter(this.handle, gl.VALIDATE_STATUS);
202
- if (!validated) {
203
- throw new Error(`Error validating: ${gl.getProgramInfoLog(this.handle)}`);
204
- }
139
+ if (!gl.debug && log.level === 0) {}
140
+ const linked = gl.getProgramParameter(this.handle, gl.LINK_STATUS);
141
+ if (!linked) {
142
+ throw new Error(`Error linking: ${gl.getProgramInfoLog(this.handle)}`);
143
+ }
144
+ gl.validateProgram(this.handle);
145
+ const validated = gl.getProgramParameter(this.handle, gl.VALIDATE_STATUS);
146
+ if (!validated) {
147
+ throw new Error(`Error validating: ${gl.getProgramInfoLog(this.handle)}`);
205
148
  }
206
149
  }
207
150
  _areTexturesRenderable() {
@@ -217,17 +160,6 @@ export class WEBGLRenderPipeline extends RenderPipeline {
217
160
  }
218
161
  return texturesRenderable;
219
162
  }
220
- _applyConstantAttributes() {
221
- const attributeInfos = getAttributeInfosFromLayouts(this.shaderLayout, this.bufferLayout);
222
- for (const [name, value] of Object.entries(this.constantAttributes)) {
223
- const attributeInfo = attributeInfos[name];
224
- if (!attributeInfo) {
225
- log.warn(`Ignoring constant value supplied for unknown attribute "${name}" in pipeline "${this.id}"`)();
226
- continue;
227
- }
228
- this.vertexArrayObject.setConstant(attributeInfo.location, value);
229
- }
230
- }
231
163
  _applyBindings() {
232
164
  this.device.gl.useProgram(this.handle);
233
165
  const {
@@ -1 +1 @@
1
- {"version":3,"file":"webgl-render-pipeline.js","names":["RenderPipeline","cast","log","mergeShaderLayout","getAttributeInfosFromLayouts","GL","getGLFromVertexType","getShaderLayout","withDeviceParameters","withGLParameters","setUniform","WEBGLBuffer","WEBGLTexture","WEBGLVertexArrayObject","LOG_PROGRAM_PERF_PRIORITY","WEBGLRenderPipeline","constructor","device","props","handle","vs","fs","introspectedLayout","shaderLayout","bufferLayout","uniforms","bindings","constantAttributes","_indexBuffer","varyings","vertexArrayObject","_textureUniforms","_textureIndexCounter","_uniformCount","_uniformSetters","gl","createProgram","setSpectorMetadata","id","bufferMode","SEPARATE_ATTRIBS","length","_this$device$gl","assertWebGL2","gl2","transformFeedbackVaryings","_compileAndLink","destroy","deleteProgram","destroyed","setIndexBuffer","indexBuffer","webglBuffer","setElementBuffer","setAttributes","buffers","attributeInfos","bufferName","buffer","Object","entries","set","attributeInfo","values","glType","bufferDataType","setAttribute","attributeName","toBuffer","size","bufferComponents","type","stride","byteStride","offset","byteOffset","normalized","integer","divisor","stepMode","setBuffer","location","warn","name","setConstantAttributes","attributes","assign","setBindings","value","binding","find","Error","setUniforms","draw","options","_this$_indexBuffer","renderPass","vertexCount","instanceCount","firstVertex","drawMode","getGLDrawMode","topology","isIndexed","Boolean","indexType","glIndexType","isInstanced","Number","_areTexturesRenderable","useProgram","bind","primitiveMode","getGLPrimitive","transformFeedback","begin","_applyBindings","_applyUniforms","_applyConstantAttributes","webglRenderPass","parameters","glParameters","_this$device$gl2","drawElementsInstanced","drawElements","_this$device$gl3","drawArraysInstanced","drawArrays","end","attachShader","time","linkProgram","timeEnd","debug","level","linked","getProgramParameter","LINK_STATUS","getProgramInfoLog","validateProgram","validated","VALIDATE_STATUS","texturesRenderable","texture","update","loaded","undefined","setConstant","textureUnit","uniformBufferIndex","getUniformBlockIndex","INVALID_INDEX","uniformBlockBinding","bindBufferBase","UNIFORM_BUFFER","bindBufferRange","byteLength","activeTexture","TEXTURE0","bindTexture","target","uniformLayout","_this$uniforms$name","POINTS","LINES","LINE_STRIP","LINE_LOOP","TRIANGLES","TRIANGLE_STRIP","TRIANGLE_FAN"],"sources":["../../../src/adapter/resources/webgl-render-pipeline.ts"],"sourcesContent":["// luma.gl, MIT license\nimport type {\n TypedArray,\n UniformValue,\n RenderPipelineProps,\n Binding,\n ShaderLayout,\n BufferLayout,\n PrimitiveTopology\n} from '@luma.gl/core';\nimport type {RenderPass, Buffer} from '@luma.gl/core';\nimport {RenderPipeline, cast, log} from '@luma.gl/core';\nimport {mergeShaderLayout, getAttributeInfosFromLayouts} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\n\nimport {getGLFromVertexType} from '../converters/vertex-formats';\nimport {getShaderLayout} from '../helpers/get-shader-layout';\nimport {withDeviceParameters, withGLParameters} from '../converters/device-parameters';\nimport {setUniform} from '../helpers/set-uniform';\n// import {copyUniform, checkUniformValues} from '../../classes/uniforms';\n\nimport {WebGLDevice} from '../webgl-device';\nimport {WEBGLBuffer} from './webgl-buffer';\nimport {WEBGLShader} from './webgl-shader';\nimport {WEBGLTexture} from './webgl-texture';\nimport {WEBGLVertexArrayObject} from '../objects/webgl-vertex-array-object';\nimport {WEBGLRenderPass} from './webgl-render-pass';\n\nconst LOG_PROGRAM_PERF_PRIORITY = 4;\n\n/** Creates a new render pipeline */\nexport class WEBGLRenderPipeline extends RenderPipeline {\n /** The WebGL device that created this render pipeline */\n device: WebGLDevice;\n /** Handle to underlying WebGL program */\n handle: WebGLProgram;\n /** vertex shader */\n vs: WEBGLShader;\n /** fragment shader */\n fs: WEBGLShader;\n /** The layout extracted from shader by WebGL introspection APIs */\n introspectedLayout: ShaderLayout;\n /** The merged layout */\n shaderLayout: ShaderLayout;\n /** Buffer map describing buffer interleaving etc */\n bufferLayout: BufferLayout[];\n\n /** Uniforms set on this model */\n uniforms: Record<string, any> = {};\n /** Bindings set on this model */\n bindings: Record<string, any> = {};\n /** Any constant attributes */\n constantAttributes: Record<string, TypedArray> = {};\n /** Index buffer is stored separately */\n _indexBuffer?: WEBGLBuffer;\n /** WebGL varyings */\n varyings: string[] | null = null;\n\n /** Stores attribute bindings */\n vertexArrayObject: WEBGLVertexArrayObject;\n\n _textureUniforms: Record<string, any> = {};\n _textureIndexCounter: number = 0;\n _uniformCount: number = 0;\n _uniformSetters: Record<string, Function> = {}; // TODO are these used?\n\n constructor(device: WebGLDevice, props: RenderPipelineProps) {\n super(device, props);\n this.device = device;\n this.handle = this.props.handle || this.device.gl.createProgram();\n this.device.setSpectorMetadata(this.handle, {id: this.props.id});\n\n // Create shaders if needed\n this.vs = cast<WEBGLShader>(props.vs);\n this.fs = cast<WEBGLShader>(props.fs);\n // assert(this.vs.stage === 'vertex');\n // assert(this.fs.stage === 'fragment');\n\n // Setup varyings if supplied\n // @ts-expect-error WebGL only\n const {varyings, bufferMode = GL.SEPARATE_ATTRIBS} = props;\n if (varyings && varyings.length > 0) {\n this.device.assertWebGL2();\n this.varyings = varyings;\n this.device.gl2?.transformFeedbackVaryings(this.handle, varyings, bufferMode);\n }\n\n this._compileAndLink();\n\n this.introspectedLayout = getShaderLayout(this.device.gl, this.handle);\n // Merge provided layout with introspected layout\n this.shaderLayout = mergeShaderLayout(this.introspectedLayout, props.shaderLayout);\n // Merge layout with any buffer map overrides\n this.bufferLayout = props.bufferLayout || [];\n // this.shaderLayout = mergeBufferMap(this.shaderLayout, this.bufferLayout);\n this.vertexArrayObject = new WEBGLVertexArrayObject(this.device);\n }\n\n override destroy(): void {\n if (this.handle) {\n this.device.gl.deleteProgram(this.handle);\n // this.handle = null;\n this.destroyed = true;\n }\n }\n\n setIndexBuffer(indexBuffer: Buffer): void {\n const webglBuffer = cast<WEBGLBuffer>(indexBuffer);\n this.vertexArrayObject.setElementBuffer(webglBuffer);\n this._indexBuffer = webglBuffer;\n }\n\n /** @todo needed for portable model */\n setAttributes(buffers: Record<string, Buffer>): void {\n const attributeInfos = getAttributeInfosFromLayouts(this.shaderLayout, this.bufferLayout);\n\n for (const [bufferName, buffer] of Object.entries(buffers)) {\n let set = false;\n for (const attributeInfo of Object.values(attributeInfos)) {\n if (attributeInfo.bufferName !== bufferName) {\n continue; // eslint-disable-line no-continue\n }\n const webglBuffer = cast<WEBGLBuffer>(buffer);\n\n const glType = getGLFromVertexType(attributeInfo.bufferDataType);\n // TODO remove when we have more confidence\n log.log(2, {\n setAttribute: attributeInfo.attributeName,\n toBuffer: bufferName,\n size: attributeInfo.bufferComponents,\n type: glType,\n stride: attributeInfo.byteStride,\n offset: attributeInfo.byteOffset,\n normalized: attributeInfo.normalized,\n // it is the shader attribute declaration, not the vertex memory format,\n // that determines if the data in the buffer will be treated as integers.\n // /\n // Also note that WebGL supports assigning non-normalized integer data to floating point attributes,\n // but as far as we can tell, WebGPU does not.\n integer: attributeInfo.integer,\n divisor: attributeInfo.stepMode === 'instance' ? 1 : 0\n })();\n this.vertexArrayObject.setBuffer(attributeInfo.location, webglBuffer, {\n size: attributeInfo.bufferComponents,\n type: glType,\n stride: attributeInfo.byteStride,\n offset: attributeInfo.byteOffset,\n normalized: attributeInfo.normalized,\n // it is the shader attribute declaration, not the vertex memory format,\n // that determines if the data in the buffer will be treated as integers.\n // /\n // Also note that WebGL supports assigning non-normalized integer data to floating point attributes,\n // but as far as we can tell, WebGPU does not.\n integer: attributeInfo.integer,\n divisor: attributeInfo.stepMode === 'instance' ? 1 : 0\n });\n set = true;\n }\n if (!set) {\n log.warn(\n `setAttributes(): Ignoring (buffer \"${buffer.id}\" for unknown attribute \"${name}\" in pipeline \"${this.id}\"`\n )();\n }\n }\n }\n\n /**\n * Constant attributes are only supported in WebGL, not in WebGPU\n * Any attribute that is disabled in the current vertex array object\n * is read from the context's global constant value for that attribute location.\n * @param attributes\n */\n setConstantAttributes(attributes: Record<string, TypedArray>): void {\n // TODO - there should be no advantage to setting these here vs in _applyConstantAttributes\n // for (const [name, value] of Object.entries(attributes)) {\n // const attributeInfo = getAttributeInfosFromLayouts(this.shaderLayout, this.bufferLayout, name);\n // if (!attributeInfo) {\n // log.warn(\n // `Ignoring constant value supplied for unknown attribute \"${name}\" in pipeline \"${this.id}\"`\n // )();\n // continue; // eslint-disable-line no-continue\n // }\n // this.vertexArrayObject.setConstant(attributeInfo.location, value);\n // }\n Object.assign(this.constantAttributes, attributes);\n }\n\n /**\n * Bindings include: textures, samplers and uniform buffers\n * @todo needed for portable model\n */\n setBindings(bindings: Record<string, Binding>): void {\n // if (log.priority >= 2) {\n // checkUniformValues(uniforms, this.id, this._uniformSetters);\n // }\n\n for (const [name, value] of Object.entries(bindings)) {\n const binding = this.shaderLayout.bindings.find(binding => binding.name === name);\n if (!binding) {\n log.warn(`Unknown binding ${name} in render pipeline ${this.id}`)();\n continue; // eslint-disable-line no-continue\n }\n if (!value) {\n log.warn(`Unsetting binding ${name} in render pipeline ${this.id}`)();\n }\n switch (binding.type) {\n case 'uniform':\n // @ts-expect-error\n if (!(value instanceof WEBGLBuffer) && !(value.buffer instanceof WEBGLBuffer)) {\n throw new Error('buffer value');\n }\n break;\n case 'texture':\n if (!(value instanceof WEBGLTexture)) {\n throw new Error('texture value');\n }\n break;\n case 'sampler':\n log.warn(`Ignoring sampler ${name}`)();\n break;\n default:\n throw new Error(binding.type);\n }\n\n this.bindings[name] = value;\n }\n }\n\n setUniforms(uniforms: Record<string, UniformValue>) {\n // TODO - check against layout\n Object.assign(this.uniforms, uniforms);\n }\n\n /** @todo needed for portable model\n * @note The WebGL API is offers many ways to draw things\n * This function unifies those ways into a single call using common parameters with sane defaults\n */\n draw(options: {\n renderPass: RenderPass;\n vertexCount?: number;\n indexCount?: number;\n instanceCount?: number;\n firstVertex?: number;\n firstIndex?: number;\n firstInstance?: number;\n baseVertex?: number;\n }): boolean {\n const {\n renderPass,\n vertexCount,\n // indexCount,\n instanceCount,\n firstVertex = 0\n // firstIndex,\n // firstInstance,\n // baseVertex\n } = options;\n\n const drawMode = getGLDrawMode(this.props.topology);\n const isIndexed: boolean = Boolean(this._indexBuffer);\n const indexType = this._indexBuffer?.glIndexType;\n const isInstanced: boolean = Number(options.instanceCount) > 0;\n\n // Avoid WebGL draw call when not rendering any data or values are incomplete\n // Note: async textures set as uniforms might still be loading.\n // Now that all uniforms have been updated, check if any texture\n // in the uniforms is not yet initialized, then we don't draw\n if (!this._areTexturesRenderable() || options.vertexCount === 0) {\n // (isInstanced && instanceCount === 0)\n return false;\n }\n\n this.device.gl.useProgram(this.handle);\n\n this.vertexArrayObject.bind(() => {\n const primitiveMode = getGLPrimitive(this.props.topology);\n const transformFeedback: any = null;\n if (transformFeedback) {\n transformFeedback.begin(primitiveMode);\n }\n\n // We have to apply bindings before every draw call since other draw calls will overwrite\n this._applyBindings();\n this._applyUniforms();\n this._applyConstantAttributes();\n\n const webglRenderPass = renderPass as WEBGLRenderPass;\n\n // TODO - double context push/pop\n withDeviceParameters(this.device, this.props.parameters, () => {\n withGLParameters(this.device, webglRenderPass.glParameters, () => {\n // TODO - Use polyfilled WebGL2RenderingContext instead of ANGLE extension\n if (isIndexed && isInstanced) {\n // ANGLE_instanced_arrays extension\n this.device.gl2?.drawElementsInstanced(\n drawMode,\n vertexCount || 0, // indexCount?\n indexType,\n firstVertex,\n instanceCount || 0\n );\n // } else if (isIndexed && this.device.isWebGL2 && !isNaN(start) && !isNaN(end)) {\n // this.device.gl2.drawRangeElements(drawMode, start, end, vertexCount, indexType, offset);\n } else if (isIndexed) {\n this.device.gl.drawElements(drawMode, vertexCount || 0, indexType, firstVertex); // indexCount?\n } else if (isInstanced) {\n this.device.gl2?.drawArraysInstanced(\n drawMode,\n firstVertex,\n vertexCount || 0,\n instanceCount || 0\n );\n } else {\n this.device.gl.drawArrays(drawMode, firstVertex, vertexCount || 0);\n }\n });\n\n if (transformFeedback) {\n transformFeedback.end();\n }\n });\n });\n\n return true;\n }\n\n // setAttributes(attributes: Record<string, Buffer>): void {}\n // setBindings(bindings: Record<string, Binding>): void {}\n\n protected _compileAndLink() {\n const {gl} = this.device;\n gl.attachShader(this.handle, this.vs.handle);\n gl.attachShader(this.handle, this.fs.handle);\n log.time(LOG_PROGRAM_PERF_PRIORITY, `linkProgram for ${this.id}`)();\n gl.linkProgram(this.handle);\n log.timeEnd(LOG_PROGRAM_PERF_PRIORITY, `linkProgram for ${this.id}`)();\n\n // Avoid checking program linking error in production\n // @ts-expect-error\n if (gl.debug || log.level > 0) {\n const linked = gl.getProgramParameter(this.handle, gl.LINK_STATUS);\n if (!linked) {\n throw new Error(`Error linking: ${gl.getProgramInfoLog(this.handle)}`);\n }\n\n gl.validateProgram(this.handle);\n const validated = gl.getProgramParameter(this.handle, gl.VALIDATE_STATUS);\n if (!validated) {\n throw new Error(`Error validating: ${gl.getProgramInfoLog(this.handle)}`);\n }\n }\n }\n\n // PRIVATE METHODS\n\n /**\n * Checks if all texture-values uniforms are renderable (i.e. loaded)\n * Update a texture if needed (e.g. from video)\n * Note: This is currently done before every draw call\n */\n _areTexturesRenderable() {\n let texturesRenderable = true;\n\n for (const [, texture] of Object.entries(this._textureUniforms)) {\n texture.update();\n texturesRenderable = texturesRenderable && texture.loaded;\n }\n\n for (const [, texture] of Object.entries(this.bindings)) {\n // texture.update();\n if (texture.loaded !== undefined) {\n texturesRenderable = texturesRenderable && texture.loaded;\n }\n }\n\n return texturesRenderable;\n }\n\n /**\n * Constant attributes need to be reset before every draw call\n * Any attribute that is disabled in the current vertex array object\n * is read from the context's global constant value for that attribute location.\n * @note Constant attributes are only supported in WebGL, not in WebGPU\n */\n _applyConstantAttributes(): void {\n const attributeInfos = getAttributeInfosFromLayouts(this.shaderLayout, this.bufferLayout);\n for (const [name, value] of Object.entries(this.constantAttributes)) {\n const attributeInfo = attributeInfos[name];\n if (!attributeInfo) {\n log.warn(\n `Ignoring constant value supplied for unknown attribute \"${name}\" in pipeline \"${this.id}\"`\n )();\n continue; // eslint-disable-line no-continue\n }\n this.vertexArrayObject.setConstant(attributeInfo.location, value);\n }\n }\n\n /** Apply any bindings (before each draw call) */\n _applyBindings() {\n this.device.gl.useProgram(this.handle);\n\n const {gl2} = this.device;\n if (!gl2) {\n throw new Error('bindings');\n }\n\n let textureUnit = 0;\n let uniformBufferIndex = 0;\n for (const binding of this.shaderLayout.bindings) {\n const value = this.bindings[binding.name];\n if (!value) {\n throw new Error(`No value for binding ${binding.name} in ${this.id}`);\n }\n switch (binding.type) {\n case 'uniform':\n // Set buffer\n const {name} = binding;\n const location = gl2.getUniformBlockIndex(this.handle, name);\n if (location === GL.INVALID_INDEX) {\n throw new Error(`Invalid uniform block name ${name}`);\n }\n gl2.uniformBlockBinding(this.handle, uniformBufferIndex, location);\n // console.debug(binding, location);\n if (value instanceof WEBGLBuffer) {\n gl2.bindBufferBase(GL.UNIFORM_BUFFER, uniformBufferIndex, value.handle);\n } else {\n gl2.bindBufferRange(\n GL.UNIFORM_BUFFER,\n uniformBufferIndex,\n value.buffer.handle,\n value.offset || 0,\n value.size || value.buffer.byteLength - value.offset\n );\n }\n uniformBufferIndex += 1;\n break;\n\n case 'texture':\n if (!(value instanceof WEBGLTexture)) {\n throw new Error('texture');\n }\n const texture: WEBGLTexture = value;\n gl2.activeTexture(GL.TEXTURE0 + textureUnit);\n gl2.bindTexture(texture.target, texture.handle);\n // gl2.bindSampler(textureUnit, sampler.handle);\n textureUnit += 1;\n break;\n\n case 'sampler':\n // ignore\n break;\n\n case 'storage':\n case 'read-only-storage':\n throw new Error(`binding type '${binding.type}' not supported in WebGL`);\n }\n }\n }\n\n /**\n * Due to program sharing, uniforms need to be reset before every draw call\n * (though caching will avoid redundant WebGL calls)\n */\n _applyUniforms() {\n for (const uniformLayout of this.shaderLayout.uniforms || []) {\n const {name, location, type, textureUnit} = uniformLayout;\n const value = this.uniforms[name] ?? textureUnit;\n if (value !== undefined) {\n setUniform(this.device.gl, location, type, value);\n }\n }\n }\n}\n\n/** Get the primitive type for draw */\nfunction getGLDrawMode(\n topology: PrimitiveTopology\n):\n | GL.POINTS\n | GL.LINES\n | GL.LINE_STRIP\n | GL.LINE_LOOP\n | GL.TRIANGLES\n | GL.TRIANGLE_STRIP\n | GL.TRIANGLE_FAN {\n // prettier-ignore\n switch (topology) {\n case 'point-list': return GL.POINTS;\n case 'line-list': return GL.LINES;\n case 'line-strip': return GL.LINE_STRIP;\n case 'line-loop-webgl': return GL.LINE_LOOP;\n case 'triangle-list': return GL.TRIANGLES;\n case 'triangle-strip': return GL.TRIANGLE_STRIP;\n case 'triangle-fan-webgl': return GL.TRIANGLE_FAN;\n default: throw new Error(topology);\n }\n}\n\n/** Get the primitive type for transform feedback */\nfunction getGLPrimitive(topology: PrimitiveTopology): GL.POINTS | GL.LINES | GL.TRIANGLES {\n // prettier-ignore\n switch (topology) {\n case 'point-list': return GL.POINTS;\n case 'line-list': return GL.LINES;\n case 'line-strip': return GL.LINES;\n case 'line-loop-webgl': return GL.LINES;\n case 'triangle-list': return GL.TRIANGLES;\n case 'triangle-strip': return GL.TRIANGLES;\n case 'triangle-fan-webgl': return GL.TRIANGLES;\n default: throw new Error(topology);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"webgl-render-pipeline.js","names":["RenderPipeline","cast","log","mergeShaderLayout","GL","getShaderLayout","withDeviceAndGLParameters","setUniform","WEBGLBuffer","WEBGLTexture","LOG_PROGRAM_PERF_PRIORITY","WEBGLRenderPipeline","constructor","device","props","handle","vs","fs","introspectedLayout","uniforms","bindings","varyings","_textureUniforms","_textureIndexCounter","_uniformCount","_uniformSetters","gl","createProgram","setSpectorMetadata","id","bufferMode","SEPARATE_ATTRIBS","length","_this$device$gl","assertWebGL2","gl2","transformFeedbackVaryings","_compileAndLink","shaderLayout","destroy","deleteProgram","destroyed","setBindings","name","value","Object","entries","binding","find","warn","type","buffer","Error","setUniforms","assign","draw","options","_vertexArray$indexBuf","renderPass","vertexArray","vertexCount","instanceCount","firstVertex","glDrawMode","getGLDrawMode","topology","isIndexed","Boolean","indexBuffer","glIndexType","isInstanced","Number","_areTexturesRenderable","useProgram","bindBeforeRender","primitiveMode","getGLPrimitive","transformFeedback","begin","_applyBindings","_applyUniforms","webglRenderPass","parameters","glParameters","_this$device$gl2","drawElementsInstanced","drawElements","_this$device$gl3","drawArraysInstanced","drawArrays","end","unbindAfterRender","attachShader","time","linkProgram","timeEnd","debug","level","linked","getProgramParameter","LINK_STATUS","getProgramInfoLog","validateProgram","validated","VALIDATE_STATUS","texturesRenderable","texture","update","loaded","undefined","textureUnit","uniformBufferIndex","location","getUniformBlockIndex","INVALID_INDEX","uniformBlockBinding","bindBufferBase","UNIFORM_BUFFER","bindBufferRange","offset","size","byteLength","activeTexture","TEXTURE0","bindTexture","target","uniformLayout","_this$uniforms$name","POINTS","LINES","LINE_STRIP","LINE_LOOP","TRIANGLES","TRIANGLE_STRIP","TRIANGLE_FAN"],"sources":["../../../src/adapter/resources/webgl-render-pipeline.ts"],"sourcesContent":["// luma.gl, MIT license\nimport type {UniformValue, RenderPipelineProps, Binding} from '@luma.gl/core';\nimport type {ShaderLayout, PrimitiveTopology} from '@luma.gl/core';\nimport type {RenderPass, VertexArray} from '@luma.gl/core';\nimport {RenderPipeline, cast, log} from '@luma.gl/core';\nimport {mergeShaderLayout} from '@luma.gl/core';\n// import {mergeShaderLayout, getAttributeInfosFromLayouts} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\n\nimport {getShaderLayout} from '../helpers/get-shader-layout';\nimport {withDeviceAndGLParameters} from '../converters/device-parameters';\nimport {setUniform} from '../helpers/set-uniform';\n// import {copyUniform, checkUniformValues} from '../../classes/uniforms';\n\nimport {WebGLDevice} from '../webgl-device';\nimport {WEBGLBuffer} from './webgl-buffer';\nimport {WEBGLShader} from './webgl-shader';\nimport {WEBGLTexture} from './webgl-texture';\n// import {WEBGLVertexArray} from './webgl-vertex-array';\nimport {WEBGLRenderPass} from './webgl-render-pass';\n\nconst LOG_PROGRAM_PERF_PRIORITY = 4;\n\n/** Creates a new render pipeline */\nexport class WEBGLRenderPipeline extends RenderPipeline {\n /** The WebGL device that created this render pipeline */\n device: WebGLDevice;\n /** Handle to underlying WebGL program */\n handle: WebGLProgram;\n /** vertex shader */\n vs: WEBGLShader;\n /** fragment shader */\n fs: WEBGLShader;\n /** The layout extracted from shader by WebGL introspection APIs */\n introspectedLayout: ShaderLayout;\n\n /** Uniforms set on this model */\n uniforms: Record<string, UniformValue> = {};\n /** Bindings set on this model */\n bindings: Record<string, Binding> = {};\n /** WebGL varyings */\n varyings: string[] | null = null;\n\n _textureUniforms: Record<string, any> = {};\n _textureIndexCounter: number = 0;\n _uniformCount: number = 0;\n _uniformSetters: Record<string, Function> = {}; // TODO are these used?\n\n constructor(device: WebGLDevice, props: RenderPipelineProps) {\n super(device, props);\n this.device = device;\n this.handle = this.props.handle || this.device.gl.createProgram();\n this.device.setSpectorMetadata(this.handle, {id: this.props.id});\n\n // Create shaders if needed\n this.vs = cast<WEBGLShader>(props.vs);\n this.fs = cast<WEBGLShader>(props.fs);\n // assert(this.vs.stage === 'vertex');\n // assert(this.fs.stage === 'fragment');\n\n // Setup varyings if supplied\n // @ts-expect-error WebGL only\n const {varyings, bufferMode = GL.SEPARATE_ATTRIBS} = props;\n if (varyings && varyings.length > 0) {\n this.device.assertWebGL2();\n this.varyings = varyings;\n this.device.gl2?.transformFeedbackVaryings(this.handle, varyings, bufferMode);\n }\n\n this._compileAndLink();\n\n this.introspectedLayout = getShaderLayout(this.device.gl, this.handle);\n // Merge provided layout with introspected layout\n this.shaderLayout = mergeShaderLayout(this.introspectedLayout, props.shaderLayout);\n // Merge layout with any buffer map overrides\n // this.bufferLayout = props.bufferLayout || [];\n // this.shaderLayout = mergeBufferMap(this.shaderLayout, this.bufferLayout);\n }\n\n override destroy(): void {\n if (this.handle) {\n this.device.gl.deleteProgram(this.handle);\n // this.handle = null;\n this.destroyed = true;\n }\n }\n\n // setIndexBuffer(indexBuffer: Buffer): void {\n // const webglBuffer = cast<WEBGLBuffer>(indexBuffer);\n // this.vertexArrayObject.setElementBuffer(webglBuffer);\n // this._indexBuffer = indexBuffer;\n // }\n\n // /** @todo needed for portable model */\n // setAttributes(attributes: Record<string, Buffer>): void {\n // for (const [name, buffer] of Object.entries(attributes)) {\n // const webglBuffer = cast<WEBGLBuffer>(buffer);\n // const attribute = getAttributeLayout(this.layout, name);\n // if (!attribute) {\n // log.warn(\n // `Ignoring buffer supplied for unknown attribute \"${name}\" in pipeline \"${this.id}\" (buffer \"${buffer.id}\")`\n // )();\n // continue;\n // }\n // const decoded = decodeVertexFormat(attribute.format);\n // const {type: typeString, components: size, byteLength: stride, normalized, integer} = decoded;\n // const divisor = attribute.stepMode === 'instance' ? 1 : 0;\n // const type = getWebGLDataType(typeString);\n // this.vertexArrayObject.setBuffer(attribute.location, webglBuffer, {\n // size,\n // type,\n // stride,\n // offset: 0,\n // normalized,\n // integer,\n // divisor\n // });\n // }\n // }\n\n /**\n * Bindings include: textures, samplers and uniform buffers\n * @todo needed for portable model\n */\n setBindings(bindings: Record<string, Binding>): void {\n // if (log.priority >= 2) {\n // checkUniformValues(uniforms, this.id, this._uniformSetters);\n // }\n\n for (const [name, value] of Object.entries(bindings)) {\n const binding = this.shaderLayout.bindings.find(binding => binding.name === name);\n if (!binding) {\n log.warn(`Unknown binding ${name} in render pipeline ${this.id}`)();\n continue; // eslint-disable-line no-continue\n }\n if (!value) {\n log.warn(`Unsetting binding ${name} in render pipeline ${this.id}`)();\n }\n switch (binding.type) {\n case 'uniform':\n // @ts-expect-error\n if (!(value instanceof WEBGLBuffer) && !(value.buffer instanceof WEBGLBuffer)) {\n throw new Error('buffer value');\n }\n break;\n case 'texture':\n if (!(value instanceof WEBGLTexture)) {\n throw new Error('texture value');\n }\n break;\n case 'sampler':\n log.warn(`Ignoring sampler ${name}`)();\n break;\n default:\n throw new Error(binding.type);\n }\n\n this.bindings[name] = value;\n }\n }\n\n setUniforms(uniforms: Record<string, UniformValue>) {\n // TODO - check against layout\n Object.assign(this.uniforms, uniforms);\n }\n\n /** @todo needed for portable model\n * @note The WebGL API is offers many ways to draw things\n * This function unifies those ways into a single call using common parameters with sane defaults\n */\n draw(options: {\n renderPass: RenderPass;\n /** vertex attributes */\n vertexArray: VertexArray;\n vertexCount?: number;\n indexCount?: number;\n instanceCount?: number;\n firstVertex?: number;\n firstIndex?: number;\n firstInstance?: number;\n baseVertex?: number;\n }): boolean {\n const {\n renderPass,\n vertexArray,\n vertexCount,\n // indexCount,\n instanceCount,\n firstVertex = 0\n // firstIndex,\n // firstInstance,\n // baseVertex\n } = options;\n\n const glDrawMode = getGLDrawMode(this.props.topology);\n const isIndexed: boolean = Boolean(vertexArray.indexBuffer);\n const glIndexType = (vertexArray.indexBuffer as WEBGLBuffer)?.glIndexType;\n const isInstanced: boolean = Number(instanceCount) > 0;\n\n // Avoid WebGL draw call when not rendering any data or values are incomplete\n // Note: async textures set as uniforms might still be loading.\n // Now that all uniforms have been updated, check if any texture\n // in the uniforms is not yet initialized, then we don't draw\n if (!this._areTexturesRenderable() || vertexCount === 0) {\n // (isInstanced && instanceCount === 0)\n return false;\n }\n\n this.device.gl.useProgram(this.handle);\n\n // Note: Rebinds constant attributes before each draw call\n vertexArray.bindBeforeRender(renderPass);\n\n const primitiveMode = getGLPrimitive(this.props.topology);\n const transformFeedback: any = null;\n if (transformFeedback) {\n transformFeedback.begin(primitiveMode);\n }\n\n // We have to apply bindings before every draw call since other draw calls will overwrite\n this._applyBindings();\n this._applyUniforms();\n\n const webglRenderPass = renderPass as WEBGLRenderPass;\n // // TODO - Use polyfilled WebGL2RenderingContext instead of ANGLE extension\n // if (isIndexed && isInstanced) {\n // // ANGLE_instanced_arrays extension\n // this.device.gl2?.drawElementsInstanced(\n // drawMode,\n // vertexCount || 0, // indexCount?\n // indexType,\n // firstVertex,\n // instanceCount || 0\n // );\n // // } else if (isIndexed && this.device.isWebGL2 && !isNaN(start) && !isNaN(end)) {\n // // this.device.gl2.drawRangeElements(drawMode, start, end, vertexCount, indexType, offset);\n // } else if (isIndexed) {\n // this.device.gl.drawElements(drawMode, vertexCount || 0, indexType, firstVertex); // indexCount?\n // } else if (isInstanced) {\n // this.device.gl2?.drawArraysInstanced(\n // drawMode,\n // firstVertex,\n // vertexCount || 0,\n // instanceCount || 0\n // );\n // } else {\n // this.device.gl.drawArrays(drawMode, firstVertex, vertexCount || 0);\n // }\n // });\n\n withDeviceAndGLParameters(this.device, this.props.parameters, webglRenderPass.glParameters, () => {\n if (isIndexed && isInstanced) {\n // ANGLE_instanced_arrays extension\n this.device.gl2?.drawElementsInstanced(\n glDrawMode,\n vertexCount || 0, // indexCount?\n glIndexType,\n firstVertex,\n instanceCount || 0\n );\n // } else if (isIndexed && this.device.isWebGL2 && !isNaN(start) && !isNaN(end)) {\n // this.device.gl2.drawRangeElements(glDrawMode, start, end, vertexCount, glIndexType, offset);\n } else if (isIndexed) {\n this.device.gl.drawElements(glDrawMode, vertexCount || 0, glIndexType, firstVertex); // indexCount?\n } else if (isInstanced) {\n this.device.gl2?.drawArraysInstanced(\n glDrawMode,\n firstVertex,\n vertexCount || 0,\n instanceCount || 0\n );\n } else {\n this.device.gl.drawArrays(glDrawMode, firstVertex, vertexCount || 0);\n }\n\n if (transformFeedback) {\n transformFeedback.end();\n }\n });\n\n vertexArray.unbindAfterRender(renderPass);\n\n return true;\n }\n\n // setAttributes(attributes: Record<string, Buffer>): void {}\n // setBindings(bindings: Record<string, Binding>): void {}\n\n protected _compileAndLink() {\n const {gl} = this.device;\n gl.attachShader(this.handle, this.vs.handle);\n gl.attachShader(this.handle, this.fs.handle);\n log.time(LOG_PROGRAM_PERF_PRIORITY, `linkProgram for ${this.id}`)();\n gl.linkProgram(this.handle);\n log.timeEnd(LOG_PROGRAM_PERF_PRIORITY, `linkProgram for ${this.id}`)();\n\n // Avoid checking program linking error in production\n // @ts-expect-error\n if (!gl.debug && log.level === 0) {\n // return;\n }\n\n const linked = gl.getProgramParameter(this.handle, gl.LINK_STATUS);\n if (!linked) {\n throw new Error(`Error linking: ${gl.getProgramInfoLog(this.handle)}`);\n }\n\n gl.validateProgram(this.handle);\n const validated = gl.getProgramParameter(this.handle, gl.VALIDATE_STATUS);\n if (!validated) {\n throw new Error(`Error validating: ${gl.getProgramInfoLog(this.handle)}`);\n }\n }\n\n // PRIVATE METHODS\n\n /**\n * Checks if all texture-values uniforms are renderable (i.e. loaded)\n * Update a texture if needed (e.g. from video)\n * Note: This is currently done before every draw call\n */\n _areTexturesRenderable() {\n let texturesRenderable = true;\n\n for (const [, texture] of Object.entries(this._textureUniforms)) {\n texture.update();\n texturesRenderable = texturesRenderable && texture.loaded;\n }\n\n for (const [, texture] of Object.entries(this.bindings)) {\n // texture.update();\n // @ts-expect-error\n if (texture.loaded !== undefined) {\n // @ts-expect-error\n texturesRenderable = texturesRenderable && texture.loaded;\n }\n }\n\n return texturesRenderable;\n }\n\n /**\n * Constant attributes need to be reset before every draw call\n * Any attribute that is disabled in the current vertex array object\n * is read from the context's global constant value for that attribute location.\n * @note Constant attributes are only supported in WebGL, not in WebGPU\n *\n _applyConstantAttributes(vertexArray: WEBGLVertexArray): void {\n const attributeInfos = getAttributeInfosFromLayouts(this.shaderLayout, this.bufferLayout);\n for (const [name, value] of Object.entries(this.)) {\n const attributeInfo = attributeInfos[name];\n if (!attributeInfo) {\n log.warn(\n `Ignoring constant value supplied for unknown attribute \"${name}\" in pipeline \"${this.id}\"`\n )();\n continue; // eslint-disable-line no-continue\n }\n vertexArray.setConstant(attributeInfo.location, value);\n vertexArray.enable(attributeInfo.location, false);\n }\n }\n */\n\n /** Apply any bindings (before each draw call) */\n _applyBindings() {\n this.device.gl.useProgram(this.handle);\n\n const {gl2} = this.device;\n if (!gl2) {\n throw new Error('bindings');\n }\n\n let textureUnit = 0;\n let uniformBufferIndex = 0;\n for (const binding of this.shaderLayout.bindings) {\n const value = this.bindings[binding.name];\n if (!value) {\n throw new Error(`No value for binding ${binding.name} in ${this.id}`);\n }\n switch (binding.type) {\n case 'uniform':\n // Set buffer\n const {name} = binding;\n const location = gl2.getUniformBlockIndex(this.handle, name);\n if (location === GL.INVALID_INDEX) {\n throw new Error(`Invalid uniform block name ${name}`);\n }\n gl2.uniformBlockBinding(this.handle, uniformBufferIndex, location);\n // console.debug(binding, location);\n if (value instanceof WEBGLBuffer) {\n gl2.bindBufferBase(GL.UNIFORM_BUFFER, uniformBufferIndex, value.handle);\n } else {\n gl2.bindBufferRange(\n GL.UNIFORM_BUFFER,\n uniformBufferIndex,\n // @ts-expect-error\n value.buffer.handle,\n // @ts-expect-error\n value.offset || 0,\n // @ts-expect-error\n value.size || value.buffer.byteLength - value.offset\n );\n }\n uniformBufferIndex += 1;\n break;\n\n case 'texture':\n if (!(value instanceof WEBGLTexture)) {\n throw new Error('texture');\n }\n const texture: WEBGLTexture = value;\n gl2.activeTexture(GL.TEXTURE0 + textureUnit);\n gl2.bindTexture(texture.target, texture.handle);\n // gl2.bindSampler(textureUnit, sampler.handle);\n textureUnit += 1;\n break;\n\n case 'sampler':\n // ignore\n break;\n\n case 'storage':\n case 'read-only-storage':\n throw new Error(`binding type '${binding.type}' not supported in WebGL`);\n }\n }\n }\n\n /**\n * Due to program sharing, uniforms need to be reset before every draw call\n * (though caching will avoid redundant WebGL calls)\n */\n _applyUniforms() {\n for (const uniformLayout of this.shaderLayout.uniforms || []) {\n const {name, location, type, textureUnit} = uniformLayout;\n const value = this.uniforms[name] ?? textureUnit;\n if (value !== undefined) {\n setUniform(this.device.gl, location, type, value);\n }\n }\n }\n}\n\n/** Get the primitive type for draw */\nfunction getGLDrawMode(\n topology: PrimitiveTopology\n):\n | GL.POINTS\n | GL.LINES\n | GL.LINE_STRIP\n | GL.LINE_LOOP\n | GL.TRIANGLES\n | GL.TRIANGLE_STRIP\n | GL.TRIANGLE_FAN {\n // prettier-ignore\n switch (topology) {\n case 'point-list': return GL.POINTS;\n case 'line-list': return GL.LINES;\n case 'line-strip': return GL.LINE_STRIP;\n case 'line-loop-webgl': return GL.LINE_LOOP;\n case 'triangle-list': return GL.TRIANGLES;\n case 'triangle-strip': return GL.TRIANGLE_STRIP;\n case 'triangle-fan-webgl': return GL.TRIANGLE_FAN;\n default: throw new Error(topology);\n }\n}\n\n/** Get the primitive type for transform feedback */\nfunction getGLPrimitive(topology: PrimitiveTopology): GL.POINTS | GL.LINES | GL.TRIANGLES {\n // prettier-ignore\n switch (topology) {\n case 'point-list': return GL.POINTS;\n case 'line-list': return GL.LINES;\n case 'line-strip': return GL.LINES;\n case 'line-loop-webgl': return GL.LINES;\n case 'triangle-list': return GL.TRIANGLES;\n case 'triangle-strip': return GL.TRIANGLES;\n case 'triangle-fan-webgl': return GL.TRIANGLES;\n default: throw new Error(topology);\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"webgl-sampler.js","names":["Sampler","GL","convertSamplerParametersToWebGL","WEBGLSampler","constructor","device","props","handle","parameters","isWebGL2","gl2","createSampler","_setSamplerParameters","destroy","deleteSampler","undefined","toString","id","JSON","stringify","pname","value","Object","entries","param","Number","TEXTURE_MIN_LOD","TEXTURE_MAX_LOD","samplerParameterf","samplerParameteri"],"sources":["../../../src/adapter/resources/webgl-sampler.ts"],"sourcesContent":["// luma.gl, MIT license\n\nimport {Sampler, SamplerProps} from '@luma.gl/core';\nimport {GL, GLSamplerParameters} from '@luma.gl/constants';\nimport {convertSamplerParametersToWebGL} from '../converters/sampler-parameters';\nimport type {WebGLDevice} from '../webgl-device';\n\n/**\n * Sampler object -\n * Under WebGL2 we create an actual WebGL sampler\n * Under WebGL1, we just store the sampler parameters\n * so that they can be set directly on the texture\n * https://github.com/WebGLSamples/WebGL2Samples/blob/master/samples/sampler_object.html\n */\nexport class WEBGLSampler extends Sampler {\n readonly device: WebGLDevice;\n readonly handle: WebGLSampler;\n readonly parameters: GLSamplerParameters;\n\n constructor(device: WebGLDevice, props: SamplerProps) {\n super(device, props);\n this.device = device;\n this.parameters = convertSamplerParametersToWebGL(props);\n if (this.device.isWebGL2) {\n this.handle = this.handle || this.device.gl2.createSampler();\n this._setSamplerParameters(this.parameters);\n }\n }\n\n override destroy(): void {\n if (this.handle) {\n this.device.gl2.deleteSampler(this.handle);\n // @ts-expect-error\n this.handle = undefined;\n }\n }\n\n override toString(): string {\n return `Sampler(${this.id},${JSON.stringify(this.props)})`;\n }\n\n /** Set sampler parameters on the sampler */\n private _setSamplerParameters(parameters: GLSamplerParameters): void {\n for (const [pname, value] of Object.entries(parameters)) {\n // Apparently there are integer/float conversion issues requires two parameter setting functions in JavaScript.\n // For now, pick the float version for parameters specified as GLfloat.\n const param = Number(pname);\n switch (param) {\n case GL.TEXTURE_MIN_LOD:\n case GL.TEXTURE_MAX_LOD:\n this.device.gl2.samplerParameterf(this.handle, param, value);\n break;\n default:\n this.device.gl2.samplerParameteri(this.handle, param, value);\n break;\n }\n }\n }\n}\n"],"mappings":"AAEA,SAAQA,OAAO,QAAqB,eAAe;AACnD,SAAQC,EAAE,QAA4B,oBAAoB;AAAC,SACnDC,+BAA+B;AAUvC,OAAO,MAAMC,YAAY,SAASH,OAAO,CAAC;EAKxCI,WAAWA,CAACC,MAAmB,EAAEC,KAAmB,EAAE;IACpD,KAAK,CAACD,MAAM,EAAEC,KAAK,CAAC;IAAC,KALdD,MAAM;IAAA,KACNE,MAAM;IAAA,KACNC,UAAU;IAIjB,IAAI,CAACH,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACG,UAAU,GAAGN,+BAA+B,CAACI,KAAK,CAAC;IACxD,IAAI,IAAI,CAACD,MAAM,CAACI,QAAQ,EAAE;MACxB,IAAI,CAACF,MAAM,GAAG,IAAI,CAACA,MAAM,IAAI,IAAI,CAACF,MAAM,CAACK,GAAG,CAACC,aAAa,CAAC,CAAC;MAC5D,IAAI,CAACC,qBAAqB,CAAC,IAAI,CAACJ,UAAU,CAAC;IAC7C;EACF;EAESK,OAAOA,CAAA,EAAS;IACvB,IAAI,IAAI,CAACN,MAAM,EAAE;MACf,IAAI,CAACF,MAAM,CAACK,GAAG,CAACI,aAAa,CAAC,IAAI,CAACP,MAAM,CAAC;MAE1C,IAAI,CAACA,MAAM,GAAGQ,SAAS;IACzB;EACF;EAESC,QAAQA,CAAA,EAAW;IAC1B,OAAQ,WAAU,IAAI,CAACC,EAAG,IAAGC,IAAI,CAACC,SAAS,CAAC,IAAI,CAACb,KAAK,CAAE,GAAE;EAC5D;EAGQM,qBAAqBA,CAACJ,UAA+B,EAAQ;IACnE,KAAK,MAAM,CAACY,KAAK,EAAEC,KAAK,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACf,UAAU,CAAC,EAAE;MAGvD,MAAMgB,KAAK,GAAGC,MAAM,CAACL,KAAK,CAAC;MAC3B,QAAQI,KAAK;QACX,KAAKvB,EAAE,CAACyB,eAAe;QACvB,KAAKzB,EAAE,CAAC0B,eAAe;UACrB,IAAI,CAACtB,MAAM,CAACK,GAAG,CAACkB,iBAAiB,CAAC,IAAI,CAACrB,MAAM,EAAEiB,KAAK,EAAEH,KAAK,CAAC;UAC5D;QACF;UACE,IAAI,CAAChB,MAAM,CAACK,GAAG,CAACmB,iBAAiB,CAAC,IAAI,CAACtB,MAAM,EAAEiB,KAAK,EAAEH,KAAK,CAAC;UAC5D;MACJ;IACF;EACF;AACF"}
1
+ {"version":3,"file":"webgl-sampler.js","names":["Sampler","GL","convertSamplerParametersToWebGL","WEBGLSampler","constructor","device","props","handle","parameters","isWebGL2","gl2","createSampler","_setSamplerParameters","destroy","deleteSampler","undefined","toString","id","JSON","stringify","pname","value","Object","entries","param","Number","TEXTURE_MIN_LOD","TEXTURE_MAX_LOD","samplerParameterf","samplerParameteri"],"sources":["../../../src/adapter/resources/webgl-sampler.ts"],"sourcesContent":["// luma.gl, MIT license\n\nimport {Sampler, SamplerProps} from '@luma.gl/core';\nimport {GL, GLSamplerParameters} from '@luma.gl/constants';\nimport {convertSamplerParametersToWebGL} from '../converters/sampler-parameters';\nimport type {WebGLDevice} from '../webgl-device';\n\n/**\n * Sampler object -\n * Under WebGL2 we create an actual WebGL sampler\n * Under WebGL1, we just store the sampler parameters\n * so that they can be set directly on the texture\n * https://github.com/WebGLSamples/WebGL2Samples/blob/master/samples/sampler_object.html\n */\nexport class WEBGLSampler extends Sampler {\n readonly device: WebGLDevice;\n readonly handle: WebGLSampler;\n readonly parameters: GLSamplerParameters;\n\n constructor(device: WebGLDevice, props: SamplerProps) {\n super(device, props);\n this.device = device;\n this.parameters = convertSamplerParametersToWebGL(props);\n if (this.device.isWebGL2) {\n this.handle = this.handle || this.device.gl2.createSampler();\n this._setSamplerParameters(this.parameters);\n }\n }\n\n override destroy(): void {\n if (this.handle) {\n this.device.gl2.deleteSampler(this.handle);\n // @ts-expect-error read-only/undefined\n this.handle = undefined;\n }\n }\n\n override toString(): string {\n return `Sampler(${this.id},${JSON.stringify(this.props)})`;\n }\n\n /** Set sampler parameters on the sampler */\n private _setSamplerParameters(parameters: GLSamplerParameters): void {\n for (const [pname, value] of Object.entries(parameters)) {\n // Apparently there are integer/float conversion issues requires two parameter setting functions in JavaScript.\n // For now, pick the float version for parameters specified as GLfloat.\n const param = Number(pname);\n switch (param) {\n case GL.TEXTURE_MIN_LOD:\n case GL.TEXTURE_MAX_LOD:\n this.device.gl2.samplerParameterf(this.handle, param, value);\n break;\n default:\n this.device.gl2.samplerParameteri(this.handle, param, value);\n break;\n }\n }\n }\n}\n"],"mappings":"AAEA,SAAQA,OAAO,QAAqB,eAAe;AACnD,SAAQC,EAAE,QAA4B,oBAAoB;AAAC,SACnDC,+BAA+B;AAUvC,OAAO,MAAMC,YAAY,SAASH,OAAO,CAAC;EAKxCI,WAAWA,CAACC,MAAmB,EAAEC,KAAmB,EAAE;IACpD,KAAK,CAACD,MAAM,EAAEC,KAAK,CAAC;IAAC,KALdD,MAAM;IAAA,KACNE,MAAM;IAAA,KACNC,UAAU;IAIjB,IAAI,CAACH,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACG,UAAU,GAAGN,+BAA+B,CAACI,KAAK,CAAC;IACxD,IAAI,IAAI,CAACD,MAAM,CAACI,QAAQ,EAAE;MACxB,IAAI,CAACF,MAAM,GAAG,IAAI,CAACA,MAAM,IAAI,IAAI,CAACF,MAAM,CAACK,GAAG,CAACC,aAAa,CAAC,CAAC;MAC5D,IAAI,CAACC,qBAAqB,CAAC,IAAI,CAACJ,UAAU,CAAC;IAC7C;EACF;EAESK,OAAOA,CAAA,EAAS;IACvB,IAAI,IAAI,CAACN,MAAM,EAAE;MACf,IAAI,CAACF,MAAM,CAACK,GAAG,CAACI,aAAa,CAAC,IAAI,CAACP,MAAM,CAAC;MAE1C,IAAI,CAACA,MAAM,GAAGQ,SAAS;IACzB;EACF;EAESC,QAAQA,CAAA,EAAW;IAC1B,OAAQ,WAAU,IAAI,CAACC,EAAG,IAAGC,IAAI,CAACC,SAAS,CAAC,IAAI,CAACb,KAAK,CAAE,GAAE;EAC5D;EAGQM,qBAAqBA,CAACJ,UAA+B,EAAQ;IACnE,KAAK,MAAM,CAACY,KAAK,EAAEC,KAAK,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACf,UAAU,CAAC,EAAE;MAGvD,MAAMgB,KAAK,GAAGC,MAAM,CAACL,KAAK,CAAC;MAC3B,QAAQI,KAAK;QACX,KAAKvB,EAAE,CAACyB,eAAe;QACvB,KAAKzB,EAAE,CAAC0B,eAAe;UACrB,IAAI,CAACtB,MAAM,CAACK,GAAG,CAACkB,iBAAiB,CAAC,IAAI,CAACrB,MAAM,EAAEiB,KAAK,EAAEH,KAAK,CAAC;UAC5D;QACF;UACE,IAAI,CAAChB,MAAM,CAACK,GAAG,CAACmB,iBAAiB,CAAC,IAAI,CAACtB,MAAM,EAAEiB,KAAK,EAAEH,KAAK,CAAC;UAC5D;MACJ;IACF;EACF;AACF"}
@@ -47,7 +47,9 @@ export class WEBGLShader extends Shader {
47
47
  const shaderLog = gl.getShaderInfoLog(this.handle);
48
48
  const parsedLog = shaderLog ? parseShaderCompilerLog(shaderLog) : [];
49
49
  const messages = parsedLog.filter(message => message.type === 'error');
50
- const formattedLog = formatCompilerLog(messages, source);
50
+ const formattedLog = formatCompilerLog(messages, source, {
51
+ showSourceCode: true
52
+ });
51
53
  const shaderName = getShaderInfo(source).name;
52
54
  const shaderDescription = `${this.stage} shader ${shaderName}`;
53
55
  log.error(`GLSL compilation errors in ${shaderDescription}\n${formattedLog}`)();
@@ -1 +1 @@
1
- {"version":3,"file":"webgl-shader.js","names":["log","uid","Shader","formatCompilerLog","GL","getShaderInfo","parseShaderCompilerLog","WEBGLShader","constructor","device","props","id","getShaderIdFromProps","handle","stage","gl","createShader","VERTEX_SHADER","FRAGMENT_SHADER","Error","_compile","source","destroy","removeStats","deleteShader","destroyed","compilationInfo","getShaderInfoLog","addGLSLVersion","startsWith","shaderSource","compileShader","compileStatus","getShaderParameter","COMPILE_STATUS","shaderLog","parsedLog","messages","filter","message","type","formattedLog","shaderName","name","shaderDescription","error"],"sources":["../../../src/adapter/resources/webgl-shader.ts"],"sourcesContent":["// luma.gl, MIT license\nimport {log, uid, Shader, ShaderProps, CompilerMessage, formatCompilerLog} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\nimport {getShaderInfo} from '../helpers/get-shader-info';\nimport {parseShaderCompilerLog} from '../helpers/parse-shader-compiler-log';\nimport {WebGLDevice} from '../webgl-device';\n\n/**\n * An immutable compiled shader program that execute portions of the GPU Pipeline\n */\nexport class WEBGLShader extends Shader {\n readonly device: WebGLDevice;\n readonly handle: WebGLShader;\n\n constructor(device: WebGLDevice, props: ShaderProps) {\n super(device, {id: getShaderIdFromProps(props), ...props});\n this.device = device;\n switch (this.props.stage) {\n case 'vertex':\n this.handle = this.props.handle || this.device.gl.createShader(GL.VERTEX_SHADER);\n break;\n case 'fragment':\n this.handle = this.props.handle || this.device.gl.createShader(GL.FRAGMENT_SHADER);\n break;\n default:\n throw new Error(this.props.stage);\n }\n this._compile(this.source);\n }\n\n override destroy(): void {\n if (this.handle) {\n this.removeStats();\n this.device.gl.deleteShader(this.handle);\n // this.handle = null;\n this.destroyed = true;\n }\n }\n\n async compilationInfo(): Promise<readonly CompilerMessage[]> {\n const log = this.device.gl.getShaderInfoLog(this.handle);\n return log ? parseShaderCompilerLog(log) : [];\n }\n\n // PRIVATE METHODS\n\n _compile(source: string): void {\n const addGLSLVersion = (source: string) => source.startsWith('#version ') ? source : `#version 100\\n${source}`;\n source = addGLSLVersion(source);\n\n const {gl} = this.device;\n gl.shaderSource(this.handle, source);\n gl.compileShader(this.handle);\n\n // TODO - For performance reasons, avoid checking shader compilation errors on production?\n // TODO - Load log even when no error reported, to catch warnings?\n // https://gamedev.stackexchange.com/questions/30429/how-to-detect-glsl-warnings\n const compileStatus = gl.getShaderParameter(this.handle, GL.COMPILE_STATUS);\n if (!compileStatus) {\n const shaderLog = gl.getShaderInfoLog(this.handle);\n const parsedLog = shaderLog ? parseShaderCompilerLog(shaderLog) : [];\n const messages = parsedLog.filter(message => message.type === 'error');\n const formattedLog = formatCompilerLog(messages, source);\n const shaderName: string = getShaderInfo(source).name;\n const shaderDescription = `${this.stage} shader ${shaderName}`;\n log.error(`GLSL compilation errors in ${shaderDescription}\\n${formattedLog}`)();\n throw new Error(`GLSL compilation errors in ${shaderName}`);\n }\n }\n}\n\n// HELPERS\n\n/** Deduce an id, from shader source, or supplied id, or shader type */\nfunction getShaderIdFromProps(props: ShaderProps): string {\n return getShaderInfo(props.source).name ||\n props.id ||\n uid(`unnamed ${props.stage}-shader`);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"webgl-shader.js","names":["log","uid","Shader","formatCompilerLog","GL","getShaderInfo","parseShaderCompilerLog","WEBGLShader","constructor","device","props","id","getShaderIdFromProps","handle","stage","gl","createShader","VERTEX_SHADER","FRAGMENT_SHADER","Error","_compile","source","destroy","removeStats","deleteShader","destroyed","compilationInfo","getShaderInfoLog","addGLSLVersion","startsWith","shaderSource","compileShader","compileStatus","getShaderParameter","COMPILE_STATUS","shaderLog","parsedLog","messages","filter","message","type","formattedLog","showSourceCode","shaderName","name","shaderDescription","error"],"sources":["../../../src/adapter/resources/webgl-shader.ts"],"sourcesContent":["// luma.gl, MIT license\nimport {log, uid, Shader, ShaderProps, CompilerMessage, formatCompilerLog} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\nimport {getShaderInfo} from '../helpers/get-shader-info';\nimport {parseShaderCompilerLog} from '../helpers/parse-shader-compiler-log';\nimport {WebGLDevice} from '../webgl-device';\n\n/**\n * An immutable compiled shader program that execute portions of the GPU Pipeline\n */\nexport class WEBGLShader extends Shader {\n readonly device: WebGLDevice;\n readonly handle: WebGLShader;\n\n constructor(device: WebGLDevice, props: ShaderProps) {\n super(device, {id: getShaderIdFromProps(props), ...props});\n this.device = device;\n switch (this.props.stage) {\n case 'vertex':\n this.handle = this.props.handle || this.device.gl.createShader(GL.VERTEX_SHADER);\n break;\n case 'fragment':\n this.handle = this.props.handle || this.device.gl.createShader(GL.FRAGMENT_SHADER);\n break;\n default:\n throw new Error(this.props.stage);\n }\n this._compile(this.source);\n }\n\n override destroy(): void {\n if (this.handle) {\n this.removeStats();\n this.device.gl.deleteShader(this.handle);\n // this.handle = null;\n this.destroyed = true;\n }\n }\n\n async compilationInfo(): Promise<readonly CompilerMessage[]> {\n const log = this.device.gl.getShaderInfoLog(this.handle);\n return log ? parseShaderCompilerLog(log) : [];\n }\n\n // PRIVATE METHODS\n\n _compile(source: string): void {\n const addGLSLVersion = (source: string) => source.startsWith('#version ') ? source : `#version 100\\n${source}`;\n source = addGLSLVersion(source);\n\n const {gl} = this.device;\n gl.shaderSource(this.handle, source);\n gl.compileShader(this.handle);\n\n // TODO - For performance reasons, avoid checking shader compilation errors on production?\n // TODO - Load log even when no error reported, to catch warnings?\n // https://gamedev.stackexchange.com/questions/30429/how-to-detect-glsl-warnings\n const compileStatus = gl.getShaderParameter(this.handle, GL.COMPILE_STATUS);\n if (!compileStatus) {\n const shaderLog = gl.getShaderInfoLog(this.handle);\n const parsedLog = shaderLog ? parseShaderCompilerLog(shaderLog) : [];\n const messages = parsedLog.filter(message => message.type === 'error');\n const formattedLog = formatCompilerLog(messages, source, {showSourceCode: true});\n const shaderName: string = getShaderInfo(source).name;\n const shaderDescription = `${this.stage} shader ${shaderName}`;\n log.error(`GLSL compilation errors in ${shaderDescription}\\n${formattedLog}`)();\n throw new Error(`GLSL compilation errors in ${shaderName}`);\n }\n }\n}\n\n// HELPERS\n\n/** Deduce an id, from shader source, or supplied id, or shader type */\nfunction getShaderIdFromProps(props: ShaderProps): string {\n return getShaderInfo(props.source).name ||\n props.id ||\n uid(`unnamed ${props.stage}-shader`);\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { isObjectEmpty } from '@luma.gl/core';
2
2
  import { Texture, cast, log, assert, isPowerOfTwo, loadImage } from '@luma.gl/core';
3
3
  import { GL } from '@luma.gl/constants';
4
- import { withParameters } from "../../context/state-tracker/with-parameters.js";
4
+ import { withGLParameters } from "../../context/state-tracker/with-parameters.js";
5
5
  import { convertTextureFormatToGL, getWebGLTextureParameters, getTextureFormatBytesPerPixel } from "../converters/texture-formats.js";
6
6
  import { convertSamplerParametersToWebGL, updateSamplerParametersForNPOT } from "../converters/sampler-parameters.js";
7
7
  import { WEBGLBuffer } from "./webgl-buffer.js";
@@ -239,7 +239,7 @@ export class WEBGLTexture extends Texture {
239
239
  }
240
240
  this.mipmaps = true;
241
241
  this.gl.bindTexture(this.target, this.handle);
242
- withParameters(this.gl, params, () => {
242
+ withGLParameters(this.gl, params, () => {
243
243
  this.gl.generateMipmap(this.target);
244
244
  });
245
245
  this.gl.bindTexture(this.target, null);
@@ -297,7 +297,7 @@ export class WEBGLTexture extends Texture {
297
297
  compressed
298
298
  }));
299
299
  let gl2;
300
- withParameters(this.gl, parameters, () => {
300
+ withGLParameters(this.gl, parameters, () => {
301
301
  switch (dataType) {
302
302
  case 'null':
303
303
  gl.texImage2D(target, level, glFormat, width, height, 0, dataFormat, type, data);
@@ -382,7 +382,7 @@ export class WEBGLTexture extends Texture {
382
382
  data = data.handle;
383
383
  }
384
384
  this.gl.bindTexture(this.target, this.handle);
385
- withParameters(this.gl, parameters, () => {
385
+ withGLParameters(this.gl, parameters, () => {
386
386
  if (compressed) {
387
387
  this.gl.compressedTexSubImage2D(target, level, x, y, width, height, glFormat, data);
388
388
  } else if (data === null) {
@@ -624,7 +624,7 @@ export class WEBGLTexture extends Texture {
624
624
  this.trackDeallocatedMemory('Texture');
625
625
  this.gl.bindTexture(this.target, this.handle);
626
626
  const webglTextureFormat = getWebGLTextureParameters(format, this.device.isWebGL2);
627
- withParameters(this.gl, parameters, () => {
627
+ withGLParameters(this.gl, parameters, () => {
628
628
  if (ArrayBuffer.isView(data)) {
629
629
  this.gl.texImage3D(this.target, level, webglTextureFormat.format, width, height, depth, 0, webglTextureFormat.dataFormat, webglTextureFormat.type, data);
630
630
  }