@luma.gl/webgl 9.0.0-alpha.46 → 9.0.0-alpha.48
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.
- package/LICENSE +34 -0
- package/dist/adapter/converters/device-parameters.d.ts.map +1 -1
- package/dist/adapter/converters/device-parameters.js +73 -40
- package/dist/adapter/converters/device-parameters.js.map +1 -1
- package/dist/adapter/converters/sampler-parameters.js +60 -61
- package/dist/adapter/converters/sampler-parameters.js.map +1 -1
- package/dist/adapter/converters/shader-formats.js +12 -13
- package/dist/adapter/converters/shader-formats.js.map +1 -1
- package/dist/adapter/converters/texture-formats.js +179 -180
- package/dist/adapter/converters/texture-formats.js.map +1 -1
- package/dist/adapter/converters/vertex-formats.js +20 -21
- package/dist/adapter/converters/vertex-formats.js.map +1 -1
- package/dist/adapter/device-helpers/device-features.js +2 -2
- package/dist/adapter/device-helpers/device-features.js.map +1 -1
- package/dist/adapter/device-helpers/device-limits.js +53 -54
- package/dist/adapter/device-helpers/device-limits.js.map +1 -1
- package/dist/adapter/device-helpers/get-device-info.d.ts.map +1 -1
- package/dist/adapter/device-helpers/get-device-info.js +23 -12
- package/dist/adapter/device-helpers/get-device-info.js.map +1 -1
- package/dist/adapter/helpers/decode-webgl-types.js +31 -32
- package/dist/adapter/helpers/decode-webgl-types.js.map +1 -1
- package/dist/adapter/helpers/get-shader-layout.js +29 -30
- package/dist/adapter/helpers/get-shader-layout.js.map +1 -1
- package/dist/adapter/helpers/parse-shader-compiler-log.d.ts.map +1 -1
- package/dist/adapter/helpers/parse-shader-compiler-log.js +16 -4
- package/dist/adapter/helpers/parse-shader-compiler-log.js.map +1 -1
- package/dist/adapter/helpers/set-uniform.js +40 -41
- package/dist/adapter/helpers/set-uniform.js.map +1 -1
- package/dist/adapter/helpers/webgl-topology-utils.js +38 -39
- package/dist/adapter/helpers/webgl-topology-utils.js.map +1 -1
- package/dist/adapter/objects/webgl-renderbuffer.js +5 -6
- package/dist/adapter/objects/webgl-renderbuffer.js.map +1 -1
- package/dist/adapter/resources/webgl-buffer.js +14 -15
- package/dist/adapter/resources/webgl-buffer.js.map +1 -1
- package/dist/adapter/resources/webgl-command-buffer.js +25 -26
- package/dist/adapter/resources/webgl-command-buffer.js.map +1 -1
- package/dist/adapter/resources/webgl-framebuffer.js +22 -23
- package/dist/adapter/resources/webgl-framebuffer.js.map +1 -1
- package/dist/adapter/resources/webgl-render-pass.js +2 -3
- package/dist/adapter/resources/webgl-render-pass.js.map +1 -1
- package/dist/adapter/resources/webgl-render-pipeline.js +7 -8
- package/dist/adapter/resources/webgl-render-pipeline.js.map +1 -1
- package/dist/adapter/resources/webgl-sampler.js +2 -3
- package/dist/adapter/resources/webgl-sampler.js.map +1 -1
- package/dist/adapter/resources/webgl-shader.js +3 -4
- package/dist/adapter/resources/webgl-shader.js.map +1 -1
- package/dist/adapter/resources/webgl-texture.js +27 -28
- package/dist/adapter/resources/webgl-texture.js.map +1 -1
- package/dist/adapter/resources/webgl-transform-feedback.d.ts +5 -11
- package/dist/adapter/resources/webgl-transform-feedback.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-transform-feedback.js +16 -13
- package/dist/adapter/resources/webgl-transform-feedback.js.map +1 -1
- package/dist/adapter/resources/webgl-vertex-array.d.ts +2 -2
- package/dist/adapter/resources/webgl-vertex-array.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-vertex-array.js +5 -6
- package/dist/adapter/resources/webgl-vertex-array.js.map +1 -1
- package/dist/adapter/webgl-device.js.map +1 -1
- package/dist/classic/accessor.js +4 -5
- package/dist/classic/accessor.js.map +1 -1
- package/dist/classic/copy-and-blit.js +16 -17
- package/dist/classic/copy-and-blit.js.map +1 -1
- package/dist/classic/format-utils.js +14 -15
- package/dist/classic/format-utils.js.map +1 -1
- package/dist/classic/typed-array-utils.d.ts +2 -0
- package/dist/classic/typed-array-utils.d.ts.map +1 -1
- package/dist/classic/typed-array-utils.js +18 -19
- package/dist/classic/typed-array-utils.js.map +1 -1
- package/dist/context/debug/webgl-developer-tools.js +0 -1
- package/dist/context/debug/webgl-developer-tools.js.map +1 -1
- package/dist/context/parameters/webgl-parameter-tables.js +256 -257
- package/dist/context/parameters/webgl-parameter-tables.js.map +1 -1
- package/dist/context/polyfill/get-parameter-polyfill.js +34 -35
- package/dist/context/polyfill/get-parameter-polyfill.js.map +1 -1
- package/dist/context/polyfill/polyfill-table.js +9 -10
- package/dist/context/polyfill/polyfill-table.js.map +1 -1
- package/dist/context/polyfill/polyfill-vertex-array-object.js +17 -17
- package/dist/context/polyfill/polyfill-vertex-array-object.js.map +1 -1
- package/dist/dist.dev.js +987 -2700
- package/dist/index.cjs +390 -267
- package/dist.min.js +39 -28
- package/package.json +5 -5
- package/src/adapter/converters/device-parameters.ts +40 -25
- package/src/adapter/device-helpers/get-device-info.ts +36 -8
- package/src/adapter/helpers/parse-shader-compiler-log.ts +21 -7
- package/src/adapter/resources/webgl-transform-feedback.ts +13 -16
- package/src/adapter/resources/webgl-vertex-array.ts +4 -3
- package/src/adapter/webgl-device.ts +3 -2
- package/src/classic/typed-array-utils.ts +2 -0
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { RenderPipeline, cast, splitUniformsAndBindings, log } from '@luma.gl/core';
|
|
2
2
|
import { mergeShaderLayout } from '@luma.gl/core';
|
|
3
|
-
import { GL } from '@luma.gl/constants';
|
|
4
3
|
import { getShaderLayout } from "../helpers/get-shader-layout.js";
|
|
5
4
|
import { withDeviceAndGLParameters } from "../converters/device-parameters.js";
|
|
6
5
|
import { setUniform } from "../helpers/set-uniform.js";
|
|
@@ -31,7 +30,7 @@ export class WEBGLRenderPipeline extends RenderPipeline {
|
|
|
31
30
|
this.fs = cast(props.fs);
|
|
32
31
|
const {
|
|
33
32
|
varyings,
|
|
34
|
-
bufferMode =
|
|
33
|
+
bufferMode = 35981
|
|
35
34
|
} = props;
|
|
36
35
|
if (varyings && varyings.length > 0) {
|
|
37
36
|
var _this$device$gl;
|
|
@@ -143,12 +142,12 @@ export class WEBGLRenderPipeline extends RenderPipeline {
|
|
|
143
142
|
gl.linkProgram(this.handle);
|
|
144
143
|
log.timeEnd(LOG_PROGRAM_PERF_PRIORITY, `linkProgram for ${this.id}`)();
|
|
145
144
|
if (!gl.debug && log.level === 0) {}
|
|
146
|
-
const linked = gl.getProgramParameter(this.handle,
|
|
145
|
+
const linked = gl.getProgramParameter(this.handle, 35714);
|
|
147
146
|
if (!linked) {
|
|
148
147
|
throw new Error(`Error linking: ${gl.getProgramInfoLog(this.handle)}`);
|
|
149
148
|
}
|
|
150
149
|
gl.validateProgram(this.handle);
|
|
151
|
-
const validated = gl.getProgramParameter(this.handle,
|
|
150
|
+
const validated = gl.getProgramParameter(this.handle, 35715);
|
|
152
151
|
if (!validated) {
|
|
153
152
|
throw new Error(`Error validating: ${gl.getProgramInfoLog(this.handle)}`);
|
|
154
153
|
}
|
|
@@ -184,14 +183,14 @@ export class WEBGLRenderPipeline extends RenderPipeline {
|
|
|
184
183
|
name
|
|
185
184
|
} = binding;
|
|
186
185
|
const location = gl2.getUniformBlockIndex(this.handle, name);
|
|
187
|
-
if (location ===
|
|
186
|
+
if (location === 4294967295) {
|
|
188
187
|
throw new Error(`Invalid uniform block name ${name}`);
|
|
189
188
|
}
|
|
190
189
|
gl2.uniformBlockBinding(this.handle, uniformBufferIndex, location);
|
|
191
190
|
if (value instanceof WEBGLBuffer) {
|
|
192
|
-
gl2.bindBufferBase(
|
|
191
|
+
gl2.bindBufferBase(35345, uniformBufferIndex, value.handle);
|
|
193
192
|
} else {
|
|
194
|
-
gl2.bindBufferRange(
|
|
193
|
+
gl2.bindBufferRange(35345, uniformBufferIndex, value.buffer.handle, value.offset || 0, value.size || value.buffer.byteLength - value.offset);
|
|
195
194
|
}
|
|
196
195
|
uniformBufferIndex += 1;
|
|
197
196
|
break;
|
|
@@ -208,7 +207,7 @@ export class WEBGLRenderPipeline extends RenderPipeline {
|
|
|
208
207
|
} else {
|
|
209
208
|
throw new Error('No texture');
|
|
210
209
|
}
|
|
211
|
-
gl2.activeTexture(
|
|
210
|
+
gl2.activeTexture(33984 + textureUnit);
|
|
212
211
|
gl2.bindTexture(texture.target, texture.handle);
|
|
213
212
|
textureUnit += 1;
|
|
214
213
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgl-render-pipeline.js","names":["RenderPipeline","cast","splitUniformsAndBindings","log","mergeShaderLayout","GL","getShaderLayout","withDeviceAndGLParameters","setUniform","WEBGLBuffer","WEBGLFramebuffer","WEBGLTexture","getGLDrawMode","LOG_PROGRAM_PERF_PRIORITY","WEBGLRenderPipeline","constructor","device","props","handle","vs","fs","introspectedLayout","uniforms","bindings","varyings","_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","validBindings","map","join","warn","type","buffer","Error","setUniforms","keys","forEach","assign","draw","options","_vertexArray$indexBuf","renderPass","vertexArray","vertexCount","instanceCount","firstVertex","transformFeedback","glDrawMode","topology","isIndexed","Boolean","indexBuffer","glIndexType","isInstanced","Number","_areTexturesRenderable","useProgram","bindBeforeRender","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","textureUnit","uniformBufferIndex","replace","location","getUniformBlockIndex","INVALID_INDEX","uniformBlockBinding","bindBufferBase","UNIFORM_BUFFER","bindBufferRange","offset","size","byteLength","colorAttachments","activeTexture","TEXTURE0","bindTexture","target","uniformLayout","_this$uniforms$name","undefined"],"sources":["../../../src/adapter/resources/webgl-render-pipeline.ts"],"sourcesContent":["// luma.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport type {UniformValue, RenderPipelineProps, Binding} from '@luma.gl/core';\nimport type {ShaderLayout} from '@luma.gl/core';\nimport type {RenderPass, VertexArray} from '@luma.gl/core';\nimport {RenderPipeline, cast, splitUniformsAndBindings, 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 {WEBGLFramebuffer} from './webgl-framebuffer';\nimport {WEBGLTexture} from './webgl-texture';\n// import {WEBGLVertexArray} from './webgl-vertex-array';\nimport {WEBGLRenderPass} from './webgl-render-pass';\nimport {WEBGLTransformFeedback} from './webgl-transform-feedback';\nimport {getGLDrawMode} from '../helpers/webgl-topology-utils';\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 _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 // Accept both `xyz` and `xyzUniforms` as valid names for `xyzUniforms` uniform block\n // This convention allows shaders to name uniform blocks as `uniform appUniforms {} app;`\n // and reference them as `app` from both GLSL and JS.\n // TODO - this is rather hacky - we could also remap the name directly in the shader layout.\n const binding =\n this.shaderLayout.bindings.find(binding => binding.name === name) ||\n this.shaderLayout.bindings.find(binding => binding.name === `${name}Uniforms`);\n\n if (!binding) {\n const validBindings = this.shaderLayout.bindings\n .map(binding => `\"${binding.name}\"`)\n .join(', ');\n log.warn(\n `Unknown binding \"${name}\" in render pipeline \"${this.id}\", expected one of ${validBindings}`\n )();\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 || value instanceof WEBGLFramebuffer)) {\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 const {bindings} = splitUniformsAndBindings(uniforms);\n Object.keys(bindings).forEach(name => {\n log.warn(\n `Unsupported value \"${bindings[name]}\" used in setUniforms() for key ${name}. Use setBindings() instead?`\n )();\n });\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 transformFeedback?: WEBGLTransformFeedback;\n }): boolean {\n const {\n renderPass,\n vertexArray,\n vertexCount,\n // indexCount,\n instanceCount,\n firstVertex = 0,\n // firstIndex,\n // firstInstance,\n // baseVertex,\n transformFeedback\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 if (transformFeedback) {\n transformFeedback.begin(this.props.topology);\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(\n this.device,\n this.props.parameters,\n webglRenderPass.glParameters,\n () => {\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\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.bindings)) {\n if (texture instanceof WEBGLTexture) {\n texture.update();\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 // Accept both `xyz` and `xyzUniforms` as valid names for `xyzUniforms` uniform block\n const value =\n this.bindings[binding.name] || this.bindings[binding.name.replace(/Uniforms$/, '')];\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 || value instanceof WEBGLFramebuffer)) {\n throw new Error('texture');\n }\n let texture: WEBGLTexture;\n if (value instanceof WEBGLTexture) {\n texture = value;\n } else if (\n value instanceof WEBGLFramebuffer &&\n value.colorAttachments[0] instanceof WEBGLTexture\n ) {\n log.warn(\n 'Passing framebuffer in texture binding may be deprecated. Use fbo.colorAttachments[0] instead'\n )();\n texture = value.colorAttachments[0];\n } else {\n throw new Error('No texture');\n }\n\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"webgl-render-pipeline.js","names":["RenderPipeline","cast","splitUniformsAndBindings","log","mergeShaderLayout","getShaderLayout","withDeviceAndGLParameters","setUniform","WEBGLBuffer","WEBGLFramebuffer","WEBGLTexture","getGLDrawMode","LOG_PROGRAM_PERF_PRIORITY","WEBGLRenderPipeline","constructor","device","props","handle","vs","fs","introspectedLayout","uniforms","bindings","varyings","_uniformCount","_uniformSetters","gl","createProgram","setSpectorMetadata","id","bufferMode","length","_this$device$gl","assertWebGL2","gl2","transformFeedbackVaryings","_compileAndLink","shaderLayout","destroy","deleteProgram","destroyed","setBindings","name","value","Object","entries","binding","find","validBindings","map","join","warn","type","buffer","Error","setUniforms","keys","forEach","assign","draw","options","_vertexArray$indexBuf","renderPass","vertexArray","vertexCount","instanceCount","firstVertex","transformFeedback","glDrawMode","topology","isIndexed","Boolean","indexBuffer","glIndexType","isInstanced","Number","_areTexturesRenderable","useProgram","bindBeforeRender","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","getProgramInfoLog","validateProgram","validated","texturesRenderable","texture","update","loaded","textureUnit","uniformBufferIndex","replace","location","getUniformBlockIndex","uniformBlockBinding","bindBufferBase","bindBufferRange","offset","size","byteLength","colorAttachments","activeTexture","bindTexture","target","uniformLayout","_this$uniforms$name","undefined"],"sources":["../../../src/adapter/resources/webgl-render-pipeline.ts"],"sourcesContent":["// luma.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport type {UniformValue, RenderPipelineProps, Binding} from '@luma.gl/core';\nimport type {ShaderLayout} from '@luma.gl/core';\nimport type {RenderPass, VertexArray} from '@luma.gl/core';\nimport {RenderPipeline, cast, splitUniformsAndBindings, 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 {WEBGLFramebuffer} from './webgl-framebuffer';\nimport {WEBGLTexture} from './webgl-texture';\n// import {WEBGLVertexArray} from './webgl-vertex-array';\nimport {WEBGLRenderPass} from './webgl-render-pass';\nimport {WEBGLTransformFeedback} from './webgl-transform-feedback';\nimport {getGLDrawMode} from '../helpers/webgl-topology-utils';\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 _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 // Accept both `xyz` and `xyzUniforms` as valid names for `xyzUniforms` uniform block\n // This convention allows shaders to name uniform blocks as `uniform appUniforms {} app;`\n // and reference them as `app` from both GLSL and JS.\n // TODO - this is rather hacky - we could also remap the name directly in the shader layout.\n const binding =\n this.shaderLayout.bindings.find(binding => binding.name === name) ||\n this.shaderLayout.bindings.find(binding => binding.name === `${name}Uniforms`);\n\n if (!binding) {\n const validBindings = this.shaderLayout.bindings\n .map(binding => `\"${binding.name}\"`)\n .join(', ');\n log.warn(\n `Unknown binding \"${name}\" in render pipeline \"${this.id}\", expected one of ${validBindings}`\n )();\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 || value instanceof WEBGLFramebuffer)) {\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 const {bindings} = splitUniformsAndBindings(uniforms);\n Object.keys(bindings).forEach(name => {\n log.warn(\n `Unsupported value \"${bindings[name]}\" used in setUniforms() for key ${name}. Use setBindings() instead?`\n )();\n });\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 transformFeedback?: WEBGLTransformFeedback;\n }): boolean {\n const {\n renderPass,\n vertexArray,\n vertexCount,\n // indexCount,\n instanceCount,\n firstVertex = 0,\n // firstIndex,\n // firstInstance,\n // baseVertex,\n transformFeedback\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 if (transformFeedback) {\n transformFeedback.begin(this.props.topology);\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(\n this.device,\n this.props.parameters,\n webglRenderPass.glParameters,\n () => {\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\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.bindings)) {\n if (texture instanceof WEBGLTexture) {\n texture.update();\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 // Accept both `xyz` and `xyzUniforms` as valid names for `xyzUniforms` uniform block\n const value =\n this.bindings[binding.name] || this.bindings[binding.name.replace(/Uniforms$/, '')];\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 || value instanceof WEBGLFramebuffer)) {\n throw new Error('texture');\n }\n let texture: WEBGLTexture;\n if (value instanceof WEBGLTexture) {\n texture = value;\n } else if (\n value instanceof WEBGLFramebuffer &&\n value.colorAttachments[0] instanceof WEBGLTexture\n ) {\n log.warn(\n 'Passing framebuffer in texture binding may be deprecated. Use fbo.colorAttachments[0] instead'\n )();\n texture = value.colorAttachments[0];\n } else {\n throw new Error('No texture');\n }\n\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"],"mappings":"AAMA,SAAQA,cAAc,EAAEC,IAAI,EAAEC,wBAAwB,EAAEC,GAAG,QAAO,eAAe;AACjF,SAAQC,iBAAiB,QAAO,eAAe;AAAC,SAIxCC,eAAe;AAAA,SACfC,yBAAyB;AAAA,SACzBC,UAAU;AAAA,SAIVC,WAAW;AAAA,SAEXC,gBAAgB;AAAA,SAChBC,YAAY;AAAA,SAIZC,aAAa;AAErB,MAAMC,yBAAyB,GAAG,CAAC;AAGnC,OAAO,MAAMC,mBAAmB,SAASb,cAAc,CAAC;EAsBtDc,WAAWA,CAACC,MAAmB,EAAEC,KAA0B,EAAE;IAC3D,KAAK,CAACD,MAAM,EAAEC,KAAK,CAAC;IAAC,KArBvBD,MAAM;IAAA,KAENE,MAAM;IAAA,KAENC,EAAE;IAAA,KAEFC,EAAE;IAAA,KAEFC,kBAAkB;IAAA,KAGlBC,QAAQ,GAAiC,CAAC,CAAC;IAAA,KAE3CC,QAAQ,GAA4B,CAAC,CAAC;IAAA,KAEtCC,QAAQ,GAAoB,IAAI;IAAA,KAEhCC,aAAa,GAAW,CAAC;IAAA,KACzBC,eAAe,GAA6B,CAAC,CAAC;IAI5C,IAAI,CAACV,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACE,MAAM,GAAG,IAAI,CAACD,KAAK,CAACC,MAAM,IAAI,IAAI,CAACF,MAAM,CAACW,EAAE,CAACC,aAAa,CAAC,CAAC;IACjE,IAAI,CAACZ,MAAM,CAACa,kBAAkB,CAAC,IAAI,CAACX,MAAM,EAAE;MAACY,EAAE,EAAE,IAAI,CAACb,KAAK,CAACa;IAAE,CAAC,CAAC;IAGhE,IAAI,CAACX,EAAE,GAAGjB,IAAI,CAAce,KAAK,CAACE,EAAE,CAAC;IACrC,IAAI,CAACC,EAAE,GAAGlB,IAAI,CAAce,KAAK,CAACG,EAAE,CAAC;IAMrC,MAAM;MAACI,QAAQ;MAAEO,UAAU;IAAsB,CAAC,GAAGd,KAAK;IAC1D,IAAIO,QAAQ,IAAIA,QAAQ,CAACQ,MAAM,GAAG,CAAC,EAAE;MAAA,IAAAC,eAAA;MACnC,IAAI,CAACjB,MAAM,CAACkB,YAAY,CAAC,CAAC;MAC1B,IAAI,CAACV,QAAQ,GAAGA,QAAQ;MACxB,CAAAS,eAAA,OAAI,CAACjB,MAAM,CAACmB,GAAG,cAAAF,eAAA,uBAAfA,eAAA,CAAiBG,yBAAyB,CAAC,IAAI,CAAClB,MAAM,EAAEM,QAAQ,EAAEO,UAAU,CAAC;IAC/E;IAEA,IAAI,CAACM,eAAe,CAAC,CAAC;IAEtB,IAAI,CAAChB,kBAAkB,GAAGf,eAAe,CAAC,IAAI,CAACU,MAAM,CAACW,EAAE,EAAE,IAAI,CAACT,MAAM,CAAC;IAEtE,IAAI,CAACoB,YAAY,GAAGjC,iBAAiB,CAAC,IAAI,CAACgB,kBAAkB,EAAEJ,KAAK,CAACqB,YAAY,CAAC;EAIpF;EAESC,OAAOA,CAAA,EAAS;IACvB,IAAI,IAAI,CAACrB,MAAM,EAAE;MACf,IAAI,CAACF,MAAM,CAACW,EAAE,CAACa,aAAa,CAAC,IAAI,CAACtB,MAAM,CAAC;MAEzC,IAAI,CAACuB,SAAS,GAAG,IAAI;IACvB;EACF;EAuCAC,WAAWA,CAACnB,QAAiC,EAAQ;IAKnD,KAAK,MAAM,CAACoB,IAAI,EAAEC,KAAK,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACvB,QAAQ,CAAC,EAAE;MAKpD,MAAMwB,OAAO,GACX,IAAI,CAACT,YAAY,CAACf,QAAQ,CAACyB,IAAI,CAACD,OAAO,IAAIA,OAAO,CAACJ,IAAI,KAAKA,IAAI,CAAC,IACjE,IAAI,CAACL,YAAY,CAACf,QAAQ,CAACyB,IAAI,CAACD,OAAO,IAAIA,OAAO,CAACJ,IAAI,KAAM,GAAEA,IAAK,UAAS,CAAC;MAEhF,IAAI,CAACI,OAAO,EAAE;QACZ,MAAME,aAAa,GAAG,IAAI,CAACX,YAAY,CAACf,QAAQ,CAC7C2B,GAAG,CAACH,OAAO,IAAK,IAAGA,OAAO,CAACJ,IAAK,GAAE,CAAC,CACnCQ,IAAI,CAAC,IAAI,CAAC;QACb/C,GAAG,CAACgD,IAAI,CACL,oBAAmBT,IAAK,yBAAwB,IAAI,CAACb,EAAG,sBAAqBmB,aAAc,EAC9F,CAAC,CAAC,CAAC;QACH;MACF;MACA,IAAI,CAACL,KAAK,EAAE;QACVxC,GAAG,CAACgD,IAAI,CAAE,sBAAqBT,IAAK,yBAAwB,IAAI,CAACb,EAAG,GAAE,CAAC,CAAC,CAAC;MAC3E;MACA,QAAQiB,OAAO,CAACM,IAAI;QAClB,KAAK,SAAS;UAEZ,IAAI,EAAET,KAAK,YAAYnC,WAAW,CAAC,IAAI,EAAEmC,KAAK,CAACU,MAAM,YAAY7C,WAAW,CAAC,EAAE;YAC7E,MAAM,IAAI8C,KAAK,CAAC,cAAc,CAAC;UACjC;UACA;QACF,KAAK,SAAS;UACZ,IAAI,EAAEX,KAAK,YAAYjC,YAAY,IAAIiC,KAAK,YAAYlC,gBAAgB,CAAC,EAAE;YACzE,MAAM,IAAI6C,KAAK,CAAC,eAAe,CAAC;UAClC;UACA;QACF,KAAK,SAAS;UACZnD,GAAG,CAACgD,IAAI,CAAE,oBAAmBT,IAAK,EAAC,CAAC,CAAC,CAAC;UACtC;QACF;UACE,MAAM,IAAIY,KAAK,CAACR,OAAO,CAACM,IAAI,CAAC;MACjC;MAEA,IAAI,CAAC9B,QAAQ,CAACoB,IAAI,CAAC,GAAGC,KAAK;IAC7B;EACF;EAEAY,WAAWA,CAAClC,QAAsC,EAAE;IAClD,MAAM;MAACC;IAAQ,CAAC,GAAGpB,wBAAwB,CAACmB,QAAQ,CAAC;IACrDuB,MAAM,CAACY,IAAI,CAAClC,QAAQ,CAAC,CAACmC,OAAO,CAACf,IAAI,IAAI;MACpCvC,GAAG,CAACgD,IAAI,CACL,sBAAqB7B,QAAQ,CAACoB,IAAI,CAAE,mCAAkCA,IAAK,8BAC9E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEFE,MAAM,CAACc,MAAM,CAAC,IAAI,CAACrC,QAAQ,EAAEA,QAAQ,CAAC;EACxC;EAMAsC,IAAIA,CAACC,OAYJ,EAAW;IAAA,IAAAC,qBAAA;IACV,MAAM;MACJC,UAAU;MACVC,WAAW;MACXC,WAAW;MAEXC,aAAa;MACbC,WAAW,GAAG,CAAC;MAIfC;IACF,CAAC,GAAGP,OAAO;IAEX,MAAMQ,UAAU,GAAGzD,aAAa,CAAC,IAAI,CAACK,KAAK,CAACqD,QAAQ,CAAC;IACrD,MAAMC,SAAkB,GAAGC,OAAO,CAACR,WAAW,CAACS,WAAW,CAAC;IAC3D,MAAMC,WAAW,IAAAZ,qBAAA,GAAIE,WAAW,CAACS,WAAW,cAAAX,qBAAA,uBAAxBA,qBAAA,CAA0CY,WAAW;IACzE,MAAMC,WAAoB,GAAGC,MAAM,CAACV,aAAa,CAAC,GAAG,CAAC;IAMtD,IAAI,CAAC,IAAI,CAACW,sBAAsB,CAAC,CAAC,IAAIZ,WAAW,KAAK,CAAC,EAAE;MAEvD,OAAO,KAAK;IACd;IAEA,IAAI,CAACjD,MAAM,CAACW,EAAE,CAACmD,UAAU,CAAC,IAAI,CAAC5D,MAAM,CAAC;IAGtC8C,WAAW,CAACe,gBAAgB,CAAChB,UAAU,CAAC;IAExC,IAAIK,iBAAiB,EAAE;MACrBA,iBAAiB,CAACY,KAAK,CAAC,IAAI,CAAC/D,KAAK,CAACqD,QAAQ,CAAC;IAC9C;IAGA,IAAI,CAACW,cAAc,CAAC,CAAC;IACrB,IAAI,CAACC,cAAc,CAAC,CAAC;IAErB,MAAMC,eAAe,GAAGpB,UAA6B;IA2BrDxD,yBAAyB,CACvB,IAAI,CAACS,MAAM,EACX,IAAI,CAACC,KAAK,CAACmE,UAAU,EACrBD,eAAe,CAACE,YAAY,EAC5B,MAAM;MACJ,IAAId,SAAS,IAAII,WAAW,EAAE;QAAA,IAAAW,gBAAA;QAE5B,CAAAA,gBAAA,OAAI,CAACtE,MAAM,CAACmB,GAAG,cAAAmD,gBAAA,uBAAfA,gBAAA,CAAiBC,qBAAqB,CACpClB,UAAU,EACVJ,WAAW,IAAI,CAAC,EAChBS,WAAW,EACXP,WAAW,EACXD,aAAa,IAAI,CACnB,CAAC;MAGH,CAAC,MAAM,IAAIK,SAAS,EAAE;QACpB,IAAI,CAACvD,MAAM,CAACW,EAAE,CAAC6D,YAAY,CAACnB,UAAU,EAAEJ,WAAW,IAAI,CAAC,EAAES,WAAW,EAAEP,WAAW,CAAC;MACrF,CAAC,MAAM,IAAIQ,WAAW,EAAE;QAAA,IAAAc,gBAAA;QACtB,CAAAA,gBAAA,OAAI,CAACzE,MAAM,CAACmB,GAAG,cAAAsD,gBAAA,uBAAfA,gBAAA,CAAiBC,mBAAmB,CAClCrB,UAAU,EACVF,WAAW,EACXF,WAAW,IAAI,CAAC,EAChBC,aAAa,IAAI,CACnB,CAAC;MACH,CAAC,MAAM;QACL,IAAI,CAAClD,MAAM,CAACW,EAAE,CAACgE,UAAU,CAACtB,UAAU,EAAEF,WAAW,EAAEF,WAAW,IAAI,CAAC,CAAC;MACtE;MAEA,IAAIG,iBAAiB,EAAE;QACrBA,iBAAiB,CAACwB,GAAG,CAAC,CAAC;MACzB;IACF,CACF,CAAC;IAED5B,WAAW,CAAC6B,iBAAiB,CAAC9B,UAAU,CAAC;IAEzC,OAAO,IAAI;EACb;EAKU1B,eAAeA,CAAA,EAAG;IAC1B,MAAM;MAACV;IAAE,CAAC,GAAG,IAAI,CAACX,MAAM;IACxBW,EAAE,CAACmE,YAAY,CAAC,IAAI,CAAC5E,MAAM,EAAE,IAAI,CAACC,EAAE,CAACD,MAAM,CAAC;IAC5CS,EAAE,CAACmE,YAAY,CAAC,IAAI,CAAC5E,MAAM,EAAE,IAAI,CAACE,EAAE,CAACF,MAAM,CAAC;IAC5Cd,GAAG,CAAC2F,IAAI,CAAClF,yBAAyB,EAAG,mBAAkB,IAAI,CAACiB,EAAG,EAAC,CAAC,CAAC,CAAC;IACnEH,EAAE,CAACqE,WAAW,CAAC,IAAI,CAAC9E,MAAM,CAAC;IAC3Bd,GAAG,CAAC6F,OAAO,CAACpF,yBAAyB,EAAG,mBAAkB,IAAI,CAACiB,EAAG,EAAC,CAAC,CAAC,CAAC;IAItE,IAAI,CAACH,EAAE,CAACuE,KAAK,IAAI9F,GAAG,CAAC+F,KAAK,KAAK,CAAC,EAAE,CAElC;IAEA,MAAMC,MAAM,GAAGzE,EAAE,CAAC0E,mBAAmB,CAAC,IAAI,CAACnF,MAAM,OAAgB,CAAC;IAClE,IAAI,CAACkF,MAAM,EAAE;MACX,MAAM,IAAI7C,KAAK,CAAE,kBAAiB5B,EAAE,CAAC2E,iBAAiB,CAAC,IAAI,CAACpF,MAAM,CAAE,EAAC,CAAC;IACxE;IAEAS,EAAE,CAAC4E,eAAe,CAAC,IAAI,CAACrF,MAAM,CAAC;IAC/B,MAAMsF,SAAS,GAAG7E,EAAE,CAAC0E,mBAAmB,CAAC,IAAI,CAACnF,MAAM,OAAoB,CAAC;IACzE,IAAI,CAACsF,SAAS,EAAE;MACd,MAAM,IAAIjD,KAAK,CAAE,qBAAoB5B,EAAE,CAAC2E,iBAAiB,CAAC,IAAI,CAACpF,MAAM,CAAE,EAAC,CAAC;IAC3E;EACF;EASA2D,sBAAsBA,CAAA,EAAG;IACvB,IAAI4B,kBAAkB,GAAG,IAAI;IAE7B,KAAK,MAAM,GAAGC,OAAO,CAAC,IAAI7D,MAAM,CAACC,OAAO,CAAC,IAAI,CAACvB,QAAQ,CAAC,EAAE;MACvD,IAAImF,OAAO,YAAY/F,YAAY,EAAE;QACnC+F,OAAO,CAACC,MAAM,CAAC,CAAC;QAChBF,kBAAkB,GAAGA,kBAAkB,IAAIC,OAAO,CAACE,MAAM;MAC3D;IACF;IAEA,OAAOH,kBAAkB;EAC3B;EAyBAxB,cAAcA,CAAA,EAAG;IACf,IAAI,CAACjE,MAAM,CAACW,EAAE,CAACmD,UAAU,CAAC,IAAI,CAAC5D,MAAM,CAAC;IAEtC,MAAM;MAACiB;IAAG,CAAC,GAAG,IAAI,CAACnB,MAAM;IACzB,IAAI,CAACmB,GAAG,EAAE;MACR,MAAM,IAAIoB,KAAK,CAAC,UAAU,CAAC;IAC7B;IAEA,IAAIsD,WAAW,GAAG,CAAC;IACnB,IAAIC,kBAAkB,GAAG,CAAC;IAC1B,KAAK,MAAM/D,OAAO,IAAI,IAAI,CAACT,YAAY,CAACf,QAAQ,EAAE;MAEhD,MAAMqB,KAAK,GACT,IAAI,CAACrB,QAAQ,CAACwB,OAAO,CAACJ,IAAI,CAAC,IAAI,IAAI,CAACpB,QAAQ,CAACwB,OAAO,CAACJ,IAAI,CAACoE,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;MACrF,IAAI,CAACnE,KAAK,EAAE;QACV,MAAM,IAAIW,KAAK,CAAE,wBAAuBR,OAAO,CAACJ,IAAK,OAAM,IAAI,CAACb,EAAG,EAAC,CAAC;MACvE;MACA,QAAQiB,OAAO,CAACM,IAAI;QAClB,KAAK,SAAS;UAEZ,MAAM;YAACV;UAAI,CAAC,GAAGI,OAAO;UACtB,MAAMiE,QAAQ,GAAG7E,GAAG,CAAC8E,oBAAoB,CAAC,IAAI,CAAC/F,MAAM,EAAEyB,IAAI,CAAC;UAC5D,IAAIqE,QAAQ,eAAqB,EAAE;YACjC,MAAM,IAAIzD,KAAK,CAAE,8BAA6BZ,IAAK,EAAC,CAAC;UACvD;UACAR,GAAG,CAAC+E,mBAAmB,CAAC,IAAI,CAAChG,MAAM,EAAE4F,kBAAkB,EAAEE,QAAQ,CAAC;UAElE,IAAIpE,KAAK,YAAYnC,WAAW,EAAE;YAChC0B,GAAG,CAACgF,cAAc,QAAoBL,kBAAkB,EAAElE,KAAK,CAAC1B,MAAM,CAAC;UACzE,CAAC,MAAM;YACLiB,GAAG,CAACiF,eAAe,QAEjBN,kBAAkB,EAElBlE,KAAK,CAACU,MAAM,CAACpC,MAAM,EAEnB0B,KAAK,CAACyE,MAAM,IAAI,CAAC,EAEjBzE,KAAK,CAAC0E,IAAI,IAAI1E,KAAK,CAACU,MAAM,CAACiE,UAAU,GAAG3E,KAAK,CAACyE,MAChD,CAAC;UACH;UACAP,kBAAkB,IAAI,CAAC;UACvB;QAEF,KAAK,SAAS;UACZ,IAAI,EAAElE,KAAK,YAAYjC,YAAY,IAAIiC,KAAK,YAAYlC,gBAAgB,CAAC,EAAE;YACzE,MAAM,IAAI6C,KAAK,CAAC,SAAS,CAAC;UAC5B;UACA,IAAImD,OAAqB;UACzB,IAAI9D,KAAK,YAAYjC,YAAY,EAAE;YACjC+F,OAAO,GAAG9D,KAAK;UACjB,CAAC,MAAM,IACLA,KAAK,YAAYlC,gBAAgB,IACjCkC,KAAK,CAAC4E,gBAAgB,CAAC,CAAC,CAAC,YAAY7G,YAAY,EACjD;YACAP,GAAG,CAACgD,IAAI,CACN,+FACF,CAAC,CAAC,CAAC;YACHsD,OAAO,GAAG9D,KAAK,CAAC4E,gBAAgB,CAAC,CAAC,CAAC;UACrC,CAAC,MAAM;YACL,MAAM,IAAIjE,KAAK,CAAC,YAAY,CAAC;UAC/B;UAEApB,GAAG,CAACsF,aAAa,CAAC,QAAcZ,WAAW,CAAC;UAC5C1E,GAAG,CAACuF,WAAW,CAAChB,OAAO,CAACiB,MAAM,EAAEjB,OAAO,CAACxF,MAAM,CAAC;UAE/C2F,WAAW,IAAI,CAAC;UAChB;QAEF,KAAK,SAAS;UAEZ;QAEF,KAAK,SAAS;QACd,KAAK,mBAAmB;UACtB,MAAM,IAAItD,KAAK,CAAE,iBAAgBR,OAAO,CAACM,IAAK,0BAAyB,CAAC;MAC5E;IACF;EACF;EAMA6B,cAAcA,CAAA,EAAG;IACf,KAAK,MAAM0C,aAAa,IAAI,IAAI,CAACtF,YAAY,CAAChB,QAAQ,IAAI,EAAE,EAAE;MAAA,IAAAuG,mBAAA;MAC5D,MAAM;QAAClF,IAAI;QAAEqE,QAAQ;QAAE3D,IAAI;QAAEwD;MAAW,CAAC,GAAGe,aAAa;MACzD,MAAMhF,KAAK,IAAAiF,mBAAA,GAAG,IAAI,CAACvG,QAAQ,CAACqB,IAAI,CAAC,cAAAkF,mBAAA,cAAAA,mBAAA,GAAIhB,WAAW;MAChD,IAAIjE,KAAK,KAAKkF,SAAS,EAAE;QACvBtH,UAAU,CAAC,IAAI,CAACQ,MAAM,CAACW,EAAE,EAAEqF,QAAQ,EAAE3D,IAAI,EAAET,KAAK,CAAC;MACnD;IACF;EACF;AACF"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Sampler } from '@luma.gl/core';
|
|
2
|
-
import { GL } from '@luma.gl/constants';
|
|
3
2
|
import { convertSamplerParametersToWebGL } from "../converters/sampler-parameters.js";
|
|
4
3
|
export class WEBGLSampler extends Sampler {
|
|
5
4
|
constructor(device, props) {
|
|
@@ -27,8 +26,8 @@ export class WEBGLSampler extends Sampler {
|
|
|
27
26
|
for (const [pname, value] of Object.entries(parameters)) {
|
|
28
27
|
const param = Number(pname);
|
|
29
28
|
switch (param) {
|
|
30
|
-
case
|
|
31
|
-
case
|
|
29
|
+
case 33082:
|
|
30
|
+
case 33083:
|
|
32
31
|
this.device.gl2.samplerParameterf(this.handle, param, value);
|
|
33
32
|
break;
|
|
34
33
|
default:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgl-sampler.js","names":["Sampler","
|
|
1
|
+
{"version":3,"file":"webgl-sampler.js","names":["Sampler","convertSamplerParametersToWebGL","WEBGLSampler","constructor","device","props","handle","parameters","isWebGL2","gl2","createSampler","_setSamplerParameters","destroy","deleteSampler","undefined","toString","id","JSON","stringify","pname","value","Object","entries","param","Number","samplerParameterf","samplerParameteri"],"sources":["../../../src/adapter/resources/webgl-sampler.ts"],"sourcesContent":["// luma.gl, MIT license\n// Copyright (c) vis.gl contributors\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":"AAGA,SAAQA,OAAO,QAAqB,eAAe;AAAC,SAE5CC,+BAA+B;AAUvC,OAAO,MAAMC,YAAY,SAASF,OAAO,CAAC;EAKxCG,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;QACA;UACE,IAAI,CAACnB,MAAM,CAACK,GAAG,CAACgB,iBAAiB,CAAC,IAAI,CAACnB,MAAM,EAAEiB,KAAK,EAAEH,KAAK,CAAC;UAC5D;QACF;UACE,IAAI,CAAChB,MAAM,CAACK,GAAG,CAACiB,iBAAiB,CAAC,IAAI,CAACpB,MAAM,EAAEiB,KAAK,EAAEH,KAAK,CAAC;UAC5D;MACJ;IACF;EACF;AACF"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { log, uid, Shader, formatCompilerLog } from '@luma.gl/core';
|
|
2
|
-
import { GL } from '@luma.gl/constants';
|
|
3
2
|
import { getShaderInfo } from "../helpers/get-shader-info.js";
|
|
4
3
|
import { parseShaderCompilerLog } from "../helpers/parse-shader-compiler-log.js";
|
|
5
4
|
export class WEBGLShader extends Shader {
|
|
@@ -13,10 +12,10 @@ export class WEBGLShader extends Shader {
|
|
|
13
12
|
this.device = device;
|
|
14
13
|
switch (this.props.stage) {
|
|
15
14
|
case 'vertex':
|
|
16
|
-
this.handle = this.props.handle || this.device.gl.createShader(
|
|
15
|
+
this.handle = this.props.handle || this.device.gl.createShader(35633);
|
|
17
16
|
break;
|
|
18
17
|
case 'fragment':
|
|
19
|
-
this.handle = this.props.handle || this.device.gl.createShader(
|
|
18
|
+
this.handle = this.props.handle || this.device.gl.createShader(35632);
|
|
20
19
|
break;
|
|
21
20
|
default:
|
|
22
21
|
throw new Error(this.props.stage);
|
|
@@ -42,7 +41,7 @@ export class WEBGLShader extends Shader {
|
|
|
42
41
|
} = this.device;
|
|
43
42
|
gl.shaderSource(this.handle, source);
|
|
44
43
|
gl.compileShader(this.handle);
|
|
45
|
-
const compileStatus = gl.getShaderParameter(this.handle,
|
|
44
|
+
const compileStatus = gl.getShaderParameter(this.handle, 35713);
|
|
46
45
|
if (!compileStatus) {
|
|
47
46
|
const shaderLog = gl.getShaderInfoLog(this.handle);
|
|
48
47
|
const parsedLog = shaderLog ? parseShaderCompilerLog(shaderLog) : [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgl-shader.js","names":["log","uid","Shader","formatCompilerLog","
|
|
1
|
+
{"version":3,"file":"webgl-shader.js","names":["log","uid","Shader","formatCompilerLog","getShaderInfo","parseShaderCompilerLog","WEBGLShader","constructor","device","props","id","getShaderIdFromProps","handle","stage","gl","createShader","Error","_compile","source","destroy","removeStats","deleteShader","destroyed","compilationInfo","getShaderInfoLog","addGLSLVersion","startsWith","shaderSource","compileShader","compileStatus","getShaderParameter","shaderLog","parsedLog","messages","filter","message","type","formattedLog","showSourceCode","shaderName","name","shaderDescription","error"],"sources":["../../../src/adapter/resources/webgl-shader.ts"],"sourcesContent":["// luma.gl, MIT license\n// Copyright (c) vis.gl contributors\n\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,6 +1,5 @@
|
|
|
1
1
|
import { isObjectEmpty } from '@luma.gl/core';
|
|
2
2
|
import { Texture, cast, log, assert, isPowerOfTwo, loadImage } from '@luma.gl/core';
|
|
3
|
-
import { GL } from '@luma.gl/constants';
|
|
4
3
|
import { withGLParameters } from "../../context/state-tracker/with-parameters.js";
|
|
5
4
|
import { convertTextureFormatToGL, getWebGLTextureParameters, getTextureFormatBytesPerPixel } from "../converters/texture-formats.js";
|
|
6
5
|
import { convertSamplerParametersToWebGL, updateSamplerParametersForNPOT } from "../converters/sampler-parameters.js";
|
|
@@ -45,7 +44,7 @@ export class WEBGLTexture extends Texture {
|
|
|
45
44
|
...this.props,
|
|
46
45
|
data: typeof this.props.data
|
|
47
46
|
});
|
|
48
|
-
this.glFormat =
|
|
47
|
+
this.glFormat = 6408;
|
|
49
48
|
this.target = getWebGLTextureTarget(this.props);
|
|
50
49
|
this.loaded = false;
|
|
51
50
|
if (typeof ((_this$props = this.props) === null || _this$props === void 0 ? void 0 : _this$props.data) === 'string') {
|
|
@@ -131,7 +130,7 @@ export class WEBGLTexture extends Texture {
|
|
|
131
130
|
this.dataFormat = dataFormat;
|
|
132
131
|
this.textureUnit = textureUnit;
|
|
133
132
|
if (Number.isFinite(this.textureUnit)) {
|
|
134
|
-
this.gl.activeTexture(
|
|
133
|
+
this.gl.activeTexture(33984 + this.textureUnit);
|
|
135
134
|
this.gl.bindTexture(this.target, this.handle);
|
|
136
135
|
}
|
|
137
136
|
if (mipmaps && this.device.isWebGL1 && isNPOT(this.width, this.height)) {
|
|
@@ -307,9 +306,9 @@ export class WEBGLTexture extends Texture {
|
|
|
307
306
|
break;
|
|
308
307
|
case 'buffer':
|
|
309
308
|
gl2 = this.device.assertWebGL2();
|
|
310
|
-
gl2.bindBuffer(
|
|
309
|
+
gl2.bindBuffer(35052, data.handle || data);
|
|
311
310
|
gl2.texImage2D(target, level, glFormat, width, height, 0, dataFormat, type, offset);
|
|
312
|
-
gl2.bindBuffer(
|
|
311
|
+
gl2.bindBuffer(35052, null);
|
|
313
312
|
break;
|
|
314
313
|
case 'browser-object':
|
|
315
314
|
if (this.device.isWebGL2) {
|
|
@@ -391,9 +390,9 @@ export class WEBGLTexture extends Texture {
|
|
|
391
390
|
this.gl.texSubImage2D(target, level, x, y, width, height, dataFormat, type, data, offset);
|
|
392
391
|
} else if (typeof WebGLBuffer !== 'undefined' && data instanceof WebGLBuffer) {
|
|
393
392
|
const gl2 = this.device.assertWebGL2();
|
|
394
|
-
gl2.bindBuffer(
|
|
393
|
+
gl2.bindBuffer(35052, data);
|
|
395
394
|
gl2.texSubImage2D(target, level, x, y, width, height, dataFormat, type, offset);
|
|
396
|
-
gl2.bindBuffer(
|
|
395
|
+
gl2.bindBuffer(35052, null);
|
|
397
396
|
} else if (this.device.isWebGL2) {
|
|
398
397
|
const gl2 = this.device.assertWebGL2();
|
|
399
398
|
gl2.texSubImage2D(target, level, x, y, width, height, dataFormat, type, data);
|
|
@@ -409,7 +408,7 @@ export class WEBGLTexture extends Texture {
|
|
|
409
408
|
return null;
|
|
410
409
|
}
|
|
411
410
|
getActiveUnit() {
|
|
412
|
-
return this.gl.getParameter(
|
|
411
|
+
return this.gl.getParameter(34016) - 33984;
|
|
413
412
|
}
|
|
414
413
|
bind() {
|
|
415
414
|
let textureUnit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.textureUnit;
|
|
@@ -418,7 +417,7 @@ export class WEBGLTexture extends Texture {
|
|
|
418
417
|
} = this;
|
|
419
418
|
if (textureUnit !== undefined) {
|
|
420
419
|
this.textureUnit = textureUnit;
|
|
421
|
-
gl.activeTexture(
|
|
420
|
+
gl.activeTexture(33984 + textureUnit);
|
|
422
421
|
}
|
|
423
422
|
gl.bindTexture(this.target, this.handle);
|
|
424
423
|
return textureUnit;
|
|
@@ -430,7 +429,7 @@ export class WEBGLTexture extends Texture {
|
|
|
430
429
|
} = this;
|
|
431
430
|
if (textureUnit !== undefined) {
|
|
432
431
|
this.textureUnit = textureUnit;
|
|
433
|
-
gl.activeTexture(
|
|
432
|
+
gl.activeTexture(33984 + textureUnit);
|
|
434
433
|
}
|
|
435
434
|
gl.bindTexture(this.target, null);
|
|
436
435
|
return textureUnit;
|
|
@@ -557,8 +556,8 @@ export class WEBGLTexture extends Texture {
|
|
|
557
556
|
height,
|
|
558
557
|
pixels,
|
|
559
558
|
data,
|
|
560
|
-
format =
|
|
561
|
-
type =
|
|
559
|
+
format = 6408,
|
|
560
|
+
type = 5121
|
|
562
561
|
} = options;
|
|
563
562
|
const imageDataMap = pixels || data;
|
|
564
563
|
const resolvedFaces = await Promise.all(WEBGLTexture.FACES.map(face => {
|
|
@@ -587,8 +586,8 @@ export class WEBGLTexture extends Texture {
|
|
|
587
586
|
height,
|
|
588
587
|
pixels,
|
|
589
588
|
data,
|
|
590
|
-
format =
|
|
591
|
-
type =
|
|
589
|
+
format = 6408,
|
|
590
|
+
type = 5121
|
|
592
591
|
} = options;
|
|
593
592
|
const {
|
|
594
593
|
gl
|
|
@@ -629,7 +628,7 @@ export class WEBGLTexture extends Texture {
|
|
|
629
628
|
this.gl.texImage3D(this.target, level, webglTextureFormat.format, width, height, depth, 0, webglTextureFormat.dataFormat, webglTextureFormat.type, data);
|
|
630
629
|
}
|
|
631
630
|
if (data instanceof WEBGLBuffer) {
|
|
632
|
-
this.gl.bindBuffer(
|
|
631
|
+
this.gl.bindBuffer(35052, data.handle);
|
|
633
632
|
this.gl.texImage3D(this.target, level, dataFormat, width, height, depth, 0, format, type, offset);
|
|
634
633
|
}
|
|
635
634
|
});
|
|
@@ -655,8 +654,8 @@ export class WEBGLTexture extends Texture {
|
|
|
655
654
|
const param = Number(pname);
|
|
656
655
|
const value = pvalue;
|
|
657
656
|
switch (param) {
|
|
658
|
-
case
|
|
659
|
-
case
|
|
657
|
+
case 33082:
|
|
658
|
+
case 33083:
|
|
660
659
|
this.gl.texParameterf(this.target, param, value);
|
|
661
660
|
break;
|
|
662
661
|
default:
|
|
@@ -671,14 +670,14 @@ export class WEBGLTexture extends Texture {
|
|
|
671
670
|
const npot = this.device.isWebGL1 && isNPOT(this.width, this.height);
|
|
672
671
|
if (npot) {
|
|
673
672
|
switch (pname) {
|
|
674
|
-
case
|
|
675
|
-
if (value !==
|
|
676
|
-
return
|
|
673
|
+
case 10241:
|
|
674
|
+
if (value !== 9729 && value !== 9728) {
|
|
675
|
+
return 9729;
|
|
677
676
|
}
|
|
678
677
|
break;
|
|
679
|
-
case
|
|
680
|
-
case
|
|
681
|
-
return
|
|
678
|
+
case 10242:
|
|
679
|
+
case 10243:
|
|
680
|
+
return 33071;
|
|
682
681
|
default:
|
|
683
682
|
break;
|
|
684
683
|
}
|
|
@@ -686,17 +685,17 @@ export class WEBGLTexture extends Texture {
|
|
|
686
685
|
return value;
|
|
687
686
|
}
|
|
688
687
|
}
|
|
689
|
-
WEBGLTexture.FACES = [
|
|
688
|
+
WEBGLTexture.FACES = [34069, 34070, 34071, 34072, 34073, 34074];
|
|
690
689
|
function getWebGLTextureTarget(props) {
|
|
691
690
|
switch (props.dimension) {
|
|
692
691
|
case '2d':
|
|
693
|
-
return
|
|
692
|
+
return 3553;
|
|
694
693
|
case 'cube':
|
|
695
|
-
return
|
|
694
|
+
return 34067;
|
|
696
695
|
case '2d-array':
|
|
697
|
-
return
|
|
696
|
+
return 35866;
|
|
698
697
|
case '3d':
|
|
699
|
-
return
|
|
698
|
+
return 32879;
|
|
700
699
|
case '1d':
|
|
701
700
|
case 'cube-array':
|
|
702
701
|
default:
|