@luma.gl/webgl 9.1.0-beta.11 → 9.1.0-beta.15
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/dist/adapter/webgl-adapter.d.ts +2 -1
- package/dist/adapter/webgl-adapter.d.ts.map +1 -1
- package/dist/adapter/webgl-adapter.js +8 -2
- package/dist/adapter/webgl-adapter.js.map +1 -1
- package/dist/adapter/webgl-device.d.ts.map +1 -1
- package/dist/adapter/webgl-device.js +14 -9
- package/dist/adapter/webgl-device.js.map +1 -1
- package/dist/dist.dev.js +11 -4
- package/dist/dist.min.js +1 -1
- package/dist/index.cjs +11 -4
- package/dist/index.cjs.map +2 -2
- package/package.json +3 -3
- package/src/adapter/webgl-adapter.ts +10 -3
- package/src/adapter/webgl-device.ts +21 -14
package/dist/index.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts", "../src/adapter/webgl-adapter.ts", "../src/adapter/webgl-device.ts", "../src/context/parameters/webgl-parameter-tables.ts", "../src/context/parameters/unified-parameter-api.ts", "../src/context/state-tracker/deep-array-equal.ts", "../src/context/state-tracker/webgl-state-tracker.ts", "../src/context/helpers/create-browser-context.ts", "../src/adapter/device-helpers/webgl-device-info.ts", "../src/context/helpers/webgl-extensions.ts", "../src/adapter/device-helpers/webgl-device-features.ts", "../src/adapter/converters/webgl-texture-table.ts", "../src/adapter/converters/vertex-formats.ts", "../src/adapter/device-helpers/webgl-device-limits.ts", "../src/adapter/webgl-canvas-context.ts", "../src/adapter/resources/webgl-framebuffer.ts", "../src/context/debug/spector.ts", "../src/utils/load-script.ts", "../src/context/debug/webgl-developer-tools.ts", "../src/utils/uid.ts", "../src/adapter/resources/webgl-buffer.ts", "../src/adapter/resources/webgl-shader.ts", "../src/adapter/helpers/parse-shader-compiler-log.ts", "../src/adapter/resources/webgl-sampler.ts", "../src/adapter/converters/sampler-parameters.ts", "../src/adapter/converters/device-parameters.ts", "../src/adapter/resources/webgl-texture.ts", "../src/adapter/resources/webgl-texture-view.ts", "../src/adapter/helpers/webgl-texture-utils.ts", "../src/adapter/helpers/typed-array-utils.ts", "../src/adapter/helpers/format-utils.ts", "../src/context/state-tracker/with-parameters.ts", "../src/adapter/resources/webgl-render-pass.ts", "../src/adapter/resources/webgl-render-pipeline.ts", "../src/adapter/helpers/get-shader-layout.ts", "../src/adapter/helpers/decode-webgl-types.ts", "../src/adapter/helpers/set-uniform.ts", "../src/utils/split-uniforms-and-bindings.ts", "../src/adapter/helpers/webgl-topology-utils.ts", "../src/adapter/resources/webgl-command-encoder.ts", "../src/adapter/resources/webgl-command-buffer.ts", "../src/adapter/resources/webgl-vertex-array.ts", "../src/utils/fill-array.ts", "../src/adapter/resources/webgl-transform-feedback.ts", "../src/adapter/resources/webgl-query-set.ts", "../src/context/polyfills/polyfill-webgl1-extensions.ts", "../src/deprecated/accessor.ts"],
|
|
4
|
-
"sourcesContent": ["// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// luma.gl Base WebGL wrapper library\n// Provides simple class/function wrappers around the low level webgl objects\n// These classes are intentionally close to the WebGL API\n// but make it easier to use.\n// Higher level abstractions can be built on these classes\n\n// Types\nexport type {WebGLDeviceLimits} from './adapter/device-helpers/webgl-device-limits';\n\n// WebGL adapter classes\nexport {webgl2Adapter} from './adapter/webgl-adapter';\nexport type {WebGLAdapter} from './adapter/webgl-adapter';\n\n// WebGL Device classes\nexport {WebGLDevice} from './adapter/webgl-device';\nexport {WebGLCanvasContext} from './adapter/webgl-canvas-context';\n\n// WebGL Resource classes\nexport {WEBGLBuffer} from './adapter/resources/webgl-buffer';\nexport {WEBGLTexture} from './adapter/resources/webgl-texture';\n// export {WEBGLExternalTexture} from './adapter/resources/webgl-external-texture';\nexport {WEBGLShader} from './adapter/resources/webgl-shader';\nexport {WEBGLSampler} from './adapter/resources/webgl-sampler';\nexport {WEBGLFramebuffer} from './adapter/resources/webgl-framebuffer';\n\nexport {WEBGLRenderPipeline} from './adapter/resources/webgl-render-pipeline';\n// export {WEBGLComputePipeline} from './adapter/resources/webgl-compute-pipeline';\nexport {WEBGLCommandEncoder} from './adapter/resources/webgl-command-encoder';\nexport {WEBGLRenderPass} from './adapter/resources/webgl-render-pass';\n// export {WEBGLComputePass} from './adapter/resources/webgl-compute-pass';\nexport {WEBGLVertexArray} from './adapter/resources/webgl-vertex-array';\n\n// WebGL adapter classes\nexport {WEBGLTransformFeedback} from './adapter/resources/webgl-transform-feedback';\n\n// WebGL adapter classes\nexport {Accessor} from './deprecated/accessor';\nexport type {AccessorObject} from './types';\n\n// Unified parameter API\n\nexport {setDeviceParameters, withDeviceParameters} from './adapter/converters/device-parameters';\n\n// HELPERS - EXPERIMENTAL\nexport {getShaderLayoutFromGLSL} from './adapter/helpers/get-shader-layout';\nexport {WebGLStateTracker} from './context/state-tracker/webgl-state-tracker';\n\n// DEPRECATED TEST EXPORTS\nexport {\n resetGLParameters,\n setGLParameters,\n getGLParameters\n} from './context/parameters/unified-parameter-api';\n\nexport {withGLParameters} from './context/state-tracker/with-parameters';\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Adapter, Device, DeviceProps, log} from '@luma.gl/core';\nimport {WebGLDevice} from './webgl-device';\nimport {enforceWebGL2} from '../context/polyfills/polyfill-webgl1-extensions';\nimport {loadSpectorJS, DEFAULT_SPECTOR_PROPS} from '../context/debug/spector';\nimport {loadWebGLDeveloperTools} from '../context/debug/webgl-developer-tools';\n\nconst LOG_LEVEL = 1;\n\nexport class WebGLAdapter extends Adapter {\n /** type of device's created by this adapter */\n readonly type: Device['type'] = 'webgl';\n\n constructor() {\n super();\n\n // Add spector default props to device default props, so that runtime settings are observed\n Device.defaultProps = {...Device.defaultProps, ...DEFAULT_SPECTOR_PROPS};\n\n // @ts-ignore DEPRECATED For backwards compatibility luma.registerDevices\n WebGLDevice.adapter = this;\n }\n\n /** Check if WebGL 2 is available */\n isSupported(): boolean {\n return typeof WebGL2RenderingContext !== 'undefined';\n }\n\n /** Force any created WebGL contexts to be WebGL2 contexts, polyfilled with WebGL1 extensions */\n enforceWebGL2(enable: boolean): void {\n enforceWebGL2(enable);\n }\n\n /**\n * Get a device instance from a GL context\n * Creates and instruments the device if not already created\n * @param gl\n * @returns\n */\n async attach(gl: Device | WebGL2RenderingContext): Promise<WebGLDevice> {\n if (gl instanceof WebGLDevice) {\n return gl;\n }\n // @ts-expect-error\n if (gl?.device instanceof Device) {\n // @ts-expect-error\n return gl.device as WebGLDevice;\n }\n if (!isWebGL(gl)) {\n throw new Error('Invalid WebGL2RenderingContext');\n }\n return new WebGLDevice({_handle: gl as WebGL2RenderingContext});\n }\n\n async create(props: DeviceProps = {}): Promise<WebGLDevice> {\n log.groupCollapsed(LOG_LEVEL, 'WebGLDevice created')();\n\n const promises: Promise<unknown>[] = [];\n\n // Load webgl and spector debug scripts from CDN if requested\n if (props.debugWebGL || props.debug) {\n promises.push(loadWebGLDeveloperTools());\n }\n\n if (props.debugSpectorJS) {\n promises.push(loadSpectorJS(props));\n }\n\n // Wait for all the loads to settle before creating the context.\n // The Device.create() functions are async, so in contrast to the constructor, we can `await` here.\n const results = await Promise.allSettled(promises);\n for (const result of results) {\n if (result.status === 'rejected') {\n log.error(`Failed to initialize debug libraries ${result.reason}`)();\n }\n }\n\n const device = new WebGLDevice(props);\n\n // Log some debug info about the newly created context\n const message = `\\\nCreated ${device.type}${device.debug ? ' debug' : ''} context: \\\n${device.info.vendor}, ${device.info.renderer} for canvas: ${device.canvasContext.id}`;\n log.probe(LOG_LEVEL, message)();\n log.table(LOG_LEVEL, device.info)();\n\n log.groupEnd(LOG_LEVEL)();\n\n return device;\n }\n}\n\n/** Check if supplied parameter is a WebGL2RenderingContext */\nfunction isWebGL(gl: any): boolean {\n if (typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext) {\n return true;\n }\n // Look for debug contexts, headless gl etc\n return Boolean(gl && Number.isFinite(gl._version));\n}\n\nexport const webgl2Adapter = new WebGLAdapter();\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {TypedArray} from '@math.gl/types';\nimport type {\n DeviceProps,\n DeviceInfo,\n DeviceTextureFormatCapabilities,\n CanvasContextProps,\n Buffer,\n Texture,\n Framebuffer,\n VertexArray,\n VertexArrayProps,\n BufferProps,\n ShaderProps,\n // Sampler,\n SamplerProps,\n TextureProps,\n ExternalTexture,\n ExternalTextureProps,\n FramebufferProps,\n // RenderPipeline,\n RenderPipelineProps,\n ComputePipeline,\n ComputePipelineProps,\n // RenderPass,\n RenderPassProps,\n ComputePass,\n ComputePassProps,\n // CommandEncoder,\n CommandEncoderProps,\n TransformFeedbackProps,\n QuerySetProps\n} from '@luma.gl/core';\nimport {Device, CanvasContext, log} from '@luma.gl/core';\nimport type {GLExtensions} from '@luma.gl/constants';\nimport {WebGLStateTracker} from '../context/state-tracker/webgl-state-tracker';\nimport {createBrowserContext} from '../context/helpers/create-browser-context';\nimport {getDeviceInfo} from './device-helpers/webgl-device-info';\nimport {WebGLDeviceFeatures} from './device-helpers/webgl-device-features';\nimport {WebGLDeviceLimits} from './device-helpers/webgl-device-limits';\nimport {WebGLCanvasContext} from './webgl-canvas-context';\nimport type {Spector} from '../context/debug/spector-types';\nimport {initializeSpectorJS} from '../context/debug/spector';\nimport {makeDebugContext} from '../context/debug/webgl-developer-tools';\nimport {getTextureFormatCapabilitiesWebGL} from './converters/webgl-texture-table';\nimport {uid} from '../utils/uid';\n\nimport {WEBGLBuffer} from './resources/webgl-buffer';\nimport {WEBGLShader} from './resources/webgl-shader';\nimport {WEBGLSampler} from './resources/webgl-sampler';\nimport {WEBGLTexture} from './resources/webgl-texture';\nimport {WEBGLFramebuffer} from './resources/webgl-framebuffer';\nimport {WEBGLRenderPass} from './resources/webgl-render-pass';\nimport {WEBGLRenderPipeline} from './resources/webgl-render-pipeline';\nimport {WEBGLCommandEncoder} from './resources/webgl-command-encoder';\nimport {WEBGLVertexArray} from './resources/webgl-vertex-array';\nimport {WEBGLTransformFeedback} from './resources/webgl-transform-feedback';\nimport {WEBGLQuerySet} from './resources/webgl-query-set';\n\nimport {readPixelsToArray, readPixelsToBuffer} from './helpers/webgl-texture-utils';\nimport {\n setGLParameters,\n getGLParameters,\n resetGLParameters\n} from '../context/parameters/unified-parameter-api';\nimport {withGLParameters} from '../context/state-tracker/with-parameters';\nimport {getWebGLExtension} from '../context/helpers/webgl-extensions';\n\n/** WebGPU style Device API for a WebGL context */\nexport class WebGLDevice extends Device {\n //\n // Public `Device` API\n //\n\n /** type of this device */\n readonly type = 'webgl';\n\n /** The underlying WebGL context */\n readonly handle: WebGL2RenderingContext;\n features: WebGLDeviceFeatures;\n limits: WebGLDeviceLimits;\n\n readonly info: DeviceInfo;\n readonly canvasContext: WebGLCanvasContext;\n\n readonly lost: Promise<{reason: 'destroyed'; message: string}>;\n\n private _resolveContextLost?: (value: {reason: 'destroyed'; message: string}) => void;\n\n /** WebGL2 context. */\n readonly gl: WebGL2RenderingContext;\n readonly debug: boolean = false;\n\n /** State used by luma.gl classes: TODO - move to canvasContext*/\n readonly _canvasSizeInfo = {clientWidth: 0, clientHeight: 0, devicePixelRatio: 1};\n\n /** State used by luma.gl classes - TODO - not used? */\n readonly _extensions: GLExtensions = {};\n _polyfilled: boolean = false;\n\n /** Instance of Spector.js (if initialized) */\n spectorJS: Spector;\n\n //\n // Public API\n //\n\n constructor(props: DeviceProps) {\n super({...props, id: props.id || uid('webgl-device')});\n\n // WebGL requires a canvas to be created before creating the context\n if (!props.createCanvasContext) {\n throw new Error('WebGLDevice requires props.createCanvasContext to be set');\n }\n const canvasContextProps = props.createCanvasContext === true ? {} : props.createCanvasContext;\n\n // If attaching to an already attached context, return the attached device\n // @ts-expect-error device is attached to context\n let device: WebGLDevice | undefined = canvasContextProps.canvas?.gl?.device;\n if (device) {\n throw new Error(`WebGL context already attached to device ${device.id}`);\n }\n\n // Create and instrument context\n this.canvasContext = new WebGLCanvasContext(this, canvasContextProps);\n\n this.lost = new Promise<{reason: 'destroyed'; message: string}>(resolve => {\n this._resolveContextLost = resolve;\n });\n\n const webglContextAttributes: WebGLContextAttributes = {...props.webgl};\n // Copy props from CanvasContextProps\n if (canvasContextProps.alphaMode === 'premultiplied') {\n webglContextAttributes.premultipliedAlpha = true;\n }\n if (props.powerPreference !== undefined) {\n webglContextAttributes.powerPreference = props.powerPreference;\n }\n\n const gl = createBrowserContext(\n this.canvasContext.canvas,\n {\n onContextLost: (event: Event) =>\n this._resolveContextLost?.({\n reason: 'destroyed',\n message: 'Entered sleep mode, or too many apps or browser tabs are using the GPU.'\n }),\n // eslint-disable-next-line no-console\n onContextRestored: (event: Event) => console.log('WebGL context restored')\n },\n webglContextAttributes\n );\n\n if (!gl) {\n throw new Error('WebGL context creation failed');\n }\n\n // @ts-expect-error device is attached to context\n device = gl.device;\n if (device) {\n throw new Error(`WebGL context already attached to device ${device.id}`);\n }\n\n this.handle = gl;\n this.gl = gl;\n\n // Add spector debug instrumentation to context\n // We need to trust spector integration to decide if spector should be initialized\n // We also run spector instrumentation first, otherwise spector can clobber luma instrumentation.\n this.spectorJS = initializeSpectorJS({...this.props, gl: this.handle});\n\n // Instrument context\n (this.gl as any).device = this; // Update GL context: Link webgl context back to device\n (this.gl as any)._version = 2; // Update GL context: Store WebGL version field on gl context (HACK to identify debug contexts)\n\n // initialize luma Device fields\n this.info = getDeviceInfo(this.gl, this._extensions);\n this.limits = new WebGLDeviceLimits(this.gl);\n this.features = new WebGLDeviceFeatures(\n this.gl,\n this._extensions,\n this.props._disabledFeatures\n );\n if (this.props._initializeFeatures) {\n this.features.initializeFeatures();\n }\n\n this.canvasContext.resize();\n\n // Install context state tracking\n const glState = new WebGLStateTracker(this.gl, {\n log: (...args: any[]) => log.log(1, ...args)()\n });\n glState.trackState(this.gl, {copyState: false});\n\n // DEBUG contexts: Add luma debug instrumentation to the context, force log level to at least 1\n const debugWebGL = props.debugWebGL || props.debug;\n const traceWebGL = props.debugWebGL;\n if (debugWebGL) {\n this.gl = makeDebugContext(this.gl, {debugWebGL, traceWebGL});\n log.warn('WebGL debug mode activated. Performance reduced.')();\n if (props.debugWebGL) {\n log.level = Math.max(log.level, 1);\n }\n }\n }\n\n /**\n * Destroys the context\n * @note Has no effect for WebGL browser contexts, there is no browser API for destroying contexts\n */\n destroy(): void {}\n\n get isLost(): boolean {\n return this.gl.isContextLost();\n }\n\n // IMPLEMENTATION OF ABSTRACT DEVICE\n\n createCanvasContext(props?: CanvasContextProps): CanvasContext {\n throw new Error('WebGL only supports a single canvas');\n }\n\n createBuffer(props: BufferProps | ArrayBuffer | ArrayBufferView): WEBGLBuffer {\n const newProps = this._normalizeBufferProps(props);\n return new WEBGLBuffer(this, newProps);\n }\n\n createTexture(props: TextureProps): WEBGLTexture {\n return new WEBGLTexture(this, props);\n }\n\n createExternalTexture(props: ExternalTextureProps): ExternalTexture {\n throw new Error('createExternalTexture() not implemented'); // return new Program(props);\n }\n\n createSampler(props: SamplerProps): WEBGLSampler {\n return new WEBGLSampler(this, props);\n }\n\n createShader(props: ShaderProps): WEBGLShader {\n return new WEBGLShader(this, props);\n }\n\n createFramebuffer(props: FramebufferProps): WEBGLFramebuffer {\n return new WEBGLFramebuffer(this, props);\n }\n\n createVertexArray(props: VertexArrayProps): VertexArray {\n return new WEBGLVertexArray(this, props);\n }\n\n createTransformFeedback(props: TransformFeedbackProps): WEBGLTransformFeedback {\n return new WEBGLTransformFeedback(this, props);\n }\n\n createQuerySet(props: QuerySetProps): WEBGLQuerySet {\n return new WEBGLQuerySet(this, props);\n }\n\n createRenderPipeline(props: RenderPipelineProps): WEBGLRenderPipeline {\n return new WEBGLRenderPipeline(this, props);\n }\n\n beginRenderPass(props: RenderPassProps): WEBGLRenderPass {\n return new WEBGLRenderPass(this, props);\n }\n\n createComputePipeline(props?: ComputePipelineProps): ComputePipeline {\n throw new Error('ComputePipeline not supported in WebGL');\n }\n\n beginComputePass(props: ComputePassProps): ComputePass {\n throw new Error('ComputePass not supported in WebGL');\n }\n\n private renderPass: WEBGLRenderPass | null = null;\n\n override createCommandEncoder(props: CommandEncoderProps = {}): WEBGLCommandEncoder {\n return new WEBGLCommandEncoder(this, props);\n }\n\n /**\n * Offscreen Canvas Support: Commit the frame\n * https://developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext/commit\n * Chrome's offscreen canvas does not require gl.commit\n */\n submit(): void {\n this.renderPass?.end();\n this.renderPass = null;\n // this.canvasContext.commit();\n }\n\n //\n // TEMPORARY HACKS - will be removed in v9.1\n //\n\n /** @deprecated - should use command encoder */\n override readPixelsToArrayWebGL(\n source: Framebuffer | Texture,\n options?: {\n sourceX?: number;\n sourceY?: number;\n sourceFormat?: number;\n sourceAttachment?: number;\n target?: Uint8Array | Uint16Array | Float32Array;\n // following parameters are auto deduced if not provided\n sourceWidth?: number;\n sourceHeight?: number;\n sourceType?: number;\n }\n ): Uint8Array | Uint16Array | Float32Array {\n return readPixelsToArray(source, options);\n }\n\n /** @deprecated - should use command encoder */\n override readPixelsToBufferWebGL(\n source: Framebuffer | Texture,\n options?: {\n sourceX?: number;\n sourceY?: number;\n sourceFormat?: number;\n target?: Buffer; // A new Buffer object is created when not provided.\n targetByteOffset?: number; // byte offset in buffer object\n // following parameters are auto deduced if not provided\n sourceWidth?: number;\n sourceHeight?: number;\n sourceType?: number;\n }\n ): Buffer {\n return readPixelsToBuffer(source, options);\n }\n\n override setParametersWebGL(parameters: any): void {\n setGLParameters(this.gl, parameters);\n }\n\n override getParametersWebGL(parameters: any): any {\n return getGLParameters(this.gl, parameters);\n }\n\n override withParametersWebGL(parameters: any, func: any): any {\n return withGLParameters(this.gl, parameters, func);\n }\n\n override resetWebGL(): void {\n log.warn('WebGLDevice.resetWebGL is deprecated, use only for debugging')();\n resetGLParameters(this.gl);\n }\n\n override _getDeviceSpecificTextureFormatCapabilities(\n capabilities: DeviceTextureFormatCapabilities\n ): DeviceTextureFormatCapabilities {\n return getTextureFormatCapabilitiesWebGL(this.gl, capabilities, this._extensions);\n }\n\n //\n // WebGL-only API (not part of `Device` API)\n //\n\n /**\n * Triggers device (or WebGL context) loss.\n * @note primarily intended for testing how application reacts to device loss\n */\n override loseDevice(): boolean {\n let deviceLossTriggered = false;\n const extensions = this.getExtension('WEBGL_lose_context');\n const ext = extensions.WEBGL_lose_context;\n if (ext) {\n deviceLossTriggered = true;\n ext.loseContext();\n // ext.loseContext should trigger context loss callback but the platform may not do this, so do it explicitly\n }\n this._resolveContextLost?.({\n reason: 'destroyed',\n message: 'Application triggered context loss'\n });\n return deviceLossTriggered;\n }\n\n /** Save current WebGL context state onto an internal stack */\n pushState(): void {\n const webglState = WebGLStateTracker.get(this.gl);\n webglState.push();\n }\n\n /** Restores previously saved context state */\n popState(): void {\n const webglState = WebGLStateTracker.get(this.gl);\n webglState.pop();\n }\n\n /**\n * Storing data on a special field on WebGLObjects makes that data visible in SPECTOR chrome debug extension\n * luma.gl ids and props can be inspected\n */\n setSpectorMetadata(handle: unknown, props: Record<string, unknown>) {\n // @ts-expect-error\n // eslint-disable-next-line camelcase\n handle.__SPECTOR_Metadata = props;\n }\n\n /**\n * Returns the GL.<KEY> constant that corresponds to a numeric value of a GL constant\n * Be aware that there are some duplicates especially for constants that are 0,\n * so this isn't guaranteed to return the right key in all cases.\n */\n getGLKey(value: unknown, options?: {emptyIfUnknown?: boolean}): string {\n const number = Number(value);\n for (const key in this.gl) {\n // @ts-ignore expect-error depends on settings\n if (this.gl[key] === number) {\n return `GL.${key}`;\n }\n }\n // No constant found. Stringify the value and return it.\n return options?.emptyIfUnknown ? '' : String(value);\n }\n\n /**\n * Returns a map with any GL.<KEY> constants mapped to strings, both for keys and values\n */\n getGLKeys(glParameters: Record<number, unknown>): Record<string, string> {\n const opts = {emptyIfUnknown: true};\n return Object.entries(glParameters).reduce<Record<string, string>>((keys, [key, value]) => {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n keys[`${key}:${this.getGLKey(key, opts)}`] = `${value}:${this.getGLKey(value, opts)}`;\n return keys;\n }, {});\n }\n\n /** Store constants */\n _constants: (TypedArray | null)[];\n\n /**\n * Set a constant value for a location. Disabled attributes at that location will read from this value\n * @note WebGL constants are stored globally on the WebGL context, not the VertexArray\n * so they need to be updated before every render\n * @todo - remember/cache values to avoid setting them unnecessarily?\n */\n setConstantAttributeWebGL(location: number, constant: TypedArray): void {\n const maxVertexAttributes = this.limits.maxVertexAttributes;\n this._constants = this._constants || new Array(maxVertexAttributes).fill(null);\n const currentConstant = this._constants[location];\n if (currentConstant && compareConstantArrayValues(currentConstant, constant)) {\n log.info(\n 1,\n `setConstantAttributeWebGL(${location}) could have been skipped, value unchanged`\n )();\n }\n this._constants[location] = constant;\n\n switch (constant.constructor) {\n case Float32Array:\n setConstantFloatArray(this, location, constant as Float32Array);\n break;\n case Int32Array:\n setConstantIntArray(this, location, constant as Int32Array);\n break;\n case Uint32Array:\n setConstantUintArray(this, location, constant as Uint32Array);\n break;\n default:\n throw new Error('constant');\n }\n }\n\n /** Ensure extensions are only requested once */\n getExtension(name: keyof GLExtensions): GLExtensions {\n getWebGLExtension(this.gl, name, this._extensions);\n return this._extensions;\n }\n}\n\n/** Set constant float array attribute */\nfunction setConstantFloatArray(device: WebGLDevice, location: number, array: Float32Array): void {\n switch (array.length) {\n case 1:\n device.gl.vertexAttrib1fv(location, array);\n break;\n case 2:\n device.gl.vertexAttrib2fv(location, array);\n break;\n case 3:\n device.gl.vertexAttrib3fv(location, array);\n break;\n case 4:\n device.gl.vertexAttrib4fv(location, array);\n break;\n default:\n // assert(false);\n }\n}\n\n/** Set constant signed int array attribute */\nfunction setConstantIntArray(device: WebGLDevice, location: number, array: Int32Array): void {\n device.gl.vertexAttribI4iv(location, array);\n // TODO - not clear if we need to use the special forms, more testing needed\n // switch (array.length) {\n // case 1:\n // gl.vertexAttribI1iv(location, array);\n // break;\n // case 2:\n // gl.vertexAttribI2iv(location, array);\n // break;\n // case 3:\n // gl.vertexAttribI3iv(location, array);\n // break;\n // case 4:\n // break;\n // default:\n // assert(false);\n // }\n}\n\n/** Set constant unsigned int array attribute */\nfunction setConstantUintArray(device: WebGLDevice, location: number, array: Uint32Array) {\n device.gl.vertexAttribI4uiv(location, array);\n // TODO - not clear if we need to use the special forms, more testing needed\n // switch (array.length) {\n // case 1:\n // gl.vertexAttribI1uiv(location, array);\n // break;\n // case 2:\n // gl.vertexAttribI2uiv(location, array);\n // break;\n // case 3:\n // gl.vertexAttribI3uiv(location, array);\n // break;\n // case 4:\n // gl.vertexAttribI4uiv(location, array);\n // break;\n // default:\n // assert(false);\n // }\n}\n\n/**\n * Compares contents of two typed arrays\n * @todo max length?\n */\nfunction compareConstantArrayValues(v1: TypedArray, v2: TypedArray): boolean {\n if (!v1 || !v2 || v1.length !== v2.length || v1.constructor !== v2.constructor) {\n return false;\n }\n for (let i = 0; i < v1.length; ++i) {\n if (v1[i] !== v2[i]) {\n return false;\n }\n }\n return true;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Tables describing WebGL parameters\nimport {GL, GLParameters} from '@luma.gl/constants';\n\n// DEFAULT SETTINGS - FOR FAST CACHE INITIALIZATION AND CONTEXT RESETS\n\n/* eslint-disable no-shadow */\n\nexport const GL_PARAMETER_DEFAULTS: GLParameters = {\n [GL.BLEND]: false,\n [GL.BLEND_COLOR]: new Float32Array([0, 0, 0, 0]),\n [GL.BLEND_EQUATION_RGB]: GL.FUNC_ADD,\n [GL.BLEND_EQUATION_ALPHA]: GL.FUNC_ADD,\n [GL.BLEND_SRC_RGB]: GL.ONE,\n [GL.BLEND_DST_RGB]: GL.ZERO,\n [GL.BLEND_SRC_ALPHA]: GL.ONE,\n [GL.BLEND_DST_ALPHA]: GL.ZERO,\n [GL.COLOR_CLEAR_VALUE]: new Float32Array([0, 0, 0, 0]), // TBD\n [GL.COLOR_WRITEMASK]: [true, true, true, true],\n [GL.CULL_FACE]: false,\n [GL.CULL_FACE_MODE]: GL.BACK,\n [GL.DEPTH_TEST]: false,\n [GL.DEPTH_CLEAR_VALUE]: 1,\n [GL.DEPTH_FUNC]: GL.LESS,\n [GL.DEPTH_RANGE]: new Float32Array([0, 1]), // TBD\n [GL.DEPTH_WRITEMASK]: true,\n [GL.DITHER]: true,\n [GL.CURRENT_PROGRAM]: null,\n // FRAMEBUFFER_BINDING and DRAW_FRAMEBUFFER_BINDING(WebGL2) refer same state.\n [GL.FRAMEBUFFER_BINDING]: null,\n [GL.RENDERBUFFER_BINDING]: null,\n [GL.VERTEX_ARRAY_BINDING]: null,\n [GL.ARRAY_BUFFER_BINDING]: null,\n [GL.FRONT_FACE]: GL.CCW,\n [GL.GENERATE_MIPMAP_HINT]: GL.DONT_CARE,\n [GL.LINE_WIDTH]: 1,\n [GL.POLYGON_OFFSET_FILL]: false,\n [GL.POLYGON_OFFSET_FACTOR]: 0,\n [GL.POLYGON_OFFSET_UNITS]: 0,\n [GL.SAMPLE_ALPHA_TO_COVERAGE]: false,\n [GL.SAMPLE_COVERAGE]: false,\n [GL.SAMPLE_COVERAGE_VALUE]: 1.0,\n [GL.SAMPLE_COVERAGE_INVERT]: false,\n [GL.SCISSOR_TEST]: false,\n // Note: Dynamic value. If scissor test enabled we expect users to set correct scissor box\n [GL.SCISSOR_BOX]: new Int32Array([0, 0, 1024, 1024]),\n [GL.STENCIL_TEST]: false,\n [GL.STENCIL_CLEAR_VALUE]: 0,\n [GL.STENCIL_WRITEMASK]: 0xffffffff,\n [GL.STENCIL_BACK_WRITEMASK]: 0xffffffff,\n [GL.STENCIL_FUNC]: GL.ALWAYS,\n [GL.STENCIL_REF]: 0,\n [GL.STENCIL_VALUE_MASK]: 0xffffffff,\n [GL.STENCIL_BACK_FUNC]: GL.ALWAYS,\n [GL.STENCIL_BACK_REF]: 0,\n [GL.STENCIL_BACK_VALUE_MASK]: 0xffffffff,\n [GL.STENCIL_FAIL]: GL.KEEP,\n [GL.STENCIL_PASS_DEPTH_FAIL]: GL.KEEP,\n [GL.STENCIL_PASS_DEPTH_PASS]: GL.KEEP,\n [GL.STENCIL_BACK_FAIL]: GL.KEEP,\n [GL.STENCIL_BACK_PASS_DEPTH_FAIL]: GL.KEEP,\n [GL.STENCIL_BACK_PASS_DEPTH_PASS]: GL.KEEP,\n // Dynamic value: We use [0, 0, 1024, 1024] as default, but usually this is updated in each frame.\n [GL.VIEWPORT]: [0, 0, 1024, 1024],\n\n [GL.TRANSFORM_FEEDBACK_BINDING]: null,\n [GL.COPY_READ_BUFFER_BINDING]: null,\n [GL.COPY_WRITE_BUFFER_BINDING]: null,\n [GL.PIXEL_PACK_BUFFER_BINDING]: null,\n [GL.PIXEL_UNPACK_BUFFER_BINDING]: null,\n [GL.FRAGMENT_SHADER_DERIVATIVE_HINT]: GL.DONT_CARE,\n [GL.READ_FRAMEBUFFER_BINDING]: null,\n [GL.RASTERIZER_DISCARD]: false,\n\n [GL.PACK_ALIGNMENT]: 4,\n [GL.UNPACK_ALIGNMENT]: 4,\n [GL.UNPACK_FLIP_Y_WEBGL]: false,\n [GL.UNPACK_PREMULTIPLY_ALPHA_WEBGL]: false,\n [GL.UNPACK_COLORSPACE_CONVERSION_WEBGL]: GL.BROWSER_DEFAULT_WEBGL,\n [GL.PACK_ROW_LENGTH]: 0,\n [GL.PACK_SKIP_PIXELS]: 0,\n [GL.PACK_SKIP_ROWS]: 0,\n [GL.UNPACK_ROW_LENGTH]: 0,\n [GL.UNPACK_IMAGE_HEIGHT]: 0,\n [GL.UNPACK_SKIP_PIXELS]: 0,\n [GL.UNPACK_SKIP_ROWS]: 0,\n [GL.UNPACK_SKIP_IMAGES]: 0\n};\n\n// SETTER TABLES - ENABLES SETTING ANY PARAMETER WITH A COMMON API\n\nconst enable = (gl: WebGL2RenderingContext, value: unknown, key: GL) =>\n value ? gl.enable(key) : gl.disable(key);\nconst hint = (gl: WebGL2RenderingContext, value: GL, key: GL) => gl.hint(key, value);\nconst pixelStorei = (gl: WebGL2RenderingContext, value: number | boolean, key: GL) =>\n gl.pixelStorei(key, value);\n\nconst bindFramebuffer = (gl: WebGL2RenderingContext, value: unknown, key: GL) => {\n const target = key === GL.FRAMEBUFFER_BINDING ? GL.DRAW_FRAMEBUFFER : GL.READ_FRAMEBUFFER;\n return gl.bindFramebuffer(target, value as WebGLFramebuffer);\n};\n\nconst bindBuffer = (gl: WebGL2RenderingContext, value: unknown, key: GL) => {\n const bindingMap: Partial<Record<GL, GL>> = {\n [GL.ARRAY_BUFFER_BINDING]: GL.ARRAY_BUFFER,\n [GL.COPY_READ_BUFFER_BINDING]: GL.COPY_READ_BUFFER,\n [GL.COPY_WRITE_BUFFER_BINDING]: GL.COPY_WRITE_BUFFER,\n [GL.PIXEL_PACK_BUFFER_BINDING]: GL.PIXEL_PACK_BUFFER,\n [GL.PIXEL_UNPACK_BUFFER_BINDING]: GL.PIXEL_UNPACK_BUFFER\n };\n const glTarget = bindingMap[key];\n\n gl.bindBuffer(glTarget as number, value as WebGLBuffer | null);\n};\n\n// Utility\nfunction isArray(array: unknown): boolean {\n return Array.isArray(array) || (ArrayBuffer.isView(array) && !(array instanceof DataView));\n}\n\n// Map from WebGL parameter names to corresponding WebGL setter functions\n// WegGL constants are read by parameter names, but set by function names\n// NOTE: When value type is a string, it will be handled by 'GL_COMPOSITE_PARAMETER_SETTERS'\nexport const GL_PARAMETER_SETTERS = {\n [GL.BLEND]: enable,\n [GL.BLEND_COLOR]: (gl: WebGL2RenderingContext, value: [number, number, number, number]) =>\n gl.blendColor(...value),\n [GL.BLEND_EQUATION_RGB]: 'blendEquation',\n [GL.BLEND_EQUATION_ALPHA]: 'blendEquation',\n [GL.BLEND_SRC_RGB]: 'blendFunc',\n [GL.BLEND_DST_RGB]: 'blendFunc',\n [GL.BLEND_SRC_ALPHA]: 'blendFunc',\n [GL.BLEND_DST_ALPHA]: 'blendFunc',\n [GL.COLOR_CLEAR_VALUE]: (gl: WebGL2RenderingContext, value: [number, number, number, number]) =>\n gl.clearColor(...value),\n [GL.COLOR_WRITEMASK]: (gl: WebGL2RenderingContext, value: [boolean, boolean, boolean, boolean]) =>\n gl.colorMask(...value),\n [GL.CULL_FACE]: enable,\n [GL.CULL_FACE_MODE]: (gl: WebGL2RenderingContext, value) => gl.cullFace(value),\n [GL.DEPTH_TEST]: enable,\n [GL.DEPTH_CLEAR_VALUE]: (gl: WebGL2RenderingContext, value) => gl.clearDepth(value),\n [GL.DEPTH_FUNC]: (gl: WebGL2RenderingContext, value) => gl.depthFunc(value),\n [GL.DEPTH_RANGE]: (gl: WebGL2RenderingContext, value: [number, number]) =>\n gl.depthRange(...value),\n [GL.DEPTH_WRITEMASK]: (gl: WebGL2RenderingContext, value) => gl.depthMask(value),\n [GL.DITHER]: enable,\n [GL.FRAGMENT_SHADER_DERIVATIVE_HINT]: hint,\n\n [GL.CURRENT_PROGRAM]: (gl: WebGL2RenderingContext, value) => gl.useProgram(value),\n [GL.RENDERBUFFER_BINDING]: (gl: WebGL2RenderingContext, value) =>\n gl.bindRenderbuffer(GL.RENDERBUFFER, value),\n [GL.TRANSFORM_FEEDBACK_BINDING]: (gl: WebGL2RenderingContext, value) =>\n gl.bindTransformFeedback?.(GL.TRANSFORM_FEEDBACK, value),\n [GL.VERTEX_ARRAY_BINDING]: (gl: WebGL2RenderingContext, value) => gl.bindVertexArray(value),\n // NOTE: FRAMEBUFFER_BINDING and DRAW_FRAMEBUFFER_BINDING(WebGL2) refer same state.\n [GL.FRAMEBUFFER_BINDING]: bindFramebuffer,\n [GL.READ_FRAMEBUFFER_BINDING]: bindFramebuffer,\n\n // Buffers\n [GL.ARRAY_BUFFER_BINDING]: bindBuffer,\n [GL.COPY_READ_BUFFER_BINDING]: bindBuffer,\n [GL.COPY_WRITE_BUFFER_BINDING]: bindBuffer,\n [GL.PIXEL_PACK_BUFFER_BINDING]: bindBuffer,\n [GL.PIXEL_UNPACK_BUFFER_BINDING]: bindBuffer,\n\n [GL.FRONT_FACE]: (gl: WebGL2RenderingContext, value) => gl.frontFace(value),\n [GL.GENERATE_MIPMAP_HINT]: hint,\n [GL.LINE_WIDTH]: (gl: WebGL2RenderingContext, value) => gl.lineWidth(value),\n [GL.POLYGON_OFFSET_FILL]: enable,\n [GL.POLYGON_OFFSET_FACTOR]: 'polygonOffset',\n [GL.POLYGON_OFFSET_UNITS]: 'polygonOffset',\n [GL.RASTERIZER_DISCARD]: enable,\n [GL.SAMPLE_ALPHA_TO_COVERAGE]: enable,\n [GL.SAMPLE_COVERAGE]: enable,\n [GL.SAMPLE_COVERAGE_VALUE]: 'sampleCoverage',\n [GL.SAMPLE_COVERAGE_INVERT]: 'sampleCoverage',\n [GL.SCISSOR_TEST]: enable,\n [GL.SCISSOR_BOX]: (gl: WebGL2RenderingContext, value: [number, number, number, number]) =>\n gl.scissor(...value),\n [GL.STENCIL_TEST]: enable,\n [GL.STENCIL_CLEAR_VALUE]: (gl: WebGL2RenderingContext, value) => gl.clearStencil(value),\n [GL.STENCIL_WRITEMASK]: (gl: WebGL2RenderingContext, value) =>\n gl.stencilMaskSeparate(GL.FRONT, value),\n [GL.STENCIL_BACK_WRITEMASK]: (gl: WebGL2RenderingContext, value) =>\n gl.stencilMaskSeparate(GL.BACK, value),\n [GL.STENCIL_FUNC]: 'stencilFuncFront',\n [GL.STENCIL_REF]: 'stencilFuncFront',\n [GL.STENCIL_VALUE_MASK]: 'stencilFuncFront',\n [GL.STENCIL_BACK_FUNC]: 'stencilFuncBack',\n [GL.STENCIL_BACK_REF]: 'stencilFuncBack',\n [GL.STENCIL_BACK_VALUE_MASK]: 'stencilFuncBack',\n [GL.STENCIL_FAIL]: 'stencilOpFront',\n [GL.STENCIL_PASS_DEPTH_FAIL]: 'stencilOpFront',\n [GL.STENCIL_PASS_DEPTH_PASS]: 'stencilOpFront',\n [GL.STENCIL_BACK_FAIL]: 'stencilOpBack',\n [GL.STENCIL_BACK_PASS_DEPTH_FAIL]: 'stencilOpBack',\n [GL.STENCIL_BACK_PASS_DEPTH_PASS]: 'stencilOpBack',\n [GL.VIEWPORT]: (gl: WebGL2RenderingContext, value: [number, number, number, number]) =>\n gl.viewport(...value),\n\n // WEBGL2 EXTENSIONS\n\n // EXT_depth_clamp https://registry.khronos.org/webgl/extensions/EXT_depth_clamp/\n\n [GL.DEPTH_CLAMP_EXT]: enable,\n\n // WEBGL_provoking_vertex https://registry.khronos.org/webgl/extensions/WEBGL_provoking_vertex/\n\n // [GL.PROVOKING_VERTEX_WEBL]: TODO - extension function needed\n\n // WEBGL_polygon_mode https://registry.khronos.org/webgl/extensions/WEBGL_polygon_mode/\n\n // POLYGON_MODE_WEBGL TODO - extension function needed\n [GL.POLYGON_OFFSET_LINE_WEBGL]: enable,\n\n // WEBGL_clip_cull_distance https://registry.khronos.org/webgl/extensions/WEBGL_clip_cull_distance/\n\n [GL.CLIP_DISTANCE0_WEBGL]: enable,\n [GL.CLIP_DISTANCE1_WEBGL]: enable,\n [GL.CLIP_DISTANCE2_WEBGL]: enable,\n [GL.CLIP_DISTANCE3_WEBGL]: enable,\n [GL.CLIP_DISTANCE4_WEBGL]: enable,\n [GL.CLIP_DISTANCE5_WEBGL]: enable,\n [GL.CLIP_DISTANCE6_WEBGL]: enable,\n [GL.CLIP_DISTANCE7_WEBGL]: enable,\n\n // PIXEL PACK/UNPACK MODES\n [GL.PACK_ALIGNMENT]: pixelStorei,\n [GL.UNPACK_ALIGNMENT]: pixelStorei,\n [GL.UNPACK_FLIP_Y_WEBGL]: pixelStorei,\n [GL.UNPACK_PREMULTIPLY_ALPHA_WEBGL]: pixelStorei,\n [GL.UNPACK_COLORSPACE_CONVERSION_WEBGL]: pixelStorei,\n [GL.PACK_ROW_LENGTH]: pixelStorei,\n [GL.PACK_SKIP_PIXELS]: pixelStorei,\n [GL.PACK_SKIP_ROWS]: pixelStorei,\n [GL.UNPACK_ROW_LENGTH]: pixelStorei,\n [GL.UNPACK_IMAGE_HEIGHT]: pixelStorei,\n [GL.UNPACK_SKIP_PIXELS]: pixelStorei,\n [GL.UNPACK_SKIP_ROWS]: pixelStorei,\n [GL.UNPACK_SKIP_IMAGES]: pixelStorei,\n\n // Function-style setters\n framebuffer: (gl: WebGL2RenderingContext, framebuffer) => {\n // accepts 1) a WebGLFramebuffer 2) null (default framebuffer), or 3) luma.gl Framebuffer class\n // framebuffer is null when restoring to default framebuffer, otherwise use the WebGL handle.\n const handle = framebuffer && 'handle' in framebuffer ? framebuffer.handle : framebuffer;\n return gl.bindFramebuffer(GL.FRAMEBUFFER, handle);\n },\n blend: (gl: WebGL2RenderingContext, value) =>\n value ? gl.enable(GL.BLEND) : gl.disable(GL.BLEND),\n blendColor: (gl: WebGL2RenderingContext, value: [number, number, number, number]) =>\n gl.blendColor(...value),\n blendEquation: (gl: WebGL2RenderingContext, args: number | [number, number]) => {\n const separateModes = typeof args === 'number' ? ([args, args] as [number, number]) : args;\n gl.blendEquationSeparate(...separateModes);\n },\n blendFunc: (\n gl: WebGL2RenderingContext,\n args: [number, number] | [number, number, number, number]\n ) => {\n const separateFuncs =\n args?.length === 2 ? ([...args, ...args] as [number, number, number, number]) : args;\n gl.blendFuncSeparate(...separateFuncs);\n },\n\n clearColor: (gl: WebGL2RenderingContext, value: [number, number, number, number]) =>\n gl.clearColor(...value),\n clearDepth: (gl: WebGL2RenderingContext, value) => gl.clearDepth(value),\n clearStencil: (gl: WebGL2RenderingContext, value) => gl.clearStencil(value),\n\n colorMask: (gl: WebGL2RenderingContext, value: [boolean, boolean, boolean, boolean]) =>\n gl.colorMask(...value),\n\n cull: (gl: WebGL2RenderingContext, value) =>\n value ? gl.enable(GL.CULL_FACE) : gl.disable(GL.CULL_FACE),\n cullFace: (gl: WebGL2RenderingContext, value) => gl.cullFace(value),\n\n depthTest: (gl: WebGL2RenderingContext, value) =>\n value ? gl.enable(GL.DEPTH_TEST) : gl.disable(GL.DEPTH_TEST),\n depthFunc: (gl: WebGL2RenderingContext, value) => gl.depthFunc(value),\n depthMask: (gl: WebGL2RenderingContext, value) => gl.depthMask(value),\n depthRange: (gl: WebGL2RenderingContext, value: [number, number]) => gl.depthRange(...value),\n\n dither: (gl: WebGL2RenderingContext, value) =>\n value ? gl.enable(GL.DITHER) : gl.disable(GL.DITHER),\n\n derivativeHint: (gl: WebGL2RenderingContext, value) => {\n // gl1: 'OES_standard_derivatives'\n gl.hint(GL.FRAGMENT_SHADER_DERIVATIVE_HINT, value);\n },\n\n frontFace: (gl: WebGL2RenderingContext, value) => gl.frontFace(value),\n\n mipmapHint: (gl: WebGL2RenderingContext, value) => gl.hint(GL.GENERATE_MIPMAP_HINT, value),\n\n lineWidth: (gl: WebGL2RenderingContext, value) => gl.lineWidth(value),\n\n polygonOffsetFill: (gl: WebGL2RenderingContext, value) =>\n value ? gl.enable(GL.POLYGON_OFFSET_FILL) : gl.disable(GL.POLYGON_OFFSET_FILL),\n polygonOffset: (gl: WebGL2RenderingContext, value: [number, number]) =>\n gl.polygonOffset(...value),\n\n sampleCoverage: (gl: WebGL2RenderingContext, value: [number, boolean?]) =>\n gl.sampleCoverage(value[0], value[1] || false),\n\n scissorTest: (gl: WebGL2RenderingContext, value) =>\n value ? gl.enable(GL.SCISSOR_TEST) : gl.disable(GL.SCISSOR_TEST),\n scissor: (gl: WebGL2RenderingContext, value: [number, number, number, number]) =>\n gl.scissor(...value),\n\n stencilTest: (gl: WebGL2RenderingContext, value) =>\n value ? gl.enable(GL.STENCIL_TEST) : gl.disable(GL.STENCIL_TEST),\n stencilMask: (gl: WebGL2RenderingContext, value) => {\n value = isArray(value) ? value : [value, value];\n const [mask, backMask] = value;\n gl.stencilMaskSeparate(GL.FRONT, mask);\n gl.stencilMaskSeparate(GL.BACK, backMask);\n },\n stencilFunc: (gl: WebGL2RenderingContext, args) => {\n args = isArray(args) && args.length === 3 ? [...args, ...args] : args;\n const [func, ref, mask, backFunc, backRef, backMask] = args;\n gl.stencilFuncSeparate(GL.FRONT, func, ref, mask);\n gl.stencilFuncSeparate(GL.BACK, backFunc, backRef, backMask);\n },\n stencilOp: (gl: WebGL2RenderingContext, args) => {\n args = isArray(args) && args.length === 3 ? [...args, ...args] : args;\n const [sfail, dpfail, dppass, backSfail, backDpfail, backDppass] = args;\n gl.stencilOpSeparate(GL.FRONT, sfail, dpfail, dppass);\n gl.stencilOpSeparate(GL.BACK, backSfail, backDpfail, backDppass);\n },\n\n viewport: (gl: WebGL2RenderingContext, value: [number, number, number, number]) =>\n gl.viewport(...value)\n};\n\nfunction getValue(glEnum, values, cache) {\n return values[glEnum] !== undefined ? values[glEnum] : cache[glEnum];\n}\n\n// COMPOSITE_WEBGL_PARAMETER_\nexport const GL_COMPOSITE_PARAMETER_SETTERS = {\n blendEquation: (gl: WebGL2RenderingContext, values, cache) =>\n gl.blendEquationSeparate(\n getValue(GL.BLEND_EQUATION_RGB, values, cache),\n getValue(GL.BLEND_EQUATION_ALPHA, values, cache)\n ),\n blendFunc: (gl: WebGL2RenderingContext, values, cache) =>\n gl.blendFuncSeparate(\n getValue(GL.BLEND_SRC_RGB, values, cache),\n getValue(GL.BLEND_DST_RGB, values, cache),\n getValue(GL.BLEND_SRC_ALPHA, values, cache),\n getValue(GL.BLEND_DST_ALPHA, values, cache)\n ),\n polygonOffset: (gl: WebGL2RenderingContext, values, cache) =>\n gl.polygonOffset(\n getValue(GL.POLYGON_OFFSET_FACTOR, values, cache),\n getValue(GL.POLYGON_OFFSET_UNITS, values, cache)\n ),\n sampleCoverage: (gl: WebGL2RenderingContext, values, cache) =>\n gl.sampleCoverage(\n getValue(GL.SAMPLE_COVERAGE_VALUE, values, cache),\n getValue(GL.SAMPLE_COVERAGE_INVERT, values, cache)\n ),\n stencilFuncFront: (gl: WebGL2RenderingContext, values, cache) =>\n gl.stencilFuncSeparate(\n GL.FRONT,\n getValue(GL.STENCIL_FUNC, values, cache),\n getValue(GL.STENCIL_REF, values, cache),\n getValue(GL.STENCIL_VALUE_MASK, values, cache)\n ),\n stencilFuncBack: (gl: WebGL2RenderingContext, values, cache) =>\n gl.stencilFuncSeparate(\n GL.BACK,\n getValue(GL.STENCIL_BACK_FUNC, values, cache),\n getValue(GL.STENCIL_BACK_REF, values, cache),\n getValue(GL.STENCIL_BACK_VALUE_MASK, values, cache)\n ),\n stencilOpFront: (gl: WebGL2RenderingContext, values, cache) =>\n gl.stencilOpSeparate(\n GL.FRONT,\n getValue(GL.STENCIL_FAIL, values, cache),\n getValue(GL.STENCIL_PASS_DEPTH_FAIL, values, cache),\n getValue(GL.STENCIL_PASS_DEPTH_PASS, values, cache)\n ),\n stencilOpBack: (gl: WebGL2RenderingContext, values, cache) =>\n gl.stencilOpSeparate(\n GL.BACK,\n getValue(GL.STENCIL_BACK_FAIL, values, cache),\n getValue(GL.STENCIL_BACK_PASS_DEPTH_FAIL, values, cache),\n getValue(GL.STENCIL_BACK_PASS_DEPTH_PASS, values, cache)\n )\n};\n\ntype UpdateFunc = (params: Record<string, any>) => void;\n\n// Setter functions intercepted for cache updates\nexport const GL_HOOKED_SETTERS = {\n // GENERIC SETTERS\n\n enable: (update: UpdateFunc, capability: GL) =>\n update({\n [capability]: true\n }),\n disable: (update: UpdateFunc, capability: GL) =>\n update({\n [capability]: false\n }),\n pixelStorei: (update: UpdateFunc, pname: GL, value) =>\n update({\n [pname]: value\n }),\n hint: (update: UpdateFunc, pname: GL, value: GL) =>\n update({\n [pname]: value\n }),\n\n // SPECIFIC SETTERS\n useProgram: (update: UpdateFunc, value) =>\n update({\n [GL.CURRENT_PROGRAM]: value\n }),\n bindRenderbuffer: (update: UpdateFunc, target, value) =>\n update({\n [GL.RENDERBUFFER_BINDING]: value\n }),\n bindTransformFeedback: (update: UpdateFunc, target, value) =>\n update({\n [GL.TRANSFORM_FEEDBACK_BINDING]: value\n }),\n bindVertexArray: (update: UpdateFunc, value) =>\n update({\n [GL.VERTEX_ARRAY_BINDING]: value\n }),\n\n bindFramebuffer: (update: UpdateFunc, target, framebuffer) => {\n switch (target) {\n case GL.FRAMEBUFFER:\n return update({\n [GL.DRAW_FRAMEBUFFER_BINDING]: framebuffer,\n [GL.READ_FRAMEBUFFER_BINDING]: framebuffer\n });\n case GL.DRAW_FRAMEBUFFER:\n return update({[GL.DRAW_FRAMEBUFFER_BINDING]: framebuffer});\n case GL.READ_FRAMEBUFFER:\n return update({[GL.READ_FRAMEBUFFER_BINDING]: framebuffer});\n default:\n return null;\n }\n },\n bindBuffer: (update: UpdateFunc, target, buffer) => {\n const pname = {\n [GL.ARRAY_BUFFER]: [GL.ARRAY_BUFFER_BINDING],\n [GL.COPY_READ_BUFFER]: [GL.COPY_READ_BUFFER_BINDING],\n [GL.COPY_WRITE_BUFFER]: [GL.COPY_WRITE_BUFFER_BINDING],\n [GL.PIXEL_PACK_BUFFER]: [GL.PIXEL_PACK_BUFFER_BINDING],\n [GL.PIXEL_UNPACK_BUFFER]: [GL.PIXEL_UNPACK_BUFFER_BINDING]\n }[target];\n\n if (pname) {\n return update({[pname]: buffer});\n }\n // targets that should not be cached\n return {valueChanged: true};\n },\n\n blendColor: (update: UpdateFunc, r: number, g: number, b: number, a: number) =>\n update({\n [GL.BLEND_COLOR]: new Float32Array([r, g, b, a])\n }),\n\n blendEquation: (update: UpdateFunc, mode) =>\n update({\n [GL.BLEND_EQUATION_RGB]: mode,\n [GL.BLEND_EQUATION_ALPHA]: mode\n }),\n\n blendEquationSeparate: (update: UpdateFunc, modeRGB, modeAlpha) =>\n update({\n [GL.BLEND_EQUATION_RGB]: modeRGB,\n [GL.BLEND_EQUATION_ALPHA]: modeAlpha\n }),\n\n blendFunc: (update: UpdateFunc, src, dst) =>\n update({\n [GL.BLEND_SRC_RGB]: src,\n [GL.BLEND_DST_RGB]: dst,\n [GL.BLEND_SRC_ALPHA]: src,\n [GL.BLEND_DST_ALPHA]: dst\n }),\n\n blendFuncSeparate: (update: UpdateFunc, srcRGB, dstRGB, srcAlpha, dstAlpha) =>\n update({\n [GL.BLEND_SRC_RGB]: srcRGB,\n [GL.BLEND_DST_RGB]: dstRGB,\n [GL.BLEND_SRC_ALPHA]: srcAlpha,\n [GL.BLEND_DST_ALPHA]: dstAlpha\n }),\n\n clearColor: (update: UpdateFunc, r: number, g: number, b: number, a: number) =>\n update({\n [GL.COLOR_CLEAR_VALUE]: new Float32Array([r, g, b, a])\n }),\n\n clearDepth: (update: UpdateFunc, depth: number) =>\n update({\n [GL.DEPTH_CLEAR_VALUE]: depth\n }),\n\n clearStencil: (update: UpdateFunc, s: number) =>\n update({\n [GL.STENCIL_CLEAR_VALUE]: s\n }),\n\n colorMask: (update: UpdateFunc, r: number, g: number, b: number, a: number) =>\n update({\n [GL.COLOR_WRITEMASK]: [r, g, b, a]\n }),\n\n cullFace: (update: UpdateFunc, mode) =>\n update({\n [GL.CULL_FACE_MODE]: mode\n }),\n\n depthFunc: (update: UpdateFunc, func) =>\n update({\n [GL.DEPTH_FUNC]: func\n }),\n\n depthRange: (update: UpdateFunc, zNear: number, zFar: number) =>\n update({\n [GL.DEPTH_RANGE]: new Float32Array([zNear, zFar])\n }),\n\n depthMask: (update: UpdateFunc, mask: number) =>\n update({\n [GL.DEPTH_WRITEMASK]: mask\n }),\n\n frontFace: (update: UpdateFunc, face) =>\n update({\n [GL.FRONT_FACE]: face\n }),\n\n lineWidth: (update: UpdateFunc, width) =>\n update({\n [GL.LINE_WIDTH]: width\n }),\n\n polygonOffset: (update: UpdateFunc, factor, units) =>\n update({\n [GL.POLYGON_OFFSET_FACTOR]: factor,\n [GL.POLYGON_OFFSET_UNITS]: units\n }),\n\n sampleCoverage: (update: UpdateFunc, value, invert) =>\n update({\n [GL.SAMPLE_COVERAGE_VALUE]: value,\n [GL.SAMPLE_COVERAGE_INVERT]: invert\n }),\n\n scissor: (update: UpdateFunc, x, y, width, height) =>\n update({\n [GL.SCISSOR_BOX]: new Int32Array([x, y, width, height])\n }),\n\n stencilMask: (update: UpdateFunc, mask) =>\n update({\n [GL.STENCIL_WRITEMASK]: mask,\n [GL.STENCIL_BACK_WRITEMASK]: mask\n }),\n\n stencilMaskSeparate: (update: UpdateFunc, face, mask) =>\n update({\n [face === GL.FRONT ? GL.STENCIL_WRITEMASK : GL.STENCIL_BACK_WRITEMASK]: mask\n }),\n\n stencilFunc: (update: UpdateFunc, func, ref, mask) =>\n update({\n [GL.STENCIL_FUNC]: func,\n [GL.STENCIL_REF]: ref,\n [GL.STENCIL_VALUE_MASK]: mask,\n [GL.STENCIL_BACK_FUNC]: func,\n [GL.STENCIL_BACK_REF]: ref,\n [GL.STENCIL_BACK_VALUE_MASK]: mask\n }),\n\n stencilFuncSeparate: (update: UpdateFunc, face, func, ref, mask) =>\n update({\n [face === GL.FRONT ? GL.STENCIL_FUNC : GL.STENCIL_BACK_FUNC]: func,\n [face === GL.FRONT ? GL.STENCIL_REF : GL.STENCIL_BACK_REF]: ref,\n [face === GL.FRONT ? GL.STENCIL_VALUE_MASK : GL.STENCIL_BACK_VALUE_MASK]: mask\n }),\n\n stencilOp: (update: UpdateFunc, fail, zfail, zpass) =>\n update({\n [GL.STENCIL_FAIL]: fail,\n [GL.STENCIL_PASS_DEPTH_FAIL]: zfail,\n [GL.STENCIL_PASS_DEPTH_PASS]: zpass,\n [GL.STENCIL_BACK_FAIL]: fail,\n [GL.STENCIL_BACK_PASS_DEPTH_FAIL]: zfail,\n [GL.STENCIL_BACK_PASS_DEPTH_PASS]: zpass\n }),\n\n stencilOpSeparate: (update: UpdateFunc, face, fail, zfail, zpass) =>\n update({\n [face === GL.FRONT ? GL.STENCIL_FAIL : GL.STENCIL_BACK_FAIL]: fail,\n [face === GL.FRONT ? GL.STENCIL_PASS_DEPTH_FAIL : GL.STENCIL_BACK_PASS_DEPTH_FAIL]: zfail,\n [face === GL.FRONT ? GL.STENCIL_PASS_DEPTH_PASS : GL.STENCIL_BACK_PASS_DEPTH_PASS]: zpass\n }),\n\n viewport: (update: UpdateFunc, x, y, width, height) =>\n update({\n [GL.VIEWPORT]: [x, y, width, height]\n })\n};\n\n// GETTER TABLE - FOR READING OUT AN ENTIRE CONTEXT\n\nconst isEnabled = (gl: WebGL2RenderingContext, key) => gl.isEnabled(key);\n\n// Exceptions for any keys that cannot be queried by gl.getParameters\nexport const GL_PARAMETER_GETTERS = {\n [GL.BLEND]: isEnabled,\n [GL.CULL_FACE]: isEnabled,\n [GL.DEPTH_TEST]: isEnabled,\n [GL.DITHER]: isEnabled,\n [GL.POLYGON_OFFSET_FILL]: isEnabled,\n [GL.SAMPLE_ALPHA_TO_COVERAGE]: isEnabled,\n [GL.SAMPLE_COVERAGE]: isEnabled,\n [GL.SCISSOR_TEST]: isEnabled,\n [GL.STENCIL_TEST]: isEnabled,\n [GL.RASTERIZER_DISCARD]: isEnabled\n};\n\nexport const NON_CACHE_PARAMETERS = new Set([\n // setter not intercepted\n GL.ACTIVE_TEXTURE,\n GL.TRANSFORM_FEEDBACK_ACTIVE,\n GL.TRANSFORM_FEEDBACK_PAUSED,\n\n // setters bindBufferRange/bindBufferBase cannot be pruned based on cache\n GL.TRANSFORM_FEEDBACK_BUFFER_BINDING,\n GL.UNIFORM_BUFFER_BINDING,\n\n // states depending on VERTEX_ARRAY_BINDING\n GL.ELEMENT_ARRAY_BUFFER_BINDING,\n // states depending on READ_FRAMEBUFFER_BINDING\n GL.IMPLEMENTATION_COLOR_READ_FORMAT,\n GL.IMPLEMENTATION_COLOR_READ_TYPE,\n // states depending on FRAMEBUFFER_BINDING\n GL.READ_BUFFER,\n GL.DRAW_BUFFER0,\n GL.DRAW_BUFFER1,\n GL.DRAW_BUFFER2,\n GL.DRAW_BUFFER3,\n GL.DRAW_BUFFER4,\n GL.DRAW_BUFFER5,\n GL.DRAW_BUFFER6,\n GL.DRAW_BUFFER7,\n GL.DRAW_BUFFER8,\n GL.DRAW_BUFFER9,\n GL.DRAW_BUFFER10,\n GL.DRAW_BUFFER11,\n GL.DRAW_BUFFER12,\n GL.DRAW_BUFFER13,\n GL.DRAW_BUFFER14,\n GL.DRAW_BUFFER15,\n // states depending on ACTIVE_TEXTURE\n GL.SAMPLER_BINDING,\n GL.TEXTURE_BINDING_2D,\n GL.TEXTURE_BINDING_2D_ARRAY,\n GL.TEXTURE_BINDING_3D,\n GL.TEXTURE_BINDING_CUBE_MAP\n]);\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Provides a unified API for getting and setting any WebGL parameter\n// Also knows default values of all parameters, enabling fast cache initialization\n// Provides base functionality for the state caching.\nimport type {GLParameters} from '@luma.gl/constants';\nimport {\n GL_PARAMETER_DEFAULTS,\n GL_PARAMETER_SETTERS,\n GL_COMPOSITE_PARAMETER_SETTERS,\n GL_PARAMETER_GETTERS\n} from './webgl-parameter-tables';\n\nexport type {GLParameters};\n\n/**\n * Sets any GL parameter regardless of function (gl.blendMode, ...)\n *\n * @note requires a `cache` object to be set on the context (gl.state.cache)\n * This object is used to fill in any missing values for composite setter functions\n */\nexport function setGLParameters(gl: WebGL2RenderingContext, parameters: GLParameters): void {\n if (isObjectEmpty(parameters)) {\n return;\n }\n\n const compositeSetters = {};\n\n // HANDLE PRIMITIVE SETTERS (and make note of any composite setters)\n\n for (const key in parameters) {\n const glConstant = Number(key);\n const setter = GL_PARAMETER_SETTERS[key];\n if (setter) {\n // Composite setters should only be called once, so save them\n if (typeof setter === 'string') {\n compositeSetters[setter] = true;\n } else {\n // if (gl[glConstant] !== undefined) {\n // TODO - added above check since this is being called on WebGL2 parameters in WebGL1...\n // TODO - deep equal on values? only call setter if value has changed?\n // NOTE - the setter will automatically update this.state\n setter(gl, parameters[key], glConstant);\n }\n }\n }\n\n // HANDLE COMPOSITE SETTERS\n\n // NOTE: any non-provided values needed by composite setters are filled in from state cache\n // The cache parameter is automatically retrieved from the context\n // This depends on `trackContextState`, which is technically a \"circular\" dependency.\n // But it is too inconvenient to always require a cache parameter here.\n // This is the ONLY external dependency in this module/\n // @ts-expect-error\n const cache = gl.state && gl.state.cache;\n if (cache) {\n for (const key in compositeSetters) {\n // TODO - avoid calling composite setters if values have not changed.\n const compositeSetter = GL_COMPOSITE_PARAMETER_SETTERS[key];\n // Note - if `trackContextState` has been called,\n // the setter will automatically update this.state.cache\n compositeSetter(gl, parameters, cache);\n }\n }\n\n // Add a log for the else case?\n}\n\n/**\n * Reads the entire WebGL state from a context\n\n // default to querying all parameters\n\n * @returns - a newly created map, with values keyed by GL parameters\n *\n * @note Copies the state from a context (gl.getParameter should not be overriden)\n * Reads the entire WebGL state from a context\n *\n * @note This can generates a huge amount of synchronous driver roundtrips and should be\n * considered a very slow operation, to be used only if/when a context already manipulated\n * by external code needs to be synchronized for the first time\n */\nexport function getGLParameters(\n gl: WebGL2RenderingContext,\n parameters: keyof GLParameters | (keyof GLParameters)[] | GLParameters = GL_PARAMETER_DEFAULTS\n): GLParameters {\n // support both arrays of parameters and objects (keys represent parameters)\n\n if (typeof parameters === 'number') {\n // single GL enum\n const key = parameters;\n const getter = GL_PARAMETER_GETTERS[key];\n return getter ? getter(gl, key) : gl.getParameter(key);\n }\n\n const parameterKeys = Array.isArray(parameters) ? parameters : Object.keys(parameters);\n\n const state = {};\n for (const key of parameterKeys) {\n const getter = GL_PARAMETER_GETTERS[key];\n state[key] = getter ? getter(gl, Number(key)) : gl.getParameter(Number(key));\n }\n return state;\n}\n\n/**\n * Reset all parameters to a (almost) pure context state\n * @note viewport and scissor will be set to the values in GL_PARAMETER_DEFAULTS,\n * NOT the canvas size dimensions, so they will have to be properly set after\n * calling this function.\n */\nexport function resetGLParameters(gl: WebGL2RenderingContext): void {\n setGLParameters(gl, GL_PARAMETER_DEFAULTS);\n}\n\n// Helpers\n\n// Returns true if given object is empty, false otherwise.\nfunction isObjectEmpty(object) {\n // @ts-ignore dummy key variable\n for (const key in object) {\n return false;\n }\n return true;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/** deeply compare two arrays */\nexport function deepArrayEqual(x: any, y: any): boolean {\n if (x === y) {\n return true;\n }\n const isArrayX = Array.isArray(x) || ArrayBuffer.isView(x);\n const isArrayY = Array.isArray(y) || ArrayBuffer.isView(y);\n // @ts-expect-error TODO fix\n if (isArrayX && isArrayY && x.length === y.length) {\n // @ts-expect-error TODO fix\n for (let i = 0; i < x.length; ++i) {\n if (x[i] !== y[i]) {\n return false;\n }\n }\n return true;\n }\n return false;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {setGLParameters, getGLParameters} from '../parameters/unified-parameter-api';\nimport {deepArrayEqual} from './deep-array-equal';\nimport {\n GL_PARAMETER_DEFAULTS,\n GL_HOOKED_SETTERS,\n NON_CACHE_PARAMETERS\n} from '../parameters/webgl-parameter-tables';\n\n// HELPER CLASS - WebGLStateTracker\n\n/**\n * Support for listening to context state changes and intercepting state queries\n * NOTE: this system does not handle buffer bindings\n */\nexport class WebGLStateTracker {\n static get(gl: WebGL2RenderingContext): WebGLStateTracker {\n // @ts-expect-error\n return gl.state as WebGLStateTracker;\n }\n\n gl: WebGL2RenderingContext;\n program: unknown = null;\n stateStack: object[] = [];\n enable = true;\n cache: Record<string, any> = null!;\n log;\n\n protected initialized = false;\n\n constructor(\n gl: WebGL2RenderingContext,\n props?: {\n log; // Logging function, called when gl parameter change calls are actually issued\n }\n ) {\n this.gl = gl;\n this.log = props?.log || (() => {});\n\n this._updateCache = this._updateCache.bind(this);\n Object.seal(this);\n }\n\n push(values = {}) {\n this.stateStack.push({});\n }\n\n pop() {\n // assert(this.stateStack.length > 0);\n // Use the saved values in the state stack to restore parameters\n const oldValues = this.stateStack[this.stateStack.length - 1];\n setGLParameters(this.gl, oldValues);\n // Don't pop until we have reset parameters (to make sure other \"stack frames\" are not affected)\n this.stateStack.pop();\n }\n\n /**\n * Initialize WebGL state caching on a context\n * can be called multiple times to enable/disable\n *\n * @note After calling this function, context state will be cached\n * .push() and .pop() will be available for saving,\n * temporarily modifying, and then restoring state.\n */\n trackState(gl: WebGL2RenderingContext, options?: {copyState?: boolean}): void {\n this.cache = options.copyState ? getGLParameters(gl) : Object.assign({}, GL_PARAMETER_DEFAULTS);\n\n if (this.initialized) {\n throw new Error('WebGLStateTracker');\n }\n this.initialized = true;\n\n // @ts-expect-error\n this.gl.state = this;\n\n installProgramSpy(gl);\n\n // intercept all setter functions in the table\n for (const key in GL_HOOKED_SETTERS) {\n const setter = GL_HOOKED_SETTERS[key];\n installSetterSpy(gl, key, setter);\n }\n\n // intercept all getter functions in the table\n installGetterOverride(gl, 'getParameter');\n installGetterOverride(gl, 'isEnabled');\n }\n\n /**\n // interceptor for context set functions - update our cache and our stack\n // values (Object) - the key values for this setter\n * @param values\n * @returns\n */\n _updateCache(values: {[key: number | string]: any}) {\n let valueChanged = false;\n let oldValue; // = undefined\n\n const oldValues: {[key: number | string]: any} | null =\n this.stateStack.length > 0 ? this.stateStack[this.stateStack.length - 1] : null;\n\n for (const key in values) {\n // assert(key !== undefined);\n const value = values[key];\n const cached = this.cache[key];\n // Check that value hasn't already been shadowed\n if (!deepArrayEqual(value, cached)) {\n valueChanged = true;\n oldValue = cached;\n\n // First, save current value being shadowed\n // If a state stack frame is active, save the current parameter values for pop\n // but first check that value hasn't already been shadowed and saved\n if (oldValues && !(key in oldValues)) {\n oldValues[key] = cached;\n }\n\n // Save current value being shadowed\n this.cache[key] = value;\n }\n }\n\n return {valueChanged, oldValue};\n }\n}\n\n// HELPER FUNCTIONS - INSTALL GET/SET INTERCEPTORS (SPYS) ON THE CONTEXT\n\n/**\n// Overrides a WebGL2RenderingContext state \"getter\" function\n// to return values directly from cache\n * @param gl\n * @param functionName\n */\nfunction installGetterOverride(gl: WebGL2RenderingContext, functionName: string) {\n // Get the original function from the WebGL2RenderingContext\n const originalGetterFunc = gl[functionName].bind(gl);\n\n // Wrap it with a spy so that we can update our state cache when it gets called\n gl[functionName] = function get(pname) {\n if (pname === undefined || NON_CACHE_PARAMETERS.has(pname)) {\n // Invalid or blacklisted parameter, do not cache\n return originalGetterFunc(pname);\n }\n\n const glState = WebGLStateTracker.get(gl);\n if (!(pname in glState.cache)) {\n // WebGL limits are not prepopulated in the cache, call the original getter when first queried.\n glState.cache[pname] = originalGetterFunc(pname);\n }\n\n // Optionally call the original function to do a \"hard\" query from the WebGL2RenderingContext\n return glState.enable\n ? // Call the getter the params so that it can e.g. serve from a cache\n glState.cache[pname]\n : // Optionally call the original function to do a \"hard\" query from the WebGL2RenderingContext\n originalGetterFunc(pname);\n };\n\n // Set the name of this anonymous function to help in debugging and profiling\n Object.defineProperty(gl[functionName], 'name', {\n value: `${functionName}-from-cache`,\n configurable: false\n });\n}\n\n/**\n// Overrides a WebGL2RenderingContext state \"setter\" function\n// to call a setter spy before the actual setter. Allows us to keep a cache\n// updated with a copy of the WebGL context state.\n * @param gl\n * @param functionName\n * @param setter\n * @returns\n */\nfunction installSetterSpy(gl: WebGL2RenderingContext, functionName: string, setter: Function) {\n // Get the original function from the WebGL2RenderingContext\n if (!gl[functionName]) {\n // TODO - remove?\n // This could happen if we try to intercept WebGL2 method on a WebGL1 context\n return;\n }\n\n const originalSetterFunc = gl[functionName].bind(gl);\n\n // Wrap it with a spy so that we can update our state cache when it gets called\n gl[functionName] = function set(...params) {\n // Update the value\n // Call the setter with the state cache and the params so that it can store the parameters\n const glState = WebGLStateTracker.get(gl);\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const {valueChanged, oldValue} = setter(glState._updateCache, ...params);\n\n // Call the original WebGL2RenderingContext func to make sure the context actually gets updated\n if (valueChanged) {\n originalSetterFunc(...params);\n }\n\n // Note: if the original function fails to set the value, our state cache will be bad\n // No solution for this at the moment, but assuming that this is unlikely to be a real problem\n // We could call the setter after the originalSetterFunc. Concern is that this would\n // cause different behavior in debug mode, where originalSetterFunc can throw exceptions\n\n return oldValue;\n };\n\n // Set the name of this anonymous function to help in debugging and profiling\n Object.defineProperty(gl[functionName], 'name', {\n value: `${functionName}-to-cache`,\n configurable: false\n });\n}\n\nfunction installProgramSpy(gl: WebGL2RenderingContext): void {\n const originalUseProgram = gl.useProgram.bind(gl);\n\n gl.useProgram = function useProgramLuma(handle) {\n const glState = WebGLStateTracker.get(gl);\n if (glState.program !== handle) {\n originalUseProgram(handle);\n glState.program = handle;\n }\n };\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/**\n * ContextProps\n * @param onContextLost\n * @param onContextRestored *\n */\ntype ContextProps = {\n /** Called when a context is lost */\n onContextLost: (event: Event) => void;\n /** Called when a context is restored */\n onContextRestored: (event: Event) => void;\n};\n\n/**\n * Create a WebGL context for a canvas\n * Note calling this multiple time on the same canvas does return the same context\n * @param canvas A canvas element or offscreen canvas\n */\nexport function createBrowserContext(\n canvas: HTMLCanvasElement | OffscreenCanvas,\n props: ContextProps,\n webglContextAttributes: WebGLContextAttributes\n): WebGL2RenderingContext {\n // Try to extract any extra information about why context creation failed\n let errorMessage = '';\n // const onCreateError = error => (errorMessage = error.statusMessage || errorMessage);\n\n // Avoid multiple listeners?\n // canvas.removeEventListener('webglcontextcreationerror', onCreateError, false);\n // canvas.addEventListener('webglcontextcreationerror', onCreateError, false);\n\n const webglProps: WebGLContextAttributes = {\n preserveDrawingBuffer: true,\n // failIfMajorPerformanceCaveat: true,\n ...webglContextAttributes\n };\n\n // Create the desired context\n let gl: WebGL2RenderingContext | null = null;\n\n // Create a webgl2 context\n gl ||= canvas.getContext('webgl2', webglProps);\n if (webglProps.failIfMajorPerformanceCaveat) {\n errorMessage ||=\n 'Only software GPU is available. Set `failIfMajorPerformanceCaveat: false` to allow.';\n }\n\n // Creation failed with failIfMajorPerformanceCaveat - Try a Software GPU\n if (!gl && !webglContextAttributes.failIfMajorPerformanceCaveat) {\n webglProps.failIfMajorPerformanceCaveat = false;\n gl = canvas.getContext('webgl2', webglProps);\n // @ts-expect-error\n gl.luma ||= {};\n // @ts-expect-error\n gl.luma.softwareRenderer = true;\n }\n\n if (!gl) {\n gl = canvas.getContext('webgl', {}) as WebGL2RenderingContext;\n if (gl) {\n gl = null;\n errorMessage ||= 'Your browser only supports WebGL1';\n }\n }\n\n if (!gl) {\n errorMessage ||= 'Your browser does not support WebGL';\n throw new Error(`Failed to create WebGL context: ${errorMessage}`);\n }\n\n // Carefully extract and wrap callbacks to prevent addEventListener from rebinding them.\n const {onContextLost, onContextRestored} = props;\n canvas.addEventListener('webglcontextlost', (event: Event) => onContextLost(event), false);\n canvas.addEventListener(\n 'webglcontextrestored',\n (event: Event) => onContextRestored(event),\n false\n );\n\n // @ts-expect-error\n gl.luma ||= {};\n return gl;\n}\n\n/* TODO - can we call this asynchronously to catch the error events?\nexport async function createBrowserContextAsync(canvas: HTMLCanvasElement | OffscreenCanvas, props: ContextProps): Promise<WebGL2RenderingContext> {\n props = {...DEFAULT_CONTEXT_PROPS, ...props};\n\n // Try to extract any extra information about why context creation failed\n let errorMessage = null;\n const onCreateError = (error) => (errorMessage = error.statusMessage || errorMessage);\n canvas.addEventListener('webglcontextcreationerror', onCreateError, false);\n\n const gl = createBrowserContext(canvas, props);\n\n // Give the listener a chance to fire\n await new Promise(resolve => setTimeout(resolve, 0));\n\n canvas.removeEventListener('webglcontextcreationerror', onCreateError, false);\n\n return gl;\n}\n*/\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {DeviceInfo} from '@luma.gl/core';\nimport {GL, GLExtensions} from '@luma.gl/constants';\nimport {getWebGLExtension} from '../../context/helpers/webgl-extensions';\n\n/** @returns strings identifying the GPU vendor and driver. */\nexport function getDeviceInfo(gl: WebGL2RenderingContext, extensions: GLExtensions): DeviceInfo {\n // \"Masked\" info is always available, but don't contain much useful information\n const vendorMasked = gl.getParameter(GL.VENDOR);\n const rendererMasked = gl.getParameter(GL.RENDERER);\n\n // If we are lucky, unmasked info is available\n // https://www.khronos.org/registry/webgl/extensions/WEBGL_debug_renderer_info/\n getWebGLExtension(gl, 'WEBGL_debug_renderer_info', extensions);\n const ext = extensions.WEBGL_debug_renderer_info;\n const vendorUnmasked = gl.getParameter(ext ? ext.UNMASKED_VENDOR_WEBGL : GL.VENDOR);\n const rendererUnmasked = gl.getParameter(ext ? ext.UNMASKED_RENDERER_WEBGL : GL.RENDERER);\n const vendor = vendorUnmasked || vendorMasked;\n const renderer = rendererUnmasked || rendererMasked;\n\n // Driver version\n const version = gl.getParameter(GL.VERSION) as string;\n\n // \"Sniff\" the GPU type and backend from the info. This works best if unmasked info is available.\n const gpu = identifyGPUVendor(vendor, renderer);\n const gpuBackend = identifyGPUBackend(vendor, renderer);\n const gpuType = identifyGPUType(vendor, renderer);\n\n // Determine GLSL version\n // For now, skip parsing of the long version string, just use context type below to deduce version\n // const version = gl.getParameter(GL.SHADING_LANGUAGE_VERSION) as string;\n // const shadingLanguageVersion = parseGLSLVersion(version);\n const shadingLanguage = 'glsl';\n const shadingLanguageVersion = 300;\n\n return {\n type: 'webgl',\n gpu,\n gpuType,\n gpuBackend,\n vendor,\n renderer,\n version,\n shadingLanguage,\n shadingLanguageVersion\n };\n}\n\n/** \"Sniff\" the GPU type from the info. This works best if unmasked info is available. */\nfunction identifyGPUVendor(\n vendor: string,\n renderer: string\n): 'nvidia' | 'intel' | 'apple' | 'amd' | 'software' | 'unknown' {\n if (/NVIDIA/i.exec(vendor) || /NVIDIA/i.exec(renderer)) {\n return 'nvidia';\n }\n if (/INTEL/i.exec(vendor) || /INTEL/i.exec(renderer)) {\n return 'intel';\n }\n if (/Apple/i.exec(vendor) || /Apple/i.exec(renderer)) {\n return 'apple';\n }\n if (\n /AMD/i.exec(vendor) ||\n /AMD/i.exec(renderer) ||\n /ATI/i.exec(vendor) ||\n /ATI/i.exec(renderer)\n ) {\n return 'amd';\n }\n if (/SwiftShader/i.exec(vendor) || /SwiftShader/i.exec(renderer)) {\n return 'software';\n }\n\n return 'unknown';\n}\n\n/** \"Sniff\" the GPU backend from the info. This works best if unmasked info is available. */\nfunction identifyGPUBackend(vendor: string, renderer: string): 'opengl' | 'metal' | 'unknown' {\n if (/Metal/i.exec(vendor) || /Metal/i.exec(renderer)) {\n return 'metal';\n }\n if (/ANGLE/i.exec(vendor) || /ANGLE/i.exec(renderer)) {\n return 'opengl';\n }\n return 'unknown';\n}\n\nfunction identifyGPUType(\n vendor: string,\n renderer: string\n): 'discrete' | 'integrated' | 'cpu' | 'unknown' {\n if (/SwiftShader/i.exec(vendor) || /SwiftShader/i.exec(renderer)) {\n return 'cpu';\n }\n\n const gpuVendor = identifyGPUVendor(vendor, renderer);\n switch (gpuVendor) {\n case 'intel':\n return 'integrated';\n case 'software':\n return 'cpu';\n case 'unknown':\n return 'unknown';\n default:\n return 'discrete';\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {GLExtensions} from '@luma.gl/constants';\n\n/** Ensure extensions are only requested once */\nexport function getWebGLExtension(\n gl: WebGL2RenderingContext,\n name: string,\n extensions: GLExtensions\n): unknown {\n if (extensions[name] === undefined) {\n extensions[name] = gl.getExtension(name) || null;\n }\n return extensions[name];\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Feature detection for WebGL\n// Provides a function that enables simple checking of which WebGL features are\n\nimport {DeviceFeature, DeviceFeatures} from '@luma.gl/core';\nimport {GLExtensions} from '@luma.gl/constants';\nimport {getWebGLExtension} from '../../context/helpers/webgl-extensions';\nimport {\n isTextureFeature,\n checkTextureFeature,\n TEXTURE_FEATURES\n} from '../converters/webgl-texture-table';\n\n/**\n * Defines luma.gl \"feature\" names and semantics\n * when value is 'string' it is the name of the extension that enables this feature\n */\nconst WEBGL_FEATURES: Partial<Record<DeviceFeature, boolean | string>> = {\n // optional WebGPU features\n 'depth-clip-control': 'EXT_depth_clamp', // TODO these seem subtly different\n // 'timestamp-query' // GPUQueryType \"timestamp-query\"\n // \"indirect-first-instance\"\n // Textures are handled by getTextureFeatures()\n // 'depth32float-stencil8' // GPUTextureFormat 'depth32float-stencil8'\n\n // optional WebGL features\n 'timer-query-webgl': 'EXT_disjoint_timer_query_webgl2',\n 'compilation-status-async-webgl': 'KHR_parallel_shader_compile',\n 'polygon-mode-webgl': 'WEBGL_polygon_mode',\n 'provoking-vertex-webgl': 'WEBGL_provoking_vertex',\n 'shader-clip-cull-distance-webgl': 'WEBGL_clip_cull_distance',\n 'shader-noperspective-interpolation-webgl': 'NV_shader_noperspective_interpolation',\n 'shader-conservative-depth-webgl': 'EXT_conservative_depth'\n\n // Textures are handled by getTextureFeatures()\n};\n\n/**\n * WebGL extensions exposed as luma.gl features\n * To minimize GL log noise and improve performance, this class ensures that\n * - WebGL extensions are not queried until the corresponding feature is checked.\n * - WebGL extensions are only queried once.\n */\nexport class WebGLDeviceFeatures extends DeviceFeatures {\n protected gl: WebGL2RenderingContext;\n protected extensions: GLExtensions;\n protected testedFeatures = new Set<DeviceFeature>();\n\n constructor(\n gl: WebGL2RenderingContext,\n extensions: GLExtensions,\n disabledFeatures: Partial<Record<DeviceFeature, boolean>>\n ) {\n super([], disabledFeatures);\n this.gl = gl;\n this.extensions = extensions;\n // TODO - is this really needed?\n // Enable EXT_float_blend first: https://developer.mozilla.org/en-US/docs/Web/API/EXT_float_blend\n getWebGLExtension(gl, 'EXT_color_buffer_float', extensions);\n }\n\n *[Symbol.iterator](): IterableIterator<DeviceFeature> {\n const features = this.getFeatures();\n for (const feature of features) {\n if (this.has(feature)) {\n yield feature;\n }\n }\n return [];\n }\n\n override has(feature: DeviceFeature): boolean {\n if (this.disabledFeatures?.[feature]) {\n return false;\n }\n\n // We have already tested this feature\n if (!this.testedFeatures.has(feature)) {\n this.testedFeatures.add(feature);\n\n // Check the feature once\n if (isTextureFeature(feature) && checkTextureFeature(this.gl, feature, this.extensions)) {\n this.features.add(feature);\n }\n\n if (this.getWebGLFeature(feature)) {\n this.features.add(feature);\n }\n }\n return this.features.has(feature);\n }\n\n // FOR DEVICE\n\n initializeFeatures() {\n // Initialize all features by checking them.\n // Except WEBGL_polygon_mode since Chrome logs ugly console warnings\n const features = this.getFeatures().filter(feature => feature !== 'polygon-mode-webgl');\n for (const feature of features) {\n this.has(feature);\n }\n }\n\n // IMPLEMENTATION\n\n getFeatures() {\n return [...Object.keys(WEBGL_FEATURES), ...Object.keys(TEXTURE_FEATURES)] as DeviceFeature[];\n }\n\n /** Extract all WebGL features */\n protected getWebGLFeature(feature: DeviceFeature): boolean {\n const featureInfo = WEBGL_FEATURES[feature];\n // string value requires checking the corresponding WebGL extension\n const isSupported =\n typeof featureInfo === 'string'\n ? Boolean(getWebGLExtension(this.gl, featureInfo, this.extensions))\n : Boolean(featureInfo);\n\n return isSupported;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {\n DeviceFeature,\n TextureFormat,\n TextureFormatCapabilities,\n DeviceTextureFormatCapabilities\n} from '@luma.gl/core';\nimport {decodeTextureFormat} from '@luma.gl/core';\nimport {GL, GLPixelType, GLExtensions, GLTexelDataFormat} from '@luma.gl/constants';\nimport {getWebGLExtension} from '../../context/helpers/webgl-extensions';\nimport {getGLFromVertexType} from './vertex-formats';\n\n/* eslint-disable camelcase */\n\n// TEXTURE FEATURES\n\n// Define local webgl extension strings to optimize minification\nconst X_S3TC = 'WEBGL_compressed_texture_s3tc'; // BC1, BC2, BC3\nconst X_S3TC_SRGB = 'WEBGL_compressed_texture_s3tc_srgb'; // BC1, BC2, BC3\nconst X_RGTC = 'EXT_texture_compression_rgtc'; // BC4, BC5\nconst X_BPTC = 'EXT_texture_compression_bptc'; // BC6, BC7\nconst X_ETC2 = 'WEBGL_compressed_texture_etc'; // Renamed from 'WEBGL_compressed_texture_es3'\nconst X_ASTC = 'WEBGL_compressed_texture_astc';\nconst X_ETC1 = 'WEBGL_compressed_texture_etc1';\nconst X_PVRTC = 'WEBGL_compressed_texture_pvrtc';\nconst X_ATC = 'WEBGL_compressed_texture_atc';\n\n// Define local webgl extension strings to optimize minification\nconst EXT_texture_norm16 = 'EXT_texture_norm16';\nconst EXT_render_snorm = 'EXT_render_snorm';\nconst EXT_color_buffer_float = 'EXT_color_buffer_float';\n\n// prettier-ignore\nexport const TEXTURE_FEATURES: Partial<Record<DeviceFeature, string[]>> = {\n 'float32-renderable-webgl': ['EXT_color_buffer_float'],\n 'float16-renderable-webgl': ['EXT_color_buffer_half_float'],\n 'rgb9e5ufloat-renderable-webgl': ['WEBGL_render_shared_exponent'],\n 'snorm8-renderable-webgl': [EXT_render_snorm],\n 'norm16-renderable-webgl': [EXT_texture_norm16],\n 'snorm16-renderable-webgl': [EXT_texture_norm16, EXT_render_snorm],\n\n 'float32-filterable': ['OES_texture_float_linear'],\n 'float16-filterable-webgl': ['OES_texture_half_float_linear'],\n 'texture-filterable-anisotropic-webgl': ['EXT_texture_filter_anisotropic'],\n\n 'texture-blend-float-webgl': ['EXT_float_blend'],\n\n 'texture-compression-bc': [X_S3TC, X_S3TC_SRGB, X_RGTC, X_BPTC],\n // 'texture-compression-bc3-srgb-webgl': [X_S3TC_SRGB],\n // 'texture-compression-bc3-webgl': [X_S3TC],\n 'texture-compression-bc5-webgl': [X_RGTC],\n 'texture-compression-bc7-webgl': [X_BPTC],\n 'texture-compression-etc2': [X_ETC2],\n 'texture-compression-astc': [X_ASTC],\n 'texture-compression-etc1-webgl': [X_ETC1],\n 'texture-compression-pvrtc-webgl': [X_PVRTC],\n 'texture-compression-atc-webgl': [X_ATC]\n};\n\nexport function isTextureFeature(feature: DeviceFeature): boolean {\n return feature in TEXTURE_FEATURES;\n}\n\n/** Checks a texture feature (for Device.features). Mainly compressed texture support */\nexport function checkTextureFeature(\n gl: WebGL2RenderingContext,\n feature: DeviceFeature,\n extensions: GLExtensions\n): boolean {\n const textureExtensions = TEXTURE_FEATURES[feature] || [];\n return textureExtensions.every(extension => getWebGLExtension(gl, extension, extensions));\n}\n\n// TEXTURE FORMATS\n\n/** Map a format to webgl and constants */\ntype WebGLFormatInfo = {\n gl?: GL;\n /** compressed */\n x?: string;\n types?: GLPixelType[];\n dataFormat?: GLTexelDataFormat;\n /** if depthTexture is set this is a depth/stencil format that can be set to a texture */\n depthTexture?: boolean;\n /** @deprecated can this format be used with renderbuffers */\n rb?: boolean;\n};\n\n// TABLES\n\n/**\n * Texture format data -\n * Exported but can change without notice\n */\n// prettier-ignore\nexport const WEBGL_TEXTURE_FORMATS: Record<TextureFormat, WebGLFormatInfo> = {\n // 8-bit formats\n 'r8unorm': {gl: GL.R8, rb: true},\n 'r8snorm': {gl: GL.R8_SNORM},\n 'r8uint': {gl: GL.R8UI, rb: true},\n 'r8sint': {gl: GL.R8I, rb: true},\n\n // 16-bit formats\n 'rg8unorm': {gl: GL.RG8, rb: true},\n 'rg8snorm': {gl: GL.RG8_SNORM},\n 'rg8uint': {gl: GL.RG8UI, rb: true},\n 'rg8sint': {gl: GL.RG8I, rb: true},\n\n 'r16uint': {gl: GL.R16UI, rb: true},\n 'r16sint': {gl: GL.R16I, rb: true},\n 'r16float': {gl: GL.R16F, rb: true},\n 'r16unorm-webgl': {gl: GL.R16_EXT, rb: true},\n 'r16snorm-webgl': {gl: GL.R16_SNORM_EXT},\n\n // Packed 16-bit formats\n 'rgba4unorm-webgl': {gl: GL.RGBA4, rb: true},\n 'rgb565unorm-webgl': {gl: GL.RGB565, rb: true},\n 'rgb5a1unorm-webgl': {gl: GL.RGB5_A1, rb: true},\n\n // 24-bit formats\n 'rgb8unorm-webgl': {gl: GL.RGB8},\n 'rgb8snorm-webgl': {gl: GL.RGB8_SNORM},\n\n // 32-bit formats \n 'rgba8unorm': {gl: GL.RGBA8},\n 'rgba8unorm-srgb': {gl: GL.SRGB8_ALPHA8},\n 'rgba8snorm': {gl: GL.RGBA8_SNORM},\n 'rgba8uint': {gl: GL.RGBA8UI},\n 'rgba8sint': {gl: GL.RGBA8I},\n // reverse colors, webgpu only\n 'bgra8unorm': {},\n 'bgra8unorm-srgb': {},\n\n 'rg16uint': {gl: GL.RG16UI},\n 'rg16sint': {gl: GL.RG16I},\n 'rg16float': {gl: GL.RG16F, rb: true},\n 'rg16unorm-webgl': {gl: GL.RG16_EXT},\n 'rg16snorm-webgl': {gl: GL.RG16_SNORM_EXT},\n\n 'r32uint': {gl: GL.R32UI, rb: true},\n 'r32sint': {gl: GL.R32I, rb: true},\n 'r32float': {gl: GL.R32F},\n\n // Packed 32-bit formats\n 'rgb9e5ufloat': {gl: GL.RGB9_E5}, // , filter: true},\n 'rg11b10ufloat': {gl: GL.R11F_G11F_B10F, rb: true},\n 'rgb10a2unorm': {gl: GL.RGB10_A2, rb: true},\n 'rgb10a2uint-webgl': {gl: GL.RGB10_A2UI, rb: true},\n\n // 48-bit formats\n 'rgb16unorm-webgl': {gl: GL.RGB16_EXT}, // rgb not renderable\n 'rgb16snorm-webgl': {gl: GL.RGB16_SNORM_EXT}, // rgb not renderable\n\n // 64-bit formats\n 'rg32uint': {gl: GL.RG32UI, rb: true},\n 'rg32sint': {gl: GL.RG32I, rb: true},\n 'rg32float': {gl: GL.RG32F, rb: true},\n 'rgba16uint': {gl: GL.RGBA16UI, rb: true},\n 'rgba16sint': {gl: GL.RGBA16I, rb: true},\n 'rgba16float': {gl: GL.RGBA16F},\n 'rgba16unorm-webgl': {gl: GL.RGBA16_EXT, rb: true},\n 'rgba16snorm-webgl': {gl: GL.RGBA16_SNORM_EXT},\n\n // 96-bit formats (deprecated!)\n 'rgb32float-webgl': {gl: GL.RGB32F, x: EXT_color_buffer_float, dataFormat: GL.RGB, types: [GL.FLOAT]},\n \n // 128-bit formats\n 'rgba32uint': {gl: GL.RGBA32UI, rb: true},\n 'rgba32sint': {gl: GL.RGBA32I, rb: true},\n 'rgba32float': {gl: GL.RGBA32F, rb: true},\n\n // Depth and stencil formats\n 'stencil8': {gl: GL.STENCIL_INDEX8, rb: true}, // 8 stencil bits\n\n 'depth16unorm': {gl: GL.DEPTH_COMPONENT16, dataFormat: GL.DEPTH_COMPONENT, types: [GL.UNSIGNED_SHORT], rb: true}, // 16 depth bits\n 'depth24plus': {gl: GL.DEPTH_COMPONENT24, dataFormat: GL.DEPTH_COMPONENT, types: [GL.UNSIGNED_INT]},\n 'depth32float': {gl: GL.DEPTH_COMPONENT32F, dataFormat: GL.DEPTH_COMPONENT, types: [GL.FLOAT], rb: true},\n\n // The depth component of the \"depth24plus\" and \"depth24plus-stencil8\" formats may be implemented as either a 24-bit depth value or a \"depth32float\" value.\n 'depth24plus-stencil8': {gl: GL.DEPTH24_STENCIL8, rb: true, depthTexture: true, dataFormat: GL.DEPTH_STENCIL, types: [GL.UNSIGNED_INT_24_8]},\n // \"depth32float-stencil8\" feature - TODO below is render buffer only?\n 'depth32float-stencil8': {gl: GL.DEPTH32F_STENCIL8, dataFormat: GL.DEPTH_STENCIL, types: [GL.FLOAT_32_UNSIGNED_INT_24_8_REV], rb: true},\n\n // BC compressed formats: check device.features.has(\"texture-compression-bc\");\n\n 'bc1-rgb-unorm-webgl': {gl: GL.COMPRESSED_RGB_S3TC_DXT1_EXT, x: X_S3TC},\n 'bc1-rgb-unorm-srgb-webgl': {gl: GL.COMPRESSED_SRGB_S3TC_DXT1_EXT, x: X_S3TC_SRGB},\n\n 'bc1-rgba-unorm': {gl: GL.COMPRESSED_RGBA_S3TC_DXT1_EXT, x: X_S3TC},\n 'bc1-rgba-unorm-srgb': {gl: GL.COMPRESSED_SRGB_S3TC_DXT1_EXT, x: X_S3TC_SRGB},\n 'bc2-rgba-unorm': {gl: GL.COMPRESSED_RGBA_S3TC_DXT3_EXT, x: X_S3TC},\n 'bc2-rgba-unorm-srgb': {gl: GL.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, x: X_S3TC_SRGB},\n 'bc3-rgba-unorm': {gl: GL.COMPRESSED_RGBA_S3TC_DXT5_EXT, x: X_S3TC},\n 'bc3-rgba-unorm-srgb': {gl: GL.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, x: X_S3TC_SRGB},\n 'bc4-r-unorm': {gl: GL.COMPRESSED_RED_RGTC1_EXT, x: X_RGTC},\n 'bc4-r-snorm': {gl: GL.COMPRESSED_SIGNED_RED_RGTC1_EXT, x: X_RGTC},\n 'bc5-rg-unorm': {gl: GL.COMPRESSED_RED_GREEN_RGTC2_EXT, x: X_RGTC},\n 'bc5-rg-snorm': {gl: GL.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT, x: X_RGTC},\n 'bc6h-rgb-ufloat': {gl: GL.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT, x: X_BPTC},\n 'bc6h-rgb-float': {gl: GL.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT, x: X_BPTC},\n 'bc7-rgba-unorm': {gl: GL.COMPRESSED_RGBA_BPTC_UNORM_EXT, x: X_BPTC},\n 'bc7-rgba-unorm-srgb': {gl: GL.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT, x: X_BPTC},\n\n // WEBGL_compressed_texture_etc: device.features.has(\"texture-compression-etc2\")\n // Note: Supposedly guaranteed availability compressed formats in WebGL2, but through CPU decompression\n\n 'etc2-rgb8unorm': {gl: GL.COMPRESSED_RGB8_ETC2},\n 'etc2-rgb8unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ETC2},\n 'etc2-rgb8a1unorm': {gl: GL.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2},\n 'etc2-rgb8a1unorm-srgb': {gl: GL.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2},\n 'etc2-rgba8unorm': {gl: GL.COMPRESSED_RGBA8_ETC2_EAC},\n 'etc2-rgba8unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC},\n\n 'eac-r11unorm': {gl: GL.COMPRESSED_R11_EAC},\n 'eac-r11snorm': {gl: GL.COMPRESSED_SIGNED_R11_EAC},\n 'eac-rg11unorm': {gl: GL.COMPRESSED_RG11_EAC},\n 'eac-rg11snorm': {gl: GL.COMPRESSED_SIGNED_RG11_EAC},\n\n // X_ASTC compressed formats: device.features.has(\"texture-compression-astc\")\n\n 'astc-4x4-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_4x4_KHR},\n 'astc-4x4-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR},\n 'astc-5x4-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_5x4_KHR},\n 'astc-5x4-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR},\n 'astc-5x5-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_5x5_KHR},\n 'astc-5x5-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR},\n 'astc-6x5-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_6x5_KHR},\n 'astc-6x5-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR},\n 'astc-6x6-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_6x6_KHR},\n 'astc-6x6-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR},\n 'astc-8x5-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_8x5_KHR},\n 'astc-8x5-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR},\n 'astc-8x6-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_8x6_KHR},\n 'astc-8x6-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR},\n 'astc-8x8-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_8x8_KHR},\n 'astc-8x8-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR},\n 'astc-10x5-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_10x10_KHR},\n 'astc-10x5-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR},\n 'astc-10x6-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_10x6_KHR},\n 'astc-10x6-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR},\n 'astc-10x8-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_10x8_KHR},\n 'astc-10x8-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR},\n 'astc-10x10-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_10x10_KHR},\n 'astc-10x10-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR},\n 'astc-12x10-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_12x10_KHR},\n 'astc-12x10-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR},\n 'astc-12x12-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_12x12_KHR},\n 'astc-12x12-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR},\n\n // WEBGL_compressed_texture_pvrtc\n\n 'pvrtc-rgb4unorm-webgl': {gl: GL.COMPRESSED_RGB_PVRTC_4BPPV1_IMG},\n 'pvrtc-rgba4unorm-webgl': {gl: GL.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG},\n 'pvrtc-rbg2unorm-webgl': {gl: GL.COMPRESSED_RGB_PVRTC_2BPPV1_IMG},\n 'pvrtc-rgba2unorm-webgl': {gl: GL.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG},\n\n // WEBGL_compressed_texture_etc1\n\n 'etc1-rbg-unorm-webgl': {gl: GL.COMPRESSED_RGB_ETC1_WEBGL},\n\n // WEBGL_compressed_texture_atc\n\n 'atc-rgb-unorm-webgl': {gl: GL.COMPRESSED_RGB_ATC_WEBGL},\n 'atc-rgba-unorm-webgl': {gl: GL.COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL},\n 'atc-rgbai-unorm-webgl': {gl: GL.COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL}\n};\n\n// FUNCTIONS\n\n/** Checks if a texture format is supported */\nexport function isWebGLTextureFormatCapabilitiesed(\n gl: WebGL2RenderingContext,\n format: TextureFormat,\n extensions: GLExtensions\n): boolean {\n const webglTextureInfo = WEBGL_TEXTURE_FORMATS[format];\n // Check that we have a GL constant\n if (!webglTextureInfo?.gl) {\n return false;\n }\n\n // Check extensions\n const extension = webglTextureInfo.x;\n if (extension) {\n return Boolean(getWebGLExtension(gl, extension, extensions));\n }\n return true;\n}\n\n/** Checks if a texture format is supported, renderable, filterable etc */\nexport function getTextureFormatCapabilitiesWebGL(\n gl: WebGL2RenderingContext,\n formatSupport: TextureFormatCapabilities,\n extensions: GLExtensions\n): DeviceTextureFormatCapabilities {\n let supported = formatSupport.create;\n const webglFormatInfo = WEBGL_TEXTURE_FORMATS[formatSupport.format];\n\n // Support Check that we have a GL constant\n if (webglFormatInfo?.gl === undefined) {\n supported = false;\n }\n\n if (webglFormatInfo?.x) {\n supported = supported && Boolean(getWebGLExtension(gl, webglFormatInfo.x, extensions));\n }\n\n return {\n format: formatSupport.format,\n // @ts-ignore\n create: supported && formatSupport.create,\n // @ts-ignore\n render: supported && formatSupport.render,\n // @ts-ignore\n filter: supported && formatSupport.filter,\n // @ts-ignore\n blend: supported && formatSupport.blend,\n // @ts-ignore\n store: supported && formatSupport.store\n };\n}\n\n/** Get parameters necessary to work with format in WebGL: internalFormat, dataFormat, type, compressed, */\nexport function getTextureFormatWebGL(format: TextureFormat): {\n internalFormat: GL;\n format: GLTexelDataFormat;\n type: GLPixelType;\n compressed: boolean;\n} {\n const formatData = WEBGL_TEXTURE_FORMATS[format];\n const webglFormat = convertTextureFormatToGL(format);\n const decoded = decodeTextureFormat(format);\n return {\n internalFormat: webglFormat,\n format:\n formatData?.dataFormat ||\n getWebGLPixelDataFormat(decoded.channels, decoded.integer, decoded.normalized, webglFormat),\n // depth formats don't have a type\n type: decoded.dataType\n ? getGLFromVertexType(decoded.dataType)\n : formatData?.types?.[0] || GL.UNSIGNED_BYTE,\n compressed: decoded.compressed || false\n };\n}\n\nexport function getDepthStencilAttachmentWebGL(\n format: TextureFormat\n): GL.DEPTH_ATTACHMENT | GL.STENCIL_ATTACHMENT | GL.DEPTH_STENCIL_ATTACHMENT {\n const formatInfo = decodeTextureFormat(format);\n switch (formatInfo.attachment) {\n case 'depth':\n return GL.DEPTH_ATTACHMENT;\n case 'stencil':\n return GL.STENCIL_ATTACHMENT;\n case 'depth-stencil':\n return GL.DEPTH_STENCIL_ATTACHMENT;\n default:\n throw new Error(`Not a depth stencil format: ${format}`);\n }\n}\n\n/** TODO - VERY roundabout legacy way of calculating bytes per pixel */\nexport function getTextureFormatBytesPerPixel(format: TextureFormat): number {\n const formatInfo = decodeTextureFormat(format);\n return formatInfo.bytesPerPixel;\n}\n\n// DATA TYPE HELPERS\n\nexport function getWebGLPixelDataFormat(\n channels: 'r' | 'rg' | 'rgb' | 'rgba' | 'bgra',\n integer: boolean,\n normalized: boolean,\n format: GL\n): GLTexelDataFormat {\n // WebGL1 formats use same internalFormat\n if (format === GL.RGBA || format === GL.RGB) {\n return format;\n }\n // prettier-ignore\n switch (channels) {\n case 'r': return integer && !normalized ? GL.RED_INTEGER : GL.RED;\n case 'rg': return integer && !normalized ? GL.RG_INTEGER : GL.RG;\n case 'rgb': return integer && !normalized ? GL.RGB_INTEGER : GL.RGB;\n case 'rgba': return integer && !normalized ? GL.RGBA_INTEGER : GL.RGBA;\n case 'bgra': throw new Error('bgra pixels not supported by WebGL');\n default: return GL.RGBA;\n }\n}\n\n/**\n * Map WebGPU style texture format strings to GL constants\n */\nfunction convertTextureFormatToGL(format: TextureFormat): GL | undefined {\n const formatInfo = WEBGL_TEXTURE_FORMATS[format];\n const webglFormat = formatInfo?.gl;\n if (webglFormat === undefined) {\n throw new Error(`Unsupported texture format ${format}`);\n }\n return webglFormat;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {GL} from '@luma.gl/constants';\nimport {VertexFormat, VertexType} from '@luma.gl/core';\n\ntype GLDataType =\n | GL.UNSIGNED_BYTE\n | GL.BYTE\n | GL.UNSIGNED_SHORT\n | GL.SHORT\n | GL.UNSIGNED_INT\n | GL.INT\n | GL.HALF_FLOAT\n | GL.FLOAT;\n\n/** Get vertex format from GL constants */\nexport function getVertexFormatFromGL(type: GLDataType, components: 1 | 2 | 3 | 4): VertexFormat {\n const base = getVertexTypeFromGL(type);\n // prettier-ignore\n switch (components) {\n // @ts-expect-error TODO deal with lack of formats\n case 1: return base;\n case 2: return `${base}x2`;\n // @ts-expect-error TODO deal with lack of formats\n case 3: return `${base}x3`;\n case 4: return `${base}x4`;\n }\n // @ts-ignore unreachable\n throw new Error(String(components));\n}\n\n/** Get data type from GL constants */\nexport function getVertexTypeFromGL(type: GLDataType, normalized = false): VertexType {\n // prettier-ignore\n switch (type) {\n // WebGPU does not support normalized 32 bit integer attributes\n case GL.INT: return normalized ? 'sint32' : 'sint32';\n case GL.UNSIGNED_INT: return normalized ? 'uint32' : 'uint32';\n case GL.SHORT: return normalized ? 'sint16' : 'unorm16';\n case GL.UNSIGNED_SHORT: return normalized ? 'uint16' : 'unorm16';\n case GL.BYTE: return normalized ? 'sint8' : 'snorm16';\n case GL.UNSIGNED_BYTE: return normalized ? 'uint8' : 'unorm8';\n case GL.FLOAT: return 'float32';\n case GL.HALF_FLOAT: return 'float16';\n }\n // @ts-ignore unreachable\n throw new Error(String(type));\n}\n\nexport function getGLFromVertexType(\n dataType: VertexType\n):\n | GL.UNSIGNED_BYTE\n | GL.BYTE\n | GL.UNSIGNED_SHORT\n | GL.SHORT\n | GL.UNSIGNED_INT\n | GL.INT\n | GL.HALF_FLOAT\n | GL.FLOAT {\n // prettier-ignore\n switch (dataType) {\n case 'uint8': return GL.UNSIGNED_BYTE;\n case 'sint8': return GL.BYTE;\n case 'unorm8': return GL.UNSIGNED_BYTE;\n case 'snorm8': return GL.BYTE;\n case 'uint16': return GL.UNSIGNED_SHORT;\n case 'sint16': return GL.SHORT;\n case 'unorm16': return GL.UNSIGNED_SHORT;\n case 'snorm16': return GL.SHORT;\n case 'uint32': return GL.UNSIGNED_INT;\n case 'sint32': return GL.INT;\n // WebGPU does not support normalized 32 bit integer attributes\n // case 'unorm32': return GL.UNSIGNED_INT;\n // case 'snorm32': return GL.INT;\n case 'float16': return GL.HALF_FLOAT;\n case 'float32': return GL.FLOAT;\n }\n // @ts-ignore unreachable\n throw new Error(String(dataType));\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {DeviceLimits} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\n\n// prettier-ignore\nexport class WebGLDeviceLimits extends DeviceLimits {\n get maxTextureDimension1D() { return 0; } // WebGL does not support 1D textures\n get maxTextureDimension2D() { return this.getParameter(GL.MAX_TEXTURE_SIZE); }\n get maxTextureDimension3D() { return this.getParameter(GL.MAX_3D_TEXTURE_SIZE); }\n get maxTextureArrayLayers() { return this.getParameter(GL.MAX_ARRAY_TEXTURE_LAYERS); }\n get maxBindGroups() { return 0; }\n get maxDynamicUniformBuffersPerPipelineLayout() { return 0; } // TBD\n get maxDynamicStorageBuffersPerPipelineLayout() { return 0; } // TBD\n get maxSampledTexturesPerShaderStage() { return this.getParameter(GL.MAX_VERTEX_TEXTURE_IMAGE_UNITS); } // ) TBD\n get maxSamplersPerShaderStage() { return this.getParameter(GL.MAX_COMBINED_TEXTURE_IMAGE_UNITS); }\n get maxStorageBuffersPerShaderStage() { return 0; } // TBD\n get maxStorageTexturesPerShaderStage() { return 0; } // TBD\n get maxUniformBuffersPerShaderStage() { return this.getParameter(GL.MAX_UNIFORM_BUFFER_BINDINGS); }\n get maxUniformBufferBindingSize() { return this.getParameter(GL.MAX_UNIFORM_BLOCK_SIZE); }\n get maxStorageBufferBindingSize() { return 0; }\n get minUniformBufferOffsetAlignment() { return this.getParameter(GL.UNIFORM_BUFFER_OFFSET_ALIGNMENT); }\n get minStorageBufferOffsetAlignment() { return 0; } \n get maxVertexBuffers() { return 16; } // WebGL 2 supports 16 buffers, see https://github.com/gpuweb/gpuweb/issues/4284\n get maxVertexAttributes() { return this.getParameter(GL.MAX_VERTEX_ATTRIBS); }\n get maxVertexBufferArrayStride() { return 2048; } // TBD, this is just the default value from WebGPU\n get maxInterStageShaderComponents() { return this.getParameter(GL.MAX_VARYING_COMPONENTS); }\n get maxComputeWorkgroupStorageSize() { return 0; } // WebGL does not support compute shaders\n get maxComputeInvocationsPerWorkgroup() { return 0; } // WebGL does not support compute shaders\n get maxComputeWorkgroupSizeX() { return 0; } // WebGL does not support compute shaders\n get maxComputeWorkgroupSizeY() { return 0; } // WebGL does not support compute shaders\n get maxComputeWorkgroupSizeZ() { return 0; } // WebGL does not support compute shaders\n get maxComputeWorkgroupsPerDimension() { return 0;} // WebGL does not support compute shaders\n\n // PRIVATE\n\n protected gl: WebGL2RenderingContext;\n protected limits: Partial<Record<GL, number>> = {};\n\n constructor(gl: WebGL2RenderingContext) {\n super();\n this.gl = gl;\n }\n\n protected getParameter(parameter: GL): number {\n if (this.limits[parameter] === undefined) {\n this.limits[parameter] = this.gl.getParameter(parameter);\n }\n return this.limits[parameter] || 0;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {CanvasContextProps, TextureFormat} from '@luma.gl/core';\nimport {CanvasContext} from '@luma.gl/core';\nimport {WebGLDevice} from './webgl-device';\nimport {WEBGLFramebuffer} from './resources/webgl-framebuffer';\n\n/**\n * A WebGL Canvas Context which manages the canvas and handles drawing buffer resizing etc\n */\nexport class WebGLCanvasContext extends CanvasContext {\n readonly device: WebGLDevice;\n readonly format: TextureFormat = 'rgba8unorm';\n readonly depthStencilFormat: TextureFormat = 'depth24plus';\n\n presentationSize: [number, number];\n private _framebuffer: WEBGLFramebuffer | null = null;\n\n get [Symbol.toStringTag](): string {\n return 'WebGLCanvasContext';\n }\n\n constructor(device: WebGLDevice, props: CanvasContextProps) {\n // Note: Base class creates / looks up the canvas (unless under Node.js)\n super(props);\n this.device = device;\n this.presentationSize = [-1, -1];\n this._setAutoCreatedCanvasId(`${this.device.id}-canvas`);\n this.update();\n }\n\n getCurrentFramebuffer(): WEBGLFramebuffer {\n this.update();\n // Setting handle to null returns a reference to the default framebuffer\n this._framebuffer = this._framebuffer || new WEBGLFramebuffer(this.device, {handle: null});\n return this._framebuffer;\n }\n\n /** Resizes and updates render targets if necessary */\n update() {\n const size = this.getPixelSize();\n const sizeChanged =\n size[0] !== this.presentationSize[0] || size[1] !== this.presentationSize[1];\n if (sizeChanged) {\n this.presentationSize = size;\n this.resize();\n }\n }\n\n /**\n * Resize the canvas' drawing buffer.\n *\n * Can match the canvas CSS size, and optionally also consider devicePixelRatio\n * Can be called every frame\n *\n * Regardless of size, the drawing buffer will always be scaled to the viewport, but\n * for best visual results, usually set to either:\n * canvas CSS width x canvas CSS height\n * canvas CSS width * devicePixelRatio x canvas CSS height * devicePixelRatio\n * See http://webgl2fundamentals.org/webgl/lessons/webgl-resizing-the-canvas.html\n */\n resize(options?: {width?: number; height?: number; useDevicePixels?: boolean | number}): void {\n if (!this.device.gl) return;\n\n // Resize browser context .\n if (this.canvas) {\n const devicePixelRatio = this.getDevicePixelRatio(options?.useDevicePixels);\n this.setDevicePixelRatio(devicePixelRatio, options);\n return;\n }\n }\n\n commit() {\n // gl.commit was ultimately removed from the WebGL standard??\n // if (this.offScreen && this.gl.commit) {\n // // @ts-expect-error gl.commit is not officially part of WebGL2RenderingContext\n // this.gl.commit();\n // }\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {FramebufferProps} from '@luma.gl/core';\nimport {Framebuffer} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\nimport {WebGLDevice} from '../webgl-device';\nimport {WEBGLTexture} from './webgl-texture';\nimport {WEBGLTextureView} from './webgl-texture-view';\nimport {getDepthStencilAttachmentWebGL} from '../converters/webgl-texture-table';\n\nexport type Attachment = WEBGLTextureView | WEBGLTexture; // | WEBGLRenderbuffer;\n\n/** luma.gl Framebuffer, WebGL implementation */\nexport class WEBGLFramebuffer extends Framebuffer {\n device: WebGLDevice;\n gl: WebGL2RenderingContext;\n handle: WebGLFramebuffer;\n\n colorAttachments: WEBGLTextureView[] = [];\n depthStencilAttachment: WEBGLTextureView | null = null;\n\n constructor(device: WebGLDevice, props: FramebufferProps) {\n super(device, props);\n\n // WebGL default framebuffer handle is null\n const isDefaultFramebuffer = props.handle === null;\n\n this.device = device;\n this.gl = device.gl;\n this.handle =\n this.props.handle || isDefaultFramebuffer ? this.props.handle : this.gl.createFramebuffer();\n\n if (!isDefaultFramebuffer) {\n // default framebuffer handle is null, so we can't set spector metadata...\n device.setSpectorMetadata(this.handle, {id: this.props.id, props: this.props});\n\n // Auto create textures for attachments if needed\n this.autoCreateAttachmentTextures();\n\n this.updateAttachments();\n }\n }\n\n /** destroys any auto created resources etc. */\n override destroy(): void {\n super.destroy(); // destroys owned resources etc.\n if (!this.destroyed && this.handle !== null) {\n this.gl.deleteFramebuffer(this.handle);\n // this.handle = null;\n }\n }\n\n protected updateAttachments(): void {\n /** Attach from a map of attachments */\n // @ts-expect-error native bindFramebuffer is overridden by our state tracker\n const prevHandle: WebGLFramebuffer | null = this.gl.bindFramebuffer(\n GL.FRAMEBUFFER,\n this.handle\n );\n\n // Walk the attachments\n for (let i = 0; i < this.colorAttachments.length; ++i) {\n const attachment = this.colorAttachments[i];\n if (attachment) {\n const attachmentPoint = GL.COLOR_ATTACHMENT0 + i;\n this._attachTextureView(attachmentPoint, attachment);\n }\n }\n\n if (this.depthStencilAttachment) {\n const attachmentPoint = getDepthStencilAttachmentWebGL(\n this.depthStencilAttachment.props.format\n );\n this._attachTextureView(attachmentPoint, this.depthStencilAttachment);\n }\n\n /** Check the status */\n if (this.device.props.debug) {\n const status = this.gl.checkFramebufferStatus(GL.FRAMEBUFFER) as GL;\n if (status !== GL.FRAMEBUFFER_COMPLETE) {\n throw new Error(`Framebuffer ${_getFrameBufferStatus(status)}`);\n }\n }\n\n this.gl.bindFramebuffer(GL.FRAMEBUFFER, prevHandle);\n }\n\n // PRIVATE\n\n /** In WebGL we must use renderbuffers for depth/stencil attachments (unless we have extensions) */\n // protected override createDepthStencilTexture(format: TextureFormat): Texture {\n // // return new WEBGLRenderbuffer(this.device, {\n // return new WEBGLTexture(this.device, {\n // id: `${this.id}-depth-stencil`,\n // format,\n // width: this.width,\n // height: this.height,\n // mipmaps: false\n // });\n // }\n\n /**\n * @param attachment\n * @param texture\n * @param layer = 0 - index into WEBGLTextureArray and Texture3D or face for `TextureCubeMap`\n * @param level = 0 - mipmapLevel\n */\n protected _attachTextureView(attachment: GL, textureView: WEBGLTextureView): void {\n const {gl} = this.device;\n const {texture} = textureView;\n const level = textureView.props.baseMipLevel;\n const layer = textureView.props.baseArrayLayer;\n\n gl.bindTexture(texture.glTarget, texture.handle);\n\n switch (texture.glTarget) {\n case GL.TEXTURE_2D_ARRAY:\n case GL.TEXTURE_3D:\n gl.framebufferTextureLayer(GL.FRAMEBUFFER, attachment, texture.handle, level, layer);\n break;\n\n case GL.TEXTURE_CUBE_MAP:\n // layer must be a cubemap face (or if index, converted to cube map face)\n const face = mapIndexToCubeMapFace(layer);\n gl.framebufferTexture2D(GL.FRAMEBUFFER, attachment, face, texture.handle, level);\n break;\n\n case GL.TEXTURE_2D:\n gl.framebufferTexture2D(GL.FRAMEBUFFER, attachment, GL.TEXTURE_2D, texture.handle, level);\n break;\n\n default:\n throw new Error('Illegal texture type');\n }\n\n gl.bindTexture(texture.glTarget, null);\n }\n}\n\n// Helper functions\n\n// Map an index to a cube map face constant\nfunction mapIndexToCubeMapFace(layer: number | GL): GL {\n // TEXTURE_CUBE_MAP_POSITIVE_X is a big value (0x8515)\n // if smaller assume layer is index, otherwise assume it is already a cube map face constant\n return layer < (GL.TEXTURE_CUBE_MAP_POSITIVE_X as number)\n ? layer + GL.TEXTURE_CUBE_MAP_POSITIVE_X\n : layer;\n}\n\n// Helper METHODS\n// Get a string describing the framebuffer error if installed\nfunction _getFrameBufferStatus(status: GL) {\n switch (status) {\n case GL.FRAMEBUFFER_COMPLETE:\n return 'success';\n case GL.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:\n return 'Mismatched attachments';\n case GL.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:\n return 'No attachments';\n case GL.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:\n return 'Height/width mismatch';\n case GL.FRAMEBUFFER_UNSUPPORTED:\n return 'Unsupported or split attachments';\n // WebGL2\n case GL.FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:\n return 'Samples mismatch';\n // OVR_multiview2 extension\n // case GL.FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR: return 'baseViewIndex mismatch';\n default:\n return `${status}`;\n }\n}\n\n/**\n * Attachment resize is expected to be a noop if size is same\n *\nprotected override resizeAttachments(width: number, height: number): this {\n // for default framebuffer, just update the stored size\n if (this.handle === null) {\n // assert(width === undefined && height === undefined);\n this.width = this.gl.drawingBufferWidth;\n this.height = this.gl.drawingBufferHeight;\n return this;\n }\n\n if (width === undefined) {\n width = this.gl.drawingBufferWidth;\n }\n if (height === undefined) {\n height = this.gl.drawingBufferHeight;\n }\n\n // TODO Not clear that this is better than default destroy/create implementation\n\n for (const colorAttachment of this.colorAttachments) {\n colorAttachment.texture.clone({width, height});\n }\n if (this.depthStencilAttachment) {\n this.depthStencilAttachment.texture.resize({width, height});\n }\n return this;\n}\n*/\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {log} from '@luma.gl/core';\nimport {loadScript} from '../../utils/load-script';\n\nimport type {Spector} from './spector-types';\n\n/** Spector debug initialization options */\ntype SpectorProps = {\n /** Whether spector.js is enabled */\n debugSpectorJS?: boolean;\n /** URL to load spector script from. Typically a CDN URL */\n debugSpectorJSUrl?: string;\n /** Canvas to monitor */\n gl?: WebGL2RenderingContext;\n};\n\nconst LOG_LEVEL = 1;\n\nlet spector: Spector = null;\nlet initialized: boolean = false;\n\ndeclare global {\n // @ts-ignore\n // eslint-disable-next-line no-var\n var SPECTOR: Spector;\n}\n\nexport const DEFAULT_SPECTOR_PROPS: Required<SpectorProps> = {\n debugSpectorJS: log.get('debug-spectorjs'),\n // https://github.com/BabylonJS/Spector.js#basic-usage\n // https://forum.babylonjs.com/t/spectorcdn-is-temporarily-off/48241\n // spectorUrl: 'https://spectorcdn.babylonjs.com/spector.bundle.js';\n debugSpectorJSUrl: 'https://cdn.jsdelivr.net/npm/spectorjs@0.9.30/dist/spector.bundle.js',\n gl: undefined!\n};\n\n/** Loads spector from CDN if not already installed */\nexport async function loadSpectorJS(props: {debugSpectorJSUrl?: string}): Promise<void> {\n if (!globalThis.SPECTOR) {\n try {\n await loadScript(props.debugSpectorJSUrl || DEFAULT_SPECTOR_PROPS.debugSpectorJSUrl);\n } catch (error) {\n log.warn(String(error));\n }\n }\n}\n\nexport function initializeSpectorJS(props: SpectorProps): Spector | null {\n props = {...DEFAULT_SPECTOR_PROPS, ...props};\n if (!props.debugSpectorJS) {\n return null;\n }\n\n if (!spector && globalThis.SPECTOR && !globalThis.luma?.spector) {\n log.probe(LOG_LEVEL, 'SPECTOR found and initialized. Start with `luma.spector.displayUI()`')();\n const {Spector: SpectorJS} = globalThis.SPECTOR as any;\n spector = new SpectorJS();\n if (globalThis.luma) {\n (globalThis.luma as any).spector = spector;\n }\n }\n\n if (!spector) {\n return null;\n }\n\n if (!initialized) {\n initialized = true;\n\n // enables recording some extra information merged in the capture like texture memory sizes and formats\n spector.spyCanvases();\n // A callback when results are ready\n spector?.onCaptureStarted.add((capture: unknown) =>\n log.info('Spector capture started:', capture)()\n );\n spector?.onCapture.add((capture: unknown) => {\n log.info('Spector capture complete:', capture)();\n // Use undocumented Spector API to open the UI with our capture\n // See https://github.com/BabylonJS/Spector.js/blob/767ad1195a25b85a85c381f400eb50a979239eca/src/spector.ts#L124\n spector?.getResultUI();\n // @ts-expect-error private\n spector?.resultView.display();\n // @ts-expect-error private\n spector?.resultView.addCapture(capture);\n });\n }\n\n if (props.gl) {\n // capture startup\n const gl = props.gl;\n // @ts-expect-error\n const device = gl.device;\n spector?.startCapture(props.gl, 500); // 500 commands\n // @ts-expect-error\n gl.device = device;\n\n new Promise(resolve => setTimeout(resolve, 2000)).then(_ => {\n log.info('Spector capture stopped after 2 seconds')();\n spector?.stopCapture();\n // spector?.displayUI();\n });\n }\n\n return spector;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/**\n * Load a script (identified by an url). When the url returns, the\n * content of this file is added into a new script element, attached to the DOM (body element)\n * @param scriptUrl defines the url of the script to laod\n * @param scriptId defines the id of the script element\n */\nexport async function loadScript(scriptUrl: string, scriptId?: string): Promise<Event> {\n const head = document.getElementsByTagName('head')[0];\n if (!head) {\n throw new Error('loadScript');\n }\n\n const script = document.createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', scriptUrl);\n if (scriptId) {\n script.id = scriptId;\n }\n\n return new Promise((resolve, reject) => {\n script.onload = resolve;\n script.onerror = error =>\n reject(new Error(`Unable to load script '${scriptUrl}': ${error as string}`));\n head.appendChild(script);\n });\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {log} from '@luma.gl/core';\n// Rename constant to prevent inlining. We need the full set of constants for generating debug strings.\nimport {GL as GLEnum} from '@luma.gl/constants';\nimport {isBrowser} from '@probe.gl/env';\nimport {loadScript} from '../../utils/load-script';\n\nconst WEBGL_DEBUG_CDN_URL = 'https://unpkg.com/webgl-debug@2.0.1/index.js';\n\ntype DebugContextProps = {\n debugWebGL?: boolean;\n traceWebGL?: boolean;\n};\n\ntype ContextData = {\n realContext?: WebGL2RenderingContext;\n debugContext?: WebGL2RenderingContext;\n};\n\n// Helper to get shared context data\nfunction getWebGLContextData(gl: any): ContextData {\n gl.luma = gl.luma || {};\n return gl.luma;\n}\n\ndeclare global {\n // eslint-disable-next-line no-var\n var WebGLDebugUtils: any;\n}\n\n/**\n * Loads Khronos WebGLDeveloperTools from CDN if not already installed\n * const WebGLDebugUtils = require('webgl-debug');\n * @see https://github.com/KhronosGroup/WebGLDeveloperTools\n * @see https://github.com/vorg/webgl-debug\n */\nexport async function loadWebGLDeveloperTools(): Promise<void> {\n if (isBrowser() && !globalThis.WebGLDebugUtils) {\n globalThis.global = globalThis.global || globalThis;\n // @ts-expect-error Developer tools expects global to be set\n globalThis.global.module = {};\n await loadScript(WEBGL_DEBUG_CDN_URL);\n }\n}\n\n// Returns (a potentially new) context with debug instrumentation turned off or on.\n// Note that this actually returns a new context\nexport function makeDebugContext(\n gl: WebGL2RenderingContext,\n props: DebugContextProps = {}\n): WebGL2RenderingContext {\n return props.debugWebGL || props.traceWebGL ? getDebugContext(gl, props) : getRealContext(gl);\n}\n\n// Returns the real context from either of the real/debug contexts\nfunction getRealContext(gl: WebGL2RenderingContext): WebGL2RenderingContext {\n const data = getWebGLContextData(gl);\n // If the context has a realContext member, it is a debug context so return the realContext\n return data.realContext ? data.realContext : gl;\n}\n\n// Returns the debug context from either of the real/debug contexts\nfunction getDebugContext(\n gl: WebGL2RenderingContext,\n props: DebugContextProps\n): WebGL2RenderingContext {\n if (!globalThis.WebGLDebugUtils) {\n log.warn('webgl-debug not loaded')();\n return gl;\n }\n\n const data = getWebGLContextData(gl);\n\n // If this already has a debug context, return it.\n if (data.debugContext) {\n return data.debugContext;\n }\n\n // Create a new debug context\n globalThis.WebGLDebugUtils.init({...GLEnum, ...gl});\n const glDebug = globalThis.WebGLDebugUtils.makeDebugContext(\n gl,\n onGLError.bind(null, props),\n onValidateGLFunc.bind(null, props)\n );\n\n // Make sure we have all WebGL2 and extension constants (todo dynamic import to circumvent minification?)\n for (const key in GLEnum) {\n if (!(key in glDebug) && typeof GLEnum[key] === 'number') {\n glDebug[key] = GLEnum[key];\n }\n }\n\n // Ensure we have a clean prototype on the instrumented object\n // Note: setPrototypeOf does come with perf warnings, but we already take a bigger perf reduction\n // by synchronizing the WebGL errors after each WebGL call.\n class WebGLDebugContext {}\n Object.setPrototypeOf(glDebug, Object.getPrototypeOf(gl));\n Object.setPrototypeOf(WebGLDebugContext, glDebug);\n const debugContext = Object.create(WebGLDebugContext);\n // Store the debug context\n data.realContext = gl;\n data.debugContext = debugContext;\n debugContext.debug = true;\n\n // Return it\n return debugContext;\n}\n\n// DEBUG TRACING\n\nfunction getFunctionString(functionName: string, functionArgs): string {\n // Cover bug in webgl-debug-tools\n functionArgs = Array.from(functionArgs).map(arg => (arg === undefined ? 'undefined' : arg));\n let args = globalThis.WebGLDebugUtils.glFunctionArgsToString(functionName, functionArgs);\n args = `${args.slice(0, 100)}${args.length > 100 ? '...' : ''}`;\n return `gl.${functionName}(${args})`;\n}\n\nfunction onGLError(props: DebugContextProps, err, functionName: string, args: any[]): void {\n // Cover bug in webgl-debug-tools\n args = Array.from(args).map(arg => (arg === undefined ? 'undefined' : arg));\n const errorMessage = globalThis.WebGLDebugUtils.glEnumToString(err);\n const functionArgs = globalThis.WebGLDebugUtils.glFunctionArgsToString(functionName, args);\n const message = `${errorMessage} in gl.${functionName}(${functionArgs})`;\n log.error(message)();\n debugger; // eslint-disable-line\n // throw new Error(message);\n}\n\n// Don't generate function string until it is needed\nfunction onValidateGLFunc(\n props: DebugContextProps,\n functionName: string,\n functionArgs: any[]\n): void {\n let functionString: string = '';\n if (log.level >= 1) {\n functionString = getFunctionString(functionName, functionArgs);\n if (props.traceWebGL) {\n log.log(1, functionString)();\n }\n }\n\n for (const arg of functionArgs) {\n if (arg === undefined) {\n functionString = functionString || getFunctionString(functionName, functionArgs);\n debugger; // eslint-disable-line\n // throw new Error(`Undefined argument: ${functionString}`);\n }\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nconst uidCounters: Record<string, number> = {};\n\n/**\n * Returns a UID.\n * @param id= - Identifier base name\n * @return uid\n **/\nexport function uid(id: string = 'id'): string {\n uidCounters[id] = uidCounters[id] || 1;\n const count = uidCounters[id]++;\n return `${id}-${count}`;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {BufferProps} from '@luma.gl/core';\nimport {Buffer} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\nimport {WebGLDevice} from '../webgl-device';\n\n/** WebGL Buffer interface */\nexport class WEBGLBuffer extends Buffer {\n readonly device: WebGLDevice;\n readonly gl: WebGL2RenderingContext;\n readonly handle: WebGLBuffer;\n\n /** Target in OpenGL defines the type of buffer */\n readonly glTarget: GL.ARRAY_BUFFER | GL.ELEMENT_ARRAY_BUFFER | GL.UNIFORM_BUFFER;\n /** Usage is a hint on how frequently the buffer will be updates */\n readonly glUsage: GL.STATIC_DRAW | GL.DYNAMIC_DRAW;\n /** Index type is needed when issuing draw calls, so we pre-compute it */\n readonly glIndexType: GL.UNSIGNED_SHORT | GL.UNSIGNED_INT = GL.UNSIGNED_SHORT;\n\n /** Number of bytes allocated on the GPU for this buffer */\n byteLength: number;\n /** Number of bytes used */\n bytesUsed: number;\n\n constructor(device: WebGLDevice, props: BufferProps = {}) {\n super(device, props);\n\n this.device = device;\n this.gl = this.device.gl;\n\n const handle = typeof props === 'object' ? props.handle : undefined;\n this.handle = handle || this.gl.createBuffer();\n device.setSpectorMetadata(this.handle, {...this.props, data: typeof this.props.data});\n\n // - In WebGL1, need to make sure we use GL.ELEMENT_ARRAY_BUFFER when initializing element buffers\n // otherwise buffer type will lock to generic (non-element) buffer\n // - In WebGL2, we can use GL.COPY_READ_BUFFER which avoids locking the type here\n this.glTarget = getWebGLTarget(this.props.usage);\n this.glUsage = getWebGLUsage(this.props.usage);\n this.glIndexType = this.props.indexType === 'uint32' ? GL.UNSIGNED_INT : GL.UNSIGNED_SHORT;\n\n // Set data: (re)initializes the buffer\n if (props.data) {\n this._initWithData(props.data, props.byteOffset, props.byteLength);\n } else {\n this._initWithByteLength(props.byteLength || 0);\n }\n }\n\n // PRIVATE METHODS\n\n /** Allocate a new buffer and initialize to contents of typed array */\n _initWithData(\n data: ArrayBuffer | ArrayBufferView,\n byteOffset: number = 0,\n byteLength: number = data.byteLength + byteOffset\n ): void {\n // const glTarget = this.device.isWebGL2 ? GL.COPY_WRITE_BUFFER : this.glTarget;\n const glTarget = this.glTarget;\n this.gl.bindBuffer(glTarget, this.handle);\n this.gl.bufferData(glTarget, byteLength, this.glUsage);\n this.gl.bufferSubData(glTarget, byteOffset, data);\n this.gl.bindBuffer(glTarget, null);\n\n this.bytesUsed = byteLength;\n this.byteLength = byteLength;\n\n this._setDebugData(data, byteOffset, byteLength);\n this.trackAllocatedMemory(byteLength);\n }\n\n // Allocate a GPU buffer of specified size.\n _initWithByteLength(byteLength: number): this {\n // assert(byteLength >= 0);\n\n // Workaround needed for Safari (#291):\n // gl.bufferData with size equal to 0 crashes. Instead create zero sized array.\n let data = byteLength;\n if (byteLength === 0) {\n // @ts-expect-error\n data = new Float32Array(0);\n }\n\n // const glTarget = this.device.isWebGL2 ? GL.COPY_WRITE_BUFFER : this.glTarget;\n const glTarget = this.glTarget;\n\n this.gl.bindBuffer(glTarget, this.handle);\n this.gl.bufferData(glTarget, data, this.glUsage);\n this.gl.bindBuffer(glTarget, null);\n\n this.bytesUsed = byteLength;\n this.byteLength = byteLength;\n\n this._setDebugData(null, 0, byteLength);\n this.trackAllocatedMemory(byteLength);\n\n return this;\n }\n\n override destroy(): void {\n if (!this.destroyed && this.handle) {\n this.removeStats();\n this.trackDeallocatedMemory();\n this.gl.deleteBuffer(this.handle);\n this.destroyed = true;\n // @ts-expect-error\n this.handle = null;\n }\n }\n\n override write(data: ArrayBufferView, byteOffset: number = 0): void {\n const srcOffset = 0;\n const byteLength = undefined; // data.byteLength;\n\n // Create the buffer - binding it here for the first time locks the type\n // In WebGL2, use GL.COPY_WRITE_BUFFER to avoid locking the type\n const glTarget = GL.COPY_WRITE_BUFFER;\n this.gl.bindBuffer(glTarget, this.handle);\n // WebGL2: subData supports additional srcOffset and length parameters\n if (srcOffset !== 0 || byteLength !== undefined) {\n this.gl.bufferSubData(glTarget, byteOffset, data, srcOffset, byteLength);\n } else {\n this.gl.bufferSubData(glTarget, byteOffset, data);\n }\n this.gl.bindBuffer(glTarget, null);\n\n this._setDebugData(data, byteOffset, data.byteLength);\n }\n\n /** Asynchronously read data from the buffer */\n override async readAsync(byteOffset = 0, byteLength?: number): Promise<Uint8Array> {\n return this.readSyncWebGL(byteOffset, byteLength);\n }\n\n /** Synchronously read data from the buffer. WebGL only. */\n override readSyncWebGL(byteOffset = 0, byteLength?: number): Uint8Array {\n byteLength = byteLength ?? this.byteLength - byteOffset;\n const data = new Uint8Array(byteLength);\n const dstOffset = 0;\n\n // Use GL.COPY_READ_BUFFER to avoid disturbing other targets and locking type\n this.gl.bindBuffer(GL.COPY_READ_BUFFER, this.handle);\n this.gl.getBufferSubData(GL.COPY_READ_BUFFER, byteOffset, data, dstOffset, byteLength);\n this.gl.bindBuffer(GL.COPY_READ_BUFFER, null);\n\n // Update local `data` if offsets are 0\n this._setDebugData(data, byteOffset, byteLength);\n\n return data;\n }\n}\n\n/**\n * Returns a WebGL buffer target\n *\n * @param usage\n * static MAP_READ = 0x01;\n * static MAP_WRITE = 0x02;\n * static COPY_SRC = 0x0004;\n * static COPY_DST = 0x0008;\n * static INDEX = 0x0010;\n * static VERTEX = 0x0020;\n * static UNIFORM = 0x0040;\n * static STORAGE = 0x0080;\n * static INDIRECT = 0x0100;\n * static QUERY_RESOLVE = 0x0200;\n *\n * @returns WebGL buffer targe\n *\n * Buffer bind points in WebGL2\n * gl.COPY_READ_BUFFER: Buffer for copying from one buffer object to another.\n * gl.COPY_WRITE_BUFFER: Buffer for copying from one buffer object to another.\n * gl.TRANSFORM_FEEDBACK_BUFFER: Buffer for transform feedback operations.\n * gl.PIXEL_PACK_BUFFER: Buffer used for pixel transfer operations.\n * gl.PIXEL_UNPACK_BUFFER: Buffer used for pixel transfer operations.\n */\nfunction getWebGLTarget(\n usage: number\n): GL.ARRAY_BUFFER | GL.ELEMENT_ARRAY_BUFFER | GL.UNIFORM_BUFFER {\n if (usage & Buffer.INDEX) {\n return GL.ELEMENT_ARRAY_BUFFER;\n }\n if (usage & Buffer.VERTEX) {\n return GL.ARRAY_BUFFER;\n }\n if (usage & Buffer.UNIFORM) {\n return GL.UNIFORM_BUFFER;\n }\n\n // Binding a buffer for the first time locks the type\n // In WebGL2, we can use GL.COPY_WRITE_BUFFER to avoid locking the type\n return GL.ARRAY_BUFFER;\n}\n\n/** @todo usage is not passed correctly */\nfunction getWebGLUsage(usage: number): GL.STATIC_DRAW | GL.DYNAMIC_DRAW {\n if (usage & Buffer.INDEX) {\n return GL.STATIC_DRAW;\n }\n if (usage & Buffer.VERTEX) {\n return GL.STATIC_DRAW;\n }\n if (usage & Buffer.UNIFORM) {\n return GL.DYNAMIC_DRAW;\n }\n return GL.STATIC_DRAW;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Shader, ShaderProps, CompilerMessage, log} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\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, 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 get asyncCompilationStatus(): Promise<'pending' | 'success' | 'error'> {\n return this._waitForCompilationComplete().then(() => this.compilationStatus);\n }\n\n override async getCompilationInfo(): Promise<readonly CompilerMessage[]> {\n await this._waitForCompilationComplete();\n return this.getCompilationInfoSync();\n }\n\n override getCompilationInfoSync(): readonly CompilerMessage[] {\n const shaderLog = this.device.gl.getShaderInfoLog(this.handle);\n return shaderLog ? parseShaderCompilerLog(shaderLog) : [];\n }\n\n override getTranslatedSource(): string | null {\n const extensions = this.device.getExtension('WEBGL_debug_shaders');\n const ext = extensions.WEBGL_debug_shaders;\n return ext?.getTranslatedShaderSource(this.handle) || null;\n }\n\n // PRIVATE METHODS\n\n /** Compile a shader and get compilation status */\n protected async _compile(source: string): Promise<void> {\n source = source.startsWith('#version ') ? source : `#version 300 es\\n${source}`;\n\n const {gl} = this.device;\n gl.shaderSource(this.handle, source);\n gl.compileShader(this.handle);\n\n // For performance reasons, avoid checking shader compilation errors on production\n if (!this.device.props.debug) {\n this.compilationStatus = 'pending';\n return;\n }\n\n // Sync case - slower, but advantage is that it throws in the constructor, making break on error more useful\n if (!this.device.features.has('compilation-status-async-webgl')) {\n this._getCompilationStatus();\n // The `Shader` base class will determine if debug window should be opened based on this.compilationStatus\n this.debugShader();\n if (this.compilationStatus === 'error') {\n throw new Error(`GLSL compilation errors in ${this.props.stage} shader ${this.props.id}`);\n }\n return;\n }\n\n // async case\n log.once(1, 'Shader compilation is asynchronous')();\n await this._waitForCompilationComplete();\n log.info(2, `Shader ${this.id} - async compilation complete: ${this.compilationStatus}`)();\n this._getCompilationStatus();\n\n // The `Shader` base class will determine if debug window should be opened based on this.compilationStatus\n this.debugShader();\n }\n\n /** Use KHR_parallel_shader_compile extension if available */\n protected async _waitForCompilationComplete(): Promise<void> {\n const waitMs = async (ms: number) => await new Promise(resolve => setTimeout(resolve, ms));\n const DELAY_MS = 10; // Shader compilation is typically quite fast (with some exceptions)\n\n // If status polling is not available, we can't wait for completion. Just wait a little to minimize blocking\n if (!this.device.features.has('compilation-status-async-webgl')) {\n await waitMs(DELAY_MS);\n return;\n }\n\n const {gl} = this.device;\n for (;;) {\n const complete = gl.getShaderParameter(this.handle, GL.COMPLETION_STATUS_KHR);\n if (complete) {\n return;\n }\n await waitMs(DELAY_MS);\n }\n }\n\n /**\n * Get the shader compilation status\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 */\n protected _getCompilationStatus() {\n this.compilationStatus = this.device.gl.getShaderParameter(this.handle, GL.COMPILE_STATUS)\n ? 'success'\n : 'error';\n }\n}\n\n// TODO - Original code from luma.gl v8 - keep until new debug functionality has matured\n// if (!compilationSuccess) {\n// const parsedLog = shaderLog ? parseShaderCompilerLog(shaderLog) : [];\n// const messages = parsedLog.filter(message => message.type === 'error');\n// const formattedLog = formatCompilerLog(messages, source, {showSourceCode: 'all', html: true});\n// const shaderDescription = `${this.stage} shader ${shaderName}`;\n// log.error(`GLSL compilation errors in ${shaderDescription}\\n${formattedLog}`)();\n// displayShaderLog(parsedLog, source, shaderName);\n// }\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {CompilerMessage} from '@luma.gl/core';\n\n/**\n * Parse a WebGL-format GLSL compilation log into an array of WebGPU style message records.\n * This follows documented WebGL conventions for compilation logs.\n * Based on https://github.com/wwwtyro/gl-format-compiler-error (public domain)\n */\nexport function parseShaderCompilerLog(errLog: string): readonly CompilerMessage[] {\n // Parse the error - note: browser and driver dependent\n const lines = errLog.split(/\\r?\\n/);\n\n const messages: CompilerMessage[] = [];\n\n for (const line of lines) {\n if (line.length <= 1) {\n continue; // eslint-disable-line no-continue\n }\n\n const segments: string[] = line.split(':');\n\n // Check for messages with no line information `ERROR: unsupported shader version`\n if (segments.length === 2) {\n const [messageType, message] = segments;\n messages.push({\n message: message.trim(),\n type: getMessageType(messageType),\n lineNum: 0,\n linePos: 0\n });\n continue; // eslint-disable-line no-continue\n }\n\n const [messageType, linePosition, lineNumber, ...rest] = segments;\n\n let lineNum = parseInt(lineNumber, 10);\n if (isNaN(lineNum)) {\n lineNum = 0;\n }\n\n let linePos = parseInt(linePosition, 10);\n if (isNaN(linePos)) {\n linePos = 0;\n }\n\n messages.push({\n message: rest.join(':').trim(),\n type: getMessageType(messageType),\n lineNum,\n linePos // TODO\n });\n }\n\n return messages;\n}\n\n/** Ensure supported type */\nfunction getMessageType(messageType: string): 'warning' | 'error' | 'info' {\n const MESSAGE_TYPES = ['warning', 'error', 'info'];\n const lowerCaseType = messageType.toLowerCase();\n return (MESSAGE_TYPES.includes(lowerCaseType) ? lowerCaseType : 'info') as\n | 'warning'\n | 'error'\n | 'info';\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\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 * 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 this.handle = this.handle || this.device.gl.createSampler();\n this._setSamplerParameters(this.parameters);\n }\n\n override destroy(): void {\n if (this.handle) {\n this.device.gl.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) as GL.TEXTURE_MIN_LOD | GL.TEXTURE_MAX_LOD;\n switch (param) {\n case GL.TEXTURE_MIN_LOD:\n case GL.TEXTURE_MAX_LOD:\n this.device.gl.samplerParameterf(this.handle, param, value);\n break;\n default:\n this.device.gl.samplerParameteri(this.handle, param, value);\n break;\n }\n }\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// SAMPLER FILTERS\nimport {SamplerProps} from '@luma.gl/core';\nimport {GL, GLSamplerParameters} from '@luma.gl/constants';\nimport {convertCompareFunction} from './device-parameters';\n\n/**\n * Convert WebGPU-style sampler props to WebGL\n * @param props\n * @returns\n */\nexport function convertSamplerParametersToWebGL(props: SamplerProps): GLSamplerParameters {\n const params: GLSamplerParameters = {};\n if (props.addressModeU) {\n params[GL.TEXTURE_WRAP_S] = convertAddressMode(props.addressModeU);\n }\n if (props.addressModeV) {\n params[GL.TEXTURE_WRAP_T] = convertAddressMode(props.addressModeV);\n }\n if (props.addressModeW) {\n params[GL.TEXTURE_WRAP_R] = convertAddressMode(props.addressModeW);\n }\n if (props.magFilter) {\n params[GL.TEXTURE_MAG_FILTER] = convertMaxFilterMode(props.magFilter);\n }\n if (props.minFilter || props.mipmapFilter) {\n // TODO - arbitrary choice of linear?\n params[GL.TEXTURE_MIN_FILTER] = convertMinFilterMode(\n props.minFilter || 'linear',\n props.mipmapFilter\n );\n }\n if (props.lodMinClamp !== undefined) {\n params[GL.TEXTURE_MIN_LOD] = props.lodMinClamp;\n }\n if (props.lodMaxClamp !== undefined) {\n params[GL.TEXTURE_MAX_LOD] = props.lodMaxClamp;\n }\n if (props.type === 'comparison-sampler') {\n // Setting prop.compare turns this into a comparison sampler\n params[GL.TEXTURE_COMPARE_MODE] = GL.COMPARE_REF_TO_TEXTURE;\n }\n if (props.compare) {\n params[GL.TEXTURE_COMPARE_FUNC] = convertCompareFunction('compare', props.compare);\n }\n // Note depends on WebGL extension\n if (props.maxAnisotropy) {\n params[GL.TEXTURE_MAX_ANISOTROPY_EXT] = props.maxAnisotropy;\n }\n return params;\n}\n\n// HELPERS\n\n/** Convert address more */\nfunction convertAddressMode(\n addressMode: 'clamp-to-edge' | 'repeat' | 'mirror-repeat'\n): GL.CLAMP_TO_EDGE | GL.REPEAT | GL.MIRRORED_REPEAT {\n switch (addressMode) {\n case 'clamp-to-edge':\n return GL.CLAMP_TO_EDGE;\n case 'repeat':\n return GL.REPEAT;\n case 'mirror-repeat':\n return GL.MIRRORED_REPEAT;\n }\n}\n\nfunction convertMaxFilterMode(maxFilter: 'nearest' | 'linear'): GL.NEAREST | GL.LINEAR {\n switch (maxFilter) {\n case 'nearest':\n return GL.NEAREST;\n case 'linear':\n return GL.LINEAR;\n }\n}\n\n/**\n * WebGPU has separate min filter and mipmap filter,\n * WebGL is combined and effectively offers 6 options\n */\nfunction convertMinFilterMode(\n minFilter: 'nearest' | 'linear',\n mipmapFilter: 'none' | 'nearest' | 'linear' = 'none'\n):\n | GL.NEAREST\n | GL.LINEAR\n | GL.NEAREST_MIPMAP_NEAREST\n | GL.LINEAR_MIPMAP_NEAREST\n | GL.NEAREST_MIPMAP_LINEAR\n | GL.LINEAR_MIPMAP_LINEAR {\n if (!mipmapFilter) {\n return convertMaxFilterMode(minFilter);\n }\n switch (mipmapFilter) {\n case 'none':\n return convertMaxFilterMode(minFilter);\n case 'nearest':\n return minFilter === 'nearest' ? GL.NEAREST_MIPMAP_NEAREST : GL.NEAREST_MIPMAP_LINEAR;\n case 'linear':\n return minFilter === 'nearest' ? GL.LINEAR_MIPMAP_NEAREST : GL.LINEAR_MIPMAP_LINEAR;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {CompareFunction, StencilOperation, BlendOperation, BlendFactor} from '@luma.gl/core';\nimport {Device, log, Parameters, PolygonMode, ProvokingVertex} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\nimport type {\n GLBlendEquation,\n GLBlendFunction,\n GLFunction,\n GLParameters,\n GLPolygonMode,\n GLProvokingVertex,\n GLStencilOp\n} from '@luma.gl/constants';\nimport {setGLParameters} from '../../context/parameters/unified-parameter-api';\nimport {WebGLDevice} from '../webgl-device';\n\n/* eslint-disable no-unused-expressions */ // For expression ? gl.enable() : gl.disable()\n\n/**\n * Execute a function with a set of temporary WebGL parameter overrides\n * - Saves current \"global\" WebGL context settings\n * - Sets the supplies WebGL context parameters,\n * - Executes supplied function\n * - Restores parameters\n * - Returns the return value of the supplied function\n */\nexport function withDeviceAndGLParameters<T = unknown>(\n device: Device,\n parameters: Parameters,\n glParameters: GLParameters,\n func: (_?: Device) => T\n): T {\n if (isObjectEmpty(parameters)) {\n // Avoid setting state if no parameters provided. Just call and return\n return func(device);\n }\n\n // Wrap in a try-catch to ensure that parameters are restored on exceptions\n const webglDevice = device as WebGLDevice;\n webglDevice.pushState();\n try {\n setDeviceParameters(device, parameters);\n setGLParameters(webglDevice.gl, glParameters);\n return func(device);\n } finally {\n webglDevice.popState();\n }\n}\n\n/**\n * Execute a function with a set of temporary WebGL parameter overrides\n * - Saves current \"global\" WebGL context settings\n * - Sets the supplies WebGL context parameters,\n * - Executes supplied function\n * - Restores parameters\n * - Returns the return value of the supplied function\n * @deprecated use withDeviceParameters instead\n */\nexport function withGLParameters<T = unknown>(\n device: Device,\n parameters: GLParameters,\n func: (_?: Device) => T\n): T {\n if (isObjectEmpty(parameters)) {\n // Avoid setting state if no parameters provided. Just call and return\n return func(device);\n }\n\n // Wrap in a try-catch to ensure that parameters are restored on exceptions\n const webglDevice = device as WebGLDevice;\n webglDevice.pushState();\n try {\n setGLParameters(webglDevice.gl, parameters);\n return func(device);\n } finally {\n webglDevice.popState();\n }\n}\n\n/**\n * Execute a function with a set of temporary WebGL parameter overrides\n * - Saves current \"global\" WebGL context settings\n * - Sets the supplies WebGL context parameters,\n * - Executes supplied function\n * - Restores parameters\n * - Returns the return value of the supplied function\n */\nexport function withDeviceParameters<T = unknown>(\n device: Device,\n parameters: Parameters,\n func: (_?: Device) => T\n): T {\n if (isObjectEmpty(parameters)) {\n // Avoid setting state if no parameters provided. Just call and return\n return func(device);\n }\n\n // Wrap in a try-catch to ensure that parameters are restored on exceptions'\n const webglDevice = device as WebGLDevice;\n webglDevice.pushState();\n try {\n setDeviceParameters(device, parameters);\n return func(device);\n } finally {\n webglDevice.popState();\n }\n}\n\n/** Set WebGPU Style Parameters */\nexport function setDeviceParameters(device: Device, parameters: Parameters) {\n const webglDevice = device as WebGLDevice;\n const {gl} = webglDevice;\n\n // RASTERIZATION SETTINGS\n if (parameters.cullMode) {\n switch (parameters.cullMode) {\n case 'none':\n gl.disable(GL.CULL_FACE);\n break;\n case 'front':\n gl.enable(GL.CULL_FACE);\n gl.cullFace(GL.FRONT);\n break;\n case 'back':\n gl.enable(GL.CULL_FACE);\n gl.cullFace(GL.BACK);\n break;\n }\n }\n\n if (parameters.frontFace) {\n gl.frontFace(\n map('frontFace', parameters.frontFace, {\n ccw: GL.CCW,\n cw: GL.CW\n })\n );\n }\n\n if (parameters.unclippedDepth) {\n if (device.features.has('depth-clip-control')) {\n // EXT_depth_clamp\n gl.enable(GL.DEPTH_CLAMP_EXT);\n }\n }\n\n if (parameters.depthBias !== undefined) {\n gl.enable(GL.POLYGON_OFFSET_FILL);\n gl.polygonOffset(parameters.depthBias, parameters.depthBiasSlopeScale || 0);\n }\n\n // depthBiasSlopeScale: {\n // // Handled by depthBias\n // },\n\n // WEBGL EXTENSIONS\n\n if (parameters.provokingVertex) {\n if (device.features.has('provoking-vertex-webgl')) {\n const extensions = webglDevice.getExtension('WEBGL_provoking_vertex');\n const ext = extensions.WEBGL_provoking_vertex;\n\n const vertex = map<ProvokingVertex, GLProvokingVertex>(\n 'provokingVertex',\n parameters.provokingVertex,\n {\n first: GL.FIRST_VERTEX_CONVENTION_WEBGL,\n last: GL.LAST_VERTEX_CONVENTION_WEBGL\n }\n );\n ext?.provokingVertexWEBGL(vertex);\n }\n }\n\n if (parameters.polygonMode || parameters.polygonOffsetLine) {\n if (device.features.has('polygon-mode-webgl')) {\n if (parameters.polygonMode) {\n const extensions = webglDevice.getExtension('WEBGL_polygon_mode');\n const ext = extensions.WEBGL_polygon_mode;\n const mode = map<PolygonMode, GLPolygonMode>('polygonMode', parameters.polygonMode, {\n fill: GL.FILL_WEBGL,\n line: GL.LINE_WEBGL\n });\n ext?.polygonModeWEBGL(GL.FRONT, mode);\n ext?.polygonModeWEBGL(GL.BACK, mode);\n }\n\n if (parameters.polygonOffsetLine) {\n gl.enable(GL.POLYGON_OFFSET_LINE_WEBGL);\n }\n }\n }\n\n if (device.features.has('shader-clip-cull-distance-webgl')) {\n if (parameters.clipDistance0) {\n gl.enable(GL.CLIP_DISTANCE0_WEBGL);\n }\n if (parameters.clipDistance1) {\n gl.enable(GL.CLIP_DISTANCE1_WEBGL);\n }\n if (parameters.clipDistance2) {\n gl.enable(GL.CLIP_DISTANCE2_WEBGL);\n }\n if (parameters.clipDistance3) {\n gl.enable(GL.CLIP_DISTANCE3_WEBGL);\n }\n if (parameters.clipDistance4) {\n gl.enable(GL.CLIP_DISTANCE4_WEBGL);\n }\n if (parameters.clipDistance5) {\n gl.enable(GL.CLIP_DISTANCE5_WEBGL);\n }\n if (parameters.clipDistance6) {\n gl.enable(GL.CLIP_DISTANCE6_WEBGL);\n }\n if (parameters.clipDistance7) {\n gl.enable(GL.CLIP_DISTANCE7_WEBGL);\n }\n }\n\n // DEPTH STENCIL\n\n if (parameters.depthWriteEnabled !== undefined) {\n gl.depthMask(mapBoolean('depthWriteEnabled', parameters.depthWriteEnabled));\n }\n\n if (parameters.depthCompare) {\n parameters.depthCompare !== 'always' ? gl.enable(GL.DEPTH_TEST) : gl.disable(GL.DEPTH_TEST);\n gl.depthFunc(convertCompareFunction('depthCompare', parameters.depthCompare));\n }\n\n if (parameters.stencilWriteMask) {\n const mask = parameters.stencilWriteMask;\n gl.stencilMaskSeparate(GL.FRONT, mask);\n gl.stencilMaskSeparate(GL.BACK, mask);\n }\n\n if (parameters.stencilReadMask) {\n // stencilReadMask is handle inside stencil***Compare.\n log.warn('stencilReadMask not supported under WebGL');\n }\n\n if (parameters.stencilCompare) {\n const mask = parameters.stencilReadMask || 0xffffffff;\n const glValue = convertCompareFunction('depthCompare', parameters.stencilCompare);\n // TODO - ensure back doesn't overwrite\n parameters.stencilCompare !== 'always'\n ? gl.enable(GL.STENCIL_TEST)\n : gl.disable(GL.STENCIL_TEST);\n gl.stencilFuncSeparate(GL.FRONT, glValue, 0, mask);\n gl.stencilFuncSeparate(GL.BACK, glValue, 0, mask);\n }\n\n if (\n parameters.stencilPassOperation &&\n parameters.stencilFailOperation &&\n parameters.stencilDepthFailOperation\n ) {\n const dppass = convertStencilOperation('stencilPassOperation', parameters.stencilPassOperation);\n const sfail = convertStencilOperation('stencilFailOperation', parameters.stencilFailOperation);\n const dpfail = convertStencilOperation(\n 'stencilDepthFailOperation',\n parameters.stencilDepthFailOperation\n );\n gl.stencilOpSeparate(GL.FRONT, sfail, dpfail, dppass);\n gl.stencilOpSeparate(GL.BACK, sfail, dpfail, dppass);\n }\n\n // stencilDepthFailOperation() {\n // // handled by stencilPassOperation\n // },\n\n // stencilFailOperation() {\n // // handled by stencilPassOperation\n // },\n\n // COLOR STATE\n switch (parameters.blend) {\n case true:\n gl.enable(GL.BLEND);\n break;\n case false:\n gl.disable(GL.BLEND);\n break;\n default:\n // leave WebGL blend state unchanged if `parameters.blend` is not set\n }\n\n if (parameters.blendColorOperation || parameters.blendAlphaOperation) {\n const colorEquation = convertBlendOperationToEquation(\n 'blendColorOperation',\n parameters.blendColorOperation || 'add'\n );\n const alphaEquation = convertBlendOperationToEquation(\n 'blendAlphaOperation',\n parameters.blendAlphaOperation || 'add'\n );\n gl.blendEquationSeparate(colorEquation, alphaEquation);\n\n const colorSrcFactor = convertBlendFactorToFunction(\n 'blendColorSrcFactor',\n parameters.blendColorSrcFactor || 'one'\n );\n const colorDstFactor = convertBlendFactorToFunction(\n 'blendColorDstFactor',\n parameters.blendColorDstFactor || 'zero'\n );\n const alphaSrcFactor = convertBlendFactorToFunction(\n 'blendAlphaSrcFactor',\n parameters.blendAlphaSrcFactor || 'one'\n );\n const alphaDstFactor = convertBlendFactorToFunction(\n 'blendAlphaDstFactor',\n parameters.blendAlphaDstFactor || 'zero'\n );\n gl.blendFuncSeparate(colorSrcFactor, colorDstFactor, alphaSrcFactor, alphaDstFactor);\n }\n}\n\n/*\n rasterizationState: {\n cullMode: \"back\",\n },\n\n depthStencilState: {\n depthWriteEnabled: true,\n depthCompare: \"less\",\n format: \"depth24plus-stencil8\",\n },\n\n colorStates: [\n {\n format: \"bgra8unorm\",\n // colorBlend.srcFactor = wgpu::BlendFactor::SrcAlpha;\n // colorBlend.dstFactor = wgpu::BlendFactor::OneMinusSrcAlpha;\n // alphaBlend.srcFactor = wgpu::BlendFactor::SrcAlpha;\n // alphaBlend.dstFactor = wgpu::BlendFactor::OneMinusSrcAlpha;\n },\n ],\n });\n*/\n\nexport function convertCompareFunction(parameter: string, value: CompareFunction): GLFunction {\n return map<CompareFunction, GLFunction>(parameter, value, {\n never: GL.NEVER,\n less: GL.LESS,\n equal: GL.EQUAL,\n 'less-equal': GL.LEQUAL,\n greater: GL.GREATER,\n 'not-equal': GL.NOTEQUAL,\n 'greater-equal': GL.GEQUAL,\n always: GL.ALWAYS\n });\n}\n\nexport function convertToCompareFunction(parameter: string, value: GLFunction): CompareFunction {\n return map<GLFunction, CompareFunction>(parameter, value, {\n [GL.NEVER]: 'never',\n [GL.LESS]: 'less',\n [GL.EQUAL]: 'equal',\n [GL.LEQUAL]: 'less-equal',\n [GL.GREATER]: 'greater',\n [GL.NOTEQUAL]: 'not-equal',\n [GL.GEQUAL]: 'greater-equal',\n [GL.ALWAYS]: 'always'\n });\n}\n\nfunction convertStencilOperation(parameter: string, value: StencilOperation): GL {\n return map<StencilOperation, GLStencilOp>(parameter, value, {\n keep: GL.KEEP,\n zero: GL.ZERO,\n replace: GL.REPLACE,\n invert: GL.INVERT,\n 'increment-clamp': GL.INCR,\n 'decrement-clamp': GL.DECR,\n 'increment-wrap': GL.INCR_WRAP,\n 'decrement-wrap': GL.DECR_WRAP\n });\n}\n\nfunction convertBlendOperationToEquation(\n parameter: string,\n value: BlendOperation\n): GLBlendEquation {\n return map<BlendOperation, GLBlendEquation>(parameter, value, {\n add: GL.FUNC_ADD,\n subtract: GL.FUNC_SUBTRACT,\n 'reverse-subtract': GL.FUNC_REVERSE_SUBTRACT,\n min: GL.MIN,\n max: GL.MAX\n });\n}\n\nfunction convertBlendFactorToFunction(parameter: string, value: BlendFactor): GLBlendFunction {\n return map<BlendFactor, GLBlendFunction>(parameter, value, {\n one: GL.ONE,\n zero: GL.ZERO,\n 'src-color': GL.SRC_COLOR,\n 'one-minus-src-color': GL.ONE_MINUS_SRC_COLOR,\n 'dst-color': GL.DST_COLOR,\n 'one-minus-dst-color': GL.ONE_MINUS_DST_COLOR,\n 'src-alpha': GL.SRC_ALPHA,\n 'one-minus-src-alpha': GL.ONE_MINUS_SRC_ALPHA,\n 'dst-alpha': GL.DST_ALPHA,\n 'one-minus-dst-alpha': GL.ONE_MINUS_DST_ALPHA,\n 'src-alpha-saturated': GL.SRC_ALPHA_SATURATE,\n 'constant-color': GL.CONSTANT_COLOR,\n 'one-minus-constant-color': GL.ONE_MINUS_CONSTANT_COLOR,\n 'constant-alpha': GL.CONSTANT_ALPHA,\n 'one-minus-constant-alpha': GL.ONE_MINUS_CONSTANT_ALPHA\n });\n}\n\nfunction message(parameter: string, value: any): string {\n return `Illegal parameter ${value} for ${parameter}`;\n}\n\nfunction map<K extends string | number, V>(parameter: string, value: K, valueMap: Record<K, V>): V {\n if (!(value in valueMap)) {\n throw new Error(message(parameter, value));\n }\n return valueMap[value];\n}\n\nfunction mapBoolean(parameter: string, value: boolean): boolean {\n return value;\n}\n\n/** Returns true if given object is empty, false otherwise. */\nfunction isObjectEmpty(obj: object): boolean {\n let isEmpty = true;\n // @ts-ignore key is unused\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const key in obj) {\n isEmpty = false;\n break;\n }\n return isEmpty;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {\n Device,\n TextureProps,\n TextureViewProps,\n Sampler,\n SamplerProps,\n SamplerParameters,\n TextureCubeFace,\n ExternalImage,\n Texture1DData,\n Texture2DData,\n Texture3DData,\n TextureCubeData,\n TextureArrayData,\n TextureCubeArrayData\n} from '@luma.gl/core';\nimport {Texture, log} from '@luma.gl/core';\nimport {\n GL,\n GLPixelType,\n GLSamplerParameters,\n GLTexelDataFormat,\n GLTextureTarget\n} from '@luma.gl/constants';\nimport {getTextureFormatWebGL} from '../converters/webgl-texture-table';\nimport {convertSamplerParametersToWebGL} from '../converters/sampler-parameters';\nimport {WebGLDevice} from '../webgl-device';\nimport {WEBGLSampler} from './webgl-sampler';\nimport {WEBGLTextureView} from './webgl-texture-view';\n\nimport {\n initializeTextureStorage,\n // clearMipLevel,\n copyExternalImageToMipLevel,\n copyCPUDataToMipLevel,\n // copyGPUBufferToMipLevel,\n getWebGLTextureTarget\n} from '../helpers/webgl-texture-utils';\n\n/**\n * WebGL... the texture API from hell... hopefully made simpler\n */\nexport class WEBGLTexture extends Texture {\n // readonly MAX_ATTRIBUTES: number;\n readonly device: WebGLDevice;\n readonly gl: WebGL2RenderingContext;\n handle: WebGLTexture;\n\n sampler: WEBGLSampler = undefined; // TODO - currently unused in WebGL. Create dummy sampler?\n view: WEBGLTextureView = undefined; // TODO - currently unused in WebGL. Create dummy view?\n\n mipmaps: boolean;\n\n // Texture type\n /** Whether the internal format is compressed */\n compressed: boolean;\n\n /**\n * The WebGL target corresponding to the texture type\n * @note `target` cannot be modified by bind:\n * textures are special because when you first bind them to a target,\n * When you first bind a texture as a GL_TEXTURE_2D, you are saying that this texture is a 2D texture.\n * And it will always be a 2D texture; this state cannot be changed ever.\n * A texture that was first bound as a GL_TEXTURE_2D, must always be bound as a GL_TEXTURE_2D;\n * attempting to bind it as GL_TEXTURE_3D will give rise to a run-time error\n */\n glTarget: GLTextureTarget;\n /** The WebGL format - essentially channel structure */\n glFormat: GLTexelDataFormat;\n /** The WebGL data format - the type of each channel */\n glType: GLPixelType;\n /** The WebGL constant corresponding to the WebGPU style constant in format */\n glInternalFormat: GL;\n\n // state\n /** Texture binding slot - TODO - move to texture view? */\n textureUnit: number = 0;\n\n constructor(device: Device, props: TextureProps) {\n super(device, props);\n\n // Texture base class strips out the data prop, so we need to add it back in\n const propsWithData = {...this.props};\n propsWithData.data = props.data;\n\n this.device = device as WebGLDevice;\n this.gl = this.device.gl;\n\n // Note: In WebGL the texture target defines the type of texture on first bind.\n this.glTarget = getWebGLTextureTarget(this.props.dimension);\n\n // The target format of this texture\n const formatInfo = getTextureFormatWebGL(this.props.format);\n this.glInternalFormat = formatInfo.internalFormat;\n this.glFormat = formatInfo.format;\n this.glType = formatInfo.type;\n this.compressed = formatInfo.compressed;\n this.mipmaps = Boolean(this.props.mipmaps);\n\n this._initialize(propsWithData);\n\n Object.seal(this);\n }\n\n /** Initialize texture with supplied props */\n // eslint-disable-next-line max-statements\n _initialize(propsWithData: TextureProps): void {\n this.handle = this.props.handle || this.gl.createTexture();\n this.device.setSpectorMetadata(this.handle, {...this.props, data: propsWithData.data});\n\n let {width, height} = propsWithData;\n\n if (!width || !height) {\n const textureSize = Texture.getTextureDataSize(propsWithData.data);\n width = textureSize?.width || 1;\n height = textureSize?.height || 1;\n }\n\n // Store opts for accessors\n this.width = width;\n this.height = height;\n this.depth = propsWithData.depth;\n\n // Set texture sampler parameters\n this.setSampler(propsWithData.sampler);\n // @ts-ignore TODO - fix types\n this.view = new WEBGLTextureView(this.device, {...this.props, texture: this});\n\n this.bind();\n initializeTextureStorage(this.gl, this.mipLevels, this);\n\n if (propsWithData.data) {\n // prettier-ignore\n switch (propsWithData.dimension) {\n case '1d': this.setTexture1DData(propsWithData.data); break;\n case '2d': this.setTexture2DData(propsWithData.data); break;\n case '3d': this.setTexture3DData(propsWithData.data); break;\n case 'cube': this.setTextureCubeData(propsWithData.data); break;\n case '2d-array': this.setTextureArrayData(propsWithData.data); break;\n case 'cube-array': this.setTextureCubeArrayData(propsWithData.data); break;\n // @ts-expect-error\n default: throw new Error(propsWithData.dimension);\n }\n }\n\n if (this.mipmaps) {\n this.generateMipmap();\n }\n }\n\n override destroy(): void {\n if (this.handle) {\n this.gl.deleteTexture(this.handle);\n this.removeStats();\n this.trackDeallocatedMemory('Texture');\n // this.handle = null;\n this.destroyed = true;\n }\n }\n\n createView(props: TextureViewProps): WEBGLTextureView {\n return new WEBGLTextureView(this.device, {...props, texture: this});\n }\n\n setSampler(sampler: Sampler | SamplerProps = {}): void {\n let samplerProps: SamplerParameters;\n if (sampler instanceof WEBGLSampler) {\n this.sampler = sampler;\n samplerProps = sampler.props;\n } else {\n this.sampler = new WEBGLSampler(this.device, sampler);\n samplerProps = sampler as SamplerProps;\n }\n\n const parameters = convertSamplerParametersToWebGL(samplerProps);\n this._setSamplerParameters(parameters);\n }\n\n // Call to regenerate mipmaps after modifying texture(s)\n generateMipmap(options?: {force?: boolean}): void {\n const isFilterableAndRenderable =\n this.device.isTextureFormatRenderable(this.props.format) &&\n this.device.isTextureFormatFilterable(this.props.format);\n if (!isFilterableAndRenderable) {\n log.warn(`${this} is not renderable or filterable, may not be able to generate mipmaps`)();\n if (!options?.force) {\n return;\n }\n }\n\n try {\n this.gl.bindTexture(this.glTarget, this.handle);\n this.gl.generateMipmap(this.glTarget);\n } catch (error) {\n log.warn(`Error generating mipmap for ${this}: ${(error as Error).message}`)();\n } finally {\n this.gl.bindTexture(this.glTarget, null);\n }\n }\n\n // Image Data Setters\n copyExternalImage(options: {\n image: ExternalImage;\n sourceX?: number;\n sourceY?: number;\n width?: number;\n height?: number;\n depth?: number;\n mipLevel?: number;\n x?: number;\n y?: number;\n z?: number;\n aspect?: 'all' | 'stencil-only' | 'depth-only';\n colorSpace?: 'srgb';\n premultipliedAlpha?: boolean;\n flipY?: boolean;\n }): {width: number; height: number} {\n const size = Texture.getExternalImageSize(options.image);\n const opts = {...Texture.defaultCopyExternalImageOptions, ...size, ...options};\n\n const {image, depth, mipLevel, x, y, z, flipY} = opts;\n let {width, height} = opts;\n const {dimension, glTarget, glFormat, glInternalFormat, glType} = this;\n\n // WebGL will error if we try to copy outside the bounds of the texture\n width = Math.min(width, this.width - x);\n height = Math.min(height, this.height - y);\n\n if (options.sourceX || options.sourceY) {\n // requires copyTexSubImage2D from a framebuffer'\n throw new Error('WebGL does not support sourceX/sourceY)');\n }\n\n copyExternalImageToMipLevel(this.device.gl, this.handle, image, {\n dimension,\n mipLevel,\n x,\n y,\n z,\n width,\n height,\n depth,\n glFormat,\n glInternalFormat,\n glType,\n glTarget,\n flipY\n });\n\n return {width: opts.width, height: opts.height};\n }\n\n setTexture1DData(data: Texture1DData): void {\n throw new Error('setTexture1DData not supported in WebGL.');\n }\n\n /** Set a simple texture */\n setTexture2DData(lodData: Texture2DData, depth = 0): void {\n this.bind();\n\n const lodArray = Texture.normalizeTextureData(lodData, this);\n\n // If the user provides multiple LODs, then automatic mipmap\n // generation generateMipmap() should be disabled to avoid overwriting them.\n if (lodArray.length > 1 && this.props.mipmaps !== false) {\n log.warn(`Texture ${this.id} mipmap and multiple LODs.`)();\n }\n\n for (let lodLevel = 0; lodLevel < lodArray.length; lodLevel++) {\n const imageData = lodArray[lodLevel];\n this._setMipLevel(depth, lodLevel, imageData);\n }\n\n this.unbind();\n }\n\n /**\n * Sets a 3D texture\n * @param data\n */\n setTexture3DData(data: Texture3DData): void {\n if (this.props.dimension !== '3d') {\n throw new Error(this.id);\n }\n if (ArrayBuffer.isView(data)) {\n this.bind();\n copyCPUDataToMipLevel(this.device.gl, data, this);\n this.unbind();\n }\n }\n\n /**\n * Set a Texture Cube Data\n * @todo - could support TextureCubeArray with depth\n * @param data\n * @param index\n */\n setTextureCubeData(data: TextureCubeData, depth: number = 0): void {\n if (this.props.dimension !== 'cube') {\n throw new Error(this.id);\n }\n for (const face of Texture.CubeFaces) {\n this.setTextureCubeFaceData(data[face], face);\n }\n }\n\n /**\n * Sets an entire texture array\n * @param data\n */\n setTextureArrayData(data: TextureArrayData): void {\n if (this.props.dimension !== '2d-array') {\n throw new Error(this.id);\n }\n throw new Error('setTextureArrayData not implemented.');\n }\n\n /**\n * Sets an entire texture cube array\n * @param data\n */\n setTextureCubeArrayData(data: TextureCubeArrayData): void {\n throw new Error('setTextureCubeArrayData not supported in WebGL2.');\n }\n\n setTextureCubeFaceData(lodData: Texture2DData, face: TextureCubeFace, depth: number = 0): void {\n // assert(this.props.dimension === 'cube');\n\n // If the user provides multiple LODs, then automatic mipmap\n // generation generateMipmap() should be disabled to avoid overwriting them.\n if (Array.isArray(lodData) && lodData.length > 1 && this.props.mipmaps !== false) {\n log.warn(`${this.id} has mipmap and multiple LODs.`)();\n }\n\n const faceDepth = Texture.CubeFaces.indexOf(face);\n\n this.setTexture2DData(lodData, faceDepth);\n }\n\n // DEPRECATED METHODS\n\n /** Update external texture (video frame or canvas) @deprecated Use ExternalTexture */\n update(): void {\n throw new Error('Texture.update() not implemented. Use ExternalTexture');\n }\n\n // INTERNAL METHODS\n\n /** @todo update this method to accept LODs */\n setImageDataForFace(options): void {\n const {\n face,\n width,\n height,\n pixels,\n data,\n format = GL.RGBA,\n type = GL.UNSIGNED_BYTE\n // generateMipmap = false // TODO\n } = options;\n\n const {gl} = this;\n\n const imageData = pixels || data;\n\n this.bind();\n if (imageData instanceof Promise) {\n imageData.then(resolvedImageData =>\n this.setImageDataForFace(\n Object.assign({}, options, {\n face,\n data: resolvedImageData,\n pixels: resolvedImageData\n })\n )\n );\n } else if (this.width || this.height) {\n gl.texImage2D(face, 0, format, width, height, 0 /* border*/, format, type, imageData);\n } else {\n gl.texImage2D(face, 0, format, format, type, imageData);\n }\n }\n\n _getImageDataMap(faceData: Record<string | GL, any>): Record<GL, any> {\n for (let i = 0; i < Texture.CubeFaces.length; ++i) {\n const faceName = Texture.CubeFaces[i];\n if (faceData[faceName]) {\n faceData[GL.TEXTURE_CUBE_MAP_POSITIVE_X + i] = faceData[faceName];\n delete faceData[faceName];\n }\n }\n return faceData;\n }\n\n // RESOURCE METHODS\n\n /**\n * Sets sampler parameters on texture\n */\n _setSamplerParameters(parameters: GLSamplerParameters): void {\n log.log(1, `${this.id} sampler parameters`, this.device.getGLKeys(parameters))();\n\n this.gl.bindTexture(this.glTarget, this.handle);\n for (const [pname, pvalue] of Object.entries(parameters)) {\n const param = Number(pname) as keyof GLSamplerParameters;\n const value = pvalue;\n\n // Apparently integer/float issues require two different texture parameter setting functions in JavaScript.\n // For now, pick the float version for parameters specified as GLfloat.\n switch (param) {\n case GL.TEXTURE_MIN_LOD:\n case GL.TEXTURE_MAX_LOD:\n this.gl.texParameterf(this.glTarget, param, value);\n break;\n\n case GL.TEXTURE_MIN_FILTER:\n this.gl.texParameteri(this.glTarget, param, value);\n break;\n\n case GL.TEXTURE_WRAP_S:\n case GL.TEXTURE_WRAP_T:\n this.gl.texParameteri(this.glTarget, param, value);\n break;\n case GL.TEXTURE_MAX_ANISOTROPY_EXT:\n // We have to query feature before using it\n if (this.device.features.has('texture-filterable-anisotropic-webgl')) {\n this.gl.texParameteri(this.glTarget, param, value);\n }\n break;\n default:\n this.gl.texParameteri(this.glTarget, param, value);\n break;\n }\n }\n\n this.gl.bindTexture(this.glTarget, null);\n }\n\n // INTERNAL SETTERS\n\n /**\n * Copy a region of data from a CPU memory buffer into this texture.\n * @todo - GLUnpackParameters parameters\n */\n protected _setMipLevel(\n depth: number,\n mipLevel: number,\n textureData: Texture2DData,\n glTarget: GL = this.glTarget\n ) {\n // if (!textureData) {\n // clearMipLevel(this.device.gl, {...this, depth, level});\n // return;\n // }\n\n if (Texture.isExternalImage(textureData)) {\n copyExternalImageToMipLevel(this.device.gl, this.handle, textureData, {\n ...this,\n depth,\n mipLevel,\n glTarget,\n flipY: this.props.flipY\n });\n return;\n }\n\n // @ts-expect-error\n if (Texture.isTextureLevelData(textureData)) {\n copyCPUDataToMipLevel(this.device.gl, textureData.data, {\n ...this,\n depth,\n mipLevel,\n glTarget\n });\n return;\n }\n\n throw new Error('Texture: invalid image data');\n }\n // HELPERS\n\n getActiveUnit(): number {\n return this.gl.getParameter(GL.ACTIVE_TEXTURE) - GL.TEXTURE0;\n }\n\n bind(textureUnit?: number): number {\n const {gl} = this;\n\n if (textureUnit !== undefined) {\n this.textureUnit = textureUnit;\n gl.activeTexture(gl.TEXTURE0 + textureUnit);\n }\n\n gl.bindTexture(this.glTarget, this.handle);\n return textureUnit;\n }\n\n unbind(textureUnit?: number): number | undefined {\n const {gl} = this;\n\n if (textureUnit !== undefined) {\n this.textureUnit = textureUnit;\n gl.activeTexture(gl.TEXTURE0 + textureUnit);\n }\n\n gl.bindTexture(this.glTarget, null);\n return textureUnit;\n }\n}\n\n// TODO - Remove when texture refactor is complete\n\n/*\nsetCubeMapData(options: {\n width: number;\n height: number;\n data: Record<GL, Texture2DData> | Record<TextureCubeFace, Texture2DData>;\n format?: any;\n type?: any;\n /** @deprecated Use .data *\n pixels: any;\n}): void {\n const {gl} = this;\n\n const {width, height, pixels, data, format = GL.RGBA, type = GL.UNSIGNED_BYTE} = options;\n\n // pixel data (imageDataMap) is an Object from Face to Image or Promise.\n // For example:\n // {\n // GL.TEXTURE_CUBE_MAP_POSITIVE_X : Image-or-Promise,\n // GL.TEXTURE_CUBE_MAP_NEGATIVE_X : Image-or-Promise,\n // ... }\n // To provide multiple level-of-details (LODs) this can be Face to Array\n // of Image or Promise, like this\n // {\n // GL.TEXTURE_CUBE_MAP_POSITIVE_X : [Image-or-Promise-LOD-0, Image-or-Promise-LOD-1],\n // GL.TEXTURE_CUBE_MAP_NEGATIVE_X : [Image-or-Promise-LOD-0, Image-or-Promise-LOD-1],\n // ... }\n\n const imageDataMap = this._getImageDataMap(pixels || data);\n\n const resolvedFaces = WEBGLTexture.FACES.map(face => {\n const facePixels = imageDataMap[face];\n return Array.isArray(facePixels) ? facePixels : [facePixels];\n });\n this.bind();\n\n WEBGLTexture.FACES.forEach((face, index) => {\n if (resolvedFaces[index].length > 1 && this.props.mipmaps !== false) {\n // If the user provides multiple LODs, then automatic mipmap\n // generation generateMipmap() should be disabled to avoid overwritting them.\n log.warn(`${this.id} has mipmap and multiple LODs.`)();\n }\n resolvedFaces[index].forEach((image, lodLevel) => {\n // TODO: adjust width & height for LOD!\n if (width && height) {\n gl.texImage2D(face, lodLevel, format, width, height, 0 /* border*, format, type, image);\n } else {\n gl.texImage2D(face, lodLevel, format, format, type, image);\n }\n });\n });\n\n this.unbind();\n}\n*/\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Device, TextureViewProps} from '@luma.gl/core';\n// import {decodeTextureFormat} from '@luma.gl/core';\nimport {TextureView, Texture} from '@luma.gl/core';\n\nimport {WebGLDevice} from '../webgl-device';\nimport {WEBGLTexture} from './webgl-texture';\n\nexport class WEBGLTextureView extends TextureView {\n readonly device: WebGLDevice;\n readonly gl: WebGL2RenderingContext;\n readonly handle: null; // Does not have a WebGL representation\n readonly texture: WEBGLTexture;\n\n constructor(device: Device, props: TextureViewProps & {texture: WEBGLTexture}) {\n super(device, {...Texture.defaultProps, ...props});\n\n this.device = device as WebGLDevice;\n this.gl = this.device.gl;\n this.handle = null;\n this.texture = props.texture;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n//\n// WebGL... the texture API from hell... hopefully made simpler\n//\n\nimport {TypedArray} from '@math.gl/types';\nimport type {ExternalImage} from '@luma.gl/core';\nimport {Buffer, Texture, Framebuffer, FramebufferProps} from '@luma.gl/core';\nimport {\n GL,\n GLTextureTarget,\n GLTextureCubeMapTarget,\n GLTexelDataFormat,\n GLPixelType,\n GLDataType\n} from '@luma.gl/constants';\n\nimport {WEBGLFramebuffer} from '../resources/webgl-framebuffer';\nimport {getGLTypeFromTypedArray, getTypedArrayFromGLType} from './typed-array-utils';\nimport {glFormatToComponents, glTypeToBytes} from './format-utils';\nimport {WEBGLBuffer} from '../resources/webgl-buffer';\nimport {WEBGLTexture} from '../resources/webgl-texture';\nimport {withGLParameters} from '../../context/state-tracker/with-parameters';\n\n/** A \"border\" parameter is required in many WebGL texture APIs, but must always be 0... */\nconst BORDER = 0;\n\n/**\n * Options for setting data into a texture\n */\nexport type WebGLSetTextureOptions = {\n dimension: '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d';\n height: number;\n width: number;\n depth: number;\n mipLevel?: number;\n glTarget: GLTextureTarget;\n glInternalFormat: GL;\n glFormat: GLTexelDataFormat;\n glType: GLPixelType;\n compressed?: boolean;\n byteOffset?: number;\n byteLength?: number;\n};\n\n/**\n * Options for copying an image or data into a texture\n *\n * @param {GLenum} format - internal format of image data.\n * @param {GLenum} type\n * - format of array (autodetect from type) or\n * - (WEBGL2) format of buffer or ArrayBufferView\n * @param {GLenum} dataFormat - format of image data.\n * @param {Number} offset - (WEBGL2) offset from start of buffer\n * @parameters - temporary settings to be applied, can be used to supply pixel store settings.\n */\nexport type WebGLCopyTextureOptions = {\n dimension: '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d';\n /** mip level to be updated */\n mipLevel?: number;\n /** width of the sub image to be updated */\n width: number;\n /** height of the sub image to be updated */\n height: number;\n /** depth of texture to be updated */\n depth?: number;\n /** xOffset from where texture to be updated */\n x?: number;\n /** yOffset from where texture to be updated */\n y?: number;\n /** yOffset from where texture to be updated */\n z?: number;\n\n glTarget: GLTextureTarget;\n glInternalFormat: GL;\n glFormat: GL;\n glType: GL;\n compressed?: boolean;\n byteOffset?: number;\n byteLength?: number;\n};\n\n/**\n * Initializes a texture memory space\n * Clear all the textures and mip levels of a two-dimensional or array texture at the same time.\n * On some implementations faster than repeatedly setting levels\n *\n * @note From WebGL 2 spec section 3.7.6:\n * @see https://registry.khronos.org/webgl/specs/latest/2.0/\n * - The image contents are set as if a buffer of sufficient size initialized to 0 would be passed to each level's texImage2D/3D\n * - texStorage2D should be considered a preferred alternative to texImage2D. It may have lower memory costs than texImage2D in some implementations.\n * - Once texStorage*D has been called, the texture is immutable and can only be updated with texSubImage*(), not texImage()\n */\nexport function initializeTextureStorage(\n gl: WebGL2RenderingContext,\n levels: number,\n options: WebGLSetTextureOptions\n): void {\n const {dimension, width, height, depth = 0} = options;\n const {glInternalFormat} = options;\n const glTarget = options.glTarget; // getWebGLCubeFaceTarget(options.glTarget, dimension, depth);\n switch (dimension) {\n case '2d-array':\n case '3d':\n gl.texStorage3D(glTarget, levels, glInternalFormat, width, height, depth);\n break;\n\n default:\n gl.texStorage2D(glTarget, levels, glInternalFormat, width, height);\n }\n}\n\n/**\n * Copy a region of compressed data from a GPU memory buffer into this texture.\n */\nexport function copyExternalImageToMipLevel(\n gl: WebGL2RenderingContext,\n handle: WebGLTexture,\n image: ExternalImage,\n options: WebGLCopyTextureOptions & {flipY?: boolean}\n): void {\n const {width, height} = options;\n const {dimension, depth = 0, mipLevel = 0} = options;\n const {x = 0, y = 0, z = 0} = options;\n const {glFormat, glType} = options;\n\n const glTarget = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);\n\n const glParameters = options.flipY ? {[GL.UNPACK_FLIP_Y_WEBGL]: true} : {};\n withGLParameters(gl, glParameters, () => {\n switch (dimension) {\n case '2d-array':\n case '3d':\n gl.bindTexture(glTarget, handle);\n // prettier-ignore\n gl.texSubImage3D(glTarget, mipLevel, x, y, z, width, height, depth, glFormat, glType, image);\n gl.bindTexture(glTarget, null);\n break;\n\n case '2d':\n case 'cube':\n gl.bindTexture(glTarget, handle);\n // prettier-ignore\n gl.texSubImage2D(glTarget, mipLevel, x, y, width, height, glFormat, glType, image);\n gl.bindTexture(glTarget, null);\n break;\n\n default:\n throw new Error(dimension);\n }\n });\n}\n\n/**\n * Copy a region of data from a CPU memory buffer into this texture.\n */\nexport function copyCPUDataToMipLevel(\n gl: WebGL2RenderingContext,\n typedArray: TypedArray,\n options: WebGLCopyTextureOptions\n): void {\n const {dimension, width, height, depth = 0, mipLevel = 0, byteOffset = 0} = options;\n const {x = 0, y = 0, z = 0} = options;\n const {glFormat, glType, compressed} = options;\n const glTarget = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);\n\n // gl.bindTexture(glTarget, null);\n\n switch (dimension) {\n case '2d-array':\n case '3d':\n if (compressed) {\n // prettier-ignore\n gl.compressedTexSubImage3D(glTarget, mipLevel, x, y, z, width, height, depth, glFormat, typedArray, byteOffset); // , byteLength\n } else {\n // prettier-ignore\n gl.texSubImage3D(glTarget, mipLevel, x, y, z, width, height, depth, glFormat, glType, typedArray, byteOffset); // , byteLength\n }\n break;\n\n case '2d':\n case 'cube':\n if (compressed) {\n // prettier-ignore\n gl.compressedTexSubImage2D(glTarget, mipLevel, x, y, width, height, glFormat, typedArray, byteOffset); // , byteLength\n } else {\n // prettier-ignore\n gl.texSubImage2D(glTarget, mipLevel, x, y, width, height, glFormat, glType, typedArray, byteOffset); // , byteLength\n }\n break;\n\n default:\n throw new Error(dimension);\n }\n}\n\n/**\n * Copy a region of compressed data from a GPU memory buffer into this texture.\n */\nexport function copyGPUBufferToMipLevel(\n gl: WebGL2RenderingContext,\n webglBuffer: WebGLBuffer,\n byteLength: number,\n options: WebGLCopyTextureOptions\n): void {\n const {dimension, width, height, depth = 0, mipLevel = 0, byteOffset = 0} = options;\n const {x = 0, y = 0, z = 0} = options;\n const {glFormat, glType, compressed} = options;\n const glTarget = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);\n\n gl.bindBuffer(GL.PIXEL_UNPACK_BUFFER, webglBuffer);\n\n switch (dimension) {\n case '2d-array':\n case '3d':\n // 3 dimensional textures requires 3D texture functions\n if (compressed) {\n // TODO enable extension?\n // prettier-ignore\n gl.compressedTexSubImage3D(glTarget, mipLevel, x, y, z, width, height, depth, glFormat, byteLength, byteOffset);\n } else {\n // prettier-ignore\n gl.texSubImage3D(glTarget, mipLevel, x, y, z, width, height, depth, glFormat, glType, byteOffset);\n }\n break;\n\n case '2d':\n case 'cube':\n if (compressed) {\n // prettier-ignore\n gl.compressedTexSubImage2D(glTarget, mipLevel, x, y, width, height, glFormat, byteLength, byteOffset);\n } else {\n // prettier-ignore\n gl.texSubImage2D(glTarget, mipLevel, x, y, width, height, BORDER, glFormat, byteOffset);\n }\n break;\n\n default:\n throw new Error(dimension);\n }\n}\n\n// INTERNAL HELPERS\n\n/** Convert a WebGPU style texture constant to a WebGL style texture constant */\nexport function getWebGLTextureTarget(\n dimension: '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d'\n): GLTextureTarget {\n // prettier-ignore\n switch (dimension) {\n case '1d': break; // not supported in any WebGL version\n case '2d': return GL.TEXTURE_2D; // supported in WebGL1\n case '3d': return GL.TEXTURE_3D; // supported in WebGL2\n case 'cube': return GL.TEXTURE_CUBE_MAP; // supported in WebGL1\n case '2d-array': return GL.TEXTURE_2D_ARRAY; // supported in WebGL2\n case 'cube-array': break; // not supported in any WebGL version\n }\n throw new Error(dimension);\n}\n\n/**\n * In WebGL, cube maps specify faces by overriding target instead of using the depth parameter.\n * @note We still bind the texture using GL.TEXTURE_CUBE_MAP, but we need to use the face-specific target when setting mip levels.\n * @returns glTarget unchanged, if dimension !== 'cube'.\n */\nexport function getWebGLCubeFaceTarget(\n glTarget: GLTextureTarget,\n dimension: '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d',\n level: number\n): GLTextureTarget | GLTextureCubeMapTarget {\n return dimension === 'cube' ? GL.TEXTURE_CUBE_MAP_POSITIVE_X + level : glTarget;\n}\n\n// texImage methods\n\n/**\n * Clear a texture mip level.\n * Wrapper for the messy WebGL texture API\n *\nexport function clearMipLevel(gl: WebGL2RenderingContext, options: WebGLSetTextureOptions): void {\n const {dimension, width, height, depth = 0, mipLevel = 0} = options;\n const {glInternalFormat, glFormat, glType, compressed} = options;\n const glTarget = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);\n\n switch (dimension) {\n case '2d-array':\n case '3d':\n if (compressed) {\n // prettier-ignore\n gl.compressedTexImage3D(glTarget, mipLevel, glInternalFormat, width, height, depth, BORDER, null);\n } else {\n // prettier-ignore\n gl.texImage3D( glTarget, mipLevel, glInternalFormat, width, height, depth, BORDER, glFormat, glType, null);\n }\n break;\n\n case '2d':\n case 'cube':\n if (compressed) {\n // prettier-ignore\n gl.compressedTexImage2D(glTarget, mipLevel, glInternalFormat, width, height, BORDER, null);\n } else {\n // prettier-ignore\n gl.texImage2D(glTarget, mipLevel, glInternalFormat, width, height, BORDER, glFormat, glType, null);\n }\n break;\n\n default:\n throw new Error(dimension);\n }\n}\n */\n\n/**\n * Set a texture mip level to the contents of an external image.\n * Wrapper for the messy WebGL texture API\n * @note Corresponds to WebGPU device.queue.copyExternalImageToTexture()\n *\nexport function setMipLevelFromExternalImage(\n gl: WebGL2RenderingContext,\n image: ExternalImage,\n options: WebGLSetTextureOptions\n): void {\n const {dimension, width, height, depth = 0, level = 0} = options;\n const {glInternalFormat, glType} = options;\n\n const glTarget = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);\n\n // TODO - we can't change texture width (due to WebGPU limitations) -\n // and the width/heigh of an external image is implicit, so why do we need to extract it?\n // So what width height do we supply? The image size or the texture size?\n // const {width, height} = Texture.getExternalImageSize(image);\n\n switch (dimension) {\n case '2d-array':\n case '3d':\n // prettier-ignore\n gl.texImage3D(glTarget, level, glInternalFormat, width, height, depth, BORDER, glInternalFormat, glType, image);\n break;\n\n case '2d':\n case 'cube':\n // prettier-ignore\n gl.texImage2D(glTarget, level, glInternalFormat, width, height, BORDER, glInternalFormat, glType, image);\n break;\n\n default:\n throw new Error(dimension);\n }\n}\n\n/**\n * Set a texture mip level from CPU memory\n * Wrapper for the messy WebGL texture API\n * @note Not available (directly) in WebGPU\n *\nexport function setMipLevelFromTypedArray(\n gl: WebGL2RenderingContext,\n data: TypedArray,\n parameters: {},\n options: {\n dimension: '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d';\n height: number;\n width: number;\n depth?: number;\n level?: number;\n offset?: number;\n glTarget: GLTextureTarget;\n glInternalFormat: GL;\n glFormat: GL;\n glType: GL;\n compressed?: boolean;\n }\n): void {\n const {dimension, width, height, depth = 0, level = 0, offset = 0} = options;\n const {glInternalFormat, glFormat, glType, compressed} = options;\n\n const glTarget = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);\n\n withGLParameters(gl, parameters, () => {\n switch (dimension) {\n case '2d-array':\n case '3d':\n if (compressed) {\n // prettier-ignore\n gl.compressedTexImage3D(glTarget, level, glInternalFormat, width, height, depth, BORDER, data);\n } else {\n // prettier-ignore\n gl.texImage3D( glTarget, level, glInternalFormat, width, height, depth, BORDER, glFormat, glType, data);\n }\n break;\n\n case '2d':\n if (compressed) {\n // prettier-ignore\n gl.compressedTexImage2D(glTarget, level, glInternalFormat, width, height, BORDER, data);\n } else {\n // prettier-ignore\n gl.texImage2D( glTarget, level, glInternalFormat, width, height, BORDER, glFormat, glType, data, offset);\n }\n break;\n\n default:\n throw new Error(dimension);\n }\n });\n}\n\n/**\n * Set a texture level from CPU memory\n * @note Not available (directly) in WebGPU\n _setMipLevelFromTypedArray(\n depth: number,\n level: number,\n data: TextureLevelData,\n offset = 0,\n parameters\n ): void {\n withGLParameters(this.gl, parameters, () => {\n switch (this.props.dimension) {\n case '2d-array':\n case '3d':\n if (this.compressed) {\n // prettier-ignore\n this.device.gl.compressedTexImage3D(this.glTarget, level, this.glInternalFormat, data.width, data.height, depth, BORDER, data.data);\n } else {\n // prettier-ignore\n this.gl.texImage3D( this.glTarget, level, this.glInternalFormat, this.width, this.height, depth, BORDER, this.glFormat, this.glType, data.data);\n }\n break;\n\n case '2d':\n if (this.compressed) {\n // prettier-ignore\n this.device.gl.compressedTexImage2D(this.glTarget, level, this.glInternalFormat, data.width, data.height, BORDER, data.data);\n } else {\n // prettier-ignore\n this.device.gl.texImage2D( this.glTarget, level, this.glInternalFormat, this.width, this.height, BORDER, this.glFormat, this.glType, data.data, offset);\n }\n break;\n\n default:\n throw new Error(this.props.dimension);\n }\n });\n }\n\n * Set a texture level from a GPU buffer\n *\nexport function setMipLevelFromGPUBuffer(\n gl: WebGL2RenderingContext,\n buffer: Buffer,\n options: WebGLSetTextureOptions\n): void {\n const {dimension, width, height, depth = 0, level = 0, byteOffset = 0} = options;\n const {glInternalFormat, glFormat, glType, compressed} = options;\n const glTarget = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);\n\n const webglBuffer = buffer as WEBGLBuffer;\n const imageSize = buffer.byteLength;\n\n // In WebGL the source buffer is not a parameter. Instead it needs to be bound to a special bind point\n gl.bindBuffer(GL.PIXEL_UNPACK_BUFFER, webglBuffer.handle);\n\n switch (dimension) {\n case '2d-array':\n case '3d':\n if (compressed) {\n // prettier-ignore\n gl.compressedTexImage3D(glTarget, level, glInternalFormat, width, height, depth, BORDER, imageSize, byteOffset);\n } else {\n // prettier-ignore\n gl.texImage3D(glTarget, level, glInternalFormat, width, height, depth, BORDER, glFormat, glType, byteOffset);\n }\n break;\n\n case '2d':\n if (compressed) {\n // prettier-ignore\n gl.compressedTexImage2D(glTarget, level, glInternalFormat, width, height, BORDER, imageSize, byteOffset);\n } else {\n // prettier-ignore\n gl.texImage2D(glTarget, level, glInternalFormat, width, height, BORDER, glFormat, glType, byteOffset);\n }\n break;\n\n default:\n throw new Error(dimension);\n }\n\n gl.bindBuffer(GL.PIXEL_UNPACK_BUFFER, null);\n}\n*/\nexport type ReadPixelsToArrayOptions = {\n sourceX?: number;\n sourceY?: number;\n sourceFormat?: number;\n sourceAttachment?: number;\n target?: Uint8Array | Uint16Array | Float32Array;\n // following parameters are auto deduced if not provided\n sourceWidth?: number;\n sourceHeight?: number;\n sourceDepth?: number;\n sourceType?: number;\n};\n\nexport type ReadPixelsToBufferOptions = {\n sourceX?: number;\n sourceY?: number;\n sourceFormat?: number;\n target?: Buffer; // A new Buffer object is created when not provided.\n targetByteOffset?: number; // byte offset in buffer object\n // following parameters are auto deduced if not provided\n sourceWidth?: number;\n sourceHeight?: number;\n sourceType?: number;\n};\n\n/**\n * Copies data from a type or a Texture object into ArrayBuffer object.\n * App can provide targetPixelArray or have it auto allocated by this method\n * newly allocated by this method unless provided by app.\n * @deprecated Use CommandEncoder.copyTextureToBuffer and Buffer.read\n * @note Slow requires roundtrip to GPU\n *\n * @param source\n * @param options\n * @returns pixel array,\n */\nexport function readPixelsToArray(\n source: Framebuffer | Texture,\n options?: ReadPixelsToArrayOptions\n): Uint8Array | Uint16Array | Float32Array {\n const {\n sourceX = 0,\n sourceY = 0,\n sourceAttachment = 0 // TODO - support gl.readBuffer\n } = options || {};\n let {\n target = null,\n // following parameters are auto deduced if not provided\n sourceWidth,\n sourceHeight,\n sourceDepth,\n sourceFormat,\n sourceType\n } = options || {};\n\n const {framebuffer, deleteFramebuffer} = getFramebuffer(source);\n // assert(framebuffer);\n const {gl, handle} = framebuffer;\n\n sourceWidth ||= framebuffer.width;\n sourceHeight ||= framebuffer.height;\n\n const texture = framebuffer.colorAttachments[sourceAttachment]?.texture;\n if (!texture) {\n throw new Error(`Invalid framebuffer attachment ${sourceAttachment}`);\n }\n sourceDepth = texture?.depth || 1;\n\n sourceFormat ||= texture?.glFormat || GL.RGBA;\n // Deduce the type from color attachment if not provided.\n sourceType ||= texture?.glType || GL.UNSIGNED_BYTE;\n\n // Deduce type and allocated pixelArray if needed\n target = getPixelArray(target, sourceType, sourceFormat, sourceWidth, sourceHeight, sourceDepth);\n\n // Pixel array available, if necessary, deduce type from it.\n sourceType = sourceType || getGLTypeFromTypedArray(target);\n\n // Note: luma.gl overrides bindFramebuffer so that we can reliably restore the previous framebuffer (this is the only function for which we do that)\n const prevHandle = gl.bindFramebuffer(\n GL.FRAMEBUFFER,\n handle\n ) as unknown as WebGLFramebuffer | null;\n\n // Select the color attachment to read from\n gl.readBuffer(gl.COLOR_ATTACHMENT0 + sourceAttachment);\n\n // There is a lot of hedging in the WebGL2 spec about what formats are guaranteed to be readable\n // (It should always be possible to read RGBA/UNSIGNED_BYTE, but most other combinations are not guaranteed)\n // Querying is possible but expensive:\n // const {device} = framebuffer;\n // texture.glReadFormat ||= gl.getParameter(gl.IMPLEMENTATION_COLOR_READ_FORMAT);\n // texture.glReadType ||= gl.getParameter(gl.IMPLEMENTATION_COLOR_READ_TYPE);\n // console.log('params', device.getGLKey(texture.glReadFormat), device.getGLKey(texture.glReadType));\n\n gl.readPixels(sourceX, sourceY, sourceWidth, sourceHeight, sourceFormat, sourceType, target);\n gl.readBuffer(gl.COLOR_ATTACHMENT0);\n gl.bindFramebuffer(GL.FRAMEBUFFER, prevHandle || null);\n\n if (deleteFramebuffer) {\n framebuffer.destroy();\n }\n\n return target;\n}\n\n/**\n * Copies data from a Framebuffer or a Texture object into a Buffer object.\n * NOTE: doesn't wait for copy to be complete, it programs GPU to perform a DMA transffer.\n * @deprecated Use CommandEncoder\n * @param source\n * @param options\n */\nexport function readPixelsToBuffer(\n source: Framebuffer | Texture,\n options?: ReadPixelsToBufferOptions\n): WEBGLBuffer {\n const {\n target,\n sourceX = 0,\n sourceY = 0,\n sourceFormat = GL.RGBA,\n targetByteOffset = 0\n } = options || {};\n // following parameters are auto deduced if not provided\n let {sourceWidth, sourceHeight, sourceType} = options || {};\n const {framebuffer, deleteFramebuffer} = getFramebuffer(source);\n // assert(framebuffer);\n sourceWidth = sourceWidth || framebuffer.width;\n sourceHeight = sourceHeight || framebuffer.height;\n\n // Asynchronous read (PIXEL_PACK_BUFFER) is WebGL2 only feature\n const webglFramebuffer = framebuffer;\n\n // deduce type if not available.\n sourceType = sourceType || GL.UNSIGNED_BYTE;\n\n let webglBufferTarget = target as unknown as WEBGLBuffer | undefined;\n if (!webglBufferTarget) {\n // Create new buffer with enough size\n const components = glFormatToComponents(sourceFormat);\n const byteCount = glTypeToBytes(sourceType);\n const byteLength = targetByteOffset + sourceWidth * sourceHeight * components * byteCount;\n webglBufferTarget = webglFramebuffer.device.createBuffer({byteLength});\n }\n\n // TODO(donmccurdy): Do we have tests to confirm this is working?\n const commandEncoder = source.device.createCommandEncoder();\n commandEncoder.copyTextureToBuffer({\n sourceTexture: source as Texture,\n width: sourceWidth,\n height: sourceHeight,\n origin: [sourceX, sourceY],\n destinationBuffer: webglBufferTarget,\n byteOffset: targetByteOffset\n });\n commandEncoder.destroy();\n\n if (deleteFramebuffer) {\n framebuffer.destroy();\n }\n\n return webglBufferTarget;\n}\n\n/**\n * Copy a rectangle from a Framebuffer or Texture object into a texture (at an offset)\n * @deprecated Use CommandEncoder\n */\n// eslint-disable-next-line complexity, max-statements\nexport function copyToTexture(\n sourceTexture: Framebuffer | Texture,\n destinationTexture: Texture | GL,\n options?: {\n sourceX?: number;\n sourceY?: number;\n\n targetX?: number;\n targetY?: number;\n targetZ?: number;\n targetMipmaplevel?: number;\n targetInternalFormat?: number;\n\n width?: number; // defaults to target width\n height?: number; // defaults to target height\n }\n): Texture {\n const {\n sourceX = 0,\n sourceY = 0,\n // attachment = GL.COLOR_ATTACHMENT0, // TODO - support gl.readBuffer\n targetMipmaplevel = 0,\n targetInternalFormat = GL.RGBA\n } = options || {};\n let {\n targetX,\n targetY,\n targetZ,\n width, // defaults to target width\n height // defaults to target height\n } = options || {};\n\n const {framebuffer, deleteFramebuffer} = getFramebuffer(sourceTexture);\n // assert(framebuffer);\n const webglFramebuffer = framebuffer;\n const {device, handle} = webglFramebuffer;\n const isSubCopy =\n typeof targetX !== 'undefined' ||\n typeof targetY !== 'undefined' ||\n typeof targetZ !== 'undefined';\n targetX = targetX || 0;\n targetY = targetY || 0;\n targetZ = targetZ || 0;\n const prevHandle = device.gl.bindFramebuffer(GL.FRAMEBUFFER, handle);\n // TODO - support gl.readBuffer (WebGL2 only)\n // const prevBuffer = gl.readBuffer(attachment);\n // assert(target);\n let texture: WEBGLTexture | null = null;\n let textureTarget: GL;\n if (destinationTexture instanceof WEBGLTexture) {\n texture = destinationTexture;\n width = Number.isFinite(width) ? width : texture.width;\n height = Number.isFinite(height) ? height : texture.height;\n texture?.bind(0);\n // @ts-ignore\n textureTarget = texture.target;\n } else {\n // @ts-ignore\n textureTarget = target;\n }\n\n if (!isSubCopy) {\n device.gl.copyTexImage2D(\n textureTarget,\n targetMipmaplevel,\n targetInternalFormat,\n sourceX,\n sourceY,\n width,\n height,\n 0 /* border must be 0 */\n );\n } else {\n switch (textureTarget) {\n case GL.TEXTURE_2D:\n case GL.TEXTURE_CUBE_MAP:\n device.gl.copyTexSubImage2D(\n textureTarget,\n targetMipmaplevel,\n targetX,\n targetY,\n sourceX,\n sourceY,\n width,\n height\n );\n break;\n case GL.TEXTURE_2D_ARRAY:\n case GL.TEXTURE_3D:\n device.gl.copyTexSubImage3D(\n textureTarget,\n targetMipmaplevel,\n targetX,\n targetY,\n targetZ,\n sourceX,\n sourceY,\n width,\n height\n );\n break;\n default:\n }\n }\n if (texture) {\n texture.unbind();\n }\n // @ts-expect-error\n device.gl.bindFramebuffer(GL.FRAMEBUFFER, prevHandle || null);\n if (deleteFramebuffer) {\n framebuffer.destroy();\n }\n return texture;\n}\n\nfunction getFramebuffer(source: Texture | Framebuffer): {\n framebuffer: WEBGLFramebuffer;\n deleteFramebuffer: boolean;\n} {\n if (!(source instanceof Framebuffer)) {\n return {framebuffer: toFramebuffer(source), deleteFramebuffer: true};\n }\n return {framebuffer: source as WEBGLFramebuffer, deleteFramebuffer: false};\n}\n\n/**\n * Wraps a given texture into a framebuffer object, that can be further used\n * to read data from the texture object.\n */\nexport function toFramebuffer(texture: Texture, props?: FramebufferProps): WEBGLFramebuffer {\n const {device, width, height, id} = texture;\n const framebuffer = device.createFramebuffer({\n ...props,\n id: `framebuffer-for-${id}`,\n width,\n height,\n colorAttachments: [texture]\n });\n return framebuffer as WEBGLFramebuffer;\n}\n\n// eslint-disable-next-line max-params\nfunction getPixelArray(\n pixelArray,\n glType: GLDataType | GLPixelType,\n glFormat: GL,\n width: number,\n height: number,\n depth?: number\n): Uint8Array | Uint16Array | Float32Array {\n if (pixelArray) {\n return pixelArray;\n }\n // const formatInfo = decodeTextureFormat(format);\n // Allocate pixel array if not already available, using supplied type\n glType ||= GL.UNSIGNED_BYTE;\n const ArrayType = getTypedArrayFromGLType(glType, {clamped: false});\n const components = glFormatToComponents(glFormat);\n // TODO - check for composite type (components = 1).\n return new ArrayType(width * height * components) as Uint8Array | Uint16Array | Float32Array;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {TypedArray, TypedArrayConstructor} from '@math.gl/types';\nimport {GL, GLDataType, GLPixelType} from '@luma.gl/constants';\n\nconst ERR_TYPE_DEDUCTION = 'Failed to deduce GL constant from typed array';\n\n/**\n * Converts TYPED ARRAYS to corresponding GL constant\n * Used to auto deduce gl parameter types\n * @deprecated Use getDataTypeFromTypedArray\n * @param arrayOrType\n * @returns\n */\nexport function getGLTypeFromTypedArray(arrayOrType: TypedArray): GLDataType {\n // If typed array, look up constructor\n const type = ArrayBuffer.isView(arrayOrType) ? arrayOrType.constructor : arrayOrType;\n switch (type) {\n case Float32Array:\n return GL.FLOAT;\n case Uint16Array:\n return GL.UNSIGNED_SHORT;\n case Uint32Array:\n return GL.UNSIGNED_INT;\n case Uint8Array:\n return GL.UNSIGNED_BYTE;\n case Uint8ClampedArray:\n return GL.UNSIGNED_BYTE;\n case Int8Array:\n return GL.BYTE;\n case Int16Array:\n return GL.SHORT;\n case Int32Array:\n return GL.INT;\n default:\n throw new Error(ERR_TYPE_DEDUCTION);\n }\n}\n\n/**\n * Converts GL constant to corresponding TYPED ARRAY\n * Used to auto deduce gl parameter types\n * @deprecated Use getTypedArrayFromDataType\n * @param glType\n * @param param1\n * @returns\n */\n// eslint-disable-next-line complexity\nexport function getTypedArrayFromGLType(\n glType: GLDataType | GLPixelType,\n options?: {\n clamped?: boolean;\n }\n): TypedArrayConstructor {\n const {clamped = true} = options || {};\n // Sorted in some order of likelihood to reduce amount of comparisons\n switch (glType) {\n case GL.FLOAT:\n return Float32Array;\n case GL.UNSIGNED_SHORT:\n case GL.UNSIGNED_SHORT_5_6_5:\n case GL.UNSIGNED_SHORT_4_4_4_4:\n case GL.UNSIGNED_SHORT_5_5_5_1:\n return Uint16Array;\n case GL.UNSIGNED_INT:\n return Uint32Array;\n case GL.UNSIGNED_BYTE:\n return clamped ? Uint8ClampedArray : Uint8Array;\n case GL.BYTE:\n return Int8Array;\n case GL.SHORT:\n return Int16Array;\n case GL.INT:\n return Int32Array;\n default:\n throw new Error('Failed to deduce typed array type from GL constant');\n }\n}\n\n/**\n * Flip rows (can be used on arrays returned from `Framebuffer.readPixels`)\n * https: *stackoverflow.com/questions/41969562/\n * how-can-i-flip-the-result-of-webglrenderingcontext-readpixels\n * @param param0\n */\nexport function flipRows(options: {\n data: TypedArray;\n width: number;\n height: number;\n bytesPerPixel?: number;\n temp?: Uint8Array;\n}): void {\n const {data, width, height, bytesPerPixel = 4, temp} = options;\n const bytesPerRow = width * bytesPerPixel;\n\n // make a temp buffer to hold one row\n const tempBuffer = temp || new Uint8Array(bytesPerRow);\n for (let y = 0; y < height / 2; ++y) {\n const topOffset = y * bytesPerRow;\n const bottomOffset = (height - y - 1) * bytesPerRow;\n // make copy of a row on the top half\n tempBuffer.set(data.subarray(topOffset, topOffset + bytesPerRow));\n // copy a row from the bottom half to the top\n data.copyWithin(topOffset, bottomOffset, bottomOffset + bytesPerRow);\n // copy the copy of the top half row to the bottom half\n data.set(tempBuffer, bottomOffset);\n }\n}\n\nexport function scalePixels(options: {data: TypedArray; width: number; height: number}): {\n data: Uint8Array;\n width: number;\n height: number;\n} {\n const {data, width, height} = options;\n const newWidth = Math.round(width / 2);\n const newHeight = Math.round(height / 2);\n const newData = new Uint8Array(newWidth * newHeight * 4);\n for (let y = 0; y < newHeight; y++) {\n for (let x = 0; x < newWidth; x++) {\n for (let c = 0; c < 4; c++) {\n newData[(y * newWidth + x) * 4 + c] = data[(y * 2 * width + x * 2) * 4 + c];\n }\n }\n }\n return {data: newData, width: newWidth, height: newHeight};\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {GL} from '@luma.gl/constants';\n\n// Returns number of components in a specific readPixels WebGL format\nexport function glFormatToComponents(format) {\n switch (format) {\n case GL.ALPHA:\n case GL.R32F:\n case GL.RED:\n case GL.RED_INTEGER:\n return 1;\n case GL.RG32I:\n case GL.RG32UI:\n case GL.RG32F:\n case GL.RG_INTEGER:\n case GL.RG:\n return 2;\n case GL.RGB:\n case GL.RGB_INTEGER:\n case GL.RGB32F:\n return 3;\n case GL.RGBA:\n case GL.RGBA_INTEGER:\n case GL.RGBA32F:\n return 4;\n // TODO: Add support for additional WebGL2 formats\n default:\n return 0;\n }\n}\n\n// Return byte count for given readPixels WebGL type\nexport function glTypeToBytes(type) {\n switch (type) {\n case GL.UNSIGNED_BYTE:\n return 1;\n case GL.UNSIGNED_SHORT_5_6_5:\n case GL.UNSIGNED_SHORT_4_4_4_4:\n case GL.UNSIGNED_SHORT_5_5_5_1:\n return 2;\n case GL.FLOAT:\n return 4;\n // TODO: Add support for additional WebGL2 types\n default:\n return 0;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {GLParameters, setGLParameters} from '../parameters/unified-parameter-api';\nimport {WebGLStateTracker} from './webgl-state-tracker';\n\n/**\n * Execute a function with a set of temporary WebGL parameter overrides\n * - Saves current \"global\" WebGL context settings\n * - Sets the supplies WebGL context parameters,\n * - Executes supplied function\n * - Restores parameters\n * - Returns the return value of the supplied function\n */\nexport function withGLParameters(\n gl: WebGL2RenderingContext,\n parameters: GLParameters & {nocatch?: boolean},\n func: any\n): any {\n if (isObjectEmpty(parameters)) {\n // Avoid setting state if no parameters provided. Just call and return\n return func(gl);\n }\n\n const {nocatch = true} = parameters;\n\n const webglState = WebGLStateTracker.get(gl);\n webglState.push();\n setGLParameters(gl, parameters);\n\n // Setup is done, call the function\n let value;\n\n if (nocatch) {\n // Avoid try catch to minimize stack size impact for safe execution paths\n value = func(gl);\n webglState.pop();\n } else {\n // Wrap in a try-catch to ensure that parameters are restored on exceptions\n try {\n value = func(gl);\n } finally {\n webglState.pop();\n }\n }\n\n return value;\n}\n\n// Helpers\n\n// Returns true if given object is empty, false otherwise.\nfunction isObjectEmpty(object) {\n // @ts-ignore - dummy key variable\n for (const key in object) {\n return false;\n }\n return true;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {NumericArray, NumberArray4} from '@math.gl/types';\nimport {RenderPass, RenderPassProps, RenderPassParameters} from '@luma.gl/core';\nimport {WebGLDevice} from '../webgl-device';\nimport {GL, GLParameters} from '@luma.gl/constants';\nimport {withGLParameters} from '../../context/state-tracker/with-parameters';\nimport {setGLParameters} from '../../context/parameters/unified-parameter-api';\nimport {WEBGLQuerySet} from './webgl-query-set';\n\nconst COLOR_CHANNELS = [0x1, 0x2, 0x4, 0x8]; // GPUColorWrite RED, GREEN, BLUE, ALPHA\n\nexport class WEBGLRenderPass extends RenderPass {\n readonly device: WebGLDevice;\n\n /** Parameters that should be applied before each draw call */\n glParameters: GLParameters;\n\n constructor(device: WebGLDevice, props: RenderPassProps) {\n super(device, props);\n this.device = device;\n\n // If no viewport is provided, apply reasonably defaults\n let viewport;\n if (!props?.parameters?.viewport) {\n if (props?.framebuffer) {\n // Set the viewport to the size of the framebuffer\n const {width, height} = props.framebuffer;\n viewport = [0, 0, width, height];\n } else {\n // Instead of using our own book-keeping, we can just read the values from the WebGL context\n const [width, height] = device.getCanvasContext().getDrawingBufferSize();\n viewport = [0, 0, width, height];\n }\n }\n\n // TODO - do parameters (scissorRect) affect the clear operation?\n this.device.pushState();\n this.setParameters({viewport, ...this.props.parameters});\n\n // Specify mapping of draw buffer locations to color attachments\n if (this.props.framebuffer) {\n const drawBuffers = this.props.framebuffer.colorAttachments.map(\n (_, i) => GL.COLOR_ATTACHMENT0 + i\n );\n this.device.gl.drawBuffers(drawBuffers);\n } else {\n this.device.gl.drawBuffers([GL.BACK]);\n }\n\n // Hack - for now WebGL draws in \"immediate mode\" (instead of queueing the operations)...\n this.clear();\n }\n\n end(): void {\n this.device.popState();\n // should add commands to CommandEncoder.\n }\n\n pushDebugGroup(groupLabel: string): void {}\n popDebugGroup(): void {}\n insertDebugMarker(markerLabel: string): void {}\n\n // beginOcclusionQuery(queryIndex: number): void;\n // endOcclusionQuery(): void;\n\n // executeBundles(bundles: Iterable<GPURenderBundle>): void;\n\n /**\n * Maps RenderPass parameters to GL parameters\n */\n setParameters(parameters: RenderPassParameters = {}): void {\n const glParameters: GLParameters = {...this.glParameters};\n\n // Framebuffers are specified using parameters in WebGL\n glParameters.framebuffer = this.props.framebuffer || null;\n\n if (this.props.depthReadOnly) {\n glParameters.depthMask = !this.props.depthReadOnly;\n }\n\n glParameters.stencilMask = this.props.stencilReadOnly ? 0 : 1;\n\n glParameters[GL.RASTERIZER_DISCARD] = this.props.discard;\n\n // Map the four renderpass parameters to WebGL parameters\n if (parameters.viewport) {\n // WebGPU viewports are 6 coordinates (X, Y, Z)\n if (parameters.viewport.length >= 6) {\n glParameters.viewport = parameters.viewport.slice(0, 4) as NumberArray4;\n glParameters.depthRange = [parameters.viewport[4], parameters.viewport[5]];\n } else {\n // WebGL viewports are 4 coordinates (X, Y)\n glParameters.viewport = parameters.viewport as NumberArray4;\n }\n }\n if (parameters.scissorRect) {\n glParameters.scissorTest = true;\n glParameters.scissor = parameters.scissorRect;\n }\n if (parameters.blendConstant) {\n glParameters.blendColor = parameters.blendConstant;\n }\n if (parameters.stencilReference) {\n // eslint-disable-next-line no-console\n console.warn('RenderPassParameters.stencilReference not yet implemented in WebGL');\n // parameters.stencilFunc = [func, ref, mask];\n // Does this work?\n parameters[GL.STENCIL_REF] = parameters.stencilReference;\n }\n\n if (parameters.colorMask) {\n glParameters.colorMask = COLOR_CHANNELS.map(channel =>\n Boolean(channel & parameters.colorMask)\n );\n }\n\n this.glParameters = glParameters;\n\n setGLParameters(this.device.gl, glParameters);\n }\n\n beginOcclusionQuery(queryIndex: number): void {\n const webglQuerySet = this.props.occlusionQuerySet as WEBGLQuerySet;\n webglQuerySet?.beginOcclusionQuery();\n }\n\n override endOcclusionQuery(): void {\n const webglQuerySet = this.props.occlusionQuerySet as WEBGLQuerySet;\n webglQuerySet?.endOcclusionQuery();\n }\n\n // PRIVATE\n\n /**\n * Optionally clears depth, color and stencil buffers based on parameters\n */\n protected clear(): void {\n const glParameters: GLParameters = {...this.glParameters};\n\n let clearMask = 0;\n\n if (this.props.clearColors) {\n this.props.clearColors.forEach((color, drawBufferIndex) => {\n if (color) {\n this.clearColorBuffer(drawBufferIndex, color);\n }\n });\n }\n\n if (this.props.clearColor !== false && this.props.clearColors === undefined) {\n clearMask |= GL.COLOR_BUFFER_BIT;\n glParameters.clearColor = this.props.clearColor;\n }\n if (this.props.clearDepth !== false) {\n clearMask |= GL.DEPTH_BUFFER_BIT;\n glParameters.clearDepth = this.props.clearDepth;\n }\n if (this.props.clearStencil !== false) {\n clearMask |= GL.STENCIL_BUFFER_BIT;\n glParameters.clearStencil = this.props.clearStencil;\n }\n\n if (clearMask !== 0) {\n // Temporarily set any clear \"colors\" and call clear\n withGLParameters(this.device.gl, glParameters, () => {\n this.device.gl.clear(clearMask);\n });\n }\n }\n\n /**\n * WebGL2 - clear a specific color buffer\n */\n protected clearColorBuffer(drawBuffer: number = 0, value: NumericArray = [0, 0, 0, 0]) {\n withGLParameters(this.device.gl, {framebuffer: this.props.framebuffer}, () => {\n // Method selection per OpenGL ES 3 docs\n switch (value.constructor) {\n case Int8Array:\n case Int16Array:\n case Int32Array:\n this.device.gl.clearBufferiv(GL.COLOR, drawBuffer, value);\n break;\n case Uint8Array:\n case Uint8ClampedArray:\n case Uint16Array:\n case Uint32Array:\n this.device.gl.clearBufferuiv(GL.COLOR, drawBuffer, value);\n break;\n case Float32Array:\n this.device.gl.clearBufferfv(GL.COLOR, drawBuffer, value);\n break;\n default:\n throw new Error('clearColorBuffer: color must be typed array');\n }\n });\n }\n\n /*\n clearDepthStencil() {\n case GL.DEPTH:\n this.device.gl.clearBufferfv(GL.DEPTH, 0, [value]);\n break;\n\n case GL_STENCIL:\n this.device.gl.clearBufferiv(GL.STENCIL, 0, [value]);\n break;\n\n case GL.DEPTH_STENCIL:\n const [depth, stencil] = value;\n this.device.gl.clearBufferfi(GL.DEPTH_STENCIL, 0, depth, stencil);\n break;\n\n default:\n assert(false, ERR_ARGUMENTS);\n }\n });\n */\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {\n RenderPipelineProps,\n RenderPipelineParameters,\n PrimitiveTopology,\n ShaderLayout,\n UniformValue,\n Binding,\n RenderPass,\n VertexArray\n} from '@luma.gl/core';\nimport {RenderPipeline, log} from '@luma.gl/core';\n// import {getAttributeInfosFromLayouts} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\n\nimport {getShaderLayoutFromGLSL} from '../helpers/get-shader-layout';\nimport {withDeviceAndGLParameters} from '../converters/device-parameters';\nimport {setUniform} from '../helpers/set-uniform';\nimport {splitUniformsAndBindings} from '../../utils/split-uniforms-and-bindings';\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';\nimport {WEBGLTextureView} from './webgl-texture-view';\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 = props.vs as WEBGLShader;\n this.fs = props.fs as WEBGLShader;\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.varyings = varyings;\n this.device.gl.transformFeedbackVaryings(this.handle, varyings, bufferMode);\n }\n\n this._linkShaders();\n\n log.time(1, `RenderPipeline ${this.id} - shaderLayout introspection`)();\n this.introspectedLayout = getShaderLayoutFromGLSL(this.device.gl, this.handle);\n log.timeEnd(1, `RenderPipeline ${this.id} - shaderLayout introspection`)();\n\n // Merge provided layout with introspected layout\n this.shaderLayout = mergeShaderLayout(this.introspectedLayout, props.shaderLayout);\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 /**\n * Bindings include: textures, samplers and uniform buffers\n * @todo needed for portable model\n */\n setBindings(bindings: Record<string, Binding>, options?: {disableWarnings?: boolean}): 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 if (!options?.disableWarnings) {\n log.warn(\n `No binding \"${name}\" in render pipeline \"${this.id}\", expected one of ${validBindings}`,\n value\n )();\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 (\n !(\n value instanceof WEBGLTextureView ||\n value instanceof WEBGLTexture ||\n value instanceof WEBGLFramebuffer\n )\n ) {\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 /** @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 parameters?: RenderPipelineParameters;\n topology?: PrimitiveTopology;\n vertexArray: VertexArray;\n isInstanced?: boolean;\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 parameters = this.props.parameters,\n topology = this.props.topology,\n vertexArray,\n vertexCount,\n // indexCount,\n instanceCount,\n isInstanced = false,\n firstVertex = 0,\n // firstIndex,\n // firstInstance,\n // baseVertex,\n transformFeedback\n } = options;\n\n const glDrawMode = getGLDrawMode(topology);\n const isIndexed: boolean = Boolean(vertexArray.indexBuffer);\n const glIndexType = (vertexArray.indexBuffer as WEBGLBuffer)?.glIndexType;\n // Note that we sometimes get called with 0 instances\n\n // If we are using async linking, we need to wait until linking completes\n if (this.linkStatus !== 'success') {\n log.info(2, `RenderPipeline:${this.id}.draw() aborted - waiting for shader linking`)();\n return false;\n }\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()) {\n log.info(2, `RenderPipeline:${this.id}.draw() aborted - textures not yet loaded`)();\n // Note: false means that the app needs to redraw the pipeline again.\n return false;\n }\n\n // (isInstanced && instanceCount === 0)\n // if (vertexCount === 0) {\n // log.info(2, `RenderPipeline:${this.id}.draw() aborted - no vertices to draw`)();\n // Note: false means that the app needs to redraw the pipeline again.\n // return true;\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\n withDeviceAndGLParameters(this.device, parameters, webglRenderPass.glParameters, () => {\n if (isIndexed && isInstanced) {\n this.device.gl.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.gldrawRangeElements(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.gl.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 // DEPRECATED METHODS\n\n override setUniformsWebGL(uniforms: Record<string, UniformValue>) {\n const {bindings} = splitUniformsAndBindings(uniforms);\n Object.keys(bindings).forEach(name => {\n log.warn(\n `Unsupported value \"${JSON.stringify(\n bindings[name]\n )}\" 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 // PRIVATE METHODS\n\n // setAttributes(attributes: Record<string, Buffer>): void {}\n // setBindings(bindings: Record<string, Binding>): void {}\n\n protected async _linkShaders() {\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 // TODO Avoid checking program linking error in production\n if (log.level === 0) {\n // return;\n }\n\n if (!this.device.features.has('compilation-status-async-webgl')) {\n const status = this._getLinkStatus();\n this._reportLinkStatus(status);\n return;\n }\n\n // async case\n log.once(1, 'RenderPipeline linking is asynchronous')();\n await this._waitForLinkComplete();\n log.info(2, `RenderPipeline ${this.id} - async linking complete: ${this.linkStatus}`)();\n const status = this._getLinkStatus();\n this._reportLinkStatus(status);\n }\n\n /** Report link status. First, check for shader compilation failures if linking fails */\n async _reportLinkStatus(status: 'success' | 'linking' | 'validation'): Promise<void> {\n switch (status) {\n case 'success':\n return;\n\n default:\n // First check for shader compilation failures if linking fails\n switch (this.vs.compilationStatus) {\n case 'error':\n this.vs.debugShader();\n throw new Error(`Error during compilation of shader ${this.vs.id}`);\n case 'pending':\n this.vs.asyncCompilationStatus.then(() => this.vs.debugShader());\n break;\n case 'success':\n break;\n }\n\n switch (this.fs?.compilationStatus) {\n case 'error':\n this.fs.debugShader();\n throw new Error(`Error during compilation of shader ${this.fs.id}`);\n case 'pending':\n this.fs.asyncCompilationStatus.then(() => this.fs.debugShader());\n break;\n case 'success':\n break;\n }\n\n const linkErrorLog = this.device.gl.getProgramInfoLog(this.handle);\n throw new Error(`Error during ${status}: ${linkErrorLog}`);\n }\n }\n\n /**\n * Get the shader compilation status\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 */\n _getLinkStatus(): 'success' | 'linking' | 'validation' {\n const {gl} = this.device;\n const linked = gl.getProgramParameter(this.handle, gl.LINK_STATUS);\n if (!linked) {\n this.linkStatus = 'error';\n return 'linking';\n }\n\n gl.validateProgram(this.handle);\n const validated = gl.getProgramParameter(this.handle, gl.VALIDATE_STATUS);\n if (!validated) {\n this.linkStatus = 'error';\n return 'validation';\n }\n\n this.linkStatus = 'success';\n return 'success';\n }\n\n /** Use KHR_parallel_shader_compile extension if available */\n async _waitForLinkComplete(): Promise<void> {\n const waitMs = async (ms: number) => await new Promise(resolve => setTimeout(resolve, ms));\n const DELAY_MS = 10; // Shader compilation is typically quite fast (with some exceptions)\n\n // If status polling is not available, we can't wait for completion. Just wait a little to minimize blocking\n if (!this.device.features.has('compilation-status-async-webgl')) {\n await waitMs(DELAY_MS);\n return;\n }\n\n const {gl} = this.device;\n for (;;) {\n const complete = gl.getProgramParameter(this.handle, GL.COMPLETION_STATUS_KHR);\n if (complete) {\n return;\n }\n await waitMs(DELAY_MS);\n }\n }\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 bindingInfo of this.shaderLayout.bindings) {\n if (\n !this.bindings[bindingInfo.name] &&\n !this.bindings[bindingInfo.name.replace(/Uniforms$/, '')]\n ) {\n log.warn(`Binding ${bindingInfo.name} not found in ${this.id}`)();\n texturesRenderable = false;\n }\n }\n\n // TODO - remove this should be handled by ExternalTexture\n // for (const [, texture] of Object.entries(this.bindings)) {\n // if (texture instanceof WEBGLTexture) {\n // texture.update();\n // }\n // }\n\n return texturesRenderable;\n }\n\n /** Apply any bindings (before each draw call) */\n _applyBindings() {\n // If we are using async linking, we need to wait until linking completes\n if (this.linkStatus !== 'success') {\n return;\n }\n\n const {gl} = this.device;\n gl.useProgram(this.handle);\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 = gl.getUniformBlockIndex(this.handle, name);\n if ((location as GL) === GL.INVALID_INDEX) {\n throw new Error(`Invalid uniform block name ${name}`);\n }\n gl.uniformBlockBinding(this.handle, uniformBufferIndex, location);\n // console.debug(binding, location);\n if (value instanceof WEBGLBuffer) {\n gl.bindBufferBase(GL.UNIFORM_BUFFER, uniformBufferIndex, value.handle);\n } else {\n gl.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 (\n !(\n value instanceof WEBGLTextureView ||\n value instanceof WEBGLTexture ||\n value instanceof WEBGLFramebuffer\n )\n ) {\n throw new Error('texture');\n }\n let texture: WEBGLTexture;\n if (value instanceof WEBGLTextureView) {\n texture = value.texture;\n } else if (value instanceof WEBGLTexture) {\n texture = value;\n } else if (\n value instanceof WEBGLFramebuffer &&\n value.colorAttachments[0] instanceof WEBGLTextureView\n ) {\n log.warn(\n 'Passing framebuffer in texture binding may be deprecated. Use fbo.colorAttachments[0] instead'\n )();\n texture = value.colorAttachments[0].texture;\n } else {\n throw new Error('No texture');\n }\n\n gl.activeTexture(GL.TEXTURE0 + textureUnit);\n gl.bindTexture(texture.glTarget, texture.handle);\n // gl.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/**\n * Merges an provided shader layout into a base shader layout\n * In WebGL, this allows the auto generated shader layout to be overridden by the application\n * Typically to change the format of the vertex attributes (from float32x4 to uint8x4 etc).\n * @todo Drop this? Aren't all use cases covered by mergeBufferLayout()?\n */\nfunction mergeShaderLayout(baseLayout: ShaderLayout, overrideLayout: ShaderLayout): ShaderLayout {\n // Deep clone the base layout\n const mergedLayout: ShaderLayout = {\n ...baseLayout,\n attributes: baseLayout.attributes.map(attribute => ({...attribute}))\n };\n // Merge the attributes\n for (const attribute of overrideLayout?.attributes || []) {\n const baseAttribute = mergedLayout.attributes.find(attr => attr.name === attribute.name);\n if (!baseAttribute) {\n log.warn(`shader layout attribute ${attribute.name} not present in shader`);\n } else {\n baseAttribute.type = attribute.type || baseAttribute.type;\n baseAttribute.stepMode = attribute.stepMode || baseAttribute.stepMode;\n }\n }\n return mergedLayout;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {\n ShaderLayout,\n UniformBinding,\n UniformBlockBinding,\n AttributeDeclaration,\n VaryingBinding\n} from '@luma.gl/core';\n\nimport {GL} from '@luma.gl/constants';\nimport {decodeGLUniformType, decodeGLAttributeType, isSamplerUniform} from './decode-webgl-types';\n\n/**\n * Extract metadata describing binding information for a program's shaders\n * Note: `linkProgram()` needs to have been called\n * (although linking does not need to have been successful).\n */\nexport function getShaderLayoutFromGLSL(\n gl: WebGL2RenderingContext,\n program: WebGLProgram\n): ShaderLayout {\n const shaderLayout: ShaderLayout = {\n attributes: [],\n bindings: []\n };\n\n shaderLayout.attributes = readAttributeDeclarations(gl, program);\n\n // Uniform blocks\n const uniformBlocks: UniformBlockBinding[] = readUniformBlocks(gl, program);\n for (const uniformBlock of uniformBlocks) {\n const uniforms = uniformBlock.uniforms.map(uniform => ({\n name: uniform.name,\n format: uniform.format,\n byteOffset: uniform.byteOffset,\n byteStride: uniform.byteStride,\n arrayLength: uniform.arrayLength\n }));\n shaderLayout.bindings.push({\n type: 'uniform',\n name: uniformBlock.name,\n group: 0,\n location: uniformBlock.location,\n visibility: (uniformBlock.vertex ? 0x1 : 0) & (uniformBlock.fragment ? 0x2 : 0),\n minBindingSize: uniformBlock.byteLength,\n uniforms\n });\n }\n\n const uniforms: UniformBinding[] = readUniformBindings(gl, program);\n let textureUnit = 0;\n for (const uniform of uniforms) {\n if (isSamplerUniform(uniform.type)) {\n const {viewDimension, sampleType} = getSamplerInfo(uniform.type);\n shaderLayout.bindings.push({\n type: 'texture',\n name: uniform.name,\n group: 0,\n location: textureUnit,\n viewDimension,\n sampleType\n });\n\n // @ts-expect-error\n uniform.textureUnit = textureUnit;\n textureUnit += 1;\n }\n }\n\n if (uniforms.length) {\n shaderLayout.uniforms = uniforms;\n }\n\n // Varyings\n const varyings: VaryingBinding[] = readVaryings(gl, program);\n // Note - samplers are always in unform bindings, even if uniform blocks are used\n if (varyings?.length) {\n shaderLayout.varyings = varyings;\n }\n\n return shaderLayout;\n}\n\n// HELPERS\n\n/**\n * Extract info about all transform feedback varyings\n *\n * linkProgram needs to have been called, although linking does not need to have been successful\n */\nfunction readAttributeDeclarations(\n gl: WebGL2RenderingContext,\n program: WebGLProgram\n): AttributeDeclaration[] {\n const attributes: AttributeDeclaration[] = [];\n\n const count = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);\n\n for (let index = 0; index < count; index++) {\n const activeInfo = gl.getActiveAttrib(program, index);\n if (!activeInfo) {\n throw new Error('activeInfo');\n }\n const {name, type: compositeType /* , size*/} = activeInfo;\n const location = gl.getAttribLocation(program, name);\n // Add only user provided attributes, for built-in attributes like `gl_InstanceID` location will be < 0\n if (location >= 0) {\n const {attributeType} = decodeGLAttributeType(compositeType);\n\n // Whether an attribute is instanced is essentially fixed by the structure of the shader code,\n // so it is arguably a static property of the shader.\n // There is no hint in the shader declarations\n // Heuristic: Any attribute name containing the word \"instance\" will be assumed to be instanced\n const stepMode = /instance/i.test(name) ? 'instance' : 'vertex';\n\n attributes.push({\n name,\n location,\n stepMode,\n type: attributeType\n // size - for arrays, size is the number of elements in the array\n });\n }\n }\n\n // Sort by declaration order\n attributes.sort((a: AttributeDeclaration, b: AttributeDeclaration) => a.location - b.location);\n return attributes;\n}\n\n/**\n * Extract info about all transform feedback varyings\n *\n * linkProgram needs to have been called, although linking does not need to have been successful\n */\nfunction readVaryings(gl: WebGL2RenderingContext, program: WebGLProgram): VaryingBinding[] {\n const varyings: VaryingBinding[] = [];\n\n const count = gl.getProgramParameter(program, GL.TRANSFORM_FEEDBACK_VARYINGS);\n for (let location = 0; location < count; location++) {\n const activeInfo = gl.getTransformFeedbackVarying(program, location);\n if (!activeInfo) {\n throw new Error('activeInfo');\n }\n const {name, type: compositeType, size} = activeInfo;\n const {glType, components} = decodeGLUniformType(compositeType);\n const varying = {location, name, type: glType, size: size * components}; // Base values\n varyings.push(varying);\n }\n\n varyings.sort((a, b) => a.location - b.location);\n return varyings;\n}\n\n/**\n * Extract info about all uniforms\n *\n * Query uniform locations and build name to setter map.\n */\nfunction readUniformBindings(gl: WebGL2RenderingContext, program: WebGLProgram): UniformBinding[] {\n const uniforms: UniformBinding[] = [];\n\n const uniformCount = gl.getProgramParameter(program, GL.ACTIVE_UNIFORMS);\n for (let i = 0; i < uniformCount; i++) {\n const activeInfo = gl.getActiveUniform(program, i);\n if (!activeInfo) {\n throw new Error('activeInfo');\n }\n const {name: rawName, size, type} = activeInfo;\n const {name, isArray} = parseUniformName(rawName);\n let webglLocation = gl.getUniformLocation(program, name);\n const uniformInfo = {\n // WebGL locations are uniquely typed but just numbers\n location: webglLocation as number,\n name,\n size,\n type,\n isArray\n };\n uniforms.push(uniformInfo);\n\n // Array (e.g. matrix) uniforms can occupy several 4x4 byte banks\n if (uniformInfo.size > 1) {\n for (let j = 0; j < uniformInfo.size; j++) {\n const elementName = `${name}[${j}]`;\n\n webglLocation = gl.getUniformLocation(program, elementName);\n\n const arrayElementUniformInfo = {\n ...uniformInfo,\n name: elementName,\n location: webglLocation as number\n };\n\n uniforms.push(arrayElementUniformInfo);\n }\n }\n }\n return uniforms;\n}\n\n/**\n * Extract info about all \"active\" uniform blocks\n * @note In WebGL, \"active\" just means that unused (inactive) blocks may have been optimized away during linking)\n */\nfunction readUniformBlocks(\n gl: WebGL2RenderingContext,\n program: WebGLProgram\n): UniformBlockBinding[] {\n const getBlockParameter = (blockIndex: number, pname: GL): any =>\n gl.getActiveUniformBlockParameter(program, blockIndex, pname);\n\n const uniformBlocks: UniformBlockBinding[] = [];\n\n const blockCount = gl.getProgramParameter(program, GL.ACTIVE_UNIFORM_BLOCKS);\n for (let blockIndex = 0; blockIndex < blockCount; blockIndex++) {\n const blockInfo: UniformBlockBinding = {\n name: gl.getActiveUniformBlockName(program, blockIndex) || '',\n location: getBlockParameter(blockIndex, GL.UNIFORM_BLOCK_BINDING),\n byteLength: getBlockParameter(blockIndex, GL.UNIFORM_BLOCK_DATA_SIZE),\n vertex: getBlockParameter(blockIndex, GL.UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER),\n fragment: getBlockParameter(blockIndex, GL.UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER),\n uniformCount: getBlockParameter(blockIndex, GL.UNIFORM_BLOCK_ACTIVE_UNIFORMS),\n uniforms: [] as any[]\n };\n\n const uniformIndices =\n (getBlockParameter(blockIndex, GL.UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES) as number[]) || [];\n\n const uniformType = gl.getActiveUniforms(program, uniformIndices, GL.UNIFORM_TYPE); // Array of GLenum indicating the types of the uniforms.\n const uniformArrayLength = gl.getActiveUniforms(program, uniformIndices, GL.UNIFORM_SIZE); // Array of GLuint indicating the sizes of the uniforms.\n // const uniformBlockIndex = gl.getActiveUniforms(\n // program,\n // uniformIndices,\n // GL.UNIFORM_BLOCK_INDEX\n // ); // Array of GLint indicating the block indices of the uniforms.\n const uniformOffset = gl.getActiveUniforms(program, uniformIndices, GL.UNIFORM_OFFSET); // Array of GLint indicating the uniform buffer offsets.\n const uniformStride = gl.getActiveUniforms(program, uniformIndices, GL.UNIFORM_ARRAY_STRIDE); // Array of GLint indicating the strides between the elements.\n // const uniformMatrixStride = gl.getActiveUniforms(\n // program,\n // uniformIndices,\n // GL.UNIFORM_MATRIX_STRIDE\n // ); // Array of GLint indicating the strides between columns of a column-major matrix or a row-major matrix.\n // const uniformRowMajor = gl.getActiveUniforms(program, uniformIndices, GL.UNIFORM_IS_ROW_MAJOR);\n for (let i = 0; i < blockInfo.uniformCount; ++i) {\n const activeInfo = gl.getActiveUniform(program, uniformIndices[i]);\n if (!activeInfo) {\n throw new Error('activeInfo');\n }\n\n blockInfo.uniforms.push({\n name: activeInfo.name,\n format: decodeGLUniformType(uniformType[i]).format,\n type: uniformType[i],\n arrayLength: uniformArrayLength[i],\n byteOffset: uniformOffset[i],\n byteStride: uniformStride[i]\n // matrixStride: uniformStride[i],\n // rowMajor: uniformRowMajor[i]\n });\n }\n\n uniformBlocks.push(blockInfo);\n }\n\n uniformBlocks.sort((a, b) => a.location - b.location);\n return uniformBlocks;\n}\n\n/**\n * TOOD - compare with a above, confirm copy, then delete\n const bindings: Binding[] = [];\n const count = gl.getProgramParameter(program, gl.ACTIVE_UNIFORM_BLOCKS);\n for (let blockIndex = 0; blockIndex < count; blockIndex++) {\n const vertex = gl.getActiveUniformBlockParameter(program, blockIndex, gl.UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER),\n const fragment = gl.getActiveUniformBlockParameter(program, blockIndex, gl.UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER),\n const visibility = (vertex) + (fragment);\n const binding: BufferBinding = {\n location: gl.getActiveUniformBlockParameter(program, blockIndex, gl.UNIFORM_BLOCK_BINDING),\n // name: gl.getActiveUniformBlockName(program, blockIndex),\n type: 'uniform',\n visibility,\n minBindingSize: gl.getActiveUniformBlockParameter(program, blockIndex, gl.UNIFORM_BLOCK_DATA_SIZE),\n // uniformCount: gl.getActiveUniformBlockParameter(program, blockIndex, gl.UNIFORM_BLOCK_ACTIVE_UNIFORMS),\n // uniformIndices: gl.getActiveUniformBlockParameter(program, blockIndex, gl.UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES),\n }\n bindings.push(binding);\n }\n*/\n\nconst SAMPLER_UNIFORMS_GL_TO_GPU: Record<\n number,\n [\n '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d',\n 'float' | 'unfilterable-float' | 'depth' | 'sint' | 'uint'\n ]\n> = {\n [GL.SAMPLER_2D]: ['2d', 'float'],\n [GL.SAMPLER_CUBE]: ['cube', 'float'],\n [GL.SAMPLER_3D]: ['3d', 'float'],\n [GL.SAMPLER_2D_SHADOW]: ['3d', 'depth'],\n [GL.SAMPLER_2D_ARRAY]: ['2d-array', 'float'],\n [GL.SAMPLER_2D_ARRAY_SHADOW]: ['2d-array', 'depth'],\n [GL.SAMPLER_CUBE_SHADOW]: ['cube', 'float'],\n [GL.INT_SAMPLER_2D]: ['2d', 'sint'],\n [GL.INT_SAMPLER_3D]: ['3d', 'sint'],\n [GL.INT_SAMPLER_CUBE]: ['cube', 'sint'],\n [GL.INT_SAMPLER_2D_ARRAY]: ['2d-array', 'uint'],\n [GL.UNSIGNED_INT_SAMPLER_2D]: ['2d', 'uint'],\n [GL.UNSIGNED_INT_SAMPLER_3D]: ['3d', 'uint'],\n [GL.UNSIGNED_INT_SAMPLER_CUBE]: ['cube', 'uint'],\n [GL.UNSIGNED_INT_SAMPLER_2D_ARRAY]: ['2d-array', 'uint']\n};\n\ntype SamplerInfo = {\n viewDimension: '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d';\n sampleType: 'float' | 'unfilterable-float' | 'depth' | 'sint' | 'uint';\n};\n\nfunction getSamplerInfo(type: GL): SamplerInfo {\n const sampler = SAMPLER_UNIFORMS_GL_TO_GPU[type];\n if (!sampler) {\n throw new Error('sampler');\n }\n const [viewDimension, sampleType] = sampler;\n return {viewDimension, sampleType};\n}\n\n// HELPERS\n\nfunction parseUniformName(name: string): {name: string; length: number; isArray: boolean} {\n // Shortcut to avoid redundant or bad matches\n if (name[name.length - 1] !== ']') {\n return {\n name,\n length: 1,\n isArray: false\n };\n }\n\n // if array name then clean the array brackets\n const UNIFORM_NAME_REGEXP = /([^[]*)(\\[[0-9]+\\])?/;\n const matches = UNIFORM_NAME_REGEXP.exec(name);\n if (!matches || matches.length < 2) {\n throw new Error(`Failed to parse GLSL uniform name ${name}`);\n }\n\n return {\n name: matches[1],\n length: matches[2] ? 1 : 0,\n isArray: Boolean(matches[2])\n };\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {ShaderUniformType, ShaderAttributeType, VertexFormat} from '@luma.gl/core';\nimport {GL, GLUniformType, GLSamplerType, GLCompositeType, GLDataType} from '@luma.gl/constants';\n\n/** Check is uniform is of sampler type */\nexport function isSamplerUniform(type: GLUniformType): boolean {\n return SAMPLER_TYPES.includes(type as GLSamplerType);\n}\n\nconst SAMPLER_TYPES: GLSamplerType[] = [\n GL.SAMPLER_2D,\n GL.SAMPLER_CUBE,\n GL.SAMPLER_3D,\n GL.SAMPLER_2D_SHADOW,\n GL.SAMPLER_2D_ARRAY,\n GL.SAMPLER_2D_ARRAY_SHADOW,\n GL.SAMPLER_CUBE_SHADOW,\n GL.INT_SAMPLER_2D,\n GL.INT_SAMPLER_3D,\n GL.INT_SAMPLER_CUBE,\n GL.INT_SAMPLER_2D_ARRAY,\n GL.UNSIGNED_INT_SAMPLER_2D,\n GL.UNSIGNED_INT_SAMPLER_3D,\n GL.UNSIGNED_INT_SAMPLER_CUBE,\n GL.UNSIGNED_INT_SAMPLER_2D_ARRAY\n];\n\n// Composite types table\nconst COMPOSITE_GL_TYPES: Record<\n GLCompositeType,\n [GLDataType, number, string, ShaderUniformType, VertexFormat?]\n> = {\n [GL.FLOAT]: [GL.FLOAT, 1, 'float', 'f32', 'float32'],\n [GL.FLOAT_VEC2]: [GL.FLOAT, 2, 'vec2', 'vec2<f32>', 'float32x2'],\n [GL.FLOAT_VEC3]: [GL.FLOAT, 3, 'vec3', 'vec3<f32>', 'float32x3'],\n [GL.FLOAT_VEC4]: [GL.FLOAT, 4, 'vec4', 'vec4<f32>', 'float32x4'],\n\n [GL.INT]: [GL.INT, 1, 'int', 'i32', 'sint32'],\n [GL.INT_VEC2]: [GL.INT, 2, 'ivec2', 'vec2<i32>', 'sint32x2'],\n [GL.INT_VEC3]: [GL.INT, 3, 'ivec3', 'vec3<i32>', 'sint32x3'],\n [GL.INT_VEC4]: [GL.INT, 4, 'ivec4', 'vec4<i32>', 'sint32x4'],\n\n [GL.UNSIGNED_INT]: [GL.UNSIGNED_INT, 1, 'uint', 'u32', 'uint32'],\n [GL.UNSIGNED_INT_VEC2]: [GL.UNSIGNED_INT, 2, 'uvec2', 'vec2<u32>', 'uint32x2'],\n [GL.UNSIGNED_INT_VEC3]: [GL.UNSIGNED_INT, 3, 'uvec3', 'vec3<u32>', 'uint32x3'],\n [GL.UNSIGNED_INT_VEC4]: [GL.UNSIGNED_INT, 4, 'uvec4', 'vec4<u32>', 'uint32x4'],\n\n [GL.BOOL]: [GL.FLOAT, 1, 'bool', 'f32', 'float32'],\n [GL.BOOL_VEC2]: [GL.FLOAT, 2, 'bvec2', 'vec2<f32>', 'float32x2'],\n [GL.BOOL_VEC3]: [GL.FLOAT, 3, 'bvec3', 'vec3<f32>', 'float32x3'],\n [GL.BOOL_VEC4]: [GL.FLOAT, 4, 'bvec4', 'vec4<f32>', 'float32x4'],\n\n // TODO - are sizes/components below correct?\n [GL.FLOAT_MAT2]: [GL.FLOAT, 8, 'mat2', 'mat2x2<f32>'], // 4\n [GL.FLOAT_MAT2x3]: [GL.FLOAT, 8, 'mat2x3', 'mat2x3<f32>'], // 6\n [GL.FLOAT_MAT2x4]: [GL.FLOAT, 8, 'mat2x4', 'mat2x4<f32>'], // 8\n\n [GL.FLOAT_MAT3x2]: [GL.FLOAT, 12, 'mat3x2', 'mat3x2<f32>'], // 6\n [GL.FLOAT_MAT3]: [GL.FLOAT, 12, 'mat3', 'mat3x3<f32>'], // 9\n [GL.FLOAT_MAT3x4]: [GL.FLOAT, 12, 'mat3x4', 'mat3x4<f32>'], // 12\n\n [GL.FLOAT_MAT4x2]: [GL.FLOAT, 16, 'mat4x2', 'mat4x2<f32>'], // 8\n [GL.FLOAT_MAT4x3]: [GL.FLOAT, 16, 'mat4x3', 'mat4x3<f32>'], // 12\n [GL.FLOAT_MAT4]: [GL.FLOAT, 16, 'mat4', 'mat4x4<f32>'] // 16\n};\n\n/** Decomposes a composite type (GL.VEC3) into a basic type (GL.FLOAT) and components (3) */\nexport function decodeGLUniformType(glUniformType: GL): {\n format: ShaderUniformType;\n components: number;\n glType: GLDataType;\n} {\n const typeAndSize = COMPOSITE_GL_TYPES[glUniformType];\n if (!typeAndSize) {\n throw new Error('uniform');\n }\n const [glType, components, , format] = typeAndSize;\n return {format, components, glType};\n}\n\n/** Decomposes a composite type (GL.VEC3) into a basic type (GL.FLOAT) and components (3) */\nexport function decodeGLAttributeType(glAttributeType: GL): {\n attributeType: ShaderAttributeType;\n vertexFormat: VertexFormat;\n components: number;\n // glType: GLDataType;\n} {\n const typeAndSize = COMPOSITE_GL_TYPES[glAttributeType];\n if (!typeAndSize) {\n throw new Error('attribute');\n }\n const [, components, , shaderType, vertexFormat] = typeAndSize;\n // TODO sanity - if (shaderType.startsWith('mat' ...))\n const attributeType = shaderType as unknown as ShaderAttributeType;\n return {attributeType, vertexFormat, components}; // , glType};\n}\n\n/** Decomposes a composite type GL.VEC3 into a basic type (GL.FLOAT) and components (3) */\nexport function decomposeCompositeGLDataType(\n compositeGLDataType: GLCompositeType\n): {type: GLDataType; components: number} | null {\n const typeAndSize = COMPOSITE_GL_TYPES[compositeGLDataType];\n if (!typeAndSize) {\n return null;\n }\n const [type, components] = typeAndSize;\n return {type, components};\n}\n\nexport function getCompositeGLDataType(\n type: GL,\n components\n): {glType: GLDataType; name: string} | null {\n switch (type) {\n case GL.BYTE:\n case GL.UNSIGNED_BYTE:\n case GL.SHORT:\n case GL.UNSIGNED_SHORT:\n type = GL.FLOAT;\n break;\n default:\n }\n\n for (const glType in COMPOSITE_GL_TYPES) {\n const [compType, compComponents, name] = COMPOSITE_GL_TYPES[glType];\n if (compType === type && compComponents === components) {\n return {glType: Number(glType), name};\n }\n }\n return null;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-disable */\n\n// Uniforms\nimport type {UniformValue} from '@luma.gl/core';\nimport {GL, GLCompositeType, GLSamplerType} from '@luma.gl/constants';\n\n/** Set a raw uniform (without type conversion and caching) */\n/* eslint-disable max-len */\nexport function setUniform(\n gl: WebGL2RenderingContext,\n location: WebGLUniformLocation,\n type: GLCompositeType | GLSamplerType,\n value: UniformValue\n): void {\n const gl2 = gl as WebGL2RenderingContext;\n\n // Prepare the value for WebGL setters\n let uniformValue = value;\n if (uniformValue === true) {\n uniformValue = 1;\n }\n if (uniformValue === false) {\n uniformValue = 0;\n }\n const arrayValue = typeof uniformValue === 'number' ? [uniformValue] : uniformValue;\n\n // prettier-ignore\n switch (type) {\n case GL.SAMPLER_2D:\n case GL.SAMPLER_CUBE:\n case GL.SAMPLER_3D:\n case GL.SAMPLER_2D_SHADOW:\n case GL.SAMPLER_2D_ARRAY:\n case GL.SAMPLER_2D_ARRAY_SHADOW:\n case GL.SAMPLER_CUBE_SHADOW:\n case GL.INT_SAMPLER_2D:\n case GL.INT_SAMPLER_3D:\n case GL.INT_SAMPLER_CUBE:\n case GL.INT_SAMPLER_2D_ARRAY:\n case GL.UNSIGNED_INT_SAMPLER_2D:\n case GL.UNSIGNED_INT_SAMPLER_3D:\n case GL.UNSIGNED_INT_SAMPLER_CUBE:\n case GL.UNSIGNED_INT_SAMPLER_2D_ARRAY:\n if (typeof value !== 'number') {\n throw new Error('samplers must be set to integers');\n }\n return gl.uniform1i(location, value);\n\n case GL.FLOAT: return gl.uniform1fv(location, arrayValue);\n case GL.FLOAT_VEC2: return gl.uniform2fv(location, arrayValue);\n case GL.FLOAT_VEC3: return gl.uniform3fv(location, arrayValue);\n case GL.FLOAT_VEC4: return gl.uniform4fv(location, arrayValue);\n\n case GL.INT: return gl.uniform1iv(location, arrayValue);\n case GL.INT_VEC2: return gl.uniform2iv(location, arrayValue);\n case GL.INT_VEC3: return gl.uniform3iv(location, arrayValue);\n case GL.INT_VEC4: return gl.uniform4iv(location, arrayValue);\n\n case GL.BOOL: return gl.uniform1iv(location, arrayValue);\n case GL.BOOL_VEC2: return gl.uniform2iv(location, arrayValue);\n case GL.BOOL_VEC3: return gl.uniform3iv(location, arrayValue);\n case GL.BOOL_VEC4: return gl.uniform4iv(location, arrayValue);\n\n // WEBGL2 - unsigned integers\n case GL.UNSIGNED_INT: return gl2.uniform1uiv(location, arrayValue, 1);\n case GL.UNSIGNED_INT_VEC2: return gl2.uniform2uiv(location, arrayValue, 2);\n case GL.UNSIGNED_INT_VEC3: return gl2.uniform3uiv(location, arrayValue, 3);\n case GL.UNSIGNED_INT_VEC4: return gl2.uniform4uiv(location, arrayValue, 4);\n\n // WebGL2 - quadratic matrices\n // false: don't transpose the matrix\n case GL.FLOAT_MAT2: return gl.uniformMatrix2fv(location, false, arrayValue);\n case GL.FLOAT_MAT3: return gl.uniformMatrix3fv(location, false, arrayValue);\n case GL.FLOAT_MAT4: return gl.uniformMatrix4fv(location, false, arrayValue);\n\n // WebGL2 - rectangular matrices\n case GL.FLOAT_MAT2x3: return gl2.uniformMatrix2x3fv(location, false, arrayValue);\n case GL.FLOAT_MAT2x4: return gl2.uniformMatrix2x4fv(location, false, arrayValue);\n case GL.FLOAT_MAT3x2: return gl2.uniformMatrix3x2fv(location, false, arrayValue);\n case GL.FLOAT_MAT3x4: return gl2.uniformMatrix3x4fv(location, false, arrayValue);\n case GL.FLOAT_MAT4x2: return gl2.uniformMatrix4x2fv(location, false, arrayValue);\n case GL.FLOAT_MAT4x3: return gl2.uniformMatrix4x3fv(location, false, arrayValue);\n }\n\n throw new Error('Illegal uniform');\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {UniformValue, Binding} from '@luma.gl/core';\nimport {isNumericArray} from '@math.gl/types';\n\nexport function isUniformValue(value: unknown): value is UniformValue {\n return isNumericArray(value) !== null || typeof value === 'number' || typeof value === 'boolean';\n}\n\ntype UniformsAndBindings = {\n bindings: Record<string, Binding>;\n uniforms: Record<string, UniformValue>;\n};\n\nexport function splitUniformsAndBindings(\n uniforms: Record<string, Binding | UniformValue>\n): UniformsAndBindings {\n const result: UniformsAndBindings = {bindings: {}, uniforms: {}};\n Object.keys(uniforms).forEach(name => {\n const uniform = uniforms[name];\n if (isUniformValue(uniform)) {\n result.uniforms[name] = uniform;\n } else {\n result.bindings[name] = uniform;\n }\n });\n\n return result;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {GL, GLPrimitiveTopology, GLPrimitive} from '@luma.gl/constants';\nimport {PrimitiveTopology} from '@luma.gl/core';\n\n// Counts the number of complete primitives given a number of vertices and a drawMode\nexport function getPrimitiveDrawMode(drawMode: GLPrimitiveTopology): GLPrimitive {\n switch (drawMode) {\n case GL.POINTS:\n return GL.POINTS;\n case GL.LINES:\n return GL.LINES;\n case GL.LINE_STRIP:\n return GL.LINES;\n case GL.LINE_LOOP:\n return GL.LINES;\n case GL.TRIANGLES:\n return GL.TRIANGLES;\n case GL.TRIANGLE_STRIP:\n return GL.TRIANGLES;\n case GL.TRIANGLE_FAN:\n return GL.TRIANGLES;\n default:\n throw new Error('drawMode');\n }\n}\n\n// Counts the number of complete \"primitives\" given a number of vertices and a drawMode\nexport function getPrimitiveCount(options: {\n drawMode: GLPrimitiveTopology;\n vertexCount: number;\n}): number {\n const {drawMode, vertexCount} = options;\n switch (drawMode) {\n case GL.POINTS:\n case GL.LINE_LOOP:\n return vertexCount;\n case GL.LINES:\n return vertexCount / 2;\n case GL.LINE_STRIP:\n return vertexCount - 1;\n case GL.TRIANGLES:\n return vertexCount / 3;\n case GL.TRIANGLE_STRIP:\n case GL.TRIANGLE_FAN:\n return vertexCount - 2;\n default:\n throw new Error('drawMode');\n }\n}\n\n// Counts the number of vertices after splitting the vertex stream into separate \"primitives\"\nexport function getVertexCount(options: {\n drawMode: GLPrimitiveTopology;\n vertexCount: number;\n}): number {\n const {drawMode, vertexCount} = options;\n const primitiveCount = getPrimitiveCount({drawMode, vertexCount});\n switch (getPrimitiveDrawMode(drawMode)) {\n case GL.POINTS:\n return primitiveCount;\n case GL.LINES:\n return primitiveCount * 2;\n case GL.TRIANGLES:\n return primitiveCount * 3;\n default:\n throw new Error('drawMode');\n }\n}\n\n/** Get the primitive type for draw */\nexport function 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 'triangle-list': return GL.TRIANGLES;\n case 'triangle-strip': return GL.TRIANGLE_STRIP;\n default: throw new Error(topology);\n }\n}\n\n/** Get the primitive type for transform feedback */\nexport function 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 'triangle-list': return GL.TRIANGLES;\n case 'triangle-strip': return GL.TRIANGLES;\n default: throw new Error(topology);\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {CommandEncoder, CommandEncoderProps} from '@luma.gl/core';\nimport type {\n CopyBufferToBufferOptions,\n CopyBufferToTextureOptions,\n CopyTextureToBufferOptions,\n CopyTextureToTextureOptions,\n // ClearTextureOptions,\n // ReadTextureOptions,\n QuerySet,\n Buffer\n} from '@luma.gl/core';\n\nimport {WEBGLCommandBuffer} from './webgl-command-buffer';\nimport {WebGLDevice} from '../webgl-device';\n\nexport class WEBGLCommandEncoder extends CommandEncoder {\n readonly device: WebGLDevice;\n\n readonly commandBuffer: WEBGLCommandBuffer;\n\n constructor(device: WebGLDevice, props: CommandEncoderProps) {\n super(device, props);\n this.device = device;\n this.commandBuffer = new WEBGLCommandBuffer(device);\n }\n\n override destroy(): void {}\n\n override finish(): void {\n this.commandBuffer.submitCommands();\n }\n\n // beginRenderPass(GPURenderPassDescriptor descriptor): GPURenderPassEncoder;\n // beginComputePass(optional GPUComputePassDescriptor descriptor = {}): GPUComputePassEncoder;\n // finish(options?: {id?: string}): GPUCommandBuffer;\n\n copyBufferToBuffer(options: CopyBufferToBufferOptions): void {\n this.commandBuffer.commands.push({name: 'copy-buffer-to-buffer', options});\n }\n\n copyBufferToTexture(options: CopyBufferToTextureOptions) {\n this.commandBuffer.commands.push({name: 'copy-buffer-to-texture', options});\n }\n\n copyTextureToBuffer(options: CopyTextureToBufferOptions): void {\n this.commandBuffer.commands.push({name: 'copy-texture-to-buffer', options});\n }\n\n copyTextureToTexture(options: CopyTextureToTextureOptions): void {\n this.commandBuffer.commands.push({name: 'copy-texture-to-texture', options});\n }\n\n // clearTexture(options: ClearTextureOptions): void {\n // this.commandBuffer.commands.push({name: 'copy-texture-to-texture', options});\n // }\n\n override pushDebugGroup(groupLabel: string): void {}\n override popDebugGroup() {}\n\n override insertDebugMarker(markerLabel: string): void {}\n\n override resolveQuerySet(\n querySet: QuerySet,\n destination: Buffer,\n options?: {\n firstQuery?: number;\n queryCount?: number;\n destinationOffset?: number;\n }\n ): void {}\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {\n CopyBufferToBufferOptions,\n CopyBufferToTextureOptions,\n CopyTextureToBufferOptions,\n CopyTextureToTextureOptions\n // ClearTextureOptions,\n // ReadTextureOptions\n} from '@luma.gl/core';\nimport {CommandBuffer, Texture, Framebuffer} from '@luma.gl/core';\nimport {\n GL,\n GLTextureTarget,\n GLTextureCubeMapTarget\n // GLTexelDataFormat,\n // GLPixelType,\n // GLDataType\n} from '@luma.gl/constants';\n\nimport {WebGLDevice} from '../webgl-device';\nimport {WEBGLBuffer} from './webgl-buffer';\nimport {WEBGLTexture} from './webgl-texture';\nimport {WEBGLFramebuffer} from './webgl-framebuffer';\nimport {getTextureFormatWebGL} from '../converters/webgl-texture-table';\n\ntype CopyBufferToBufferCommand = {\n name: 'copy-buffer-to-buffer';\n options: CopyBufferToBufferOptions;\n};\n\ntype CopyBufferToTextureCommand = {\n name: 'copy-buffer-to-texture';\n options: CopyBufferToTextureOptions;\n};\n\ntype CopyTextureToBufferCommand = {\n name: 'copy-texture-to-buffer';\n options: CopyTextureToBufferOptions;\n};\n\ntype CopyTextureToTextureCommand = {\n name: 'copy-texture-to-texture';\n options: CopyTextureToTextureOptions;\n};\n\ntype ClearTextureCommand = {\n name: 'clear-texture';\n options: {}; // ClearTextureOptions;\n};\n\ntype ReadTextureCommand = {\n name: 'read-texture';\n options: {}; // ReadTextureOptions;\n};\n\ntype Command =\n | CopyBufferToBufferCommand\n | CopyBufferToTextureCommand\n | CopyTextureToBufferCommand\n | CopyTextureToTextureCommand\n | ClearTextureCommand\n | ReadTextureCommand;\n\nexport class WEBGLCommandBuffer extends CommandBuffer {\n device: WebGLDevice;\n commands: Command[] = [];\n\n constructor(device: WebGLDevice) {\n super(device, {});\n this.device = device;\n }\n\n submitCommands(commands: Command[] = this.commands) {\n for (const command of commands) {\n switch (command.name) {\n case 'copy-buffer-to-buffer':\n _copyBufferToBuffer(this.device, command.options);\n break;\n case 'copy-buffer-to-texture':\n _copyBufferToTexture(this.device, command.options);\n break;\n case 'copy-texture-to-buffer':\n _copyTextureToBuffer(this.device, command.options);\n break;\n case 'copy-texture-to-texture':\n _copyTextureToTexture(this.device, command.options);\n break;\n // case 'clear-texture':\n // _clearTexture(this.device, command.options);\n // break;\n default:\n throw new Error(command.name);\n }\n }\n }\n}\n\nfunction _copyBufferToBuffer(device: WebGLDevice, options: CopyBufferToBufferOptions): void {\n const source = options.sourceBuffer as WEBGLBuffer;\n const destination = options.destinationBuffer as WEBGLBuffer;\n\n // {In WebGL2 we can p}erform the copy on the GPU\n // Use GL.COPY_READ_BUFFER+GL.COPY_WRITE_BUFFER avoid disturbing other targets and locking type\n device.gl.bindBuffer(GL.COPY_READ_BUFFER, source.handle);\n device.gl.bindBuffer(GL.COPY_WRITE_BUFFER, destination.handle);\n device.gl.copyBufferSubData(\n GL.COPY_READ_BUFFER,\n GL.COPY_WRITE_BUFFER,\n options.sourceOffset ?? 0,\n options.destinationOffset ?? 0,\n options.size\n );\n device.gl.bindBuffer(GL.COPY_READ_BUFFER, null);\n device.gl.bindBuffer(GL.COPY_WRITE_BUFFER, null);\n}\n\n/**\n * Copies data from a Buffer object into a Texture object\n * NOTE: doesn't wait for copy to be complete\n */\nfunction _copyBufferToTexture(device: WebGLDevice, options: CopyBufferToTextureOptions): void {\n throw new Error('Not implemented');\n}\n\n/**\n * Copies data from a Texture object into a Buffer object.\n * NOTE: doesn't wait for copy to be complete\n */\nfunction _copyTextureToBuffer(device: WebGLDevice, options: CopyTextureToBufferOptions): void {\n const {\n /** Texture to copy to/from. */\n sourceTexture,\n /** Mip-map level of the texture to copy to/from. (Default 0) */\n mipLevel = 0,\n /** Defines which aspects of the texture to copy to/from. */\n aspect = 'all',\n\n /** Width to copy */\n width = options.sourceTexture.width,\n /** Height to copy */\n height = options.sourceTexture.height,\n depthOrArrayLayers = 0,\n /** Defines the origin of the copy - the minimum corner of the texture sub-region to copy to/from. */\n origin = [0, 0],\n\n /** Destination buffer */\n destinationBuffer,\n /** Offset, in bytes, from the beginning of the buffer to the start of the image data (default 0) */\n byteOffset = 0,\n /**\n * The stride, in bytes, between the beginning of each block row and the subsequent block row.\n * Required if there are multiple block rows (i.e. the copy height or depth is more than one block).\n */\n bytesPerRow,\n /**\n * Number of block rows per single image of the texture.\n * rowsPerImage × bytesPerRow is the stride, in bytes, between the beginning of each image of data and the subsequent image.\n * Required if there are multiple images (i.e. the copy depth is more than one).\n */\n rowsPerImage\n } = options;\n\n // TODO - Not possible to read just stencil or depth part in WebGL?\n if (aspect !== 'all') {\n throw new Error('aspect not supported in WebGL');\n }\n\n // TODO - mipLevels are set when attaching texture to framebuffer\n if (mipLevel !== 0 || depthOrArrayLayers !== 0 || bytesPerRow || rowsPerImage) {\n throw new Error('not implemented');\n }\n\n // Asynchronous read (PIXEL_PACK_BUFFER) is WebGL2 only feature\n const {framebuffer, destroyFramebuffer} = getFramebuffer(sourceTexture);\n let prevHandle: WebGLFramebuffer | null | undefined;\n try {\n const webglBuffer = destinationBuffer as WEBGLBuffer;\n const sourceWidth = width || framebuffer.width;\n const sourceHeight = height || framebuffer.height;\n const sourceParams = getTextureFormatWebGL(\n framebuffer.colorAttachments[0].texture.props.format\n );\n const sourceFormat = sourceParams.format;\n const sourceType = sourceParams.type;\n\n // if (!target) {\n // // Create new buffer with enough size\n // const components = glFormatToComponents(sourceFormat);\n // const byteCount = glTypeToBytes(sourceType);\n // const byteLength = byteOffset + sourceWidth * sourceHeight * components * byteCount;\n // target = device.createBuffer({byteLength});\n // }\n\n device.gl.bindBuffer(GL.PIXEL_PACK_BUFFER, webglBuffer.handle);\n // @ts-expect-error native bindFramebuffer is overridden by our state tracker\n prevHandle = device.gl.bindFramebuffer(GL.FRAMEBUFFER, framebuffer.handle);\n\n device.gl.readPixels(\n origin[0],\n origin[1],\n sourceWidth,\n sourceHeight,\n sourceFormat,\n sourceType,\n byteOffset\n );\n } finally {\n device.gl.bindBuffer(GL.PIXEL_PACK_BUFFER, null);\n // prevHandle may be unassigned if the try block failed before binding\n if (prevHandle !== undefined) {\n device.gl.bindFramebuffer(GL.FRAMEBUFFER, prevHandle);\n }\n\n if (destroyFramebuffer) {\n framebuffer.destroy();\n }\n }\n}\n\n/**\n * Copies data from a Framebuffer or a Texture object into a Buffer object.\n * NOTE: doesn't wait for copy to be complete, it programs GPU to perform a DMA transfer.\nexport function readPixelsToBuffer(\n source: Framebuffer | Texture,\n options?: {\n sourceX?: number;\n sourceY?: number;\n sourceFormat?: number;\n target?: Buffer; // A new Buffer object is created when not provided.\n targetByteOffset?: number; // byte offset in buffer object\n // following parameters are auto deduced if not provided\n sourceWidth?: number;\n sourceHeight?: number;\n sourceType?: number;\n }\n): Buffer\n */\n\n/**\n * Copy a rectangle from a Framebuffer or Texture object into a texture (at an offset)\n */\n// eslint-disable-next-line complexity, max-statements\nfunction _copyTextureToTexture(device: WebGLDevice, options: CopyTextureToTextureOptions): void {\n const {\n /** Texture to copy to/from. */\n sourceTexture,\n /** Mip-map level of the texture to copy to (Default 0) */\n destinationMipLevel = 0,\n /** Defines which aspects of the texture to copy to/from. */\n // aspect = 'all',\n /** Defines the origin of the copy - the minimum corner of the texture sub-region to copy from. */\n origin = [0, 0],\n\n /** Defines the origin of the copy - the minimum corner of the texture sub-region to copy to. */\n destinationOrigin = [0, 0],\n\n /** Texture to copy to/from. */\n destinationTexture\n /** Mip-map level of the texture to copy to/from. (Default 0) */\n // destinationMipLevel = options.mipLevel,\n /** Defines the origin of the copy - the minimum corner of the texture sub-region to copy to/from. */\n // destinationOrigin = [0, 0],\n /** Defines which aspects of the texture to copy to/from. */\n // destinationAspect = options.aspect,\n } = options;\n\n let {\n width = options.destinationTexture.width,\n height = options.destinationTexture.height\n // depthOrArrayLayers = 0\n } = options;\n\n const {framebuffer, destroyFramebuffer} = getFramebuffer(sourceTexture);\n const [sourceX, sourceY] = origin;\n const [destinationX, destinationY, destinationZ] = destinationOrigin;\n\n // @ts-expect-error native bindFramebuffer is overridden by our state tracker\n const prevHandle: WebGLFramebuffer | null = device.gl.bindFramebuffer(\n GL.FRAMEBUFFER,\n framebuffer.handle\n );\n // TODO - support gl.readBuffer (WebGL2 only)\n // const prevBuffer = gl.readBuffer(attachment);\n\n let texture: WEBGLTexture = null;\n let textureTarget: GL;\n if (destinationTexture instanceof WEBGLTexture) {\n texture = destinationTexture;\n width = Number.isFinite(width) ? width : texture.width;\n height = Number.isFinite(height) ? height : texture.height;\n texture.bind(0);\n textureTarget = texture.glTarget;\n } else {\n throw new Error('invalid destination');\n }\n\n switch (textureTarget) {\n case GL.TEXTURE_2D:\n case GL.TEXTURE_CUBE_MAP:\n device.gl.copyTexSubImage2D(\n textureTarget,\n destinationMipLevel,\n destinationX,\n destinationY,\n sourceX,\n sourceY,\n width,\n height\n );\n break;\n case GL.TEXTURE_2D_ARRAY:\n case GL.TEXTURE_3D:\n device.gl.copyTexSubImage3D(\n textureTarget,\n destinationMipLevel,\n destinationX,\n destinationY,\n destinationZ,\n sourceX,\n sourceY,\n width,\n height\n );\n break;\n default:\n }\n\n if (texture) {\n texture.unbind();\n }\n device.gl.bindFramebuffer(GL.FRAMEBUFFER, prevHandle);\n if (destroyFramebuffer) {\n framebuffer.destroy();\n }\n}\n\n/** Clear one mip level of a texture *\nfunction _clearTexture(device: WebGLDevice, options: ClearTextureOptions) {\n const BORDER = 0;\n const {dimension, width, height, depth = 0, mipLevel = 0} = options;\n const {glInternalFormat, glFormat, glType, compressed} = options;\n const glTarget = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);\n\n switch (dimension) {\n case '2d-array':\n case '3d':\n if (compressed) {\n // prettier-ignore\n device.gl.compressedTexImage3D(glTarget, mipLevel, glInternalFormat, width, height, depth, BORDER, null);\n } else {\n // prettier-ignore\n device.gl.texImage3D( glTarget, mipLevel, glInternalFormat, width, height, depth, BORDER, glFormat, glType, null);\n }\n break;\n\n case '2d':\n case 'cube':\n if (compressed) {\n // prettier-ignore\n device.gl.compressedTexImage2D(glTarget, mipLevel, glInternalFormat, width, height, BORDER, null);\n } else {\n // prettier-ignore\n device.gl.texImage2D(glTarget, mipLevel, glInternalFormat, width, height, BORDER, glFormat, glType, null);\n }\n break;\n\n default:\n throw new Error(dimension);\n }\n}\n */\n\n// function _readTexture(device: WebGLDevice, options: CopyTextureToBufferOptions) {}\n\n// HELPERS\n\n/**\n * In WebGL, cube maps specify faces by overriding target instead of using the depth parameter.\n * @note We still bind the texture using GL.TEXTURE_CUBE_MAP, but we need to use the face-specific target when setting mip levels.\n * @returns glTarget unchanged, if dimension !== 'cube'.\n */\nexport function getWebGLCubeFaceTarget(\n glTarget: GLTextureTarget,\n dimension: '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d',\n level: number\n): GLTextureTarget | GLTextureCubeMapTarget {\n return dimension === 'cube' ? GL.TEXTURE_CUBE_MAP_POSITIVE_X + level : glTarget;\n}\n\n/** Wrap a texture in a framebuffer so that we can use WebGL APIs that work on framebuffers */\nfunction getFramebuffer(source: Texture | Framebuffer): {\n framebuffer: WEBGLFramebuffer;\n destroyFramebuffer: boolean;\n} {\n if (source instanceof Texture) {\n const {width, height, id} = source;\n const framebuffer = source.device.createFramebuffer({\n id: `framebuffer-for-${id}`,\n width,\n height,\n colorAttachments: [source]\n }) as unknown as WEBGLFramebuffer;\n\n return {framebuffer, destroyFramebuffer: true};\n }\n return {framebuffer: source as unknown as WEBGLFramebuffer, destroyFramebuffer: false};\n}\n\n/**\n * Returns number of components in a specific readPixels WebGL format\n * @todo use shadertypes utils instead?\n */\nexport function glFormatToComponents(format): 1 | 2 | 3 | 4 {\n switch (format) {\n case GL.ALPHA:\n case GL.R32F:\n case GL.RED:\n return 1;\n case GL.RG32F:\n case GL.RG:\n return 2;\n case GL.RGB:\n case GL.RGB32F:\n return 3;\n case GL.RGBA:\n case GL.RGBA32F:\n return 4;\n // TODO: Add support for additional WebGL2 formats\n default:\n throw new Error('GLFormat');\n }\n}\n\n/**\n * Return byte count for given readPixels WebGL type\n * @todo use shadertypes utils instead?\n */\nexport function glTypeToBytes(type: GL): 1 | 2 | 4 {\n switch (type) {\n case GL.UNSIGNED_BYTE:\n return 1;\n case GL.UNSIGNED_SHORT_5_6_5:\n case GL.UNSIGNED_SHORT_4_4_4_4:\n case GL.UNSIGNED_SHORT_5_5_5_1:\n return 2;\n case GL.FLOAT:\n return 4;\n // TODO: Add support for additional WebGL2 types\n default:\n throw new Error('GLType');\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {TypedArray, NumericArray} from '@math.gl/types';\nimport type {Device, Buffer, VertexArrayProps} from '@luma.gl/core';\nimport {VertexArray, getScratchArray} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\nimport {getBrowser} from '@probe.gl/env';\n\nimport {WebGLDevice} from '../webgl-device';\nimport {WEBGLBuffer} from '../resources/webgl-buffer';\n\nimport {getGLFromVertexType} from '../converters/vertex-formats';\nimport {fillArray} from '../../utils/fill-array';\n\n/** VertexArrayObject wrapper */\nexport class WEBGLVertexArray extends VertexArray {\n override get [Symbol.toStringTag](): string {\n return 'VertexArray';\n }\n\n readonly device: WebGLDevice;\n readonly handle: WebGLVertexArrayObject;\n\n /** Attribute 0 buffer constant */\n private buffer: WEBGLBuffer | null = null;\n private bufferValue = null;\n\n /** * Attribute 0 can not be disable on most desktop OpenGL based browsers */\n static isConstantAttributeZeroSupported(device: Device): boolean {\n return getBrowser() === 'Chrome';\n }\n\n // Create a VertexArray\n constructor(device: WebGLDevice, props: VertexArrayProps) {\n super(device, props);\n this.device = device;\n this.handle = this.device.gl.createVertexArray()!;\n }\n\n override destroy(): void {\n super.destroy();\n if (this.buffer) {\n this.buffer?.destroy();\n }\n if (this.handle) {\n this.device.gl.deleteVertexArray(this.handle);\n // @ts-expect-error read-only/undefined\n this.handle = undefined!;\n }\n\n // Auto-delete elements?\n // return [this.elements];\n }\n\n /**\n // Set (bind/unbind) an elements buffer, for indexed rendering.\n // Must be a Buffer bound to GL.ELEMENT_ARRAY_BUFFER or null. Constants not supported\n *\n * @param elementBuffer\n */\n setIndexBuffer(indexBuffer: Buffer | null): void {\n const buffer = indexBuffer as WEBGLBuffer;\n // Explicitly allow `null` to support clearing the index buffer\n if (buffer && buffer.glTarget !== GL.ELEMENT_ARRAY_BUFFER) {\n throw new Error('Use .setBuffer()');\n }\n // In WebGL The GL.ELEMENT_ARRAY_BUFFER_BINDING is stored on the VertexArrayObject\n this.device.gl.bindVertexArray(this.handle);\n this.device.gl.bindBuffer(GL.ELEMENT_ARRAY_BUFFER, buffer ? buffer.handle : null);\n\n this.indexBuffer = buffer;\n\n // Unbind to prevent unintended changes to the VAO.\n this.device.gl.bindVertexArray(null);\n }\n\n /** Set a location in vertex attributes array to a buffer, enables the location, sets divisor */\n setBuffer(location: number, attributeBuffer: Buffer): void {\n const buffer = attributeBuffer as WEBGLBuffer;\n // Sanity check target\n if (buffer.glTarget === GL.ELEMENT_ARRAY_BUFFER) {\n throw new Error('Use .setIndexBuffer()');\n }\n\n const {size, type, stride, offset, normalized, integer, divisor} = this._getAccessor(location);\n\n this.device.gl.bindVertexArray(this.handle);\n // A non-zero buffer object must be bound to the GL_ARRAY_BUFFER target\n this.device.gl.bindBuffer(GL.ARRAY_BUFFER, buffer.handle);\n\n // WebGL2 supports *integer* data formats, i.e. GPU will see integer values\n if (integer) {\n this.device.gl.vertexAttribIPointer(location, size, type, stride, offset);\n } else {\n // Attaches ARRAY_BUFFER with specified buffer format to location\n this.device.gl.vertexAttribPointer(location, size, type, normalized, stride, offset);\n }\n // Clear binding - keeping it may cause [.WebGL-0x12804417100]\n // GL_INVALID_OPERATION: A transform feedback buffer that would be written to is also bound to a non-transform-feedback target\n this.device.gl.bindBuffer(GL.ARRAY_BUFFER, null);\n\n // Mark as non-constant\n this.device.gl.enableVertexAttribArray(location);\n // Set the step mode 0=vertex, 1=instance\n this.device.gl.vertexAttribDivisor(location, divisor || 0);\n\n this.attributes[location] = buffer;\n\n // Unbind to prevent unintended changes to the VAO.\n this.device.gl.bindVertexArray(null);\n }\n\n /** Set a location in vertex attributes array to a constant value, disables the location */\n override setConstantWebGL(location: number, value: TypedArray): void {\n this._enable(location, false);\n this.attributes[location] = value;\n }\n\n override bindBeforeRender(): void {\n this.device.gl.bindVertexArray(this.handle);\n this._applyConstantAttributes();\n }\n\n override unbindAfterRender(): void {\n // Unbind to prevent unintended changes to the VAO.\n this.device.gl.bindVertexArray(null);\n }\n\n // Internal methods\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 protected _applyConstantAttributes(): void {\n for (let location = 0; location < this.maxVertexAttributes; ++location) {\n const constant = this.attributes[location];\n // A typed array means this is a constant\n if (ArrayBuffer.isView(constant)) {\n this.device.setConstantAttributeWebGL(location, constant);\n }\n }\n }\n\n /**\n * Set a location in vertex attributes array to a buffer, enables the location, sets divisor\n * @note requires vertex array to be bound\n */\n // protected _setAttributeLayout(location: number): void {\n // const {size, type, stride, offset, normalized, integer, divisor} = this._getAccessor(location);\n\n // // WebGL2 supports *integer* data formats, i.e. GPU will see integer values\n // if (integer) {\n // this.device.gl.vertexAttribIPointer(location, size, type, stride, offset);\n // } else {\n // // Attaches ARRAY_BUFFER with specified buffer format to location\n // this.device.gl.vertexAttribPointer(location, size, type, normalized, stride, offset);\n // }\n // this.device.gl.vertexAttribDivisor(location, divisor || 0);\n // }\n\n /** Get an accessor from the */\n protected _getAccessor(location: number) {\n const attributeInfo = this.attributeInfos[location];\n if (!attributeInfo) {\n throw new Error(`Unknown attribute location ${location}`);\n }\n const glType = getGLFromVertexType(attributeInfo.bufferDataType);\n return {\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 }\n\n /**\n * Enabling an attribute location makes it reference the currently bound buffer\n * Disabling an attribute location makes it reference the global constant value\n * TODO - handle single values for size 1 attributes?\n * TODO - convert classic arrays based on known type?\n */\n protected _enable(location: number, enable = true): void {\n // Attribute 0 cannot be disabled in most desktop OpenGL based browsers...\n const canDisableAttributeZero = WEBGLVertexArray.isConstantAttributeZeroSupported(this.device);\n const canDisableAttribute = canDisableAttributeZero || location !== 0;\n\n if (enable || canDisableAttribute) {\n location = Number(location);\n this.device.gl.bindVertexArray(this.handle);\n if (enable) {\n this.device.gl.enableVertexAttribArray(location);\n } else {\n this.device.gl.disableVertexAttribArray(location);\n }\n this.device.gl.bindVertexArray(null);\n }\n }\n\n /**\n * Provide a means to create a buffer that is equivalent to a constant.\n * NOTE: Desktop OpenGL cannot disable attribute 0.\n * https://stackoverflow.com/questions/20305231/webgl-warning-attribute-0-is-disabled-\n * this-has-significant-performance-penalty\n */\n getConstantBuffer(elementCount: number, value: TypedArray): Buffer {\n // Create buffer only when needed, and reuse it (avoids inflating buffer creation statistics)\n\n const constantValue = normalizeConstantArrayValue(value);\n\n const byteLength = constantValue.byteLength * elementCount;\n const length = constantValue.length * elementCount;\n\n if (this.buffer && byteLength !== this.buffer.byteLength) {\n throw new Error(\n `Buffer size is immutable, byte length ${byteLength} !== ${this.buffer.byteLength}.`\n );\n }\n let updateNeeded = !this.buffer;\n\n this.buffer = this.buffer || this.device.createBuffer({byteLength});\n\n // Reallocate and update contents if needed\n updateNeeded = updateNeeded || !compareConstantArrayValues(constantValue, this.bufferValue);\n\n if (updateNeeded) {\n // Create a typed array that is big enough, and fill it with the required data\n const typedArray = getScratchArray(value.constructor, length);\n fillArray({target: typedArray, source: constantValue, start: 0, count: length});\n this.buffer.write(typedArray);\n this.bufferValue = value;\n }\n\n return this.buffer;\n }\n}\n\n// HELPER FUNCTIONS\n\n/**\n * TODO - convert Arrays based on known type? (read type from accessor, don't assume Float32Array)\n * TODO - handle single values for size 1 attributes?\n */\nfunction normalizeConstantArrayValue(arrayValue: NumericArray) {\n if (Array.isArray(arrayValue)) {\n return new Float32Array(arrayValue);\n }\n return arrayValue;\n}\n\n/**\n *\n */\nfunction compareConstantArrayValues(v1: NumericArray, v2: NumericArray): boolean {\n if (!v1 || !v2 || v1.length !== v2.length || v1.constructor !== v2.constructor) {\n return false;\n }\n for (let i = 0; i < v1.length; ++i) {\n if (v1[i] !== v2[i]) {\n return false;\n }\n }\n return true;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {NumericArray} from '@math.gl/types';\n\n// Uses copyWithin to significantly speed up typed array value filling\nexport function fillArray(options: {\n target: NumericArray;\n source: NumericArray;\n start?: number;\n count?: number;\n}): NumericArray {\n const {target, source, start = 0, count = 1} = options;\n const length = source.length;\n const total = count * length;\n let copied = 0;\n for (let i = start; copied < length; copied++) {\n target[i++] = source[copied];\n }\n\n while (copied < total) {\n // If we have copied less than half, copy everything we got\n // else copy remaining in one operation\n if (copied < total - copied) {\n target.copyWithin(start + copied, start, start + copied);\n copied *= 2;\n } else {\n target.copyWithin(start + copied, start, start + total - copied);\n copied = total;\n }\n }\n\n return options.target;\n}\n", "import type {PrimitiveTopology, ShaderLayout, TransformFeedbackProps} from '@luma.gl/core';\nimport {log, TransformFeedback, Buffer, BufferRange} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\nimport {WebGLDevice} from '../webgl-device';\nimport {WEBGLBuffer} from '../../index';\nimport {getGLPrimitive} from '../helpers/webgl-topology-utils';\n\nexport class WEBGLTransformFeedback extends TransformFeedback {\n readonly device: WebGLDevice;\n readonly gl: WebGL2RenderingContext;\n readonly handle: WebGLTransformFeedback;\n\n /**\n * NOTE: The Model already has this information while drawing, but\n * TransformFeedback currently needs it internally, to look up\n * varying information outside of a draw() call.\n */\n readonly layout: ShaderLayout;\n buffers: Record<string, BufferRange> = {};\n unusedBuffers: Record<string, Buffer> = {};\n /**\n * Allows us to avoid a Chrome bug where a buffer that is already bound to a\n * different target cannot be bound to 'TRANSFORM_FEEDBACK_BUFFER' target.\n * This a major workaround, see: https://github.com/KhronosGroup/WebGL/issues/2346\n */\n bindOnUse = true;\n private _bound: boolean = false;\n\n constructor(device: WebGLDevice, props: TransformFeedbackProps) {\n super(device, props);\n\n this.device = device;\n this.gl = device.gl;\n this.handle = this.props.handle || this.gl.createTransformFeedback();\n this.layout = this.props.layout;\n\n if (props.buffers) {\n this.setBuffers(props.buffers);\n }\n\n Object.seal(this);\n }\n\n override destroy(): void {\n this.gl.deleteTransformFeedback(this.handle);\n super.destroy();\n }\n\n begin(topology: PrimitiveTopology = 'point-list'): void {\n this.gl.bindTransformFeedback(GL.TRANSFORM_FEEDBACK, this.handle);\n if (this.bindOnUse) {\n this._bindBuffers();\n }\n this.gl.beginTransformFeedback(getGLPrimitive(topology));\n }\n\n end(): void {\n this.gl.endTransformFeedback();\n if (this.bindOnUse) {\n this._unbindBuffers();\n }\n this.gl.bindTransformFeedback(GL.TRANSFORM_FEEDBACK, null);\n }\n\n // SUBCLASS\n\n setBuffers(buffers: Record<string, Buffer | BufferRange>): void {\n this.buffers = {};\n this.unusedBuffers = {};\n\n this.bind(() => {\n for (const bufferName in buffers) {\n this.setBuffer(bufferName, buffers[bufferName]);\n }\n });\n }\n\n setBuffer(locationOrName: string | number, bufferOrRange: Buffer | BufferRange): void {\n const location = this._getVaryingIndex(locationOrName);\n const {buffer, byteLength, byteOffset} = this._getBufferRange(bufferOrRange);\n\n if (location < 0) {\n this.unusedBuffers[locationOrName] = buffer;\n log.warn(`${this.id} unusedBuffers varying buffer ${locationOrName}`)();\n return;\n }\n\n this.buffers[location] = {buffer, byteLength, byteOffset};\n\n // Need to avoid chrome bug where buffer that is already bound to a different target\n // cannot be bound to 'TRANSFORM_FEEDBACK_BUFFER' target.\n if (!this.bindOnUse) {\n this._bindBuffer(location, buffer, byteOffset, byteLength);\n }\n }\n\n getBuffer(locationOrName: string | number): Buffer | BufferRange | null {\n if (isIndex(locationOrName)) {\n return this.buffers[locationOrName] || null;\n }\n const location = this._getVaryingIndex(locationOrName);\n return location >= 0 ? this.buffers[location] : null;\n }\n\n bind(funcOrHandle = this.handle) {\n if (typeof funcOrHandle !== 'function') {\n this.gl.bindTransformFeedback(GL.TRANSFORM_FEEDBACK, funcOrHandle);\n return this;\n }\n\n let value: unknown;\n\n if (!this._bound) {\n this.gl.bindTransformFeedback(GL.TRANSFORM_FEEDBACK, this.handle);\n this._bound = true;\n value = funcOrHandle();\n this._bound = false;\n this.gl.bindTransformFeedback(GL.TRANSFORM_FEEDBACK, null);\n } else {\n value = funcOrHandle();\n }\n\n return value;\n }\n\n unbind() {\n this.bind(null);\n }\n\n // PRIVATE METHODS\n\n /** Extract offsets for bindBufferRange */\n protected _getBufferRange(\n bufferOrRange: Buffer | {buffer: Buffer; byteOffset?: number; byteLength?: number}\n ): Required<BufferRange> {\n if (bufferOrRange instanceof WEBGLBuffer) {\n return {buffer: bufferOrRange, byteOffset: 0, byteLength: bufferOrRange.byteLength};\n }\n\n // To use bindBufferRange either offset or size must be specified.\n // @ts-expect-error Must be a BufferRange.\n const {buffer, byteOffset = 0, byteLength = bufferOrRange.buffer.byteLength} = bufferOrRange;\n return {buffer, byteOffset, byteLength};\n }\n\n protected _getVaryingIndex(locationOrName: string | number): number {\n if (isIndex(locationOrName)) {\n return Number(locationOrName);\n }\n\n for (const varying of this.layout.varyings) {\n if (locationOrName === varying.name) {\n return varying.location;\n }\n }\n\n return -1;\n }\n\n /**\n * Need to avoid chrome bug where buffer that is already bound to a different target\n * cannot be bound to 'TRANSFORM_FEEDBACK_BUFFER' target.\n */\n protected _bindBuffers(): void {\n for (const bufferIndex in this.buffers) {\n const {buffer, byteLength, byteOffset} = this._getBufferRange(this.buffers[bufferIndex]);\n this._bindBuffer(Number(bufferIndex), buffer, byteOffset, byteLength);\n }\n }\n\n protected _unbindBuffers(): void {\n for (const bufferIndex in this.buffers) {\n this.gl.bindBufferBase(GL.TRANSFORM_FEEDBACK_BUFFER, Number(bufferIndex), null);\n }\n }\n\n protected _bindBuffer(index: number, buffer: Buffer, byteOffset = 0, byteLength?: number): void {\n const handle = buffer && (buffer as WEBGLBuffer).handle;\n if (!handle || byteLength === undefined) {\n this.gl.bindBufferBase(GL.TRANSFORM_FEEDBACK_BUFFER, index, handle);\n } else {\n this.gl.bindBufferRange(GL.TRANSFORM_FEEDBACK_BUFFER, index, handle, byteOffset, byteLength);\n }\n }\n}\n\n/**\n * Returns true if the given value is an integer, or a string that\n * trivially converts to an integer (only numeric characters).\n */\nfunction isIndex(value: string | number): boolean {\n if (typeof value === 'number') {\n return Number.isInteger(value);\n }\n return /^\\d+$/.test(value);\n}\n", "// WebGL2 Query (also handles disjoint timer extensions)\nimport {QuerySet, QuerySetProps} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\nimport {WebGLDevice} from '../webgl-device';\n\n/**\n * Asynchronous queries for different kinds of information\n */\nexport class WEBGLQuerySet extends QuerySet {\n device: WebGLDevice;\n handle: WebGLQuery;\n\n target: number | null = null;\n _queryPending = false;\n _pollingPromise: Promise<any> | null = null;\n\n override get [Symbol.toStringTag](): string {\n return 'Query';\n }\n\n // Create a query class\n constructor(device: WebGLDevice, props: QuerySetProps) {\n super(device, props);\n this.device = device;\n\n if (props.count > 1) {\n throw new Error('WebGL QuerySet can only have one value');\n }\n\n this.handle = this.device.gl.createQuery();\n Object.seal(this);\n }\n\n override destroy() {\n this.device.gl.deleteQuery(this.handle);\n }\n\n // FOR RENDER PASS AND COMMAND ENCODER\n\n /**\n * Shortcut for timer query (dependent on extension in both WebGL1 and 2)\n * Measures GPU time delta between this call and a matching `end` call in the\n * GPU instruction stream.\n */\n beginTimestampQuery(): void {\n return this._begin(GL.TIME_ELAPSED_EXT);\n }\n\n endTimestampQuery(): void {\n this._end();\n }\n\n // Shortcut for occlusion queries\n beginOcclusionQuery(options?: {conservative?: boolean}): void {\n return this._begin(\n options?.conservative ? GL.ANY_SAMPLES_PASSED_CONSERVATIVE : GL.ANY_SAMPLES_PASSED\n );\n }\n\n endOcclusionQuery() {\n this._end();\n }\n\n // Shortcut for transformFeedbackQuery\n beginTransformFeedbackQuery(): void {\n return this._begin(GL.TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);\n }\n\n endTransformFeedbackQuery(): void {\n this._end();\n }\n\n async resolveQuery(): Promise<bigint[]> {\n const value = await this.pollQuery();\n return [value];\n }\n\n // PRIVATE METHODS\n\n /**\n * Due to OpenGL API limitations, after calling `begin()` on one Query\n * instance, `end()` must be called on that same instance before\n * calling `begin()` on another query. While there can be multiple\n * outstanding queries representing disjoint `begin()`/`end()` intervals.\n * It is not possible to interleave or overlap `begin` and `end` calls.\n */\n protected _begin(target: number): void {\n // Don't start a new query if one is already active.\n if (this._queryPending) {\n return;\n }\n\n this.target = target;\n this.device.gl.beginQuery(this.target, this.handle);\n\n return;\n }\n\n // ends the current query\n protected _end(): void {\n // Can't end a new query if the last one hasn't been resolved.\n if (this._queryPending) {\n return;\n }\n\n if (this.target) {\n this.device.gl.endQuery(this.target);\n this.target = null;\n this._queryPending = true;\n }\n return;\n }\n\n // Returns true if the query result is available\n isResultAvailable(): boolean {\n if (!this._queryPending) {\n return false;\n }\n\n const resultAvailable = this.device.gl.getQueryParameter(\n this.handle,\n GL.QUERY_RESULT_AVAILABLE\n );\n if (resultAvailable) {\n this._queryPending = false;\n }\n return resultAvailable;\n }\n\n // Timing query is disjoint, i.e. results are invalid\n isTimerDisjoint(): boolean {\n return this.device.gl.getParameter(GL.GPU_DISJOINT_EXT);\n }\n\n // Returns query result.\n getResult(): any {\n return this.device.gl.getQueryParameter(this.handle, GL.QUERY_RESULT);\n }\n\n // Returns the query result, converted to milliseconds to match JavaScript conventions.\n getTimerMilliseconds() {\n return this.getResult() / 1e6;\n }\n\n // Polls the query\n pollQuery(limit: number = Number.POSITIVE_INFINITY): Promise<any> {\n if (this._pollingPromise) {\n return this._pollingPromise;\n }\n\n let counter = 0;\n\n this._pollingPromise = new Promise((resolve, reject) => {\n const poll = () => {\n if (this.isResultAvailable()) {\n resolve(this.getResult());\n this._pollingPromise = null;\n } else if (counter++ > limit) {\n reject('Timed out');\n this._pollingPromise = null;\n } else {\n requestAnimationFrame(poll);\n }\n };\n\n requestAnimationFrame(poll);\n });\n\n return this._pollingPromise;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Goal is to make WebGL2 contexts look like WebGL1\n// @note Partly inspired by with some older code from the `regl` library\n\n/* eslint-disable camelcase */\n\nimport {GL} from '@luma.gl/constants';\n\n// webgl1 extensions natively supported by webgl2\nconst WEBGL1_STATIC_EXTENSIONS = {\n WEBGL_depth_texture: {\n UNSIGNED_INT_24_8_WEBGL: GL.UNSIGNED_INT_24_8\n } as const satisfies WEBGL_depth_texture,\n OES_element_index_uint: {} as const satisfies OES_element_index_uint,\n OES_texture_float: {} as const satisfies OES_texture_float,\n OES_texture_half_float: {\n // @ts-expect-error different numbers?\n HALF_FLOAT_OES: GL.HALF_FLOAT\n } as const satisfies OES_texture_half_float,\n EXT_color_buffer_float: {} as const satisfies EXT_color_buffer_float,\n OES_standard_derivatives: {\n FRAGMENT_SHADER_DERIVATIVE_HINT_OES: GL.FRAGMENT_SHADER_DERIVATIVE_HINT\n } as const satisfies OES_standard_derivatives,\n EXT_frag_depth: {} as const satisfies EXT_frag_depth,\n EXT_blend_minmax: {\n MIN_EXT: GL.MIN,\n MAX_EXT: GL.MAX\n } as const satisfies EXT_blend_minmax,\n EXT_shader_texture_lod: {} as const satisfies EXT_shader_texture_lod\n};\n\nconst getWEBGL_draw_buffers = (gl: WebGL2RenderingContext) =>\n ({\n drawBuffersWEBGL(buffers: number[]) {\n return gl.drawBuffers(buffers);\n },\n COLOR_ATTACHMENT0_WEBGL: GL.COLOR_ATTACHMENT0,\n COLOR_ATTACHMENT1_WEBGL: GL.COLOR_ATTACHMENT1,\n COLOR_ATTACHMENT2_WEBGL: GL.COLOR_ATTACHMENT2,\n COLOR_ATTACHMENT3_WEBGL: GL.COLOR_ATTACHMENT3\n }) as const satisfies Partial<WEBGL_draw_buffers>; // - too many fields\n\nconst getOES_vertex_array_object = (gl: WebGL2RenderingContext) =>\n ({\n VERTEX_ARRAY_BINDING_OES: GL.VERTEX_ARRAY_BINDING,\n createVertexArrayOES() {\n return gl.createVertexArray();\n },\n deleteVertexArrayOES(vertexArray: WebGLVertexArrayObject): void {\n return gl.deleteVertexArray(vertexArray);\n },\n isVertexArrayOES(vertexArray: WebGLVertexArrayObject): boolean {\n return gl.isVertexArray(vertexArray);\n },\n bindVertexArrayOES(vertexArray: WebGLVertexArrayObject): void {\n return gl.bindVertexArray(vertexArray);\n }\n }) as const satisfies OES_vertex_array_object;\n\nconst getANGLE_instanced_arrays = (gl: WebGL2RenderingContext) =>\n ({\n VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: 0x88fe,\n drawArraysInstancedANGLE(...args) {\n return gl.drawArraysInstanced(...args);\n },\n drawElementsInstancedANGLE(...args) {\n return gl.drawElementsInstanced(...args);\n },\n vertexAttribDivisorANGLE(...args) {\n return gl.vertexAttribDivisor(...args);\n }\n }) as const satisfies ANGLE_instanced_arrays;\n\n/**\n * Make browser return WebGL2 contexts even if WebGL1 contexts are requested\n * @param enforce\n * @returns\n */\nexport function enforceWebGL2(enforce: boolean = true): void {\n const prototype = HTMLCanvasElement.prototype as any;\n if (!enforce && prototype.originalGetContext) {\n // Reset the original getContext function\n prototype.getContext = prototype.originalGetContext;\n prototype.originalGetContext = undefined;\n return;\n }\n\n // Store the original getContext function\n prototype.originalGetContext = prototype.getContext;\n\n // Override the getContext function\n prototype.getContext = function (contextId: string, options?: WebGLContextAttributes) {\n // Attempt to force WebGL2 for all WebGL1 contexts\n if (contextId === 'webgl' || contextId === 'experimental-webgl') {\n const context = this.originalGetContext('webgl2', options) as WebGL2RenderingContext;\n // Work around test mocking\n if (context instanceof HTMLElement) {\n polyfillWebGL1Extensions(context);\n }\n return context;\n }\n // For any other type, return the original context\n return this.originalGetContext(contextId, options);\n };\n}\n\n/** Install WebGL1-only extensions on WebGL2 contexts */\nexport function polyfillWebGL1Extensions(gl: WebGL2RenderingContext): void {\n // Enable, to support float and half-float textures\n gl.getExtension('EXT_color_buffer_float');\n\n // WebGL1 extensions implemented using WebGL2 APIs\n const boundExtensions = {\n ...WEBGL1_STATIC_EXTENSIONS,\n WEBGL_disjoint_timer_query: gl.getExtension('EXT_disjoint_timer_query_webgl2'),\n WEBGL_draw_buffers: getWEBGL_draw_buffers(gl),\n OES_vertex_array_object: getOES_vertex_array_object(gl),\n ANGLE_instanced_arrays: getANGLE_instanced_arrays(gl)\n };\n\n // Override gl.getExtension\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const originalGetExtension = gl.getExtension;\n gl.getExtension = function (extensionName: string) {\n const ext = originalGetExtension.call(gl, extensionName);\n if (ext) {\n return ext;\n }\n\n // Injected extensions\n if (extensionName in boundExtensions) {\n return boundExtensions[extensionName];\n }\n\n return null;\n };\n\n // Override gl.getSupportedExtensions\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const originalGetSupportedExtensions = gl.getSupportedExtensions;\n gl.getSupportedExtensions = function (): string[] | null {\n const extensions = originalGetSupportedExtensions.apply(gl) || [];\n return extensions?.concat(Object.keys(boundExtensions));\n };\n}\n\n// Update unsized WebGL1 formats to sized WebGL2 formats\n// todo move to texture format file\n// export function getInternalFormat(gl: WebGL2RenderingContext, format: GL, type: GL): GL {\n// // webgl2 texture formats\n// // https://webgl2fundamentals.org/webgl/lessons/webgl-data-textures.html\n// switch (format) {\n// case GL.DEPTH_COMPONENT:\n// return GL.DEPTH_COMPONENT24;\n// case GL.DEPTH_STENCIL:\n// return GL.DEPTH24_STENCIL8;\n// case GL.RGBA:\n// return type === GL.HALF_FLOAT ? GL.RGBA16F : GL.RGBA32F;\n// case GL.RGB:\n// return type === GL.HALF_FLOAT ? GL.RGB16F : GL.RGB32F;\n// default:\n// return format;\n// }\n// }\n\n/*\n// texture type to update on the fly\nexport function getTextureType(gl: WebGL2RenderingContext, type: GL): GL {\n if (type === HALF_FLOAT_OES) {\n return GL.HALF_FLOAT;\n }\n return type;\n}\n\n // And texImage2D to convert the internalFormat to webgl2.\n const webgl2 = this;\n const origTexImage = gl.texImage2D;\n gl.texImage2D = function (target, miplevel, iformat, a, typeFor6, c, d, typeFor9, f) {\n if (arguments.length == 6) {\n var ifmt = webgl2.getInternalFormat(gl, iformat, typeFor6);\n origTexImage.apply(gl, [target, miplevel, ifmt, a, webgl.getTextureType(gl, typeFor6), c]);\n } else {\n // arguments.length == 9\n var ifmt = webgl2.getInternalFormat(gl, iformat, typeFor9);\n origTexImage.apply(gl, [\n target,\n miplevel,\n ifmt,\n a,\n typeFor6,\n c,\n d,\n webgl2.getTextureType(gl, typeFor9),\n f\n ]);\n }\n };\n};\n*/\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Buffer, log} from '@luma.gl/core';\nimport {GL, GLDataType, GLPixelType} from '@luma.gl/constants';\nimport {TypedArrayConstructor} from '@math.gl/types';\n\n/**\n * Attribute descriptor object\n * @deprecated Use ShaderLayout\n */\nexport interface AccessorObject {\n buffer?: Buffer;\n // format: VertexFormat;\n offset?: number;\n // can now be described with single WebGPU-style `format` string\n\n //\n stride?: number;\n\n /** @deprecated - Use accessor.stepMode */\n divisor?: number;\n\n /** @deprecated - Infer from format */\n type?: number;\n /** @deprecated - Infer from format */\n size?: number;\n /** @deprecated - Infer from format */\n normalized?: boolean;\n /** @deprecated - Infer from format */\n integer?: boolean;\n\n /** @deprecated */\n index?: number;\n}\n\nconst DEFAULT_ACCESSOR_VALUES = {\n offset: 0,\n stride: 0,\n type: GL.FLOAT,\n size: 1,\n divisor: 0,\n normalized: false,\n integer: false\n};\n\nexport class Accessor implements AccessorObject {\n offset?: number;\n stride?: number;\n type?: number;\n size?: number;\n divisor?: number;\n normalized?: boolean;\n integer?: boolean;\n\n buffer?: Buffer;\n index?: number;\n\n static getBytesPerElement(accessor: Accessor | AccessorObject): number {\n // TODO: using `FLOAT` when type is not specified,\n // ensure this assumption is valid or force API to specify type.\n const ArrayType = getTypedArrayFromGLType(accessor.type || GL.FLOAT);\n return ArrayType.BYTES_PER_ELEMENT;\n }\n\n static getBytesPerVertex(accessor: AccessorObject): number {\n // assert(accessor.size);\n // TODO: using `FLOAT` when type is not specified,\n // ensure this assumption is valid or force API to specify type.\n const ArrayType = getTypedArrayFromGLType(accessor.type || GL.FLOAT);\n return ArrayType.BYTES_PER_ELEMENT * accessor.size;\n }\n\n // Combines (merges) a list of accessors. On top of default values\n // Usually [programAccessor, bufferAccessor, appAccessor]\n // All props will be set in the returned object.\n // TODO check for conflicts between values in the supplied accessors\n static resolve(...accessors: AccessorObject[]): Accessor {\n return new Accessor(...[DEFAULT_ACCESSOR_VALUES, ...accessors]); // Default values\n }\n\n constructor(...accessors: AccessorObject[]) {\n log.warn('Accessor will be removed in next minor release');\n accessors.forEach(accessor => this._assign(accessor)); // Merge in sequence\n Object.freeze(this);\n }\n\n toString(): string {\n return JSON.stringify(this);\n }\n\n // ACCESSORS\n\n // TODO - remove>\n get BYTES_PER_ELEMENT(): number {\n return Accessor.getBytesPerElement(this);\n }\n\n get BYTES_PER_VERTEX(): number {\n return Accessor.getBytesPerVertex(this);\n }\n\n // PRIVATE\n\n // eslint-disable-next-line complexity, max-statements\n _assign(props: AccessorObject = {}): this {\n if (props.type !== undefined) {\n this.type = props.type;\n\n // Auto-deduce integer type?\n if ((props.type as GL) === GL.INT || (props.type as GL) === GL.UNSIGNED_INT) {\n this.integer = true;\n }\n }\n if (props.size !== undefined) {\n this.size = props.size;\n }\n if (props.offset !== undefined) {\n this.offset = props.offset;\n }\n if (props.stride !== undefined) {\n this.stride = props.stride;\n }\n // @ts-expect-error\n if (props.normalize !== undefined) {\n // @ts-expect-error\n this.normalized = props.normalize;\n }\n if (props.normalized !== undefined) {\n this.normalized = props.normalized;\n }\n if (props.integer !== undefined) {\n this.integer = props.integer;\n }\n\n // INSTANCE DIVISOR\n if (props.divisor !== undefined) {\n this.divisor = props.divisor;\n }\n\n // Buffer is optional\n if (props.buffer !== undefined) {\n this.buffer = props.buffer;\n }\n\n // The binding index (for binding e.g. Transform feedbacks and Uniform buffers)\n // TODO - should this be part of accessor?\n if (props.index !== undefined) {\n if (typeof props.index === 'boolean') {\n this.index = props.index ? 1 : 0;\n } else {\n this.index = props.index;\n }\n }\n\n // DEPRECATED\n // @ts-expect-error\n if (props.instanced !== undefined) {\n // @ts-expect-error\n this.divisor = props.instanced ? 1 : 0;\n }\n // @ts-expect-error\n if (props.isInstanced !== undefined) {\n // @ts-expect-error\n this.divisor = props.isInstanced ? 1 : 0;\n }\n\n if (this.offset === undefined) delete this.offset;\n if (this.stride === undefined) delete this.stride;\n if (this.type === undefined) delete this.type;\n if (this.size === undefined) delete this.size;\n if (this.divisor === undefined) delete this.divisor;\n if (this.normalized === undefined) delete this.normalized;\n if (this.integer === undefined) delete this.integer;\n\n if (this.buffer === undefined) delete this.buffer;\n if (this.index === undefined) delete this.index;\n\n return this;\n }\n}\n\n/**\n * Converts GL constant to corresponding TYPED ARRAY\n * Used to auto deduce gl parameter types\n * @deprecated Use getTypedArrayFromDataType\n * @param glType\n * @param param1\n * @returns\n */\n// eslint-disable-next-line complexity\nfunction getTypedArrayFromGLType(\n glType: GLDataType | GLPixelType,\n options?: {\n clamped?: boolean;\n }\n): TypedArrayConstructor {\n const {clamped = true} = options || {};\n // Sorted in some order of likelihood to reduce amount of comparisons\n switch (glType) {\n case GL.FLOAT:\n return Float32Array;\n case GL.UNSIGNED_SHORT:\n case GL.UNSIGNED_SHORT_5_6_5:\n case GL.UNSIGNED_SHORT_4_4_4_4:\n case GL.UNSIGNED_SHORT_5_5_5_1:\n return Uint16Array;\n case GL.UNSIGNED_INT:\n return Uint32Array;\n case GL.UNSIGNED_BYTE:\n return clamped ? Uint8ClampedArray : Uint8Array;\n case GL.BYTE:\n return Int8Array;\n case GL.SHORT:\n return Int16Array;\n case GL.INT:\n return Int32Array;\n default:\n throw new Error('Failed to deduce typed array type from GL constant');\n }\n}\n\n// TEST EXPORTS\nexport {DEFAULT_ACCESSOR_VALUES};\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// luma.gl Base WebGL wrapper library\n// Provides simple class/function wrappers around the low level webgl objects\n// These classes are intentionally close to the WebGL API\n// but make it easier to use.\n// Higher level abstractions can be built on these classes\n\n// Types\nexport type {WebGLDeviceLimits} from './adapter/device-helpers/webgl-device-limits';\n\n// WebGL adapter classes\nexport {webgl2Adapter} from './adapter/webgl-adapter';\nexport type {WebGLAdapter} from './adapter/webgl-adapter';\n\n// WebGL Device classes\nexport {WebGLDevice} from './adapter/webgl-device';\nexport {WebGLCanvasContext} from './adapter/webgl-canvas-context';\n\n// WebGL Resource classes\nexport {WEBGLBuffer} from './adapter/resources/webgl-buffer';\nexport {WEBGLTexture} from './adapter/resources/webgl-texture';\n// export {WEBGLExternalTexture} from './adapter/resources/webgl-external-texture';\nexport {WEBGLShader} from './adapter/resources/webgl-shader';\nexport {WEBGLSampler} from './adapter/resources/webgl-sampler';\nexport {WEBGLFramebuffer} from './adapter/resources/webgl-framebuffer';\n\nexport {WEBGLRenderPipeline} from './adapter/resources/webgl-render-pipeline';\n// export {WEBGLComputePipeline} from './adapter/resources/webgl-compute-pipeline';\nexport {WEBGLCommandEncoder} from './adapter/resources/webgl-command-encoder';\nexport {WEBGLRenderPass} from './adapter/resources/webgl-render-pass';\n// export {WEBGLComputePass} from './adapter/resources/webgl-compute-pass';\nexport {WEBGLVertexArray} from './adapter/resources/webgl-vertex-array';\n\n// WebGL adapter classes\nexport {WEBGLTransformFeedback} from './adapter/resources/webgl-transform-feedback';\n\n// WebGL adapter classes\nexport {Accessor} from './deprecated/accessor';\nexport type {AccessorObject} from './types';\n\n// Unified parameter API\n\nexport {setDeviceParameters, withDeviceParameters} from './adapter/converters/device-parameters';\n\n// HELPERS - EXPERIMENTAL\nexport {getShaderLayoutFromGLSL} from './adapter/helpers/get-shader-layout';\nexport {WebGLStateTracker} from './context/state-tracker/webgl-state-tracker';\n\n// DEPRECATED TEST EXPORTS\nexport {\n resetGLParameters,\n setGLParameters,\n getGLParameters\n} from './context/parameters/unified-parameter-api';\n\nexport {withGLParameters} from './context/state-tracker/with-parameters';\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Adapter, Device, DeviceProps, log} from '@luma.gl/core';\nimport {WebGLDevice} from './webgl-device';\nimport {enforceWebGL2} from '../context/polyfills/polyfill-webgl1-extensions';\nimport {loadSpectorJS, DEFAULT_SPECTOR_PROPS} from '../context/debug/spector';\nimport {loadWebGLDeveloperTools} from '../context/debug/webgl-developer-tools';\n\nconst LOG_LEVEL = 1;\n\nexport class WebGLAdapter extends Adapter {\n /** type of device's created by this adapter */\n readonly type: Device['type'] = 'webgl';\n\n constructor() {\n super();\n\n // Add spector default props to device default props, so that runtime settings are observed\n Device.defaultProps = {...Device.defaultProps, ...DEFAULT_SPECTOR_PROPS};\n\n // @ts-ignore DEPRECATED For backwards compatibility luma.registerDevices\n WebGLDevice.adapter = this;\n }\n\n /** Check if WebGL 2 is available */\n isSupported(): boolean {\n return typeof WebGL2RenderingContext !== 'undefined';\n }\n\n /** Force any created WebGL contexts to be WebGL2 contexts, polyfilled with WebGL1 extensions */\n enforceWebGL2(enable: boolean): void {\n enforceWebGL2(enable);\n }\n\n /**\n * Get a device instance from a GL context\n * Creates a WebGLCanvasContext against the contexts canvas\n * @note autoResize will be disabled, assuming that whoever created the external context will be handling resizes.\n * @param gl\n * @returns\n */\n async attach(gl: Device | WebGL2RenderingContext): Promise<WebGLDevice> {\n if (gl instanceof WebGLDevice) {\n return gl;\n }\n // @ts-expect-error\n if (gl?.device instanceof Device) {\n // @ts-expect-error\n return gl.device as WebGLDevice;\n }\n if (!isWebGL(gl)) {\n throw new Error('Invalid WebGL2RenderingContext');\n }\n\n // We create a new device using the provided WebGL context and its canvas\n // Assume that whoever created the external context will be handling resizes.\n return new WebGLDevice({\n _handle: gl,\n createCanvasContext: {canvas: gl.canvas, autoResize: false}\n });\n }\n\n async create(props: DeviceProps = {}): Promise<WebGLDevice> {\n log.groupCollapsed(LOG_LEVEL, 'WebGLDevice created')();\n\n const promises: Promise<unknown>[] = [];\n\n // Load webgl and spector debug scripts from CDN if requested\n if (props.debugWebGL || props.debug) {\n promises.push(loadWebGLDeveloperTools());\n }\n\n if (props.debugSpectorJS) {\n promises.push(loadSpectorJS(props));\n }\n\n // Wait for all the loads to settle before creating the context.\n // The Device.create() functions are async, so in contrast to the constructor, we can `await` here.\n const results = await Promise.allSettled(promises);\n for (const result of results) {\n if (result.status === 'rejected') {\n log.error(`Failed to initialize debug libraries ${result.reason}`)();\n }\n }\n\n const device = new WebGLDevice(props);\n\n // Log some debug info about the newly created context\n const message = `\\\nCreated ${device.type}${device.debug ? ' debug' : ''} context: \\\n${device.info.vendor}, ${device.info.renderer} for canvas: ${device.canvasContext.id}`;\n log.probe(LOG_LEVEL, message)();\n log.table(LOG_LEVEL, device.info)();\n\n log.groupEnd(LOG_LEVEL)();\n\n return device;\n }\n}\n\n/** Check if supplied parameter is a WebGL2RenderingContext */\nfunction isWebGL(gl: any): gl is WebGL2RenderingContext {\n if (typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext) {\n return true;\n }\n // Look for debug contexts, headless gl etc\n return Boolean(gl && Number.isFinite(gl._version));\n}\n\nexport const webgl2Adapter = new WebGLAdapter();\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {TypedArray} from '@math.gl/types';\nimport type {\n DeviceProps,\n DeviceInfo,\n DeviceTextureFormatCapabilities,\n CanvasContextProps,\n Buffer,\n Texture,\n Framebuffer,\n VertexArray,\n VertexArrayProps,\n BufferProps,\n ShaderProps,\n // Sampler,\n SamplerProps,\n TextureProps,\n ExternalTexture,\n ExternalTextureProps,\n FramebufferProps,\n // RenderPipeline,\n RenderPipelineProps,\n ComputePipeline,\n ComputePipelineProps,\n // RenderPass,\n RenderPassProps,\n ComputePass,\n ComputePassProps,\n // CommandEncoder,\n CommandEncoderProps,\n TransformFeedbackProps,\n QuerySetProps\n} from '@luma.gl/core';\nimport {Device, CanvasContext, log} from '@luma.gl/core';\nimport type {GLExtensions} from '@luma.gl/constants';\nimport {WebGLStateTracker} from '../context/state-tracker/webgl-state-tracker';\nimport {createBrowserContext} from '../context/helpers/create-browser-context';\nimport {getDeviceInfo} from './device-helpers/webgl-device-info';\nimport {WebGLDeviceFeatures} from './device-helpers/webgl-device-features';\nimport {WebGLDeviceLimits} from './device-helpers/webgl-device-limits';\nimport {WebGLCanvasContext} from './webgl-canvas-context';\nimport type {Spector} from '../context/debug/spector-types';\nimport {initializeSpectorJS} from '../context/debug/spector';\nimport {makeDebugContext} from '../context/debug/webgl-developer-tools';\nimport {getTextureFormatCapabilitiesWebGL} from './converters/webgl-texture-table';\nimport {uid} from '../utils/uid';\n\nimport {WEBGLBuffer} from './resources/webgl-buffer';\nimport {WEBGLShader} from './resources/webgl-shader';\nimport {WEBGLSampler} from './resources/webgl-sampler';\nimport {WEBGLTexture} from './resources/webgl-texture';\nimport {WEBGLFramebuffer} from './resources/webgl-framebuffer';\nimport {WEBGLRenderPass} from './resources/webgl-render-pass';\nimport {WEBGLRenderPipeline} from './resources/webgl-render-pipeline';\nimport {WEBGLCommandEncoder} from './resources/webgl-command-encoder';\nimport {WEBGLVertexArray} from './resources/webgl-vertex-array';\nimport {WEBGLTransformFeedback} from './resources/webgl-transform-feedback';\nimport {WEBGLQuerySet} from './resources/webgl-query-set';\n\nimport {readPixelsToArray, readPixelsToBuffer} from './helpers/webgl-texture-utils';\nimport {\n setGLParameters,\n getGLParameters,\n resetGLParameters\n} from '../context/parameters/unified-parameter-api';\nimport {withGLParameters} from '../context/state-tracker/with-parameters';\nimport {getWebGLExtension} from '../context/helpers/webgl-extensions';\n\n/** WebGPU style Device API for a WebGL context */\nexport class WebGLDevice extends Device {\n //\n // Public `Device` API\n //\n\n /** type of this device */\n readonly type = 'webgl';\n\n /** The underlying WebGL context */\n readonly handle: WebGL2RenderingContext;\n features: WebGLDeviceFeatures;\n limits: WebGLDeviceLimits;\n\n readonly info: DeviceInfo;\n readonly canvasContext: WebGLCanvasContext;\n\n readonly lost: Promise<{reason: 'destroyed'; message: string}>;\n\n private _resolveContextLost?: (value: {reason: 'destroyed'; message: string}) => void;\n\n /** WebGL2 context. */\n readonly gl: WebGL2RenderingContext;\n readonly debug: boolean = false;\n\n /** State used by luma.gl classes: TODO - move to canvasContext*/\n readonly _canvasSizeInfo = {clientWidth: 0, clientHeight: 0, devicePixelRatio: 1};\n\n /** State used by luma.gl classes - TODO - not used? */\n readonly _extensions: GLExtensions = {};\n _polyfilled: boolean = false;\n\n /** Instance of Spector.js (if initialized) */\n spectorJS: Spector;\n\n //\n // Public API\n //\n\n constructor(props: DeviceProps) {\n super({...props, id: props.id || uid('webgl-device')});\n\n // WebGL requires a canvas to be created before creating the context\n if (!props.createCanvasContext) {\n throw new Error('WebGLDevice requires props.createCanvasContext to be set');\n }\n const canvasContextProps = props.createCanvasContext === true ? {} : props.createCanvasContext;\n\n // If attaching to an already attached context, return the attached device\n // @ts-expect-error device is attached to context\n let device: WebGLDevice | undefined = canvasContextProps.canvas?.gl?.device;\n if (device) {\n throw new Error(`WebGL context already attached to device ${device.id}`);\n }\n\n // Create and instrument context\n this.canvasContext = new WebGLCanvasContext(this, canvasContextProps);\n\n this.lost = new Promise<{reason: 'destroyed'; message: string}>(resolve => {\n this._resolveContextLost = resolve;\n });\n\n const webglContextAttributes: WebGLContextAttributes = {...props.webgl};\n // Copy props from CanvasContextProps\n if (canvasContextProps.alphaMode === 'premultiplied') {\n webglContextAttributes.premultipliedAlpha = true;\n }\n if (props.powerPreference !== undefined) {\n webglContextAttributes.powerPreference = props.powerPreference;\n }\n\n // Check if we should attach to an externally created context or create a new context\n const externalGLContext = this.props._handle as WebGL2RenderingContext | null;\n\n const gl =\n externalGLContext ||\n createBrowserContext(\n this.canvasContext.canvas,\n {\n onContextLost: (event: Event) =>\n this._resolveContextLost?.({\n reason: 'destroyed',\n message: 'Entered sleep mode, or too many apps or browser tabs are using the GPU.'\n }),\n // eslint-disable-next-line no-console\n onContextRestored: (event: Event) => console.log('WebGL context restored')\n },\n webglContextAttributes\n );\n\n if (!gl) {\n throw new Error('WebGL context creation failed');\n }\n\n // @ts-expect-error device is attached to context\n device = gl.device;\n if (device) {\n throw new Error(`WebGL context already attached to device ${device.id}`);\n }\n\n this.handle = gl;\n this.gl = gl;\n\n // Add spector debug instrumentation to context\n // We need to trust spector integration to decide if spector should be initialized\n // We also run spector instrumentation first, otherwise spector can clobber luma instrumentation.\n this.spectorJS = initializeSpectorJS({...this.props, gl: this.handle});\n\n // Instrument context\n (this.gl as any).device = this; // Update GL context: Link webgl context back to device\n (this.gl as any)._version = 2; // Update GL context: Store WebGL version field on gl context (HACK to identify debug contexts)\n\n // initialize luma Device fields\n this.info = getDeviceInfo(this.gl, this._extensions);\n this.limits = new WebGLDeviceLimits(this.gl);\n this.features = new WebGLDeviceFeatures(\n this.gl,\n this._extensions,\n this.props._disabledFeatures\n );\n if (this.props._initializeFeatures) {\n this.features.initializeFeatures();\n }\n\n if (canvasContextProps.autoResize !== false) {\n this.canvasContext.resize();\n }\n\n // Install context state tracking\n const glState = new WebGLStateTracker(this.gl, {\n log: (...args: any[]) => log.log(1, ...args)()\n });\n glState.trackState(this.gl, {copyState: false});\n\n // DEBUG contexts: Add luma debug instrumentation to the context, force log level to at least 1\n const debugWebGL = props.debugWebGL || props.debug;\n const traceWebGL = props.debugWebGL;\n if (debugWebGL) {\n this.gl = makeDebugContext(this.gl, {debugWebGL, traceWebGL});\n log.warn('WebGL debug mode activated. Performance reduced.')();\n if (props.debugWebGL) {\n log.level = Math.max(log.level, 1);\n }\n }\n }\n\n /**\n * Destroys the context\n * @note Has no effect for WebGL browser contexts, there is no browser API for destroying contexts\n */\n destroy(): void {}\n\n get isLost(): boolean {\n return this.gl.isContextLost();\n }\n\n // IMPLEMENTATION OF ABSTRACT DEVICE\n\n createCanvasContext(props?: CanvasContextProps): CanvasContext {\n throw new Error('WebGL only supports a single canvas');\n }\n\n createBuffer(props: BufferProps | ArrayBuffer | ArrayBufferView): WEBGLBuffer {\n const newProps = this._normalizeBufferProps(props);\n return new WEBGLBuffer(this, newProps);\n }\n\n createTexture(props: TextureProps): WEBGLTexture {\n return new WEBGLTexture(this, props);\n }\n\n createExternalTexture(props: ExternalTextureProps): ExternalTexture {\n throw new Error('createExternalTexture() not implemented'); // return new Program(props);\n }\n\n createSampler(props: SamplerProps): WEBGLSampler {\n return new WEBGLSampler(this, props);\n }\n\n createShader(props: ShaderProps): WEBGLShader {\n return new WEBGLShader(this, props);\n }\n\n createFramebuffer(props: FramebufferProps): WEBGLFramebuffer {\n return new WEBGLFramebuffer(this, props);\n }\n\n createVertexArray(props: VertexArrayProps): VertexArray {\n return new WEBGLVertexArray(this, props);\n }\n\n createTransformFeedback(props: TransformFeedbackProps): WEBGLTransformFeedback {\n return new WEBGLTransformFeedback(this, props);\n }\n\n createQuerySet(props: QuerySetProps): WEBGLQuerySet {\n return new WEBGLQuerySet(this, props);\n }\n\n createRenderPipeline(props: RenderPipelineProps): WEBGLRenderPipeline {\n return new WEBGLRenderPipeline(this, props);\n }\n\n beginRenderPass(props: RenderPassProps): WEBGLRenderPass {\n return new WEBGLRenderPass(this, props);\n }\n\n createComputePipeline(props?: ComputePipelineProps): ComputePipeline {\n throw new Error('ComputePipeline not supported in WebGL');\n }\n\n beginComputePass(props: ComputePassProps): ComputePass {\n throw new Error('ComputePass not supported in WebGL');\n }\n\n private renderPass: WEBGLRenderPass | null = null;\n\n override createCommandEncoder(props: CommandEncoderProps = {}): WEBGLCommandEncoder {\n return new WEBGLCommandEncoder(this, props);\n }\n\n /**\n * Offscreen Canvas Support: Commit the frame\n * https://developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext/commit\n * Chrome's offscreen canvas does not require gl.commit\n */\n submit(): void {\n this.renderPass?.end();\n this.renderPass = null;\n // this.canvasContext.commit();\n }\n\n //\n // TEMPORARY HACKS - will be removed in v9.1\n //\n\n /** @deprecated - should use command encoder */\n override readPixelsToArrayWebGL(\n source: Framebuffer | Texture,\n options?: {\n sourceX?: number;\n sourceY?: number;\n sourceFormat?: number;\n sourceAttachment?: number;\n target?: Uint8Array | Uint16Array | Float32Array;\n // following parameters are auto deduced if not provided\n sourceWidth?: number;\n sourceHeight?: number;\n sourceType?: number;\n }\n ): Uint8Array | Uint16Array | Float32Array {\n return readPixelsToArray(source, options);\n }\n\n /** @deprecated - should use command encoder */\n override readPixelsToBufferWebGL(\n source: Framebuffer | Texture,\n options?: {\n sourceX?: number;\n sourceY?: number;\n sourceFormat?: number;\n target?: Buffer; // A new Buffer object is created when not provided.\n targetByteOffset?: number; // byte offset in buffer object\n // following parameters are auto deduced if not provided\n sourceWidth?: number;\n sourceHeight?: number;\n sourceType?: number;\n }\n ): Buffer {\n return readPixelsToBuffer(source, options);\n }\n\n override setParametersWebGL(parameters: any): void {\n setGLParameters(this.gl, parameters);\n }\n\n override getParametersWebGL(parameters: any): any {\n return getGLParameters(this.gl, parameters);\n }\n\n override withParametersWebGL(parameters: any, func: any): any {\n return withGLParameters(this.gl, parameters, func);\n }\n\n override resetWebGL(): void {\n log.warn('WebGLDevice.resetWebGL is deprecated, use only for debugging')();\n resetGLParameters(this.gl);\n }\n\n override _getDeviceSpecificTextureFormatCapabilities(\n capabilities: DeviceTextureFormatCapabilities\n ): DeviceTextureFormatCapabilities {\n return getTextureFormatCapabilitiesWebGL(this.gl, capabilities, this._extensions);\n }\n\n //\n // WebGL-only API (not part of `Device` API)\n //\n\n /**\n * Triggers device (or WebGL context) loss.\n * @note primarily intended for testing how application reacts to device loss\n */\n override loseDevice(): boolean {\n let deviceLossTriggered = false;\n const extensions = this.getExtension('WEBGL_lose_context');\n const ext = extensions.WEBGL_lose_context;\n if (ext) {\n deviceLossTriggered = true;\n ext.loseContext();\n // ext.loseContext should trigger context loss callback but the platform may not do this, so do it explicitly\n }\n this._resolveContextLost?.({\n reason: 'destroyed',\n message: 'Application triggered context loss'\n });\n return deviceLossTriggered;\n }\n\n /** Save current WebGL context state onto an internal stack */\n pushState(): void {\n const webglState = WebGLStateTracker.get(this.gl);\n webglState.push();\n }\n\n /** Restores previously saved context state */\n popState(): void {\n const webglState = WebGLStateTracker.get(this.gl);\n webglState.pop();\n }\n\n /**\n * Storing data on a special field on WebGLObjects makes that data visible in SPECTOR chrome debug extension\n * luma.gl ids and props can be inspected\n */\n setSpectorMetadata(handle: unknown, props: Record<string, unknown>) {\n // @ts-expect-error\n // eslint-disable-next-line camelcase\n handle.__SPECTOR_Metadata = props;\n }\n\n /**\n * Returns the GL.<KEY> constant that corresponds to a numeric value of a GL constant\n * Be aware that there are some duplicates especially for constants that are 0,\n * so this isn't guaranteed to return the right key in all cases.\n */\n getGLKey(value: unknown, options?: {emptyIfUnknown?: boolean}): string {\n const number = Number(value);\n for (const key in this.gl) {\n // @ts-ignore expect-error depends on settings\n if (this.gl[key] === number) {\n return `GL.${key}`;\n }\n }\n // No constant found. Stringify the value and return it.\n return options?.emptyIfUnknown ? '' : String(value);\n }\n\n /**\n * Returns a map with any GL.<KEY> constants mapped to strings, both for keys and values\n */\n getGLKeys(glParameters: Record<number, unknown>): Record<string, string> {\n const opts = {emptyIfUnknown: true};\n return Object.entries(glParameters).reduce<Record<string, string>>((keys, [key, value]) => {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n keys[`${key}:${this.getGLKey(key, opts)}`] = `${value}:${this.getGLKey(value, opts)}`;\n return keys;\n }, {});\n }\n\n /** Store constants */\n _constants: (TypedArray | null)[];\n\n /**\n * Set a constant value for a location. Disabled attributes at that location will read from this value\n * @note WebGL constants are stored globally on the WebGL context, not the VertexArray\n * so they need to be updated before every render\n * @todo - remember/cache values to avoid setting them unnecessarily?\n */\n setConstantAttributeWebGL(location: number, constant: TypedArray): void {\n const maxVertexAttributes = this.limits.maxVertexAttributes;\n this._constants = this._constants || new Array(maxVertexAttributes).fill(null);\n const currentConstant = this._constants[location];\n if (currentConstant && compareConstantArrayValues(currentConstant, constant)) {\n log.info(\n 1,\n `setConstantAttributeWebGL(${location}) could have been skipped, value unchanged`\n )();\n }\n this._constants[location] = constant;\n\n switch (constant.constructor) {\n case Float32Array:\n setConstantFloatArray(this, location, constant as Float32Array);\n break;\n case Int32Array:\n setConstantIntArray(this, location, constant as Int32Array);\n break;\n case Uint32Array:\n setConstantUintArray(this, location, constant as Uint32Array);\n break;\n default:\n throw new Error('constant');\n }\n }\n\n /** Ensure extensions are only requested once */\n getExtension(name: keyof GLExtensions): GLExtensions {\n getWebGLExtension(this.gl, name, this._extensions);\n return this._extensions;\n }\n}\n\n/** Set constant float array attribute */\nfunction setConstantFloatArray(device: WebGLDevice, location: number, array: Float32Array): void {\n switch (array.length) {\n case 1:\n device.gl.vertexAttrib1fv(location, array);\n break;\n case 2:\n device.gl.vertexAttrib2fv(location, array);\n break;\n case 3:\n device.gl.vertexAttrib3fv(location, array);\n break;\n case 4:\n device.gl.vertexAttrib4fv(location, array);\n break;\n default:\n // assert(false);\n }\n}\n\n/** Set constant signed int array attribute */\nfunction setConstantIntArray(device: WebGLDevice, location: number, array: Int32Array): void {\n device.gl.vertexAttribI4iv(location, array);\n // TODO - not clear if we need to use the special forms, more testing needed\n // switch (array.length) {\n // case 1:\n // gl.vertexAttribI1iv(location, array);\n // break;\n // case 2:\n // gl.vertexAttribI2iv(location, array);\n // break;\n // case 3:\n // gl.vertexAttribI3iv(location, array);\n // break;\n // case 4:\n // break;\n // default:\n // assert(false);\n // }\n}\n\n/** Set constant unsigned int array attribute */\nfunction setConstantUintArray(device: WebGLDevice, location: number, array: Uint32Array) {\n device.gl.vertexAttribI4uiv(location, array);\n // TODO - not clear if we need to use the special forms, more testing needed\n // switch (array.length) {\n // case 1:\n // gl.vertexAttribI1uiv(location, array);\n // break;\n // case 2:\n // gl.vertexAttribI2uiv(location, array);\n // break;\n // case 3:\n // gl.vertexAttribI3uiv(location, array);\n // break;\n // case 4:\n // gl.vertexAttribI4uiv(location, array);\n // break;\n // default:\n // assert(false);\n // }\n}\n\n/**\n * Compares contents of two typed arrays\n * @todo max length?\n */\nfunction compareConstantArrayValues(v1: TypedArray, v2: TypedArray): boolean {\n if (!v1 || !v2 || v1.length !== v2.length || v1.constructor !== v2.constructor) {\n return false;\n }\n for (let i = 0; i < v1.length; ++i) {\n if (v1[i] !== v2[i]) {\n return false;\n }\n }\n return true;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Tables describing WebGL parameters\nimport {GL, GLParameters} from '@luma.gl/constants';\n\n// DEFAULT SETTINGS - FOR FAST CACHE INITIALIZATION AND CONTEXT RESETS\n\n/* eslint-disable no-shadow */\n\nexport const GL_PARAMETER_DEFAULTS: GLParameters = {\n [GL.BLEND]: false,\n [GL.BLEND_COLOR]: new Float32Array([0, 0, 0, 0]),\n [GL.BLEND_EQUATION_RGB]: GL.FUNC_ADD,\n [GL.BLEND_EQUATION_ALPHA]: GL.FUNC_ADD,\n [GL.BLEND_SRC_RGB]: GL.ONE,\n [GL.BLEND_DST_RGB]: GL.ZERO,\n [GL.BLEND_SRC_ALPHA]: GL.ONE,\n [GL.BLEND_DST_ALPHA]: GL.ZERO,\n [GL.COLOR_CLEAR_VALUE]: new Float32Array([0, 0, 0, 0]), // TBD\n [GL.COLOR_WRITEMASK]: [true, true, true, true],\n [GL.CULL_FACE]: false,\n [GL.CULL_FACE_MODE]: GL.BACK,\n [GL.DEPTH_TEST]: false,\n [GL.DEPTH_CLEAR_VALUE]: 1,\n [GL.DEPTH_FUNC]: GL.LESS,\n [GL.DEPTH_RANGE]: new Float32Array([0, 1]), // TBD\n [GL.DEPTH_WRITEMASK]: true,\n [GL.DITHER]: true,\n [GL.CURRENT_PROGRAM]: null,\n // FRAMEBUFFER_BINDING and DRAW_FRAMEBUFFER_BINDING(WebGL2) refer same state.\n [GL.FRAMEBUFFER_BINDING]: null,\n [GL.RENDERBUFFER_BINDING]: null,\n [GL.VERTEX_ARRAY_BINDING]: null,\n [GL.ARRAY_BUFFER_BINDING]: null,\n [GL.FRONT_FACE]: GL.CCW,\n [GL.GENERATE_MIPMAP_HINT]: GL.DONT_CARE,\n [GL.LINE_WIDTH]: 1,\n [GL.POLYGON_OFFSET_FILL]: false,\n [GL.POLYGON_OFFSET_FACTOR]: 0,\n [GL.POLYGON_OFFSET_UNITS]: 0,\n [GL.SAMPLE_ALPHA_TO_COVERAGE]: false,\n [GL.SAMPLE_COVERAGE]: false,\n [GL.SAMPLE_COVERAGE_VALUE]: 1.0,\n [GL.SAMPLE_COVERAGE_INVERT]: false,\n [GL.SCISSOR_TEST]: false,\n // Note: Dynamic value. If scissor test enabled we expect users to set correct scissor box\n [GL.SCISSOR_BOX]: new Int32Array([0, 0, 1024, 1024]),\n [GL.STENCIL_TEST]: false,\n [GL.STENCIL_CLEAR_VALUE]: 0,\n [GL.STENCIL_WRITEMASK]: 0xffffffff,\n [GL.STENCIL_BACK_WRITEMASK]: 0xffffffff,\n [GL.STENCIL_FUNC]: GL.ALWAYS,\n [GL.STENCIL_REF]: 0,\n [GL.STENCIL_VALUE_MASK]: 0xffffffff,\n [GL.STENCIL_BACK_FUNC]: GL.ALWAYS,\n [GL.STENCIL_BACK_REF]: 0,\n [GL.STENCIL_BACK_VALUE_MASK]: 0xffffffff,\n [GL.STENCIL_FAIL]: GL.KEEP,\n [GL.STENCIL_PASS_DEPTH_FAIL]: GL.KEEP,\n [GL.STENCIL_PASS_DEPTH_PASS]: GL.KEEP,\n [GL.STENCIL_BACK_FAIL]: GL.KEEP,\n [GL.STENCIL_BACK_PASS_DEPTH_FAIL]: GL.KEEP,\n [GL.STENCIL_BACK_PASS_DEPTH_PASS]: GL.KEEP,\n // Dynamic value: We use [0, 0, 1024, 1024] as default, but usually this is updated in each frame.\n [GL.VIEWPORT]: [0, 0, 1024, 1024],\n\n [GL.TRANSFORM_FEEDBACK_BINDING]: null,\n [GL.COPY_READ_BUFFER_BINDING]: null,\n [GL.COPY_WRITE_BUFFER_BINDING]: null,\n [GL.PIXEL_PACK_BUFFER_BINDING]: null,\n [GL.PIXEL_UNPACK_BUFFER_BINDING]: null,\n [GL.FRAGMENT_SHADER_DERIVATIVE_HINT]: GL.DONT_CARE,\n [GL.READ_FRAMEBUFFER_BINDING]: null,\n [GL.RASTERIZER_DISCARD]: false,\n\n [GL.PACK_ALIGNMENT]: 4,\n [GL.UNPACK_ALIGNMENT]: 4,\n [GL.UNPACK_FLIP_Y_WEBGL]: false,\n [GL.UNPACK_PREMULTIPLY_ALPHA_WEBGL]: false,\n [GL.UNPACK_COLORSPACE_CONVERSION_WEBGL]: GL.BROWSER_DEFAULT_WEBGL,\n [GL.PACK_ROW_LENGTH]: 0,\n [GL.PACK_SKIP_PIXELS]: 0,\n [GL.PACK_SKIP_ROWS]: 0,\n [GL.UNPACK_ROW_LENGTH]: 0,\n [GL.UNPACK_IMAGE_HEIGHT]: 0,\n [GL.UNPACK_SKIP_PIXELS]: 0,\n [GL.UNPACK_SKIP_ROWS]: 0,\n [GL.UNPACK_SKIP_IMAGES]: 0\n};\n\n// SETTER TABLES - ENABLES SETTING ANY PARAMETER WITH A COMMON API\n\nconst enable = (gl: WebGL2RenderingContext, value: unknown, key: GL) =>\n value ? gl.enable(key) : gl.disable(key);\nconst hint = (gl: WebGL2RenderingContext, value: GL, key: GL) => gl.hint(key, value);\nconst pixelStorei = (gl: WebGL2RenderingContext, value: number | boolean, key: GL) =>\n gl.pixelStorei(key, value);\n\nconst bindFramebuffer = (gl: WebGL2RenderingContext, value: unknown, key: GL) => {\n const target = key === GL.FRAMEBUFFER_BINDING ? GL.DRAW_FRAMEBUFFER : GL.READ_FRAMEBUFFER;\n return gl.bindFramebuffer(target, value as WebGLFramebuffer);\n};\n\nconst bindBuffer = (gl: WebGL2RenderingContext, value: unknown, key: GL) => {\n const bindingMap: Partial<Record<GL, GL>> = {\n [GL.ARRAY_BUFFER_BINDING]: GL.ARRAY_BUFFER,\n [GL.COPY_READ_BUFFER_BINDING]: GL.COPY_READ_BUFFER,\n [GL.COPY_WRITE_BUFFER_BINDING]: GL.COPY_WRITE_BUFFER,\n [GL.PIXEL_PACK_BUFFER_BINDING]: GL.PIXEL_PACK_BUFFER,\n [GL.PIXEL_UNPACK_BUFFER_BINDING]: GL.PIXEL_UNPACK_BUFFER\n };\n const glTarget = bindingMap[key];\n\n gl.bindBuffer(glTarget as number, value as WebGLBuffer | null);\n};\n\n// Utility\nfunction isArray(array: unknown): boolean {\n return Array.isArray(array) || (ArrayBuffer.isView(array) && !(array instanceof DataView));\n}\n\n// Map from WebGL parameter names to corresponding WebGL setter functions\n// WegGL constants are read by parameter names, but set by function names\n// NOTE: When value type is a string, it will be handled by 'GL_COMPOSITE_PARAMETER_SETTERS'\nexport const GL_PARAMETER_SETTERS = {\n [GL.BLEND]: enable,\n [GL.BLEND_COLOR]: (gl: WebGL2RenderingContext, value: [number, number, number, number]) =>\n gl.blendColor(...value),\n [GL.BLEND_EQUATION_RGB]: 'blendEquation',\n [GL.BLEND_EQUATION_ALPHA]: 'blendEquation',\n [GL.BLEND_SRC_RGB]: 'blendFunc',\n [GL.BLEND_DST_RGB]: 'blendFunc',\n [GL.BLEND_SRC_ALPHA]: 'blendFunc',\n [GL.BLEND_DST_ALPHA]: 'blendFunc',\n [GL.COLOR_CLEAR_VALUE]: (gl: WebGL2RenderingContext, value: [number, number, number, number]) =>\n gl.clearColor(...value),\n [GL.COLOR_WRITEMASK]: (gl: WebGL2RenderingContext, value: [boolean, boolean, boolean, boolean]) =>\n gl.colorMask(...value),\n [GL.CULL_FACE]: enable,\n [GL.CULL_FACE_MODE]: (gl: WebGL2RenderingContext, value) => gl.cullFace(value),\n [GL.DEPTH_TEST]: enable,\n [GL.DEPTH_CLEAR_VALUE]: (gl: WebGL2RenderingContext, value) => gl.clearDepth(value),\n [GL.DEPTH_FUNC]: (gl: WebGL2RenderingContext, value) => gl.depthFunc(value),\n [GL.DEPTH_RANGE]: (gl: WebGL2RenderingContext, value: [number, number]) =>\n gl.depthRange(...value),\n [GL.DEPTH_WRITEMASK]: (gl: WebGL2RenderingContext, value) => gl.depthMask(value),\n [GL.DITHER]: enable,\n [GL.FRAGMENT_SHADER_DERIVATIVE_HINT]: hint,\n\n [GL.CURRENT_PROGRAM]: (gl: WebGL2RenderingContext, value) => gl.useProgram(value),\n [GL.RENDERBUFFER_BINDING]: (gl: WebGL2RenderingContext, value) =>\n gl.bindRenderbuffer(GL.RENDERBUFFER, value),\n [GL.TRANSFORM_FEEDBACK_BINDING]: (gl: WebGL2RenderingContext, value) =>\n gl.bindTransformFeedback?.(GL.TRANSFORM_FEEDBACK, value),\n [GL.VERTEX_ARRAY_BINDING]: (gl: WebGL2RenderingContext, value) => gl.bindVertexArray(value),\n // NOTE: FRAMEBUFFER_BINDING and DRAW_FRAMEBUFFER_BINDING(WebGL2) refer same state.\n [GL.FRAMEBUFFER_BINDING]: bindFramebuffer,\n [GL.READ_FRAMEBUFFER_BINDING]: bindFramebuffer,\n\n // Buffers\n [GL.ARRAY_BUFFER_BINDING]: bindBuffer,\n [GL.COPY_READ_BUFFER_BINDING]: bindBuffer,\n [GL.COPY_WRITE_BUFFER_BINDING]: bindBuffer,\n [GL.PIXEL_PACK_BUFFER_BINDING]: bindBuffer,\n [GL.PIXEL_UNPACK_BUFFER_BINDING]: bindBuffer,\n\n [GL.FRONT_FACE]: (gl: WebGL2RenderingContext, value) => gl.frontFace(value),\n [GL.GENERATE_MIPMAP_HINT]: hint,\n [GL.LINE_WIDTH]: (gl: WebGL2RenderingContext, value) => gl.lineWidth(value),\n [GL.POLYGON_OFFSET_FILL]: enable,\n [GL.POLYGON_OFFSET_FACTOR]: 'polygonOffset',\n [GL.POLYGON_OFFSET_UNITS]: 'polygonOffset',\n [GL.RASTERIZER_DISCARD]: enable,\n [GL.SAMPLE_ALPHA_TO_COVERAGE]: enable,\n [GL.SAMPLE_COVERAGE]: enable,\n [GL.SAMPLE_COVERAGE_VALUE]: 'sampleCoverage',\n [GL.SAMPLE_COVERAGE_INVERT]: 'sampleCoverage',\n [GL.SCISSOR_TEST]: enable,\n [GL.SCISSOR_BOX]: (gl: WebGL2RenderingContext, value: [number, number, number, number]) =>\n gl.scissor(...value),\n [GL.STENCIL_TEST]: enable,\n [GL.STENCIL_CLEAR_VALUE]: (gl: WebGL2RenderingContext, value) => gl.clearStencil(value),\n [GL.STENCIL_WRITEMASK]: (gl: WebGL2RenderingContext, value) =>\n gl.stencilMaskSeparate(GL.FRONT, value),\n [GL.STENCIL_BACK_WRITEMASK]: (gl: WebGL2RenderingContext, value) =>\n gl.stencilMaskSeparate(GL.BACK, value),\n [GL.STENCIL_FUNC]: 'stencilFuncFront',\n [GL.STENCIL_REF]: 'stencilFuncFront',\n [GL.STENCIL_VALUE_MASK]: 'stencilFuncFront',\n [GL.STENCIL_BACK_FUNC]: 'stencilFuncBack',\n [GL.STENCIL_BACK_REF]: 'stencilFuncBack',\n [GL.STENCIL_BACK_VALUE_MASK]: 'stencilFuncBack',\n [GL.STENCIL_FAIL]: 'stencilOpFront',\n [GL.STENCIL_PASS_DEPTH_FAIL]: 'stencilOpFront',\n [GL.STENCIL_PASS_DEPTH_PASS]: 'stencilOpFront',\n [GL.STENCIL_BACK_FAIL]: 'stencilOpBack',\n [GL.STENCIL_BACK_PASS_DEPTH_FAIL]: 'stencilOpBack',\n [GL.STENCIL_BACK_PASS_DEPTH_PASS]: 'stencilOpBack',\n [GL.VIEWPORT]: (gl: WebGL2RenderingContext, value: [number, number, number, number]) =>\n gl.viewport(...value),\n\n // WEBGL2 EXTENSIONS\n\n // EXT_depth_clamp https://registry.khronos.org/webgl/extensions/EXT_depth_clamp/\n\n [GL.DEPTH_CLAMP_EXT]: enable,\n\n // WEBGL_provoking_vertex https://registry.khronos.org/webgl/extensions/WEBGL_provoking_vertex/\n\n // [GL.PROVOKING_VERTEX_WEBL]: TODO - extension function needed\n\n // WEBGL_polygon_mode https://registry.khronos.org/webgl/extensions/WEBGL_polygon_mode/\n\n // POLYGON_MODE_WEBGL TODO - extension function needed\n [GL.POLYGON_OFFSET_LINE_WEBGL]: enable,\n\n // WEBGL_clip_cull_distance https://registry.khronos.org/webgl/extensions/WEBGL_clip_cull_distance/\n\n [GL.CLIP_DISTANCE0_WEBGL]: enable,\n [GL.CLIP_DISTANCE1_WEBGL]: enable,\n [GL.CLIP_DISTANCE2_WEBGL]: enable,\n [GL.CLIP_DISTANCE3_WEBGL]: enable,\n [GL.CLIP_DISTANCE4_WEBGL]: enable,\n [GL.CLIP_DISTANCE5_WEBGL]: enable,\n [GL.CLIP_DISTANCE6_WEBGL]: enable,\n [GL.CLIP_DISTANCE7_WEBGL]: enable,\n\n // PIXEL PACK/UNPACK MODES\n [GL.PACK_ALIGNMENT]: pixelStorei,\n [GL.UNPACK_ALIGNMENT]: pixelStorei,\n [GL.UNPACK_FLIP_Y_WEBGL]: pixelStorei,\n [GL.UNPACK_PREMULTIPLY_ALPHA_WEBGL]: pixelStorei,\n [GL.UNPACK_COLORSPACE_CONVERSION_WEBGL]: pixelStorei,\n [GL.PACK_ROW_LENGTH]: pixelStorei,\n [GL.PACK_SKIP_PIXELS]: pixelStorei,\n [GL.PACK_SKIP_ROWS]: pixelStorei,\n [GL.UNPACK_ROW_LENGTH]: pixelStorei,\n [GL.UNPACK_IMAGE_HEIGHT]: pixelStorei,\n [GL.UNPACK_SKIP_PIXELS]: pixelStorei,\n [GL.UNPACK_SKIP_ROWS]: pixelStorei,\n [GL.UNPACK_SKIP_IMAGES]: pixelStorei,\n\n // Function-style setters\n framebuffer: (gl: WebGL2RenderingContext, framebuffer) => {\n // accepts 1) a WebGLFramebuffer 2) null (default framebuffer), or 3) luma.gl Framebuffer class\n // framebuffer is null when restoring to default framebuffer, otherwise use the WebGL handle.\n const handle = framebuffer && 'handle' in framebuffer ? framebuffer.handle : framebuffer;\n return gl.bindFramebuffer(GL.FRAMEBUFFER, handle);\n },\n blend: (gl: WebGL2RenderingContext, value) =>\n value ? gl.enable(GL.BLEND) : gl.disable(GL.BLEND),\n blendColor: (gl: WebGL2RenderingContext, value: [number, number, number, number]) =>\n gl.blendColor(...value),\n blendEquation: (gl: WebGL2RenderingContext, args: number | [number, number]) => {\n const separateModes = typeof args === 'number' ? ([args, args] as [number, number]) : args;\n gl.blendEquationSeparate(...separateModes);\n },\n blendFunc: (\n gl: WebGL2RenderingContext,\n args: [number, number] | [number, number, number, number]\n ) => {\n const separateFuncs =\n args?.length === 2 ? ([...args, ...args] as [number, number, number, number]) : args;\n gl.blendFuncSeparate(...separateFuncs);\n },\n\n clearColor: (gl: WebGL2RenderingContext, value: [number, number, number, number]) =>\n gl.clearColor(...value),\n clearDepth: (gl: WebGL2RenderingContext, value) => gl.clearDepth(value),\n clearStencil: (gl: WebGL2RenderingContext, value) => gl.clearStencil(value),\n\n colorMask: (gl: WebGL2RenderingContext, value: [boolean, boolean, boolean, boolean]) =>\n gl.colorMask(...value),\n\n cull: (gl: WebGL2RenderingContext, value) =>\n value ? gl.enable(GL.CULL_FACE) : gl.disable(GL.CULL_FACE),\n cullFace: (gl: WebGL2RenderingContext, value) => gl.cullFace(value),\n\n depthTest: (gl: WebGL2RenderingContext, value) =>\n value ? gl.enable(GL.DEPTH_TEST) : gl.disable(GL.DEPTH_TEST),\n depthFunc: (gl: WebGL2RenderingContext, value) => gl.depthFunc(value),\n depthMask: (gl: WebGL2RenderingContext, value) => gl.depthMask(value),\n depthRange: (gl: WebGL2RenderingContext, value: [number, number]) => gl.depthRange(...value),\n\n dither: (gl: WebGL2RenderingContext, value) =>\n value ? gl.enable(GL.DITHER) : gl.disable(GL.DITHER),\n\n derivativeHint: (gl: WebGL2RenderingContext, value) => {\n // gl1: 'OES_standard_derivatives'\n gl.hint(GL.FRAGMENT_SHADER_DERIVATIVE_HINT, value);\n },\n\n frontFace: (gl: WebGL2RenderingContext, value) => gl.frontFace(value),\n\n mipmapHint: (gl: WebGL2RenderingContext, value) => gl.hint(GL.GENERATE_MIPMAP_HINT, value),\n\n lineWidth: (gl: WebGL2RenderingContext, value) => gl.lineWidth(value),\n\n polygonOffsetFill: (gl: WebGL2RenderingContext, value) =>\n value ? gl.enable(GL.POLYGON_OFFSET_FILL) : gl.disable(GL.POLYGON_OFFSET_FILL),\n polygonOffset: (gl: WebGL2RenderingContext, value: [number, number]) =>\n gl.polygonOffset(...value),\n\n sampleCoverage: (gl: WebGL2RenderingContext, value: [number, boolean?]) =>\n gl.sampleCoverage(value[0], value[1] || false),\n\n scissorTest: (gl: WebGL2RenderingContext, value) =>\n value ? gl.enable(GL.SCISSOR_TEST) : gl.disable(GL.SCISSOR_TEST),\n scissor: (gl: WebGL2RenderingContext, value: [number, number, number, number]) =>\n gl.scissor(...value),\n\n stencilTest: (gl: WebGL2RenderingContext, value) =>\n value ? gl.enable(GL.STENCIL_TEST) : gl.disable(GL.STENCIL_TEST),\n stencilMask: (gl: WebGL2RenderingContext, value) => {\n value = isArray(value) ? value : [value, value];\n const [mask, backMask] = value;\n gl.stencilMaskSeparate(GL.FRONT, mask);\n gl.stencilMaskSeparate(GL.BACK, backMask);\n },\n stencilFunc: (gl: WebGL2RenderingContext, args) => {\n args = isArray(args) && args.length === 3 ? [...args, ...args] : args;\n const [func, ref, mask, backFunc, backRef, backMask] = args;\n gl.stencilFuncSeparate(GL.FRONT, func, ref, mask);\n gl.stencilFuncSeparate(GL.BACK, backFunc, backRef, backMask);\n },\n stencilOp: (gl: WebGL2RenderingContext, args) => {\n args = isArray(args) && args.length === 3 ? [...args, ...args] : args;\n const [sfail, dpfail, dppass, backSfail, backDpfail, backDppass] = args;\n gl.stencilOpSeparate(GL.FRONT, sfail, dpfail, dppass);\n gl.stencilOpSeparate(GL.BACK, backSfail, backDpfail, backDppass);\n },\n\n viewport: (gl: WebGL2RenderingContext, value: [number, number, number, number]) =>\n gl.viewport(...value)\n};\n\nfunction getValue(glEnum, values, cache) {\n return values[glEnum] !== undefined ? values[glEnum] : cache[glEnum];\n}\n\n// COMPOSITE_WEBGL_PARAMETER_\nexport const GL_COMPOSITE_PARAMETER_SETTERS = {\n blendEquation: (gl: WebGL2RenderingContext, values, cache) =>\n gl.blendEquationSeparate(\n getValue(GL.BLEND_EQUATION_RGB, values, cache),\n getValue(GL.BLEND_EQUATION_ALPHA, values, cache)\n ),\n blendFunc: (gl: WebGL2RenderingContext, values, cache) =>\n gl.blendFuncSeparate(\n getValue(GL.BLEND_SRC_RGB, values, cache),\n getValue(GL.BLEND_DST_RGB, values, cache),\n getValue(GL.BLEND_SRC_ALPHA, values, cache),\n getValue(GL.BLEND_DST_ALPHA, values, cache)\n ),\n polygonOffset: (gl: WebGL2RenderingContext, values, cache) =>\n gl.polygonOffset(\n getValue(GL.POLYGON_OFFSET_FACTOR, values, cache),\n getValue(GL.POLYGON_OFFSET_UNITS, values, cache)\n ),\n sampleCoverage: (gl: WebGL2RenderingContext, values, cache) =>\n gl.sampleCoverage(\n getValue(GL.SAMPLE_COVERAGE_VALUE, values, cache),\n getValue(GL.SAMPLE_COVERAGE_INVERT, values, cache)\n ),\n stencilFuncFront: (gl: WebGL2RenderingContext, values, cache) =>\n gl.stencilFuncSeparate(\n GL.FRONT,\n getValue(GL.STENCIL_FUNC, values, cache),\n getValue(GL.STENCIL_REF, values, cache),\n getValue(GL.STENCIL_VALUE_MASK, values, cache)\n ),\n stencilFuncBack: (gl: WebGL2RenderingContext, values, cache) =>\n gl.stencilFuncSeparate(\n GL.BACK,\n getValue(GL.STENCIL_BACK_FUNC, values, cache),\n getValue(GL.STENCIL_BACK_REF, values, cache),\n getValue(GL.STENCIL_BACK_VALUE_MASK, values, cache)\n ),\n stencilOpFront: (gl: WebGL2RenderingContext, values, cache) =>\n gl.stencilOpSeparate(\n GL.FRONT,\n getValue(GL.STENCIL_FAIL, values, cache),\n getValue(GL.STENCIL_PASS_DEPTH_FAIL, values, cache),\n getValue(GL.STENCIL_PASS_DEPTH_PASS, values, cache)\n ),\n stencilOpBack: (gl: WebGL2RenderingContext, values, cache) =>\n gl.stencilOpSeparate(\n GL.BACK,\n getValue(GL.STENCIL_BACK_FAIL, values, cache),\n getValue(GL.STENCIL_BACK_PASS_DEPTH_FAIL, values, cache),\n getValue(GL.STENCIL_BACK_PASS_DEPTH_PASS, values, cache)\n )\n};\n\ntype UpdateFunc = (params: Record<string, any>) => void;\n\n// Setter functions intercepted for cache updates\nexport const GL_HOOKED_SETTERS = {\n // GENERIC SETTERS\n\n enable: (update: UpdateFunc, capability: GL) =>\n update({\n [capability]: true\n }),\n disable: (update: UpdateFunc, capability: GL) =>\n update({\n [capability]: false\n }),\n pixelStorei: (update: UpdateFunc, pname: GL, value) =>\n update({\n [pname]: value\n }),\n hint: (update: UpdateFunc, pname: GL, value: GL) =>\n update({\n [pname]: value\n }),\n\n // SPECIFIC SETTERS\n useProgram: (update: UpdateFunc, value) =>\n update({\n [GL.CURRENT_PROGRAM]: value\n }),\n bindRenderbuffer: (update: UpdateFunc, target, value) =>\n update({\n [GL.RENDERBUFFER_BINDING]: value\n }),\n bindTransformFeedback: (update: UpdateFunc, target, value) =>\n update({\n [GL.TRANSFORM_FEEDBACK_BINDING]: value\n }),\n bindVertexArray: (update: UpdateFunc, value) =>\n update({\n [GL.VERTEX_ARRAY_BINDING]: value\n }),\n\n bindFramebuffer: (update: UpdateFunc, target, framebuffer) => {\n switch (target) {\n case GL.FRAMEBUFFER:\n return update({\n [GL.DRAW_FRAMEBUFFER_BINDING]: framebuffer,\n [GL.READ_FRAMEBUFFER_BINDING]: framebuffer\n });\n case GL.DRAW_FRAMEBUFFER:\n return update({[GL.DRAW_FRAMEBUFFER_BINDING]: framebuffer});\n case GL.READ_FRAMEBUFFER:\n return update({[GL.READ_FRAMEBUFFER_BINDING]: framebuffer});\n default:\n return null;\n }\n },\n bindBuffer: (update: UpdateFunc, target, buffer) => {\n const pname = {\n [GL.ARRAY_BUFFER]: [GL.ARRAY_BUFFER_BINDING],\n [GL.COPY_READ_BUFFER]: [GL.COPY_READ_BUFFER_BINDING],\n [GL.COPY_WRITE_BUFFER]: [GL.COPY_WRITE_BUFFER_BINDING],\n [GL.PIXEL_PACK_BUFFER]: [GL.PIXEL_PACK_BUFFER_BINDING],\n [GL.PIXEL_UNPACK_BUFFER]: [GL.PIXEL_UNPACK_BUFFER_BINDING]\n }[target];\n\n if (pname) {\n return update({[pname]: buffer});\n }\n // targets that should not be cached\n return {valueChanged: true};\n },\n\n blendColor: (update: UpdateFunc, r: number, g: number, b: number, a: number) =>\n update({\n [GL.BLEND_COLOR]: new Float32Array([r, g, b, a])\n }),\n\n blendEquation: (update: UpdateFunc, mode) =>\n update({\n [GL.BLEND_EQUATION_RGB]: mode,\n [GL.BLEND_EQUATION_ALPHA]: mode\n }),\n\n blendEquationSeparate: (update: UpdateFunc, modeRGB, modeAlpha) =>\n update({\n [GL.BLEND_EQUATION_RGB]: modeRGB,\n [GL.BLEND_EQUATION_ALPHA]: modeAlpha\n }),\n\n blendFunc: (update: UpdateFunc, src, dst) =>\n update({\n [GL.BLEND_SRC_RGB]: src,\n [GL.BLEND_DST_RGB]: dst,\n [GL.BLEND_SRC_ALPHA]: src,\n [GL.BLEND_DST_ALPHA]: dst\n }),\n\n blendFuncSeparate: (update: UpdateFunc, srcRGB, dstRGB, srcAlpha, dstAlpha) =>\n update({\n [GL.BLEND_SRC_RGB]: srcRGB,\n [GL.BLEND_DST_RGB]: dstRGB,\n [GL.BLEND_SRC_ALPHA]: srcAlpha,\n [GL.BLEND_DST_ALPHA]: dstAlpha\n }),\n\n clearColor: (update: UpdateFunc, r: number, g: number, b: number, a: number) =>\n update({\n [GL.COLOR_CLEAR_VALUE]: new Float32Array([r, g, b, a])\n }),\n\n clearDepth: (update: UpdateFunc, depth: number) =>\n update({\n [GL.DEPTH_CLEAR_VALUE]: depth\n }),\n\n clearStencil: (update: UpdateFunc, s: number) =>\n update({\n [GL.STENCIL_CLEAR_VALUE]: s\n }),\n\n colorMask: (update: UpdateFunc, r: number, g: number, b: number, a: number) =>\n update({\n [GL.COLOR_WRITEMASK]: [r, g, b, a]\n }),\n\n cullFace: (update: UpdateFunc, mode) =>\n update({\n [GL.CULL_FACE_MODE]: mode\n }),\n\n depthFunc: (update: UpdateFunc, func) =>\n update({\n [GL.DEPTH_FUNC]: func\n }),\n\n depthRange: (update: UpdateFunc, zNear: number, zFar: number) =>\n update({\n [GL.DEPTH_RANGE]: new Float32Array([zNear, zFar])\n }),\n\n depthMask: (update: UpdateFunc, mask: number) =>\n update({\n [GL.DEPTH_WRITEMASK]: mask\n }),\n\n frontFace: (update: UpdateFunc, face) =>\n update({\n [GL.FRONT_FACE]: face\n }),\n\n lineWidth: (update: UpdateFunc, width) =>\n update({\n [GL.LINE_WIDTH]: width\n }),\n\n polygonOffset: (update: UpdateFunc, factor, units) =>\n update({\n [GL.POLYGON_OFFSET_FACTOR]: factor,\n [GL.POLYGON_OFFSET_UNITS]: units\n }),\n\n sampleCoverage: (update: UpdateFunc, value, invert) =>\n update({\n [GL.SAMPLE_COVERAGE_VALUE]: value,\n [GL.SAMPLE_COVERAGE_INVERT]: invert\n }),\n\n scissor: (update: UpdateFunc, x, y, width, height) =>\n update({\n [GL.SCISSOR_BOX]: new Int32Array([x, y, width, height])\n }),\n\n stencilMask: (update: UpdateFunc, mask) =>\n update({\n [GL.STENCIL_WRITEMASK]: mask,\n [GL.STENCIL_BACK_WRITEMASK]: mask\n }),\n\n stencilMaskSeparate: (update: UpdateFunc, face, mask) =>\n update({\n [face === GL.FRONT ? GL.STENCIL_WRITEMASK : GL.STENCIL_BACK_WRITEMASK]: mask\n }),\n\n stencilFunc: (update: UpdateFunc, func, ref, mask) =>\n update({\n [GL.STENCIL_FUNC]: func,\n [GL.STENCIL_REF]: ref,\n [GL.STENCIL_VALUE_MASK]: mask,\n [GL.STENCIL_BACK_FUNC]: func,\n [GL.STENCIL_BACK_REF]: ref,\n [GL.STENCIL_BACK_VALUE_MASK]: mask\n }),\n\n stencilFuncSeparate: (update: UpdateFunc, face, func, ref, mask) =>\n update({\n [face === GL.FRONT ? GL.STENCIL_FUNC : GL.STENCIL_BACK_FUNC]: func,\n [face === GL.FRONT ? GL.STENCIL_REF : GL.STENCIL_BACK_REF]: ref,\n [face === GL.FRONT ? GL.STENCIL_VALUE_MASK : GL.STENCIL_BACK_VALUE_MASK]: mask\n }),\n\n stencilOp: (update: UpdateFunc, fail, zfail, zpass) =>\n update({\n [GL.STENCIL_FAIL]: fail,\n [GL.STENCIL_PASS_DEPTH_FAIL]: zfail,\n [GL.STENCIL_PASS_DEPTH_PASS]: zpass,\n [GL.STENCIL_BACK_FAIL]: fail,\n [GL.STENCIL_BACK_PASS_DEPTH_FAIL]: zfail,\n [GL.STENCIL_BACK_PASS_DEPTH_PASS]: zpass\n }),\n\n stencilOpSeparate: (update: UpdateFunc, face, fail, zfail, zpass) =>\n update({\n [face === GL.FRONT ? GL.STENCIL_FAIL : GL.STENCIL_BACK_FAIL]: fail,\n [face === GL.FRONT ? GL.STENCIL_PASS_DEPTH_FAIL : GL.STENCIL_BACK_PASS_DEPTH_FAIL]: zfail,\n [face === GL.FRONT ? GL.STENCIL_PASS_DEPTH_PASS : GL.STENCIL_BACK_PASS_DEPTH_PASS]: zpass\n }),\n\n viewport: (update: UpdateFunc, x, y, width, height) =>\n update({\n [GL.VIEWPORT]: [x, y, width, height]\n })\n};\n\n// GETTER TABLE - FOR READING OUT AN ENTIRE CONTEXT\n\nconst isEnabled = (gl: WebGL2RenderingContext, key) => gl.isEnabled(key);\n\n// Exceptions for any keys that cannot be queried by gl.getParameters\nexport const GL_PARAMETER_GETTERS = {\n [GL.BLEND]: isEnabled,\n [GL.CULL_FACE]: isEnabled,\n [GL.DEPTH_TEST]: isEnabled,\n [GL.DITHER]: isEnabled,\n [GL.POLYGON_OFFSET_FILL]: isEnabled,\n [GL.SAMPLE_ALPHA_TO_COVERAGE]: isEnabled,\n [GL.SAMPLE_COVERAGE]: isEnabled,\n [GL.SCISSOR_TEST]: isEnabled,\n [GL.STENCIL_TEST]: isEnabled,\n [GL.RASTERIZER_DISCARD]: isEnabled\n};\n\nexport const NON_CACHE_PARAMETERS = new Set([\n // setter not intercepted\n GL.ACTIVE_TEXTURE,\n GL.TRANSFORM_FEEDBACK_ACTIVE,\n GL.TRANSFORM_FEEDBACK_PAUSED,\n\n // setters bindBufferRange/bindBufferBase cannot be pruned based on cache\n GL.TRANSFORM_FEEDBACK_BUFFER_BINDING,\n GL.UNIFORM_BUFFER_BINDING,\n\n // states depending on VERTEX_ARRAY_BINDING\n GL.ELEMENT_ARRAY_BUFFER_BINDING,\n // states depending on READ_FRAMEBUFFER_BINDING\n GL.IMPLEMENTATION_COLOR_READ_FORMAT,\n GL.IMPLEMENTATION_COLOR_READ_TYPE,\n // states depending on FRAMEBUFFER_BINDING\n GL.READ_BUFFER,\n GL.DRAW_BUFFER0,\n GL.DRAW_BUFFER1,\n GL.DRAW_BUFFER2,\n GL.DRAW_BUFFER3,\n GL.DRAW_BUFFER4,\n GL.DRAW_BUFFER5,\n GL.DRAW_BUFFER6,\n GL.DRAW_BUFFER7,\n GL.DRAW_BUFFER8,\n GL.DRAW_BUFFER9,\n GL.DRAW_BUFFER10,\n GL.DRAW_BUFFER11,\n GL.DRAW_BUFFER12,\n GL.DRAW_BUFFER13,\n GL.DRAW_BUFFER14,\n GL.DRAW_BUFFER15,\n // states depending on ACTIVE_TEXTURE\n GL.SAMPLER_BINDING,\n GL.TEXTURE_BINDING_2D,\n GL.TEXTURE_BINDING_2D_ARRAY,\n GL.TEXTURE_BINDING_3D,\n GL.TEXTURE_BINDING_CUBE_MAP\n]);\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Provides a unified API for getting and setting any WebGL parameter\n// Also knows default values of all parameters, enabling fast cache initialization\n// Provides base functionality for the state caching.\nimport type {GLParameters} from '@luma.gl/constants';\nimport {\n GL_PARAMETER_DEFAULTS,\n GL_PARAMETER_SETTERS,\n GL_COMPOSITE_PARAMETER_SETTERS,\n GL_PARAMETER_GETTERS\n} from './webgl-parameter-tables';\n\nexport type {GLParameters};\n\n/**\n * Sets any GL parameter regardless of function (gl.blendMode, ...)\n *\n * @note requires a `cache` object to be set on the context (gl.state.cache)\n * This object is used to fill in any missing values for composite setter functions\n */\nexport function setGLParameters(gl: WebGL2RenderingContext, parameters: GLParameters): void {\n if (isObjectEmpty(parameters)) {\n return;\n }\n\n const compositeSetters = {};\n\n // HANDLE PRIMITIVE SETTERS (and make note of any composite setters)\n\n for (const key in parameters) {\n const glConstant = Number(key);\n const setter = GL_PARAMETER_SETTERS[key];\n if (setter) {\n // Composite setters should only be called once, so save them\n if (typeof setter === 'string') {\n compositeSetters[setter] = true;\n } else {\n // if (gl[glConstant] !== undefined) {\n // TODO - added above check since this is being called on WebGL2 parameters in WebGL1...\n // TODO - deep equal on values? only call setter if value has changed?\n // NOTE - the setter will automatically update this.state\n setter(gl, parameters[key], glConstant);\n }\n }\n }\n\n // HANDLE COMPOSITE SETTERS\n\n // NOTE: any non-provided values needed by composite setters are filled in from state cache\n // The cache parameter is automatically retrieved from the context\n // This depends on `trackContextState`, which is technically a \"circular\" dependency.\n // But it is too inconvenient to always require a cache parameter here.\n // This is the ONLY external dependency in this module/\n // @ts-expect-error\n const cache = gl.state && gl.state.cache;\n if (cache) {\n for (const key in compositeSetters) {\n // TODO - avoid calling composite setters if values have not changed.\n const compositeSetter = GL_COMPOSITE_PARAMETER_SETTERS[key];\n // Note - if `trackContextState` has been called,\n // the setter will automatically update this.state.cache\n compositeSetter(gl, parameters, cache);\n }\n }\n\n // Add a log for the else case?\n}\n\n/**\n * Reads the entire WebGL state from a context\n\n // default to querying all parameters\n\n * @returns - a newly created map, with values keyed by GL parameters\n *\n * @note Copies the state from a context (gl.getParameter should not be overriden)\n * Reads the entire WebGL state from a context\n *\n * @note This can generates a huge amount of synchronous driver roundtrips and should be\n * considered a very slow operation, to be used only if/when a context already manipulated\n * by external code needs to be synchronized for the first time\n */\nexport function getGLParameters(\n gl: WebGL2RenderingContext,\n parameters: keyof GLParameters | (keyof GLParameters)[] | GLParameters = GL_PARAMETER_DEFAULTS\n): GLParameters {\n // support both arrays of parameters and objects (keys represent parameters)\n\n if (typeof parameters === 'number') {\n // single GL enum\n const key = parameters;\n const getter = GL_PARAMETER_GETTERS[key];\n return getter ? getter(gl, key) : gl.getParameter(key);\n }\n\n const parameterKeys = Array.isArray(parameters) ? parameters : Object.keys(parameters);\n\n const state = {};\n for (const key of parameterKeys) {\n const getter = GL_PARAMETER_GETTERS[key];\n state[key] = getter ? getter(gl, Number(key)) : gl.getParameter(Number(key));\n }\n return state;\n}\n\n/**\n * Reset all parameters to a (almost) pure context state\n * @note viewport and scissor will be set to the values in GL_PARAMETER_DEFAULTS,\n * NOT the canvas size dimensions, so they will have to be properly set after\n * calling this function.\n */\nexport function resetGLParameters(gl: WebGL2RenderingContext): void {\n setGLParameters(gl, GL_PARAMETER_DEFAULTS);\n}\n\n// Helpers\n\n// Returns true if given object is empty, false otherwise.\nfunction isObjectEmpty(object) {\n // @ts-ignore dummy key variable\n for (const key in object) {\n return false;\n }\n return true;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/** deeply compare two arrays */\nexport function deepArrayEqual(x: any, y: any): boolean {\n if (x === y) {\n return true;\n }\n const isArrayX = Array.isArray(x) || ArrayBuffer.isView(x);\n const isArrayY = Array.isArray(y) || ArrayBuffer.isView(y);\n // @ts-expect-error TODO fix\n if (isArrayX && isArrayY && x.length === y.length) {\n // @ts-expect-error TODO fix\n for (let i = 0; i < x.length; ++i) {\n if (x[i] !== y[i]) {\n return false;\n }\n }\n return true;\n }\n return false;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {setGLParameters, getGLParameters} from '../parameters/unified-parameter-api';\nimport {deepArrayEqual} from './deep-array-equal';\nimport {\n GL_PARAMETER_DEFAULTS,\n GL_HOOKED_SETTERS,\n NON_CACHE_PARAMETERS\n} from '../parameters/webgl-parameter-tables';\n\n// HELPER CLASS - WebGLStateTracker\n\n/**\n * Support for listening to context state changes and intercepting state queries\n * NOTE: this system does not handle buffer bindings\n */\nexport class WebGLStateTracker {\n static get(gl: WebGL2RenderingContext): WebGLStateTracker {\n // @ts-expect-error\n return gl.state as WebGLStateTracker;\n }\n\n gl: WebGL2RenderingContext;\n program: unknown = null;\n stateStack: object[] = [];\n enable = true;\n cache: Record<string, any> = null!;\n log;\n\n protected initialized = false;\n\n constructor(\n gl: WebGL2RenderingContext,\n props?: {\n log; // Logging function, called when gl parameter change calls are actually issued\n }\n ) {\n this.gl = gl;\n this.log = props?.log || (() => {});\n\n this._updateCache = this._updateCache.bind(this);\n Object.seal(this);\n }\n\n push(values = {}) {\n this.stateStack.push({});\n }\n\n pop() {\n // assert(this.stateStack.length > 0);\n // Use the saved values in the state stack to restore parameters\n const oldValues = this.stateStack[this.stateStack.length - 1];\n setGLParameters(this.gl, oldValues);\n // Don't pop until we have reset parameters (to make sure other \"stack frames\" are not affected)\n this.stateStack.pop();\n }\n\n /**\n * Initialize WebGL state caching on a context\n * can be called multiple times to enable/disable\n *\n * @note After calling this function, context state will be cached\n * .push() and .pop() will be available for saving,\n * temporarily modifying, and then restoring state.\n */\n trackState(gl: WebGL2RenderingContext, options?: {copyState?: boolean}): void {\n this.cache = options.copyState ? getGLParameters(gl) : Object.assign({}, GL_PARAMETER_DEFAULTS);\n\n if (this.initialized) {\n throw new Error('WebGLStateTracker');\n }\n this.initialized = true;\n\n // @ts-expect-error\n this.gl.state = this;\n\n installProgramSpy(gl);\n\n // intercept all setter functions in the table\n for (const key in GL_HOOKED_SETTERS) {\n const setter = GL_HOOKED_SETTERS[key];\n installSetterSpy(gl, key, setter);\n }\n\n // intercept all getter functions in the table\n installGetterOverride(gl, 'getParameter');\n installGetterOverride(gl, 'isEnabled');\n }\n\n /**\n // interceptor for context set functions - update our cache and our stack\n // values (Object) - the key values for this setter\n * @param values\n * @returns\n */\n _updateCache(values: {[key: number | string]: any}) {\n let valueChanged = false;\n let oldValue; // = undefined\n\n const oldValues: {[key: number | string]: any} | null =\n this.stateStack.length > 0 ? this.stateStack[this.stateStack.length - 1] : null;\n\n for (const key in values) {\n // assert(key !== undefined);\n const value = values[key];\n const cached = this.cache[key];\n // Check that value hasn't already been shadowed\n if (!deepArrayEqual(value, cached)) {\n valueChanged = true;\n oldValue = cached;\n\n // First, save current value being shadowed\n // If a state stack frame is active, save the current parameter values for pop\n // but first check that value hasn't already been shadowed and saved\n if (oldValues && !(key in oldValues)) {\n oldValues[key] = cached;\n }\n\n // Save current value being shadowed\n this.cache[key] = value;\n }\n }\n\n return {valueChanged, oldValue};\n }\n}\n\n// HELPER FUNCTIONS - INSTALL GET/SET INTERCEPTORS (SPYS) ON THE CONTEXT\n\n/**\n// Overrides a WebGL2RenderingContext state \"getter\" function\n// to return values directly from cache\n * @param gl\n * @param functionName\n */\nfunction installGetterOverride(gl: WebGL2RenderingContext, functionName: string) {\n // Get the original function from the WebGL2RenderingContext\n const originalGetterFunc = gl[functionName].bind(gl);\n\n // Wrap it with a spy so that we can update our state cache when it gets called\n gl[functionName] = function get(pname) {\n if (pname === undefined || NON_CACHE_PARAMETERS.has(pname)) {\n // Invalid or blacklisted parameter, do not cache\n return originalGetterFunc(pname);\n }\n\n const glState = WebGLStateTracker.get(gl);\n if (!(pname in glState.cache)) {\n // WebGL limits are not prepopulated in the cache, call the original getter when first queried.\n glState.cache[pname] = originalGetterFunc(pname);\n }\n\n // Optionally call the original function to do a \"hard\" query from the WebGL2RenderingContext\n return glState.enable\n ? // Call the getter the params so that it can e.g. serve from a cache\n glState.cache[pname]\n : // Optionally call the original function to do a \"hard\" query from the WebGL2RenderingContext\n originalGetterFunc(pname);\n };\n\n // Set the name of this anonymous function to help in debugging and profiling\n Object.defineProperty(gl[functionName], 'name', {\n value: `${functionName}-from-cache`,\n configurable: false\n });\n}\n\n/**\n// Overrides a WebGL2RenderingContext state \"setter\" function\n// to call a setter spy before the actual setter. Allows us to keep a cache\n// updated with a copy of the WebGL context state.\n * @param gl\n * @param functionName\n * @param setter\n * @returns\n */\nfunction installSetterSpy(gl: WebGL2RenderingContext, functionName: string, setter: Function) {\n // Get the original function from the WebGL2RenderingContext\n if (!gl[functionName]) {\n // TODO - remove?\n // This could happen if we try to intercept WebGL2 method on a WebGL1 context\n return;\n }\n\n const originalSetterFunc = gl[functionName].bind(gl);\n\n // Wrap it with a spy so that we can update our state cache when it gets called\n gl[functionName] = function set(...params) {\n // Update the value\n // Call the setter with the state cache and the params so that it can store the parameters\n const glState = WebGLStateTracker.get(gl);\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const {valueChanged, oldValue} = setter(glState._updateCache, ...params);\n\n // Call the original WebGL2RenderingContext func to make sure the context actually gets updated\n if (valueChanged) {\n originalSetterFunc(...params);\n }\n\n // Note: if the original function fails to set the value, our state cache will be bad\n // No solution for this at the moment, but assuming that this is unlikely to be a real problem\n // We could call the setter after the originalSetterFunc. Concern is that this would\n // cause different behavior in debug mode, where originalSetterFunc can throw exceptions\n\n return oldValue;\n };\n\n // Set the name of this anonymous function to help in debugging and profiling\n Object.defineProperty(gl[functionName], 'name', {\n value: `${functionName}-to-cache`,\n configurable: false\n });\n}\n\nfunction installProgramSpy(gl: WebGL2RenderingContext): void {\n const originalUseProgram = gl.useProgram.bind(gl);\n\n gl.useProgram = function useProgramLuma(handle) {\n const glState = WebGLStateTracker.get(gl);\n if (glState.program !== handle) {\n originalUseProgram(handle);\n glState.program = handle;\n }\n };\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/**\n * ContextProps\n * @param onContextLost\n * @param onContextRestored *\n */\ntype ContextProps = {\n /** Called when a context is lost */\n onContextLost: (event: Event) => void;\n /** Called when a context is restored */\n onContextRestored: (event: Event) => void;\n};\n\n/**\n * Create a WebGL context for a canvas\n * Note calling this multiple time on the same canvas does return the same context\n * @param canvas A canvas element or offscreen canvas\n */\nexport function createBrowserContext(\n canvas: HTMLCanvasElement | OffscreenCanvas,\n props: ContextProps,\n webglContextAttributes: WebGLContextAttributes\n): WebGL2RenderingContext {\n // Try to extract any extra information about why context creation failed\n let errorMessage = '';\n // const onCreateError = error => (errorMessage = error.statusMessage || errorMessage);\n\n // Avoid multiple listeners?\n // canvas.removeEventListener('webglcontextcreationerror', onCreateError, false);\n // canvas.addEventListener('webglcontextcreationerror', onCreateError, false);\n\n const webglProps: WebGLContextAttributes = {\n preserveDrawingBuffer: true,\n // failIfMajorPerformanceCaveat: true,\n ...webglContextAttributes\n };\n\n // Create the desired context\n let gl: WebGL2RenderingContext | null = null;\n\n // Create a webgl2 context\n gl ||= canvas.getContext('webgl2', webglProps);\n if (webglProps.failIfMajorPerformanceCaveat) {\n errorMessage ||=\n 'Only software GPU is available. Set `failIfMajorPerformanceCaveat: false` to allow.';\n }\n\n // Creation failed with failIfMajorPerformanceCaveat - Try a Software GPU\n if (!gl && !webglContextAttributes.failIfMajorPerformanceCaveat) {\n webglProps.failIfMajorPerformanceCaveat = false;\n gl = canvas.getContext('webgl2', webglProps);\n // @ts-expect-error\n gl.luma ||= {};\n // @ts-expect-error\n gl.luma.softwareRenderer = true;\n }\n\n if (!gl) {\n gl = canvas.getContext('webgl', {}) as WebGL2RenderingContext;\n if (gl) {\n gl = null;\n errorMessage ||= 'Your browser only supports WebGL1';\n }\n }\n\n if (!gl) {\n errorMessage ||= 'Your browser does not support WebGL';\n throw new Error(`Failed to create WebGL context: ${errorMessage}`);\n }\n\n // Carefully extract and wrap callbacks to prevent addEventListener from rebinding them.\n const {onContextLost, onContextRestored} = props;\n canvas.addEventListener('webglcontextlost', (event: Event) => onContextLost(event), false);\n canvas.addEventListener(\n 'webglcontextrestored',\n (event: Event) => onContextRestored(event),\n false\n );\n\n // @ts-expect-error\n gl.luma ||= {};\n return gl;\n}\n\n/* TODO - can we call this asynchronously to catch the error events?\nexport async function createBrowserContextAsync(canvas: HTMLCanvasElement | OffscreenCanvas, props: ContextProps): Promise<WebGL2RenderingContext> {\n props = {...DEFAULT_CONTEXT_PROPS, ...props};\n\n // Try to extract any extra information about why context creation failed\n let errorMessage = null;\n const onCreateError = (error) => (errorMessage = error.statusMessage || errorMessage);\n canvas.addEventListener('webglcontextcreationerror', onCreateError, false);\n\n const gl = createBrowserContext(canvas, props);\n\n // Give the listener a chance to fire\n await new Promise(resolve => setTimeout(resolve, 0));\n\n canvas.removeEventListener('webglcontextcreationerror', onCreateError, false);\n\n return gl;\n}\n*/\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {DeviceInfo} from '@luma.gl/core';\nimport {GL, GLExtensions} from '@luma.gl/constants';\nimport {getWebGLExtension} from '../../context/helpers/webgl-extensions';\n\n/** @returns strings identifying the GPU vendor and driver. */\nexport function getDeviceInfo(gl: WebGL2RenderingContext, extensions: GLExtensions): DeviceInfo {\n // \"Masked\" info is always available, but don't contain much useful information\n const vendorMasked = gl.getParameter(GL.VENDOR);\n const rendererMasked = gl.getParameter(GL.RENDERER);\n\n // If we are lucky, unmasked info is available\n // https://www.khronos.org/registry/webgl/extensions/WEBGL_debug_renderer_info/\n getWebGLExtension(gl, 'WEBGL_debug_renderer_info', extensions);\n const ext = extensions.WEBGL_debug_renderer_info;\n const vendorUnmasked = gl.getParameter(ext ? ext.UNMASKED_VENDOR_WEBGL : GL.VENDOR);\n const rendererUnmasked = gl.getParameter(ext ? ext.UNMASKED_RENDERER_WEBGL : GL.RENDERER);\n const vendor = vendorUnmasked || vendorMasked;\n const renderer = rendererUnmasked || rendererMasked;\n\n // Driver version\n const version = gl.getParameter(GL.VERSION) as string;\n\n // \"Sniff\" the GPU type and backend from the info. This works best if unmasked info is available.\n const gpu = identifyGPUVendor(vendor, renderer);\n const gpuBackend = identifyGPUBackend(vendor, renderer);\n const gpuType = identifyGPUType(vendor, renderer);\n\n // Determine GLSL version\n // For now, skip parsing of the long version string, just use context type below to deduce version\n // const version = gl.getParameter(GL.SHADING_LANGUAGE_VERSION) as string;\n // const shadingLanguageVersion = parseGLSLVersion(version);\n const shadingLanguage = 'glsl';\n const shadingLanguageVersion = 300;\n\n return {\n type: 'webgl',\n gpu,\n gpuType,\n gpuBackend,\n vendor,\n renderer,\n version,\n shadingLanguage,\n shadingLanguageVersion\n };\n}\n\n/** \"Sniff\" the GPU type from the info. This works best if unmasked info is available. */\nfunction identifyGPUVendor(\n vendor: string,\n renderer: string\n): 'nvidia' | 'intel' | 'apple' | 'amd' | 'software' | 'unknown' {\n if (/NVIDIA/i.exec(vendor) || /NVIDIA/i.exec(renderer)) {\n return 'nvidia';\n }\n if (/INTEL/i.exec(vendor) || /INTEL/i.exec(renderer)) {\n return 'intel';\n }\n if (/Apple/i.exec(vendor) || /Apple/i.exec(renderer)) {\n return 'apple';\n }\n if (\n /AMD/i.exec(vendor) ||\n /AMD/i.exec(renderer) ||\n /ATI/i.exec(vendor) ||\n /ATI/i.exec(renderer)\n ) {\n return 'amd';\n }\n if (/SwiftShader/i.exec(vendor) || /SwiftShader/i.exec(renderer)) {\n return 'software';\n }\n\n return 'unknown';\n}\n\n/** \"Sniff\" the GPU backend from the info. This works best if unmasked info is available. */\nfunction identifyGPUBackend(vendor: string, renderer: string): 'opengl' | 'metal' | 'unknown' {\n if (/Metal/i.exec(vendor) || /Metal/i.exec(renderer)) {\n return 'metal';\n }\n if (/ANGLE/i.exec(vendor) || /ANGLE/i.exec(renderer)) {\n return 'opengl';\n }\n return 'unknown';\n}\n\nfunction identifyGPUType(\n vendor: string,\n renderer: string\n): 'discrete' | 'integrated' | 'cpu' | 'unknown' {\n if (/SwiftShader/i.exec(vendor) || /SwiftShader/i.exec(renderer)) {\n return 'cpu';\n }\n\n const gpuVendor = identifyGPUVendor(vendor, renderer);\n switch (gpuVendor) {\n case 'intel':\n return 'integrated';\n case 'software':\n return 'cpu';\n case 'unknown':\n return 'unknown';\n default:\n return 'discrete';\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {GLExtensions} from '@luma.gl/constants';\n\n/** Ensure extensions are only requested once */\nexport function getWebGLExtension(\n gl: WebGL2RenderingContext,\n name: string,\n extensions: GLExtensions\n): unknown {\n if (extensions[name] === undefined) {\n extensions[name] = gl.getExtension(name) || null;\n }\n return extensions[name];\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Feature detection for WebGL\n// Provides a function that enables simple checking of which WebGL features are\n\nimport {DeviceFeature, DeviceFeatures} from '@luma.gl/core';\nimport {GLExtensions} from '@luma.gl/constants';\nimport {getWebGLExtension} from '../../context/helpers/webgl-extensions';\nimport {\n isTextureFeature,\n checkTextureFeature,\n TEXTURE_FEATURES\n} from '../converters/webgl-texture-table';\n\n/**\n * Defines luma.gl \"feature\" names and semantics\n * when value is 'string' it is the name of the extension that enables this feature\n */\nconst WEBGL_FEATURES: Partial<Record<DeviceFeature, boolean | string>> = {\n // optional WebGPU features\n 'depth-clip-control': 'EXT_depth_clamp', // TODO these seem subtly different\n // 'timestamp-query' // GPUQueryType \"timestamp-query\"\n // \"indirect-first-instance\"\n // Textures are handled by getTextureFeatures()\n // 'depth32float-stencil8' // GPUTextureFormat 'depth32float-stencil8'\n\n // optional WebGL features\n 'timer-query-webgl': 'EXT_disjoint_timer_query_webgl2',\n 'compilation-status-async-webgl': 'KHR_parallel_shader_compile',\n 'polygon-mode-webgl': 'WEBGL_polygon_mode',\n 'provoking-vertex-webgl': 'WEBGL_provoking_vertex',\n 'shader-clip-cull-distance-webgl': 'WEBGL_clip_cull_distance',\n 'shader-noperspective-interpolation-webgl': 'NV_shader_noperspective_interpolation',\n 'shader-conservative-depth-webgl': 'EXT_conservative_depth'\n\n // Textures are handled by getTextureFeatures()\n};\n\n/**\n * WebGL extensions exposed as luma.gl features\n * To minimize GL log noise and improve performance, this class ensures that\n * - WebGL extensions are not queried until the corresponding feature is checked.\n * - WebGL extensions are only queried once.\n */\nexport class WebGLDeviceFeatures extends DeviceFeatures {\n protected gl: WebGL2RenderingContext;\n protected extensions: GLExtensions;\n protected testedFeatures = new Set<DeviceFeature>();\n\n constructor(\n gl: WebGL2RenderingContext,\n extensions: GLExtensions,\n disabledFeatures: Partial<Record<DeviceFeature, boolean>>\n ) {\n super([], disabledFeatures);\n this.gl = gl;\n this.extensions = extensions;\n // TODO - is this really needed?\n // Enable EXT_float_blend first: https://developer.mozilla.org/en-US/docs/Web/API/EXT_float_blend\n getWebGLExtension(gl, 'EXT_color_buffer_float', extensions);\n }\n\n *[Symbol.iterator](): IterableIterator<DeviceFeature> {\n const features = this.getFeatures();\n for (const feature of features) {\n if (this.has(feature)) {\n yield feature;\n }\n }\n return [];\n }\n\n override has(feature: DeviceFeature): boolean {\n if (this.disabledFeatures?.[feature]) {\n return false;\n }\n\n // We have already tested this feature\n if (!this.testedFeatures.has(feature)) {\n this.testedFeatures.add(feature);\n\n // Check the feature once\n if (isTextureFeature(feature) && checkTextureFeature(this.gl, feature, this.extensions)) {\n this.features.add(feature);\n }\n\n if (this.getWebGLFeature(feature)) {\n this.features.add(feature);\n }\n }\n return this.features.has(feature);\n }\n\n // FOR DEVICE\n\n initializeFeatures() {\n // Initialize all features by checking them.\n // Except WEBGL_polygon_mode since Chrome logs ugly console warnings\n const features = this.getFeatures().filter(feature => feature !== 'polygon-mode-webgl');\n for (const feature of features) {\n this.has(feature);\n }\n }\n\n // IMPLEMENTATION\n\n getFeatures() {\n return [...Object.keys(WEBGL_FEATURES), ...Object.keys(TEXTURE_FEATURES)] as DeviceFeature[];\n }\n\n /** Extract all WebGL features */\n protected getWebGLFeature(feature: DeviceFeature): boolean {\n const featureInfo = WEBGL_FEATURES[feature];\n // string value requires checking the corresponding WebGL extension\n const isSupported =\n typeof featureInfo === 'string'\n ? Boolean(getWebGLExtension(this.gl, featureInfo, this.extensions))\n : Boolean(featureInfo);\n\n return isSupported;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {\n DeviceFeature,\n TextureFormat,\n TextureFormatCapabilities,\n DeviceTextureFormatCapabilities\n} from '@luma.gl/core';\nimport {decodeTextureFormat} from '@luma.gl/core';\nimport {GL, GLPixelType, GLExtensions, GLTexelDataFormat} from '@luma.gl/constants';\nimport {getWebGLExtension} from '../../context/helpers/webgl-extensions';\nimport {getGLFromVertexType} from './vertex-formats';\n\n/* eslint-disable camelcase */\n\n// TEXTURE FEATURES\n\n// Define local webgl extension strings to optimize minification\nconst X_S3TC = 'WEBGL_compressed_texture_s3tc'; // BC1, BC2, BC3\nconst X_S3TC_SRGB = 'WEBGL_compressed_texture_s3tc_srgb'; // BC1, BC2, BC3\nconst X_RGTC = 'EXT_texture_compression_rgtc'; // BC4, BC5\nconst X_BPTC = 'EXT_texture_compression_bptc'; // BC6, BC7\nconst X_ETC2 = 'WEBGL_compressed_texture_etc'; // Renamed from 'WEBGL_compressed_texture_es3'\nconst X_ASTC = 'WEBGL_compressed_texture_astc';\nconst X_ETC1 = 'WEBGL_compressed_texture_etc1';\nconst X_PVRTC = 'WEBGL_compressed_texture_pvrtc';\nconst X_ATC = 'WEBGL_compressed_texture_atc';\n\n// Define local webgl extension strings to optimize minification\nconst EXT_texture_norm16 = 'EXT_texture_norm16';\nconst EXT_render_snorm = 'EXT_render_snorm';\nconst EXT_color_buffer_float = 'EXT_color_buffer_float';\n\n// prettier-ignore\nexport const TEXTURE_FEATURES: Partial<Record<DeviceFeature, string[]>> = {\n 'float32-renderable-webgl': ['EXT_color_buffer_float'],\n 'float16-renderable-webgl': ['EXT_color_buffer_half_float'],\n 'rgb9e5ufloat-renderable-webgl': ['WEBGL_render_shared_exponent'],\n 'snorm8-renderable-webgl': [EXT_render_snorm],\n 'norm16-renderable-webgl': [EXT_texture_norm16],\n 'snorm16-renderable-webgl': [EXT_texture_norm16, EXT_render_snorm],\n\n 'float32-filterable': ['OES_texture_float_linear'],\n 'float16-filterable-webgl': ['OES_texture_half_float_linear'],\n 'texture-filterable-anisotropic-webgl': ['EXT_texture_filter_anisotropic'],\n\n 'texture-blend-float-webgl': ['EXT_float_blend'],\n\n 'texture-compression-bc': [X_S3TC, X_S3TC_SRGB, X_RGTC, X_BPTC],\n // 'texture-compression-bc3-srgb-webgl': [X_S3TC_SRGB],\n // 'texture-compression-bc3-webgl': [X_S3TC],\n 'texture-compression-bc5-webgl': [X_RGTC],\n 'texture-compression-bc7-webgl': [X_BPTC],\n 'texture-compression-etc2': [X_ETC2],\n 'texture-compression-astc': [X_ASTC],\n 'texture-compression-etc1-webgl': [X_ETC1],\n 'texture-compression-pvrtc-webgl': [X_PVRTC],\n 'texture-compression-atc-webgl': [X_ATC]\n};\n\nexport function isTextureFeature(feature: DeviceFeature): boolean {\n return feature in TEXTURE_FEATURES;\n}\n\n/** Checks a texture feature (for Device.features). Mainly compressed texture support */\nexport function checkTextureFeature(\n gl: WebGL2RenderingContext,\n feature: DeviceFeature,\n extensions: GLExtensions\n): boolean {\n const textureExtensions = TEXTURE_FEATURES[feature] || [];\n return textureExtensions.every(extension => getWebGLExtension(gl, extension, extensions));\n}\n\n// TEXTURE FORMATS\n\n/** Map a format to webgl and constants */\ntype WebGLFormatInfo = {\n gl?: GL;\n /** compressed */\n x?: string;\n types?: GLPixelType[];\n dataFormat?: GLTexelDataFormat;\n /** if depthTexture is set this is a depth/stencil format that can be set to a texture */\n depthTexture?: boolean;\n /** @deprecated can this format be used with renderbuffers */\n rb?: boolean;\n};\n\n// TABLES\n\n/**\n * Texture format data -\n * Exported but can change without notice\n */\n// prettier-ignore\nexport const WEBGL_TEXTURE_FORMATS: Record<TextureFormat, WebGLFormatInfo> = {\n // 8-bit formats\n 'r8unorm': {gl: GL.R8, rb: true},\n 'r8snorm': {gl: GL.R8_SNORM},\n 'r8uint': {gl: GL.R8UI, rb: true},\n 'r8sint': {gl: GL.R8I, rb: true},\n\n // 16-bit formats\n 'rg8unorm': {gl: GL.RG8, rb: true},\n 'rg8snorm': {gl: GL.RG8_SNORM},\n 'rg8uint': {gl: GL.RG8UI, rb: true},\n 'rg8sint': {gl: GL.RG8I, rb: true},\n\n 'r16uint': {gl: GL.R16UI, rb: true},\n 'r16sint': {gl: GL.R16I, rb: true},\n 'r16float': {gl: GL.R16F, rb: true},\n 'r16unorm-webgl': {gl: GL.R16_EXT, rb: true},\n 'r16snorm-webgl': {gl: GL.R16_SNORM_EXT},\n\n // Packed 16-bit formats\n 'rgba4unorm-webgl': {gl: GL.RGBA4, rb: true},\n 'rgb565unorm-webgl': {gl: GL.RGB565, rb: true},\n 'rgb5a1unorm-webgl': {gl: GL.RGB5_A1, rb: true},\n\n // 24-bit formats\n 'rgb8unorm-webgl': {gl: GL.RGB8},\n 'rgb8snorm-webgl': {gl: GL.RGB8_SNORM},\n\n // 32-bit formats \n 'rgba8unorm': {gl: GL.RGBA8},\n 'rgba8unorm-srgb': {gl: GL.SRGB8_ALPHA8},\n 'rgba8snorm': {gl: GL.RGBA8_SNORM},\n 'rgba8uint': {gl: GL.RGBA8UI},\n 'rgba8sint': {gl: GL.RGBA8I},\n // reverse colors, webgpu only\n 'bgra8unorm': {},\n 'bgra8unorm-srgb': {},\n\n 'rg16uint': {gl: GL.RG16UI},\n 'rg16sint': {gl: GL.RG16I},\n 'rg16float': {gl: GL.RG16F, rb: true},\n 'rg16unorm-webgl': {gl: GL.RG16_EXT},\n 'rg16snorm-webgl': {gl: GL.RG16_SNORM_EXT},\n\n 'r32uint': {gl: GL.R32UI, rb: true},\n 'r32sint': {gl: GL.R32I, rb: true},\n 'r32float': {gl: GL.R32F},\n\n // Packed 32-bit formats\n 'rgb9e5ufloat': {gl: GL.RGB9_E5}, // , filter: true},\n 'rg11b10ufloat': {gl: GL.R11F_G11F_B10F, rb: true},\n 'rgb10a2unorm': {gl: GL.RGB10_A2, rb: true},\n 'rgb10a2uint-webgl': {gl: GL.RGB10_A2UI, rb: true},\n\n // 48-bit formats\n 'rgb16unorm-webgl': {gl: GL.RGB16_EXT}, // rgb not renderable\n 'rgb16snorm-webgl': {gl: GL.RGB16_SNORM_EXT}, // rgb not renderable\n\n // 64-bit formats\n 'rg32uint': {gl: GL.RG32UI, rb: true},\n 'rg32sint': {gl: GL.RG32I, rb: true},\n 'rg32float': {gl: GL.RG32F, rb: true},\n 'rgba16uint': {gl: GL.RGBA16UI, rb: true},\n 'rgba16sint': {gl: GL.RGBA16I, rb: true},\n 'rgba16float': {gl: GL.RGBA16F},\n 'rgba16unorm-webgl': {gl: GL.RGBA16_EXT, rb: true},\n 'rgba16snorm-webgl': {gl: GL.RGBA16_SNORM_EXT},\n\n // 96-bit formats (deprecated!)\n 'rgb32float-webgl': {gl: GL.RGB32F, x: EXT_color_buffer_float, dataFormat: GL.RGB, types: [GL.FLOAT]},\n \n // 128-bit formats\n 'rgba32uint': {gl: GL.RGBA32UI, rb: true},\n 'rgba32sint': {gl: GL.RGBA32I, rb: true},\n 'rgba32float': {gl: GL.RGBA32F, rb: true},\n\n // Depth and stencil formats\n 'stencil8': {gl: GL.STENCIL_INDEX8, rb: true}, // 8 stencil bits\n\n 'depth16unorm': {gl: GL.DEPTH_COMPONENT16, dataFormat: GL.DEPTH_COMPONENT, types: [GL.UNSIGNED_SHORT], rb: true}, // 16 depth bits\n 'depth24plus': {gl: GL.DEPTH_COMPONENT24, dataFormat: GL.DEPTH_COMPONENT, types: [GL.UNSIGNED_INT]},\n 'depth32float': {gl: GL.DEPTH_COMPONENT32F, dataFormat: GL.DEPTH_COMPONENT, types: [GL.FLOAT], rb: true},\n\n // The depth component of the \"depth24plus\" and \"depth24plus-stencil8\" formats may be implemented as either a 24-bit depth value or a \"depth32float\" value.\n 'depth24plus-stencil8': {gl: GL.DEPTH24_STENCIL8, rb: true, depthTexture: true, dataFormat: GL.DEPTH_STENCIL, types: [GL.UNSIGNED_INT_24_8]},\n // \"depth32float-stencil8\" feature - TODO below is render buffer only?\n 'depth32float-stencil8': {gl: GL.DEPTH32F_STENCIL8, dataFormat: GL.DEPTH_STENCIL, types: [GL.FLOAT_32_UNSIGNED_INT_24_8_REV], rb: true},\n\n // BC compressed formats: check device.features.has(\"texture-compression-bc\");\n\n 'bc1-rgb-unorm-webgl': {gl: GL.COMPRESSED_RGB_S3TC_DXT1_EXT, x: X_S3TC},\n 'bc1-rgb-unorm-srgb-webgl': {gl: GL.COMPRESSED_SRGB_S3TC_DXT1_EXT, x: X_S3TC_SRGB},\n\n 'bc1-rgba-unorm': {gl: GL.COMPRESSED_RGBA_S3TC_DXT1_EXT, x: X_S3TC},\n 'bc1-rgba-unorm-srgb': {gl: GL.COMPRESSED_SRGB_S3TC_DXT1_EXT, x: X_S3TC_SRGB},\n 'bc2-rgba-unorm': {gl: GL.COMPRESSED_RGBA_S3TC_DXT3_EXT, x: X_S3TC},\n 'bc2-rgba-unorm-srgb': {gl: GL.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, x: X_S3TC_SRGB},\n 'bc3-rgba-unorm': {gl: GL.COMPRESSED_RGBA_S3TC_DXT5_EXT, x: X_S3TC},\n 'bc3-rgba-unorm-srgb': {gl: GL.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, x: X_S3TC_SRGB},\n 'bc4-r-unorm': {gl: GL.COMPRESSED_RED_RGTC1_EXT, x: X_RGTC},\n 'bc4-r-snorm': {gl: GL.COMPRESSED_SIGNED_RED_RGTC1_EXT, x: X_RGTC},\n 'bc5-rg-unorm': {gl: GL.COMPRESSED_RED_GREEN_RGTC2_EXT, x: X_RGTC},\n 'bc5-rg-snorm': {gl: GL.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT, x: X_RGTC},\n 'bc6h-rgb-ufloat': {gl: GL.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT, x: X_BPTC},\n 'bc6h-rgb-float': {gl: GL.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT, x: X_BPTC},\n 'bc7-rgba-unorm': {gl: GL.COMPRESSED_RGBA_BPTC_UNORM_EXT, x: X_BPTC},\n 'bc7-rgba-unorm-srgb': {gl: GL.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT, x: X_BPTC},\n\n // WEBGL_compressed_texture_etc: device.features.has(\"texture-compression-etc2\")\n // Note: Supposedly guaranteed availability compressed formats in WebGL2, but through CPU decompression\n\n 'etc2-rgb8unorm': {gl: GL.COMPRESSED_RGB8_ETC2},\n 'etc2-rgb8unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ETC2},\n 'etc2-rgb8a1unorm': {gl: GL.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2},\n 'etc2-rgb8a1unorm-srgb': {gl: GL.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2},\n 'etc2-rgba8unorm': {gl: GL.COMPRESSED_RGBA8_ETC2_EAC},\n 'etc2-rgba8unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC},\n\n 'eac-r11unorm': {gl: GL.COMPRESSED_R11_EAC},\n 'eac-r11snorm': {gl: GL.COMPRESSED_SIGNED_R11_EAC},\n 'eac-rg11unorm': {gl: GL.COMPRESSED_RG11_EAC},\n 'eac-rg11snorm': {gl: GL.COMPRESSED_SIGNED_RG11_EAC},\n\n // X_ASTC compressed formats: device.features.has(\"texture-compression-astc\")\n\n 'astc-4x4-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_4x4_KHR},\n 'astc-4x4-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR},\n 'astc-5x4-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_5x4_KHR},\n 'astc-5x4-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR},\n 'astc-5x5-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_5x5_KHR},\n 'astc-5x5-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR},\n 'astc-6x5-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_6x5_KHR},\n 'astc-6x5-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR},\n 'astc-6x6-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_6x6_KHR},\n 'astc-6x6-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR},\n 'astc-8x5-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_8x5_KHR},\n 'astc-8x5-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR},\n 'astc-8x6-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_8x6_KHR},\n 'astc-8x6-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR},\n 'astc-8x8-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_8x8_KHR},\n 'astc-8x8-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR},\n 'astc-10x5-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_10x10_KHR},\n 'astc-10x5-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR},\n 'astc-10x6-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_10x6_KHR},\n 'astc-10x6-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR},\n 'astc-10x8-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_10x8_KHR},\n 'astc-10x8-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR},\n 'astc-10x10-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_10x10_KHR},\n 'astc-10x10-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR},\n 'astc-12x10-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_12x10_KHR},\n 'astc-12x10-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR},\n 'astc-12x12-unorm': {gl: GL.COMPRESSED_RGBA_ASTC_12x12_KHR},\n 'astc-12x12-unorm-srgb': {gl: GL.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR},\n\n // WEBGL_compressed_texture_pvrtc\n\n 'pvrtc-rgb4unorm-webgl': {gl: GL.COMPRESSED_RGB_PVRTC_4BPPV1_IMG},\n 'pvrtc-rgba4unorm-webgl': {gl: GL.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG},\n 'pvrtc-rbg2unorm-webgl': {gl: GL.COMPRESSED_RGB_PVRTC_2BPPV1_IMG},\n 'pvrtc-rgba2unorm-webgl': {gl: GL.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG},\n\n // WEBGL_compressed_texture_etc1\n\n 'etc1-rbg-unorm-webgl': {gl: GL.COMPRESSED_RGB_ETC1_WEBGL},\n\n // WEBGL_compressed_texture_atc\n\n 'atc-rgb-unorm-webgl': {gl: GL.COMPRESSED_RGB_ATC_WEBGL},\n 'atc-rgba-unorm-webgl': {gl: GL.COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL},\n 'atc-rgbai-unorm-webgl': {gl: GL.COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL}\n};\n\n// FUNCTIONS\n\n/** Checks if a texture format is supported */\nexport function isWebGLTextureFormatCapabilitiesed(\n gl: WebGL2RenderingContext,\n format: TextureFormat,\n extensions: GLExtensions\n): boolean {\n const webglTextureInfo = WEBGL_TEXTURE_FORMATS[format];\n // Check that we have a GL constant\n if (!webglTextureInfo?.gl) {\n return false;\n }\n\n // Check extensions\n const extension = webglTextureInfo.x;\n if (extension) {\n return Boolean(getWebGLExtension(gl, extension, extensions));\n }\n return true;\n}\n\n/** Checks if a texture format is supported, renderable, filterable etc */\nexport function getTextureFormatCapabilitiesWebGL(\n gl: WebGL2RenderingContext,\n formatSupport: TextureFormatCapabilities,\n extensions: GLExtensions\n): DeviceTextureFormatCapabilities {\n let supported = formatSupport.create;\n const webglFormatInfo = WEBGL_TEXTURE_FORMATS[formatSupport.format];\n\n // Support Check that we have a GL constant\n if (webglFormatInfo?.gl === undefined) {\n supported = false;\n }\n\n if (webglFormatInfo?.x) {\n supported = supported && Boolean(getWebGLExtension(gl, webglFormatInfo.x, extensions));\n }\n\n return {\n format: formatSupport.format,\n // @ts-ignore\n create: supported && formatSupport.create,\n // @ts-ignore\n render: supported && formatSupport.render,\n // @ts-ignore\n filter: supported && formatSupport.filter,\n // @ts-ignore\n blend: supported && formatSupport.blend,\n // @ts-ignore\n store: supported && formatSupport.store\n };\n}\n\n/** Get parameters necessary to work with format in WebGL: internalFormat, dataFormat, type, compressed, */\nexport function getTextureFormatWebGL(format: TextureFormat): {\n internalFormat: GL;\n format: GLTexelDataFormat;\n type: GLPixelType;\n compressed: boolean;\n} {\n const formatData = WEBGL_TEXTURE_FORMATS[format];\n const webglFormat = convertTextureFormatToGL(format);\n const decoded = decodeTextureFormat(format);\n return {\n internalFormat: webglFormat,\n format:\n formatData?.dataFormat ||\n getWebGLPixelDataFormat(decoded.channels, decoded.integer, decoded.normalized, webglFormat),\n // depth formats don't have a type\n type: decoded.dataType\n ? getGLFromVertexType(decoded.dataType)\n : formatData?.types?.[0] || GL.UNSIGNED_BYTE,\n compressed: decoded.compressed || false\n };\n}\n\nexport function getDepthStencilAttachmentWebGL(\n format: TextureFormat\n): GL.DEPTH_ATTACHMENT | GL.STENCIL_ATTACHMENT | GL.DEPTH_STENCIL_ATTACHMENT {\n const formatInfo = decodeTextureFormat(format);\n switch (formatInfo.attachment) {\n case 'depth':\n return GL.DEPTH_ATTACHMENT;\n case 'stencil':\n return GL.STENCIL_ATTACHMENT;\n case 'depth-stencil':\n return GL.DEPTH_STENCIL_ATTACHMENT;\n default:\n throw new Error(`Not a depth stencil format: ${format}`);\n }\n}\n\n/** TODO - VERY roundabout legacy way of calculating bytes per pixel */\nexport function getTextureFormatBytesPerPixel(format: TextureFormat): number {\n const formatInfo = decodeTextureFormat(format);\n return formatInfo.bytesPerPixel;\n}\n\n// DATA TYPE HELPERS\n\nexport function getWebGLPixelDataFormat(\n channels: 'r' | 'rg' | 'rgb' | 'rgba' | 'bgra',\n integer: boolean,\n normalized: boolean,\n format: GL\n): GLTexelDataFormat {\n // WebGL1 formats use same internalFormat\n if (format === GL.RGBA || format === GL.RGB) {\n return format;\n }\n // prettier-ignore\n switch (channels) {\n case 'r': return integer && !normalized ? GL.RED_INTEGER : GL.RED;\n case 'rg': return integer && !normalized ? GL.RG_INTEGER : GL.RG;\n case 'rgb': return integer && !normalized ? GL.RGB_INTEGER : GL.RGB;\n case 'rgba': return integer && !normalized ? GL.RGBA_INTEGER : GL.RGBA;\n case 'bgra': throw new Error('bgra pixels not supported by WebGL');\n default: return GL.RGBA;\n }\n}\n\n/**\n * Map WebGPU style texture format strings to GL constants\n */\nfunction convertTextureFormatToGL(format: TextureFormat): GL | undefined {\n const formatInfo = WEBGL_TEXTURE_FORMATS[format];\n const webglFormat = formatInfo?.gl;\n if (webglFormat === undefined) {\n throw new Error(`Unsupported texture format ${format}`);\n }\n return webglFormat;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {GL} from '@luma.gl/constants';\nimport {VertexFormat, VertexType} from '@luma.gl/core';\n\ntype GLDataType =\n | GL.UNSIGNED_BYTE\n | GL.BYTE\n | GL.UNSIGNED_SHORT\n | GL.SHORT\n | GL.UNSIGNED_INT\n | GL.INT\n | GL.HALF_FLOAT\n | GL.FLOAT;\n\n/** Get vertex format from GL constants */\nexport function getVertexFormatFromGL(type: GLDataType, components: 1 | 2 | 3 | 4): VertexFormat {\n const base = getVertexTypeFromGL(type);\n // prettier-ignore\n switch (components) {\n // @ts-expect-error TODO deal with lack of formats\n case 1: return base;\n case 2: return `${base}x2`;\n // @ts-expect-error TODO deal with lack of formats\n case 3: return `${base}x3`;\n case 4: return `${base}x4`;\n }\n // @ts-ignore unreachable\n throw new Error(String(components));\n}\n\n/** Get data type from GL constants */\nexport function getVertexTypeFromGL(type: GLDataType, normalized = false): VertexType {\n // prettier-ignore\n switch (type) {\n // WebGPU does not support normalized 32 bit integer attributes\n case GL.INT: return normalized ? 'sint32' : 'sint32';\n case GL.UNSIGNED_INT: return normalized ? 'uint32' : 'uint32';\n case GL.SHORT: return normalized ? 'sint16' : 'unorm16';\n case GL.UNSIGNED_SHORT: return normalized ? 'uint16' : 'unorm16';\n case GL.BYTE: return normalized ? 'sint8' : 'snorm16';\n case GL.UNSIGNED_BYTE: return normalized ? 'uint8' : 'unorm8';\n case GL.FLOAT: return 'float32';\n case GL.HALF_FLOAT: return 'float16';\n }\n // @ts-ignore unreachable\n throw new Error(String(type));\n}\n\nexport function getGLFromVertexType(\n dataType: VertexType\n):\n | GL.UNSIGNED_BYTE\n | GL.BYTE\n | GL.UNSIGNED_SHORT\n | GL.SHORT\n | GL.UNSIGNED_INT\n | GL.INT\n | GL.HALF_FLOAT\n | GL.FLOAT {\n // prettier-ignore\n switch (dataType) {\n case 'uint8': return GL.UNSIGNED_BYTE;\n case 'sint8': return GL.BYTE;\n case 'unorm8': return GL.UNSIGNED_BYTE;\n case 'snorm8': return GL.BYTE;\n case 'uint16': return GL.UNSIGNED_SHORT;\n case 'sint16': return GL.SHORT;\n case 'unorm16': return GL.UNSIGNED_SHORT;\n case 'snorm16': return GL.SHORT;\n case 'uint32': return GL.UNSIGNED_INT;\n case 'sint32': return GL.INT;\n // WebGPU does not support normalized 32 bit integer attributes\n // case 'unorm32': return GL.UNSIGNED_INT;\n // case 'snorm32': return GL.INT;\n case 'float16': return GL.HALF_FLOAT;\n case 'float32': return GL.FLOAT;\n }\n // @ts-ignore unreachable\n throw new Error(String(dataType));\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {DeviceLimits} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\n\n// prettier-ignore\nexport class WebGLDeviceLimits extends DeviceLimits {\n get maxTextureDimension1D() { return 0; } // WebGL does not support 1D textures\n get maxTextureDimension2D() { return this.getParameter(GL.MAX_TEXTURE_SIZE); }\n get maxTextureDimension3D() { return this.getParameter(GL.MAX_3D_TEXTURE_SIZE); }\n get maxTextureArrayLayers() { return this.getParameter(GL.MAX_ARRAY_TEXTURE_LAYERS); }\n get maxBindGroups() { return 0; }\n get maxDynamicUniformBuffersPerPipelineLayout() { return 0; } // TBD\n get maxDynamicStorageBuffersPerPipelineLayout() { return 0; } // TBD\n get maxSampledTexturesPerShaderStage() { return this.getParameter(GL.MAX_VERTEX_TEXTURE_IMAGE_UNITS); } // ) TBD\n get maxSamplersPerShaderStage() { return this.getParameter(GL.MAX_COMBINED_TEXTURE_IMAGE_UNITS); }\n get maxStorageBuffersPerShaderStage() { return 0; } // TBD\n get maxStorageTexturesPerShaderStage() { return 0; } // TBD\n get maxUniformBuffersPerShaderStage() { return this.getParameter(GL.MAX_UNIFORM_BUFFER_BINDINGS); }\n get maxUniformBufferBindingSize() { return this.getParameter(GL.MAX_UNIFORM_BLOCK_SIZE); }\n get maxStorageBufferBindingSize() { return 0; }\n get minUniformBufferOffsetAlignment() { return this.getParameter(GL.UNIFORM_BUFFER_OFFSET_ALIGNMENT); }\n get minStorageBufferOffsetAlignment() { return 0; } \n get maxVertexBuffers() { return 16; } // WebGL 2 supports 16 buffers, see https://github.com/gpuweb/gpuweb/issues/4284\n get maxVertexAttributes() { return this.getParameter(GL.MAX_VERTEX_ATTRIBS); }\n get maxVertexBufferArrayStride() { return 2048; } // TBD, this is just the default value from WebGPU\n get maxInterStageShaderComponents() { return this.getParameter(GL.MAX_VARYING_COMPONENTS); }\n get maxComputeWorkgroupStorageSize() { return 0; } // WebGL does not support compute shaders\n get maxComputeInvocationsPerWorkgroup() { return 0; } // WebGL does not support compute shaders\n get maxComputeWorkgroupSizeX() { return 0; } // WebGL does not support compute shaders\n get maxComputeWorkgroupSizeY() { return 0; } // WebGL does not support compute shaders\n get maxComputeWorkgroupSizeZ() { return 0; } // WebGL does not support compute shaders\n get maxComputeWorkgroupsPerDimension() { return 0;} // WebGL does not support compute shaders\n\n // PRIVATE\n\n protected gl: WebGL2RenderingContext;\n protected limits: Partial<Record<GL, number>> = {};\n\n constructor(gl: WebGL2RenderingContext) {\n super();\n this.gl = gl;\n }\n\n protected getParameter(parameter: GL): number {\n if (this.limits[parameter] === undefined) {\n this.limits[parameter] = this.gl.getParameter(parameter);\n }\n return this.limits[parameter] || 0;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {CanvasContextProps, TextureFormat} from '@luma.gl/core';\nimport {CanvasContext} from '@luma.gl/core';\nimport {WebGLDevice} from './webgl-device';\nimport {WEBGLFramebuffer} from './resources/webgl-framebuffer';\n\n/**\n * A WebGL Canvas Context which manages the canvas and handles drawing buffer resizing etc\n */\nexport class WebGLCanvasContext extends CanvasContext {\n readonly device: WebGLDevice;\n readonly format: TextureFormat = 'rgba8unorm';\n readonly depthStencilFormat: TextureFormat = 'depth24plus';\n\n presentationSize: [number, number];\n private _framebuffer: WEBGLFramebuffer | null = null;\n\n get [Symbol.toStringTag](): string {\n return 'WebGLCanvasContext';\n }\n\n constructor(device: WebGLDevice, props: CanvasContextProps) {\n // Note: Base class creates / looks up the canvas (unless under Node.js)\n super(props);\n this.device = device;\n this.presentationSize = [-1, -1];\n this._setAutoCreatedCanvasId(`${this.device.id}-canvas`);\n this.update();\n }\n\n getCurrentFramebuffer(): WEBGLFramebuffer {\n this.update();\n // Setting handle to null returns a reference to the default framebuffer\n this._framebuffer = this._framebuffer || new WEBGLFramebuffer(this.device, {handle: null});\n return this._framebuffer;\n }\n\n /** Resizes and updates render targets if necessary */\n update() {\n const size = this.getPixelSize();\n const sizeChanged =\n size[0] !== this.presentationSize[0] || size[1] !== this.presentationSize[1];\n if (sizeChanged) {\n this.presentationSize = size;\n this.resize();\n }\n }\n\n /**\n * Resize the canvas' drawing buffer.\n *\n * Can match the canvas CSS size, and optionally also consider devicePixelRatio\n * Can be called every frame\n *\n * Regardless of size, the drawing buffer will always be scaled to the viewport, but\n * for best visual results, usually set to either:\n * canvas CSS width x canvas CSS height\n * canvas CSS width * devicePixelRatio x canvas CSS height * devicePixelRatio\n * See http://webgl2fundamentals.org/webgl/lessons/webgl-resizing-the-canvas.html\n */\n resize(options?: {width?: number; height?: number; useDevicePixels?: boolean | number}): void {\n if (!this.device.gl) return;\n\n // Resize browser context .\n if (this.canvas) {\n const devicePixelRatio = this.getDevicePixelRatio(options?.useDevicePixels);\n this.setDevicePixelRatio(devicePixelRatio, options);\n return;\n }\n }\n\n commit() {\n // gl.commit was ultimately removed from the WebGL standard??\n // if (this.offScreen && this.gl.commit) {\n // // @ts-expect-error gl.commit is not officially part of WebGL2RenderingContext\n // this.gl.commit();\n // }\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {FramebufferProps} from '@luma.gl/core';\nimport {Framebuffer} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\nimport {WebGLDevice} from '../webgl-device';\nimport {WEBGLTexture} from './webgl-texture';\nimport {WEBGLTextureView} from './webgl-texture-view';\nimport {getDepthStencilAttachmentWebGL} from '../converters/webgl-texture-table';\n\nexport type Attachment = WEBGLTextureView | WEBGLTexture; // | WEBGLRenderbuffer;\n\n/** luma.gl Framebuffer, WebGL implementation */\nexport class WEBGLFramebuffer extends Framebuffer {\n device: WebGLDevice;\n gl: WebGL2RenderingContext;\n handle: WebGLFramebuffer;\n\n colorAttachments: WEBGLTextureView[] = [];\n depthStencilAttachment: WEBGLTextureView | null = null;\n\n constructor(device: WebGLDevice, props: FramebufferProps) {\n super(device, props);\n\n // WebGL default framebuffer handle is null\n const isDefaultFramebuffer = props.handle === null;\n\n this.device = device;\n this.gl = device.gl;\n this.handle =\n this.props.handle || isDefaultFramebuffer ? this.props.handle : this.gl.createFramebuffer();\n\n if (!isDefaultFramebuffer) {\n // default framebuffer handle is null, so we can't set spector metadata...\n device.setSpectorMetadata(this.handle, {id: this.props.id, props: this.props});\n\n // Auto create textures for attachments if needed\n this.autoCreateAttachmentTextures();\n\n this.updateAttachments();\n }\n }\n\n /** destroys any auto created resources etc. */\n override destroy(): void {\n super.destroy(); // destroys owned resources etc.\n if (!this.destroyed && this.handle !== null) {\n this.gl.deleteFramebuffer(this.handle);\n // this.handle = null;\n }\n }\n\n protected updateAttachments(): void {\n /** Attach from a map of attachments */\n // @ts-expect-error native bindFramebuffer is overridden by our state tracker\n const prevHandle: WebGLFramebuffer | null = this.gl.bindFramebuffer(\n GL.FRAMEBUFFER,\n this.handle\n );\n\n // Walk the attachments\n for (let i = 0; i < this.colorAttachments.length; ++i) {\n const attachment = this.colorAttachments[i];\n if (attachment) {\n const attachmentPoint = GL.COLOR_ATTACHMENT0 + i;\n this._attachTextureView(attachmentPoint, attachment);\n }\n }\n\n if (this.depthStencilAttachment) {\n const attachmentPoint = getDepthStencilAttachmentWebGL(\n this.depthStencilAttachment.props.format\n );\n this._attachTextureView(attachmentPoint, this.depthStencilAttachment);\n }\n\n /** Check the status */\n if (this.device.props.debug) {\n const status = this.gl.checkFramebufferStatus(GL.FRAMEBUFFER) as GL;\n if (status !== GL.FRAMEBUFFER_COMPLETE) {\n throw new Error(`Framebuffer ${_getFrameBufferStatus(status)}`);\n }\n }\n\n this.gl.bindFramebuffer(GL.FRAMEBUFFER, prevHandle);\n }\n\n // PRIVATE\n\n /** In WebGL we must use renderbuffers for depth/stencil attachments (unless we have extensions) */\n // protected override createDepthStencilTexture(format: TextureFormat): Texture {\n // // return new WEBGLRenderbuffer(this.device, {\n // return new WEBGLTexture(this.device, {\n // id: `${this.id}-depth-stencil`,\n // format,\n // width: this.width,\n // height: this.height,\n // mipmaps: false\n // });\n // }\n\n /**\n * @param attachment\n * @param texture\n * @param layer = 0 - index into WEBGLTextureArray and Texture3D or face for `TextureCubeMap`\n * @param level = 0 - mipmapLevel\n */\n protected _attachTextureView(attachment: GL, textureView: WEBGLTextureView): void {\n const {gl} = this.device;\n const {texture} = textureView;\n const level = textureView.props.baseMipLevel;\n const layer = textureView.props.baseArrayLayer;\n\n gl.bindTexture(texture.glTarget, texture.handle);\n\n switch (texture.glTarget) {\n case GL.TEXTURE_2D_ARRAY:\n case GL.TEXTURE_3D:\n gl.framebufferTextureLayer(GL.FRAMEBUFFER, attachment, texture.handle, level, layer);\n break;\n\n case GL.TEXTURE_CUBE_MAP:\n // layer must be a cubemap face (or if index, converted to cube map face)\n const face = mapIndexToCubeMapFace(layer);\n gl.framebufferTexture2D(GL.FRAMEBUFFER, attachment, face, texture.handle, level);\n break;\n\n case GL.TEXTURE_2D:\n gl.framebufferTexture2D(GL.FRAMEBUFFER, attachment, GL.TEXTURE_2D, texture.handle, level);\n break;\n\n default:\n throw new Error('Illegal texture type');\n }\n\n gl.bindTexture(texture.glTarget, null);\n }\n}\n\n// Helper functions\n\n// Map an index to a cube map face constant\nfunction mapIndexToCubeMapFace(layer: number | GL): GL {\n // TEXTURE_CUBE_MAP_POSITIVE_X is a big value (0x8515)\n // if smaller assume layer is index, otherwise assume it is already a cube map face constant\n return layer < (GL.TEXTURE_CUBE_MAP_POSITIVE_X as number)\n ? layer + GL.TEXTURE_CUBE_MAP_POSITIVE_X\n : layer;\n}\n\n// Helper METHODS\n// Get a string describing the framebuffer error if installed\nfunction _getFrameBufferStatus(status: GL) {\n switch (status) {\n case GL.FRAMEBUFFER_COMPLETE:\n return 'success';\n case GL.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:\n return 'Mismatched attachments';\n case GL.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:\n return 'No attachments';\n case GL.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:\n return 'Height/width mismatch';\n case GL.FRAMEBUFFER_UNSUPPORTED:\n return 'Unsupported or split attachments';\n // WebGL2\n case GL.FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:\n return 'Samples mismatch';\n // OVR_multiview2 extension\n // case GL.FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR: return 'baseViewIndex mismatch';\n default:\n return `${status}`;\n }\n}\n\n/**\n * Attachment resize is expected to be a noop if size is same\n *\nprotected override resizeAttachments(width: number, height: number): this {\n // for default framebuffer, just update the stored size\n if (this.handle === null) {\n // assert(width === undefined && height === undefined);\n this.width = this.gl.drawingBufferWidth;\n this.height = this.gl.drawingBufferHeight;\n return this;\n }\n\n if (width === undefined) {\n width = this.gl.drawingBufferWidth;\n }\n if (height === undefined) {\n height = this.gl.drawingBufferHeight;\n }\n\n // TODO Not clear that this is better than default destroy/create implementation\n\n for (const colorAttachment of this.colorAttachments) {\n colorAttachment.texture.clone({width, height});\n }\n if (this.depthStencilAttachment) {\n this.depthStencilAttachment.texture.resize({width, height});\n }\n return this;\n}\n*/\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {log} from '@luma.gl/core';\nimport {loadScript} from '../../utils/load-script';\n\nimport type {Spector} from './spector-types';\n\n/** Spector debug initialization options */\ntype SpectorProps = {\n /** Whether spector.js is enabled */\n debugSpectorJS?: boolean;\n /** URL to load spector script from. Typically a CDN URL */\n debugSpectorJSUrl?: string;\n /** Canvas to monitor */\n gl?: WebGL2RenderingContext;\n};\n\nconst LOG_LEVEL = 1;\n\nlet spector: Spector = null;\nlet initialized: boolean = false;\n\ndeclare global {\n // @ts-ignore\n // eslint-disable-next-line no-var\n var SPECTOR: Spector;\n}\n\nexport const DEFAULT_SPECTOR_PROPS: Required<SpectorProps> = {\n debugSpectorJS: log.get('debug-spectorjs'),\n // https://github.com/BabylonJS/Spector.js#basic-usage\n // https://forum.babylonjs.com/t/spectorcdn-is-temporarily-off/48241\n // spectorUrl: 'https://spectorcdn.babylonjs.com/spector.bundle.js';\n debugSpectorJSUrl: 'https://cdn.jsdelivr.net/npm/spectorjs@0.9.30/dist/spector.bundle.js',\n gl: undefined!\n};\n\n/** Loads spector from CDN if not already installed */\nexport async function loadSpectorJS(props: {debugSpectorJSUrl?: string}): Promise<void> {\n if (!globalThis.SPECTOR) {\n try {\n await loadScript(props.debugSpectorJSUrl || DEFAULT_SPECTOR_PROPS.debugSpectorJSUrl);\n } catch (error) {\n log.warn(String(error));\n }\n }\n}\n\nexport function initializeSpectorJS(props: SpectorProps): Spector | null {\n props = {...DEFAULT_SPECTOR_PROPS, ...props};\n if (!props.debugSpectorJS) {\n return null;\n }\n\n if (!spector && globalThis.SPECTOR && !globalThis.luma?.spector) {\n log.probe(LOG_LEVEL, 'SPECTOR found and initialized. Start with `luma.spector.displayUI()`')();\n const {Spector: SpectorJS} = globalThis.SPECTOR as any;\n spector = new SpectorJS();\n if (globalThis.luma) {\n (globalThis.luma as any).spector = spector;\n }\n }\n\n if (!spector) {\n return null;\n }\n\n if (!initialized) {\n initialized = true;\n\n // enables recording some extra information merged in the capture like texture memory sizes and formats\n spector.spyCanvases();\n // A callback when results are ready\n spector?.onCaptureStarted.add((capture: unknown) =>\n log.info('Spector capture started:', capture)()\n );\n spector?.onCapture.add((capture: unknown) => {\n log.info('Spector capture complete:', capture)();\n // Use undocumented Spector API to open the UI with our capture\n // See https://github.com/BabylonJS/Spector.js/blob/767ad1195a25b85a85c381f400eb50a979239eca/src/spector.ts#L124\n spector?.getResultUI();\n // @ts-expect-error private\n spector?.resultView.display();\n // @ts-expect-error private\n spector?.resultView.addCapture(capture);\n });\n }\n\n if (props.gl) {\n // capture startup\n const gl = props.gl;\n // @ts-expect-error\n const device = gl.device;\n spector?.startCapture(props.gl, 500); // 500 commands\n // @ts-expect-error\n gl.device = device;\n\n new Promise(resolve => setTimeout(resolve, 2000)).then(_ => {\n log.info('Spector capture stopped after 2 seconds')();\n spector?.stopCapture();\n // spector?.displayUI();\n });\n }\n\n return spector;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/**\n * Load a script (identified by an url). When the url returns, the\n * content of this file is added into a new script element, attached to the DOM (body element)\n * @param scriptUrl defines the url of the script to laod\n * @param scriptId defines the id of the script element\n */\nexport async function loadScript(scriptUrl: string, scriptId?: string): Promise<Event> {\n const head = document.getElementsByTagName('head')[0];\n if (!head) {\n throw new Error('loadScript');\n }\n\n const script = document.createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', scriptUrl);\n if (scriptId) {\n script.id = scriptId;\n }\n\n return new Promise((resolve, reject) => {\n script.onload = resolve;\n script.onerror = error =>\n reject(new Error(`Unable to load script '${scriptUrl}': ${error as string}`));\n head.appendChild(script);\n });\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {log} from '@luma.gl/core';\n// Rename constant to prevent inlining. We need the full set of constants for generating debug strings.\nimport {GL as GLEnum} from '@luma.gl/constants';\nimport {isBrowser} from '@probe.gl/env';\nimport {loadScript} from '../../utils/load-script';\n\nconst WEBGL_DEBUG_CDN_URL = 'https://unpkg.com/webgl-debug@2.0.1/index.js';\n\ntype DebugContextProps = {\n debugWebGL?: boolean;\n traceWebGL?: boolean;\n};\n\ntype ContextData = {\n realContext?: WebGL2RenderingContext;\n debugContext?: WebGL2RenderingContext;\n};\n\n// Helper to get shared context data\nfunction getWebGLContextData(gl: any): ContextData {\n gl.luma = gl.luma || {};\n return gl.luma;\n}\n\ndeclare global {\n // eslint-disable-next-line no-var\n var WebGLDebugUtils: any;\n}\n\n/**\n * Loads Khronos WebGLDeveloperTools from CDN if not already installed\n * const WebGLDebugUtils = require('webgl-debug');\n * @see https://github.com/KhronosGroup/WebGLDeveloperTools\n * @see https://github.com/vorg/webgl-debug\n */\nexport async function loadWebGLDeveloperTools(): Promise<void> {\n if (isBrowser() && !globalThis.WebGLDebugUtils) {\n globalThis.global = globalThis.global || globalThis;\n // @ts-expect-error Developer tools expects global to be set\n globalThis.global.module = {};\n await loadScript(WEBGL_DEBUG_CDN_URL);\n }\n}\n\n// Returns (a potentially new) context with debug instrumentation turned off or on.\n// Note that this actually returns a new context\nexport function makeDebugContext(\n gl: WebGL2RenderingContext,\n props: DebugContextProps = {}\n): WebGL2RenderingContext {\n return props.debugWebGL || props.traceWebGL ? getDebugContext(gl, props) : getRealContext(gl);\n}\n\n// Returns the real context from either of the real/debug contexts\nfunction getRealContext(gl: WebGL2RenderingContext): WebGL2RenderingContext {\n const data = getWebGLContextData(gl);\n // If the context has a realContext member, it is a debug context so return the realContext\n return data.realContext ? data.realContext : gl;\n}\n\n// Returns the debug context from either of the real/debug contexts\nfunction getDebugContext(\n gl: WebGL2RenderingContext,\n props: DebugContextProps\n): WebGL2RenderingContext {\n if (!globalThis.WebGLDebugUtils) {\n log.warn('webgl-debug not loaded')();\n return gl;\n }\n\n const data = getWebGLContextData(gl);\n\n // If this already has a debug context, return it.\n if (data.debugContext) {\n return data.debugContext;\n }\n\n // Create a new debug context\n globalThis.WebGLDebugUtils.init({...GLEnum, ...gl});\n const glDebug = globalThis.WebGLDebugUtils.makeDebugContext(\n gl,\n onGLError.bind(null, props),\n onValidateGLFunc.bind(null, props)\n );\n\n // Make sure we have all WebGL2 and extension constants (todo dynamic import to circumvent minification?)\n for (const key in GLEnum) {\n if (!(key in glDebug) && typeof GLEnum[key] === 'number') {\n glDebug[key] = GLEnum[key];\n }\n }\n\n // Ensure we have a clean prototype on the instrumented object\n // Note: setPrototypeOf does come with perf warnings, but we already take a bigger perf reduction\n // by synchronizing the WebGL errors after each WebGL call.\n class WebGLDebugContext {}\n Object.setPrototypeOf(glDebug, Object.getPrototypeOf(gl));\n Object.setPrototypeOf(WebGLDebugContext, glDebug);\n const debugContext = Object.create(WebGLDebugContext);\n // Store the debug context\n data.realContext = gl;\n data.debugContext = debugContext;\n debugContext.debug = true;\n\n // Return it\n return debugContext;\n}\n\n// DEBUG TRACING\n\nfunction getFunctionString(functionName: string, functionArgs): string {\n // Cover bug in webgl-debug-tools\n functionArgs = Array.from(functionArgs).map(arg => (arg === undefined ? 'undefined' : arg));\n let args = globalThis.WebGLDebugUtils.glFunctionArgsToString(functionName, functionArgs);\n args = `${args.slice(0, 100)}${args.length > 100 ? '...' : ''}`;\n return `gl.${functionName}(${args})`;\n}\n\nfunction onGLError(props: DebugContextProps, err, functionName: string, args: any[]): void {\n // Cover bug in webgl-debug-tools\n args = Array.from(args).map(arg => (arg === undefined ? 'undefined' : arg));\n const errorMessage = globalThis.WebGLDebugUtils.glEnumToString(err);\n const functionArgs = globalThis.WebGLDebugUtils.glFunctionArgsToString(functionName, args);\n const message = `${errorMessage} in gl.${functionName}(${functionArgs})`;\n log.error(message)();\n debugger; // eslint-disable-line\n // throw new Error(message);\n}\n\n// Don't generate function string until it is needed\nfunction onValidateGLFunc(\n props: DebugContextProps,\n functionName: string,\n functionArgs: any[]\n): void {\n let functionString: string = '';\n if (log.level >= 1) {\n functionString = getFunctionString(functionName, functionArgs);\n if (props.traceWebGL) {\n log.log(1, functionString)();\n }\n }\n\n for (const arg of functionArgs) {\n if (arg === undefined) {\n functionString = functionString || getFunctionString(functionName, functionArgs);\n debugger; // eslint-disable-line\n // throw new Error(`Undefined argument: ${functionString}`);\n }\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nconst uidCounters: Record<string, number> = {};\n\n/**\n * Returns a UID.\n * @param id= - Identifier base name\n * @return uid\n **/\nexport function uid(id: string = 'id'): string {\n uidCounters[id] = uidCounters[id] || 1;\n const count = uidCounters[id]++;\n return `${id}-${count}`;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {BufferProps} from '@luma.gl/core';\nimport {Buffer} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\nimport {WebGLDevice} from '../webgl-device';\n\n/** WebGL Buffer interface */\nexport class WEBGLBuffer extends Buffer {\n readonly device: WebGLDevice;\n readonly gl: WebGL2RenderingContext;\n readonly handle: WebGLBuffer;\n\n /** Target in OpenGL defines the type of buffer */\n readonly glTarget: GL.ARRAY_BUFFER | GL.ELEMENT_ARRAY_BUFFER | GL.UNIFORM_BUFFER;\n /** Usage is a hint on how frequently the buffer will be updates */\n readonly glUsage: GL.STATIC_DRAW | GL.DYNAMIC_DRAW;\n /** Index type is needed when issuing draw calls, so we pre-compute it */\n readonly glIndexType: GL.UNSIGNED_SHORT | GL.UNSIGNED_INT = GL.UNSIGNED_SHORT;\n\n /** Number of bytes allocated on the GPU for this buffer */\n byteLength: number;\n /** Number of bytes used */\n bytesUsed: number;\n\n constructor(device: WebGLDevice, props: BufferProps = {}) {\n super(device, props);\n\n this.device = device;\n this.gl = this.device.gl;\n\n const handle = typeof props === 'object' ? props.handle : undefined;\n this.handle = handle || this.gl.createBuffer();\n device.setSpectorMetadata(this.handle, {...this.props, data: typeof this.props.data});\n\n // - In WebGL1, need to make sure we use GL.ELEMENT_ARRAY_BUFFER when initializing element buffers\n // otherwise buffer type will lock to generic (non-element) buffer\n // - In WebGL2, we can use GL.COPY_READ_BUFFER which avoids locking the type here\n this.glTarget = getWebGLTarget(this.props.usage);\n this.glUsage = getWebGLUsage(this.props.usage);\n this.glIndexType = this.props.indexType === 'uint32' ? GL.UNSIGNED_INT : GL.UNSIGNED_SHORT;\n\n // Set data: (re)initializes the buffer\n if (props.data) {\n this._initWithData(props.data, props.byteOffset, props.byteLength);\n } else {\n this._initWithByteLength(props.byteLength || 0);\n }\n }\n\n // PRIVATE METHODS\n\n /** Allocate a new buffer and initialize to contents of typed array */\n _initWithData(\n data: ArrayBuffer | ArrayBufferView,\n byteOffset: number = 0,\n byteLength: number = data.byteLength + byteOffset\n ): void {\n // const glTarget = this.device.isWebGL2 ? GL.COPY_WRITE_BUFFER : this.glTarget;\n const glTarget = this.glTarget;\n this.gl.bindBuffer(glTarget, this.handle);\n this.gl.bufferData(glTarget, byteLength, this.glUsage);\n this.gl.bufferSubData(glTarget, byteOffset, data);\n this.gl.bindBuffer(glTarget, null);\n\n this.bytesUsed = byteLength;\n this.byteLength = byteLength;\n\n this._setDebugData(data, byteOffset, byteLength);\n this.trackAllocatedMemory(byteLength);\n }\n\n // Allocate a GPU buffer of specified size.\n _initWithByteLength(byteLength: number): this {\n // assert(byteLength >= 0);\n\n // Workaround needed for Safari (#291):\n // gl.bufferData with size equal to 0 crashes. Instead create zero sized array.\n let data = byteLength;\n if (byteLength === 0) {\n // @ts-expect-error\n data = new Float32Array(0);\n }\n\n // const glTarget = this.device.isWebGL2 ? GL.COPY_WRITE_BUFFER : this.glTarget;\n const glTarget = this.glTarget;\n\n this.gl.bindBuffer(glTarget, this.handle);\n this.gl.bufferData(glTarget, data, this.glUsage);\n this.gl.bindBuffer(glTarget, null);\n\n this.bytesUsed = byteLength;\n this.byteLength = byteLength;\n\n this._setDebugData(null, 0, byteLength);\n this.trackAllocatedMemory(byteLength);\n\n return this;\n }\n\n override destroy(): void {\n if (!this.destroyed && this.handle) {\n this.removeStats();\n this.trackDeallocatedMemory();\n this.gl.deleteBuffer(this.handle);\n this.destroyed = true;\n // @ts-expect-error\n this.handle = null;\n }\n }\n\n override write(data: ArrayBufferView, byteOffset: number = 0): void {\n const srcOffset = 0;\n const byteLength = undefined; // data.byteLength;\n\n // Create the buffer - binding it here for the first time locks the type\n // In WebGL2, use GL.COPY_WRITE_BUFFER to avoid locking the type\n const glTarget = GL.COPY_WRITE_BUFFER;\n this.gl.bindBuffer(glTarget, this.handle);\n // WebGL2: subData supports additional srcOffset and length parameters\n if (srcOffset !== 0 || byteLength !== undefined) {\n this.gl.bufferSubData(glTarget, byteOffset, data, srcOffset, byteLength);\n } else {\n this.gl.bufferSubData(glTarget, byteOffset, data);\n }\n this.gl.bindBuffer(glTarget, null);\n\n this._setDebugData(data, byteOffset, data.byteLength);\n }\n\n /** Asynchronously read data from the buffer */\n override async readAsync(byteOffset = 0, byteLength?: number): Promise<Uint8Array> {\n return this.readSyncWebGL(byteOffset, byteLength);\n }\n\n /** Synchronously read data from the buffer. WebGL only. */\n override readSyncWebGL(byteOffset = 0, byteLength?: number): Uint8Array {\n byteLength = byteLength ?? this.byteLength - byteOffset;\n const data = new Uint8Array(byteLength);\n const dstOffset = 0;\n\n // Use GL.COPY_READ_BUFFER to avoid disturbing other targets and locking type\n this.gl.bindBuffer(GL.COPY_READ_BUFFER, this.handle);\n this.gl.getBufferSubData(GL.COPY_READ_BUFFER, byteOffset, data, dstOffset, byteLength);\n this.gl.bindBuffer(GL.COPY_READ_BUFFER, null);\n\n // Update local `data` if offsets are 0\n this._setDebugData(data, byteOffset, byteLength);\n\n return data;\n }\n}\n\n/**\n * Returns a WebGL buffer target\n *\n * @param usage\n * static MAP_READ = 0x01;\n * static MAP_WRITE = 0x02;\n * static COPY_SRC = 0x0004;\n * static COPY_DST = 0x0008;\n * static INDEX = 0x0010;\n * static VERTEX = 0x0020;\n * static UNIFORM = 0x0040;\n * static STORAGE = 0x0080;\n * static INDIRECT = 0x0100;\n * static QUERY_RESOLVE = 0x0200;\n *\n * @returns WebGL buffer targe\n *\n * Buffer bind points in WebGL2\n * gl.COPY_READ_BUFFER: Buffer for copying from one buffer object to another.\n * gl.COPY_WRITE_BUFFER: Buffer for copying from one buffer object to another.\n * gl.TRANSFORM_FEEDBACK_BUFFER: Buffer for transform feedback operations.\n * gl.PIXEL_PACK_BUFFER: Buffer used for pixel transfer operations.\n * gl.PIXEL_UNPACK_BUFFER: Buffer used for pixel transfer operations.\n */\nfunction getWebGLTarget(\n usage: number\n): GL.ARRAY_BUFFER | GL.ELEMENT_ARRAY_BUFFER | GL.UNIFORM_BUFFER {\n if (usage & Buffer.INDEX) {\n return GL.ELEMENT_ARRAY_BUFFER;\n }\n if (usage & Buffer.VERTEX) {\n return GL.ARRAY_BUFFER;\n }\n if (usage & Buffer.UNIFORM) {\n return GL.UNIFORM_BUFFER;\n }\n\n // Binding a buffer for the first time locks the type\n // In WebGL2, we can use GL.COPY_WRITE_BUFFER to avoid locking the type\n return GL.ARRAY_BUFFER;\n}\n\n/** @todo usage is not passed correctly */\nfunction getWebGLUsage(usage: number): GL.STATIC_DRAW | GL.DYNAMIC_DRAW {\n if (usage & Buffer.INDEX) {\n return GL.STATIC_DRAW;\n }\n if (usage & Buffer.VERTEX) {\n return GL.STATIC_DRAW;\n }\n if (usage & Buffer.UNIFORM) {\n return GL.DYNAMIC_DRAW;\n }\n return GL.STATIC_DRAW;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Shader, ShaderProps, CompilerMessage, log} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\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, 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 get asyncCompilationStatus(): Promise<'pending' | 'success' | 'error'> {\n return this._waitForCompilationComplete().then(() => this.compilationStatus);\n }\n\n override async getCompilationInfo(): Promise<readonly CompilerMessage[]> {\n await this._waitForCompilationComplete();\n return this.getCompilationInfoSync();\n }\n\n override getCompilationInfoSync(): readonly CompilerMessage[] {\n const shaderLog = this.device.gl.getShaderInfoLog(this.handle);\n return shaderLog ? parseShaderCompilerLog(shaderLog) : [];\n }\n\n override getTranslatedSource(): string | null {\n const extensions = this.device.getExtension('WEBGL_debug_shaders');\n const ext = extensions.WEBGL_debug_shaders;\n return ext?.getTranslatedShaderSource(this.handle) || null;\n }\n\n // PRIVATE METHODS\n\n /** Compile a shader and get compilation status */\n protected async _compile(source: string): Promise<void> {\n source = source.startsWith('#version ') ? source : `#version 300 es\\n${source}`;\n\n const {gl} = this.device;\n gl.shaderSource(this.handle, source);\n gl.compileShader(this.handle);\n\n // For performance reasons, avoid checking shader compilation errors on production\n if (!this.device.props.debug) {\n this.compilationStatus = 'pending';\n return;\n }\n\n // Sync case - slower, but advantage is that it throws in the constructor, making break on error more useful\n if (!this.device.features.has('compilation-status-async-webgl')) {\n this._getCompilationStatus();\n // The `Shader` base class will determine if debug window should be opened based on this.compilationStatus\n this.debugShader();\n if (this.compilationStatus === 'error') {\n throw new Error(`GLSL compilation errors in ${this.props.stage} shader ${this.props.id}`);\n }\n return;\n }\n\n // async case\n log.once(1, 'Shader compilation is asynchronous')();\n await this._waitForCompilationComplete();\n log.info(2, `Shader ${this.id} - async compilation complete: ${this.compilationStatus}`)();\n this._getCompilationStatus();\n\n // The `Shader` base class will determine if debug window should be opened based on this.compilationStatus\n this.debugShader();\n }\n\n /** Use KHR_parallel_shader_compile extension if available */\n protected async _waitForCompilationComplete(): Promise<void> {\n const waitMs = async (ms: number) => await new Promise(resolve => setTimeout(resolve, ms));\n const DELAY_MS = 10; // Shader compilation is typically quite fast (with some exceptions)\n\n // If status polling is not available, we can't wait for completion. Just wait a little to minimize blocking\n if (!this.device.features.has('compilation-status-async-webgl')) {\n await waitMs(DELAY_MS);\n return;\n }\n\n const {gl} = this.device;\n for (;;) {\n const complete = gl.getShaderParameter(this.handle, GL.COMPLETION_STATUS_KHR);\n if (complete) {\n return;\n }\n await waitMs(DELAY_MS);\n }\n }\n\n /**\n * Get the shader compilation status\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 */\n protected _getCompilationStatus() {\n this.compilationStatus = this.device.gl.getShaderParameter(this.handle, GL.COMPILE_STATUS)\n ? 'success'\n : 'error';\n }\n}\n\n// TODO - Original code from luma.gl v8 - keep until new debug functionality has matured\n// if (!compilationSuccess) {\n// const parsedLog = shaderLog ? parseShaderCompilerLog(shaderLog) : [];\n// const messages = parsedLog.filter(message => message.type === 'error');\n// const formattedLog = formatCompilerLog(messages, source, {showSourceCode: 'all', html: true});\n// const shaderDescription = `${this.stage} shader ${shaderName}`;\n// log.error(`GLSL compilation errors in ${shaderDescription}\\n${formattedLog}`)();\n// displayShaderLog(parsedLog, source, shaderName);\n// }\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {CompilerMessage} from '@luma.gl/core';\n\n/**\n * Parse a WebGL-format GLSL compilation log into an array of WebGPU style message records.\n * This follows documented WebGL conventions for compilation logs.\n * Based on https://github.com/wwwtyro/gl-format-compiler-error (public domain)\n */\nexport function parseShaderCompilerLog(errLog: string): readonly CompilerMessage[] {\n // Parse the error - note: browser and driver dependent\n const lines = errLog.split(/\\r?\\n/);\n\n const messages: CompilerMessage[] = [];\n\n for (const line of lines) {\n if (line.length <= 1) {\n continue; // eslint-disable-line no-continue\n }\n\n const segments: string[] = line.split(':');\n\n // Check for messages with no line information `ERROR: unsupported shader version`\n if (segments.length === 2) {\n const [messageType, message] = segments;\n messages.push({\n message: message.trim(),\n type: getMessageType(messageType),\n lineNum: 0,\n linePos: 0\n });\n continue; // eslint-disable-line no-continue\n }\n\n const [messageType, linePosition, lineNumber, ...rest] = segments;\n\n let lineNum = parseInt(lineNumber, 10);\n if (isNaN(lineNum)) {\n lineNum = 0;\n }\n\n let linePos = parseInt(linePosition, 10);\n if (isNaN(linePos)) {\n linePos = 0;\n }\n\n messages.push({\n message: rest.join(':').trim(),\n type: getMessageType(messageType),\n lineNum,\n linePos // TODO\n });\n }\n\n return messages;\n}\n\n/** Ensure supported type */\nfunction getMessageType(messageType: string): 'warning' | 'error' | 'info' {\n const MESSAGE_TYPES = ['warning', 'error', 'info'];\n const lowerCaseType = messageType.toLowerCase();\n return (MESSAGE_TYPES.includes(lowerCaseType) ? lowerCaseType : 'info') as\n | 'warning'\n | 'error'\n | 'info';\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\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 * 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 this.handle = this.handle || this.device.gl.createSampler();\n this._setSamplerParameters(this.parameters);\n }\n\n override destroy(): void {\n if (this.handle) {\n this.device.gl.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) as GL.TEXTURE_MIN_LOD | GL.TEXTURE_MAX_LOD;\n switch (param) {\n case GL.TEXTURE_MIN_LOD:\n case GL.TEXTURE_MAX_LOD:\n this.device.gl.samplerParameterf(this.handle, param, value);\n break;\n default:\n this.device.gl.samplerParameteri(this.handle, param, value);\n break;\n }\n }\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// SAMPLER FILTERS\nimport {SamplerProps} from '@luma.gl/core';\nimport {GL, GLSamplerParameters} from '@luma.gl/constants';\nimport {convertCompareFunction} from './device-parameters';\n\n/**\n * Convert WebGPU-style sampler props to WebGL\n * @param props\n * @returns\n */\nexport function convertSamplerParametersToWebGL(props: SamplerProps): GLSamplerParameters {\n const params: GLSamplerParameters = {};\n if (props.addressModeU) {\n params[GL.TEXTURE_WRAP_S] = convertAddressMode(props.addressModeU);\n }\n if (props.addressModeV) {\n params[GL.TEXTURE_WRAP_T] = convertAddressMode(props.addressModeV);\n }\n if (props.addressModeW) {\n params[GL.TEXTURE_WRAP_R] = convertAddressMode(props.addressModeW);\n }\n if (props.magFilter) {\n params[GL.TEXTURE_MAG_FILTER] = convertMaxFilterMode(props.magFilter);\n }\n if (props.minFilter || props.mipmapFilter) {\n // TODO - arbitrary choice of linear?\n params[GL.TEXTURE_MIN_FILTER] = convertMinFilterMode(\n props.minFilter || 'linear',\n props.mipmapFilter\n );\n }\n if (props.lodMinClamp !== undefined) {\n params[GL.TEXTURE_MIN_LOD] = props.lodMinClamp;\n }\n if (props.lodMaxClamp !== undefined) {\n params[GL.TEXTURE_MAX_LOD] = props.lodMaxClamp;\n }\n if (props.type === 'comparison-sampler') {\n // Setting prop.compare turns this into a comparison sampler\n params[GL.TEXTURE_COMPARE_MODE] = GL.COMPARE_REF_TO_TEXTURE;\n }\n if (props.compare) {\n params[GL.TEXTURE_COMPARE_FUNC] = convertCompareFunction('compare', props.compare);\n }\n // Note depends on WebGL extension\n if (props.maxAnisotropy) {\n params[GL.TEXTURE_MAX_ANISOTROPY_EXT] = props.maxAnisotropy;\n }\n return params;\n}\n\n// HELPERS\n\n/** Convert address more */\nfunction convertAddressMode(\n addressMode: 'clamp-to-edge' | 'repeat' | 'mirror-repeat'\n): GL.CLAMP_TO_EDGE | GL.REPEAT | GL.MIRRORED_REPEAT {\n switch (addressMode) {\n case 'clamp-to-edge':\n return GL.CLAMP_TO_EDGE;\n case 'repeat':\n return GL.REPEAT;\n case 'mirror-repeat':\n return GL.MIRRORED_REPEAT;\n }\n}\n\nfunction convertMaxFilterMode(maxFilter: 'nearest' | 'linear'): GL.NEAREST | GL.LINEAR {\n switch (maxFilter) {\n case 'nearest':\n return GL.NEAREST;\n case 'linear':\n return GL.LINEAR;\n }\n}\n\n/**\n * WebGPU has separate min filter and mipmap filter,\n * WebGL is combined and effectively offers 6 options\n */\nfunction convertMinFilterMode(\n minFilter: 'nearest' | 'linear',\n mipmapFilter: 'none' | 'nearest' | 'linear' = 'none'\n):\n | GL.NEAREST\n | GL.LINEAR\n | GL.NEAREST_MIPMAP_NEAREST\n | GL.LINEAR_MIPMAP_NEAREST\n | GL.NEAREST_MIPMAP_LINEAR\n | GL.LINEAR_MIPMAP_LINEAR {\n if (!mipmapFilter) {\n return convertMaxFilterMode(minFilter);\n }\n switch (mipmapFilter) {\n case 'none':\n return convertMaxFilterMode(minFilter);\n case 'nearest':\n return minFilter === 'nearest' ? GL.NEAREST_MIPMAP_NEAREST : GL.NEAREST_MIPMAP_LINEAR;\n case 'linear':\n return minFilter === 'nearest' ? GL.LINEAR_MIPMAP_NEAREST : GL.LINEAR_MIPMAP_LINEAR;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {CompareFunction, StencilOperation, BlendOperation, BlendFactor} from '@luma.gl/core';\nimport {Device, log, Parameters, PolygonMode, ProvokingVertex} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\nimport type {\n GLBlendEquation,\n GLBlendFunction,\n GLFunction,\n GLParameters,\n GLPolygonMode,\n GLProvokingVertex,\n GLStencilOp\n} from '@luma.gl/constants';\nimport {setGLParameters} from '../../context/parameters/unified-parameter-api';\nimport {WebGLDevice} from '../webgl-device';\n\n/* eslint-disable no-unused-expressions */ // For expression ? gl.enable() : gl.disable()\n\n/**\n * Execute a function with a set of temporary WebGL parameter overrides\n * - Saves current \"global\" WebGL context settings\n * - Sets the supplies WebGL context parameters,\n * - Executes supplied function\n * - Restores parameters\n * - Returns the return value of the supplied function\n */\nexport function withDeviceAndGLParameters<T = unknown>(\n device: Device,\n parameters: Parameters,\n glParameters: GLParameters,\n func: (_?: Device) => T\n): T {\n if (isObjectEmpty(parameters)) {\n // Avoid setting state if no parameters provided. Just call and return\n return func(device);\n }\n\n // Wrap in a try-catch to ensure that parameters are restored on exceptions\n const webglDevice = device as WebGLDevice;\n webglDevice.pushState();\n try {\n setDeviceParameters(device, parameters);\n setGLParameters(webglDevice.gl, glParameters);\n return func(device);\n } finally {\n webglDevice.popState();\n }\n}\n\n/**\n * Execute a function with a set of temporary WebGL parameter overrides\n * - Saves current \"global\" WebGL context settings\n * - Sets the supplies WebGL context parameters,\n * - Executes supplied function\n * - Restores parameters\n * - Returns the return value of the supplied function\n * @deprecated use withDeviceParameters instead\n */\nexport function withGLParameters<T = unknown>(\n device: Device,\n parameters: GLParameters,\n func: (_?: Device) => T\n): T {\n if (isObjectEmpty(parameters)) {\n // Avoid setting state if no parameters provided. Just call and return\n return func(device);\n }\n\n // Wrap in a try-catch to ensure that parameters are restored on exceptions\n const webglDevice = device as WebGLDevice;\n webglDevice.pushState();\n try {\n setGLParameters(webglDevice.gl, parameters);\n return func(device);\n } finally {\n webglDevice.popState();\n }\n}\n\n/**\n * Execute a function with a set of temporary WebGL parameter overrides\n * - Saves current \"global\" WebGL context settings\n * - Sets the supplies WebGL context parameters,\n * - Executes supplied function\n * - Restores parameters\n * - Returns the return value of the supplied function\n */\nexport function withDeviceParameters<T = unknown>(\n device: Device,\n parameters: Parameters,\n func: (_?: Device) => T\n): T {\n if (isObjectEmpty(parameters)) {\n // Avoid setting state if no parameters provided. Just call and return\n return func(device);\n }\n\n // Wrap in a try-catch to ensure that parameters are restored on exceptions'\n const webglDevice = device as WebGLDevice;\n webglDevice.pushState();\n try {\n setDeviceParameters(device, parameters);\n return func(device);\n } finally {\n webglDevice.popState();\n }\n}\n\n/** Set WebGPU Style Parameters */\nexport function setDeviceParameters(device: Device, parameters: Parameters) {\n const webglDevice = device as WebGLDevice;\n const {gl} = webglDevice;\n\n // RASTERIZATION SETTINGS\n if (parameters.cullMode) {\n switch (parameters.cullMode) {\n case 'none':\n gl.disable(GL.CULL_FACE);\n break;\n case 'front':\n gl.enable(GL.CULL_FACE);\n gl.cullFace(GL.FRONT);\n break;\n case 'back':\n gl.enable(GL.CULL_FACE);\n gl.cullFace(GL.BACK);\n break;\n }\n }\n\n if (parameters.frontFace) {\n gl.frontFace(\n map('frontFace', parameters.frontFace, {\n ccw: GL.CCW,\n cw: GL.CW\n })\n );\n }\n\n if (parameters.unclippedDepth) {\n if (device.features.has('depth-clip-control')) {\n // EXT_depth_clamp\n gl.enable(GL.DEPTH_CLAMP_EXT);\n }\n }\n\n if (parameters.depthBias !== undefined) {\n gl.enable(GL.POLYGON_OFFSET_FILL);\n gl.polygonOffset(parameters.depthBias, parameters.depthBiasSlopeScale || 0);\n }\n\n // depthBiasSlopeScale: {\n // // Handled by depthBias\n // },\n\n // WEBGL EXTENSIONS\n\n if (parameters.provokingVertex) {\n if (device.features.has('provoking-vertex-webgl')) {\n const extensions = webglDevice.getExtension('WEBGL_provoking_vertex');\n const ext = extensions.WEBGL_provoking_vertex;\n\n const vertex = map<ProvokingVertex, GLProvokingVertex>(\n 'provokingVertex',\n parameters.provokingVertex,\n {\n first: GL.FIRST_VERTEX_CONVENTION_WEBGL,\n last: GL.LAST_VERTEX_CONVENTION_WEBGL\n }\n );\n ext?.provokingVertexWEBGL(vertex);\n }\n }\n\n if (parameters.polygonMode || parameters.polygonOffsetLine) {\n if (device.features.has('polygon-mode-webgl')) {\n if (parameters.polygonMode) {\n const extensions = webglDevice.getExtension('WEBGL_polygon_mode');\n const ext = extensions.WEBGL_polygon_mode;\n const mode = map<PolygonMode, GLPolygonMode>('polygonMode', parameters.polygonMode, {\n fill: GL.FILL_WEBGL,\n line: GL.LINE_WEBGL\n });\n ext?.polygonModeWEBGL(GL.FRONT, mode);\n ext?.polygonModeWEBGL(GL.BACK, mode);\n }\n\n if (parameters.polygonOffsetLine) {\n gl.enable(GL.POLYGON_OFFSET_LINE_WEBGL);\n }\n }\n }\n\n if (device.features.has('shader-clip-cull-distance-webgl')) {\n if (parameters.clipDistance0) {\n gl.enable(GL.CLIP_DISTANCE0_WEBGL);\n }\n if (parameters.clipDistance1) {\n gl.enable(GL.CLIP_DISTANCE1_WEBGL);\n }\n if (parameters.clipDistance2) {\n gl.enable(GL.CLIP_DISTANCE2_WEBGL);\n }\n if (parameters.clipDistance3) {\n gl.enable(GL.CLIP_DISTANCE3_WEBGL);\n }\n if (parameters.clipDistance4) {\n gl.enable(GL.CLIP_DISTANCE4_WEBGL);\n }\n if (parameters.clipDistance5) {\n gl.enable(GL.CLIP_DISTANCE5_WEBGL);\n }\n if (parameters.clipDistance6) {\n gl.enable(GL.CLIP_DISTANCE6_WEBGL);\n }\n if (parameters.clipDistance7) {\n gl.enable(GL.CLIP_DISTANCE7_WEBGL);\n }\n }\n\n // DEPTH STENCIL\n\n if (parameters.depthWriteEnabled !== undefined) {\n gl.depthMask(mapBoolean('depthWriteEnabled', parameters.depthWriteEnabled));\n }\n\n if (parameters.depthCompare) {\n parameters.depthCompare !== 'always' ? gl.enable(GL.DEPTH_TEST) : gl.disable(GL.DEPTH_TEST);\n gl.depthFunc(convertCompareFunction('depthCompare', parameters.depthCompare));\n }\n\n if (parameters.stencilWriteMask) {\n const mask = parameters.stencilWriteMask;\n gl.stencilMaskSeparate(GL.FRONT, mask);\n gl.stencilMaskSeparate(GL.BACK, mask);\n }\n\n if (parameters.stencilReadMask) {\n // stencilReadMask is handle inside stencil***Compare.\n log.warn('stencilReadMask not supported under WebGL');\n }\n\n if (parameters.stencilCompare) {\n const mask = parameters.stencilReadMask || 0xffffffff;\n const glValue = convertCompareFunction('depthCompare', parameters.stencilCompare);\n // TODO - ensure back doesn't overwrite\n parameters.stencilCompare !== 'always'\n ? gl.enable(GL.STENCIL_TEST)\n : gl.disable(GL.STENCIL_TEST);\n gl.stencilFuncSeparate(GL.FRONT, glValue, 0, mask);\n gl.stencilFuncSeparate(GL.BACK, glValue, 0, mask);\n }\n\n if (\n parameters.stencilPassOperation &&\n parameters.stencilFailOperation &&\n parameters.stencilDepthFailOperation\n ) {\n const dppass = convertStencilOperation('stencilPassOperation', parameters.stencilPassOperation);\n const sfail = convertStencilOperation('stencilFailOperation', parameters.stencilFailOperation);\n const dpfail = convertStencilOperation(\n 'stencilDepthFailOperation',\n parameters.stencilDepthFailOperation\n );\n gl.stencilOpSeparate(GL.FRONT, sfail, dpfail, dppass);\n gl.stencilOpSeparate(GL.BACK, sfail, dpfail, dppass);\n }\n\n // stencilDepthFailOperation() {\n // // handled by stencilPassOperation\n // },\n\n // stencilFailOperation() {\n // // handled by stencilPassOperation\n // },\n\n // COLOR STATE\n switch (parameters.blend) {\n case true:\n gl.enable(GL.BLEND);\n break;\n case false:\n gl.disable(GL.BLEND);\n break;\n default:\n // leave WebGL blend state unchanged if `parameters.blend` is not set\n }\n\n if (parameters.blendColorOperation || parameters.blendAlphaOperation) {\n const colorEquation = convertBlendOperationToEquation(\n 'blendColorOperation',\n parameters.blendColorOperation || 'add'\n );\n const alphaEquation = convertBlendOperationToEquation(\n 'blendAlphaOperation',\n parameters.blendAlphaOperation || 'add'\n );\n gl.blendEquationSeparate(colorEquation, alphaEquation);\n\n const colorSrcFactor = convertBlendFactorToFunction(\n 'blendColorSrcFactor',\n parameters.blendColorSrcFactor || 'one'\n );\n const colorDstFactor = convertBlendFactorToFunction(\n 'blendColorDstFactor',\n parameters.blendColorDstFactor || 'zero'\n );\n const alphaSrcFactor = convertBlendFactorToFunction(\n 'blendAlphaSrcFactor',\n parameters.blendAlphaSrcFactor || 'one'\n );\n const alphaDstFactor = convertBlendFactorToFunction(\n 'blendAlphaDstFactor',\n parameters.blendAlphaDstFactor || 'zero'\n );\n gl.blendFuncSeparate(colorSrcFactor, colorDstFactor, alphaSrcFactor, alphaDstFactor);\n }\n}\n\n/*\n rasterizationState: {\n cullMode: \"back\",\n },\n\n depthStencilState: {\n depthWriteEnabled: true,\n depthCompare: \"less\",\n format: \"depth24plus-stencil8\",\n },\n\n colorStates: [\n {\n format: \"bgra8unorm\",\n // colorBlend.srcFactor = wgpu::BlendFactor::SrcAlpha;\n // colorBlend.dstFactor = wgpu::BlendFactor::OneMinusSrcAlpha;\n // alphaBlend.srcFactor = wgpu::BlendFactor::SrcAlpha;\n // alphaBlend.dstFactor = wgpu::BlendFactor::OneMinusSrcAlpha;\n },\n ],\n });\n*/\n\nexport function convertCompareFunction(parameter: string, value: CompareFunction): GLFunction {\n return map<CompareFunction, GLFunction>(parameter, value, {\n never: GL.NEVER,\n less: GL.LESS,\n equal: GL.EQUAL,\n 'less-equal': GL.LEQUAL,\n greater: GL.GREATER,\n 'not-equal': GL.NOTEQUAL,\n 'greater-equal': GL.GEQUAL,\n always: GL.ALWAYS\n });\n}\n\nexport function convertToCompareFunction(parameter: string, value: GLFunction): CompareFunction {\n return map<GLFunction, CompareFunction>(parameter, value, {\n [GL.NEVER]: 'never',\n [GL.LESS]: 'less',\n [GL.EQUAL]: 'equal',\n [GL.LEQUAL]: 'less-equal',\n [GL.GREATER]: 'greater',\n [GL.NOTEQUAL]: 'not-equal',\n [GL.GEQUAL]: 'greater-equal',\n [GL.ALWAYS]: 'always'\n });\n}\n\nfunction convertStencilOperation(parameter: string, value: StencilOperation): GL {\n return map<StencilOperation, GLStencilOp>(parameter, value, {\n keep: GL.KEEP,\n zero: GL.ZERO,\n replace: GL.REPLACE,\n invert: GL.INVERT,\n 'increment-clamp': GL.INCR,\n 'decrement-clamp': GL.DECR,\n 'increment-wrap': GL.INCR_WRAP,\n 'decrement-wrap': GL.DECR_WRAP\n });\n}\n\nfunction convertBlendOperationToEquation(\n parameter: string,\n value: BlendOperation\n): GLBlendEquation {\n return map<BlendOperation, GLBlendEquation>(parameter, value, {\n add: GL.FUNC_ADD,\n subtract: GL.FUNC_SUBTRACT,\n 'reverse-subtract': GL.FUNC_REVERSE_SUBTRACT,\n min: GL.MIN,\n max: GL.MAX\n });\n}\n\nfunction convertBlendFactorToFunction(parameter: string, value: BlendFactor): GLBlendFunction {\n return map<BlendFactor, GLBlendFunction>(parameter, value, {\n one: GL.ONE,\n zero: GL.ZERO,\n 'src-color': GL.SRC_COLOR,\n 'one-minus-src-color': GL.ONE_MINUS_SRC_COLOR,\n 'dst-color': GL.DST_COLOR,\n 'one-minus-dst-color': GL.ONE_MINUS_DST_COLOR,\n 'src-alpha': GL.SRC_ALPHA,\n 'one-minus-src-alpha': GL.ONE_MINUS_SRC_ALPHA,\n 'dst-alpha': GL.DST_ALPHA,\n 'one-minus-dst-alpha': GL.ONE_MINUS_DST_ALPHA,\n 'src-alpha-saturated': GL.SRC_ALPHA_SATURATE,\n 'constant-color': GL.CONSTANT_COLOR,\n 'one-minus-constant-color': GL.ONE_MINUS_CONSTANT_COLOR,\n 'constant-alpha': GL.CONSTANT_ALPHA,\n 'one-minus-constant-alpha': GL.ONE_MINUS_CONSTANT_ALPHA\n });\n}\n\nfunction message(parameter: string, value: any): string {\n return `Illegal parameter ${value} for ${parameter}`;\n}\n\nfunction map<K extends string | number, V>(parameter: string, value: K, valueMap: Record<K, V>): V {\n if (!(value in valueMap)) {\n throw new Error(message(parameter, value));\n }\n return valueMap[value];\n}\n\nfunction mapBoolean(parameter: string, value: boolean): boolean {\n return value;\n}\n\n/** Returns true if given object is empty, false otherwise. */\nfunction isObjectEmpty(obj: object): boolean {\n let isEmpty = true;\n // @ts-ignore key is unused\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const key in obj) {\n isEmpty = false;\n break;\n }\n return isEmpty;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {\n Device,\n TextureProps,\n TextureViewProps,\n Sampler,\n SamplerProps,\n SamplerParameters,\n TextureCubeFace,\n ExternalImage,\n Texture1DData,\n Texture2DData,\n Texture3DData,\n TextureCubeData,\n TextureArrayData,\n TextureCubeArrayData\n} from '@luma.gl/core';\nimport {Texture, log} from '@luma.gl/core';\nimport {\n GL,\n GLPixelType,\n GLSamplerParameters,\n GLTexelDataFormat,\n GLTextureTarget\n} from '@luma.gl/constants';\nimport {getTextureFormatWebGL} from '../converters/webgl-texture-table';\nimport {convertSamplerParametersToWebGL} from '../converters/sampler-parameters';\nimport {WebGLDevice} from '../webgl-device';\nimport {WEBGLSampler} from './webgl-sampler';\nimport {WEBGLTextureView} from './webgl-texture-view';\n\nimport {\n initializeTextureStorage,\n // clearMipLevel,\n copyExternalImageToMipLevel,\n copyCPUDataToMipLevel,\n // copyGPUBufferToMipLevel,\n getWebGLTextureTarget\n} from '../helpers/webgl-texture-utils';\n\n/**\n * WebGL... the texture API from hell... hopefully made simpler\n */\nexport class WEBGLTexture extends Texture {\n // readonly MAX_ATTRIBUTES: number;\n readonly device: WebGLDevice;\n readonly gl: WebGL2RenderingContext;\n handle: WebGLTexture;\n\n sampler: WEBGLSampler = undefined; // TODO - currently unused in WebGL. Create dummy sampler?\n view: WEBGLTextureView = undefined; // TODO - currently unused in WebGL. Create dummy view?\n\n mipmaps: boolean;\n\n // Texture type\n /** Whether the internal format is compressed */\n compressed: boolean;\n\n /**\n * The WebGL target corresponding to the texture type\n * @note `target` cannot be modified by bind:\n * textures are special because when you first bind them to a target,\n * When you first bind a texture as a GL_TEXTURE_2D, you are saying that this texture is a 2D texture.\n * And it will always be a 2D texture; this state cannot be changed ever.\n * A texture that was first bound as a GL_TEXTURE_2D, must always be bound as a GL_TEXTURE_2D;\n * attempting to bind it as GL_TEXTURE_3D will give rise to a run-time error\n */\n glTarget: GLTextureTarget;\n /** The WebGL format - essentially channel structure */\n glFormat: GLTexelDataFormat;\n /** The WebGL data format - the type of each channel */\n glType: GLPixelType;\n /** The WebGL constant corresponding to the WebGPU style constant in format */\n glInternalFormat: GL;\n\n // state\n /** Texture binding slot - TODO - move to texture view? */\n textureUnit: number = 0;\n\n constructor(device: Device, props: TextureProps) {\n super(device, props);\n\n // Texture base class strips out the data prop, so we need to add it back in\n const propsWithData = {...this.props};\n propsWithData.data = props.data;\n\n this.device = device as WebGLDevice;\n this.gl = this.device.gl;\n\n // Note: In WebGL the texture target defines the type of texture on first bind.\n this.glTarget = getWebGLTextureTarget(this.props.dimension);\n\n // The target format of this texture\n const formatInfo = getTextureFormatWebGL(this.props.format);\n this.glInternalFormat = formatInfo.internalFormat;\n this.glFormat = formatInfo.format;\n this.glType = formatInfo.type;\n this.compressed = formatInfo.compressed;\n this.mipmaps = Boolean(this.props.mipmaps);\n\n this._initialize(propsWithData);\n\n Object.seal(this);\n }\n\n /** Initialize texture with supplied props */\n // eslint-disable-next-line max-statements\n _initialize(propsWithData: TextureProps): void {\n this.handle = this.props.handle || this.gl.createTexture();\n this.device.setSpectorMetadata(this.handle, {...this.props, data: propsWithData.data});\n\n let {width, height} = propsWithData;\n\n if (!width || !height) {\n const textureSize = Texture.getTextureDataSize(propsWithData.data);\n width = textureSize?.width || 1;\n height = textureSize?.height || 1;\n }\n\n // Store opts for accessors\n this.width = width;\n this.height = height;\n this.depth = propsWithData.depth;\n\n // Set texture sampler parameters\n this.setSampler(propsWithData.sampler);\n // @ts-ignore TODO - fix types\n this.view = new WEBGLTextureView(this.device, {...this.props, texture: this});\n\n this.bind();\n initializeTextureStorage(this.gl, this.mipLevels, this);\n\n if (propsWithData.data) {\n // prettier-ignore\n switch (propsWithData.dimension) {\n case '1d': this.setTexture1DData(propsWithData.data); break;\n case '2d': this.setTexture2DData(propsWithData.data); break;\n case '3d': this.setTexture3DData(propsWithData.data); break;\n case 'cube': this.setTextureCubeData(propsWithData.data); break;\n case '2d-array': this.setTextureArrayData(propsWithData.data); break;\n case 'cube-array': this.setTextureCubeArrayData(propsWithData.data); break;\n // @ts-expect-error\n default: throw new Error(propsWithData.dimension);\n }\n }\n\n if (this.mipmaps) {\n this.generateMipmap();\n }\n }\n\n override destroy(): void {\n if (this.handle) {\n this.gl.deleteTexture(this.handle);\n this.removeStats();\n this.trackDeallocatedMemory('Texture');\n // this.handle = null;\n this.destroyed = true;\n }\n }\n\n createView(props: TextureViewProps): WEBGLTextureView {\n return new WEBGLTextureView(this.device, {...props, texture: this});\n }\n\n setSampler(sampler: Sampler | SamplerProps = {}): void {\n let samplerProps: SamplerParameters;\n if (sampler instanceof WEBGLSampler) {\n this.sampler = sampler;\n samplerProps = sampler.props;\n } else {\n this.sampler = new WEBGLSampler(this.device, sampler);\n samplerProps = sampler as SamplerProps;\n }\n\n const parameters = convertSamplerParametersToWebGL(samplerProps);\n this._setSamplerParameters(parameters);\n }\n\n // Call to regenerate mipmaps after modifying texture(s)\n generateMipmap(options?: {force?: boolean}): void {\n const isFilterableAndRenderable =\n this.device.isTextureFormatRenderable(this.props.format) &&\n this.device.isTextureFormatFilterable(this.props.format);\n if (!isFilterableAndRenderable) {\n log.warn(`${this} is not renderable or filterable, may not be able to generate mipmaps`)();\n if (!options?.force) {\n return;\n }\n }\n\n try {\n this.gl.bindTexture(this.glTarget, this.handle);\n this.gl.generateMipmap(this.glTarget);\n } catch (error) {\n log.warn(`Error generating mipmap for ${this}: ${(error as Error).message}`)();\n } finally {\n this.gl.bindTexture(this.glTarget, null);\n }\n }\n\n // Image Data Setters\n copyExternalImage(options: {\n image: ExternalImage;\n sourceX?: number;\n sourceY?: number;\n width?: number;\n height?: number;\n depth?: number;\n mipLevel?: number;\n x?: number;\n y?: number;\n z?: number;\n aspect?: 'all' | 'stencil-only' | 'depth-only';\n colorSpace?: 'srgb';\n premultipliedAlpha?: boolean;\n flipY?: boolean;\n }): {width: number; height: number} {\n const size = Texture.getExternalImageSize(options.image);\n const opts = {...Texture.defaultCopyExternalImageOptions, ...size, ...options};\n\n const {image, depth, mipLevel, x, y, z, flipY} = opts;\n let {width, height} = opts;\n const {dimension, glTarget, glFormat, glInternalFormat, glType} = this;\n\n // WebGL will error if we try to copy outside the bounds of the texture\n width = Math.min(width, this.width - x);\n height = Math.min(height, this.height - y);\n\n if (options.sourceX || options.sourceY) {\n // requires copyTexSubImage2D from a framebuffer'\n throw new Error('WebGL does not support sourceX/sourceY)');\n }\n\n copyExternalImageToMipLevel(this.device.gl, this.handle, image, {\n dimension,\n mipLevel,\n x,\n y,\n z,\n width,\n height,\n depth,\n glFormat,\n glInternalFormat,\n glType,\n glTarget,\n flipY\n });\n\n return {width: opts.width, height: opts.height};\n }\n\n setTexture1DData(data: Texture1DData): void {\n throw new Error('setTexture1DData not supported in WebGL.');\n }\n\n /** Set a simple texture */\n setTexture2DData(lodData: Texture2DData, depth = 0): void {\n this.bind();\n\n const lodArray = Texture.normalizeTextureData(lodData, this);\n\n // If the user provides multiple LODs, then automatic mipmap\n // generation generateMipmap() should be disabled to avoid overwriting them.\n if (lodArray.length > 1 && this.props.mipmaps !== false) {\n log.warn(`Texture ${this.id} mipmap and multiple LODs.`)();\n }\n\n for (let lodLevel = 0; lodLevel < lodArray.length; lodLevel++) {\n const imageData = lodArray[lodLevel];\n this._setMipLevel(depth, lodLevel, imageData);\n }\n\n this.unbind();\n }\n\n /**\n * Sets a 3D texture\n * @param data\n */\n setTexture3DData(data: Texture3DData): void {\n if (this.props.dimension !== '3d') {\n throw new Error(this.id);\n }\n if (ArrayBuffer.isView(data)) {\n this.bind();\n copyCPUDataToMipLevel(this.device.gl, data, this);\n this.unbind();\n }\n }\n\n /**\n * Set a Texture Cube Data\n * @todo - could support TextureCubeArray with depth\n * @param data\n * @param index\n */\n setTextureCubeData(data: TextureCubeData, depth: number = 0): void {\n if (this.props.dimension !== 'cube') {\n throw new Error(this.id);\n }\n for (const face of Texture.CubeFaces) {\n this.setTextureCubeFaceData(data[face], face);\n }\n }\n\n /**\n * Sets an entire texture array\n * @param data\n */\n setTextureArrayData(data: TextureArrayData): void {\n if (this.props.dimension !== '2d-array') {\n throw new Error(this.id);\n }\n throw new Error('setTextureArrayData not implemented.');\n }\n\n /**\n * Sets an entire texture cube array\n * @param data\n */\n setTextureCubeArrayData(data: TextureCubeArrayData): void {\n throw new Error('setTextureCubeArrayData not supported in WebGL2.');\n }\n\n setTextureCubeFaceData(lodData: Texture2DData, face: TextureCubeFace, depth: number = 0): void {\n // assert(this.props.dimension === 'cube');\n\n // If the user provides multiple LODs, then automatic mipmap\n // generation generateMipmap() should be disabled to avoid overwriting them.\n if (Array.isArray(lodData) && lodData.length > 1 && this.props.mipmaps !== false) {\n log.warn(`${this.id} has mipmap and multiple LODs.`)();\n }\n\n const faceDepth = Texture.CubeFaces.indexOf(face);\n\n this.setTexture2DData(lodData, faceDepth);\n }\n\n // DEPRECATED METHODS\n\n /** Update external texture (video frame or canvas) @deprecated Use ExternalTexture */\n update(): void {\n throw new Error('Texture.update() not implemented. Use ExternalTexture');\n }\n\n // INTERNAL METHODS\n\n /** @todo update this method to accept LODs */\n setImageDataForFace(options): void {\n const {\n face,\n width,\n height,\n pixels,\n data,\n format = GL.RGBA,\n type = GL.UNSIGNED_BYTE\n // generateMipmap = false // TODO\n } = options;\n\n const {gl} = this;\n\n const imageData = pixels || data;\n\n this.bind();\n if (imageData instanceof Promise) {\n imageData.then(resolvedImageData =>\n this.setImageDataForFace(\n Object.assign({}, options, {\n face,\n data: resolvedImageData,\n pixels: resolvedImageData\n })\n )\n );\n } else if (this.width || this.height) {\n gl.texImage2D(face, 0, format, width, height, 0 /* border*/, format, type, imageData);\n } else {\n gl.texImage2D(face, 0, format, format, type, imageData);\n }\n }\n\n _getImageDataMap(faceData: Record<string | GL, any>): Record<GL, any> {\n for (let i = 0; i < Texture.CubeFaces.length; ++i) {\n const faceName = Texture.CubeFaces[i];\n if (faceData[faceName]) {\n faceData[GL.TEXTURE_CUBE_MAP_POSITIVE_X + i] = faceData[faceName];\n delete faceData[faceName];\n }\n }\n return faceData;\n }\n\n // RESOURCE METHODS\n\n /**\n * Sets sampler parameters on texture\n */\n _setSamplerParameters(parameters: GLSamplerParameters): void {\n log.log(1, `${this.id} sampler parameters`, this.device.getGLKeys(parameters))();\n\n this.gl.bindTexture(this.glTarget, this.handle);\n for (const [pname, pvalue] of Object.entries(parameters)) {\n const param = Number(pname) as keyof GLSamplerParameters;\n const value = pvalue;\n\n // Apparently integer/float issues require two different texture parameter setting functions in JavaScript.\n // For now, pick the float version for parameters specified as GLfloat.\n switch (param) {\n case GL.TEXTURE_MIN_LOD:\n case GL.TEXTURE_MAX_LOD:\n this.gl.texParameterf(this.glTarget, param, value);\n break;\n\n case GL.TEXTURE_MIN_FILTER:\n this.gl.texParameteri(this.glTarget, param, value);\n break;\n\n case GL.TEXTURE_WRAP_S:\n case GL.TEXTURE_WRAP_T:\n this.gl.texParameteri(this.glTarget, param, value);\n break;\n case GL.TEXTURE_MAX_ANISOTROPY_EXT:\n // We have to query feature before using it\n if (this.device.features.has('texture-filterable-anisotropic-webgl')) {\n this.gl.texParameteri(this.glTarget, param, value);\n }\n break;\n default:\n this.gl.texParameteri(this.glTarget, param, value);\n break;\n }\n }\n\n this.gl.bindTexture(this.glTarget, null);\n }\n\n // INTERNAL SETTERS\n\n /**\n * Copy a region of data from a CPU memory buffer into this texture.\n * @todo - GLUnpackParameters parameters\n */\n protected _setMipLevel(\n depth: number,\n mipLevel: number,\n textureData: Texture2DData,\n glTarget: GL = this.glTarget\n ) {\n // if (!textureData) {\n // clearMipLevel(this.device.gl, {...this, depth, level});\n // return;\n // }\n\n if (Texture.isExternalImage(textureData)) {\n copyExternalImageToMipLevel(this.device.gl, this.handle, textureData, {\n ...this,\n depth,\n mipLevel,\n glTarget,\n flipY: this.props.flipY\n });\n return;\n }\n\n // @ts-expect-error\n if (Texture.isTextureLevelData(textureData)) {\n copyCPUDataToMipLevel(this.device.gl, textureData.data, {\n ...this,\n depth,\n mipLevel,\n glTarget\n });\n return;\n }\n\n throw new Error('Texture: invalid image data');\n }\n // HELPERS\n\n getActiveUnit(): number {\n return this.gl.getParameter(GL.ACTIVE_TEXTURE) - GL.TEXTURE0;\n }\n\n bind(textureUnit?: number): number {\n const {gl} = this;\n\n if (textureUnit !== undefined) {\n this.textureUnit = textureUnit;\n gl.activeTexture(gl.TEXTURE0 + textureUnit);\n }\n\n gl.bindTexture(this.glTarget, this.handle);\n return textureUnit;\n }\n\n unbind(textureUnit?: number): number | undefined {\n const {gl} = this;\n\n if (textureUnit !== undefined) {\n this.textureUnit = textureUnit;\n gl.activeTexture(gl.TEXTURE0 + textureUnit);\n }\n\n gl.bindTexture(this.glTarget, null);\n return textureUnit;\n }\n}\n\n// TODO - Remove when texture refactor is complete\n\n/*\nsetCubeMapData(options: {\n width: number;\n height: number;\n data: Record<GL, Texture2DData> | Record<TextureCubeFace, Texture2DData>;\n format?: any;\n type?: any;\n /** @deprecated Use .data *\n pixels: any;\n}): void {\n const {gl} = this;\n\n const {width, height, pixels, data, format = GL.RGBA, type = GL.UNSIGNED_BYTE} = options;\n\n // pixel data (imageDataMap) is an Object from Face to Image or Promise.\n // For example:\n // {\n // GL.TEXTURE_CUBE_MAP_POSITIVE_X : Image-or-Promise,\n // GL.TEXTURE_CUBE_MAP_NEGATIVE_X : Image-or-Promise,\n // ... }\n // To provide multiple level-of-details (LODs) this can be Face to Array\n // of Image or Promise, like this\n // {\n // GL.TEXTURE_CUBE_MAP_POSITIVE_X : [Image-or-Promise-LOD-0, Image-or-Promise-LOD-1],\n // GL.TEXTURE_CUBE_MAP_NEGATIVE_X : [Image-or-Promise-LOD-0, Image-or-Promise-LOD-1],\n // ... }\n\n const imageDataMap = this._getImageDataMap(pixels || data);\n\n const resolvedFaces = WEBGLTexture.FACES.map(face => {\n const facePixels = imageDataMap[face];\n return Array.isArray(facePixels) ? facePixels : [facePixels];\n });\n this.bind();\n\n WEBGLTexture.FACES.forEach((face, index) => {\n if (resolvedFaces[index].length > 1 && this.props.mipmaps !== false) {\n // If the user provides multiple LODs, then automatic mipmap\n // generation generateMipmap() should be disabled to avoid overwritting them.\n log.warn(`${this.id} has mipmap and multiple LODs.`)();\n }\n resolvedFaces[index].forEach((image, lodLevel) => {\n // TODO: adjust width & height for LOD!\n if (width && height) {\n gl.texImage2D(face, lodLevel, format, width, height, 0 /* border*, format, type, image);\n } else {\n gl.texImage2D(face, lodLevel, format, format, type, image);\n }\n });\n });\n\n this.unbind();\n}\n*/\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Device, TextureViewProps} from '@luma.gl/core';\n// import {decodeTextureFormat} from '@luma.gl/core';\nimport {TextureView, Texture} from '@luma.gl/core';\n\nimport {WebGLDevice} from '../webgl-device';\nimport {WEBGLTexture} from './webgl-texture';\n\nexport class WEBGLTextureView extends TextureView {\n readonly device: WebGLDevice;\n readonly gl: WebGL2RenderingContext;\n readonly handle: null; // Does not have a WebGL representation\n readonly texture: WEBGLTexture;\n\n constructor(device: Device, props: TextureViewProps & {texture: WEBGLTexture}) {\n super(device, {...Texture.defaultProps, ...props});\n\n this.device = device as WebGLDevice;\n this.gl = this.device.gl;\n this.handle = null;\n this.texture = props.texture;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n//\n// WebGL... the texture API from hell... hopefully made simpler\n//\n\nimport {TypedArray} from '@math.gl/types';\nimport type {ExternalImage} from '@luma.gl/core';\nimport {Buffer, Texture, Framebuffer, FramebufferProps} from '@luma.gl/core';\nimport {\n GL,\n GLTextureTarget,\n GLTextureCubeMapTarget,\n GLTexelDataFormat,\n GLPixelType,\n GLDataType\n} from '@luma.gl/constants';\n\nimport {WEBGLFramebuffer} from '../resources/webgl-framebuffer';\nimport {getGLTypeFromTypedArray, getTypedArrayFromGLType} from './typed-array-utils';\nimport {glFormatToComponents, glTypeToBytes} from './format-utils';\nimport {WEBGLBuffer} from '../resources/webgl-buffer';\nimport {WEBGLTexture} from '../resources/webgl-texture';\nimport {withGLParameters} from '../../context/state-tracker/with-parameters';\n\n/** A \"border\" parameter is required in many WebGL texture APIs, but must always be 0... */\nconst BORDER = 0;\n\n/**\n * Options for setting data into a texture\n */\nexport type WebGLSetTextureOptions = {\n dimension: '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d';\n height: number;\n width: number;\n depth: number;\n mipLevel?: number;\n glTarget: GLTextureTarget;\n glInternalFormat: GL;\n glFormat: GLTexelDataFormat;\n glType: GLPixelType;\n compressed?: boolean;\n byteOffset?: number;\n byteLength?: number;\n};\n\n/**\n * Options for copying an image or data into a texture\n *\n * @param {GLenum} format - internal format of image data.\n * @param {GLenum} type\n * - format of array (autodetect from type) or\n * - (WEBGL2) format of buffer or ArrayBufferView\n * @param {GLenum} dataFormat - format of image data.\n * @param {Number} offset - (WEBGL2) offset from start of buffer\n * @parameters - temporary settings to be applied, can be used to supply pixel store settings.\n */\nexport type WebGLCopyTextureOptions = {\n dimension: '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d';\n /** mip level to be updated */\n mipLevel?: number;\n /** width of the sub image to be updated */\n width: number;\n /** height of the sub image to be updated */\n height: number;\n /** depth of texture to be updated */\n depth?: number;\n /** xOffset from where texture to be updated */\n x?: number;\n /** yOffset from where texture to be updated */\n y?: number;\n /** yOffset from where texture to be updated */\n z?: number;\n\n glTarget: GLTextureTarget;\n glInternalFormat: GL;\n glFormat: GL;\n glType: GL;\n compressed?: boolean;\n byteOffset?: number;\n byteLength?: number;\n};\n\n/**\n * Initializes a texture memory space\n * Clear all the textures and mip levels of a two-dimensional or array texture at the same time.\n * On some implementations faster than repeatedly setting levels\n *\n * @note From WebGL 2 spec section 3.7.6:\n * @see https://registry.khronos.org/webgl/specs/latest/2.0/\n * - The image contents are set as if a buffer of sufficient size initialized to 0 would be passed to each level's texImage2D/3D\n * - texStorage2D should be considered a preferred alternative to texImage2D. It may have lower memory costs than texImage2D in some implementations.\n * - Once texStorage*D has been called, the texture is immutable and can only be updated with texSubImage*(), not texImage()\n */\nexport function initializeTextureStorage(\n gl: WebGL2RenderingContext,\n levels: number,\n options: WebGLSetTextureOptions\n): void {\n const {dimension, width, height, depth = 0} = options;\n const {glInternalFormat} = options;\n const glTarget = options.glTarget; // getWebGLCubeFaceTarget(options.glTarget, dimension, depth);\n switch (dimension) {\n case '2d-array':\n case '3d':\n gl.texStorage3D(glTarget, levels, glInternalFormat, width, height, depth);\n break;\n\n default:\n gl.texStorage2D(glTarget, levels, glInternalFormat, width, height);\n }\n}\n\n/**\n * Copy a region of compressed data from a GPU memory buffer into this texture.\n */\nexport function copyExternalImageToMipLevel(\n gl: WebGL2RenderingContext,\n handle: WebGLTexture,\n image: ExternalImage,\n options: WebGLCopyTextureOptions & {flipY?: boolean}\n): void {\n const {width, height} = options;\n const {dimension, depth = 0, mipLevel = 0} = options;\n const {x = 0, y = 0, z = 0} = options;\n const {glFormat, glType} = options;\n\n const glTarget = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);\n\n const glParameters = options.flipY ? {[GL.UNPACK_FLIP_Y_WEBGL]: true} : {};\n withGLParameters(gl, glParameters, () => {\n switch (dimension) {\n case '2d-array':\n case '3d':\n gl.bindTexture(glTarget, handle);\n // prettier-ignore\n gl.texSubImage3D(glTarget, mipLevel, x, y, z, width, height, depth, glFormat, glType, image);\n gl.bindTexture(glTarget, null);\n break;\n\n case '2d':\n case 'cube':\n gl.bindTexture(glTarget, handle);\n // prettier-ignore\n gl.texSubImage2D(glTarget, mipLevel, x, y, width, height, glFormat, glType, image);\n gl.bindTexture(glTarget, null);\n break;\n\n default:\n throw new Error(dimension);\n }\n });\n}\n\n/**\n * Copy a region of data from a CPU memory buffer into this texture.\n */\nexport function copyCPUDataToMipLevel(\n gl: WebGL2RenderingContext,\n typedArray: TypedArray,\n options: WebGLCopyTextureOptions\n): void {\n const {dimension, width, height, depth = 0, mipLevel = 0, byteOffset = 0} = options;\n const {x = 0, y = 0, z = 0} = options;\n const {glFormat, glType, compressed} = options;\n const glTarget = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);\n\n // gl.bindTexture(glTarget, null);\n\n switch (dimension) {\n case '2d-array':\n case '3d':\n if (compressed) {\n // prettier-ignore\n gl.compressedTexSubImage3D(glTarget, mipLevel, x, y, z, width, height, depth, glFormat, typedArray, byteOffset); // , byteLength\n } else {\n // prettier-ignore\n gl.texSubImage3D(glTarget, mipLevel, x, y, z, width, height, depth, glFormat, glType, typedArray, byteOffset); // , byteLength\n }\n break;\n\n case '2d':\n case 'cube':\n if (compressed) {\n // prettier-ignore\n gl.compressedTexSubImage2D(glTarget, mipLevel, x, y, width, height, glFormat, typedArray, byteOffset); // , byteLength\n } else {\n // prettier-ignore\n gl.texSubImage2D(glTarget, mipLevel, x, y, width, height, glFormat, glType, typedArray, byteOffset); // , byteLength\n }\n break;\n\n default:\n throw new Error(dimension);\n }\n}\n\n/**\n * Copy a region of compressed data from a GPU memory buffer into this texture.\n */\nexport function copyGPUBufferToMipLevel(\n gl: WebGL2RenderingContext,\n webglBuffer: WebGLBuffer,\n byteLength: number,\n options: WebGLCopyTextureOptions\n): void {\n const {dimension, width, height, depth = 0, mipLevel = 0, byteOffset = 0} = options;\n const {x = 0, y = 0, z = 0} = options;\n const {glFormat, glType, compressed} = options;\n const glTarget = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);\n\n gl.bindBuffer(GL.PIXEL_UNPACK_BUFFER, webglBuffer);\n\n switch (dimension) {\n case '2d-array':\n case '3d':\n // 3 dimensional textures requires 3D texture functions\n if (compressed) {\n // TODO enable extension?\n // prettier-ignore\n gl.compressedTexSubImage3D(glTarget, mipLevel, x, y, z, width, height, depth, glFormat, byteLength, byteOffset);\n } else {\n // prettier-ignore\n gl.texSubImage3D(glTarget, mipLevel, x, y, z, width, height, depth, glFormat, glType, byteOffset);\n }\n break;\n\n case '2d':\n case 'cube':\n if (compressed) {\n // prettier-ignore\n gl.compressedTexSubImage2D(glTarget, mipLevel, x, y, width, height, glFormat, byteLength, byteOffset);\n } else {\n // prettier-ignore\n gl.texSubImage2D(glTarget, mipLevel, x, y, width, height, BORDER, glFormat, byteOffset);\n }\n break;\n\n default:\n throw new Error(dimension);\n }\n}\n\n// INTERNAL HELPERS\n\n/** Convert a WebGPU style texture constant to a WebGL style texture constant */\nexport function getWebGLTextureTarget(\n dimension: '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d'\n): GLTextureTarget {\n // prettier-ignore\n switch (dimension) {\n case '1d': break; // not supported in any WebGL version\n case '2d': return GL.TEXTURE_2D; // supported in WebGL1\n case '3d': return GL.TEXTURE_3D; // supported in WebGL2\n case 'cube': return GL.TEXTURE_CUBE_MAP; // supported in WebGL1\n case '2d-array': return GL.TEXTURE_2D_ARRAY; // supported in WebGL2\n case 'cube-array': break; // not supported in any WebGL version\n }\n throw new Error(dimension);\n}\n\n/**\n * In WebGL, cube maps specify faces by overriding target instead of using the depth parameter.\n * @note We still bind the texture using GL.TEXTURE_CUBE_MAP, but we need to use the face-specific target when setting mip levels.\n * @returns glTarget unchanged, if dimension !== 'cube'.\n */\nexport function getWebGLCubeFaceTarget(\n glTarget: GLTextureTarget,\n dimension: '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d',\n level: number\n): GLTextureTarget | GLTextureCubeMapTarget {\n return dimension === 'cube' ? GL.TEXTURE_CUBE_MAP_POSITIVE_X + level : glTarget;\n}\n\n// texImage methods\n\n/**\n * Clear a texture mip level.\n * Wrapper for the messy WebGL texture API\n *\nexport function clearMipLevel(gl: WebGL2RenderingContext, options: WebGLSetTextureOptions): void {\n const {dimension, width, height, depth = 0, mipLevel = 0} = options;\n const {glInternalFormat, glFormat, glType, compressed} = options;\n const glTarget = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);\n\n switch (dimension) {\n case '2d-array':\n case '3d':\n if (compressed) {\n // prettier-ignore\n gl.compressedTexImage3D(glTarget, mipLevel, glInternalFormat, width, height, depth, BORDER, null);\n } else {\n // prettier-ignore\n gl.texImage3D( glTarget, mipLevel, glInternalFormat, width, height, depth, BORDER, glFormat, glType, null);\n }\n break;\n\n case '2d':\n case 'cube':\n if (compressed) {\n // prettier-ignore\n gl.compressedTexImage2D(glTarget, mipLevel, glInternalFormat, width, height, BORDER, null);\n } else {\n // prettier-ignore\n gl.texImage2D(glTarget, mipLevel, glInternalFormat, width, height, BORDER, glFormat, glType, null);\n }\n break;\n\n default:\n throw new Error(dimension);\n }\n}\n */\n\n/**\n * Set a texture mip level to the contents of an external image.\n * Wrapper for the messy WebGL texture API\n * @note Corresponds to WebGPU device.queue.copyExternalImageToTexture()\n *\nexport function setMipLevelFromExternalImage(\n gl: WebGL2RenderingContext,\n image: ExternalImage,\n options: WebGLSetTextureOptions\n): void {\n const {dimension, width, height, depth = 0, level = 0} = options;\n const {glInternalFormat, glType} = options;\n\n const glTarget = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);\n\n // TODO - we can't change texture width (due to WebGPU limitations) -\n // and the width/heigh of an external image is implicit, so why do we need to extract it?\n // So what width height do we supply? The image size or the texture size?\n // const {width, height} = Texture.getExternalImageSize(image);\n\n switch (dimension) {\n case '2d-array':\n case '3d':\n // prettier-ignore\n gl.texImage3D(glTarget, level, glInternalFormat, width, height, depth, BORDER, glInternalFormat, glType, image);\n break;\n\n case '2d':\n case 'cube':\n // prettier-ignore\n gl.texImage2D(glTarget, level, glInternalFormat, width, height, BORDER, glInternalFormat, glType, image);\n break;\n\n default:\n throw new Error(dimension);\n }\n}\n\n/**\n * Set a texture mip level from CPU memory\n * Wrapper for the messy WebGL texture API\n * @note Not available (directly) in WebGPU\n *\nexport function setMipLevelFromTypedArray(\n gl: WebGL2RenderingContext,\n data: TypedArray,\n parameters: {},\n options: {\n dimension: '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d';\n height: number;\n width: number;\n depth?: number;\n level?: number;\n offset?: number;\n glTarget: GLTextureTarget;\n glInternalFormat: GL;\n glFormat: GL;\n glType: GL;\n compressed?: boolean;\n }\n): void {\n const {dimension, width, height, depth = 0, level = 0, offset = 0} = options;\n const {glInternalFormat, glFormat, glType, compressed} = options;\n\n const glTarget = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);\n\n withGLParameters(gl, parameters, () => {\n switch (dimension) {\n case '2d-array':\n case '3d':\n if (compressed) {\n // prettier-ignore\n gl.compressedTexImage3D(glTarget, level, glInternalFormat, width, height, depth, BORDER, data);\n } else {\n // prettier-ignore\n gl.texImage3D( glTarget, level, glInternalFormat, width, height, depth, BORDER, glFormat, glType, data);\n }\n break;\n\n case '2d':\n if (compressed) {\n // prettier-ignore\n gl.compressedTexImage2D(glTarget, level, glInternalFormat, width, height, BORDER, data);\n } else {\n // prettier-ignore\n gl.texImage2D( glTarget, level, glInternalFormat, width, height, BORDER, glFormat, glType, data, offset);\n }\n break;\n\n default:\n throw new Error(dimension);\n }\n });\n}\n\n/**\n * Set a texture level from CPU memory\n * @note Not available (directly) in WebGPU\n _setMipLevelFromTypedArray(\n depth: number,\n level: number,\n data: TextureLevelData,\n offset = 0,\n parameters\n ): void {\n withGLParameters(this.gl, parameters, () => {\n switch (this.props.dimension) {\n case '2d-array':\n case '3d':\n if (this.compressed) {\n // prettier-ignore\n this.device.gl.compressedTexImage3D(this.glTarget, level, this.glInternalFormat, data.width, data.height, depth, BORDER, data.data);\n } else {\n // prettier-ignore\n this.gl.texImage3D( this.glTarget, level, this.glInternalFormat, this.width, this.height, depth, BORDER, this.glFormat, this.glType, data.data);\n }\n break;\n\n case '2d':\n if (this.compressed) {\n // prettier-ignore\n this.device.gl.compressedTexImage2D(this.glTarget, level, this.glInternalFormat, data.width, data.height, BORDER, data.data);\n } else {\n // prettier-ignore\n this.device.gl.texImage2D( this.glTarget, level, this.glInternalFormat, this.width, this.height, BORDER, this.glFormat, this.glType, data.data, offset);\n }\n break;\n\n default:\n throw new Error(this.props.dimension);\n }\n });\n }\n\n * Set a texture level from a GPU buffer\n *\nexport function setMipLevelFromGPUBuffer(\n gl: WebGL2RenderingContext,\n buffer: Buffer,\n options: WebGLSetTextureOptions\n): void {\n const {dimension, width, height, depth = 0, level = 0, byteOffset = 0} = options;\n const {glInternalFormat, glFormat, glType, compressed} = options;\n const glTarget = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);\n\n const webglBuffer = buffer as WEBGLBuffer;\n const imageSize = buffer.byteLength;\n\n // In WebGL the source buffer is not a parameter. Instead it needs to be bound to a special bind point\n gl.bindBuffer(GL.PIXEL_UNPACK_BUFFER, webglBuffer.handle);\n\n switch (dimension) {\n case '2d-array':\n case '3d':\n if (compressed) {\n // prettier-ignore\n gl.compressedTexImage3D(glTarget, level, glInternalFormat, width, height, depth, BORDER, imageSize, byteOffset);\n } else {\n // prettier-ignore\n gl.texImage3D(glTarget, level, glInternalFormat, width, height, depth, BORDER, glFormat, glType, byteOffset);\n }\n break;\n\n case '2d':\n if (compressed) {\n // prettier-ignore\n gl.compressedTexImage2D(glTarget, level, glInternalFormat, width, height, BORDER, imageSize, byteOffset);\n } else {\n // prettier-ignore\n gl.texImage2D(glTarget, level, glInternalFormat, width, height, BORDER, glFormat, glType, byteOffset);\n }\n break;\n\n default:\n throw new Error(dimension);\n }\n\n gl.bindBuffer(GL.PIXEL_UNPACK_BUFFER, null);\n}\n*/\nexport type ReadPixelsToArrayOptions = {\n sourceX?: number;\n sourceY?: number;\n sourceFormat?: number;\n sourceAttachment?: number;\n target?: Uint8Array | Uint16Array | Float32Array;\n // following parameters are auto deduced if not provided\n sourceWidth?: number;\n sourceHeight?: number;\n sourceDepth?: number;\n sourceType?: number;\n};\n\nexport type ReadPixelsToBufferOptions = {\n sourceX?: number;\n sourceY?: number;\n sourceFormat?: number;\n target?: Buffer; // A new Buffer object is created when not provided.\n targetByteOffset?: number; // byte offset in buffer object\n // following parameters are auto deduced if not provided\n sourceWidth?: number;\n sourceHeight?: number;\n sourceType?: number;\n};\n\n/**\n * Copies data from a type or a Texture object into ArrayBuffer object.\n * App can provide targetPixelArray or have it auto allocated by this method\n * newly allocated by this method unless provided by app.\n * @deprecated Use CommandEncoder.copyTextureToBuffer and Buffer.read\n * @note Slow requires roundtrip to GPU\n *\n * @param source\n * @param options\n * @returns pixel array,\n */\nexport function readPixelsToArray(\n source: Framebuffer | Texture,\n options?: ReadPixelsToArrayOptions\n): Uint8Array | Uint16Array | Float32Array {\n const {\n sourceX = 0,\n sourceY = 0,\n sourceAttachment = 0 // TODO - support gl.readBuffer\n } = options || {};\n let {\n target = null,\n // following parameters are auto deduced if not provided\n sourceWidth,\n sourceHeight,\n sourceDepth,\n sourceFormat,\n sourceType\n } = options || {};\n\n const {framebuffer, deleteFramebuffer} = getFramebuffer(source);\n // assert(framebuffer);\n const {gl, handle} = framebuffer;\n\n sourceWidth ||= framebuffer.width;\n sourceHeight ||= framebuffer.height;\n\n const texture = framebuffer.colorAttachments[sourceAttachment]?.texture;\n if (!texture) {\n throw new Error(`Invalid framebuffer attachment ${sourceAttachment}`);\n }\n sourceDepth = texture?.depth || 1;\n\n sourceFormat ||= texture?.glFormat || GL.RGBA;\n // Deduce the type from color attachment if not provided.\n sourceType ||= texture?.glType || GL.UNSIGNED_BYTE;\n\n // Deduce type and allocated pixelArray if needed\n target = getPixelArray(target, sourceType, sourceFormat, sourceWidth, sourceHeight, sourceDepth);\n\n // Pixel array available, if necessary, deduce type from it.\n sourceType = sourceType || getGLTypeFromTypedArray(target);\n\n // Note: luma.gl overrides bindFramebuffer so that we can reliably restore the previous framebuffer (this is the only function for which we do that)\n const prevHandle = gl.bindFramebuffer(\n GL.FRAMEBUFFER,\n handle\n ) as unknown as WebGLFramebuffer | null;\n\n // Select the color attachment to read from\n gl.readBuffer(gl.COLOR_ATTACHMENT0 + sourceAttachment);\n\n // There is a lot of hedging in the WebGL2 spec about what formats are guaranteed to be readable\n // (It should always be possible to read RGBA/UNSIGNED_BYTE, but most other combinations are not guaranteed)\n // Querying is possible but expensive:\n // const {device} = framebuffer;\n // texture.glReadFormat ||= gl.getParameter(gl.IMPLEMENTATION_COLOR_READ_FORMAT);\n // texture.glReadType ||= gl.getParameter(gl.IMPLEMENTATION_COLOR_READ_TYPE);\n // console.log('params', device.getGLKey(texture.glReadFormat), device.getGLKey(texture.glReadType));\n\n gl.readPixels(sourceX, sourceY, sourceWidth, sourceHeight, sourceFormat, sourceType, target);\n gl.readBuffer(gl.COLOR_ATTACHMENT0);\n gl.bindFramebuffer(GL.FRAMEBUFFER, prevHandle || null);\n\n if (deleteFramebuffer) {\n framebuffer.destroy();\n }\n\n return target;\n}\n\n/**\n * Copies data from a Framebuffer or a Texture object into a Buffer object.\n * NOTE: doesn't wait for copy to be complete, it programs GPU to perform a DMA transffer.\n * @deprecated Use CommandEncoder\n * @param source\n * @param options\n */\nexport function readPixelsToBuffer(\n source: Framebuffer | Texture,\n options?: ReadPixelsToBufferOptions\n): WEBGLBuffer {\n const {\n target,\n sourceX = 0,\n sourceY = 0,\n sourceFormat = GL.RGBA,\n targetByteOffset = 0\n } = options || {};\n // following parameters are auto deduced if not provided\n let {sourceWidth, sourceHeight, sourceType} = options || {};\n const {framebuffer, deleteFramebuffer} = getFramebuffer(source);\n // assert(framebuffer);\n sourceWidth = sourceWidth || framebuffer.width;\n sourceHeight = sourceHeight || framebuffer.height;\n\n // Asynchronous read (PIXEL_PACK_BUFFER) is WebGL2 only feature\n const webglFramebuffer = framebuffer;\n\n // deduce type if not available.\n sourceType = sourceType || GL.UNSIGNED_BYTE;\n\n let webglBufferTarget = target as unknown as WEBGLBuffer | undefined;\n if (!webglBufferTarget) {\n // Create new buffer with enough size\n const components = glFormatToComponents(sourceFormat);\n const byteCount = glTypeToBytes(sourceType);\n const byteLength = targetByteOffset + sourceWidth * sourceHeight * components * byteCount;\n webglBufferTarget = webglFramebuffer.device.createBuffer({byteLength});\n }\n\n // TODO(donmccurdy): Do we have tests to confirm this is working?\n const commandEncoder = source.device.createCommandEncoder();\n commandEncoder.copyTextureToBuffer({\n sourceTexture: source as Texture,\n width: sourceWidth,\n height: sourceHeight,\n origin: [sourceX, sourceY],\n destinationBuffer: webglBufferTarget,\n byteOffset: targetByteOffset\n });\n commandEncoder.destroy();\n\n if (deleteFramebuffer) {\n framebuffer.destroy();\n }\n\n return webglBufferTarget;\n}\n\n/**\n * Copy a rectangle from a Framebuffer or Texture object into a texture (at an offset)\n * @deprecated Use CommandEncoder\n */\n// eslint-disable-next-line complexity, max-statements\nexport function copyToTexture(\n sourceTexture: Framebuffer | Texture,\n destinationTexture: Texture | GL,\n options?: {\n sourceX?: number;\n sourceY?: number;\n\n targetX?: number;\n targetY?: number;\n targetZ?: number;\n targetMipmaplevel?: number;\n targetInternalFormat?: number;\n\n width?: number; // defaults to target width\n height?: number; // defaults to target height\n }\n): Texture {\n const {\n sourceX = 0,\n sourceY = 0,\n // attachment = GL.COLOR_ATTACHMENT0, // TODO - support gl.readBuffer\n targetMipmaplevel = 0,\n targetInternalFormat = GL.RGBA\n } = options || {};\n let {\n targetX,\n targetY,\n targetZ,\n width, // defaults to target width\n height // defaults to target height\n } = options || {};\n\n const {framebuffer, deleteFramebuffer} = getFramebuffer(sourceTexture);\n // assert(framebuffer);\n const webglFramebuffer = framebuffer;\n const {device, handle} = webglFramebuffer;\n const isSubCopy =\n typeof targetX !== 'undefined' ||\n typeof targetY !== 'undefined' ||\n typeof targetZ !== 'undefined';\n targetX = targetX || 0;\n targetY = targetY || 0;\n targetZ = targetZ || 0;\n const prevHandle = device.gl.bindFramebuffer(GL.FRAMEBUFFER, handle);\n // TODO - support gl.readBuffer (WebGL2 only)\n // const prevBuffer = gl.readBuffer(attachment);\n // assert(target);\n let texture: WEBGLTexture | null = null;\n let textureTarget: GL;\n if (destinationTexture instanceof WEBGLTexture) {\n texture = destinationTexture;\n width = Number.isFinite(width) ? width : texture.width;\n height = Number.isFinite(height) ? height : texture.height;\n texture?.bind(0);\n // @ts-ignore\n textureTarget = texture.target;\n } else {\n // @ts-ignore\n textureTarget = target;\n }\n\n if (!isSubCopy) {\n device.gl.copyTexImage2D(\n textureTarget,\n targetMipmaplevel,\n targetInternalFormat,\n sourceX,\n sourceY,\n width,\n height,\n 0 /* border must be 0 */\n );\n } else {\n switch (textureTarget) {\n case GL.TEXTURE_2D:\n case GL.TEXTURE_CUBE_MAP:\n device.gl.copyTexSubImage2D(\n textureTarget,\n targetMipmaplevel,\n targetX,\n targetY,\n sourceX,\n sourceY,\n width,\n height\n );\n break;\n case GL.TEXTURE_2D_ARRAY:\n case GL.TEXTURE_3D:\n device.gl.copyTexSubImage3D(\n textureTarget,\n targetMipmaplevel,\n targetX,\n targetY,\n targetZ,\n sourceX,\n sourceY,\n width,\n height\n );\n break;\n default:\n }\n }\n if (texture) {\n texture.unbind();\n }\n // @ts-expect-error\n device.gl.bindFramebuffer(GL.FRAMEBUFFER, prevHandle || null);\n if (deleteFramebuffer) {\n framebuffer.destroy();\n }\n return texture;\n}\n\nfunction getFramebuffer(source: Texture | Framebuffer): {\n framebuffer: WEBGLFramebuffer;\n deleteFramebuffer: boolean;\n} {\n if (!(source instanceof Framebuffer)) {\n return {framebuffer: toFramebuffer(source), deleteFramebuffer: true};\n }\n return {framebuffer: source as WEBGLFramebuffer, deleteFramebuffer: false};\n}\n\n/**\n * Wraps a given texture into a framebuffer object, that can be further used\n * to read data from the texture object.\n */\nexport function toFramebuffer(texture: Texture, props?: FramebufferProps): WEBGLFramebuffer {\n const {device, width, height, id} = texture;\n const framebuffer = device.createFramebuffer({\n ...props,\n id: `framebuffer-for-${id}`,\n width,\n height,\n colorAttachments: [texture]\n });\n return framebuffer as WEBGLFramebuffer;\n}\n\n// eslint-disable-next-line max-params\nfunction getPixelArray(\n pixelArray,\n glType: GLDataType | GLPixelType,\n glFormat: GL,\n width: number,\n height: number,\n depth?: number\n): Uint8Array | Uint16Array | Float32Array {\n if (pixelArray) {\n return pixelArray;\n }\n // const formatInfo = decodeTextureFormat(format);\n // Allocate pixel array if not already available, using supplied type\n glType ||= GL.UNSIGNED_BYTE;\n const ArrayType = getTypedArrayFromGLType(glType, {clamped: false});\n const components = glFormatToComponents(glFormat);\n // TODO - check for composite type (components = 1).\n return new ArrayType(width * height * components) as Uint8Array | Uint16Array | Float32Array;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {TypedArray, TypedArrayConstructor} from '@math.gl/types';\nimport {GL, GLDataType, GLPixelType} from '@luma.gl/constants';\n\nconst ERR_TYPE_DEDUCTION = 'Failed to deduce GL constant from typed array';\n\n/**\n * Converts TYPED ARRAYS to corresponding GL constant\n * Used to auto deduce gl parameter types\n * @deprecated Use getDataTypeFromTypedArray\n * @param arrayOrType\n * @returns\n */\nexport function getGLTypeFromTypedArray(arrayOrType: TypedArray): GLDataType {\n // If typed array, look up constructor\n const type = ArrayBuffer.isView(arrayOrType) ? arrayOrType.constructor : arrayOrType;\n switch (type) {\n case Float32Array:\n return GL.FLOAT;\n case Uint16Array:\n return GL.UNSIGNED_SHORT;\n case Uint32Array:\n return GL.UNSIGNED_INT;\n case Uint8Array:\n return GL.UNSIGNED_BYTE;\n case Uint8ClampedArray:\n return GL.UNSIGNED_BYTE;\n case Int8Array:\n return GL.BYTE;\n case Int16Array:\n return GL.SHORT;\n case Int32Array:\n return GL.INT;\n default:\n throw new Error(ERR_TYPE_DEDUCTION);\n }\n}\n\n/**\n * Converts GL constant to corresponding TYPED ARRAY\n * Used to auto deduce gl parameter types\n * @deprecated Use getTypedArrayFromDataType\n * @param glType\n * @param param1\n * @returns\n */\n// eslint-disable-next-line complexity\nexport function getTypedArrayFromGLType(\n glType: GLDataType | GLPixelType,\n options?: {\n clamped?: boolean;\n }\n): TypedArrayConstructor {\n const {clamped = true} = options || {};\n // Sorted in some order of likelihood to reduce amount of comparisons\n switch (glType) {\n case GL.FLOAT:\n return Float32Array;\n case GL.UNSIGNED_SHORT:\n case GL.UNSIGNED_SHORT_5_6_5:\n case GL.UNSIGNED_SHORT_4_4_4_4:\n case GL.UNSIGNED_SHORT_5_5_5_1:\n return Uint16Array;\n case GL.UNSIGNED_INT:\n return Uint32Array;\n case GL.UNSIGNED_BYTE:\n return clamped ? Uint8ClampedArray : Uint8Array;\n case GL.BYTE:\n return Int8Array;\n case GL.SHORT:\n return Int16Array;\n case GL.INT:\n return Int32Array;\n default:\n throw new Error('Failed to deduce typed array type from GL constant');\n }\n}\n\n/**\n * Flip rows (can be used on arrays returned from `Framebuffer.readPixels`)\n * https: *stackoverflow.com/questions/41969562/\n * how-can-i-flip-the-result-of-webglrenderingcontext-readpixels\n * @param param0\n */\nexport function flipRows(options: {\n data: TypedArray;\n width: number;\n height: number;\n bytesPerPixel?: number;\n temp?: Uint8Array;\n}): void {\n const {data, width, height, bytesPerPixel = 4, temp} = options;\n const bytesPerRow = width * bytesPerPixel;\n\n // make a temp buffer to hold one row\n const tempBuffer = temp || new Uint8Array(bytesPerRow);\n for (let y = 0; y < height / 2; ++y) {\n const topOffset = y * bytesPerRow;\n const bottomOffset = (height - y - 1) * bytesPerRow;\n // make copy of a row on the top half\n tempBuffer.set(data.subarray(topOffset, topOffset + bytesPerRow));\n // copy a row from the bottom half to the top\n data.copyWithin(topOffset, bottomOffset, bottomOffset + bytesPerRow);\n // copy the copy of the top half row to the bottom half\n data.set(tempBuffer, bottomOffset);\n }\n}\n\nexport function scalePixels(options: {data: TypedArray; width: number; height: number}): {\n data: Uint8Array;\n width: number;\n height: number;\n} {\n const {data, width, height} = options;\n const newWidth = Math.round(width / 2);\n const newHeight = Math.round(height / 2);\n const newData = new Uint8Array(newWidth * newHeight * 4);\n for (let y = 0; y < newHeight; y++) {\n for (let x = 0; x < newWidth; x++) {\n for (let c = 0; c < 4; c++) {\n newData[(y * newWidth + x) * 4 + c] = data[(y * 2 * width + x * 2) * 4 + c];\n }\n }\n }\n return {data: newData, width: newWidth, height: newHeight};\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {GL} from '@luma.gl/constants';\n\n// Returns number of components in a specific readPixels WebGL format\nexport function glFormatToComponents(format) {\n switch (format) {\n case GL.ALPHA:\n case GL.R32F:\n case GL.RED:\n case GL.RED_INTEGER:\n return 1;\n case GL.RG32I:\n case GL.RG32UI:\n case GL.RG32F:\n case GL.RG_INTEGER:\n case GL.RG:\n return 2;\n case GL.RGB:\n case GL.RGB_INTEGER:\n case GL.RGB32F:\n return 3;\n case GL.RGBA:\n case GL.RGBA_INTEGER:\n case GL.RGBA32F:\n return 4;\n // TODO: Add support for additional WebGL2 formats\n default:\n return 0;\n }\n}\n\n// Return byte count for given readPixels WebGL type\nexport function glTypeToBytes(type) {\n switch (type) {\n case GL.UNSIGNED_BYTE:\n return 1;\n case GL.UNSIGNED_SHORT_5_6_5:\n case GL.UNSIGNED_SHORT_4_4_4_4:\n case GL.UNSIGNED_SHORT_5_5_5_1:\n return 2;\n case GL.FLOAT:\n return 4;\n // TODO: Add support for additional WebGL2 types\n default:\n return 0;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {GLParameters, setGLParameters} from '../parameters/unified-parameter-api';\nimport {WebGLStateTracker} from './webgl-state-tracker';\n\n/**\n * Execute a function with a set of temporary WebGL parameter overrides\n * - Saves current \"global\" WebGL context settings\n * - Sets the supplies WebGL context parameters,\n * - Executes supplied function\n * - Restores parameters\n * - Returns the return value of the supplied function\n */\nexport function withGLParameters(\n gl: WebGL2RenderingContext,\n parameters: GLParameters & {nocatch?: boolean},\n func: any\n): any {\n if (isObjectEmpty(parameters)) {\n // Avoid setting state if no parameters provided. Just call and return\n return func(gl);\n }\n\n const {nocatch = true} = parameters;\n\n const webglState = WebGLStateTracker.get(gl);\n webglState.push();\n setGLParameters(gl, parameters);\n\n // Setup is done, call the function\n let value;\n\n if (nocatch) {\n // Avoid try catch to minimize stack size impact for safe execution paths\n value = func(gl);\n webglState.pop();\n } else {\n // Wrap in a try-catch to ensure that parameters are restored on exceptions\n try {\n value = func(gl);\n } finally {\n webglState.pop();\n }\n }\n\n return value;\n}\n\n// Helpers\n\n// Returns true if given object is empty, false otherwise.\nfunction isObjectEmpty(object) {\n // @ts-ignore - dummy key variable\n for (const key in object) {\n return false;\n }\n return true;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {NumericArray, NumberArray4} from '@math.gl/types';\nimport {RenderPass, RenderPassProps, RenderPassParameters} from '@luma.gl/core';\nimport {WebGLDevice} from '../webgl-device';\nimport {GL, GLParameters} from '@luma.gl/constants';\nimport {withGLParameters} from '../../context/state-tracker/with-parameters';\nimport {setGLParameters} from '../../context/parameters/unified-parameter-api';\nimport {WEBGLQuerySet} from './webgl-query-set';\n\nconst COLOR_CHANNELS = [0x1, 0x2, 0x4, 0x8]; // GPUColorWrite RED, GREEN, BLUE, ALPHA\n\nexport class WEBGLRenderPass extends RenderPass {\n readonly device: WebGLDevice;\n\n /** Parameters that should be applied before each draw call */\n glParameters: GLParameters;\n\n constructor(device: WebGLDevice, props: RenderPassProps) {\n super(device, props);\n this.device = device;\n\n // If no viewport is provided, apply reasonably defaults\n let viewport;\n if (!props?.parameters?.viewport) {\n if (props?.framebuffer) {\n // Set the viewport to the size of the framebuffer\n const {width, height} = props.framebuffer;\n viewport = [0, 0, width, height];\n } else {\n // Instead of using our own book-keeping, we can just read the values from the WebGL context\n const [width, height] = device.getCanvasContext().getDrawingBufferSize();\n viewport = [0, 0, width, height];\n }\n }\n\n // TODO - do parameters (scissorRect) affect the clear operation?\n this.device.pushState();\n this.setParameters({viewport, ...this.props.parameters});\n\n // Specify mapping of draw buffer locations to color attachments\n if (this.props.framebuffer) {\n const drawBuffers = this.props.framebuffer.colorAttachments.map(\n (_, i) => GL.COLOR_ATTACHMENT0 + i\n );\n this.device.gl.drawBuffers(drawBuffers);\n } else {\n this.device.gl.drawBuffers([GL.BACK]);\n }\n\n // Hack - for now WebGL draws in \"immediate mode\" (instead of queueing the operations)...\n this.clear();\n }\n\n end(): void {\n this.device.popState();\n // should add commands to CommandEncoder.\n }\n\n pushDebugGroup(groupLabel: string): void {}\n popDebugGroup(): void {}\n insertDebugMarker(markerLabel: string): void {}\n\n // beginOcclusionQuery(queryIndex: number): void;\n // endOcclusionQuery(): void;\n\n // executeBundles(bundles: Iterable<GPURenderBundle>): void;\n\n /**\n * Maps RenderPass parameters to GL parameters\n */\n setParameters(parameters: RenderPassParameters = {}): void {\n const glParameters: GLParameters = {...this.glParameters};\n\n // Framebuffers are specified using parameters in WebGL\n glParameters.framebuffer = this.props.framebuffer || null;\n\n if (this.props.depthReadOnly) {\n glParameters.depthMask = !this.props.depthReadOnly;\n }\n\n glParameters.stencilMask = this.props.stencilReadOnly ? 0 : 1;\n\n glParameters[GL.RASTERIZER_DISCARD] = this.props.discard;\n\n // Map the four renderpass parameters to WebGL parameters\n if (parameters.viewport) {\n // WebGPU viewports are 6 coordinates (X, Y, Z)\n if (parameters.viewport.length >= 6) {\n glParameters.viewport = parameters.viewport.slice(0, 4) as NumberArray4;\n glParameters.depthRange = [parameters.viewport[4], parameters.viewport[5]];\n } else {\n // WebGL viewports are 4 coordinates (X, Y)\n glParameters.viewport = parameters.viewport as NumberArray4;\n }\n }\n if (parameters.scissorRect) {\n glParameters.scissorTest = true;\n glParameters.scissor = parameters.scissorRect;\n }\n if (parameters.blendConstant) {\n glParameters.blendColor = parameters.blendConstant;\n }\n if (parameters.stencilReference) {\n // eslint-disable-next-line no-console\n console.warn('RenderPassParameters.stencilReference not yet implemented in WebGL');\n // parameters.stencilFunc = [func, ref, mask];\n // Does this work?\n parameters[GL.STENCIL_REF] = parameters.stencilReference;\n }\n\n if (parameters.colorMask) {\n glParameters.colorMask = COLOR_CHANNELS.map(channel =>\n Boolean(channel & parameters.colorMask)\n );\n }\n\n this.glParameters = glParameters;\n\n setGLParameters(this.device.gl, glParameters);\n }\n\n beginOcclusionQuery(queryIndex: number): void {\n const webglQuerySet = this.props.occlusionQuerySet as WEBGLQuerySet;\n webglQuerySet?.beginOcclusionQuery();\n }\n\n override endOcclusionQuery(): void {\n const webglQuerySet = this.props.occlusionQuerySet as WEBGLQuerySet;\n webglQuerySet?.endOcclusionQuery();\n }\n\n // PRIVATE\n\n /**\n * Optionally clears depth, color and stencil buffers based on parameters\n */\n protected clear(): void {\n const glParameters: GLParameters = {...this.glParameters};\n\n let clearMask = 0;\n\n if (this.props.clearColors) {\n this.props.clearColors.forEach((color, drawBufferIndex) => {\n if (color) {\n this.clearColorBuffer(drawBufferIndex, color);\n }\n });\n }\n\n if (this.props.clearColor !== false && this.props.clearColors === undefined) {\n clearMask |= GL.COLOR_BUFFER_BIT;\n glParameters.clearColor = this.props.clearColor;\n }\n if (this.props.clearDepth !== false) {\n clearMask |= GL.DEPTH_BUFFER_BIT;\n glParameters.clearDepth = this.props.clearDepth;\n }\n if (this.props.clearStencil !== false) {\n clearMask |= GL.STENCIL_BUFFER_BIT;\n glParameters.clearStencil = this.props.clearStencil;\n }\n\n if (clearMask !== 0) {\n // Temporarily set any clear \"colors\" and call clear\n withGLParameters(this.device.gl, glParameters, () => {\n this.device.gl.clear(clearMask);\n });\n }\n }\n\n /**\n * WebGL2 - clear a specific color buffer\n */\n protected clearColorBuffer(drawBuffer: number = 0, value: NumericArray = [0, 0, 0, 0]) {\n withGLParameters(this.device.gl, {framebuffer: this.props.framebuffer}, () => {\n // Method selection per OpenGL ES 3 docs\n switch (value.constructor) {\n case Int8Array:\n case Int16Array:\n case Int32Array:\n this.device.gl.clearBufferiv(GL.COLOR, drawBuffer, value);\n break;\n case Uint8Array:\n case Uint8ClampedArray:\n case Uint16Array:\n case Uint32Array:\n this.device.gl.clearBufferuiv(GL.COLOR, drawBuffer, value);\n break;\n case Float32Array:\n this.device.gl.clearBufferfv(GL.COLOR, drawBuffer, value);\n break;\n default:\n throw new Error('clearColorBuffer: color must be typed array');\n }\n });\n }\n\n /*\n clearDepthStencil() {\n case GL.DEPTH:\n this.device.gl.clearBufferfv(GL.DEPTH, 0, [value]);\n break;\n\n case GL_STENCIL:\n this.device.gl.clearBufferiv(GL.STENCIL, 0, [value]);\n break;\n\n case GL.DEPTH_STENCIL:\n const [depth, stencil] = value;\n this.device.gl.clearBufferfi(GL.DEPTH_STENCIL, 0, depth, stencil);\n break;\n\n default:\n assert(false, ERR_ARGUMENTS);\n }\n });\n */\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {\n RenderPipelineProps,\n RenderPipelineParameters,\n PrimitiveTopology,\n ShaderLayout,\n UniformValue,\n Binding,\n RenderPass,\n VertexArray\n} from '@luma.gl/core';\nimport {RenderPipeline, log} from '@luma.gl/core';\n// import {getAttributeInfosFromLayouts} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\n\nimport {getShaderLayoutFromGLSL} from '../helpers/get-shader-layout';\nimport {withDeviceAndGLParameters} from '../converters/device-parameters';\nimport {setUniform} from '../helpers/set-uniform';\nimport {splitUniformsAndBindings} from '../../utils/split-uniforms-and-bindings';\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';\nimport {WEBGLTextureView} from './webgl-texture-view';\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 = props.vs as WEBGLShader;\n this.fs = props.fs as WEBGLShader;\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.varyings = varyings;\n this.device.gl.transformFeedbackVaryings(this.handle, varyings, bufferMode);\n }\n\n this._linkShaders();\n\n log.time(1, `RenderPipeline ${this.id} - shaderLayout introspection`)();\n this.introspectedLayout = getShaderLayoutFromGLSL(this.device.gl, this.handle);\n log.timeEnd(1, `RenderPipeline ${this.id} - shaderLayout introspection`)();\n\n // Merge provided layout with introspected layout\n this.shaderLayout = mergeShaderLayout(this.introspectedLayout, props.shaderLayout);\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 /**\n * Bindings include: textures, samplers and uniform buffers\n * @todo needed for portable model\n */\n setBindings(bindings: Record<string, Binding>, options?: {disableWarnings?: boolean}): 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 if (!options?.disableWarnings) {\n log.warn(\n `No binding \"${name}\" in render pipeline \"${this.id}\", expected one of ${validBindings}`,\n value\n )();\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 (\n !(\n value instanceof WEBGLTextureView ||\n value instanceof WEBGLTexture ||\n value instanceof WEBGLFramebuffer\n )\n ) {\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 /** @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 parameters?: RenderPipelineParameters;\n topology?: PrimitiveTopology;\n vertexArray: VertexArray;\n isInstanced?: boolean;\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 parameters = this.props.parameters,\n topology = this.props.topology,\n vertexArray,\n vertexCount,\n // indexCount,\n instanceCount,\n isInstanced = false,\n firstVertex = 0,\n // firstIndex,\n // firstInstance,\n // baseVertex,\n transformFeedback\n } = options;\n\n const glDrawMode = getGLDrawMode(topology);\n const isIndexed: boolean = Boolean(vertexArray.indexBuffer);\n const glIndexType = (vertexArray.indexBuffer as WEBGLBuffer)?.glIndexType;\n // Note that we sometimes get called with 0 instances\n\n // If we are using async linking, we need to wait until linking completes\n if (this.linkStatus !== 'success') {\n log.info(2, `RenderPipeline:${this.id}.draw() aborted - waiting for shader linking`)();\n return false;\n }\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()) {\n log.info(2, `RenderPipeline:${this.id}.draw() aborted - textures not yet loaded`)();\n // Note: false means that the app needs to redraw the pipeline again.\n return false;\n }\n\n // (isInstanced && instanceCount === 0)\n // if (vertexCount === 0) {\n // log.info(2, `RenderPipeline:${this.id}.draw() aborted - no vertices to draw`)();\n // Note: false means that the app needs to redraw the pipeline again.\n // return true;\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\n withDeviceAndGLParameters(this.device, parameters, webglRenderPass.glParameters, () => {\n if (isIndexed && isInstanced) {\n this.device.gl.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.gldrawRangeElements(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.gl.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 // DEPRECATED METHODS\n\n override setUniformsWebGL(uniforms: Record<string, UniformValue>) {\n const {bindings} = splitUniformsAndBindings(uniforms);\n Object.keys(bindings).forEach(name => {\n log.warn(\n `Unsupported value \"${JSON.stringify(\n bindings[name]\n )}\" 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 // PRIVATE METHODS\n\n // setAttributes(attributes: Record<string, Buffer>): void {}\n // setBindings(bindings: Record<string, Binding>): void {}\n\n protected async _linkShaders() {\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 // TODO Avoid checking program linking error in production\n if (log.level === 0) {\n // return;\n }\n\n if (!this.device.features.has('compilation-status-async-webgl')) {\n const status = this._getLinkStatus();\n this._reportLinkStatus(status);\n return;\n }\n\n // async case\n log.once(1, 'RenderPipeline linking is asynchronous')();\n await this._waitForLinkComplete();\n log.info(2, `RenderPipeline ${this.id} - async linking complete: ${this.linkStatus}`)();\n const status = this._getLinkStatus();\n this._reportLinkStatus(status);\n }\n\n /** Report link status. First, check for shader compilation failures if linking fails */\n async _reportLinkStatus(status: 'success' | 'linking' | 'validation'): Promise<void> {\n switch (status) {\n case 'success':\n return;\n\n default:\n // First check for shader compilation failures if linking fails\n switch (this.vs.compilationStatus) {\n case 'error':\n this.vs.debugShader();\n throw new Error(`Error during compilation of shader ${this.vs.id}`);\n case 'pending':\n this.vs.asyncCompilationStatus.then(() => this.vs.debugShader());\n break;\n case 'success':\n break;\n }\n\n switch (this.fs?.compilationStatus) {\n case 'error':\n this.fs.debugShader();\n throw new Error(`Error during compilation of shader ${this.fs.id}`);\n case 'pending':\n this.fs.asyncCompilationStatus.then(() => this.fs.debugShader());\n break;\n case 'success':\n break;\n }\n\n const linkErrorLog = this.device.gl.getProgramInfoLog(this.handle);\n throw new Error(`Error during ${status}: ${linkErrorLog}`);\n }\n }\n\n /**\n * Get the shader compilation status\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 */\n _getLinkStatus(): 'success' | 'linking' | 'validation' {\n const {gl} = this.device;\n const linked = gl.getProgramParameter(this.handle, gl.LINK_STATUS);\n if (!linked) {\n this.linkStatus = 'error';\n return 'linking';\n }\n\n gl.validateProgram(this.handle);\n const validated = gl.getProgramParameter(this.handle, gl.VALIDATE_STATUS);\n if (!validated) {\n this.linkStatus = 'error';\n return 'validation';\n }\n\n this.linkStatus = 'success';\n return 'success';\n }\n\n /** Use KHR_parallel_shader_compile extension if available */\n async _waitForLinkComplete(): Promise<void> {\n const waitMs = async (ms: number) => await new Promise(resolve => setTimeout(resolve, ms));\n const DELAY_MS = 10; // Shader compilation is typically quite fast (with some exceptions)\n\n // If status polling is not available, we can't wait for completion. Just wait a little to minimize blocking\n if (!this.device.features.has('compilation-status-async-webgl')) {\n await waitMs(DELAY_MS);\n return;\n }\n\n const {gl} = this.device;\n for (;;) {\n const complete = gl.getProgramParameter(this.handle, GL.COMPLETION_STATUS_KHR);\n if (complete) {\n return;\n }\n await waitMs(DELAY_MS);\n }\n }\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 bindingInfo of this.shaderLayout.bindings) {\n if (\n !this.bindings[bindingInfo.name] &&\n !this.bindings[bindingInfo.name.replace(/Uniforms$/, '')]\n ) {\n log.warn(`Binding ${bindingInfo.name} not found in ${this.id}`)();\n texturesRenderable = false;\n }\n }\n\n // TODO - remove this should be handled by ExternalTexture\n // for (const [, texture] of Object.entries(this.bindings)) {\n // if (texture instanceof WEBGLTexture) {\n // texture.update();\n // }\n // }\n\n return texturesRenderable;\n }\n\n /** Apply any bindings (before each draw call) */\n _applyBindings() {\n // If we are using async linking, we need to wait until linking completes\n if (this.linkStatus !== 'success') {\n return;\n }\n\n const {gl} = this.device;\n gl.useProgram(this.handle);\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 = gl.getUniformBlockIndex(this.handle, name);\n if ((location as GL) === GL.INVALID_INDEX) {\n throw new Error(`Invalid uniform block name ${name}`);\n }\n gl.uniformBlockBinding(this.handle, uniformBufferIndex, location);\n // console.debug(binding, location);\n if (value instanceof WEBGLBuffer) {\n gl.bindBufferBase(GL.UNIFORM_BUFFER, uniformBufferIndex, value.handle);\n } else {\n gl.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 (\n !(\n value instanceof WEBGLTextureView ||\n value instanceof WEBGLTexture ||\n value instanceof WEBGLFramebuffer\n )\n ) {\n throw new Error('texture');\n }\n let texture: WEBGLTexture;\n if (value instanceof WEBGLTextureView) {\n texture = value.texture;\n } else if (value instanceof WEBGLTexture) {\n texture = value;\n } else if (\n value instanceof WEBGLFramebuffer &&\n value.colorAttachments[0] instanceof WEBGLTextureView\n ) {\n log.warn(\n 'Passing framebuffer in texture binding may be deprecated. Use fbo.colorAttachments[0] instead'\n )();\n texture = value.colorAttachments[0].texture;\n } else {\n throw new Error('No texture');\n }\n\n gl.activeTexture(GL.TEXTURE0 + textureUnit);\n gl.bindTexture(texture.glTarget, texture.handle);\n // gl.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/**\n * Merges an provided shader layout into a base shader layout\n * In WebGL, this allows the auto generated shader layout to be overridden by the application\n * Typically to change the format of the vertex attributes (from float32x4 to uint8x4 etc).\n * @todo Drop this? Aren't all use cases covered by mergeBufferLayout()?\n */\nfunction mergeShaderLayout(baseLayout: ShaderLayout, overrideLayout: ShaderLayout): ShaderLayout {\n // Deep clone the base layout\n const mergedLayout: ShaderLayout = {\n ...baseLayout,\n attributes: baseLayout.attributes.map(attribute => ({...attribute}))\n };\n // Merge the attributes\n for (const attribute of overrideLayout?.attributes || []) {\n const baseAttribute = mergedLayout.attributes.find(attr => attr.name === attribute.name);\n if (!baseAttribute) {\n log.warn(`shader layout attribute ${attribute.name} not present in shader`);\n } else {\n baseAttribute.type = attribute.type || baseAttribute.type;\n baseAttribute.stepMode = attribute.stepMode || baseAttribute.stepMode;\n }\n }\n return mergedLayout;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {\n ShaderLayout,\n UniformBinding,\n UniformBlockBinding,\n AttributeDeclaration,\n VaryingBinding\n} from '@luma.gl/core';\n\nimport {GL} from '@luma.gl/constants';\nimport {decodeGLUniformType, decodeGLAttributeType, isSamplerUniform} from './decode-webgl-types';\n\n/**\n * Extract metadata describing binding information for a program's shaders\n * Note: `linkProgram()` needs to have been called\n * (although linking does not need to have been successful).\n */\nexport function getShaderLayoutFromGLSL(\n gl: WebGL2RenderingContext,\n program: WebGLProgram\n): ShaderLayout {\n const shaderLayout: ShaderLayout = {\n attributes: [],\n bindings: []\n };\n\n shaderLayout.attributes = readAttributeDeclarations(gl, program);\n\n // Uniform blocks\n const uniformBlocks: UniformBlockBinding[] = readUniformBlocks(gl, program);\n for (const uniformBlock of uniformBlocks) {\n const uniforms = uniformBlock.uniforms.map(uniform => ({\n name: uniform.name,\n format: uniform.format,\n byteOffset: uniform.byteOffset,\n byteStride: uniform.byteStride,\n arrayLength: uniform.arrayLength\n }));\n shaderLayout.bindings.push({\n type: 'uniform',\n name: uniformBlock.name,\n group: 0,\n location: uniformBlock.location,\n visibility: (uniformBlock.vertex ? 0x1 : 0) & (uniformBlock.fragment ? 0x2 : 0),\n minBindingSize: uniformBlock.byteLength,\n uniforms\n });\n }\n\n const uniforms: UniformBinding[] = readUniformBindings(gl, program);\n let textureUnit = 0;\n for (const uniform of uniforms) {\n if (isSamplerUniform(uniform.type)) {\n const {viewDimension, sampleType} = getSamplerInfo(uniform.type);\n shaderLayout.bindings.push({\n type: 'texture',\n name: uniform.name,\n group: 0,\n location: textureUnit,\n viewDimension,\n sampleType\n });\n\n // @ts-expect-error\n uniform.textureUnit = textureUnit;\n textureUnit += 1;\n }\n }\n\n if (uniforms.length) {\n shaderLayout.uniforms = uniforms;\n }\n\n // Varyings\n const varyings: VaryingBinding[] = readVaryings(gl, program);\n // Note - samplers are always in unform bindings, even if uniform blocks are used\n if (varyings?.length) {\n shaderLayout.varyings = varyings;\n }\n\n return shaderLayout;\n}\n\n// HELPERS\n\n/**\n * Extract info about all transform feedback varyings\n *\n * linkProgram needs to have been called, although linking does not need to have been successful\n */\nfunction readAttributeDeclarations(\n gl: WebGL2RenderingContext,\n program: WebGLProgram\n): AttributeDeclaration[] {\n const attributes: AttributeDeclaration[] = [];\n\n const count = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);\n\n for (let index = 0; index < count; index++) {\n const activeInfo = gl.getActiveAttrib(program, index);\n if (!activeInfo) {\n throw new Error('activeInfo');\n }\n const {name, type: compositeType /* , size*/} = activeInfo;\n const location = gl.getAttribLocation(program, name);\n // Add only user provided attributes, for built-in attributes like `gl_InstanceID` location will be < 0\n if (location >= 0) {\n const {attributeType} = decodeGLAttributeType(compositeType);\n\n // Whether an attribute is instanced is essentially fixed by the structure of the shader code,\n // so it is arguably a static property of the shader.\n // There is no hint in the shader declarations\n // Heuristic: Any attribute name containing the word \"instance\" will be assumed to be instanced\n const stepMode = /instance/i.test(name) ? 'instance' : 'vertex';\n\n attributes.push({\n name,\n location,\n stepMode,\n type: attributeType\n // size - for arrays, size is the number of elements in the array\n });\n }\n }\n\n // Sort by declaration order\n attributes.sort((a: AttributeDeclaration, b: AttributeDeclaration) => a.location - b.location);\n return attributes;\n}\n\n/**\n * Extract info about all transform feedback varyings\n *\n * linkProgram needs to have been called, although linking does not need to have been successful\n */\nfunction readVaryings(gl: WebGL2RenderingContext, program: WebGLProgram): VaryingBinding[] {\n const varyings: VaryingBinding[] = [];\n\n const count = gl.getProgramParameter(program, GL.TRANSFORM_FEEDBACK_VARYINGS);\n for (let location = 0; location < count; location++) {\n const activeInfo = gl.getTransformFeedbackVarying(program, location);\n if (!activeInfo) {\n throw new Error('activeInfo');\n }\n const {name, type: compositeType, size} = activeInfo;\n const {glType, components} = decodeGLUniformType(compositeType);\n const varying = {location, name, type: glType, size: size * components}; // Base values\n varyings.push(varying);\n }\n\n varyings.sort((a, b) => a.location - b.location);\n return varyings;\n}\n\n/**\n * Extract info about all uniforms\n *\n * Query uniform locations and build name to setter map.\n */\nfunction readUniformBindings(gl: WebGL2RenderingContext, program: WebGLProgram): UniformBinding[] {\n const uniforms: UniformBinding[] = [];\n\n const uniformCount = gl.getProgramParameter(program, GL.ACTIVE_UNIFORMS);\n for (let i = 0; i < uniformCount; i++) {\n const activeInfo = gl.getActiveUniform(program, i);\n if (!activeInfo) {\n throw new Error('activeInfo');\n }\n const {name: rawName, size, type} = activeInfo;\n const {name, isArray} = parseUniformName(rawName);\n let webglLocation = gl.getUniformLocation(program, name);\n const uniformInfo = {\n // WebGL locations are uniquely typed but just numbers\n location: webglLocation as number,\n name,\n size,\n type,\n isArray\n };\n uniforms.push(uniformInfo);\n\n // Array (e.g. matrix) uniforms can occupy several 4x4 byte banks\n if (uniformInfo.size > 1) {\n for (let j = 0; j < uniformInfo.size; j++) {\n const elementName = `${name}[${j}]`;\n\n webglLocation = gl.getUniformLocation(program, elementName);\n\n const arrayElementUniformInfo = {\n ...uniformInfo,\n name: elementName,\n location: webglLocation as number\n };\n\n uniforms.push(arrayElementUniformInfo);\n }\n }\n }\n return uniforms;\n}\n\n/**\n * Extract info about all \"active\" uniform blocks\n * @note In WebGL, \"active\" just means that unused (inactive) blocks may have been optimized away during linking)\n */\nfunction readUniformBlocks(\n gl: WebGL2RenderingContext,\n program: WebGLProgram\n): UniformBlockBinding[] {\n const getBlockParameter = (blockIndex: number, pname: GL): any =>\n gl.getActiveUniformBlockParameter(program, blockIndex, pname);\n\n const uniformBlocks: UniformBlockBinding[] = [];\n\n const blockCount = gl.getProgramParameter(program, GL.ACTIVE_UNIFORM_BLOCKS);\n for (let blockIndex = 0; blockIndex < blockCount; blockIndex++) {\n const blockInfo: UniformBlockBinding = {\n name: gl.getActiveUniformBlockName(program, blockIndex) || '',\n location: getBlockParameter(blockIndex, GL.UNIFORM_BLOCK_BINDING),\n byteLength: getBlockParameter(blockIndex, GL.UNIFORM_BLOCK_DATA_SIZE),\n vertex: getBlockParameter(blockIndex, GL.UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER),\n fragment: getBlockParameter(blockIndex, GL.UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER),\n uniformCount: getBlockParameter(blockIndex, GL.UNIFORM_BLOCK_ACTIVE_UNIFORMS),\n uniforms: [] as any[]\n };\n\n const uniformIndices =\n (getBlockParameter(blockIndex, GL.UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES) as number[]) || [];\n\n const uniformType = gl.getActiveUniforms(program, uniformIndices, GL.UNIFORM_TYPE); // Array of GLenum indicating the types of the uniforms.\n const uniformArrayLength = gl.getActiveUniforms(program, uniformIndices, GL.UNIFORM_SIZE); // Array of GLuint indicating the sizes of the uniforms.\n // const uniformBlockIndex = gl.getActiveUniforms(\n // program,\n // uniformIndices,\n // GL.UNIFORM_BLOCK_INDEX\n // ); // Array of GLint indicating the block indices of the uniforms.\n const uniformOffset = gl.getActiveUniforms(program, uniformIndices, GL.UNIFORM_OFFSET); // Array of GLint indicating the uniform buffer offsets.\n const uniformStride = gl.getActiveUniforms(program, uniformIndices, GL.UNIFORM_ARRAY_STRIDE); // Array of GLint indicating the strides between the elements.\n // const uniformMatrixStride = gl.getActiveUniforms(\n // program,\n // uniformIndices,\n // GL.UNIFORM_MATRIX_STRIDE\n // ); // Array of GLint indicating the strides between columns of a column-major matrix or a row-major matrix.\n // const uniformRowMajor = gl.getActiveUniforms(program, uniformIndices, GL.UNIFORM_IS_ROW_MAJOR);\n for (let i = 0; i < blockInfo.uniformCount; ++i) {\n const activeInfo = gl.getActiveUniform(program, uniformIndices[i]);\n if (!activeInfo) {\n throw new Error('activeInfo');\n }\n\n blockInfo.uniforms.push({\n name: activeInfo.name,\n format: decodeGLUniformType(uniformType[i]).format,\n type: uniformType[i],\n arrayLength: uniformArrayLength[i],\n byteOffset: uniformOffset[i],\n byteStride: uniformStride[i]\n // matrixStride: uniformStride[i],\n // rowMajor: uniformRowMajor[i]\n });\n }\n\n uniformBlocks.push(blockInfo);\n }\n\n uniformBlocks.sort((a, b) => a.location - b.location);\n return uniformBlocks;\n}\n\n/**\n * TOOD - compare with a above, confirm copy, then delete\n const bindings: Binding[] = [];\n const count = gl.getProgramParameter(program, gl.ACTIVE_UNIFORM_BLOCKS);\n for (let blockIndex = 0; blockIndex < count; blockIndex++) {\n const vertex = gl.getActiveUniformBlockParameter(program, blockIndex, gl.UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER),\n const fragment = gl.getActiveUniformBlockParameter(program, blockIndex, gl.UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER),\n const visibility = (vertex) + (fragment);\n const binding: BufferBinding = {\n location: gl.getActiveUniformBlockParameter(program, blockIndex, gl.UNIFORM_BLOCK_BINDING),\n // name: gl.getActiveUniformBlockName(program, blockIndex),\n type: 'uniform',\n visibility,\n minBindingSize: gl.getActiveUniformBlockParameter(program, blockIndex, gl.UNIFORM_BLOCK_DATA_SIZE),\n // uniformCount: gl.getActiveUniformBlockParameter(program, blockIndex, gl.UNIFORM_BLOCK_ACTIVE_UNIFORMS),\n // uniformIndices: gl.getActiveUniformBlockParameter(program, blockIndex, gl.UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES),\n }\n bindings.push(binding);\n }\n*/\n\nconst SAMPLER_UNIFORMS_GL_TO_GPU: Record<\n number,\n [\n '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d',\n 'float' | 'unfilterable-float' | 'depth' | 'sint' | 'uint'\n ]\n> = {\n [GL.SAMPLER_2D]: ['2d', 'float'],\n [GL.SAMPLER_CUBE]: ['cube', 'float'],\n [GL.SAMPLER_3D]: ['3d', 'float'],\n [GL.SAMPLER_2D_SHADOW]: ['3d', 'depth'],\n [GL.SAMPLER_2D_ARRAY]: ['2d-array', 'float'],\n [GL.SAMPLER_2D_ARRAY_SHADOW]: ['2d-array', 'depth'],\n [GL.SAMPLER_CUBE_SHADOW]: ['cube', 'float'],\n [GL.INT_SAMPLER_2D]: ['2d', 'sint'],\n [GL.INT_SAMPLER_3D]: ['3d', 'sint'],\n [GL.INT_SAMPLER_CUBE]: ['cube', 'sint'],\n [GL.INT_SAMPLER_2D_ARRAY]: ['2d-array', 'uint'],\n [GL.UNSIGNED_INT_SAMPLER_2D]: ['2d', 'uint'],\n [GL.UNSIGNED_INT_SAMPLER_3D]: ['3d', 'uint'],\n [GL.UNSIGNED_INT_SAMPLER_CUBE]: ['cube', 'uint'],\n [GL.UNSIGNED_INT_SAMPLER_2D_ARRAY]: ['2d-array', 'uint']\n};\n\ntype SamplerInfo = {\n viewDimension: '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d';\n sampleType: 'float' | 'unfilterable-float' | 'depth' | 'sint' | 'uint';\n};\n\nfunction getSamplerInfo(type: GL): SamplerInfo {\n const sampler = SAMPLER_UNIFORMS_GL_TO_GPU[type];\n if (!sampler) {\n throw new Error('sampler');\n }\n const [viewDimension, sampleType] = sampler;\n return {viewDimension, sampleType};\n}\n\n// HELPERS\n\nfunction parseUniformName(name: string): {name: string; length: number; isArray: boolean} {\n // Shortcut to avoid redundant or bad matches\n if (name[name.length - 1] !== ']') {\n return {\n name,\n length: 1,\n isArray: false\n };\n }\n\n // if array name then clean the array brackets\n const UNIFORM_NAME_REGEXP = /([^[]*)(\\[[0-9]+\\])?/;\n const matches = UNIFORM_NAME_REGEXP.exec(name);\n if (!matches || matches.length < 2) {\n throw new Error(`Failed to parse GLSL uniform name ${name}`);\n }\n\n return {\n name: matches[1],\n length: matches[2] ? 1 : 0,\n isArray: Boolean(matches[2])\n };\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {ShaderUniformType, ShaderAttributeType, VertexFormat} from '@luma.gl/core';\nimport {GL, GLUniformType, GLSamplerType, GLCompositeType, GLDataType} from '@luma.gl/constants';\n\n/** Check is uniform is of sampler type */\nexport function isSamplerUniform(type: GLUniformType): boolean {\n return SAMPLER_TYPES.includes(type as GLSamplerType);\n}\n\nconst SAMPLER_TYPES: GLSamplerType[] = [\n GL.SAMPLER_2D,\n GL.SAMPLER_CUBE,\n GL.SAMPLER_3D,\n GL.SAMPLER_2D_SHADOW,\n GL.SAMPLER_2D_ARRAY,\n GL.SAMPLER_2D_ARRAY_SHADOW,\n GL.SAMPLER_CUBE_SHADOW,\n GL.INT_SAMPLER_2D,\n GL.INT_SAMPLER_3D,\n GL.INT_SAMPLER_CUBE,\n GL.INT_SAMPLER_2D_ARRAY,\n GL.UNSIGNED_INT_SAMPLER_2D,\n GL.UNSIGNED_INT_SAMPLER_3D,\n GL.UNSIGNED_INT_SAMPLER_CUBE,\n GL.UNSIGNED_INT_SAMPLER_2D_ARRAY\n];\n\n// Composite types table\nconst COMPOSITE_GL_TYPES: Record<\n GLCompositeType,\n [GLDataType, number, string, ShaderUniformType, VertexFormat?]\n> = {\n [GL.FLOAT]: [GL.FLOAT, 1, 'float', 'f32', 'float32'],\n [GL.FLOAT_VEC2]: [GL.FLOAT, 2, 'vec2', 'vec2<f32>', 'float32x2'],\n [GL.FLOAT_VEC3]: [GL.FLOAT, 3, 'vec3', 'vec3<f32>', 'float32x3'],\n [GL.FLOAT_VEC4]: [GL.FLOAT, 4, 'vec4', 'vec4<f32>', 'float32x4'],\n\n [GL.INT]: [GL.INT, 1, 'int', 'i32', 'sint32'],\n [GL.INT_VEC2]: [GL.INT, 2, 'ivec2', 'vec2<i32>', 'sint32x2'],\n [GL.INT_VEC3]: [GL.INT, 3, 'ivec3', 'vec3<i32>', 'sint32x3'],\n [GL.INT_VEC4]: [GL.INT, 4, 'ivec4', 'vec4<i32>', 'sint32x4'],\n\n [GL.UNSIGNED_INT]: [GL.UNSIGNED_INT, 1, 'uint', 'u32', 'uint32'],\n [GL.UNSIGNED_INT_VEC2]: [GL.UNSIGNED_INT, 2, 'uvec2', 'vec2<u32>', 'uint32x2'],\n [GL.UNSIGNED_INT_VEC3]: [GL.UNSIGNED_INT, 3, 'uvec3', 'vec3<u32>', 'uint32x3'],\n [GL.UNSIGNED_INT_VEC4]: [GL.UNSIGNED_INT, 4, 'uvec4', 'vec4<u32>', 'uint32x4'],\n\n [GL.BOOL]: [GL.FLOAT, 1, 'bool', 'f32', 'float32'],\n [GL.BOOL_VEC2]: [GL.FLOAT, 2, 'bvec2', 'vec2<f32>', 'float32x2'],\n [GL.BOOL_VEC3]: [GL.FLOAT, 3, 'bvec3', 'vec3<f32>', 'float32x3'],\n [GL.BOOL_VEC4]: [GL.FLOAT, 4, 'bvec4', 'vec4<f32>', 'float32x4'],\n\n // TODO - are sizes/components below correct?\n [GL.FLOAT_MAT2]: [GL.FLOAT, 8, 'mat2', 'mat2x2<f32>'], // 4\n [GL.FLOAT_MAT2x3]: [GL.FLOAT, 8, 'mat2x3', 'mat2x3<f32>'], // 6\n [GL.FLOAT_MAT2x4]: [GL.FLOAT, 8, 'mat2x4', 'mat2x4<f32>'], // 8\n\n [GL.FLOAT_MAT3x2]: [GL.FLOAT, 12, 'mat3x2', 'mat3x2<f32>'], // 6\n [GL.FLOAT_MAT3]: [GL.FLOAT, 12, 'mat3', 'mat3x3<f32>'], // 9\n [GL.FLOAT_MAT3x4]: [GL.FLOAT, 12, 'mat3x4', 'mat3x4<f32>'], // 12\n\n [GL.FLOAT_MAT4x2]: [GL.FLOAT, 16, 'mat4x2', 'mat4x2<f32>'], // 8\n [GL.FLOAT_MAT4x3]: [GL.FLOAT, 16, 'mat4x3', 'mat4x3<f32>'], // 12\n [GL.FLOAT_MAT4]: [GL.FLOAT, 16, 'mat4', 'mat4x4<f32>'] // 16\n};\n\n/** Decomposes a composite type (GL.VEC3) into a basic type (GL.FLOAT) and components (3) */\nexport function decodeGLUniformType(glUniformType: GL): {\n format: ShaderUniformType;\n components: number;\n glType: GLDataType;\n} {\n const typeAndSize = COMPOSITE_GL_TYPES[glUniformType];\n if (!typeAndSize) {\n throw new Error('uniform');\n }\n const [glType, components, , format] = typeAndSize;\n return {format, components, glType};\n}\n\n/** Decomposes a composite type (GL.VEC3) into a basic type (GL.FLOAT) and components (3) */\nexport function decodeGLAttributeType(glAttributeType: GL): {\n attributeType: ShaderAttributeType;\n vertexFormat: VertexFormat;\n components: number;\n // glType: GLDataType;\n} {\n const typeAndSize = COMPOSITE_GL_TYPES[glAttributeType];\n if (!typeAndSize) {\n throw new Error('attribute');\n }\n const [, components, , shaderType, vertexFormat] = typeAndSize;\n // TODO sanity - if (shaderType.startsWith('mat' ...))\n const attributeType = shaderType as unknown as ShaderAttributeType;\n return {attributeType, vertexFormat, components}; // , glType};\n}\n\n/** Decomposes a composite type GL.VEC3 into a basic type (GL.FLOAT) and components (3) */\nexport function decomposeCompositeGLDataType(\n compositeGLDataType: GLCompositeType\n): {type: GLDataType; components: number} | null {\n const typeAndSize = COMPOSITE_GL_TYPES[compositeGLDataType];\n if (!typeAndSize) {\n return null;\n }\n const [type, components] = typeAndSize;\n return {type, components};\n}\n\nexport function getCompositeGLDataType(\n type: GL,\n components\n): {glType: GLDataType; name: string} | null {\n switch (type) {\n case GL.BYTE:\n case GL.UNSIGNED_BYTE:\n case GL.SHORT:\n case GL.UNSIGNED_SHORT:\n type = GL.FLOAT;\n break;\n default:\n }\n\n for (const glType in COMPOSITE_GL_TYPES) {\n const [compType, compComponents, name] = COMPOSITE_GL_TYPES[glType];\n if (compType === type && compComponents === components) {\n return {glType: Number(glType), name};\n }\n }\n return null;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n/* eslint-disable */\n\n// Uniforms\nimport type {UniformValue} from '@luma.gl/core';\nimport {GL, GLCompositeType, GLSamplerType} from '@luma.gl/constants';\n\n/** Set a raw uniform (without type conversion and caching) */\n/* eslint-disable max-len */\nexport function setUniform(\n gl: WebGL2RenderingContext,\n location: WebGLUniformLocation,\n type: GLCompositeType | GLSamplerType,\n value: UniformValue\n): void {\n const gl2 = gl as WebGL2RenderingContext;\n\n // Prepare the value for WebGL setters\n let uniformValue = value;\n if (uniformValue === true) {\n uniformValue = 1;\n }\n if (uniformValue === false) {\n uniformValue = 0;\n }\n const arrayValue = typeof uniformValue === 'number' ? [uniformValue] : uniformValue;\n\n // prettier-ignore\n switch (type) {\n case GL.SAMPLER_2D:\n case GL.SAMPLER_CUBE:\n case GL.SAMPLER_3D:\n case GL.SAMPLER_2D_SHADOW:\n case GL.SAMPLER_2D_ARRAY:\n case GL.SAMPLER_2D_ARRAY_SHADOW:\n case GL.SAMPLER_CUBE_SHADOW:\n case GL.INT_SAMPLER_2D:\n case GL.INT_SAMPLER_3D:\n case GL.INT_SAMPLER_CUBE:\n case GL.INT_SAMPLER_2D_ARRAY:\n case GL.UNSIGNED_INT_SAMPLER_2D:\n case GL.UNSIGNED_INT_SAMPLER_3D:\n case GL.UNSIGNED_INT_SAMPLER_CUBE:\n case GL.UNSIGNED_INT_SAMPLER_2D_ARRAY:\n if (typeof value !== 'number') {\n throw new Error('samplers must be set to integers');\n }\n return gl.uniform1i(location, value);\n\n case GL.FLOAT: return gl.uniform1fv(location, arrayValue);\n case GL.FLOAT_VEC2: return gl.uniform2fv(location, arrayValue);\n case GL.FLOAT_VEC3: return gl.uniform3fv(location, arrayValue);\n case GL.FLOAT_VEC4: return gl.uniform4fv(location, arrayValue);\n\n case GL.INT: return gl.uniform1iv(location, arrayValue);\n case GL.INT_VEC2: return gl.uniform2iv(location, arrayValue);\n case GL.INT_VEC3: return gl.uniform3iv(location, arrayValue);\n case GL.INT_VEC4: return gl.uniform4iv(location, arrayValue);\n\n case GL.BOOL: return gl.uniform1iv(location, arrayValue);\n case GL.BOOL_VEC2: return gl.uniform2iv(location, arrayValue);\n case GL.BOOL_VEC3: return gl.uniform3iv(location, arrayValue);\n case GL.BOOL_VEC4: return gl.uniform4iv(location, arrayValue);\n\n // WEBGL2 - unsigned integers\n case GL.UNSIGNED_INT: return gl2.uniform1uiv(location, arrayValue, 1);\n case GL.UNSIGNED_INT_VEC2: return gl2.uniform2uiv(location, arrayValue, 2);\n case GL.UNSIGNED_INT_VEC3: return gl2.uniform3uiv(location, arrayValue, 3);\n case GL.UNSIGNED_INT_VEC4: return gl2.uniform4uiv(location, arrayValue, 4);\n\n // WebGL2 - quadratic matrices\n // false: don't transpose the matrix\n case GL.FLOAT_MAT2: return gl.uniformMatrix2fv(location, false, arrayValue);\n case GL.FLOAT_MAT3: return gl.uniformMatrix3fv(location, false, arrayValue);\n case GL.FLOAT_MAT4: return gl.uniformMatrix4fv(location, false, arrayValue);\n\n // WebGL2 - rectangular matrices\n case GL.FLOAT_MAT2x3: return gl2.uniformMatrix2x3fv(location, false, arrayValue);\n case GL.FLOAT_MAT2x4: return gl2.uniformMatrix2x4fv(location, false, arrayValue);\n case GL.FLOAT_MAT3x2: return gl2.uniformMatrix3x2fv(location, false, arrayValue);\n case GL.FLOAT_MAT3x4: return gl2.uniformMatrix3x4fv(location, false, arrayValue);\n case GL.FLOAT_MAT4x2: return gl2.uniformMatrix4x2fv(location, false, arrayValue);\n case GL.FLOAT_MAT4x3: return gl2.uniformMatrix4x3fv(location, false, arrayValue);\n }\n\n throw new Error('Illegal uniform');\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {UniformValue, Binding} from '@luma.gl/core';\nimport {isNumericArray} from '@math.gl/types';\n\nexport function isUniformValue(value: unknown): value is UniformValue {\n return isNumericArray(value) !== null || typeof value === 'number' || typeof value === 'boolean';\n}\n\ntype UniformsAndBindings = {\n bindings: Record<string, Binding>;\n uniforms: Record<string, UniformValue>;\n};\n\nexport function splitUniformsAndBindings(\n uniforms: Record<string, Binding | UniformValue>\n): UniformsAndBindings {\n const result: UniformsAndBindings = {bindings: {}, uniforms: {}};\n Object.keys(uniforms).forEach(name => {\n const uniform = uniforms[name];\n if (isUniformValue(uniform)) {\n result.uniforms[name] = uniform;\n } else {\n result.bindings[name] = uniform;\n }\n });\n\n return result;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {GL, GLPrimitiveTopology, GLPrimitive} from '@luma.gl/constants';\nimport {PrimitiveTopology} from '@luma.gl/core';\n\n// Counts the number of complete primitives given a number of vertices and a drawMode\nexport function getPrimitiveDrawMode(drawMode: GLPrimitiveTopology): GLPrimitive {\n switch (drawMode) {\n case GL.POINTS:\n return GL.POINTS;\n case GL.LINES:\n return GL.LINES;\n case GL.LINE_STRIP:\n return GL.LINES;\n case GL.LINE_LOOP:\n return GL.LINES;\n case GL.TRIANGLES:\n return GL.TRIANGLES;\n case GL.TRIANGLE_STRIP:\n return GL.TRIANGLES;\n case GL.TRIANGLE_FAN:\n return GL.TRIANGLES;\n default:\n throw new Error('drawMode');\n }\n}\n\n// Counts the number of complete \"primitives\" given a number of vertices and a drawMode\nexport function getPrimitiveCount(options: {\n drawMode: GLPrimitiveTopology;\n vertexCount: number;\n}): number {\n const {drawMode, vertexCount} = options;\n switch (drawMode) {\n case GL.POINTS:\n case GL.LINE_LOOP:\n return vertexCount;\n case GL.LINES:\n return vertexCount / 2;\n case GL.LINE_STRIP:\n return vertexCount - 1;\n case GL.TRIANGLES:\n return vertexCount / 3;\n case GL.TRIANGLE_STRIP:\n case GL.TRIANGLE_FAN:\n return vertexCount - 2;\n default:\n throw new Error('drawMode');\n }\n}\n\n// Counts the number of vertices after splitting the vertex stream into separate \"primitives\"\nexport function getVertexCount(options: {\n drawMode: GLPrimitiveTopology;\n vertexCount: number;\n}): number {\n const {drawMode, vertexCount} = options;\n const primitiveCount = getPrimitiveCount({drawMode, vertexCount});\n switch (getPrimitiveDrawMode(drawMode)) {\n case GL.POINTS:\n return primitiveCount;\n case GL.LINES:\n return primitiveCount * 2;\n case GL.TRIANGLES:\n return primitiveCount * 3;\n default:\n throw new Error('drawMode');\n }\n}\n\n/** Get the primitive type for draw */\nexport function 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 'triangle-list': return GL.TRIANGLES;\n case 'triangle-strip': return GL.TRIANGLE_STRIP;\n default: throw new Error(topology);\n }\n}\n\n/** Get the primitive type for transform feedback */\nexport function 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 'triangle-list': return GL.TRIANGLES;\n case 'triangle-strip': return GL.TRIANGLES;\n default: throw new Error(topology);\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {CommandEncoder, CommandEncoderProps} from '@luma.gl/core';\nimport type {\n CopyBufferToBufferOptions,\n CopyBufferToTextureOptions,\n CopyTextureToBufferOptions,\n CopyTextureToTextureOptions,\n // ClearTextureOptions,\n // ReadTextureOptions,\n QuerySet,\n Buffer\n} from '@luma.gl/core';\n\nimport {WEBGLCommandBuffer} from './webgl-command-buffer';\nimport {WebGLDevice} from '../webgl-device';\n\nexport class WEBGLCommandEncoder extends CommandEncoder {\n readonly device: WebGLDevice;\n\n readonly commandBuffer: WEBGLCommandBuffer;\n\n constructor(device: WebGLDevice, props: CommandEncoderProps) {\n super(device, props);\n this.device = device;\n this.commandBuffer = new WEBGLCommandBuffer(device);\n }\n\n override destroy(): void {}\n\n override finish(): void {\n this.commandBuffer.submitCommands();\n }\n\n // beginRenderPass(GPURenderPassDescriptor descriptor): GPURenderPassEncoder;\n // beginComputePass(optional GPUComputePassDescriptor descriptor = {}): GPUComputePassEncoder;\n // finish(options?: {id?: string}): GPUCommandBuffer;\n\n copyBufferToBuffer(options: CopyBufferToBufferOptions): void {\n this.commandBuffer.commands.push({name: 'copy-buffer-to-buffer', options});\n }\n\n copyBufferToTexture(options: CopyBufferToTextureOptions) {\n this.commandBuffer.commands.push({name: 'copy-buffer-to-texture', options});\n }\n\n copyTextureToBuffer(options: CopyTextureToBufferOptions): void {\n this.commandBuffer.commands.push({name: 'copy-texture-to-buffer', options});\n }\n\n copyTextureToTexture(options: CopyTextureToTextureOptions): void {\n this.commandBuffer.commands.push({name: 'copy-texture-to-texture', options});\n }\n\n // clearTexture(options: ClearTextureOptions): void {\n // this.commandBuffer.commands.push({name: 'copy-texture-to-texture', options});\n // }\n\n override pushDebugGroup(groupLabel: string): void {}\n override popDebugGroup() {}\n\n override insertDebugMarker(markerLabel: string): void {}\n\n override resolveQuerySet(\n querySet: QuerySet,\n destination: Buffer,\n options?: {\n firstQuery?: number;\n queryCount?: number;\n destinationOffset?: number;\n }\n ): void {}\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {\n CopyBufferToBufferOptions,\n CopyBufferToTextureOptions,\n CopyTextureToBufferOptions,\n CopyTextureToTextureOptions\n // ClearTextureOptions,\n // ReadTextureOptions\n} from '@luma.gl/core';\nimport {CommandBuffer, Texture, Framebuffer} from '@luma.gl/core';\nimport {\n GL,\n GLTextureTarget,\n GLTextureCubeMapTarget\n // GLTexelDataFormat,\n // GLPixelType,\n // GLDataType\n} from '@luma.gl/constants';\n\nimport {WebGLDevice} from '../webgl-device';\nimport {WEBGLBuffer} from './webgl-buffer';\nimport {WEBGLTexture} from './webgl-texture';\nimport {WEBGLFramebuffer} from './webgl-framebuffer';\nimport {getTextureFormatWebGL} from '../converters/webgl-texture-table';\n\ntype CopyBufferToBufferCommand = {\n name: 'copy-buffer-to-buffer';\n options: CopyBufferToBufferOptions;\n};\n\ntype CopyBufferToTextureCommand = {\n name: 'copy-buffer-to-texture';\n options: CopyBufferToTextureOptions;\n};\n\ntype CopyTextureToBufferCommand = {\n name: 'copy-texture-to-buffer';\n options: CopyTextureToBufferOptions;\n};\n\ntype CopyTextureToTextureCommand = {\n name: 'copy-texture-to-texture';\n options: CopyTextureToTextureOptions;\n};\n\ntype ClearTextureCommand = {\n name: 'clear-texture';\n options: {}; // ClearTextureOptions;\n};\n\ntype ReadTextureCommand = {\n name: 'read-texture';\n options: {}; // ReadTextureOptions;\n};\n\ntype Command =\n | CopyBufferToBufferCommand\n | CopyBufferToTextureCommand\n | CopyTextureToBufferCommand\n | CopyTextureToTextureCommand\n | ClearTextureCommand\n | ReadTextureCommand;\n\nexport class WEBGLCommandBuffer extends CommandBuffer {\n device: WebGLDevice;\n commands: Command[] = [];\n\n constructor(device: WebGLDevice) {\n super(device, {});\n this.device = device;\n }\n\n submitCommands(commands: Command[] = this.commands) {\n for (const command of commands) {\n switch (command.name) {\n case 'copy-buffer-to-buffer':\n _copyBufferToBuffer(this.device, command.options);\n break;\n case 'copy-buffer-to-texture':\n _copyBufferToTexture(this.device, command.options);\n break;\n case 'copy-texture-to-buffer':\n _copyTextureToBuffer(this.device, command.options);\n break;\n case 'copy-texture-to-texture':\n _copyTextureToTexture(this.device, command.options);\n break;\n // case 'clear-texture':\n // _clearTexture(this.device, command.options);\n // break;\n default:\n throw new Error(command.name);\n }\n }\n }\n}\n\nfunction _copyBufferToBuffer(device: WebGLDevice, options: CopyBufferToBufferOptions): void {\n const source = options.sourceBuffer as WEBGLBuffer;\n const destination = options.destinationBuffer as WEBGLBuffer;\n\n // {In WebGL2 we can p}erform the copy on the GPU\n // Use GL.COPY_READ_BUFFER+GL.COPY_WRITE_BUFFER avoid disturbing other targets and locking type\n device.gl.bindBuffer(GL.COPY_READ_BUFFER, source.handle);\n device.gl.bindBuffer(GL.COPY_WRITE_BUFFER, destination.handle);\n device.gl.copyBufferSubData(\n GL.COPY_READ_BUFFER,\n GL.COPY_WRITE_BUFFER,\n options.sourceOffset ?? 0,\n options.destinationOffset ?? 0,\n options.size\n );\n device.gl.bindBuffer(GL.COPY_READ_BUFFER, null);\n device.gl.bindBuffer(GL.COPY_WRITE_BUFFER, null);\n}\n\n/**\n * Copies data from a Buffer object into a Texture object\n * NOTE: doesn't wait for copy to be complete\n */\nfunction _copyBufferToTexture(device: WebGLDevice, options: CopyBufferToTextureOptions): void {\n throw new Error('Not implemented');\n}\n\n/**\n * Copies data from a Texture object into a Buffer object.\n * NOTE: doesn't wait for copy to be complete\n */\nfunction _copyTextureToBuffer(device: WebGLDevice, options: CopyTextureToBufferOptions): void {\n const {\n /** Texture to copy to/from. */\n sourceTexture,\n /** Mip-map level of the texture to copy to/from. (Default 0) */\n mipLevel = 0,\n /** Defines which aspects of the texture to copy to/from. */\n aspect = 'all',\n\n /** Width to copy */\n width = options.sourceTexture.width,\n /** Height to copy */\n height = options.sourceTexture.height,\n depthOrArrayLayers = 0,\n /** Defines the origin of the copy - the minimum corner of the texture sub-region to copy to/from. */\n origin = [0, 0],\n\n /** Destination buffer */\n destinationBuffer,\n /** Offset, in bytes, from the beginning of the buffer to the start of the image data (default 0) */\n byteOffset = 0,\n /**\n * The stride, in bytes, between the beginning of each block row and the subsequent block row.\n * Required if there are multiple block rows (i.e. the copy height or depth is more than one block).\n */\n bytesPerRow,\n /**\n * Number of block rows per single image of the texture.\n * rowsPerImage × bytesPerRow is the stride, in bytes, between the beginning of each image of data and the subsequent image.\n * Required if there are multiple images (i.e. the copy depth is more than one).\n */\n rowsPerImage\n } = options;\n\n // TODO - Not possible to read just stencil or depth part in WebGL?\n if (aspect !== 'all') {\n throw new Error('aspect not supported in WebGL');\n }\n\n // TODO - mipLevels are set when attaching texture to framebuffer\n if (mipLevel !== 0 || depthOrArrayLayers !== 0 || bytesPerRow || rowsPerImage) {\n throw new Error('not implemented');\n }\n\n // Asynchronous read (PIXEL_PACK_BUFFER) is WebGL2 only feature\n const {framebuffer, destroyFramebuffer} = getFramebuffer(sourceTexture);\n let prevHandle: WebGLFramebuffer | null | undefined;\n try {\n const webglBuffer = destinationBuffer as WEBGLBuffer;\n const sourceWidth = width || framebuffer.width;\n const sourceHeight = height || framebuffer.height;\n const sourceParams = getTextureFormatWebGL(\n framebuffer.colorAttachments[0].texture.props.format\n );\n const sourceFormat = sourceParams.format;\n const sourceType = sourceParams.type;\n\n // if (!target) {\n // // Create new buffer with enough size\n // const components = glFormatToComponents(sourceFormat);\n // const byteCount = glTypeToBytes(sourceType);\n // const byteLength = byteOffset + sourceWidth * sourceHeight * components * byteCount;\n // target = device.createBuffer({byteLength});\n // }\n\n device.gl.bindBuffer(GL.PIXEL_PACK_BUFFER, webglBuffer.handle);\n // @ts-expect-error native bindFramebuffer is overridden by our state tracker\n prevHandle = device.gl.bindFramebuffer(GL.FRAMEBUFFER, framebuffer.handle);\n\n device.gl.readPixels(\n origin[0],\n origin[1],\n sourceWidth,\n sourceHeight,\n sourceFormat,\n sourceType,\n byteOffset\n );\n } finally {\n device.gl.bindBuffer(GL.PIXEL_PACK_BUFFER, null);\n // prevHandle may be unassigned if the try block failed before binding\n if (prevHandle !== undefined) {\n device.gl.bindFramebuffer(GL.FRAMEBUFFER, prevHandle);\n }\n\n if (destroyFramebuffer) {\n framebuffer.destroy();\n }\n }\n}\n\n/**\n * Copies data from a Framebuffer or a Texture object into a Buffer object.\n * NOTE: doesn't wait for copy to be complete, it programs GPU to perform a DMA transfer.\nexport function readPixelsToBuffer(\n source: Framebuffer | Texture,\n options?: {\n sourceX?: number;\n sourceY?: number;\n sourceFormat?: number;\n target?: Buffer; // A new Buffer object is created when not provided.\n targetByteOffset?: number; // byte offset in buffer object\n // following parameters are auto deduced if not provided\n sourceWidth?: number;\n sourceHeight?: number;\n sourceType?: number;\n }\n): Buffer\n */\n\n/**\n * Copy a rectangle from a Framebuffer or Texture object into a texture (at an offset)\n */\n// eslint-disable-next-line complexity, max-statements\nfunction _copyTextureToTexture(device: WebGLDevice, options: CopyTextureToTextureOptions): void {\n const {\n /** Texture to copy to/from. */\n sourceTexture,\n /** Mip-map level of the texture to copy to (Default 0) */\n destinationMipLevel = 0,\n /** Defines which aspects of the texture to copy to/from. */\n // aspect = 'all',\n /** Defines the origin of the copy - the minimum corner of the texture sub-region to copy from. */\n origin = [0, 0],\n\n /** Defines the origin of the copy - the minimum corner of the texture sub-region to copy to. */\n destinationOrigin = [0, 0],\n\n /** Texture to copy to/from. */\n destinationTexture\n /** Mip-map level of the texture to copy to/from. (Default 0) */\n // destinationMipLevel = options.mipLevel,\n /** Defines the origin of the copy - the minimum corner of the texture sub-region to copy to/from. */\n // destinationOrigin = [0, 0],\n /** Defines which aspects of the texture to copy to/from. */\n // destinationAspect = options.aspect,\n } = options;\n\n let {\n width = options.destinationTexture.width,\n height = options.destinationTexture.height\n // depthOrArrayLayers = 0\n } = options;\n\n const {framebuffer, destroyFramebuffer} = getFramebuffer(sourceTexture);\n const [sourceX, sourceY] = origin;\n const [destinationX, destinationY, destinationZ] = destinationOrigin;\n\n // @ts-expect-error native bindFramebuffer is overridden by our state tracker\n const prevHandle: WebGLFramebuffer | null = device.gl.bindFramebuffer(\n GL.FRAMEBUFFER,\n framebuffer.handle\n );\n // TODO - support gl.readBuffer (WebGL2 only)\n // const prevBuffer = gl.readBuffer(attachment);\n\n let texture: WEBGLTexture = null;\n let textureTarget: GL;\n if (destinationTexture instanceof WEBGLTexture) {\n texture = destinationTexture;\n width = Number.isFinite(width) ? width : texture.width;\n height = Number.isFinite(height) ? height : texture.height;\n texture.bind(0);\n textureTarget = texture.glTarget;\n } else {\n throw new Error('invalid destination');\n }\n\n switch (textureTarget) {\n case GL.TEXTURE_2D:\n case GL.TEXTURE_CUBE_MAP:\n device.gl.copyTexSubImage2D(\n textureTarget,\n destinationMipLevel,\n destinationX,\n destinationY,\n sourceX,\n sourceY,\n width,\n height\n );\n break;\n case GL.TEXTURE_2D_ARRAY:\n case GL.TEXTURE_3D:\n device.gl.copyTexSubImage3D(\n textureTarget,\n destinationMipLevel,\n destinationX,\n destinationY,\n destinationZ,\n sourceX,\n sourceY,\n width,\n height\n );\n break;\n default:\n }\n\n if (texture) {\n texture.unbind();\n }\n device.gl.bindFramebuffer(GL.FRAMEBUFFER, prevHandle);\n if (destroyFramebuffer) {\n framebuffer.destroy();\n }\n}\n\n/** Clear one mip level of a texture *\nfunction _clearTexture(device: WebGLDevice, options: ClearTextureOptions) {\n const BORDER = 0;\n const {dimension, width, height, depth = 0, mipLevel = 0} = options;\n const {glInternalFormat, glFormat, glType, compressed} = options;\n const glTarget = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);\n\n switch (dimension) {\n case '2d-array':\n case '3d':\n if (compressed) {\n // prettier-ignore\n device.gl.compressedTexImage3D(glTarget, mipLevel, glInternalFormat, width, height, depth, BORDER, null);\n } else {\n // prettier-ignore\n device.gl.texImage3D( glTarget, mipLevel, glInternalFormat, width, height, depth, BORDER, glFormat, glType, null);\n }\n break;\n\n case '2d':\n case 'cube':\n if (compressed) {\n // prettier-ignore\n device.gl.compressedTexImage2D(glTarget, mipLevel, glInternalFormat, width, height, BORDER, null);\n } else {\n // prettier-ignore\n device.gl.texImage2D(glTarget, mipLevel, glInternalFormat, width, height, BORDER, glFormat, glType, null);\n }\n break;\n\n default:\n throw new Error(dimension);\n }\n}\n */\n\n// function _readTexture(device: WebGLDevice, options: CopyTextureToBufferOptions) {}\n\n// HELPERS\n\n/**\n * In WebGL, cube maps specify faces by overriding target instead of using the depth parameter.\n * @note We still bind the texture using GL.TEXTURE_CUBE_MAP, but we need to use the face-specific target when setting mip levels.\n * @returns glTarget unchanged, if dimension !== 'cube'.\n */\nexport function getWebGLCubeFaceTarget(\n glTarget: GLTextureTarget,\n dimension: '1d' | '2d' | '2d-array' | 'cube' | 'cube-array' | '3d',\n level: number\n): GLTextureTarget | GLTextureCubeMapTarget {\n return dimension === 'cube' ? GL.TEXTURE_CUBE_MAP_POSITIVE_X + level : glTarget;\n}\n\n/** Wrap a texture in a framebuffer so that we can use WebGL APIs that work on framebuffers */\nfunction getFramebuffer(source: Texture | Framebuffer): {\n framebuffer: WEBGLFramebuffer;\n destroyFramebuffer: boolean;\n} {\n if (source instanceof Texture) {\n const {width, height, id} = source;\n const framebuffer = source.device.createFramebuffer({\n id: `framebuffer-for-${id}`,\n width,\n height,\n colorAttachments: [source]\n }) as unknown as WEBGLFramebuffer;\n\n return {framebuffer, destroyFramebuffer: true};\n }\n return {framebuffer: source as unknown as WEBGLFramebuffer, destroyFramebuffer: false};\n}\n\n/**\n * Returns number of components in a specific readPixels WebGL format\n * @todo use shadertypes utils instead?\n */\nexport function glFormatToComponents(format): 1 | 2 | 3 | 4 {\n switch (format) {\n case GL.ALPHA:\n case GL.R32F:\n case GL.RED:\n return 1;\n case GL.RG32F:\n case GL.RG:\n return 2;\n case GL.RGB:\n case GL.RGB32F:\n return 3;\n case GL.RGBA:\n case GL.RGBA32F:\n return 4;\n // TODO: Add support for additional WebGL2 formats\n default:\n throw new Error('GLFormat');\n }\n}\n\n/**\n * Return byte count for given readPixels WebGL type\n * @todo use shadertypes utils instead?\n */\nexport function glTypeToBytes(type: GL): 1 | 2 | 4 {\n switch (type) {\n case GL.UNSIGNED_BYTE:\n return 1;\n case GL.UNSIGNED_SHORT_5_6_5:\n case GL.UNSIGNED_SHORT_4_4_4_4:\n case GL.UNSIGNED_SHORT_5_5_5_1:\n return 2;\n case GL.FLOAT:\n return 4;\n // TODO: Add support for additional WebGL2 types\n default:\n throw new Error('GLType');\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {TypedArray, NumericArray} from '@math.gl/types';\nimport type {Device, Buffer, VertexArrayProps} from '@luma.gl/core';\nimport {VertexArray, getScratchArray} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\nimport {getBrowser} from '@probe.gl/env';\n\nimport {WebGLDevice} from '../webgl-device';\nimport {WEBGLBuffer} from '../resources/webgl-buffer';\n\nimport {getGLFromVertexType} from '../converters/vertex-formats';\nimport {fillArray} from '../../utils/fill-array';\n\n/** VertexArrayObject wrapper */\nexport class WEBGLVertexArray extends VertexArray {\n override get [Symbol.toStringTag](): string {\n return 'VertexArray';\n }\n\n readonly device: WebGLDevice;\n readonly handle: WebGLVertexArrayObject;\n\n /** Attribute 0 buffer constant */\n private buffer: WEBGLBuffer | null = null;\n private bufferValue = null;\n\n /** * Attribute 0 can not be disable on most desktop OpenGL based browsers */\n static isConstantAttributeZeroSupported(device: Device): boolean {\n return getBrowser() === 'Chrome';\n }\n\n // Create a VertexArray\n constructor(device: WebGLDevice, props: VertexArrayProps) {\n super(device, props);\n this.device = device;\n this.handle = this.device.gl.createVertexArray()!;\n }\n\n override destroy(): void {\n super.destroy();\n if (this.buffer) {\n this.buffer?.destroy();\n }\n if (this.handle) {\n this.device.gl.deleteVertexArray(this.handle);\n // @ts-expect-error read-only/undefined\n this.handle = undefined!;\n }\n\n // Auto-delete elements?\n // return [this.elements];\n }\n\n /**\n // Set (bind/unbind) an elements buffer, for indexed rendering.\n // Must be a Buffer bound to GL.ELEMENT_ARRAY_BUFFER or null. Constants not supported\n *\n * @param elementBuffer\n */\n setIndexBuffer(indexBuffer: Buffer | null): void {\n const buffer = indexBuffer as WEBGLBuffer;\n // Explicitly allow `null` to support clearing the index buffer\n if (buffer && buffer.glTarget !== GL.ELEMENT_ARRAY_BUFFER) {\n throw new Error('Use .setBuffer()');\n }\n // In WebGL The GL.ELEMENT_ARRAY_BUFFER_BINDING is stored on the VertexArrayObject\n this.device.gl.bindVertexArray(this.handle);\n this.device.gl.bindBuffer(GL.ELEMENT_ARRAY_BUFFER, buffer ? buffer.handle : null);\n\n this.indexBuffer = buffer;\n\n // Unbind to prevent unintended changes to the VAO.\n this.device.gl.bindVertexArray(null);\n }\n\n /** Set a location in vertex attributes array to a buffer, enables the location, sets divisor */\n setBuffer(location: number, attributeBuffer: Buffer): void {\n const buffer = attributeBuffer as WEBGLBuffer;\n // Sanity check target\n if (buffer.glTarget === GL.ELEMENT_ARRAY_BUFFER) {\n throw new Error('Use .setIndexBuffer()');\n }\n\n const {size, type, stride, offset, normalized, integer, divisor} = this._getAccessor(location);\n\n this.device.gl.bindVertexArray(this.handle);\n // A non-zero buffer object must be bound to the GL_ARRAY_BUFFER target\n this.device.gl.bindBuffer(GL.ARRAY_BUFFER, buffer.handle);\n\n // WebGL2 supports *integer* data formats, i.e. GPU will see integer values\n if (integer) {\n this.device.gl.vertexAttribIPointer(location, size, type, stride, offset);\n } else {\n // Attaches ARRAY_BUFFER with specified buffer format to location\n this.device.gl.vertexAttribPointer(location, size, type, normalized, stride, offset);\n }\n // Clear binding - keeping it may cause [.WebGL-0x12804417100]\n // GL_INVALID_OPERATION: A transform feedback buffer that would be written to is also bound to a non-transform-feedback target\n this.device.gl.bindBuffer(GL.ARRAY_BUFFER, null);\n\n // Mark as non-constant\n this.device.gl.enableVertexAttribArray(location);\n // Set the step mode 0=vertex, 1=instance\n this.device.gl.vertexAttribDivisor(location, divisor || 0);\n\n this.attributes[location] = buffer;\n\n // Unbind to prevent unintended changes to the VAO.\n this.device.gl.bindVertexArray(null);\n }\n\n /** Set a location in vertex attributes array to a constant value, disables the location */\n override setConstantWebGL(location: number, value: TypedArray): void {\n this._enable(location, false);\n this.attributes[location] = value;\n }\n\n override bindBeforeRender(): void {\n this.device.gl.bindVertexArray(this.handle);\n this._applyConstantAttributes();\n }\n\n override unbindAfterRender(): void {\n // Unbind to prevent unintended changes to the VAO.\n this.device.gl.bindVertexArray(null);\n }\n\n // Internal methods\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 protected _applyConstantAttributes(): void {\n for (let location = 0; location < this.maxVertexAttributes; ++location) {\n const constant = this.attributes[location];\n // A typed array means this is a constant\n if (ArrayBuffer.isView(constant)) {\n this.device.setConstantAttributeWebGL(location, constant);\n }\n }\n }\n\n /**\n * Set a location in vertex attributes array to a buffer, enables the location, sets divisor\n * @note requires vertex array to be bound\n */\n // protected _setAttributeLayout(location: number): void {\n // const {size, type, stride, offset, normalized, integer, divisor} = this._getAccessor(location);\n\n // // WebGL2 supports *integer* data formats, i.e. GPU will see integer values\n // if (integer) {\n // this.device.gl.vertexAttribIPointer(location, size, type, stride, offset);\n // } else {\n // // Attaches ARRAY_BUFFER with specified buffer format to location\n // this.device.gl.vertexAttribPointer(location, size, type, normalized, stride, offset);\n // }\n // this.device.gl.vertexAttribDivisor(location, divisor || 0);\n // }\n\n /** Get an accessor from the */\n protected _getAccessor(location: number) {\n const attributeInfo = this.attributeInfos[location];\n if (!attributeInfo) {\n throw new Error(`Unknown attribute location ${location}`);\n }\n const glType = getGLFromVertexType(attributeInfo.bufferDataType);\n return {\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 }\n\n /**\n * Enabling an attribute location makes it reference the currently bound buffer\n * Disabling an attribute location makes it reference the global constant value\n * TODO - handle single values for size 1 attributes?\n * TODO - convert classic arrays based on known type?\n */\n protected _enable(location: number, enable = true): void {\n // Attribute 0 cannot be disabled in most desktop OpenGL based browsers...\n const canDisableAttributeZero = WEBGLVertexArray.isConstantAttributeZeroSupported(this.device);\n const canDisableAttribute = canDisableAttributeZero || location !== 0;\n\n if (enable || canDisableAttribute) {\n location = Number(location);\n this.device.gl.bindVertexArray(this.handle);\n if (enable) {\n this.device.gl.enableVertexAttribArray(location);\n } else {\n this.device.gl.disableVertexAttribArray(location);\n }\n this.device.gl.bindVertexArray(null);\n }\n }\n\n /**\n * Provide a means to create a buffer that is equivalent to a constant.\n * NOTE: Desktop OpenGL cannot disable attribute 0.\n * https://stackoverflow.com/questions/20305231/webgl-warning-attribute-0-is-disabled-\n * this-has-significant-performance-penalty\n */\n getConstantBuffer(elementCount: number, value: TypedArray): Buffer {\n // Create buffer only when needed, and reuse it (avoids inflating buffer creation statistics)\n\n const constantValue = normalizeConstantArrayValue(value);\n\n const byteLength = constantValue.byteLength * elementCount;\n const length = constantValue.length * elementCount;\n\n if (this.buffer && byteLength !== this.buffer.byteLength) {\n throw new Error(\n `Buffer size is immutable, byte length ${byteLength} !== ${this.buffer.byteLength}.`\n );\n }\n let updateNeeded = !this.buffer;\n\n this.buffer = this.buffer || this.device.createBuffer({byteLength});\n\n // Reallocate and update contents if needed\n updateNeeded = updateNeeded || !compareConstantArrayValues(constantValue, this.bufferValue);\n\n if (updateNeeded) {\n // Create a typed array that is big enough, and fill it with the required data\n const typedArray = getScratchArray(value.constructor, length);\n fillArray({target: typedArray, source: constantValue, start: 0, count: length});\n this.buffer.write(typedArray);\n this.bufferValue = value;\n }\n\n return this.buffer;\n }\n}\n\n// HELPER FUNCTIONS\n\n/**\n * TODO - convert Arrays based on known type? (read type from accessor, don't assume Float32Array)\n * TODO - handle single values for size 1 attributes?\n */\nfunction normalizeConstantArrayValue(arrayValue: NumericArray) {\n if (Array.isArray(arrayValue)) {\n return new Float32Array(arrayValue);\n }\n return arrayValue;\n}\n\n/**\n *\n */\nfunction compareConstantArrayValues(v1: NumericArray, v2: NumericArray): boolean {\n if (!v1 || !v2 || v1.length !== v2.length || v1.constructor !== v2.constructor) {\n return false;\n }\n for (let i = 0; i < v1.length; ++i) {\n if (v1[i] !== v2[i]) {\n return false;\n }\n }\n return true;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {NumericArray} from '@math.gl/types';\n\n// Uses copyWithin to significantly speed up typed array value filling\nexport function fillArray(options: {\n target: NumericArray;\n source: NumericArray;\n start?: number;\n count?: number;\n}): NumericArray {\n const {target, source, start = 0, count = 1} = options;\n const length = source.length;\n const total = count * length;\n let copied = 0;\n for (let i = start; copied < length; copied++) {\n target[i++] = source[copied];\n }\n\n while (copied < total) {\n // If we have copied less than half, copy everything we got\n // else copy remaining in one operation\n if (copied < total - copied) {\n target.copyWithin(start + copied, start, start + copied);\n copied *= 2;\n } else {\n target.copyWithin(start + copied, start, start + total - copied);\n copied = total;\n }\n }\n\n return options.target;\n}\n", "import type {PrimitiveTopology, ShaderLayout, TransformFeedbackProps} from '@luma.gl/core';\nimport {log, TransformFeedback, Buffer, BufferRange} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\nimport {WebGLDevice} from '../webgl-device';\nimport {WEBGLBuffer} from '../../index';\nimport {getGLPrimitive} from '../helpers/webgl-topology-utils';\n\nexport class WEBGLTransformFeedback extends TransformFeedback {\n readonly device: WebGLDevice;\n readonly gl: WebGL2RenderingContext;\n readonly handle: WebGLTransformFeedback;\n\n /**\n * NOTE: The Model already has this information while drawing, but\n * TransformFeedback currently needs it internally, to look up\n * varying information outside of a draw() call.\n */\n readonly layout: ShaderLayout;\n buffers: Record<string, BufferRange> = {};\n unusedBuffers: Record<string, Buffer> = {};\n /**\n * Allows us to avoid a Chrome bug where a buffer that is already bound to a\n * different target cannot be bound to 'TRANSFORM_FEEDBACK_BUFFER' target.\n * This a major workaround, see: https://github.com/KhronosGroup/WebGL/issues/2346\n */\n bindOnUse = true;\n private _bound: boolean = false;\n\n constructor(device: WebGLDevice, props: TransformFeedbackProps) {\n super(device, props);\n\n this.device = device;\n this.gl = device.gl;\n this.handle = this.props.handle || this.gl.createTransformFeedback();\n this.layout = this.props.layout;\n\n if (props.buffers) {\n this.setBuffers(props.buffers);\n }\n\n Object.seal(this);\n }\n\n override destroy(): void {\n this.gl.deleteTransformFeedback(this.handle);\n super.destroy();\n }\n\n begin(topology: PrimitiveTopology = 'point-list'): void {\n this.gl.bindTransformFeedback(GL.TRANSFORM_FEEDBACK, this.handle);\n if (this.bindOnUse) {\n this._bindBuffers();\n }\n this.gl.beginTransformFeedback(getGLPrimitive(topology));\n }\n\n end(): void {\n this.gl.endTransformFeedback();\n if (this.bindOnUse) {\n this._unbindBuffers();\n }\n this.gl.bindTransformFeedback(GL.TRANSFORM_FEEDBACK, null);\n }\n\n // SUBCLASS\n\n setBuffers(buffers: Record<string, Buffer | BufferRange>): void {\n this.buffers = {};\n this.unusedBuffers = {};\n\n this.bind(() => {\n for (const bufferName in buffers) {\n this.setBuffer(bufferName, buffers[bufferName]);\n }\n });\n }\n\n setBuffer(locationOrName: string | number, bufferOrRange: Buffer | BufferRange): void {\n const location = this._getVaryingIndex(locationOrName);\n const {buffer, byteLength, byteOffset} = this._getBufferRange(bufferOrRange);\n\n if (location < 0) {\n this.unusedBuffers[locationOrName] = buffer;\n log.warn(`${this.id} unusedBuffers varying buffer ${locationOrName}`)();\n return;\n }\n\n this.buffers[location] = {buffer, byteLength, byteOffset};\n\n // Need to avoid chrome bug where buffer that is already bound to a different target\n // cannot be bound to 'TRANSFORM_FEEDBACK_BUFFER' target.\n if (!this.bindOnUse) {\n this._bindBuffer(location, buffer, byteOffset, byteLength);\n }\n }\n\n getBuffer(locationOrName: string | number): Buffer | BufferRange | null {\n if (isIndex(locationOrName)) {\n return this.buffers[locationOrName] || null;\n }\n const location = this._getVaryingIndex(locationOrName);\n return location >= 0 ? this.buffers[location] : null;\n }\n\n bind(funcOrHandle = this.handle) {\n if (typeof funcOrHandle !== 'function') {\n this.gl.bindTransformFeedback(GL.TRANSFORM_FEEDBACK, funcOrHandle);\n return this;\n }\n\n let value: unknown;\n\n if (!this._bound) {\n this.gl.bindTransformFeedback(GL.TRANSFORM_FEEDBACK, this.handle);\n this._bound = true;\n value = funcOrHandle();\n this._bound = false;\n this.gl.bindTransformFeedback(GL.TRANSFORM_FEEDBACK, null);\n } else {\n value = funcOrHandle();\n }\n\n return value;\n }\n\n unbind() {\n this.bind(null);\n }\n\n // PRIVATE METHODS\n\n /** Extract offsets for bindBufferRange */\n protected _getBufferRange(\n bufferOrRange: Buffer | {buffer: Buffer; byteOffset?: number; byteLength?: number}\n ): Required<BufferRange> {\n if (bufferOrRange instanceof WEBGLBuffer) {\n return {buffer: bufferOrRange, byteOffset: 0, byteLength: bufferOrRange.byteLength};\n }\n\n // To use bindBufferRange either offset or size must be specified.\n // @ts-expect-error Must be a BufferRange.\n const {buffer, byteOffset = 0, byteLength = bufferOrRange.buffer.byteLength} = bufferOrRange;\n return {buffer, byteOffset, byteLength};\n }\n\n protected _getVaryingIndex(locationOrName: string | number): number {\n if (isIndex(locationOrName)) {\n return Number(locationOrName);\n }\n\n for (const varying of this.layout.varyings) {\n if (locationOrName === varying.name) {\n return varying.location;\n }\n }\n\n return -1;\n }\n\n /**\n * Need to avoid chrome bug where buffer that is already bound to a different target\n * cannot be bound to 'TRANSFORM_FEEDBACK_BUFFER' target.\n */\n protected _bindBuffers(): void {\n for (const bufferIndex in this.buffers) {\n const {buffer, byteLength, byteOffset} = this._getBufferRange(this.buffers[bufferIndex]);\n this._bindBuffer(Number(bufferIndex), buffer, byteOffset, byteLength);\n }\n }\n\n protected _unbindBuffers(): void {\n for (const bufferIndex in this.buffers) {\n this.gl.bindBufferBase(GL.TRANSFORM_FEEDBACK_BUFFER, Number(bufferIndex), null);\n }\n }\n\n protected _bindBuffer(index: number, buffer: Buffer, byteOffset = 0, byteLength?: number): void {\n const handle = buffer && (buffer as WEBGLBuffer).handle;\n if (!handle || byteLength === undefined) {\n this.gl.bindBufferBase(GL.TRANSFORM_FEEDBACK_BUFFER, index, handle);\n } else {\n this.gl.bindBufferRange(GL.TRANSFORM_FEEDBACK_BUFFER, index, handle, byteOffset, byteLength);\n }\n }\n}\n\n/**\n * Returns true if the given value is an integer, or a string that\n * trivially converts to an integer (only numeric characters).\n */\nfunction isIndex(value: string | number): boolean {\n if (typeof value === 'number') {\n return Number.isInteger(value);\n }\n return /^\\d+$/.test(value);\n}\n", "// WebGL2 Query (also handles disjoint timer extensions)\nimport {QuerySet, QuerySetProps} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\nimport {WebGLDevice} from '../webgl-device';\n\n/**\n * Asynchronous queries for different kinds of information\n */\nexport class WEBGLQuerySet extends QuerySet {\n device: WebGLDevice;\n handle: WebGLQuery;\n\n target: number | null = null;\n _queryPending = false;\n _pollingPromise: Promise<any> | null = null;\n\n override get [Symbol.toStringTag](): string {\n return 'Query';\n }\n\n // Create a query class\n constructor(device: WebGLDevice, props: QuerySetProps) {\n super(device, props);\n this.device = device;\n\n if (props.count > 1) {\n throw new Error('WebGL QuerySet can only have one value');\n }\n\n this.handle = this.device.gl.createQuery();\n Object.seal(this);\n }\n\n override destroy() {\n this.device.gl.deleteQuery(this.handle);\n }\n\n // FOR RENDER PASS AND COMMAND ENCODER\n\n /**\n * Shortcut for timer query (dependent on extension in both WebGL1 and 2)\n * Measures GPU time delta between this call and a matching `end` call in the\n * GPU instruction stream.\n */\n beginTimestampQuery(): void {\n return this._begin(GL.TIME_ELAPSED_EXT);\n }\n\n endTimestampQuery(): void {\n this._end();\n }\n\n // Shortcut for occlusion queries\n beginOcclusionQuery(options?: {conservative?: boolean}): void {\n return this._begin(\n options?.conservative ? GL.ANY_SAMPLES_PASSED_CONSERVATIVE : GL.ANY_SAMPLES_PASSED\n );\n }\n\n endOcclusionQuery() {\n this._end();\n }\n\n // Shortcut for transformFeedbackQuery\n beginTransformFeedbackQuery(): void {\n return this._begin(GL.TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);\n }\n\n endTransformFeedbackQuery(): void {\n this._end();\n }\n\n async resolveQuery(): Promise<bigint[]> {\n const value = await this.pollQuery();\n return [value];\n }\n\n // PRIVATE METHODS\n\n /**\n * Due to OpenGL API limitations, after calling `begin()` on one Query\n * instance, `end()` must be called on that same instance before\n * calling `begin()` on another query. While there can be multiple\n * outstanding queries representing disjoint `begin()`/`end()` intervals.\n * It is not possible to interleave or overlap `begin` and `end` calls.\n */\n protected _begin(target: number): void {\n // Don't start a new query if one is already active.\n if (this._queryPending) {\n return;\n }\n\n this.target = target;\n this.device.gl.beginQuery(this.target, this.handle);\n\n return;\n }\n\n // ends the current query\n protected _end(): void {\n // Can't end a new query if the last one hasn't been resolved.\n if (this._queryPending) {\n return;\n }\n\n if (this.target) {\n this.device.gl.endQuery(this.target);\n this.target = null;\n this._queryPending = true;\n }\n return;\n }\n\n // Returns true if the query result is available\n isResultAvailable(): boolean {\n if (!this._queryPending) {\n return false;\n }\n\n const resultAvailable = this.device.gl.getQueryParameter(\n this.handle,\n GL.QUERY_RESULT_AVAILABLE\n );\n if (resultAvailable) {\n this._queryPending = false;\n }\n return resultAvailable;\n }\n\n // Timing query is disjoint, i.e. results are invalid\n isTimerDisjoint(): boolean {\n return this.device.gl.getParameter(GL.GPU_DISJOINT_EXT);\n }\n\n // Returns query result.\n getResult(): any {\n return this.device.gl.getQueryParameter(this.handle, GL.QUERY_RESULT);\n }\n\n // Returns the query result, converted to milliseconds to match JavaScript conventions.\n getTimerMilliseconds() {\n return this.getResult() / 1e6;\n }\n\n // Polls the query\n pollQuery(limit: number = Number.POSITIVE_INFINITY): Promise<any> {\n if (this._pollingPromise) {\n return this._pollingPromise;\n }\n\n let counter = 0;\n\n this._pollingPromise = new Promise((resolve, reject) => {\n const poll = () => {\n if (this.isResultAvailable()) {\n resolve(this.getResult());\n this._pollingPromise = null;\n } else if (counter++ > limit) {\n reject('Timed out');\n this._pollingPromise = null;\n } else {\n requestAnimationFrame(poll);\n }\n };\n\n requestAnimationFrame(poll);\n });\n\n return this._pollingPromise;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// Goal is to make WebGL2 contexts look like WebGL1\n// @note Partly inspired by with some older code from the `regl` library\n\n/* eslint-disable camelcase */\n\nimport {GL} from '@luma.gl/constants';\n\n// webgl1 extensions natively supported by webgl2\nconst WEBGL1_STATIC_EXTENSIONS = {\n WEBGL_depth_texture: {\n UNSIGNED_INT_24_8_WEBGL: GL.UNSIGNED_INT_24_8\n } as const satisfies WEBGL_depth_texture,\n OES_element_index_uint: {} as const satisfies OES_element_index_uint,\n OES_texture_float: {} as const satisfies OES_texture_float,\n OES_texture_half_float: {\n // @ts-expect-error different numbers?\n HALF_FLOAT_OES: GL.HALF_FLOAT\n } as const satisfies OES_texture_half_float,\n EXT_color_buffer_float: {} as const satisfies EXT_color_buffer_float,\n OES_standard_derivatives: {\n FRAGMENT_SHADER_DERIVATIVE_HINT_OES: GL.FRAGMENT_SHADER_DERIVATIVE_HINT\n } as const satisfies OES_standard_derivatives,\n EXT_frag_depth: {} as const satisfies EXT_frag_depth,\n EXT_blend_minmax: {\n MIN_EXT: GL.MIN,\n MAX_EXT: GL.MAX\n } as const satisfies EXT_blend_minmax,\n EXT_shader_texture_lod: {} as const satisfies EXT_shader_texture_lod\n};\n\nconst getWEBGL_draw_buffers = (gl: WebGL2RenderingContext) =>\n ({\n drawBuffersWEBGL(buffers: number[]) {\n return gl.drawBuffers(buffers);\n },\n COLOR_ATTACHMENT0_WEBGL: GL.COLOR_ATTACHMENT0,\n COLOR_ATTACHMENT1_WEBGL: GL.COLOR_ATTACHMENT1,\n COLOR_ATTACHMENT2_WEBGL: GL.COLOR_ATTACHMENT2,\n COLOR_ATTACHMENT3_WEBGL: GL.COLOR_ATTACHMENT3\n }) as const satisfies Partial<WEBGL_draw_buffers>; // - too many fields\n\nconst getOES_vertex_array_object = (gl: WebGL2RenderingContext) =>\n ({\n VERTEX_ARRAY_BINDING_OES: GL.VERTEX_ARRAY_BINDING,\n createVertexArrayOES() {\n return gl.createVertexArray();\n },\n deleteVertexArrayOES(vertexArray: WebGLVertexArrayObject): void {\n return gl.deleteVertexArray(vertexArray);\n },\n isVertexArrayOES(vertexArray: WebGLVertexArrayObject): boolean {\n return gl.isVertexArray(vertexArray);\n },\n bindVertexArrayOES(vertexArray: WebGLVertexArrayObject): void {\n return gl.bindVertexArray(vertexArray);\n }\n }) as const satisfies OES_vertex_array_object;\n\nconst getANGLE_instanced_arrays = (gl: WebGL2RenderingContext) =>\n ({\n VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: 0x88fe,\n drawArraysInstancedANGLE(...args) {\n return gl.drawArraysInstanced(...args);\n },\n drawElementsInstancedANGLE(...args) {\n return gl.drawElementsInstanced(...args);\n },\n vertexAttribDivisorANGLE(...args) {\n return gl.vertexAttribDivisor(...args);\n }\n }) as const satisfies ANGLE_instanced_arrays;\n\n/**\n * Make browser return WebGL2 contexts even if WebGL1 contexts are requested\n * @param enforce\n * @returns\n */\nexport function enforceWebGL2(enforce: boolean = true): void {\n const prototype = HTMLCanvasElement.prototype as any;\n if (!enforce && prototype.originalGetContext) {\n // Reset the original getContext function\n prototype.getContext = prototype.originalGetContext;\n prototype.originalGetContext = undefined;\n return;\n }\n\n // Store the original getContext function\n prototype.originalGetContext = prototype.getContext;\n\n // Override the getContext function\n prototype.getContext = function (contextId: string, options?: WebGLContextAttributes) {\n // Attempt to force WebGL2 for all WebGL1 contexts\n if (contextId === 'webgl' || contextId === 'experimental-webgl') {\n const context = this.originalGetContext('webgl2', options) as WebGL2RenderingContext;\n // Work around test mocking\n if (context instanceof HTMLElement) {\n polyfillWebGL1Extensions(context);\n }\n return context;\n }\n // For any other type, return the original context\n return this.originalGetContext(contextId, options);\n };\n}\n\n/** Install WebGL1-only extensions on WebGL2 contexts */\nexport function polyfillWebGL1Extensions(gl: WebGL2RenderingContext): void {\n // Enable, to support float and half-float textures\n gl.getExtension('EXT_color_buffer_float');\n\n // WebGL1 extensions implemented using WebGL2 APIs\n const boundExtensions = {\n ...WEBGL1_STATIC_EXTENSIONS,\n WEBGL_disjoint_timer_query: gl.getExtension('EXT_disjoint_timer_query_webgl2'),\n WEBGL_draw_buffers: getWEBGL_draw_buffers(gl),\n OES_vertex_array_object: getOES_vertex_array_object(gl),\n ANGLE_instanced_arrays: getANGLE_instanced_arrays(gl)\n };\n\n // Override gl.getExtension\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const originalGetExtension = gl.getExtension;\n gl.getExtension = function (extensionName: string) {\n const ext = originalGetExtension.call(gl, extensionName);\n if (ext) {\n return ext;\n }\n\n // Injected extensions\n if (extensionName in boundExtensions) {\n return boundExtensions[extensionName];\n }\n\n return null;\n };\n\n // Override gl.getSupportedExtensions\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const originalGetSupportedExtensions = gl.getSupportedExtensions;\n gl.getSupportedExtensions = function (): string[] | null {\n const extensions = originalGetSupportedExtensions.apply(gl) || [];\n return extensions?.concat(Object.keys(boundExtensions));\n };\n}\n\n// Update unsized WebGL1 formats to sized WebGL2 formats\n// todo move to texture format file\n// export function getInternalFormat(gl: WebGL2RenderingContext, format: GL, type: GL): GL {\n// // webgl2 texture formats\n// // https://webgl2fundamentals.org/webgl/lessons/webgl-data-textures.html\n// switch (format) {\n// case GL.DEPTH_COMPONENT:\n// return GL.DEPTH_COMPONENT24;\n// case GL.DEPTH_STENCIL:\n// return GL.DEPTH24_STENCIL8;\n// case GL.RGBA:\n// return type === GL.HALF_FLOAT ? GL.RGBA16F : GL.RGBA32F;\n// case GL.RGB:\n// return type === GL.HALF_FLOAT ? GL.RGB16F : GL.RGB32F;\n// default:\n// return format;\n// }\n// }\n\n/*\n// texture type to update on the fly\nexport function getTextureType(gl: WebGL2RenderingContext, type: GL): GL {\n if (type === HALF_FLOAT_OES) {\n return GL.HALF_FLOAT;\n }\n return type;\n}\n\n // And texImage2D to convert the internalFormat to webgl2.\n const webgl2 = this;\n const origTexImage = gl.texImage2D;\n gl.texImage2D = function (target, miplevel, iformat, a, typeFor6, c, d, typeFor9, f) {\n if (arguments.length == 6) {\n var ifmt = webgl2.getInternalFormat(gl, iformat, typeFor6);\n origTexImage.apply(gl, [target, miplevel, ifmt, a, webgl.getTextureType(gl, typeFor6), c]);\n } else {\n // arguments.length == 9\n var ifmt = webgl2.getInternalFormat(gl, iformat, typeFor9);\n origTexImage.apply(gl, [\n target,\n miplevel,\n ifmt,\n a,\n typeFor6,\n c,\n d,\n webgl2.getTextureType(gl, typeFor9),\n f\n ]);\n }\n };\n};\n*/\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Buffer, log} from '@luma.gl/core';\nimport {GL, GLDataType, GLPixelType} from '@luma.gl/constants';\nimport {TypedArrayConstructor} from '@math.gl/types';\n\n/**\n * Attribute descriptor object\n * @deprecated Use ShaderLayout\n */\nexport interface AccessorObject {\n buffer?: Buffer;\n // format: VertexFormat;\n offset?: number;\n // can now be described with single WebGPU-style `format` string\n\n //\n stride?: number;\n\n /** @deprecated - Use accessor.stepMode */\n divisor?: number;\n\n /** @deprecated - Infer from format */\n type?: number;\n /** @deprecated - Infer from format */\n size?: number;\n /** @deprecated - Infer from format */\n normalized?: boolean;\n /** @deprecated - Infer from format */\n integer?: boolean;\n\n /** @deprecated */\n index?: number;\n}\n\nconst DEFAULT_ACCESSOR_VALUES = {\n offset: 0,\n stride: 0,\n type: GL.FLOAT,\n size: 1,\n divisor: 0,\n normalized: false,\n integer: false\n};\n\nexport class Accessor implements AccessorObject {\n offset?: number;\n stride?: number;\n type?: number;\n size?: number;\n divisor?: number;\n normalized?: boolean;\n integer?: boolean;\n\n buffer?: Buffer;\n index?: number;\n\n static getBytesPerElement(accessor: Accessor | AccessorObject): number {\n // TODO: using `FLOAT` when type is not specified,\n // ensure this assumption is valid or force API to specify type.\n const ArrayType = getTypedArrayFromGLType(accessor.type || GL.FLOAT);\n return ArrayType.BYTES_PER_ELEMENT;\n }\n\n static getBytesPerVertex(accessor: AccessorObject): number {\n // assert(accessor.size);\n // TODO: using `FLOAT` when type is not specified,\n // ensure this assumption is valid or force API to specify type.\n const ArrayType = getTypedArrayFromGLType(accessor.type || GL.FLOAT);\n return ArrayType.BYTES_PER_ELEMENT * accessor.size;\n }\n\n // Combines (merges) a list of accessors. On top of default values\n // Usually [programAccessor, bufferAccessor, appAccessor]\n // All props will be set in the returned object.\n // TODO check for conflicts between values in the supplied accessors\n static resolve(...accessors: AccessorObject[]): Accessor {\n return new Accessor(...[DEFAULT_ACCESSOR_VALUES, ...accessors]); // Default values\n }\n\n constructor(...accessors: AccessorObject[]) {\n log.warn('Accessor will be removed in next minor release');\n accessors.forEach(accessor => this._assign(accessor)); // Merge in sequence\n Object.freeze(this);\n }\n\n toString(): string {\n return JSON.stringify(this);\n }\n\n // ACCESSORS\n\n // TODO - remove>\n get BYTES_PER_ELEMENT(): number {\n return Accessor.getBytesPerElement(this);\n }\n\n get BYTES_PER_VERTEX(): number {\n return Accessor.getBytesPerVertex(this);\n }\n\n // PRIVATE\n\n // eslint-disable-next-line complexity, max-statements\n _assign(props: AccessorObject = {}): this {\n if (props.type !== undefined) {\n this.type = props.type;\n\n // Auto-deduce integer type?\n if ((props.type as GL) === GL.INT || (props.type as GL) === GL.UNSIGNED_INT) {\n this.integer = true;\n }\n }\n if (props.size !== undefined) {\n this.size = props.size;\n }\n if (props.offset !== undefined) {\n this.offset = props.offset;\n }\n if (props.stride !== undefined) {\n this.stride = props.stride;\n }\n // @ts-expect-error\n if (props.normalize !== undefined) {\n // @ts-expect-error\n this.normalized = props.normalize;\n }\n if (props.normalized !== undefined) {\n this.normalized = props.normalized;\n }\n if (props.integer !== undefined) {\n this.integer = props.integer;\n }\n\n // INSTANCE DIVISOR\n if (props.divisor !== undefined) {\n this.divisor = props.divisor;\n }\n\n // Buffer is optional\n if (props.buffer !== undefined) {\n this.buffer = props.buffer;\n }\n\n // The binding index (for binding e.g. Transform feedbacks and Uniform buffers)\n // TODO - should this be part of accessor?\n if (props.index !== undefined) {\n if (typeof props.index === 'boolean') {\n this.index = props.index ? 1 : 0;\n } else {\n this.index = props.index;\n }\n }\n\n // DEPRECATED\n // @ts-expect-error\n if (props.instanced !== undefined) {\n // @ts-expect-error\n this.divisor = props.instanced ? 1 : 0;\n }\n // @ts-expect-error\n if (props.isInstanced !== undefined) {\n // @ts-expect-error\n this.divisor = props.isInstanced ? 1 : 0;\n }\n\n if (this.offset === undefined) delete this.offset;\n if (this.stride === undefined) delete this.stride;\n if (this.type === undefined) delete this.type;\n if (this.size === undefined) delete this.size;\n if (this.divisor === undefined) delete this.divisor;\n if (this.normalized === undefined) delete this.normalized;\n if (this.integer === undefined) delete this.integer;\n\n if (this.buffer === undefined) delete this.buffer;\n if (this.index === undefined) delete this.index;\n\n return this;\n }\n}\n\n/**\n * Converts GL constant to corresponding TYPED ARRAY\n * Used to auto deduce gl parameter types\n * @deprecated Use getTypedArrayFromDataType\n * @param glType\n * @param param1\n * @returns\n */\n// eslint-disable-next-line complexity\nfunction getTypedArrayFromGLType(\n glType: GLDataType | GLPixelType,\n options?: {\n clamped?: boolean;\n }\n): TypedArrayConstructor {\n const {clamped = true} = options || {};\n // Sorted in some order of likelihood to reduce amount of comparisons\n switch (glType) {\n case GL.FLOAT:\n return Float32Array;\n case GL.UNSIGNED_SHORT:\n case GL.UNSIGNED_SHORT_5_6_5:\n case GL.UNSIGNED_SHORT_4_4_4_4:\n case GL.UNSIGNED_SHORT_5_5_5_1:\n return Uint16Array;\n case GL.UNSIGNED_INT:\n return Uint32Array;\n case GL.UNSIGNED_BYTE:\n return clamped ? Uint8ClampedArray : Uint8Array;\n case GL.BYTE:\n return Int8Array;\n case GL.SHORT:\n return Int16Array;\n case GL.INT:\n return Int32Array;\n default:\n throw new Error('Failed to deduce typed array type from GL constant');\n }\n}\n\n// TEST EXPORTS\nexport {DEFAULT_ACCESSOR_VALUES};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_core", "import_core", "target", "import_constants", "import_core", "import_constants", "import_constants", "import_core", "import_constants", "import_core", "import_core", "import_constants", "import_core", "import_core", "import_constants", "GLEnum", "message", "import_core", "import_constants", "import_core", "import_constants", "messageType", "message", "import_core", "import_constants", "import_constants", "import_core", "import_constants", "isObjectEmpty", "isObjectEmpty", "isObjectEmpty", "import_core", "import_constants", "import_core", "import_core", "import_constants", "import_constants", "import_constants", "isObjectEmpty", "target", "import_core", "import_constants", "import_core", "import_constants", "import_constants", "import_constants", "uniforms", "isArray", "import_constants", "import_constants", "status", "import_core", "import_core", "import_constants", "getFramebuffer", "getFramebuffer", "import_core", "import_constants", "import_env", "target", "enable", "import_core", "import_constants", "import_core", "import_constants", "target", "_a", "compareConstantArrayValues", "import_constants", "LOG_LEVEL", "enable", "message", "import_core", "import_constants", "getTypedArrayFromGLType"]
|
|
7
7
|
}
|