@luma.gl/webgl 9.0.11 → 9.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/LICENSE +34 -0
  2. package/dist/adapter/converters/device-parameters.d.ts.map +1 -1
  3. package/dist/adapter/converters/device-parameters.js +12 -1
  4. package/dist/adapter/converters/texture-formats.d.ts +22 -16
  5. package/dist/adapter/converters/texture-formats.d.ts.map +1 -1
  6. package/dist/adapter/converters/texture-formats.js +31 -32
  7. package/dist/adapter/device-helpers/webgl-device-features.js +1 -1
  8. package/dist/adapter/device-helpers/webgl-device-limits.js +1 -1
  9. package/dist/adapter/helpers/webgl-texture-utils.d.ts +300 -0
  10. package/dist/adapter/helpers/webgl-texture-utils.d.ts.map +1 -0
  11. package/dist/adapter/helpers/webgl-texture-utils.js +368 -0
  12. package/dist/adapter/helpers/webgl-topology-utils.d.ts.map +1 -1
  13. package/dist/adapter/helpers/webgl-topology-utils.js +0 -4
  14. package/dist/adapter/resources/webgl-buffer.d.ts.map +1 -1
  15. package/dist/adapter/resources/webgl-buffer.js +2 -2
  16. package/dist/adapter/resources/webgl-command-buffer.d.ts.map +1 -1
  17. package/dist/adapter/resources/webgl-command-buffer.js +6 -9
  18. package/dist/adapter/resources/webgl-framebuffer.d.ts +32 -5
  19. package/dist/adapter/resources/webgl-framebuffer.d.ts.map +1 -1
  20. package/dist/adapter/resources/webgl-framebuffer.js +42 -60
  21. package/dist/adapter/resources/webgl-render-pass.d.ts +3 -2
  22. package/dist/adapter/resources/webgl-render-pass.d.ts.map +1 -1
  23. package/dist/adapter/resources/webgl-render-pass.js +1 -3
  24. package/dist/adapter/resources/webgl-render-pipeline.d.ts.map +1 -1
  25. package/dist/adapter/resources/webgl-render-pipeline.js +45 -20
  26. package/dist/adapter/resources/webgl-shader.d.ts.map +1 -1
  27. package/dist/adapter/resources/webgl-shader.js +2 -2
  28. package/dist/adapter/resources/webgl-texture-view.d.ts +1 -1
  29. package/dist/adapter/resources/webgl-texture-view.d.ts.map +1 -1
  30. package/dist/adapter/resources/webgl-texture-view.js +1 -1
  31. package/dist/adapter/resources/webgl-texture.d.ts +58 -172
  32. package/dist/adapter/resources/webgl-texture.d.ts.map +1 -1
  33. package/dist/adapter/resources/webgl-texture.js +402 -510
  34. package/dist/adapter/resources/webgl-vertex-array.d.ts +3 -2
  35. package/dist/adapter/resources/webgl-vertex-array.d.ts.map +1 -1
  36. package/dist/adapter/resources/webgl-vertex-array.js +2 -2
  37. package/dist/adapter/webgl-canvas-context.d.ts +3 -1
  38. package/dist/adapter/webgl-canvas-context.d.ts.map +1 -1
  39. package/dist/adapter/webgl-canvas-context.js +2 -0
  40. package/dist/adapter/webgl-device.d.ts +4 -3
  41. package/dist/adapter/webgl-device.d.ts.map +1 -1
  42. package/dist/adapter/webgl-device.js +6 -5
  43. package/dist/classic/accessor.d.ts +22 -1
  44. package/dist/classic/accessor.d.ts.map +1 -1
  45. package/dist/classic/accessor.js +1 -9
  46. package/dist/classic/clear.d.ts.map +1 -1
  47. package/dist/classic/clear.js +2 -5
  48. package/dist/classic/copy-and-blit.d.ts +2 -1
  49. package/dist/classic/copy-and-blit.d.ts.map +1 -1
  50. package/dist/classic/copy-and-blit.js +11 -9
  51. package/dist/classic/format-utils.d.ts.map +1 -1
  52. package/dist/classic/format-utils.js +0 -3
  53. package/dist/classic/typed-array-utils.d.ts +1 -1
  54. package/dist/classic/typed-array-utils.d.ts.map +1 -1
  55. package/dist/context/debug/spector.d.ts.map +1 -1
  56. package/dist/context/debug/spector.js +2 -1
  57. package/dist/context/debug/webgl-developer-tools.d.ts +1 -1
  58. package/dist/context/debug/webgl-developer-tools.d.ts.map +1 -1
  59. package/dist/context/debug/webgl-developer-tools.js +2 -5
  60. package/dist/context/parameters/webgl-parameter-tables.js +1 -1
  61. package/dist/context/state-tracker/track-context-state.d.ts.map +1 -1
  62. package/dist/context/state-tracker/track-context-state.js +5 -6
  63. package/dist/dist.dev.js +870 -1261
  64. package/dist/dist.min.js +2 -2
  65. package/dist/index.cjs +859 -1137
  66. package/dist/index.cjs.map +4 -4
  67. package/dist/index.d.ts +0 -4
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +0 -3
  70. package/dist/utils/fill-array.d.ts +8 -0
  71. package/dist/utils/fill-array.d.ts.map +1 -0
  72. package/dist/utils/fill-array.js +26 -0
  73. package/dist/utils/load-script.d.ts +8 -0
  74. package/dist/utils/load-script.d.ts.map +1 -0
  75. package/dist/utils/load-script.js +26 -0
  76. package/dist/utils/split-uniforms-and-bindings.d.ts +9 -0
  77. package/dist/utils/split-uniforms-and-bindings.d.ts.map +1 -0
  78. package/dist/utils/split-uniforms-and-bindings.js +20 -0
  79. package/package.json +6 -5
  80. package/src/adapter/converters/device-parameters.ts +13 -1
  81. package/src/adapter/converters/texture-formats.ts +45 -42
  82. package/src/adapter/device-helpers/webgl-device-features.ts +1 -1
  83. package/src/adapter/device-helpers/webgl-device-limits.ts +1 -1
  84. package/src/adapter/helpers/webgl-texture-utils.ts +481 -0
  85. package/src/adapter/helpers/webgl-topology-utils.ts +0 -4
  86. package/src/adapter/resources/webgl-buffer.ts +2 -2
  87. package/src/adapter/resources/webgl-command-buffer.ts +8 -10
  88. package/src/adapter/resources/webgl-framebuffer.ts +22 -56
  89. package/src/adapter/resources/webgl-render-pass.ts +4 -5
  90. package/src/adapter/resources/webgl-render-pipeline.ts +48 -23
  91. package/src/adapter/resources/webgl-shader.ts +3 -3
  92. package/src/adapter/resources/webgl-texture-view.ts +1 -3
  93. package/src/adapter/resources/webgl-texture.ts +432 -784
  94. package/src/adapter/resources/webgl-vertex-array.ts +8 -7
  95. package/src/adapter/webgl-canvas-context.ts +4 -1
  96. package/src/adapter/webgl-device.ts +10 -18
  97. package/src/classic/accessor.ts +31 -11
  98. package/src/classic/clear.ts +3 -6
  99. package/src/classic/copy-and-blit.ts +19 -19
  100. package/src/classic/format-utils.ts +0 -3
  101. package/src/classic/typed-array-utils.ts +1 -1
  102. package/src/context/debug/spector.ts +2 -1
  103. package/src/context/debug/webgl-developer-tools.ts +3 -7
  104. package/src/context/parameters/webgl-parameter-tables.ts +3 -3
  105. package/src/context/state-tracker/track-context-state.ts +5 -6
  106. package/src/index.ts +0 -6
  107. package/src/utils/fill-array.ts +35 -0
  108. package/src/utils/load-script.ts +30 -0
  109. package/src/utils/split-uniforms-and-bindings.ts +31 -0
  110. package/dist/adapter/objects/constants-to-keys.d.ts +0 -3
  111. package/dist/adapter/objects/constants-to-keys.d.ts.map +0 -1
  112. package/dist/adapter/objects/constants-to-keys.js +0 -22
  113. package/dist/adapter/objects/webgl-renderbuffer.d.ts +0 -43
  114. package/dist/adapter/objects/webgl-renderbuffer.d.ts.map +0 -1
  115. package/dist/adapter/objects/webgl-renderbuffer.js +0 -95
  116. package/dist/adapter/objects/webgl-resource.d.ts +0 -32
  117. package/dist/adapter/objects/webgl-resource.d.ts.map +0 -1
  118. package/dist/adapter/objects/webgl-resource.js +0 -114
  119. package/src/adapter/objects/constants-to-keys.ts +0 -27
  120. package/src/adapter/objects/webgl-renderbuffer.ts +0 -132
  121. package/src/adapter/objects/webgl-resource.ts +0 -183
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["index.js", "adapter/webgl-device.js", "context/state-tracker/track-context-state.js", "context/parameters/webgl-parameter-tables.js", "context/parameters/unified-parameter-api.js", "context/state-tracker/deep-array-equal.js", "context/helpers/create-browser-context.js", "adapter/device-helpers/webgl-device-info.js", "context/helpers/webgl-extensions.js", "adapter/device-helpers/webgl-device-features.js", "adapter/converters/texture-formats.js", "adapter/converters/vertex-formats.js", "adapter/device-helpers/webgl-device-limits.js", "adapter/webgl-canvas-context.js", "adapter/resources/webgl-framebuffer.js", "adapter/resources/webgl-texture.js", "context/state-tracker/with-parameters.js", "adapter/converters/sampler-parameters.js", "adapter/converters/device-parameters.js", "adapter/resources/webgl-buffer.js", "adapter/resources/webgl-sampler.js", "adapter/resources/webgl-texture-view.js", "context/debug/spector.js", "context/debug/webgl-developer-tools.js", "adapter/resources/webgl-shader.js", "adapter/helpers/parse-shader-compiler-log.js", "adapter/resources/webgl-render-pass.js", "adapter/resources/webgl-render-pipeline.js", "adapter/helpers/get-shader-layout.js", "classic/accessor.js", "classic/typed-array-utils.js", "adapter/helpers/decode-webgl-types.js", "adapter/helpers/set-uniform.js", "adapter/helpers/webgl-topology-utils.js", "adapter/resources/webgl-command-encoder.js", "adapter/resources/webgl-command-buffer.js", "adapter/resources/webgl-vertex-array.js", "adapter/resources/webgl-transform-feedback.js", "adapter/resources/webgl-query-set.js", "classic/copy-and-blit.js", "classic/format-utils.js", "classic/clear.js", "adapter/objects/webgl-resource.js", "adapter/objects/webgl-renderbuffer.js"],
4
- "sourcesContent": ["// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n// WebGL adapter classes\nexport { WebGLDevice } from \"./adapter/webgl-device.js\";\nexport { WebGLCanvasContext } from \"./adapter/webgl-canvas-context.js\";\n// WebGL Resource classes\nexport { WebGLResource, WebGLResource as WEBGLResource } from \"./adapter/objects/webgl-resource.js\";\nexport { WEBGLBuffer } from \"./adapter/resources/webgl-buffer.js\";\nexport { WEBGLTexture } from \"./adapter/resources/webgl-texture.js\";\n// export {WEBGLExternalTexture} from './adapter/resources/webgl-external-texture';\nexport { WEBGLShader } from \"./adapter/resources/webgl-shader.js\";\nexport { WEBGLSampler } from \"./adapter/resources/webgl-sampler.js\";\nexport { WEBGLFramebuffer } from \"./adapter/resources/webgl-framebuffer.js\";\nexport { WEBGLRenderPipeline } from \"./adapter/resources/webgl-render-pipeline.js\";\n// export {WEBGLComputePipeline} from './adapter/resources/webgl-compute-pipeline';\nexport { WEBGLCommandEncoder } from \"./adapter/resources/webgl-command-encoder.js\";\nexport { WEBGLRenderPass } from \"./adapter/resources/webgl-render-pass.js\";\n// export {WEBGLComputePass} from './adapter/resources/webgl-compute-pass';\nexport { WEBGLVertexArray } from \"./adapter/resources/webgl-vertex-array.js\";\n// WebGL adapter classes\nexport { WEBGLTransformFeedback } from \"./adapter/resources/webgl-transform-feedback.js\";\n// WebGL adapter classes\nexport { Accessor } from \"./classic/accessor.js\";\n// Unified parameter API\nexport { setDeviceParameters, withDeviceParameters } from \"./adapter/converters/device-parameters.js\";\n// HELPERS - EXPERIMENTAL\nexport { getShaderLayout } from \"./adapter/helpers/get-shader-layout.js\";\nexport { convertGLToTextureFormat } from \"./adapter/converters/texture-formats.js\";\nexport { WEBGLRenderbuffer as _WEBGLRenderbuffer } from \"./adapter/objects/webgl-renderbuffer.js\";\n// TEST EXPORTS\nexport { TEXTURE_FORMATS as _TEXTURE_FORMATS } from \"./adapter/converters/texture-formats.js\";\n// DEPRECATED TEST EXPORTS\n// State tracking\nexport { trackContextState, pushContextState, popContextState } from \"./context/state-tracker/track-context-state.js\";\nexport { resetGLParameters, setGLParameters, getGLParameters } from \"./context/parameters/unified-parameter-api.js\";\nexport { withGLParameters } from \"./context/state-tracker/with-parameters.js\";\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { Device, CanvasContext, log, uid, assert } from '@luma.gl/core';\nimport { popContextState, pushContextState, trackContextState } from \"../context/state-tracker/track-context-state.js\";\nimport { createBrowserContext } from \"../context/helpers/create-browser-context.js\";\nimport { getDeviceInfo } from \"./device-helpers/webgl-device-info.js\";\nimport { WebGLDeviceFeatures } from \"./device-helpers/webgl-device-features.js\";\nimport { WebGLDeviceLimits } from \"./device-helpers/webgl-device-limits.js\";\nimport { WebGLCanvasContext } from \"./webgl-canvas-context.js\";\nimport { loadSpectorJS, initializeSpectorJS } from \"../context/debug/spector.js\";\nimport { loadWebGLDeveloperTools, makeDebugContext } from \"../context/debug/webgl-developer-tools.js\";\nimport { isTextureFormatSupported, isTextureFormatRenderable, isTextureFormatFilterable } from \"./converters/texture-formats.js\";\nimport { WEBGLBuffer } from \"./resources/webgl-buffer.js\";\nimport { WEBGLShader } from \"./resources/webgl-shader.js\";\nimport { WEBGLSampler } from \"./resources/webgl-sampler.js\";\nimport { WEBGLTexture } from \"./resources/webgl-texture.js\";\nimport { WEBGLFramebuffer } from \"./resources/webgl-framebuffer.js\";\nimport { WEBGLRenderPass } from \"./resources/webgl-render-pass.js\";\nimport { WEBGLRenderPipeline } from \"./resources/webgl-render-pipeline.js\";\nimport { WEBGLCommandEncoder } from \"./resources/webgl-command-encoder.js\";\nimport { WEBGLVertexArray } from \"./resources/webgl-vertex-array.js\";\nimport { WEBGLTransformFeedback } from \"./resources/webgl-transform-feedback.js\";\nimport { WEBGLQuerySet } from \"./resources/webgl-query-set.js\";\nimport { readPixelsToArray, readPixelsToBuffer } from \"../classic/copy-and-blit.js\";\nimport { setGLParameters, getGLParameters, resetGLParameters } from \"../context/parameters/unified-parameter-api.js\";\nimport { withGLParameters } from \"../context/state-tracker/with-parameters.js\";\nimport { clear } from \"../classic/clear.js\";\nimport { getWebGLExtension } from \"../context/helpers/webgl-extensions.js\";\nconst LOG_LEVEL = 1;\n/** WebGPU style Device API for a WebGL context */\nexport class WebGLDevice extends Device {\n //\n // Public `Device` API\n //\n /** type of this device */\n static type = 'webgl';\n /** type of this device */\n type = 'webgl';\n /** The underlying WebGL context */\n handle;\n features;\n limits;\n info;\n canvasContext;\n lost;\n _resolveContextLost;\n //\n // Static methods, expected to be present by `luma.createDevice()`\n //\n /** Check if WebGL 2 is available */\n static isSupported() {\n return typeof WebGL2RenderingContext !== 'undefined';\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 static attach(gl) {\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;\n }\n if (!isWebGL(gl)) {\n throw new Error('Invalid WebGL2RenderingContext');\n }\n return new WebGLDevice({ gl: gl });\n }\n static async create(props = {}) {\n log.groupCollapsed(LOG_LEVEL, 'WebGLDevice created')();\n const promises = [];\n // Load webgl and spector debug scripts from CDN if requested\n if (props.debug) {\n promises.push(loadWebGLDeveloperTools());\n }\n if (props.spector) {\n promises.push(loadSpectorJS());\n }\n // Wait for page to load: if canvas is a string we need to query the DOM for the canvas element.\n // We only wait when props.canvas is string to avoids setting the global page onload callback unless necessary.\n if (typeof props.canvas === 'string') {\n promises.push(CanvasContext.pageLoaded);\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 log.probe(LOG_LEVEL + 1, 'DOM is loaded')();\n // @ts-expect-error\n if (props.gl?.device) {\n log.warn('reattaching existing device')();\n return WebGLDevice.attach(props.gl);\n }\n const device = new WebGLDevice(props);\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 log.groupEnd(LOG_LEVEL)();\n return device;\n }\n //\n // Public API\n //\n constructor(props) {\n super({ ...props, id: props.id || uid('webgl-device') });\n // If attaching to an already attached context, return the attached device\n // @ts-expect-error device is attached to context\n const device = props.gl?.device;\n if (device) {\n throw new Error(`WebGL context already attached to device ${device.id}`);\n }\n // Create and instrument context\n const canvas = props.gl?.canvas || props.canvas;\n this.canvasContext = new WebGLCanvasContext(this, { ...props, canvas });\n this.lost = new Promise(resolve => {\n this._resolveContextLost = resolve;\n });\n let gl = props.gl || null;\n gl ||= createBrowserContext(this.canvasContext.canvas, {\n ...props,\n onContextLost: (event) => this._resolveContextLost?.({\n reason: 'destroyed',\n message: 'Entered sleep mode, or too many apps or browser tabs are using the GPU.'\n })\n });\n if (!gl) {\n throw new Error('WebGL context creation failed');\n }\n this.handle = gl;\n this.gl = gl;\n this.gl.device = this; // Update GL context: Link webgl context back to device\n this.gl._version = 2; // Update GL context: Store WebGL version field on gl context (HACK to identify debug contexts)\n // luma Device fields\n this.info = getDeviceInfo(this.gl, this._extensions);\n this.limits = new WebGLDeviceLimits(this.gl);\n this.features = new WebGLDeviceFeatures(this.gl, this._extensions, this.props.disabledFeatures);\n if (this.props.initalizeFeatures) {\n this.features.initializeFeatures();\n }\n this.canvasContext.resize();\n // Install context state tracking\n // @ts-expect-error - hidden parameters\n const { enable = true, copyState = false } = props;\n trackContextState(this.gl, {\n enable,\n copyState,\n log: (...args) => log.log(1, ...args)()\n });\n // DEBUG contexts: Add debug instrumentation to the context, force log level to at least 1\n if (props.debug) {\n this.gl = makeDebugContext(this.gl, { ...props, throwOnError: true });\n this.debug = true;\n log.level = Math.max(log.level, 1);\n log.warn('WebGL debug mode activated. Performance reduced.')();\n }\n if (props.spector) {\n this.spectorJS = initializeSpectorJS({ ...this.props, canvas: this.handle.canvas });\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() { }\n get isLost() {\n return this.gl.isContextLost();\n }\n getSize() {\n return [this.gl.drawingBufferWidth, this.gl.drawingBufferHeight];\n }\n isTextureFormatSupported(format) {\n return isTextureFormatSupported(this.gl, format, this._extensions);\n }\n isTextureFormatFilterable(format) {\n return isTextureFormatFilterable(this.gl, format, this._extensions);\n }\n isTextureFormatRenderable(format) {\n return isTextureFormatRenderable(this.gl, format, this._extensions);\n }\n // IMPLEMENTATION OF ABSTRACT DEVICE\n createCanvasContext(props) {\n throw new Error('WebGL only supports a single canvas');\n }\n createBuffer(props) {\n const newProps = this._getBufferProps(props);\n return new WEBGLBuffer(this, newProps);\n }\n _createTexture(props) {\n return new WEBGLTexture(this, props);\n }\n createExternalTexture(props) {\n throw new Error('createExternalTexture() not implemented'); // return new Program(props);\n }\n createSampler(props) {\n return new WEBGLSampler(this, props);\n }\n createShader(props) {\n return new WEBGLShader(this, props);\n }\n createFramebuffer(props) {\n return new WEBGLFramebuffer(this, props);\n }\n createVertexArray(props) {\n return new WEBGLVertexArray(this, props);\n }\n createTransformFeedback(props) {\n return new WEBGLTransformFeedback(this, props);\n }\n createQuerySet(props) {\n return new WEBGLQuerySet(this, props);\n }\n createRenderPipeline(props) {\n return new WEBGLRenderPipeline(this, props);\n }\n beginRenderPass(props) {\n return new WEBGLRenderPass(this, props);\n }\n createComputePipeline(props) {\n throw new Error('ComputePipeline not supported in WebGL');\n }\n beginComputePass(props) {\n throw new Error('ComputePass not supported in WebGL');\n }\n renderPass = null;\n createCommandEncoder(props) {\n return new WEBGLCommandEncoder(this, props);\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() {\n this.renderPass?.end();\n this.renderPass = null;\n // this.canvasContext.commit();\n }\n //\n // TEMPORARY HACKS - will be removed in v9.1\n //\n /** @deprecated - should use command encoder */\n readPixelsToArrayWebGL(source, options) {\n return readPixelsToArray(source, options);\n }\n /** @deprecated - should use command encoder */\n readPixelsToBufferWebGL(source, options) {\n return readPixelsToBuffer(source, options);\n }\n setParametersWebGL(parameters) {\n setGLParameters(this.gl, parameters);\n }\n getParametersWebGL(parameters) {\n return getGLParameters(this.gl, parameters);\n }\n withParametersWebGL(parameters, func) {\n return withGLParameters(this.gl, parameters, func);\n }\n clearWebGL(options) {\n clear(this, options);\n }\n resetWebGL() {\n log.warn('WebGLDevice.resetWebGL is deprecated, use only for debugging')();\n resetGLParameters(this.gl);\n }\n //\n // WebGL-only API (not part of `Device` API)\n //\n /** WebGL2 context. */\n gl;\n debug = false;\n /** State used by luma.gl classes: TODO - move to canvasContext*/\n _canvasSizeInfo = { clientWidth: 0, clientHeight: 0, devicePixelRatio: 1 };\n /** State used by luma.gl classes - TODO - not used? */\n _extensions = {};\n _polyfilled = false;\n /** Instance of Spector.js (if initialized) */\n spectorJS;\n /**\n * Triggers device (or WebGL context) loss.\n * @note primarily intended for testing how application reacts to device loss\n */\n loseDevice() {\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 /** Save current WebGL context state onto an internal stack */\n pushState() {\n pushContextState(this.gl);\n }\n /** Restores previously saved context state */\n popState() {\n popContextState(this.gl);\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, props) {\n // @ts-expect-error\n // eslint-disable-next-line camelcase\n handle.__SPECTOR_Metadata = props;\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, gl) {\n // @ts-ignore expect-error depends on settings\n gl = gl || this.gl2 || this.gl;\n const number = Number(value);\n for (const key in gl) {\n // @ts-ignore expect-error depends on settings\n if (gl[key] === number) {\n return `GL.${key}`;\n }\n }\n // No constant found. Stringify the value and return it.\n return String(value);\n }\n /** Store constants */\n _constants;\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, constant) {\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(1, `setConstantAttributeWebGL(${location}) could have been skipped, value unchanged`)();\n }\n this._constants[location] = constant;\n switch (constant.constructor) {\n case Float32Array:\n setConstantFloatArray(this, location, constant);\n break;\n case Int32Array:\n setConstantIntArray(this, location, constant);\n break;\n case Uint32Array:\n setConstantUintArray(this, location, constant);\n break;\n default:\n assert(false);\n }\n }\n /** Ensure extensions are only requested once */\n getExtension(name) {\n getWebGLExtension(this.gl, name, this._extensions);\n return this._extensions;\n }\n}\n/** Check if supplied parameter is a WebGL2RenderingContext */\nfunction isWebGL(gl) {\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/** Set constant float array attribute */\nfunction setConstantFloatArray(device, location, array) {\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/** Set constant signed int array attribute */\nfunction setConstantIntArray(device, location, array) {\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/** Set constant unsigned int array attribute */\nfunction setConstantUintArray(device, location, array) {\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 * Compares contents of two typed arrays\n * @todo max length?\n */\nfunction compareConstantArrayValues(v1, v2) {\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// Support for listening to context state changes and intercepting state queries\n// NOTE: this system does not handle buffer bindings\nimport { assert } from '@luma.gl/core';\nimport { GL_PARAMETER_DEFAULTS, GL_HOOKED_SETTERS, NON_CACHE_PARAMETERS } from \"../parameters/webgl-parameter-tables.js\";\nimport { setGLParameters, getGLParameters } from \"../parameters/unified-parameter-api.js\";\nimport { deepArrayEqual } from \"./deep-array-equal.js\";\n// HELPER CLASS - GLState\n/* eslint-disable no-shadow */\nclass GLState {\n gl;\n program = null;\n stateStack = [];\n enable = true;\n cache;\n log;\n constructor(gl, { copyState = false, // Copy cache from params (slow) or initialize from WebGL defaults (fast)\n log = () => { } // Logging function, called when gl parameter change calls are actually issued\n } = {}) {\n this.gl = gl;\n this.cache = copyState ? getGLParameters(gl) : Object.assign({}, GL_PARAMETER_DEFAULTS);\n this.log = log;\n this._updateCache = this._updateCache.bind(this);\n Object.seal(this);\n }\n push(values = {}) {\n this.stateStack.push({});\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 // 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) {\n let valueChanged = false;\n let oldValue; // = undefined\n const oldValues = this.stateStack.length > 0 ? this.stateStack[this.stateStack.length - 1] : null;\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 // 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 // Save current value being shadowed\n this.cache[key] = value;\n }\n }\n return { valueChanged, oldValue };\n }\n}\nfunction getContextState(gl) {\n // @ts-expect-error\n return gl.state;\n}\n// PUBLIC API\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 * gl.state.push() and gl.state.pop() will be available for saving,\n * temporarily modifying, and then restoring state.\n */\nexport function trackContextState(gl, options) {\n const { enable = true, copyState } = options;\n assert(copyState !== undefined);\n // @ts-expect-error\n if (!gl.state) {\n // @ts-ignore\n // const {polyfillContext} = global_;\n // if (polyfillContext) {\n // polyfillContext(gl);\n // }\n // Create a state cache\n // @ts-expect-error\n gl.state = new GLState(gl, { copyState });\n installProgramSpy(gl);\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 // intercept all getter functions in the table\n installGetterOverride(gl, 'getParameter');\n installGetterOverride(gl, 'isEnabled');\n }\n const glState = getContextState(gl);\n glState.enable = enable;\n return gl;\n}\n/**\n * Saves current WebGL context state onto an internal per-context stack\n */\nexport function pushContextState(gl) {\n let glState = getContextState(gl);\n if (!glState) {\n trackContextState(gl, { copyState: false });\n glState = getContextState(gl);\n }\n glState.push();\n}\n/**\n * Restores previously saved WebGL context state\n */\nexport function popContextState(gl) {\n const glState = getContextState(gl);\n assert(glState);\n glState.pop();\n}\n// HELPER FUNCTIONS - INSTALL GET/SET INTERCEPTORS (SPYS) ON THE CONTEXT\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, functionName) {\n // Get the original function from the WebGL2RenderingContext\n const originalGetterFunc = gl[functionName].bind(gl);\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 const glState = getContextState(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 // 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 // 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// 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, functionName, setter) {\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 const originalSetterFunc = gl[functionName].bind(gl);\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 = getContextState(gl);\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const { valueChanged, oldValue } = setter(glState._updateCache, ...params);\n // Call the original WebGL2RenderingContext func to make sure the context actually gets updated\n if (valueChanged) {\n originalSetterFunc(...params);\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 return oldValue;\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}\nfunction installProgramSpy(gl) {\n const originalUseProgram = gl.useProgram.bind(gl);\n gl.useProgram = function useProgramLuma(handle) {\n const glState = getContextState(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// Tables describing WebGL parameters\nimport { GL } from '@luma.gl/constants';\n// DEFAULT SETTINGS - FOR FAST CACHE INITIALIZATION AND CONTEXT RESETS\n/* eslint-disable no-shadow */\nexport const GL_PARAMETER_DEFAULTS = {\n [3042]: false,\n [32773]: new Float32Array([0, 0, 0, 0]),\n [32777]: 32774,\n [34877]: 32774,\n [32969]: 1,\n [32968]: 0,\n [32971]: 1,\n [32970]: 0,\n [3106]: new Float32Array([0, 0, 0, 0]), // TBD\n [3107]: [true, true, true, true],\n [2884]: false,\n [2885]: 1029,\n [2929]: false,\n [2931]: 1,\n [2932]: 513,\n [2928]: new Float32Array([0, 1]), // TBD\n [2930]: true,\n [3024]: true,\n [35725]: null,\n // FRAMEBUFFER_BINDING and DRAW_FRAMEBUFFER_BINDING(WebGL2) refer same state.\n [36006]: null,\n [36007]: null,\n [34229]: null,\n [34964]: null,\n [2886]: 2305,\n [33170]: 4352,\n [2849]: 1,\n [32823]: false,\n [32824]: 0,\n [10752]: 0,\n [32926]: false,\n [32928]: false,\n [32938]: 1.0,\n [32939]: false,\n [3089]: false,\n // Note: Dynamic value. If scissor test enabled we expect users to set correct scissor box\n [3088]: new Int32Array([0, 0, 1024, 1024]),\n [2960]: false,\n [2961]: 0,\n [2968]: 0xffffffff,\n [36005]: 0xffffffff,\n [2962]: 519,\n [2967]: 0,\n [2963]: 0xffffffff,\n [34816]: 519,\n [36003]: 0,\n [36004]: 0xffffffff,\n [2964]: 7680,\n [2965]: 7680,\n [2966]: 7680,\n [34817]: 7680,\n [34818]: 7680,\n [34819]: 7680,\n // Dynamic value: We use [0, 0, 1024, 1024] as default, but usually this is updated in each frame.\n [2978]: [0, 0, 1024, 1024],\n [36389]: null,\n [36662]: null,\n [36663]: null,\n [35053]: null,\n [35055]: null,\n [35723]: 4352,\n [36010]: null,\n [35977]: false,\n [3333]: 4,\n [3317]: 4,\n [37440]: false,\n [37441]: false,\n [37443]: 37444,\n [3330]: 0,\n [3332]: 0,\n [3331]: 0,\n [3314]: 0,\n [32878]: 0,\n [3316]: 0,\n [3315]: 0,\n [32877]: 0\n};\n// SETTER TABLES - ENABLES SETTING ANY PARAMETER WITH A COMMON API\nconst enable = (gl, value, key) => value ? gl.enable(key) : gl.disable(key);\nconst hint = (gl, value, key) => gl.hint(key, value);\nconst pixelStorei = (gl, value, key) => gl.pixelStorei(key, value);\nconst bindFramebuffer = (gl, value, key) => {\n const target = key === 36006 ? 36009 : 36008;\n return gl.bindFramebuffer(target, value);\n};\nconst bindBuffer = (gl, value, key) => {\n const bindingMap = {\n [34964]: 34962,\n [36662]: 36662,\n [36663]: 36663,\n [35053]: 35051,\n [35055]: 35052\n };\n const glTarget = bindingMap[key];\n gl.bindBuffer(glTarget, value);\n};\n// Utility\nfunction isArray(array) {\n return Array.isArray(array) || (ArrayBuffer.isView(array) && !(array instanceof DataView));\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 [3042]: enable,\n [32773]: (gl, value) => gl.blendColor(...value),\n [32777]: 'blendEquation',\n [34877]: 'blendEquation',\n [32969]: 'blendFunc',\n [32968]: 'blendFunc',\n [32971]: 'blendFunc',\n [32970]: 'blendFunc',\n [3106]: (gl, value) => gl.clearColor(...value),\n [3107]: (gl, value) => gl.colorMask(...value),\n [2884]: enable,\n [2885]: (gl, value) => gl.cullFace(value),\n [2929]: enable,\n [2931]: (gl, value) => gl.clearDepth(value),\n [2932]: (gl, value) => gl.depthFunc(value),\n [2928]: (gl, value) => gl.depthRange(...value),\n [2930]: (gl, value) => gl.depthMask(value),\n [3024]: enable,\n [35723]: hint,\n [35725]: (gl, value) => gl.useProgram(value),\n [36007]: (gl, value) => gl.bindRenderbuffer(36161, value),\n [36389]: (gl, value) => gl.bindTransformFeedback?.(36386, value),\n [34229]: (gl, value) => gl.bindVertexArray(value),\n // NOTE: FRAMEBUFFER_BINDING and DRAW_FRAMEBUFFER_BINDING(WebGL2) refer same state.\n [36006]: bindFramebuffer,\n [36010]: bindFramebuffer,\n // Buffers\n [34964]: bindBuffer,\n [36662]: bindBuffer,\n [36663]: bindBuffer,\n [35053]: bindBuffer,\n [35055]: bindBuffer,\n [2886]: (gl, value) => gl.frontFace(value),\n [33170]: hint,\n [2849]: (gl, value) => gl.lineWidth(value),\n [32823]: enable,\n [32824]: 'polygonOffset',\n [10752]: 'polygonOffset',\n [35977]: enable,\n [32926]: enable,\n [32928]: enable,\n [32938]: 'sampleCoverage',\n [32939]: 'sampleCoverage',\n [3089]: enable,\n [3088]: (gl, value) => gl.scissor(...value),\n [2960]: enable,\n [2961]: (gl, value) => gl.clearStencil(value),\n [2968]: (gl, value) => gl.stencilMaskSeparate(1028, value),\n [36005]: (gl, value) => gl.stencilMaskSeparate(1029, value),\n [2962]: 'stencilFuncFront',\n [2967]: 'stencilFuncFront',\n [2963]: 'stencilFuncFront',\n [34816]: 'stencilFuncBack',\n [36003]: 'stencilFuncBack',\n [36004]: 'stencilFuncBack',\n [2964]: 'stencilOpFront',\n [2965]: 'stencilOpFront',\n [2966]: 'stencilOpFront',\n [34817]: 'stencilOpBack',\n [34818]: 'stencilOpBack',\n [34819]: 'stencilOpBack',\n [2978]: (gl, value) => gl.viewport(...value),\n // WEBGL2 EXTENSIONS\n // EXT_depth_clamp https://registry.khronos.org/webgl/extensions/EXT_depth_clamp/\n [34383]: enable,\n // WEBGL_provoking_vertex https://registry.khronos.org/webgl/extensions/WEBGL_provoking_vertex/\n // [GL.PROVOKING_VERTEX_WEBL]: TODO - extension function needed\n // WEBGL_polygon_mode https://registry.khronos.org/webgl/extensions/WEBGL_polygon_mode/\n // POLYGON_MODE_WEBGL TODO - extension function needed\n [10754]: enable,\n // WEBGL_clip_cull_distance https://registry.khronos.org/webgl/extensions/WEBGL_clip_cull_distance/\n [12288]: enable,\n [12289]: enable,\n [12290]: enable,\n [12291]: enable,\n [12292]: enable,\n [12293]: enable,\n [12294]: enable,\n [12295]: enable,\n // PIXEL PACK/UNPACK MODES\n [3333]: pixelStorei,\n [3317]: pixelStorei,\n [37440]: pixelStorei,\n [37441]: pixelStorei,\n [37443]: pixelStorei,\n [3330]: pixelStorei,\n [3332]: pixelStorei,\n [3331]: pixelStorei,\n [3314]: pixelStorei,\n [32878]: pixelStorei,\n [3316]: pixelStorei,\n [3315]: pixelStorei,\n [32877]: pixelStorei,\n // Function-style setters\n framebuffer: (gl, 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(36160, handle);\n },\n blend: (gl, value) => value ? gl.enable(3042) : gl.disable(3042),\n blendColor: (gl, value) => gl.blendColor(...value),\n blendEquation: (gl, args) => {\n const separateModes = typeof args === 'number' ? [args, args] : args;\n gl.blendEquationSeparate(...separateModes);\n },\n blendFunc: (gl, args) => {\n const separateFuncs = args?.length === 2 ? [...args, ...args] : args;\n gl.blendFuncSeparate(...separateFuncs);\n },\n clearColor: (gl, value) => gl.clearColor(...value),\n clearDepth: (gl, value) => gl.clearDepth(value),\n clearStencil: (gl, value) => gl.clearStencil(value),\n colorMask: (gl, value) => gl.colorMask(...value),\n cull: (gl, value) => value ? gl.enable(2884) : gl.disable(2884),\n cullFace: (gl, value) => gl.cullFace(value),\n depthTest: (gl, value) => value ? gl.enable(2929) : gl.disable(2929),\n depthFunc: (gl, value) => gl.depthFunc(value),\n depthMask: (gl, value) => gl.depthMask(value),\n depthRange: (gl, value) => gl.depthRange(...value),\n dither: (gl, value) => value ? gl.enable(3024) : gl.disable(3024),\n derivativeHint: (gl, value) => {\n // gl1: 'OES_standard_derivatives'\n gl.hint(35723, value);\n },\n frontFace: (gl, value) => gl.frontFace(value),\n mipmapHint: (gl, value) => gl.hint(33170, value),\n lineWidth: (gl, value) => gl.lineWidth(value),\n polygonOffsetFill: (gl, value) => value ? gl.enable(32823) : gl.disable(32823),\n polygonOffset: (gl, value) => gl.polygonOffset(...value),\n sampleCoverage: (gl, value) => gl.sampleCoverage(...value),\n scissorTest: (gl, value) => value ? gl.enable(3089) : gl.disable(3089),\n scissor: (gl, value) => gl.scissor(...value),\n stencilTest: (gl, value) => value ? gl.enable(2960) : gl.disable(2960),\n stencilMask: (gl, value) => {\n value = isArray(value) ? value : [value, value];\n const [mask, backMask] = value;\n gl.stencilMaskSeparate(1028, mask);\n gl.stencilMaskSeparate(1029, backMask);\n },\n stencilFunc: (gl, args) => {\n args = isArray(args) && args.length === 3 ? [...args, ...args] : args;\n const [func, ref, mask, backFunc, backRef, backMask] = args;\n gl.stencilFuncSeparate(1028, func, ref, mask);\n gl.stencilFuncSeparate(1029, backFunc, backRef, backMask);\n },\n stencilOp: (gl, args) => {\n args = isArray(args) && args.length === 3 ? [...args, ...args] : args;\n const [sfail, dpfail, dppass, backSfail, backDpfail, backDppass] = args;\n gl.stencilOpSeparate(1028, sfail, dpfail, dppass);\n gl.stencilOpSeparate(1029, backSfail, backDpfail, backDppass);\n },\n viewport: (gl, value) => gl.viewport(...value)\n};\nfunction getValue(glEnum, values, cache) {\n return values[glEnum] !== undefined ? values[glEnum] : cache[glEnum];\n}\n// COMPOSITE_WEBGL_PARAMETER_\nexport const GL_COMPOSITE_PARAMETER_SETTERS = {\n blendEquation: (gl, values, cache) => gl.blendEquationSeparate(getValue(32777, values, cache), getValue(34877, values, cache)),\n blendFunc: (gl, values, cache) => gl.blendFuncSeparate(getValue(32969, values, cache), getValue(32968, values, cache), getValue(32971, values, cache), getValue(32970, values, cache)),\n polygonOffset: (gl, values, cache) => gl.polygonOffset(getValue(32824, values, cache), getValue(10752, values, cache)),\n sampleCoverage: (gl, values, cache) => gl.sampleCoverage(getValue(32938, values, cache), getValue(32939, values, cache)),\n stencilFuncFront: (gl, values, cache) => gl.stencilFuncSeparate(1028, getValue(2962, values, cache), getValue(2967, values, cache), getValue(2963, values, cache)),\n stencilFuncBack: (gl, values, cache) => gl.stencilFuncSeparate(1029, getValue(34816, values, cache), getValue(36003, values, cache), getValue(36004, values, cache)),\n stencilOpFront: (gl, values, cache) => gl.stencilOpSeparate(1028, getValue(2964, values, cache), getValue(2965, values, cache), getValue(2966, values, cache)),\n stencilOpBack: (gl, values, cache) => gl.stencilOpSeparate(1029, getValue(34817, values, cache), getValue(34818, values, cache), getValue(34819, values, cache))\n};\n// Setter functions intercepted for cache updates\nexport const GL_HOOKED_SETTERS = {\n // GENERIC SETTERS\n enable: (update, capability) => update({\n [capability]: true\n }),\n disable: (update, capability) => update({\n [capability]: false\n }),\n pixelStorei: (update, pname, value) => update({\n [pname]: value\n }),\n hint: (update, pname, hint) => update({\n [pname]: hint\n }),\n // SPECIFIC SETTERS\n useProgram: (update, value) => update({\n [35725]: value\n }),\n bindRenderbuffer: (update, target, value) => update({\n [36007]: value\n }),\n bindTransformFeedback: (update, target, value) => update({\n [36389]: value\n }),\n bindVertexArray: (update, value) => update({\n [34229]: value\n }),\n bindFramebuffer: (update, target, framebuffer) => {\n switch (target) {\n case 36160:\n return update({\n [36006]: framebuffer,\n [36010]: framebuffer\n });\n case 36009:\n return update({ [36006]: framebuffer });\n case 36008:\n return update({ [36010]: framebuffer });\n default:\n return null;\n }\n },\n bindBuffer: (update, target, buffer) => {\n const pname = {\n [34962]: [34964],\n [36662]: [36662],\n [36663]: [36663],\n [35051]: [35053],\n [35052]: [35055]\n }[target];\n if (pname) {\n return update({ [pname]: buffer });\n }\n // targets that should not be cached\n return { valueChanged: true };\n },\n blendColor: (update, r, g, b, a) => update({\n [32773]: new Float32Array([r, g, b, a])\n }),\n blendEquation: (update, mode) => update({\n [32777]: mode,\n [34877]: mode\n }),\n blendEquationSeparate: (update, modeRGB, modeAlpha) => update({\n [32777]: modeRGB,\n [34877]: modeAlpha\n }),\n blendFunc: (update, src, dst) => update({\n [32969]: src,\n [32968]: dst,\n [32971]: src,\n [32970]: dst\n }),\n blendFuncSeparate: (update, srcRGB, dstRGB, srcAlpha, dstAlpha) => update({\n [32969]: srcRGB,\n [32968]: dstRGB,\n [32971]: srcAlpha,\n [32970]: dstAlpha\n }),\n clearColor: (update, r, g, b, a) => update({\n [3106]: new Float32Array([r, g, b, a])\n }),\n clearDepth: (update, depth) => update({\n [2931]: depth\n }),\n clearStencil: (update, s) => update({\n [2961]: s\n }),\n colorMask: (update, r, g, b, a) => update({\n [3107]: [r, g, b, a]\n }),\n cullFace: (update, mode) => update({\n [2885]: mode\n }),\n depthFunc: (update, func) => update({\n [2932]: func\n }),\n depthRange: (update, zNear, zFar) => update({\n [2928]: new Float32Array([zNear, zFar])\n }),\n depthMask: (update, mask) => update({\n [2930]: mask\n }),\n frontFace: (update, face) => update({\n [2886]: face\n }),\n lineWidth: (update, width) => update({\n [2849]: width\n }),\n polygonOffset: (update, factor, units) => update({\n [32824]: factor,\n [10752]: units\n }),\n sampleCoverage: (update, value, invert) => update({\n [32938]: value,\n [32939]: invert\n }),\n scissor: (update, x, y, width, height) => update({\n [3088]: new Int32Array([x, y, width, height])\n }),\n stencilMask: (update, mask) => update({\n [2968]: mask,\n [36005]: mask\n }),\n stencilMaskSeparate: (update, face, mask) => update({\n [face === 1028 ? 2968 : 36005]: mask\n }),\n stencilFunc: (update, func, ref, mask) => update({\n [2962]: func,\n [2967]: ref,\n [2963]: mask,\n [34816]: func,\n [36003]: ref,\n [36004]: mask\n }),\n stencilFuncSeparate: (update, face, func, ref, mask) => update({\n [face === 1028 ? 2962 : 34816]: func,\n [face === 1028 ? 2967 : 36003]: ref,\n [face === 1028 ? 2963 : 36004]: mask\n }),\n stencilOp: (update, fail, zfail, zpass) => update({\n [2964]: fail,\n [2965]: zfail,\n [2966]: zpass,\n [34817]: fail,\n [34818]: zfail,\n [34819]: zpass\n }),\n stencilOpSeparate: (update, face, fail, zfail, zpass) => update({\n [face === 1028 ? 2964 : 34817]: fail,\n [face === 1028 ? 2965 : 34818]: zfail,\n [face === 1028 ? 2966 : 34819]: zpass\n }),\n viewport: (update, x, y, width, height) => update({\n [2978]: [x, y, width, height]\n })\n};\n// GETTER TABLE - FOR READING OUT AN ENTIRE CONTEXT\nconst isEnabled = (gl, key) => gl.isEnabled(key);\n// Exceptions for any keys that cannot be queried by gl.getParameters\nexport const GL_PARAMETER_GETTERS = {\n [3042]: isEnabled,\n [2884]: isEnabled,\n [2929]: isEnabled,\n [3024]: isEnabled,\n [32823]: isEnabled,\n [32926]: isEnabled,\n [32928]: isEnabled,\n [3089]: isEnabled,\n [2960]: isEnabled,\n [35977]: isEnabled\n};\nexport const NON_CACHE_PARAMETERS = new Set([\n 34016,\n 36388,\n 36387,\n 35983,\n 35368,\n 34965,\n 35739,\n 35738,\n 3074,\n 34853,\n 34854,\n 34855,\n 34856,\n 34857,\n 34858,\n 34859,\n 34860,\n 34861,\n 34862,\n 34863,\n 34864,\n 34865,\n 34866,\n 34867,\n 34868,\n 35097,\n 32873,\n 35869,\n 32874,\n 34068\n]);\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { GL_PARAMETER_DEFAULTS, GL_PARAMETER_SETTERS, GL_COMPOSITE_PARAMETER_SETTERS, GL_PARAMETER_GETTERS } from \"./webgl-parameter-tables.js\";\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, parameters) {\n if (isObjectEmpty(parameters)) {\n return;\n }\n const compositeSetters = {};\n // HANDLE PRIMITIVE SETTERS (and make note of any composite setters)\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 }\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 // HANDLE COMPOSITE SETTERS\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 // Add a log for the else case?\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(gl, parameters = GL_PARAMETER_DEFAULTS) {\n // support both arrays of parameters and objects (keys represent parameters)\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 const parameterKeys = Array.isArray(parameters) ? parameters : Object.keys(parameters);\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 * 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) {\n setGLParameters(gl, GL_PARAMETER_DEFAULTS);\n}\n// Helpers\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/** deeply compare two arrays */\nexport function deepArrayEqual(x, y) {\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\nconst DEFAULT_CONTEXT_PROPS = {\n powerPreference: 'high-performance', // After all, most apps are using WebGL for performance reasons\n // eslint-disable-next-line no-console\n onContextLost: () => console.error('WebGL context lost'),\n // eslint-disable-next-line no-console\n onContextRestored: () => console.info('WebGL context restored')\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(canvas, props) {\n props = { ...DEFAULT_CONTEXT_PROPS, ...props };\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 // Create the desired context\n let gl = null;\n // props.failIfMajorPerformanceCaveat = true;\n // We require webgl2 context\n gl ||= canvas.getContext('webgl2', props);\n // Software GPU\n // props.failIfMajorPerformanceCaveat = false;\n // if (!gl && props.webgl1) {\n // gl = canvas.getContext('webgl', props);\n // }\n // TODO are we removing this listener before giving it a chance to fire?\n canvas.removeEventListener('webglcontextcreationerror', onCreateError, false);\n if (!gl) {\n throw new Error(`Failed to create WebGL context: ${errorMessage || 'Unknown error'}`);\n }\n if (props.onContextLost) {\n // Carefully extract and wrap callbacks to prevent addEventListener from rebinding them.\n const { onContextLost } = props;\n canvas.addEventListener('webglcontextlost', (event) => onContextLost(event), false);\n }\n if (props.onContextRestored) {\n // Carefully extract and wrap callbacks to prevent addEventListener from rebinding them.\n const { onContextRestored } = props;\n canvas.addEventListener('webglcontextrestored', (event) => onContextRestored(event), false);\n }\n return gl;\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\nimport { GL } from '@luma.gl/constants';\nimport { getWebGLExtension } from \"../../context/helpers/webgl-extensions.js\";\n/** @returns strings identifying the GPU vendor and driver. */\nexport function getDeviceInfo(gl, extensions) {\n // \"Masked\" info is always available, but don't contain much useful information\n const vendorMasked = gl.getParameter(7936);\n const rendererMasked = gl.getParameter(7937);\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 : 7936);\n const rendererUnmasked = gl.getParameter(ext ? ext.UNMASKED_RENDERER_WEBGL : 7937);\n const vendor = vendorUnmasked || vendorMasked;\n const renderer = rendererUnmasked || rendererMasked;\n // Driver version\n const version = gl.getParameter(7938);\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 // 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 return {\n type: 'webgl',\n gpu,\n gpuType,\n gpuBackend,\n vendor,\n renderer,\n version,\n shadingLanguage,\n shadingLanguageVersion\n };\n}\n/** \"Sniff\" the GPU type from the info. This works best if unmasked info is available. */\nfunction identifyGPUVendor(vendor, renderer) {\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 (/AMD/i.exec(vendor) ||\n /AMD/i.exec(renderer) ||\n /ATI/i.exec(vendor) ||\n /ATI/i.exec(renderer)) {\n return 'amd';\n }\n if (/SwiftShader/i.exec(vendor) || /SwiftShader/i.exec(renderer)) {\n return 'software';\n }\n return 'unknown';\n}\n/** \"Sniff\" the GPU backend from the info. This works best if unmasked info is available. */\nfunction identifyGPUBackend(vendor, renderer) {\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}\nfunction identifyGPUType(vendor, renderer) {\n if (/SwiftShader/i.exec(vendor) || /SwiftShader/i.exec(renderer)) {\n return 'cpu';\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/** Ensure extensions are only requested once */\nexport function getWebGLExtension(gl, name, extensions) {\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// Feature detection for WebGL\n// Provides a function that enables simple checking of which WebGL features are\nimport { DeviceFeatures } from '@luma.gl/core';\nimport { getWebGLExtension } from \"../../context/helpers/webgl-extensions.js\";\nimport { isTextureFeature, checkTextureFeature } from \"../converters/texture-formats.js\";\nimport { TEXTURE_FEATURES } from \"../converters/texture-formats.js\";\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 = {\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 // 'depth24unorm-stencil8' // GPUTextureFormat 'depth24unorm-stencil8'\n // 'depth32float-stencil8' // GPUTextureFormat 'depth32float-stencil8'\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 // Textures are handled by getTextureFeatures()\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 gl;\n extensions;\n testedFeatures = new Set();\n constructor(gl, extensions, disabledFeatures) {\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 *[Symbol.iterator]() {\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 has(feature) {\n if (this.disabledFeatures[feature]) {\n return false;\n }\n // We have already tested this feature\n if (!this.testedFeatures.has(feature)) {\n this.testedFeatures.add(feature);\n // Check the feature once\n if (isTextureFeature(feature) && checkTextureFeature(this.gl, feature, this.extensions)) {\n this.features.add(feature);\n }\n if (this.getWebGLFeature(feature)) {\n this.features.add(feature);\n }\n }\n return this.features.has(feature);\n }\n // FOR DEVICE\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 // IMPLEMENTATION\n getFeatures() {\n return [...Object.keys(WEBGL_FEATURES), ...Object.keys(TEXTURE_FEATURES)];\n }\n /** Extract all WebGL features */\n getWebGLFeature(feature) {\n const featureInfo = WEBGL_FEATURES[feature];\n // string value requires checking the corresponding WebGL extension\n const isSupported = typeof featureInfo === 'string'\n ? Boolean(getWebGLExtension(this.gl, featureInfo, this.extensions))\n : Boolean(featureInfo);\n return isSupported;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { decodeTextureFormat } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\nimport { getWebGLExtension } from \"../../context/helpers/webgl-extensions.js\";\nimport { getGLFromVertexType } from \"./vertex-formats.js\";\n/* eslint-disable camelcase */\n// TEXTURE FEATURES\n// Define local device feature strings to optimize minification\nconst texture_compression_bc = 'texture-compression-bc';\nconst texture_compression_astc = 'texture-compression-astc';\nconst texture_compression_etc2 = 'texture-compression-etc2';\nconst texture_compression_etc1_webgl = 'texture-compression-etc1-webgl';\nconst texture_compression_pvrtc_webgl = 'texture-compression-pvrtc-webgl';\nconst texture_compression_atc_webgl = 'texture-compression-atc-webgl';\nconst float32_renderable = 'float32-renderable-webgl';\nconst float16_renderable = 'float16-renderable-webgl';\nconst rgb9e5ufloat_renderable = 'rgb9e5ufloat_renderable-webgl';\nconst snorm8_renderable = 'snorm8-renderable-webgl';\nconst norm16_renderable = 'norm16-renderable-webgl';\nconst snorm16_renderable = 'snorm16-renderable-webgl';\nconst float32_filterable = 'float32-filterable';\nconst float16_filterable = 'float16-filterable-webgl';\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// 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// prettier-ignore\nexport const TEXTURE_FEATURES = {\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 '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 'texture-blend-float-webgl': ['EXT_float_blend'],\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/** Return a list of texture feature strings (for Device.features). Mainly compressed texture support */\n// export function getTextureFeatures(\n// gl: WebGL2RenderingContext,\n// extensions: GLExtensions\n// ): DeviceFeature[] {\n// const textureFeatures = Object.keys(TEXTURE_FEATURES) as DeviceFeature[];\n// return textureFeatures.filter(feature => checkTextureFeature(gl, feature, extensions));\n// }\nexport function isTextureFeature(feature) {\n return feature in TEXTURE_FEATURES;\n}\n/** Checks a texture feature (for Device.features). Mainly compressed texture support */\nexport function checkTextureFeature(gl, feature, extensions) {\n const textureExtensions = TEXTURE_FEATURES[feature] || [];\n return textureExtensions.every(extension => getWebGLExtension(gl, extension, extensions));\n}\n// TABLES\n/**\n * Texture format data -\n * Exported but can change without notice\n */\n// prettier-ignore\nexport const TEXTURE_FORMATS = {\n // Unsized formats that leave the precision up to the driver. TODO - Fix bpp constants\n 'rgb8unorm-unsized': { gl: 6407, b: 4, c: 2, bpp: 4,\n dataFormat: 6407, types: [5121, 33635] },\n 'rgba8unorm-unsized': { gl: 6408, b: 4, c: 2, bpp: 4,\n dataFormat: 6408, types: [5121, 32819, 32820] },\n // 'r8unorm-unsized': {gl: GL.LUMINANCE, b: 4, c: 2, bpp: 4},\n // 'rgb8unorm-srgb-unsized': {gl: GL.SRGB_EXT, b: 4, c: 2, bpp: 4, gl1Ext: SRGB},\n // 'rgba8unorm-srgb-unsized': {gl: GL.SRGB_ALPHA_EXT, b: 4, c: 2, bpp: 4, gl1Ext: SRGB},\n // 8-bit formats\n 'r8unorm': { gl: 33321, b: 1, c: 1, rb: true },\n 'r8snorm': { gl: 36756, b: 1, c: 1, render: snorm8_renderable },\n 'r8uint': { gl: 33330, b: 1, c: 1, rb: true },\n 'r8sint': { gl: 33329, b: 1, c: 1, rb: true },\n // 16-bit formats\n 'rg8unorm': { gl: 33323, b: 2, c: 2, rb: true },\n 'rg8snorm': { gl: 36757, b: 2, c: 2, render: snorm8_renderable },\n 'rg8uint': { gl: 33336, b: 2, c: 2, rb: true },\n 'rg8sint': { gl: 33335, b: 2, c: 2, rb: true },\n 'r16uint': { gl: 33332, b: 2, c: 1, rb: true },\n 'r16sint': { gl: 33331, b: 2, c: 1, rb: true },\n 'r16float': { gl: 33325, b: 2, c: 1, render: float16_renderable, filter: 'float16-filterable-webgl', rb: true },\n 'r16unorm-webgl': { gl: 33322, b: 2, c: 1, f: norm16_renderable, rb: true },\n 'r16snorm-webgl': { gl: 36760, b: 2, c: 1, f: snorm16_renderable },\n // Packed 16-bit formats\n 'rgba4unorm-webgl': { gl: 32854, b: 2, c: 4, wgpu: false, rb: true },\n 'rgb565unorm-webgl': { gl: 36194, b: 2, c: 4, wgpu: false, rb: true },\n 'rgb5a1unorm-webgl': { gl: 32855, b: 2, c: 4, wgpu: false, rb: true },\n // 24-bit formats\n 'rgb8unorm-webgl': { gl: 32849, b: 3, c: 3, wgpu: false },\n 'rgb8snorm-webgl': { gl: 36758, b: 3, c: 3, wgpu: false },\n // 32-bit formats \n 'rgba8unorm': { gl: 32856, b: 4, c: 2, bpp: 4 },\n 'rgba8unorm-srgb': { gl: 35907, b: 4, c: 4, bpp: 4 },\n 'rgba8snorm': { gl: 36759, b: 4, c: 4, render: snorm8_renderable },\n 'rgba8uint': { gl: 36220, b: 4, c: 4, bpp: 4 },\n 'rgba8sint': { gl: 36238, b: 4, c: 4, bpp: 4 },\n // reverse colors, webgpu only\n 'bgra8unorm': { b: 4, c: 4 },\n 'bgra8unorm-srgb': { b: 4, c: 4 },\n 'rg16uint': { gl: 33338, b: 4, c: 1, bpp: 4 },\n 'rg16sint': { gl: 33337, b: 4, c: 2, bpp: 4 },\n // When using a WebGL 2 context and the EXT_color_buffer_float WebGL2 extension\n 'rg16float': { gl: 33327, bpp: 4, b: 4, c: 2, render: float16_renderable, filter: float16_filterable, rb: true },\n 'rg16unorm-webgl': { gl: 33324, b: 2, c: 2, render: norm16_renderable },\n 'rg16snorm-webgl': { gl: 36761, b: 2, c: 2, render: snorm16_renderable },\n 'r32uint': { gl: 33334, b: 4, c: 1, bpp: 4, rb: true },\n 'r32sint': { gl: 33333, b: 4, c: 1, bpp: 4, rb: true },\n 'r32float': { gl: 33326, bpp: 4, b: 4, c: 1, render: float32_renderable, filter: float32_filterable },\n // Packed 32-bit formats\n 'rgb9e5ufloat': { gl: 35901, b: 4, c: 3, p: 1, render: rgb9e5ufloat_renderable }, // , filter: true},\n 'rg11b10ufloat': { gl: 35898, b: 4, c: 3, p: 1, render: float32_renderable, rb: true },\n 'rgb10a2unorm': { gl: 32857, b: 4, c: 4, p: 1, rb: true },\n 'rgb10a2uint-webgl': { b: 4, c: 4, gl: 36975, p: 1, wgpu: false, bpp: 4, rb: true },\n // 48-bit formats\n 'rgb16unorm-webgl': { gl: 32852, b: 2, c: 3, f: norm16_renderable }, // rgb not renderable\n 'rgb16snorm-webgl': { gl: 36762, b: 2, c: 3, f: norm16_renderable }, // rgb not renderable\n // 64-bit formats\n 'rg32uint': { gl: 33340, b: 8, c: 2, rb: true },\n 'rg32sint': { gl: 33339, b: 8, c: 2, rb: true },\n 'rg32float': { gl: 33328, b: 8, c: 2, render: float32_renderable, filter: float32_filterable, rb: true },\n 'rgba16uint': { gl: 36214, b: 8, c: 4, rb: true },\n 'rgba16sint': { gl: 36232, b: 8, c: 4, rb: true },\n 'rgba16float': { gl: 34842, b: 8, c: 4, render: float16_renderable, filter: float16_filterable },\n 'rgba16unorm-webgl': { gl: 32859, b: 2, c: 4, render: norm16_renderable, rb: true },\n 'rgba16snorm-webgl': { gl: 36763, b: 2, c: 4, render: snorm16_renderable },\n // 96-bit formats (deprecated!)\n 'rgb32float-webgl': { gl: 34837, render: float32_renderable, filter: float32_filterable,\n gl2ext: EXT_color_buffer_float, dataFormat: 6407, types: [5126] },\n // 128-bit formats\n 'rgba32uint': { gl: 36208, b: 16, c: 4, rb: true },\n 'rgba32sint': { gl: 36226, b: 16, c: 4, rb: true },\n 'rgba32float': { gl: 34836, b: 16, c: 4, render: float32_renderable, filter: float32_filterable, rb: true },\n // Depth and stencil formats\n 'stencil8': { gl: 36168, b: 1, c: 1, attachment: 36128, rb: true }, // 8 stencil bits\n 'depth16unorm': { gl: 33189, b: 2, c: 1, attachment: 36096,\n dataFormat: 6402, types: [5123], rb: true }, // 16 depth bits\n 'depth24plus': { gl: 33190, b: 3, c: 1, attachment: 36096,\n dataFormat: 6402, types: [5125] },\n 'depth32float': { gl: 36012, b: 4, c: 1, attachment: 36096,\n dataFormat: 6402, types: [5126], rb: true },\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: 35056, b: 4, c: 2, p: 1, attachment: 33306, rb: true, depthTexture: true,\n dataFormat: 34041, types: [34042] },\n // \"depth24unorm-stencil8\" feature\n 'depth24unorm-stencil8': { gl: 35056, b: 4, c: 2, p: 1, attachment: 33306,\n dataFormat: 34041, types: [34042], rb: true },\n // \"depth32float-stencil8\" feature - TODO below is render buffer only?\n 'depth32float-stencil8': { gl: 36013, b: 5, c: 2, p: 1, attachment: 33306,\n dataFormat: 34041, types: [36269], rb: true },\n // BC compressed formats: check device.features.has(\"texture-compression-bc\");\n 'bc1-rgb-unorm-webgl': { gl: 33776, x: X_S3TC, f: texture_compression_bc },\n 'bc1-rgb-unorm-srgb-webgl': { gl: 35916, x: X_S3TC_SRGB, f: texture_compression_bc },\n 'bc1-rgba-unorm': { gl: 33777, x: X_S3TC, f: texture_compression_bc },\n 'bc1-rgba-unorm-srgb': { gl: 35916, x: X_S3TC_SRGB, f: texture_compression_bc },\n 'bc2-rgba-unorm': { gl: 33778, x: X_S3TC, f: texture_compression_bc },\n 'bc2-rgba-unorm-srgb': { gl: 35918, x: X_S3TC_SRGB, f: texture_compression_bc },\n 'bc3-rgba-unorm': { gl: 33779, x: X_S3TC, f: texture_compression_bc },\n 'bc3-rgba-unorm-srgb': { gl: 35919, x: X_S3TC_SRGB, f: texture_compression_bc },\n 'bc4-r-unorm': { gl: 36283, x: X_RGTC, f: texture_compression_bc },\n 'bc4-r-snorm': { gl: 36284, x: X_RGTC, f: texture_compression_bc },\n 'bc5-rg-unorm': { gl: 36285, x: X_RGTC, f: texture_compression_bc },\n 'bc5-rg-snorm': { gl: 36286, x: X_RGTC, f: texture_compression_bc },\n 'bc6h-rgb-ufloat': { gl: 36495, x: X_BPTC, f: texture_compression_bc },\n 'bc6h-rgb-float': { gl: 36494, x: X_BPTC, f: texture_compression_bc },\n 'bc7-rgba-unorm': { gl: 36492, x: X_BPTC, f: texture_compression_bc },\n 'bc7-rgba-unorm-srgb': { gl: 36493, x: X_BPTC, f: texture_compression_bc },\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 'etc2-rgb8unorm': { gl: 37492, f: texture_compression_etc2 },\n 'etc2-rgb8unorm-srgb': { gl: 37494, f: texture_compression_etc2 },\n 'etc2-rgb8a1unorm': { gl: 37496, f: texture_compression_etc2 },\n 'etc2-rgb8a1unorm-srgb': { gl: 37497, f: texture_compression_etc2 },\n 'etc2-rgba8unorm': { gl: 37493, f: texture_compression_etc2 },\n 'etc2-rgba8unorm-srgb': { gl: 37495, f: texture_compression_etc2 },\n 'eac-r11unorm': { gl: 37488, f: texture_compression_etc2 },\n 'eac-r11snorm': { gl: 37489, f: texture_compression_etc2 },\n 'eac-rg11unorm': { gl: 37490, f: texture_compression_etc2 },\n 'eac-rg11snorm': { gl: 37491, f: texture_compression_etc2 },\n // X_ASTC compressed formats: device.features.has(\"texture-compression-astc\")\n 'astc-4x4-unorm': { gl: 37808, f: texture_compression_astc },\n 'astc-4x4-unorm-srgb': { gl: 37840, f: texture_compression_astc },\n 'astc-5x4-unorm': { gl: 37809, f: texture_compression_astc },\n 'astc-5x4-unorm-srgb': { gl: 37841, f: texture_compression_astc },\n 'astc-5x5-unorm': { gl: 37810, f: texture_compression_astc },\n 'astc-5x5-unorm-srgb': { gl: 37842, f: texture_compression_astc },\n 'astc-6x5-unorm': { gl: 37811, f: texture_compression_astc },\n 'astc-6x5-unorm-srgb': { gl: 37843, f: texture_compression_astc },\n 'astc-6x6-unorm': { gl: 37812, f: texture_compression_astc },\n 'astc-6x6-unorm-srgb': { gl: 37844, f: texture_compression_astc },\n 'astc-8x5-unorm': { gl: 37813, f: texture_compression_astc },\n 'astc-8x5-unorm-srgb': { gl: 37845, f: texture_compression_astc },\n 'astc-8x6-unorm': { gl: 37814, f: texture_compression_astc },\n 'astc-8x6-unorm-srgb': { gl: 37846, f: texture_compression_astc },\n 'astc-8x8-unorm': { gl: 37815, f: texture_compression_astc },\n 'astc-8x8-unorm-srgb': { gl: 37847, f: texture_compression_astc },\n 'astc-10x5-unorm': { gl: 37819, f: texture_compression_astc },\n 'astc-10x5-unorm-srgb': { gl: 37851, f: texture_compression_astc },\n 'astc-10x6-unorm': { gl: 37817, f: texture_compression_astc },\n 'astc-10x6-unorm-srgb': { gl: 37849, f: texture_compression_astc },\n 'astc-10x8-unorm': { gl: 37818, f: texture_compression_astc },\n 'astc-10x8-unorm-srgb': { gl: 37850, f: texture_compression_astc },\n 'astc-10x10-unorm': { gl: 37819, f: texture_compression_astc },\n 'astc-10x10-unorm-srgb': { gl: 37851, f: texture_compression_astc },\n 'astc-12x10-unorm': { gl: 37820, f: texture_compression_astc },\n 'astc-12x10-unorm-srgb': { gl: 37852, f: texture_compression_astc },\n 'astc-12x12-unorm': { gl: 37821, f: texture_compression_astc },\n 'astc-12x12-unorm-srgb': { gl: 37853, f: texture_compression_astc },\n // WEBGL_compressed_texture_pvrtc\n 'pvrtc-rgb4unorm-webgl': { gl: 35840, f: texture_compression_pvrtc_webgl },\n 'pvrtc-rgba4unorm-webgl': { gl: 35842, f: texture_compression_pvrtc_webgl },\n 'pvrtc-rbg2unorm-webgl': { gl: 35841, f: texture_compression_pvrtc_webgl },\n 'pvrtc-rgba2unorm-webgl': { gl: 35843, f: texture_compression_pvrtc_webgl },\n // WEBGL_compressed_texture_etc1\n 'etc1-rbg-unorm-webgl': { gl: 36196, f: texture_compression_etc1_webgl },\n // WEBGL_compressed_texture_atc\n 'atc-rgb-unorm-webgl': { gl: 35986, f: texture_compression_atc_webgl },\n 'atc-rgba-unorm-webgl': { gl: 35986, f: texture_compression_atc_webgl },\n 'atc-rgbai-unorm-webgl': { gl: 34798, f: texture_compression_atc_webgl }\n};\n/** Legal combinations for internalFormat, format and type *\n// [GL.DEPTH_COMPONENT]: {types: [GL.UNSIGNED_SHORT, GL.UNSIGNED_INT, GL.UNSIGNED_INT_24_8]},\n// [GL.DEPTH_STENCIL]: ,\n// Sized texture format\n// R\n[GL.R8]: {dataFormat: GL.RED, types: [GL.UNSIGNED_BYTE], gl2: true},\n[GL.R16F]: {dataFormat: GL.RED, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true},\n[GL.R8UI]: {dataFormat: GL.RED_INTEGER, types: [GL.UNSIGNED_BYTE], gl2: true},\n// // RG\n[GL.RG8]: {dataFormat: GL.RG, types: [GL.UNSIGNED_BYTE], gl2: true},\n[GL.RG16F]: {dataFormat: GL.RG, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true},\n[GL.RG8UI]: {dataFormat: GL.RG_INTEGER, types: [GL.UNSIGNED_BYTE], gl2: true},\n// // RGB\n[GL.RGB8]: {dataFormat: GL.RGB, types: [GL.UNSIGNED_BYTE], gl2: true},\n[GL.SRGB8]: {dataFormat: GL.RGB, types: [GL.UNSIGNED_BYTE], gl2: true},\n[GL.RGB16F]: {dataFormat: GL.RGB, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true},\n[GL.RGB8UI]: {dataFormat: GL.RGB_INTEGER, types: [GL.UNSIGNED_BYTE], gl2: true},\n// // RGBA\n\n[GL.RGB565]: {dataFormat: GL.RGB, types: [GL.UNSIGNED_BYTE, GL.UNSIGNED_SHORT_5_6_5], gl2: true},\n[GL.R11F_G11F_B10F]: {dataFormat: GL.RGB, types: [GL.UNSIGNED_INT_10F_11F_11F_REV, GL.HALF_FLOAT, GL.FLOAT], gl2: true},\n[GL.RGB9_E5]: {dataFormat: GL.RGB, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true},\n[GL.RGBA8]: {dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE], gl2: true},\n[GL.SRGB8_ALPHA8]: {dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE], gl2: true, gl1ext: EXT_SRGB},\n[GL.RGB5_A1]: {dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE, GL.UNSIGNED_SHORT_5_5_5_1], gl2: true},\n[GL.RGBA4]: {dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE, GL.UNSIGNED_SHORT_4_4_4_4], gl2: true},\n[GL.RGBA16F]: {dataFormat: GL.RGBA, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true},\n[GL.RGBA8UI]: {dataFormat: GL.RGBA_INTEGER, types: [GL.UNSIGNED_BYTE], gl2: true}\n*/\n/* This table is now baked into the above table\ntype RenderbufferFormat = {\n bpp: number;\n gl2?: boolean;\n ext?: string;\n};\n\nexport const RENDERBUFFER_FORMATS: Record<string, RenderbufferFormat> = {\n [GL.DEPTH_COMPONENT16]: {bpp: 2}, // 16 depth bits.\n // TODO - Not clear which webgpu value to map this to.\n // [GL.DEPTH_COMPONENT24]: {gl2: true, bpp: 3},\n [GL.DEPTH_COMPONENT32F]: {gl2: true, bpp: 4},\n\n [GL.STENCIL_INDEX8]: {bpp: 1}, // 8 stencil bits.\n\n [GL.DEPTH_STENCIL]: {bpp: 4},\n [GL.DEPTH24_STENCIL8]: {gl2: true, bpp: 4},\n [GL.DEPTH32F_STENCIL8]: {gl2: true, bpp: 5},\n\n // When using a WebGL 1 context, color renderbuffer formats are limited\n [GL.RGBA4]: {gl2: true, bpp: 2},\n [GL.RGB565]: {gl2: true, bpp: 2},\n [GL.RGB5_A1]: {gl2: true, bpp: 2},\n\n // When using a WebGL 2 context, the following values are available additionally:\n [GL.R8]: {gl2: true, bpp: 1},\n [GL.R8UI]: {gl2: true, bpp: 1},\n [GL.R8I]: {gl2: true, bpp: 1},\n [GL.R16UI]: {gl2: true, bpp: 2},\n [GL.R16I]: {gl2: true, bpp: 2},\n [GL.R32UI]: {gl2: true, bpp: 4},\n [GL.R32I]: {gl2: true, bpp: 4},\n [GL.RG8]: {gl2: true, bpp: 2},\n [GL.RG8UI]: {gl2: true, bpp: 2},\n [GL.RG8I]: {gl2: true, bpp: 2},\n [GL.RG16UI]: {gl2: true, bpp: 4},\n [GL.RG16I]: {gl2: true, bpp: 4},\n [GL.RG32UI]: {gl2: true, bpp: 8},\n [GL.RG32I]: {gl2: true, bpp: 8},\n [GL.RGB8]: {gl2: true, bpp: 3},\n [GL.RGBA8]: {gl2: true, bpp: 4},\n // [GL.SRGB8_ALPHA8]: {gl2: true, gl1: SRGB}, // When using the EXT_sRGB WebGL1 extension\n [GL.RGB10_A2]: {gl2: true, bpp: 4},\n [GL.RGBA8UI]: {gl2: true, bpp: 4},\n [GL.RGBA8I]: {gl2: true, bpp: 4},\n [GL.RGB10_A2UI]: {gl2: true, bpp: 4},\n [GL.RGBA16UI]: {gl2: true, bpp: 8},\n [GL.RGBA16I]: {gl2: true, bpp: 8},\n [GL.RGBA32I]: {gl2: true, bpp: 16},\n [GL.RGBA32UI]: {gl2: true, bpp: 16},\n\n // When using a WebGL 2 context and the EXT_color_buffer_float WebGL2 extension\n [GL.R16F]: {ext: EXT_FLOAT_WEBGL2, bpp: 2},\n [GL.RG16F]: {ext: EXT_FLOAT_WEBGL2, bpp: 4},\n [GL.RGBA16F]: {ext: EXT_FLOAT_WEBGL2, bpp: 8},\n [GL.R32F]: {ext: EXT_FLOAT_WEBGL2, bpp: 4},\n [GL.RG32F]: {ext: EXT_FLOAT_WEBGL2, bpp: 8},\n // TODO - can't get WEBGL_color_buffer_float to work on renderbuffers\n [GL.RGBA32F]: {ext: EXT_FLOAT_WEBGL2, bpp: 16},\n // [GL.RGBA32F]: {ext: EXT_FLOAT_WEBGL2},\n [GL.R11F_G11F_B10F]: {ext: EXT_FLOAT_WEBGL2, bpp: 4}\n};\n*/\n/** @deprecated should be removed */\nconst DATA_FORMAT_CHANNELS = {\n [6403]: 1,\n [36244]: 1,\n [33319]: 2,\n [33320]: 2,\n [6407]: 3,\n [36248]: 3,\n [6408]: 4,\n [36249]: 4,\n [6402]: 1,\n [34041]: 1,\n [6406]: 1,\n [6409]: 1,\n [6410]: 2\n};\n/** @deprecated should be removed */\nconst TYPE_SIZES = {\n [5126]: 4,\n [5125]: 4,\n [5124]: 4,\n [5123]: 2,\n [5122]: 2,\n [5131]: 2,\n [5120]: 1,\n [5121]: 1\n};\n// FUNCTIONS\n/** Checks if a texture format is supported */\nexport function isTextureFormatSupported(gl, format, extensions) {\n const info = TEXTURE_FORMATS[format];\n if (!info) {\n return false;\n }\n // Check that we have a GL constant\n if (info.gl === undefined) {\n return false;\n }\n // Check extensions\n const extension = info.x || info.gl2ext;\n if (extension) {\n return Boolean(getWebGLExtension(gl, extension, extensions));\n }\n return true;\n}\nexport function isRenderbufferFormatSupported(gl, format, extensions) {\n // Note: Order is important since the function call initializes extensions.\n return isTextureFormatSupported(gl, format, extensions) && TEXTURE_FORMATS[format]?.rb;\n}\n/**\n * Map WebGL texture formats (GL constants) to WebGPU-style TextureFormat strings\n */\nexport function convertGLToTextureFormat(format) {\n if (typeof format === 'string') {\n return format;\n }\n const entry = Object.entries(TEXTURE_FORMATS).find(([, entry]) => entry.gl === format);\n if (!entry) {\n throw new Error(`Unknown texture format ${format}`);\n }\n return entry[0];\n}\n/**\n * Map WebGPU style texture format strings to GL constants\n */\nexport function convertTextureFormatToGL(format) {\n const formatInfo = 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/** Checks if a texture format is supported */\nexport function getTextureFormatSupport(gl, format, extensions) {\n const info = TEXTURE_FORMATS[format];\n if (!info) {\n return { supported: false };\n }\n // let decoded;\n // try {\n // decoded = decodeTextureFormat(format);\n // } catch {}\n // Support Check that we have a GL constant\n let supported = info.gl === undefined;\n supported = supported && checkTextureFeature(gl, info.f, extensions);\n // Filtering\n // const filterable = info.filter\n // ? checkTextureFeature(gl, infofilter])\n // : decoded && !decoded.signed;\n // const renderable = info.filter\n // ? checkTextureFeature(gl, inforender])\n // : decoded && !decoded.signed;\n return {\n supported,\n renderable: supported && checkTextureFeature(gl, info.render, extensions),\n filterable: supported && checkTextureFeature(gl, info.filter, extensions),\n blendable: false, // tod,\n storable: false\n };\n}\n/** Checks whether linear filtering (interpolated sampling) is available for floating point textures */\nexport function isTextureFormatFilterable(gl, format, extensions) {\n if (!isTextureFormatSupported(gl, format, extensions)) {\n return false;\n }\n if (format.startsWith('depth') || format.startsWith('stencil')) {\n return false;\n }\n try {\n const decoded = decodeTextureFormat(format);\n if (decoded.signed) {\n return false;\n }\n }\n catch {\n return false;\n }\n if (format.endsWith('32float')) {\n return Boolean(getWebGLExtension(gl, 'OES_texture_float_linear, extensions', extensions));\n }\n if (format.endsWith('16float')) {\n return Boolean(getWebGLExtension(gl, 'OES_texture_half_float_linear, extensions', extensions));\n }\n return true;\n}\nexport function isTextureFormatRenderable(gl, format, extensions) {\n if (!isTextureFormatSupported(gl, format, extensions)) {\n return false;\n }\n if (typeof format === 'number') {\n return false; // isTextureFormatFilterableWebGL(gl, format);\n }\n // TODO depends on device...\n return true;\n}\n/** Get parameters necessary to work with format in WebGL: internalFormat, dataFormat, type, compressed, */\nexport function getWebGLTextureParameters(format) {\n const formatData = TEXTURE_FORMATS[format];\n const webglFormat = convertTextureFormatToGL(format);\n const decoded = decodeTextureFormat(format);\n return {\n format: webglFormat,\n dataFormat: formatData?.dataFormat ||\n getWebGLPixelDataFormat(decoded.format, 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] || 5121,\n // @ts-expect-error\n compressed: decoded.compressed\n };\n}\nexport function getDepthStencilAttachmentWebGL(format) {\n const info = TEXTURE_FORMATS[format];\n if (!info?.attachment) {\n throw new Error(`${format} is not a depth stencil format`);\n }\n return info.attachment;\n}\n/** TODO - VERY roundabout legacy way of calculating bytes per pixel */\nexport function getTextureFormatBytesPerPixel(format) {\n // TODO remove webgl1 support\n const params = getWebGLTextureParameters(format);\n // NOTE(Tarek): Default to RGBA bytes\n const channels = DATA_FORMAT_CHANNELS[params.dataFormat] || 4;\n const channelSize = TYPE_SIZES[params.type] || 1;\n return channels * channelSize;\n}\n// DATA TYPE HELPERS\nfunction getWebGLPixelDataFormat(dataFormat, integer, normalized, format) {\n // WebGL1 formats use same internalFormat\n if (format === 6408 || format === 6407) {\n return format;\n }\n // prettier-ignore\n switch (dataFormat) {\n case 'r': return integer && !normalized ? 36244 : 6403;\n case 'rg': return integer && !normalized ? 33320 : 33319;\n case 'rgb': return integer && !normalized ? 36248 : 6407;\n case 'rgba': return integer && !normalized ? 36249 : 6408;\n default: return 6408;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { GL } from '@luma.gl/constants';\n/** Get vertex format from GL constants */\nexport function getVertexFormatFromGL(type, components) {\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/** Get data type from GL constants */\nexport function getVertexTypeFromGL(type, normalized = false) {\n // prettier-ignore\n switch (type) {\n // WebGPU does not support normalized 32 bit integer attributes\n case 5124: return normalized ? 'sint32' : 'sint32';\n case 5125: return normalized ? 'uint32' : 'uint32';\n case 5122: return normalized ? 'sint16' : 'unorm16';\n case 5123: return normalized ? 'uint16' : 'unorm16';\n case 5120: return normalized ? 'sint8' : 'snorm16';\n case 5121: return normalized ? 'uint8' : 'unorm8';\n case 5126: return 'float32';\n case 5131: return 'float16';\n }\n // @ts-ignore unreachable\n throw new Error(String(type));\n}\nexport function getGLFromVertexType(dataType) {\n // prettier-ignore\n switch (dataType) {\n case 'uint8': return 5121;\n case 'sint8': return 5120;\n case 'unorm8': return 5121;\n case 'snorm8': return 5120;\n case 'uint16': return 5123;\n case 'sint16': return 5122;\n case 'unorm16': return 5123;\n case 'snorm16': return 5122;\n case 'uint32': return 5125;\n case 'sint32': return 5124;\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 5131;\n case 'float32': return 5126;\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\nimport { DeviceLimits } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\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(3379); }\n get maxTextureDimension3D() { return this.getParameter(32883); }\n get maxTextureArrayLayers() { return this.getParameter(35071); }\n get maxBindGroups() { return 0; }\n get maxDynamicUniformBuffersPerPipelineLayout() { return 0; } // TBD\n get maxDynamicStorageBuffersPerPipelineLayout() { return 0; } // TBD\n get maxSampledTexturesPerShaderStage() { return this.getParameter(35660); } // ) TBD\n get maxSamplersPerShaderStage() { return this.getParameter(35661); }\n get maxStorageBuffersPerShaderStage() { return 0; } // TBD\n get maxStorageTexturesPerShaderStage() { return 0; } // TBD\n get maxUniformBuffersPerShaderStage() { return this.getParameter(35375); }\n get maxUniformBufferBindingSize() { return this.getParameter(35376); }\n get maxStorageBufferBindingSize() { return 0; }\n get minUniformBufferOffsetAlignment() { return this.getParameter(35380); }\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(34921); }\n get maxVertexBufferArrayStride() { return 2048; } // TBD, this is just the default value from WebGPU\n get maxInterStageShaderComponents() { return this.getParameter(35659); }\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 // PRIVATE\n gl;\n limits = {};\n constructor(gl) {\n super();\n this.gl = gl;\n }\n getParameter(parameter) {\n if (this.limits[parameter] === undefined) {\n this.limits[parameter] = this.gl.getParameter(parameter);\n }\n return this.limits[parameter];\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CanvasContext } from '@luma.gl/core';\nimport { WEBGLFramebuffer } from \"./resources/webgl-framebuffer.js\";\n/**\n * A WebGL Canvas Context which manages the canvas and handles drawing buffer resizing etc\n */\nexport class WebGLCanvasContext extends CanvasContext {\n device;\n presentationSize;\n _framebuffer = null;\n constructor(device, props) {\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 getCurrentFramebuffer() {\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 /** Resizes and updates render targets if necessary */\n update() {\n const size = this.getPixelSize();\n const sizeChanged = size[0] !== this.presentationSize[0] || size[1] !== this.presentationSize[1];\n if (sizeChanged) {\n this.presentationSize = size;\n this.resize();\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) {\n if (!this.device.gl)\n return;\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 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\nimport { Framebuffer, assert } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\nimport { WEBGLTexture } from \"./webgl-texture.js\";\nimport { WEBGLTextureView } from \"./webgl-texture-view.js\";\nimport { getDepthStencilAttachmentWebGL } from \"../converters/texture-formats.js\";\n/** luma.gl Framebuffer, WebGL implementation */\nexport class WEBGLFramebuffer extends Framebuffer {\n device;\n gl;\n handle;\n get texture() {\n return this.colorAttachments[0];\n }\n constructor(device, props) {\n super(device, props);\n // WebGL default framebuffer handle is null\n const isDefaultFramebuffer = props.handle === null;\n this.device = device;\n this.gl = device.gl;\n this.handle =\n this.props.handle || isDefaultFramebuffer ? this.props.handle : this.gl.createFramebuffer();\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 // Auto create textures for attachments if needed\n this.autoCreateAttachmentTextures();\n /** Attach from a map of attachments */\n // @ts-expect-error native bindFramebuffer is overridden by our state tracker\n const prevHandle = this.gl.bindFramebuffer(36160, this.handle);\n // Walk the attachments\n for (let i = 0; i < this.colorAttachments.length; ++i) {\n const attachment = this.colorAttachments[i];\n const attachmentPoint = 36064 + i;\n if (attachment) {\n this._attachOne(attachmentPoint, attachment);\n }\n }\n if (this.depthStencilAttachment) {\n this._attachOne(getDepthStencilAttachmentWebGL(this.depthStencilAttachment.props.format), this.depthStencilAttachment);\n }\n /** Check the status */\n // @ts-expect-error\n if (props.check !== false) {\n const status = this.gl.checkFramebufferStatus(36160);\n if (status !== 36053) {\n throw new Error(`Framebuffer ${_getFrameBufferStatus(status)}`);\n }\n }\n this.gl.bindFramebuffer(36160, prevHandle);\n }\n }\n /** destroys any auto created resources etc. */\n destroy() {\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 // PRIVATE\n /** In WebGL we must use renderbuffers for depth/stencil attachments (unless we have extensions) */\n createDepthStencilTexture(format) {\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 * Attachment resize is expected to be a noop if size is same\n */\n resizeAttachments(width, height) {\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 if (width === undefined) {\n width = this.gl.drawingBufferWidth;\n }\n if (height === undefined) {\n height = this.gl.drawingBufferHeight;\n }\n // TODO Not clear that this is better than default destroy/create implementation\n for (const colorAttachment of this.colorAttachments) {\n colorAttachment.texture.resize({ width, height });\n }\n if (this.depthStencilAttachment) {\n this.depthStencilAttachment.texture.resize({ width, height });\n }\n return this;\n }\n /** Attach one attachment */\n _attachOne(attachmentPoint, attachment) {\n // if (attachment instanceof WEBGLRenderbuffer) {\n // this._attachWEBGLRenderbuffer(attachmentPoint, attachment);\n // return attachment;\n // }\n if (Array.isArray(attachment)) {\n const [texture, layer = 0, level = 0] = attachment;\n this._attachTexture(attachmentPoint, texture, layer, level);\n return texture;\n }\n if (attachment instanceof WEBGLTexture) {\n this._attachTexture(attachmentPoint, attachment, 0, 0);\n return attachment;\n }\n if (attachment instanceof WEBGLTextureView) {\n const textureView = attachment;\n this._attachTexture(attachmentPoint, textureView.texture, textureView.props.baseMipLevel, textureView.props.baseArrayLayer);\n return attachment.texture;\n }\n throw new Error('attach');\n }\n // TODO - we do not seem to need render buffers in WebGL 2\n // protected _attachWEBGLRenderbuffer(attachment: GL, renderbuffer: WEBGLRenderbuffer): void {\n // this.gl.framebufferRenderbuffer(\n // GL.FRAMEBUFFER,\n // attachment,\n // GL.RENDERBUFFER,\n // renderbuffer.handle\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 _attachTexture(attachment, texture, layer, level) {\n const { gl } = this.device;\n gl.bindTexture(texture.target, texture.handle);\n switch (texture.target) {\n case 35866:\n case 32879:\n gl.framebufferTextureLayer(36160, attachment, texture.target, level, layer);\n break;\n case 34067:\n // layer must be a cubemap face (or if index, converted to cube map face)\n const face = mapIndexToCubeMapFace(layer);\n gl.framebufferTexture2D(36160, attachment, face, texture.handle, level);\n break;\n case 3553:\n gl.framebufferTexture2D(36160, attachment, 3553, texture.handle, level);\n break;\n default:\n assert(false, 'Illegal texture type');\n }\n gl.bindTexture(texture.target, null);\n }\n}\n// Helper functions\n// Map an index to a cube map face constant\nfunction mapIndexToCubeMapFace(layer) {\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 < 34069\n ? layer + 34069\n : layer;\n}\n// Helper METHODS\n// Get a string describing the framebuffer error if installed\nfunction _getFrameBufferStatus(status) {\n switch (status) {\n case 36053:\n return 'success';\n case 36054:\n return 'Mismatched attachments';\n case 36055:\n return 'No attachments';\n case 36057:\n return 'Height/width mismatch';\n case 36061:\n return 'Unsupported or split attachments';\n // WebGL2\n case 36182:\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", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { Texture, log, assert, loadImage, isObjectEmpty } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\nimport { withGLParameters } from \"../../context/state-tracker/with-parameters.js\";\nimport { convertTextureFormatToGL, getWebGLTextureParameters, getTextureFormatBytesPerPixel } from \"../converters/texture-formats.js\";\nimport { convertSamplerParametersToWebGL } from \"../converters/sampler-parameters.js\";\nimport { WEBGLBuffer } from \"./webgl-buffer.js\";\nimport { WEBGLSampler } from \"./webgl-sampler.js\";\nimport { WEBGLTextureView } from \"./webgl-texture-view.js\";\nexport const DEFAULT_WEBGL_TEXTURE_PROPS = {\n // deprecated\n parameters: {},\n pixelStore: {},\n pixels: null,\n border: 0,\n dataFormat: undefined,\n textureUnit: undefined,\n target: undefined\n};\n// Polyfill\nexport class WEBGLTexture extends Texture {\n // TODO - remove?\n static FACES = [\n 34069,\n 34070,\n 34071,\n 34072,\n 34073,\n 34074\n ];\n MAX_ATTRIBUTES;\n device;\n gl;\n handle;\n // (TODO - currently unused in WebGL, but WebGL 2 does support sampler objects) */\n sampler = undefined;\n view = undefined;\n // data;\n glFormat = undefined;\n type = undefined;\n dataFormat = undefined;\n mipmaps = undefined;\n /**\n * @note `target` cannot be modified by bind:\n * textures are special because when you first bind them to a target,\n * they get special information. When you first bind a texture as a\n * 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 target;\n textureUnit = undefined;\n /**\n * Program.draw() checks the loaded flag of all textures to avoid\n * Textures that are still loading from promises\n * Set to true as soon as texture has been initialized with valid data\n */\n loaded = false;\n _video;\n constructor(device, props) {\n super(device, { ...DEFAULT_WEBGL_TEXTURE_PROPS, format: 'rgba8unorm', ...props });\n this.device = device;\n this.gl = this.device.gl;\n this.handle = this.props.handle || this.gl.createTexture();\n this.device.setSpectorMetadata(this.handle, { ...this.props, data: typeof this.props.data }); // {name: this.props.id};\n this.glFormat = 6408;\n this.target = getWebGLTextureTarget(this.props);\n // Program.draw() checks the loaded flag of all textures\n this.loaded = false;\n // Signature: new Texture2D(gl, {data: url})\n if (typeof this.props?.data === 'string') {\n Object.assign(this.props, { data: loadImage(this.props.data) });\n }\n this.initialize(this.props);\n Object.seal(this);\n }\n destroy() {\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 toString() {\n return `Texture(${this.id},${this.width}x${this.height})`;\n }\n createView(props) {\n return new WEBGLTextureView(this.device, { ...props, texture: this });\n }\n // eslint-disable-next-line max-statements\n initialize(props = {}) {\n // Cube textures\n if (this.props.dimension === 'cube') {\n return this.initializeCube(props);\n }\n let data = props.data;\n if (data instanceof Promise) {\n data.then(resolvedImageData => this.initialize(Object.assign({}, props, {\n pixels: resolvedImageData,\n data: resolvedImageData\n })));\n return this;\n }\n const isVideo = typeof HTMLVideoElement !== 'undefined' && data instanceof HTMLVideoElement;\n // @ts-expect-error\n if (isVideo && data.readyState < HTMLVideoElement.HAVE_METADATA) {\n this._video = null; // Declare member before the object is sealed\n // @ts-expect-error\n data.addEventListener('loadeddata', () => this.initialize(props));\n return this;\n }\n const { parameters = {} } = props;\n const { pixels = null, pixelStore = {}, textureUnit = undefined, mipmaps = true } = props;\n // pixels variable is for API compatibility purpose\n if (!data) {\n // TODO - This looks backwards? Commenting out for now until we decide\n // which prop to use\n // log.deprecated('data', 'pixels')();\n data = pixels;\n }\n let { width, height, dataFormat, type, compressed = false } = props;\n const { depth = 0 } = props;\n const glFormat = convertTextureFormatToGL(props.format);\n // Deduce width and height\n ({ width, height, compressed, dataFormat, type } = this._deduceParameters({\n format: props.format,\n type,\n dataFormat,\n compressed,\n data,\n width,\n height\n }));\n // Store opts for accessors\n this.width = width;\n this.height = height;\n // this.depth = depth;\n this.glFormat = glFormat;\n this.type = type;\n this.dataFormat = dataFormat;\n this.textureUnit = textureUnit;\n if (Number.isFinite(this.textureUnit)) {\n this.gl.activeTexture(33984 + this.textureUnit);\n this.gl.bindTexture(this.target, this.handle);\n }\n this.mipmaps = mipmaps;\n this.setImageData({\n data,\n width,\n height,\n depth,\n format: glFormat,\n type,\n dataFormat,\n // @ts-expect-error\n parameters: pixelStore,\n compressed\n });\n // Set texture sampler parameters\n this.setSampler(props.sampler);\n this._setSamplerParameters(parameters);\n this.view = this.createView({ ...this.props, mipLevelCount: 1, arrayLayerCount: 1 });\n if (mipmaps && this.device.isTextureFormatFilterable(props.format)) {\n this.generateMipmap();\n }\n if (isVideo) {\n this._video = {\n video: data,\n parameters,\n // @ts-expect-error\n lastTime: data.readyState >= HTMLVideoElement.HAVE_CURRENT_DATA ? data.currentTime : -1\n };\n }\n return this;\n }\n initializeCube(props) {\n const { mipmaps = true, parameters = {} } = props;\n // Store props for accessors\n // this.props = props;\n // @ts-expect-error\n this.setCubeMapImageData(props).then(() => {\n this.loaded = true;\n // TODO - should genMipmap() be called on the cubemap or on the faces?\n // TODO - without generateMipmap() cube textures do not work at all!!! Why?\n if (mipmaps) {\n this.generateMipmap(props);\n }\n this.setSampler(props.sampler);\n this._setSamplerParameters(parameters);\n });\n return this;\n }\n setSampler(sampler = {}) {\n let samplerProps;\n if (sampler instanceof WEBGLSampler) {\n this.sampler = sampler;\n samplerProps = sampler.props;\n }\n else {\n this.sampler = new WEBGLSampler(this.device, sampler);\n samplerProps = sampler;\n }\n const parameters = convertSamplerParametersToWebGL(samplerProps);\n this._setSamplerParameters(parameters);\n return this;\n }\n /**\n * If size has changed, reinitializes with current format\n * @note note clears image and mipmaps\n */\n resize(options) {\n const { height, width, mipmaps = false } = options;\n if (width !== this.width || height !== this.height) {\n return this.initialize({\n width,\n height,\n format: this.format,\n type: this.type,\n dataFormat: this.dataFormat,\n mipmaps\n });\n }\n return this;\n }\n /** Update external texture (video frame) */\n update() {\n if (this._video) {\n const { video, parameters, lastTime } = this._video;\n // @ts-expect-error\n if (lastTime === video.currentTime || video.readyState < HTMLVideoElement.HAVE_CURRENT_DATA) {\n return;\n }\n this.setSubImageData({\n data: video,\n parameters\n });\n if (this.mipmaps) {\n this.generateMipmap();\n }\n this._video.lastTime = video.currentTime;\n }\n }\n // Call to regenerate mipmaps after modifying texture(s)\n generateMipmap(params = {}) {\n this.mipmaps = true;\n this.gl.bindTexture(this.target, this.handle);\n withGLParameters(this.gl, params, () => {\n this.gl.generateMipmap(this.target);\n });\n this.gl.bindTexture(this.target, null);\n return this;\n }\n /*\n * Allocates storage\n * @param {*} pixels -\n * null - create empty texture of specified format\n * Typed array - init from image data in typed array\n * Buffer|WebGLBuffer - (WEBGL2) init from image data in WebGLBuffer\n * HTMLImageElement|Image - Inits with content of image. Auto width/height\n * HTMLCanvasElement - Inits with contents of canvas. Auto width/height\n * HTMLVideoElement - Creates video texture. Auto width/height\n *\n * @param width -\n * @param height -\n * @param mipMapLevel -\n * @param {GLenum} format - format of image data.\n * @param {GLenum} type\n * - format of array (autodetect from type) or\n * - (WEBGL2) format of buffer\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 */\n // eslint-disable-next-line max-statements, complexity\n setImageData(options) {\n if (this.props.dimension === '3d' || this.props.dimension === '2d-array') {\n return this.setImageData3D(options);\n }\n this.trackDeallocatedMemory('Texture');\n const { target = this.target, pixels = null, level = 0, glFormat = this.glFormat, offset = 0, parameters = {} } = options;\n let { data = null, type = this.type, width = this.width, height = this.height, dataFormat = this.dataFormat, compressed = false } = options;\n // pixels variable is for API compatibility purpose\n if (!data) {\n data = pixels;\n }\n ({ type, dataFormat, compressed, width, height } = this._deduceParameters({\n format: this.props.format,\n type,\n dataFormat,\n compressed,\n data,\n width,\n height\n }));\n const { gl } = this;\n gl.bindTexture(this.target, this.handle);\n let dataType = null;\n ({ data, dataType } = this._getDataType({ data, compressed }));\n withGLParameters(this.gl, parameters, () => {\n switch (dataType) {\n case 'null':\n gl.texImage2D(target, level, glFormat, width, height, 0 /* border*/, dataFormat, type, data);\n break;\n case 'typed-array':\n gl.texImage2D(target, level, glFormat, width, height, 0, // border (must be 0)\n dataFormat, type, data, offset);\n break;\n case 'buffer':\n // WebGL2 enables creating textures directly from a WebGL buffer\n this.device.gl.bindBuffer(35052, data.handle || data);\n this.device.gl.texImage2D(target, level, glFormat, width, height, 0 /* border*/, dataFormat, type, offset);\n this.device.gl.bindBuffer(35052, null);\n break;\n case 'browser-object':\n gl.texImage2D(target, level, glFormat, width, height, 0 /* border*/, dataFormat, type, data);\n break;\n case 'compressed':\n for (const [levelIndex, levelData] of data.entries()) {\n gl.compressedTexImage2D(target, levelIndex, levelData.format, levelData.width, levelData.height, 0 /* border, must be 0 */, levelData.data);\n }\n break;\n default:\n assert(false, 'Unknown image data type');\n }\n });\n if (data && data.byteLength) {\n this.trackAllocatedMemory(data.byteLength, 'Texture');\n }\n else {\n const bytesPerPixel = getTextureFormatBytesPerPixel(this.props.format);\n this.trackAllocatedMemory(this.width * this.height * bytesPerPixel, 'Texture');\n }\n this.loaded = true;\n return this;\n }\n /**\n * Redefines an area of an existing texture\n * Note: does not allocate storage\n * Redefines an area of an existing texture\n */\n setSubImageData({ target = this.target, pixels = null, data = null, x = 0, y = 0, width = this.width, height = this.height, level = 0, glFormat = this.glFormat, type = this.type, dataFormat = this.dataFormat, compressed = false, offset = 0, parameters = {} }) {\n ({ type, dataFormat, compressed, width, height } = this._deduceParameters({\n format: this.props.format,\n type,\n dataFormat,\n compressed,\n data,\n width,\n height\n }));\n assert(this.depth === 1, 'texSubImage not supported for 3D textures');\n // pixels variable is for API compatibility purpose\n if (!data) {\n data = pixels;\n }\n // Support ndarrays\n if (data && data.data) {\n const ndarray = data;\n data = ndarray.data;\n width = ndarray.shape[0];\n height = ndarray.shape[1];\n }\n // Support buffers\n if (data instanceof WEBGLBuffer) {\n data = data.handle;\n }\n this.gl.bindTexture(this.target, this.handle);\n withGLParameters(this.gl, parameters, () => {\n // TODO - x,y parameters\n if (compressed) {\n this.gl.compressedTexSubImage2D(target, level, x, y, width, height, glFormat, data);\n }\n else if (data === null) {\n this.gl.texSubImage2D(target, level, x, y, width, height, dataFormat, type, null);\n }\n else if (ArrayBuffer.isView(data)) {\n this.gl.texSubImage2D(target, level, x, y, width, height, dataFormat, type, data, offset);\n }\n else if (typeof WebGLBuffer !== 'undefined' && data instanceof WebGLBuffer) {\n // WebGL2 allows us to create texture directly from a WebGL buffer\n // This texImage2D signature uses currently bound GL.PIXEL_UNPACK_BUFFER\n this.device.gl.bindBuffer(35052, data);\n this.device.gl.texSubImage2D(target, level, x, y, width, height, dataFormat, type, offset);\n this.device.gl.bindBuffer(35052, null);\n }\n else {\n // Assume data is a browser supported object (ImageData, Canvas, ...)\n this.device.gl.texSubImage2D(target, level, x, y, width, height, dataFormat, type, data);\n }\n });\n this.gl.bindTexture(this.target, null);\n }\n /**\n * Defines a two-dimensional texture image or cube-map texture image with\n * pixels from the current framebuffer (rather than from client memory).\n * (gl.copyTexImage2D wrapper)\n *\n * Note that binding a texture into a Framebuffer's color buffer and\n * rendering can be faster.\n */\n copyFramebuffer(opts = {}) {\n log.error('Texture.copyFramebuffer({...}) is no logner supported, use copyToTexture(source, target, opts})')();\n return null;\n }\n getActiveUnit() {\n return this.gl.getParameter(34016) - 33984;\n }\n bind(textureUnit = this.textureUnit) {\n const { gl } = this;\n if (textureUnit !== undefined) {\n this.textureUnit = textureUnit;\n gl.activeTexture(33984 + textureUnit);\n }\n gl.bindTexture(this.target, this.handle);\n return textureUnit;\n }\n unbind(textureUnit = this.textureUnit) {\n const { gl } = this;\n if (textureUnit !== undefined) {\n this.textureUnit = textureUnit;\n gl.activeTexture(33984 + textureUnit);\n }\n gl.bindTexture(this.target, null);\n return textureUnit;\n }\n // PRIVATE METHODS\n _getDataType({ data, compressed = false }) {\n if (compressed) {\n return { data, dataType: 'compressed' };\n }\n if (data === null) {\n return { data, dataType: 'null' };\n }\n if (ArrayBuffer.isView(data)) {\n return { data, dataType: 'typed-array' };\n }\n if (data instanceof WEBGLBuffer) {\n return { data: data.handle, dataType: 'buffer' };\n }\n // Raw WebGL handle (not a luma wrapper)\n if (typeof WebGLBuffer !== 'undefined' && data instanceof WebGLBuffer) {\n return { data, dataType: 'buffer' };\n }\n // Assume data is a browser supported object (ImageData, Canvas, ...)\n return { data, dataType: 'browser-object' };\n }\n // HELPER METHODS\n _deduceParameters(opts) {\n const { format, data } = opts;\n let { width, height, dataFormat, type, compressed } = opts;\n // Deduce format and type from format\n const parameters = getWebGLTextureParameters(format);\n dataFormat = dataFormat || parameters.dataFormat;\n type = type || parameters.type;\n compressed = compressed || parameters.compressed;\n ({ width, height } = this._deduceImageSize(data, width, height));\n return { dataFormat, type, compressed, width, height, format, data };\n }\n // eslint-disable-next-line complexity\n _deduceImageSize(data, width, height) {\n let size;\n if (typeof ImageData !== 'undefined' && data instanceof ImageData) {\n size = { width: data.width, height: data.height };\n }\n else if (typeof HTMLImageElement !== 'undefined' && data instanceof HTMLImageElement) {\n size = { width: data.naturalWidth, height: data.naturalHeight };\n }\n else if (typeof HTMLCanvasElement !== 'undefined' && data instanceof HTMLCanvasElement) {\n size = { width: data.width, height: data.height };\n }\n else if (typeof ImageBitmap !== 'undefined' && data instanceof ImageBitmap) {\n size = { width: data.width, height: data.height };\n }\n else if (typeof HTMLVideoElement !== 'undefined' && data instanceof HTMLVideoElement) {\n size = { width: data.videoWidth, height: data.videoHeight };\n }\n else if (!data) {\n size = { width: width >= 0 ? width : 1, height: height >= 0 ? height : 1 };\n }\n else {\n size = { width, height };\n }\n assert(size, 'Could not deduced texture size');\n assert(width === undefined || size.width === width, 'Deduced texture width does not match supplied width');\n assert(height === undefined || size.height === height, 'Deduced texture height does not match supplied height');\n return size;\n }\n // CUBE MAP METHODS\n /* eslint-disable max-statements, max-len */\n async setCubeMapImageData(options) {\n const { gl } = this;\n const { width, height, pixels, data, format = 6408, type = 5121 } = options;\n const imageDataMap = pixels || data;\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 const resolvedFaces = await Promise.all(WEBGLTexture.FACES.map(face => {\n const facePixels = imageDataMap[face];\n return Promise.all(Array.isArray(facePixels) ? facePixels : [facePixels]);\n }));\n this.bind();\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 }\n else {\n gl.texImage2D(face, lodLevel, format, format, type, image);\n }\n });\n });\n this.unbind();\n }\n /** @todo update this method to accept LODs */\n setImageDataForFace(options) {\n const { face, width, height, pixels, data, format = 6408, type = 5121\n // generateMipmap = false // TODO\n } = options;\n const { gl } = this;\n const imageData = pixels || data;\n this.bind();\n if (imageData instanceof Promise) {\n imageData.then(resolvedImageData => this.setImageDataForFace(Object.assign({}, options, {\n face,\n data: resolvedImageData,\n pixels: resolvedImageData\n })));\n }\n else if (this.width || this.height) {\n gl.texImage2D(face, 0, format, width, height, 0 /* border*/, format, type, imageData);\n }\n else {\n gl.texImage2D(face, 0, format, format, type, imageData);\n }\n return this;\n }\n /** Image 3D copies from Typed Array or WebGLBuffer */\n setImageData3D(options) {\n const { level = 0, dataFormat, format, type, // = GL.UNSIGNED_BYTE,\n width, height, depth = 1, offset = 0, data, parameters = {} } = options;\n this.trackDeallocatedMemory('Texture');\n this.gl.bindTexture(this.target, this.handle);\n const webglTextureFormat = getWebGLTextureParameters(format);\n withGLParameters(this.gl, parameters, () => {\n if (ArrayBuffer.isView(data)) {\n this.gl.texImage3D(this.target, level, webglTextureFormat.format, width, height, depth, 0 /* border, must be 0 */, webglTextureFormat.dataFormat, webglTextureFormat.type, // dataType: getWebGL,\n data);\n }\n if (data instanceof WEBGLBuffer) {\n this.gl.bindBuffer(35052, data.handle);\n this.gl.texImage3D(this.target, level, dataFormat, width, height, depth, 0 /* border, must be 0 */, format, type, offset);\n }\n });\n if (data && data.byteLength) {\n this.trackAllocatedMemory(data.byteLength, 'Texture');\n }\n else {\n const bytesPerPixel = getTextureFormatBytesPerPixel(this.props.format);\n this.trackAllocatedMemory(this.width * this.height * this.depth * bytesPerPixel, 'Texture');\n }\n this.loaded = true;\n return this;\n }\n // RESOURCE METHODS\n /**\n * Sets sampler parameters on texture\n */\n _setSamplerParameters(parameters) {\n // NPOT parameters may populate an empty object\n if (isObjectEmpty(parameters)) {\n return;\n }\n logParameters(parameters);\n this.gl.bindTexture(this.target, this.handle);\n for (const [pname, pvalue] of Object.entries(parameters)) {\n const param = Number(pname);\n const value = pvalue;\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 switch (param) {\n case 33082:\n case 33083:\n this.gl.texParameterf(this.target, param, value);\n break;\n default:\n this.gl.texParameteri(this.target, param, value);\n break;\n }\n }\n this.gl.bindTexture(this.target, null);\n return;\n }\n}\n// HELPERS\nfunction getWebGLTextureTarget(props) {\n switch (props.dimension) {\n // supported in WebGL\n case '2d':\n return 3553;\n case 'cube':\n return 34067;\n // supported in WebGL2\n case '2d-array':\n return 35866;\n case '3d':\n return 32879;\n // not supported in any WebGL version\n case '1d':\n case 'cube-array':\n default:\n throw new Error(props.dimension);\n }\n}\nfunction logParameters(parameters) {\n log.log(1, 'texture sampler parameters', parameters)();\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { setGLParameters } from \"../parameters/unified-parameter-api.js\";\nimport { pushContextState, popContextState } from \"./track-context-state.js\";\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(gl, parameters, func) {\n if (isObjectEmpty(parameters)) {\n // Avoid setting state if no parameters provided. Just call and return\n return func(gl);\n }\n const { nocatch = true } = parameters;\n pushContextState(gl);\n setGLParameters(gl, parameters);\n // Setup is done, call the function\n let value;\n if (nocatch) {\n // Avoid try catch to minimize stack size impact for safe execution paths\n value = func(gl);\n popContextState(gl);\n }\n else {\n // Wrap in a try-catch to ensure that parameters are restored on exceptions\n try {\n value = func(gl);\n }\n finally {\n popContextState(gl);\n }\n }\n return value;\n}\n// Helpers\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\nimport { GL } from '@luma.gl/constants';\nimport { convertCompareFunction } from \"./device-parameters.js\";\n/**\n * Convert WebGPU-style sampler props to WebGL\n * @param props\n * @returns\n */\nexport function convertSamplerParametersToWebGL(props) {\n const params = {};\n if (props.addressModeU) {\n params[10242] = convertAddressMode(props.addressModeU);\n }\n if (props.addressModeV) {\n params[10243] = convertAddressMode(props.addressModeV);\n }\n if (props.addressModeW) {\n params[32882] = convertAddressMode(props.addressModeW);\n }\n if (props.magFilter) {\n params[10240] = convertMaxFilterMode(props.magFilter);\n }\n if (props.minFilter || props.mipmapFilter) {\n // TODO - arbitrary choice of linear?\n params[10241] = convertMinFilterMode(props.minFilter || 'linear', props.mipmapFilter);\n }\n if (props.lodMinClamp !== undefined) {\n params[33082] = props.lodMinClamp;\n }\n if (props.lodMaxClamp !== undefined) {\n params[33083] = props.lodMaxClamp;\n }\n if (props.type === 'comparison-sampler') {\n // Setting prop.compare turns this into a comparison sampler\n params[34892] = 34894;\n }\n if (props.compare) {\n params[34893] = convertCompareFunction('compare', props.compare);\n }\n // Note depends on WebGL extension\n if (props.maxAnisotropy) {\n params[34046] = props.maxAnisotropy;\n }\n return params;\n}\n// HELPERS\n/** Convert address more */\nfunction convertAddressMode(addressMode) {\n switch (addressMode) {\n case 'clamp-to-edge':\n return 33071;\n case 'repeat':\n return 10497;\n case 'mirror-repeat':\n return 33648;\n }\n}\nfunction convertMaxFilterMode(maxFilter) {\n switch (maxFilter) {\n case 'nearest':\n return 9728;\n case 'linear':\n return 9729;\n }\n}\n/**\n * WebGPU has separate min filter and mipmap filter,\n * WebGL is combined and effectively offers 6 options\n */\nfunction convertMinFilterMode(minFilter, mipmapFilter) {\n if (!mipmapFilter) {\n return convertMaxFilterMode(minFilter);\n }\n switch (minFilter) {\n case 'nearest':\n return mipmapFilter === 'nearest' ? 9984 : 9986;\n case 'linear':\n return mipmapFilter === 'nearest' ? 9985 : 9987;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { log, isObjectEmpty } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\nimport { pushContextState, popContextState } from \"../../context/state-tracker/track-context-state.js\";\nimport { setGLParameters } from \"../../context/parameters/unified-parameter-api.js\";\n/* eslint-disable no-unused-expressions */ // For expression ? gl.enable() : gl.disable()\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(device, parameters, glParameters, func) {\n if (isObjectEmpty(parameters)) {\n // Avoid setting state if no parameters provided. Just call and return\n return func(device);\n }\n // Wrap in a try-catch to ensure that parameters are restored on exceptions\n const webglDevice = device;\n pushContextState(webglDevice.gl);\n try {\n setDeviceParameters(device, parameters);\n setGLParameters(webglDevice.gl, glParameters);\n return func(device);\n }\n finally {\n popContextState(webglDevice.gl);\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(device, parameters, func) {\n if (isObjectEmpty(parameters)) {\n // Avoid setting state if no parameters provided. Just call and return\n return func(device);\n }\n // Wrap in a try-catch to ensure that parameters are restored on exceptions\n const webglDevice = device;\n pushContextState(webglDevice.gl);\n try {\n setGLParameters(webglDevice.gl, parameters);\n return func(device);\n }\n finally {\n popContextState(webglDevice.gl);\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(device, parameters, func) {\n if (isObjectEmpty(parameters)) {\n // Avoid setting state if no parameters provided. Just call and return\n return func(device);\n }\n // Wrap in a try-catch to ensure that parameters are restored on exceptions\n // @ts-expect-error\n pushContextState(device.gl);\n try {\n setDeviceParameters(device, parameters);\n return func(device);\n }\n finally {\n // @ts-expect-error\n popContextState(device.gl);\n }\n}\n/** Set WebGPU Style Parameters */\nexport function setDeviceParameters(device, parameters) {\n const webglDevice = device;\n const { gl } = webglDevice;\n // RASTERIZATION SETTINGS\n if (parameters.cullMode) {\n switch (parameters.cullMode) {\n case 'none':\n gl.disable(2884);\n break;\n case 'front':\n gl.enable(2884);\n gl.cullFace(1028);\n break;\n case 'back':\n gl.enable(2884);\n gl.cullFace(1029);\n break;\n }\n }\n if (parameters.frontFace) {\n gl.frontFace(map('frontFace', parameters.frontFace, {\n ccw: 2305,\n cw: 2304\n }));\n }\n if (parameters.unclippedDepth) {\n if (device.features.has('depth-clip-control')) {\n // EXT_depth_clamp\n gl.enable(34383);\n }\n }\n if (parameters.depthBias !== undefined) {\n gl.enable(32823);\n gl.polygonOffset(parameters.depthBias, parameters.depthBiasSlopeScale || 0);\n }\n // depthBiasSlopeScale: {\n // // Handled by depthBias\n // },\n // WEBGL EXTENSIONS\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 const vertex = map('provokingVertex', parameters.provokingVertex, {\n first: 36429,\n last: 36430\n });\n ext?.provokingVertexWEBGL(vertex);\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', parameters.polygonMode, {\n fill: 6914,\n line: 6913\n });\n ext?.polygonModeWEBGL(1028, mode);\n ext?.polygonModeWEBGL(1029, mode);\n }\n if (parameters.polygonOffsetLine) {\n gl.enable(10754);\n }\n }\n }\n if (device.features.has('shader-clip-cull-distance-webgl')) {\n if (parameters.clipDistance0) {\n gl.enable(12288);\n }\n if (parameters.clipDistance1) {\n gl.enable(12289);\n }\n if (parameters.clipDistance2) {\n gl.enable(12290);\n }\n if (parameters.clipDistance3) {\n gl.enable(12291);\n }\n if (parameters.clipDistance4) {\n gl.enable(12292);\n }\n if (parameters.clipDistance5) {\n gl.enable(12293);\n }\n if (parameters.clipDistance6) {\n gl.enable(12294);\n }\n if (parameters.clipDistance7) {\n gl.enable(12295);\n }\n }\n // DEPTH STENCIL\n if (parameters.depthWriteEnabled !== undefined) {\n gl.depthMask(mapBoolean('depthWriteEnabled', parameters.depthWriteEnabled));\n }\n if (parameters.depthCompare) {\n parameters.depthCompare !== 'always' ? gl.enable(2929) : gl.disable(2929);\n gl.depthFunc(convertCompareFunction('depthCompare', parameters.depthCompare));\n }\n if (parameters.stencilWriteMask) {\n const mask = parameters.stencilWriteMask;\n gl.stencilMaskSeparate(1028, mask);\n gl.stencilMaskSeparate(1029, mask);\n }\n if (parameters.stencilReadMask) {\n // stencilReadMask is handle inside stencil***Compare.\n log.warn('stencilReadMask not supported under WebGL');\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(2960)\n : gl.disable(2960);\n gl.stencilFuncSeparate(1028, glValue, 0, mask);\n gl.stencilFuncSeparate(1029, glValue, 0, mask);\n }\n if (parameters.stencilPassOperation &&\n parameters.stencilFailOperation &&\n parameters.stencilDepthFailOperation) {\n const dppass = convertStencilOperation('stencilPassOperation', parameters.stencilPassOperation);\n const sfail = convertStencilOperation('stencilFailOperation', parameters.stencilFailOperation);\n const dpfail = convertStencilOperation('stencilDepthFailOperation', parameters.stencilDepthFailOperation);\n gl.stencilOpSeparate(1028, sfail, dpfail, dppass);\n gl.stencilOpSeparate(1029, sfail, dpfail, dppass);\n }\n // stencilDepthFailOperation() {\n // // handled by stencilPassOperation\n // },\n // stencilFailOperation() {\n // // handled by stencilPassOperation\n // },\n // COLOR STATE\n if (parameters.blendColorOperation || parameters.blendAlphaOperation) {\n gl.enable(3042);\n const colorEquation = convertBlendOperationToEquation('blendColorOperation', parameters.blendColorOperation || 'add');\n const alphaEquation = convertBlendOperationToEquation('blendAlphaOperation', parameters.blendAlphaOperation || 'add');\n gl.blendEquationSeparate(colorEquation, alphaEquation);\n const colorSrcFactor = convertBlendFactorToFunction('blendColorSrcFactor', parameters.blendColorSrcFactor || 'one');\n const colorDstFactor = convertBlendFactorToFunction('blendColorDstFactor', parameters.blendColorDstFactor || 'zero');\n const alphaSrcFactor = convertBlendFactorToFunction('blendAlphaSrcFactor', parameters.blendAlphaSrcFactor || 'one');\n const alphaDstFactor = convertBlendFactorToFunction('blendAlphaDstFactor', parameters.blendAlphaDstFactor || 'zero');\n gl.blendFuncSeparate(colorSrcFactor, colorDstFactor, alphaSrcFactor, alphaDstFactor);\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*/\nexport function convertCompareFunction(parameter, value) {\n return map(parameter, value, {\n never: 512,\n less: 513,\n equal: 514,\n 'less-equal': 515,\n greater: 516,\n 'not-equal': 517,\n 'greater-equal': 518,\n always: 519\n });\n}\nexport function convertToCompareFunction(parameter, value) {\n return map(parameter, value, {\n [512]: 'never',\n [513]: 'less',\n [514]: 'equal',\n [515]: 'less-equal',\n [516]: 'greater',\n [517]: 'not-equal',\n [518]: 'greater-equal',\n [519]: 'always'\n });\n}\nfunction convertStencilOperation(parameter, value) {\n return map(parameter, value, {\n keep: 7680,\n zero: 0,\n replace: 7681,\n invert: 5386,\n 'increment-clamp': 7682,\n 'decrement-clamp': 7683,\n 'increment-wrap': 34055,\n 'decrement-wrap': 34056\n });\n}\nfunction convertBlendOperationToEquation(parameter, value) {\n return map(parameter, value, {\n add: 32774,\n subtract: 32778,\n 'reverse-subtract': 32779,\n min: 32775,\n max: 32776\n });\n}\nfunction convertBlendFactorToFunction(parameter, value) {\n return map(parameter, value, {\n one: 1,\n zero: 0,\n 'src-color': 768,\n 'one-minus-src-color': 769,\n 'dst-color': 774,\n 'one-minus-dst-color': 775,\n 'src-alpha': 770,\n 'one-minus-src-alpha': 771,\n 'dst-alpha': 772,\n 'one-minus-dst-alpha': 773,\n 'src-alpha-saturated': 776,\n 'constant-color': 32769,\n 'one-minus-constant-color': 32770,\n 'constant-alpha': 32771,\n 'one-minus-constant-alpha': 32772\n });\n}\nfunction message(parameter, value) {\n return `Illegal parameter ${value} for ${parameter}`;\n}\nfunction map(parameter, value, valueMap) {\n if (!(value in valueMap)) {\n throw new Error(message(parameter, value));\n }\n return valueMap[value];\n}\nfunction mapBoolean(parameter, value) {\n return value;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { Buffer, assert } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\n/** WebGL Buffer interface */\nexport class WEBGLBuffer extends Buffer {\n device;\n gl;\n handle;\n /** Target in OpenGL defines the type of buffer */\n glTarget;\n /** Usage is a hint on how frequently the buffer will be updates */\n glUsage;\n /** Index type is needed when issuing draw calls, so we pre-compute it */\n glIndexType = 5123;\n /** Number of bytes allocated on the GPU for this buffer */\n byteLength;\n /** Number of bytes used */\n bytesUsed;\n constructor(device, props = {}) {\n super(device, props);\n this.device = device;\n this.gl = this.device.gl;\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 // - 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' ? 5125 : 5123;\n // Set data: (re)initializes the buffer\n if (props.data) {\n this._initWithData(props.data, props.byteOffset, props.byteLength);\n }\n else {\n this._initWithByteLength(props.byteLength || 0);\n }\n }\n // PRIVATE METHODS\n /** Allocate a new buffer and initialize to contents of typed array */\n _initWithData(data, byteOffset = 0, byteLength = data.byteLength + byteOffset) {\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 this.bytesUsed = byteLength;\n this.byteLength = byteLength;\n this._setDebugData(data, byteOffset, byteLength);\n this.trackAllocatedMemory(byteLength);\n }\n // Allocate a GPU buffer of specified size.\n _initWithByteLength(byteLength) {\n assert(byteLength >= 0);\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 // 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, data, this.glUsage);\n this.gl.bindBuffer(glTarget, null);\n this.bytesUsed = byteLength;\n this.byteLength = byteLength;\n this._setDebugData(null, 0, byteLength);\n this.trackAllocatedMemory(byteLength);\n return this;\n }\n destroy() {\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 write(data, byteOffset = 0) {\n const srcOffset = 0;\n const byteLength = undefined; // data.byteLength;\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 = 36663;\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 }\n else {\n this.gl.bufferSubData(glTarget, byteOffset, data);\n }\n this.gl.bindBuffer(glTarget, null);\n this._setDebugData(data, byteOffset, data.byteLength);\n }\n /** Asynchronously read data from the buffer */\n async readAsync(byteOffset = 0, byteLength) {\n return this.readSyncWebGL(byteOffset, byteLength);\n }\n /** Synchronously read data from the buffer. WebGL only. */\n readSyncWebGL(byteOffset = 0, byteLength) {\n byteLength = byteLength ?? this.byteLength - byteOffset;\n const data = new Uint8Array(byteLength);\n const dstOffset = 0;\n // Use GL.COPY_READ_BUFFER to avoid disturbing other targets and locking type\n this.gl.bindBuffer(36662, this.handle);\n this.gl.getBufferSubData(36662, byteOffset, data, dstOffset, byteLength);\n this.gl.bindBuffer(36662, null);\n // Update local `data` if offsets are 0\n this._setDebugData(data, byteOffset, byteLength);\n return data;\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(usage) {\n if (usage & Buffer.INDEX) {\n return 34963;\n }\n if (usage & Buffer.VERTEX) {\n return 34962;\n }\n if (usage & Buffer.UNIFORM) {\n return 35345;\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 34962;\n}\n/** @todo usage is not passed correctly */\nfunction getWebGLUsage(usage) {\n if (usage & Buffer.INDEX) {\n return 35044;\n }\n if (usage & Buffer.VERTEX) {\n return 35044;\n }\n if (usage & Buffer.UNIFORM) {\n return 35048;\n }\n return 35044;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { Sampler } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\nimport { convertSamplerParametersToWebGL } from \"../converters/sampler-parameters.js\";\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 device;\n handle;\n parameters;\n constructor(device, props) {\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 destroy() {\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 toString() {\n return `Sampler(${this.id},${JSON.stringify(this.props)})`;\n }\n /** Set sampler parameters on the sampler */\n _setSamplerParameters(parameters) {\n for (const [pname, value] of Object.entries(parameters)) {\n // Apparently there are integer/float conversion issues requires two parameter setting functions in JavaScript.\n // For now, pick the float version for parameters specified as GLfloat.\n const param = Number(pname);\n switch (param) {\n case 33082:\n case 33083:\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// import {decodeTextureFormat} from '@luma.gl/core';\nimport { TextureView, Texture } from '@luma.gl/core';\nexport class WEBGLTextureView extends TextureView {\n device;\n gl;\n handle;\n texture;\n constructor(device, props) {\n super(device, { ...Texture.defaultProps, ...props });\n this.device = device;\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\nimport { log, loadScript } from '@luma.gl/core';\nconst DEFAULT_SPECTOR_PROPS = {\n spector: log.get('spector') || log.get('inspect')\n};\n// https://github.com/BabylonJS/Spector.js#basic-usage\nconst SPECTOR_CDN_URL = 'https://spectorcdn.babylonjs.com/spector.bundle.js';\nconst LOG_LEVEL = 1;\nlet spector = null;\nlet initialized = false;\n/** Loads spector from CDN if not already installed */\nexport async function loadSpectorJS(props) {\n if (!globalThis.SPECTOR) {\n try {\n await loadScript(SPECTOR_CDN_URL);\n }\n catch (error) {\n log.warn(String(error));\n }\n }\n}\nexport function initializeSpectorJS(props) {\n props = { ...DEFAULT_SPECTOR_PROPS, ...props };\n if (!props?.spector) {\n return null;\n }\n if (!spector && globalThis.SPECTOR) {\n log.probe(LOG_LEVEL, 'SPECTOR found and initialized')();\n spector = new globalThis.SPECTOR.Spector();\n if (globalThis.luma) {\n globalThis.luma.spector = spector;\n }\n }\n if (!spector) {\n return null;\n }\n if (!initialized) {\n initialized = true;\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) => log.info('Spector capture started:', capture)());\n spector?.onCapture.add((capture) => {\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 spector?.resultView.display();\n spector?.resultView.addCapture(capture);\n });\n }\n if (props?.canvas) {\n // @ts-expect-error If spector is specified as a canvas id, only monitor that canvas\n if (typeof props.spector === 'string' && props.spector !== props.canvas.id) {\n return spector;\n }\n // capture startup\n // spector?.captureCanvas(props?.canvas);\n spector?.startCapture(props?.canvas, 500); // 500 commands\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 return spector;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { log, loadScript } 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';\nconst WEBGL_DEBUG_CDN_URL = 'https://unpkg.com/webgl-debug@2.0.1/index.js';\n// Helper to get shared context data\nfunction getWebGLContextData(gl) {\n gl.luma = gl.luma || {};\n return gl.luma;\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() {\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// Returns (a potentially new) context with debug instrumentation turned off or on.\n// Note that this actually returns a new context\nexport function makeDebugContext(gl, props = {}) {\n // Return null to ensure we don't try to create a context in this case (TODO what case is that?)\n if (!gl) {\n return null;\n }\n return props.debug ? getDebugContext(gl, props) : getRealContext(gl);\n}\n// Returns the real context from either of the real/debug contexts\nfunction getRealContext(gl) {\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// Returns the debug context from either of the real/debug contexts\nfunction getDebugContext(gl, props) {\n if (!globalThis.WebGLDebugUtils) {\n log.warn('webgl-debug not loaded')();\n return gl;\n }\n const data = getWebGLContextData(gl);\n // If this already has a debug context, return it.\n if (data.debugContext) {\n return data.debugContext;\n }\n // Create a new debug context\n globalThis.WebGLDebugUtils.init({ ...GLEnum, ...gl });\n const glDebug = globalThis.WebGLDebugUtils.makeDebugContext(gl, onGLError.bind(null, props), onValidateGLFunc.bind(null, props));\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 // 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 }\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 // Return it\n return debugContext;\n}\n// DEBUG TRACING\nfunction getFunctionString(functionName, functionArgs) {\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}\nfunction onGLError(props, err, functionName, args) {\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 if (props.throwOnError) {\n throw new Error(message);\n }\n}\n// Don't generate function string until it is needed\nfunction onValidateGLFunc(props, functionName, functionArgs) {\n let functionString = '';\n if (log.level >= 1) {\n functionString = getFunctionString(functionName, functionArgs);\n log.log(1, functionString)();\n }\n // If array of breakpoint strings supplied, check if any of them is contained in current GLEnum function\n if (props.break && props.break.length > 0) {\n functionString = functionString || getFunctionString(functionName, functionArgs);\n const isBreakpoint = props.break.every((breakOn) => functionString.indexOf(breakOn) !== -1);\n if (isBreakpoint) {\n debugger; // eslint-disable-line\n }\n }\n for (const arg of functionArgs) {\n if (arg === undefined) {\n functionString = functionString || getFunctionString(functionName, functionArgs);\n if (props.throwOnError) {\n throw new Error(`Undefined argument: ${functionString}`);\n }\n else {\n log.error(`Undefined argument: ${functionString}`)();\n debugger; // eslint-disable-line\n }\n }\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { Shader, log } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\nimport { parseShaderCompilerLog } from \"../helpers/parse-shader-compiler-log.js\";\n/**\n * An immutable compiled shader program that execute portions of the GPU Pipeline\n */\nexport class WEBGLShader extends Shader {\n device;\n handle;\n constructor(device, props) {\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(35633);\n break;\n case 'fragment':\n this.handle = this.props.handle || this.device.gl.createShader(35632);\n break;\n default:\n throw new Error(this.props.stage);\n }\n this._compile(this.source);\n }\n destroy() {\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 async getCompilationInfo() {\n await this._waitForCompilationComplete();\n return this.getCompilationInfoSync();\n }\n getCompilationInfoSync() {\n const log = this.device.gl.getShaderInfoLog(this.handle);\n return parseShaderCompilerLog(log);\n }\n getTranslatedSource() {\n const extensions = this.device.getExtension('WEBGL_debug_shaders');\n const ext = extensions.WEBGL_debug_shaders;\n return ext?.getTranslatedShaderSource(this.handle);\n }\n // PRIVATE METHODS\n /** Compile a shader and get compilation status */\n async _compile(source) {\n const addGLSLVersion = (source) => source.startsWith('#version ') ? source : `#version 100\\n${source}`;\n source = addGLSLVersion(source);\n const { gl } = this.device;\n gl.shaderSource(this.handle, source);\n gl.compileShader(this.handle);\n // For performance reasons, avoid checking shader compilation errors on production\n if (log.level === 0) {\n this.compilationStatus = 'pending';\n return;\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 // 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 // The `Shader` base class will determine if debug window should be opened based on this.compilationStatus\n this.debugShader();\n }\n /** Use KHR_parallel_shader_compile extension if available */\n async _waitForCompilationComplete() {\n const waitMs = async (ms) => await new Promise(resolve => setTimeout(resolve, ms));\n const DELAY_MS = 10; // Shader compilation is typically quite fast (with some exceptions)\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 const { gl } = this.device;\n for (;;) {\n const complete = gl.getShaderParameter(this.handle, 37297);\n if (complete) {\n return;\n }\n await waitMs(DELAY_MS);\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 _getCompilationStatus() {\n this.compilationStatus = this.device.gl.getShaderParameter(this.handle, 35713)\n ? 'success'\n : 'error';\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/**\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) {\n // Parse the error - note: browser and driver dependent\n const lines = errLog.split(/\\r?\\n/);\n const messages = [];\n for (const line of lines) {\n if (line.length <= 1) {\n continue; // eslint-disable-line no-continue\n }\n const segments = line.split(':');\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 const [messageType, linePosition, lineNumber, ...rest] = segments;\n let lineNum = parseInt(lineNumber, 10);\n if (isNaN(lineNum)) {\n lineNum = 0;\n }\n let linePos = parseInt(linePosition, 10);\n if (isNaN(linePos)) {\n linePos = 0;\n }\n messages.push({\n message: rest.join(':').trim(),\n type: getMessageType(messageType),\n lineNum,\n linePos // TODO\n });\n }\n return messages;\n}\n/** Ensure supported type */\nfunction getMessageType(messageType) {\n const MESSAGE_TYPES = ['warning', 'error', 'info'];\n const lowerCaseType = messageType.toLowerCase();\n return (MESSAGE_TYPES.includes(lowerCaseType) ? lowerCaseType : 'info');\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { RenderPass } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\nimport { withGLParameters } from \"../../context/state-tracker/with-parameters.js\";\nimport { setGLParameters } from \"../../context/parameters/unified-parameter-api.js\";\nimport { pushContextState, popContextState } from \"../../context/state-tracker/track-context-state.js\";\n// Should collapse during minification\nconst GL_DEPTH_BUFFER_BIT = 0x00000100;\nconst GL_STENCIL_BUFFER_BIT = 0x00000400;\nconst GL_COLOR_BUFFER_BIT = 0x00004000;\nconst GL_COLOR = 0x1800;\nconst COLOR_CHANNELS = [0x1, 0x2, 0x4, 0x8]; // GPUColorWrite RED, GREEN, BLUE, ALPHA\nexport class WEBGLRenderPass extends RenderPass {\n device;\n /** Parameters that should be applied before each draw call */\n glParameters;\n constructor(device, props) {\n super(device, props);\n this.device = device;\n // TODO - do parameters (scissorRect) affect the clear operation?\n pushContextState(this.device.gl);\n this.setParameters(this.props.parameters);\n // Hack - for now WebGL draws in \"immediate mode\" (instead of queueing the operations)...\n this.clear();\n }\n end() {\n popContextState(this.device.gl);\n // should add commands to CommandEncoder.\n }\n pushDebugGroup(groupLabel) { }\n popDebugGroup() { }\n insertDebugMarker(markerLabel) { }\n // beginOcclusionQuery(queryIndex: number): void;\n // endOcclusionQuery(): void;\n // executeBundles(bundles: Iterable<GPURenderBundle>): void;\n /**\n * Maps RenderPass parameters to GL parameters\n */\n setParameters(parameters = {}) {\n const glParameters = { ...this.glParameters };\n // Framebuffers are specified using parameters in WebGL\n if (this.props.framebuffer) {\n glParameters.framebuffer = this.props.framebuffer;\n }\n if (this.props.depthReadOnly) {\n glParameters.depthMask = !this.props.depthReadOnly;\n }\n glParameters.stencilMask = this.props.stencilReadOnly ? 0 : 1;\n glParameters[35977] = this.props.discard;\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);\n glParameters.depthRange = [parameters.viewport[4], parameters.viewport[5]];\n }\n else {\n // WebGL viewports are 4 coordinates (X, Y)\n glParameters.viewport = parameters.viewport;\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[2967] = parameters.stencilReference;\n }\n if (parameters.colorMask) {\n glParameters.colorMask = COLOR_CHANNELS.map(channel => Boolean(channel & parameters.colorMask));\n }\n this.glParameters = glParameters;\n setGLParameters(this.device.gl, glParameters);\n }\n beginOcclusionQuery(queryIndex) {\n const webglQuerySet = this.props.occlusionQuerySet;\n webglQuerySet?.beginOcclusionQuery();\n }\n endOcclusionQuery() {\n const webglQuerySet = this.props.occlusionQuerySet;\n webglQuerySet?.endOcclusionQuery();\n }\n // PRIVATE\n /**\n * Optionally clears depth, color and stencil buffers based on parameters\n */\n clear() {\n const glParameters = { ...this.glParameters };\n let clearMask = 0;\n if (this.props.clearColor !== false) {\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 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 // TODO - clear multiple color attachments\n // for (attachment of this.framebuffer.colorAttachments) {\n // this.clearColorBuffer\n // }\n }\n }\n /**\n * WebGL2 - clear a specific color buffer\n */\n clearColorBuffer(drawBuffer = 0, value = [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 Int32Array:\n this.device.gl.clearBufferiv(GL_COLOR, drawBuffer, value);\n break;\n case Uint32Array:\n this.device.gl.clearBufferuiv(GL_COLOR, drawBuffer, value);\n break;\n case Float32Array:\n default:\n this.device.gl.clearBufferfv(GL_COLOR, drawBuffer, value);\n break;\n }\n });\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { RenderPipeline, cast, splitUniformsAndBindings, log } from '@luma.gl/core';\nimport { mergeShaderLayout } from '@luma.gl/core';\n// import {mergeShaderLayout, getAttributeInfosFromLayouts} from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\nimport { getShaderLayout } from \"../helpers/get-shader-layout.js\";\nimport { withDeviceAndGLParameters } from \"../converters/device-parameters.js\";\nimport { setUniform } from \"../helpers/set-uniform.js\";\nimport { WEBGLBuffer } from \"./webgl-buffer.js\";\nimport { WEBGLFramebuffer } from \"./webgl-framebuffer.js\";\nimport { WEBGLTexture } from \"./webgl-texture.js\";\nimport { WEBGLTextureView } from \"./webgl-texture-view.js\";\nimport { getGLDrawMode } from \"../helpers/webgl-topology-utils.js\";\nconst LOG_PROGRAM_PERF_PRIORITY = 4;\n/** Creates a new render pipeline */\nexport class WEBGLRenderPipeline extends RenderPipeline {\n /** The WebGL device that created this render pipeline */\n device;\n /** Handle to underlying WebGL program */\n handle;\n /** vertex shader */\n vs;\n /** fragment shader */\n fs;\n /** The layout extracted from shader by WebGL introspection APIs */\n introspectedLayout;\n /** Uniforms set on this model */\n uniforms = {};\n /** Bindings set on this model */\n bindings = {};\n /** WebGL varyings */\n varyings = null;\n _uniformCount = 0;\n _uniformSetters = {}; // TODO are these used?\n constructor(device, props) {\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 // Create shaders if needed\n this.vs = cast(props.vs);\n this.fs = cast(props.fs);\n // assert(this.vs.stage === 'vertex');\n // assert(this.fs.stage === 'fragment');\n // Setup varyings if supplied\n // @ts-expect-error WebGL only\n const { varyings, bufferMode = 35981 } = props;\n if (varyings && varyings.length > 0) {\n this.varyings = varyings;\n this.device.gl.transformFeedbackVaryings(this.handle, varyings, bufferMode);\n }\n this._linkShaders();\n log.time(1, `RenderPipeline ${this.id} - shaderLayout introspection`)();\n this.introspectedLayout = getShaderLayout(this.device.gl, this.handle);\n log.timeEnd(1, `RenderPipeline ${this.id} - shaderLayout introspection`)();\n // Merge provided layout with introspected layout\n this.shaderLayout = mergeShaderLayout(this.introspectedLayout, props.shaderLayout);\n // WebGPU has more restrictive topology support than WebGL\n switch (this.props.topology) {\n case 'triangle-fan-webgl':\n case 'line-loop-webgl':\n log.warn(`Primitive topology ${this.props.topology} is deprecated and will be removed in v9.1`);\n break;\n default:\n }\n }\n destroy() {\n if (this.handle) {\n this.device.gl.deleteProgram(this.handle);\n // this.handle = null;\n this.destroyed = true;\n }\n }\n /**\n * Bindings include: textures, samplers and uniform buffers\n * @todo needed for portable model\n */\n setBindings(bindings, options) {\n // if (log.priority >= 2) {\n // checkUniformValues(uniforms, this.id, this._uniformSetters);\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 = this.shaderLayout.bindings.find(binding => binding.name === name) ||\n this.shaderLayout.bindings.find(binding => binding.name === `${name}Uniforms`);\n if (!binding) {\n const validBindings = this.shaderLayout.bindings\n .map(binding => `\"${binding.name}\"`)\n .join(', ');\n if (!options?.disableWarnings) {\n log.warn(`Unknown binding \"${name}\" in render pipeline \"${this.id}\", expected one of ${validBindings}`)();\n }\n continue; // eslint-disable-line no-continue\n }\n if (!value) {\n log.warn(`Unsetting binding \"${name}\" in render pipeline \"${this.id}\"`)();\n }\n switch (binding.type) {\n case 'uniform':\n // @ts-expect-error\n if (!(value instanceof WEBGLBuffer) && !(value.buffer instanceof WEBGLBuffer)) {\n throw new Error('buffer value');\n }\n break;\n case 'texture':\n if (!(value instanceof WEBGLTextureView ||\n value instanceof WEBGLTexture ||\n value instanceof WEBGLFramebuffer)) {\n throw new Error('texture value');\n }\n break;\n case 'sampler':\n log.warn(`Ignoring sampler ${name}`)();\n break;\n default:\n throw new Error(binding.type);\n }\n this.bindings[name] = value;\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 const { renderPass, parameters = this.props.parameters, topology = this.props.topology, vertexArray, vertexCount, \n // indexCount,\n instanceCount, isInstanced = false, firstVertex = 0, \n // firstIndex,\n // firstInstance,\n // baseVertex,\n transformFeedback } = options;\n const glDrawMode = getGLDrawMode(topology);\n const isIndexed = Boolean(vertexArray.indexBuffer);\n const glIndexType = vertexArray.indexBuffer?.glIndexType;\n // Note that we sometimes get called with 0 instances\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 // Avoid WebGL draw call when not rendering any data or values are incomplete\n // Note: async textures set as uniforms might still be loading.\n // Now that all uniforms have been updated, check if any texture\n // in the uniforms is not yet initialized, then we don't draw\n if (!this._areTexturesRenderable() || vertexCount === 0) {\n log.info(2, `RenderPipeline:${this.id}.draw() aborted - textures not yet loaded`)();\n return false;\n }\n // (isInstanced && instanceCount === 0)\n if (vertexCount === 0) {\n log.info(2, `RenderPipeline:${this.id}.draw() aborted - no vertices to draw`)();\n return true;\n }\n this.device.gl.useProgram(this.handle);\n // Note: Rebinds constant attributes before each draw call\n vertexArray.bindBeforeRender(renderPass);\n if (transformFeedback) {\n transformFeedback.begin(this.props.topology);\n }\n // We have to apply bindings before every draw call since other draw calls will overwrite\n this._applyBindings();\n this._applyUniforms();\n const webglRenderPass = renderPass;\n withDeviceAndGLParameters(this.device, parameters, webglRenderPass.glParameters, () => {\n if (isIndexed && isInstanced) {\n this.device.gl.drawElementsInstanced(glDrawMode, vertexCount || 0, // indexCount?\n glIndexType, firstVertex, instanceCount || 0);\n // } else if (isIndexed && this.device.isWebGL2 && !isNaN(start) && !isNaN(end)) {\n // this.device.gldrawRangeElements(glDrawMode, start, end, vertexCount, glIndexType, offset);\n }\n else if (isIndexed) {\n this.device.gl.drawElements(glDrawMode, vertexCount || 0, glIndexType, firstVertex); // indexCount?\n }\n else if (isInstanced) {\n this.device.gl.drawArraysInstanced(glDrawMode, firstVertex, vertexCount || 0, instanceCount || 0);\n }\n else {\n this.device.gl.drawArrays(glDrawMode, firstVertex, vertexCount || 0);\n }\n if (transformFeedback) {\n transformFeedback.end();\n }\n });\n vertexArray.unbindAfterRender(renderPass);\n return true;\n }\n // DEPRECATED METHODS\n setUniformsWebGL(uniforms) {\n const { bindings } = splitUniformsAndBindings(uniforms);\n Object.keys(bindings).forEach(name => {\n log.warn(`Unsupported value \"${JSON.stringify(bindings[name])}\" used in setUniforms() for key ${name}. Use setBindings() instead?`)();\n });\n // TODO - check against layout\n Object.assign(this.uniforms, uniforms);\n }\n // PRIVATE METHODS\n // setAttributes(attributes: Record<string, Buffer>): void {}\n // setBindings(bindings: Record<string, Binding>): void {}\n 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 // TODO Avoid checking program linking error in production\n if (log.level === 0) {\n // return;\n }\n if (!this.device.features.has('compilation-status-async-webgl')) {\n const status = this._getLinkStatus();\n this._reportLinkStatus(status);\n return;\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 /** Report link status. First, check for shader compilation failures if linking fails */\n _reportLinkStatus(status) {\n switch (status) {\n case 'success':\n return;\n default:\n // First check for shader compilation failures if linking fails\n if (this.vs.compilationStatus === 'error') {\n this.vs.debugShader();\n throw new Error(`Error during compilation of shader ${this.vs.id}`);\n }\n if (this.fs?.compilationStatus === 'error') {\n this.fs.debugShader();\n throw new Error(`Error during compilation of shader ${this.fs.id}`);\n }\n throw new Error(`Error during ${status}: ${this.device.gl.getProgramInfoLog(this.handle)}`);\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() {\n const { gl } = this.device;\n const linked = gl.getProgramParameter(this.handle, 35714);\n if (!linked) {\n this.linkStatus = 'error';\n return 'linking';\n }\n gl.validateProgram(this.handle);\n const validated = gl.getProgramParameter(this.handle, 35715);\n if (!validated) {\n this.linkStatus = 'error';\n return 'validation';\n }\n this.linkStatus = 'success';\n return 'success';\n }\n /** Use KHR_parallel_shader_compile extension if available */\n async _waitForLinkComplete() {\n const waitMs = async (ms) => await new Promise(resolve => setTimeout(resolve, ms));\n const DELAY_MS = 10; // Shader compilation is typically quite fast (with some exceptions)\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 const { gl } = this.device;\n for (;;) {\n const complete = gl.getProgramParameter(this.handle, 37297);\n if (complete) {\n return;\n }\n await waitMs(DELAY_MS);\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 for (const [, texture] of Object.entries(this.bindings)) {\n if (texture instanceof WEBGLTexture) {\n texture.update();\n texturesRenderable = texturesRenderable && texture.loaded;\n }\n }\n return texturesRenderable;\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 const { gl } = this.device;\n gl.useProgram(this.handle);\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 = 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 === 4294967295) {\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(35345, uniformBufferIndex, value.handle);\n }\n else {\n gl.bindBufferRange(35345, 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 uniformBufferIndex += 1;\n break;\n case 'texture':\n if (!(value instanceof WEBGLTextureView ||\n value instanceof WEBGLTexture ||\n value instanceof WEBGLFramebuffer)) {\n throw new Error('texture');\n }\n let texture;\n if (value instanceof WEBGLTextureView) {\n texture = value.texture;\n }\n else if (value instanceof WEBGLTexture) {\n texture = value;\n }\n else if (value instanceof WEBGLFramebuffer &&\n value.colorAttachments[0] instanceof WEBGLTextureView) {\n log.warn('Passing framebuffer in texture binding may be deprecated. Use fbo.colorAttachments[0] instead')();\n texture = value.colorAttachments[0].texture;\n }\n else {\n throw new Error('No texture');\n }\n gl.activeTexture(33984 + textureUnit);\n gl.bindTexture(texture.target, texture.handle);\n // gl.bindSampler(textureUnit, sampler.handle);\n textureUnit += 1;\n break;\n case 'sampler':\n // ignore\n break;\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 * 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", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { GL } from '@luma.gl/constants';\nimport { Accessor } from \"../../classic/accessor.js\"; // TODO - should NOT depend on classic API\nimport { decodeGLUniformType, decodeGLAttributeType, isSamplerUniform } from \"./decode-webgl-types.js\";\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 getShaderLayout(gl, program) {\n const shaderLayout = {\n attributes: [],\n bindings: []\n };\n shaderLayout.attributes = readAttributeDeclarations(gl, program);\n // Uniform blocks\n const uniformBlocks = 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 location: uniformBlock.location,\n visibility: (uniformBlock.vertex ? 0x1 : 0) & (uniformBlock.fragment ? 0x2 : 0),\n minBindingSize: uniformBlock.byteLength,\n uniforms\n });\n }\n const uniforms = 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 location: textureUnit,\n viewDimension,\n sampleType\n });\n // @ts-expect-error\n uniform.textureUnit = textureUnit;\n textureUnit += 1;\n }\n }\n if (uniforms.length) {\n shaderLayout.uniforms = uniforms;\n }\n // Varyings\n const varyings = 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 return shaderLayout;\n}\n// HELPERS\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(gl, program) {\n const attributes = [];\n const count = gl.getProgramParameter(program, 35721);\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 // 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 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 // Sort by declaration order\n attributes.sort((a, b) => a.location - b.location);\n return attributes;\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, program) {\n const varyings = [];\n const count = gl.getProgramParameter(program, 35971);\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 accessor = new Accessor({ type: glType, size: size * components });\n const varying = { location, name, accessor }; // Base values\n varyings.push(varying);\n }\n varyings.sort((a, b) => a.location - b.location);\n return varyings;\n}\n/**\n * Extract info about all uniforms\n *\n * Query uniform locations and build name to setter map.\n */\nfunction readUniformBindings(gl, program) {\n const uniforms = [];\n const uniformCount = gl.getProgramParameter(program, 35718);\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,\n name,\n size,\n type,\n isArray\n };\n uniforms.push(uniformInfo);\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 webglLocation = gl.getUniformLocation(program, elementName);\n const arrayElementUniformInfo = {\n ...uniformInfo,\n name: elementName,\n location: webglLocation\n };\n uniforms.push(arrayElementUniformInfo);\n }\n }\n }\n return uniforms;\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(gl, program) {\n const getBlockParameter = (blockIndex, pname) => gl.getActiveUniformBlockParameter(program, blockIndex, pname);\n const uniformBlocks = [];\n const blockCount = gl.getProgramParameter(program, 35382);\n for (let blockIndex = 0; blockIndex < blockCount; blockIndex++) {\n const blockInfo = {\n name: gl.getActiveUniformBlockName(program, blockIndex) || '',\n location: getBlockParameter(blockIndex, 35391),\n byteLength: getBlockParameter(blockIndex, 35392),\n vertex: getBlockParameter(blockIndex, 35396),\n fragment: getBlockParameter(blockIndex, 35398),\n uniformCount: getBlockParameter(blockIndex, 35394),\n uniforms: []\n };\n const uniformIndices = getBlockParameter(blockIndex, 35395) || [];\n const uniformType = gl.getActiveUniforms(program, uniformIndices, 35383); // Array of GLenum indicating the types of the uniforms.\n const uniformArrayLength = gl.getActiveUniforms(program, uniformIndices, 35384); // 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, 35387); // Array of GLint indicating the uniform buffer offsets.\n const uniformStride = gl.getActiveUniforms(program, uniformIndices, 35388); // 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 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 uniformBlocks.push(blockInfo);\n }\n uniformBlocks.sort((a, b) => a.location - b.location);\n return uniformBlocks;\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*/\nconst SAMPLER_UNIFORMS_GL_TO_GPU = {\n [35678]: ['2d', 'float'],\n [35680]: ['cube', 'float'],\n [35679]: ['3d', 'float'],\n [35682]: ['3d', 'depth'],\n [36289]: ['2d-array', 'float'],\n [36292]: ['2d-array', 'depth'],\n [36293]: ['cube', 'float'],\n [36298]: ['2d', 'sint'],\n [36299]: ['3d', 'sint'],\n [36300]: ['cube', 'sint'],\n [36303]: ['2d-array', 'uint'],\n [36306]: ['2d', 'uint'],\n [36307]: ['3d', 'uint'],\n [36308]: ['cube', 'uint'],\n [36311]: ['2d-array', 'uint']\n};\nfunction getSamplerInfo(type) {\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// HELPERS\nfunction parseUniformName(name) {\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 // 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 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\nimport { assert, checkProps } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\nimport { getTypedArrayFromGLType } from \"./typed-array-utils.js\";\nconst DEFAULT_ACCESSOR_VALUES = {\n offset: 0,\n stride: 0,\n type: 5126,\n size: 1,\n divisor: 0,\n normalized: false,\n integer: false\n};\nconst PROP_CHECKS = {\n deprecatedProps: {\n instanced: 'divisor',\n isInstanced: 'divisor'\n }\n};\nexport class Accessor {\n offset;\n stride;\n type;\n size;\n divisor;\n normalized;\n integer;\n buffer;\n index;\n static getBytesPerElement(accessor) {\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 || 5126);\n return ArrayType.BYTES_PER_ELEMENT;\n }\n static getBytesPerVertex(accessor) {\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 || 5126);\n return ArrayType.BYTES_PER_ELEMENT * accessor.size;\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) {\n return new Accessor(...[DEFAULT_ACCESSOR_VALUES, ...accessors]); // Default values\n }\n constructor(...accessors) {\n accessors.forEach(accessor => this._assign(accessor)); // Merge in sequence\n Object.freeze(this);\n }\n toString() {\n return JSON.stringify(this);\n }\n // ACCESSORS\n // TODO - remove>\n get BYTES_PER_ELEMENT() {\n return Accessor.getBytesPerElement(this);\n }\n get BYTES_PER_VERTEX() {\n return Accessor.getBytesPerVertex(this);\n }\n // PRIVATE\n // eslint-disable-next-line complexity, max-statements\n _assign(props = {}) {\n props = checkProps('Accessor', props, PROP_CHECKS);\n if (props.type !== undefined) {\n this.type = props.type;\n // Auto-deduce integer type?\n if (props.type === 5124 || props.type === 5125) {\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 // INSTANCE DIVISOR\n if (props.divisor !== undefined) {\n this.divisor = props.divisor;\n }\n // Buffer is optional\n if (props.buffer !== undefined) {\n this.buffer = props.buffer;\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 }\n else {\n this.index = props.index;\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 if (this.offset === undefined)\n delete this.offset;\n if (this.stride === undefined)\n delete this.stride;\n if (this.type === undefined)\n delete this.type;\n if (this.size === undefined)\n delete this.size;\n if (this.divisor === undefined)\n delete this.divisor;\n if (this.normalized === undefined)\n delete this.normalized;\n if (this.integer === undefined)\n delete this.integer;\n if (this.buffer === undefined)\n delete this.buffer;\n if (this.index === undefined)\n delete this.index;\n return this;\n }\n}\n// TEST EXPORTS\nexport { DEFAULT_ACCESSOR_VALUES };\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { GL } from '@luma.gl/constants';\nconst ERR_TYPE_DEDUCTION = 'Failed to deduce GL constant from typed array';\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) {\n // If typed array, look up constructor\n const type = ArrayBuffer.isView(arrayOrType) ? arrayOrType.constructor : arrayOrType;\n switch (type) {\n case Float32Array:\n return 5126;\n case Uint16Array:\n return 5123;\n case Uint32Array:\n return 5125;\n case Uint8Array:\n return 5121;\n case Uint8ClampedArray:\n return 5121;\n case Int8Array:\n return 5120;\n case Int16Array:\n return 5122;\n case Int32Array:\n return 5124;\n default:\n throw new Error(ERR_TYPE_DEDUCTION);\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(glType, options) {\n const { clamped = true } = options || {};\n // Sorted in some order of likelihood to reduce amount of comparisons\n switch (glType) {\n case 5126:\n return Float32Array;\n case 5123:\n case 33635:\n case 32819:\n case 32820:\n return Uint16Array;\n case 5125:\n return Uint32Array;\n case 5121:\n return clamped ? Uint8ClampedArray : Uint8Array;\n case 5120:\n return Int8Array;\n case 5122:\n return Int16Array;\n case 5124:\n return Int32Array;\n default:\n throw new Error('Failed to deduce typed array type from GL constant');\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 const { data, width, height, bytesPerPixel = 4, temp } = options;\n const bytesPerRow = width * bytesPerPixel;\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}\nexport function scalePixels(options) {\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\nimport { GL } from '@luma.gl/constants';\n/** Check is uniform is of sampler type */\nexport function isSamplerUniform(type) {\n return SAMPLER_TYPES.includes(type);\n}\nconst SAMPLER_TYPES = [\n 35678,\n 35680,\n 35679,\n 35682,\n 36289,\n 36292,\n 36293,\n 36298,\n 36299,\n 36300,\n 36303,\n 36306,\n 36307,\n 36308,\n 36311\n];\n// Composite types table\nconst COMPOSITE_GL_TYPES = {\n [5126]: [5126, 1, 'float', 'f32', 'float32'],\n [35664]: [5126, 2, 'vec2', 'vec2<f32>', 'float32x2'],\n [35665]: [5126, 3, 'vec3', 'vec3<f32>', 'float32x3'],\n [35666]: [5126, 4, 'vec4', 'vec4<f32>', 'float32x4'],\n [5124]: [5124, 1, 'int', 'i32', 'sint32'],\n [35667]: [5124, 2, 'ivec2', 'vec2<i32>', 'sint32x2'],\n [35668]: [5124, 3, 'ivec3', 'vec3<i32>', 'sint32x3'],\n [35669]: [5124, 4, 'ivec4', 'vec4<i32>', 'sint32x4'],\n [5125]: [5125, 1, 'uint', 'u32', 'uint32'],\n [36294]: [5125, 2, 'uvec2', 'vec2<u32>', 'uint32x2'],\n [36295]: [5125, 3, 'uvec3', 'vec3<u32>', 'uint32x3'],\n [36296]: [5125, 4, 'uvec4', 'vec4<u32>', 'uint32x4'],\n [35670]: [5126, 1, 'bool', 'f32', 'float32'],\n [35671]: [5126, 2, 'bvec2', 'vec2<f32>', 'float32x2'],\n [35672]: [5126, 3, 'bvec3', 'vec3<f32>', 'float32x3'],\n [35673]: [5126, 4, 'bvec4', 'vec4<f32>', 'float32x4'],\n // TODO - are sizes/components below correct?\n [35674]: [5126, 8, 'mat2', 'mat2x2<f32>'], // 4\n [35685]: [5126, 8, 'mat2x3', 'mat2x3<f32>'], // 6\n [35686]: [5126, 8, 'mat2x4', 'mat2x4<f32>'], // 8\n [35687]: [5126, 12, 'mat3x2', 'mat3x2<f32>'], // 6\n [35675]: [5126, 12, 'mat3', 'mat3x3<f32>'], // 9\n [35688]: [5126, 12, 'mat3x4', 'mat3x4<f32>'], // 12\n [35689]: [5126, 16, 'mat4x2', 'mat4x2<f32>'], // 8\n [35690]: [5126, 16, 'mat4x3', 'mat4x3<f32>'], // 12\n [35676]: [5126, 16, 'mat4', 'mat4x4<f32>'] // 16\n};\n/** Decomposes a composite type (GL.VEC3) into a basic type (GL.FLOAT) and components (3) */\nexport function decodeGLUniformType(glUniformType) {\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/** Decomposes a composite type (GL.VEC3) into a basic type (GL.FLOAT) and components (3) */\nexport function decodeGLAttributeType(glAttributeType) {\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;\n return { attributeType, vertexFormat, components }; // , glType};\n}\n/** Decomposes a composite type GL.VEC3 into a basic type (GL.FLOAT) and components (3) */\nexport function decomposeCompositeGLDataType(compositeGLDataType) {\n const typeAndSize = COMPOSITE_GL_TYPES[compositeGLDataType];\n if (!typeAndSize) {\n return null;\n }\n const [type, components] = typeAndSize;\n return { type, components };\n}\nexport function getCompositeGLDataType(type, components) {\n switch (type) {\n case 5120:\n case 5121:\n case 5122:\n case 5123:\n type = 5126;\n break;\n default:\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\nimport { GL } from '@luma.gl/constants';\n/** Set a raw uniform (without type conversion and caching) */\n/* eslint-disable max-len */\nexport function setUniform(gl, location, type, value) {\n const gl2 = gl;\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 // prettier-ignore\n switch (type) {\n case 35678:\n case 35680:\n case 35679:\n case 35682:\n case 36289:\n case 36292:\n case 36293:\n case 36298:\n case 36299:\n case 36300:\n case 36303:\n case 36306:\n case 36307:\n case 36308:\n case 36311:\n if (typeof value !== 'number') {\n throw new Error('samplers must be set to integers');\n }\n return gl.uniform1i(location, value);\n case 5126: return gl.uniform1fv(location, arrayValue);\n case 35664: return gl.uniform2fv(location, arrayValue);\n case 35665: return gl.uniform3fv(location, arrayValue);\n case 35666: return gl.uniform4fv(location, arrayValue);\n case 5124: return gl.uniform1iv(location, arrayValue);\n case 35667: return gl.uniform2iv(location, arrayValue);\n case 35668: return gl.uniform3iv(location, arrayValue);\n case 35669: return gl.uniform4iv(location, arrayValue);\n case 35670: return gl.uniform1iv(location, arrayValue);\n case 35671: return gl.uniform2iv(location, arrayValue);\n case 35672: return gl.uniform3iv(location, arrayValue);\n case 35673: return gl.uniform4iv(location, arrayValue);\n // WEBGL2 - unsigned integers\n case 5125: return gl2.uniform1uiv(location, arrayValue, 1);\n case 36294: return gl2.uniform2uiv(location, arrayValue, 2);\n case 36295: return gl2.uniform3uiv(location, arrayValue, 3);\n case 36296: return gl2.uniform4uiv(location, arrayValue, 4);\n // WebGL2 - quadratic matrices\n // false: don't transpose the matrix\n case 35674: return gl.uniformMatrix2fv(location, false, arrayValue);\n case 35675: return gl.uniformMatrix3fv(location, false, arrayValue);\n case 35676: return gl.uniformMatrix4fv(location, false, arrayValue);\n // WebGL2 - rectangular matrices\n case 35685: return gl2.uniformMatrix2x3fv(location, false, arrayValue);\n case 35686: return gl2.uniformMatrix2x4fv(location, false, arrayValue);\n case 35687: return gl2.uniformMatrix3x2fv(location, false, arrayValue);\n case 35688: return gl2.uniformMatrix3x4fv(location, false, arrayValue);\n case 35689: return gl2.uniformMatrix4x2fv(location, false, arrayValue);\n case 35690: return gl2.uniformMatrix4x3fv(location, false, arrayValue);\n }\n throw new Error('Illegal uniform');\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { GL } from '@luma.gl/constants';\n// Counts the number of complete primitives given a number of vertices and a drawMode\nexport function getPrimitiveDrawMode(drawMode) {\n switch (drawMode) {\n case 0:\n return 0;\n case 1:\n return 1;\n case 3:\n return 1;\n case 2:\n return 1;\n case 4:\n return 4;\n case 5:\n return 4;\n case 6:\n return 4;\n default:\n throw new Error('drawMode');\n }\n}\n// Counts the number of complete \"primitives\" given a number of vertices and a drawMode\nexport function getPrimitiveCount(options) {\n const { drawMode, vertexCount } = options;\n switch (drawMode) {\n case 0:\n case 2:\n return vertexCount;\n case 1:\n return vertexCount / 2;\n case 3:\n return vertexCount - 1;\n case 4:\n return vertexCount / 3;\n case 5:\n case 6:\n return vertexCount - 2;\n default:\n throw new Error('drawMode');\n }\n}\n// Counts the number of vertices after splitting the vertex stream into separate \"primitives\"\nexport function getVertexCount(options) {\n const { drawMode, vertexCount } = options;\n const primitiveCount = getPrimitiveCount({ drawMode, vertexCount });\n switch (getPrimitiveDrawMode(drawMode)) {\n case 0:\n return primitiveCount;\n case 1:\n return primitiveCount * 2;\n case 4:\n return primitiveCount * 3;\n default:\n throw new Error('drawMode');\n }\n}\n/** Get the primitive type for draw */\nexport function getGLDrawMode(topology) {\n // prettier-ignore\n switch (topology) {\n case 'point-list': return 0;\n case 'line-list': return 1;\n case 'line-strip': return 3;\n case 'line-loop-webgl': return 2;\n case 'triangle-list': return 4;\n case 'triangle-strip': return 5;\n case 'triangle-fan-webgl': return 6;\n default: throw new Error(topology);\n }\n}\n/** Get the primitive type for transform feedback */\nexport function getGLPrimitive(topology) {\n // prettier-ignore\n switch (topology) {\n case 'point-list': return 0;\n case 'line-list': return 1;\n case 'line-strip': return 1;\n case 'line-loop-webgl': return 1;\n case 'triangle-list': return 4;\n case 'triangle-strip': return 4;\n case 'triangle-fan-webgl': return 4;\n default: throw new Error(topology);\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CommandEncoder } from '@luma.gl/core';\nimport { WEBGLCommandBuffer } from \"./webgl-command-buffer.js\";\nexport class WEBGLCommandEncoder extends CommandEncoder {\n device;\n commandBuffer;\n constructor(device, props) {\n super(device, props);\n this.device = device;\n this.commandBuffer = new WEBGLCommandBuffer(device);\n }\n destroy() { }\n finish() {\n this.commandBuffer.submitCommands();\n }\n // beginRenderPass(GPURenderPassDescriptor descriptor): GPURenderPassEncoder;\n // beginComputePass(optional GPUComputePassDescriptor descriptor = {}): GPUComputePassEncoder;\n // finish(options?: {id?: string}): GPUCommandBuffer;\n copyBufferToBuffer(options) {\n this.commandBuffer.commands.push({ name: 'copy-buffer-to-buffer', options });\n }\n copyBufferToTexture(options) {\n this.commandBuffer.commands.push({ name: 'copy-buffer-to-texture', options });\n }\n copyTextureToBuffer(options) {\n this.commandBuffer.commands.push({ name: 'copy-texture-to-buffer', options });\n }\n copyTextureToTexture(options) {\n this.commandBuffer.commands.push({ name: 'copy-texture-to-texture', options });\n }\n pushDebugGroup(groupLabel) { }\n popDebugGroup() { }\n insertDebugMarker(markerLabel) { }\n resolveQuerySet(querySet, destination, options) { }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CommandBuffer, Texture } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\nimport { WEBGLTexture } from \"./webgl-texture.js\";\nimport { getWebGLTextureParameters } from \"../converters/texture-formats.js\";\nfunction cast(value) {\n return value;\n}\nexport class WEBGLCommandBuffer extends CommandBuffer {\n device;\n commands = [];\n constructor(device) {\n super(device, {});\n this.device = device;\n }\n submitCommands(commands = 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 }\n }\n }\n}\nfunction _copyBufferToBuffer(device, options) {\n const source = cast(options.source);\n const destination = cast(options.destination);\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(36662, source.handle);\n device.gl.bindBuffer(36663, destination.handle);\n device.gl.copyBufferSubData(36662, 36663, options.sourceOffset ?? 0, options.destinationOffset ?? 0, options.size);\n device.gl.bindBuffer(36662, null);\n device.gl.bindBuffer(36663, null);\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, options) {\n throw new Error('Not implemented');\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, options) {\n const { \n /** Texture to copy to/from. */\n source, \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 /** Width to copy */\n width = options.source.width, \n /** Height to copy */\n height = options.source.height, 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 /** Destination buffer */\n destination, \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 &times; 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 } = options;\n // TODO - Not possible to read just stencil or depth part in WebGL?\n if (aspect !== 'all') {\n throw new Error('not supported');\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 // Asynchronous read (PIXEL_PACK_BUFFER) is WebGL2 only feature\n const { framebuffer, destroyFramebuffer } = getFramebuffer(source);\n let prevHandle;\n try {\n const webglBuffer = destination;\n const sourceWidth = width || framebuffer.width;\n const sourceHeight = height || framebuffer.height;\n const sourceParams = getWebGLTextureParameters(framebuffer.texture.props.format);\n const sourceFormat = sourceParams.dataFormat;\n const sourceType = sourceParams.type;\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 device.gl.bindBuffer(35051, webglBuffer.handle);\n // @ts-expect-error native bindFramebuffer is overridden by our state tracker\n prevHandle = device.gl.bindFramebuffer(36160, framebuffer.handle);\n device.gl.readPixels(origin[0], origin[1], sourceWidth, sourceHeight, sourceFormat, sourceType, byteOffset);\n }\n finally {\n device.gl.bindBuffer(35051, null);\n // prevHandle may be unassigned if the try block failed before binding\n if (prevHandle !== undefined) {\n device.gl.bindFramebuffer(36160, prevHandle);\n }\n if (destroyFramebuffer) {\n framebuffer.destroy();\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 * 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, options) {\n const { \n /** Texture to copy to/from. */\n source, \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 /** Defines the origin of the copy - the minimum corner of the texture sub-region to copy to. */\n destinationOrigin = [0, 0], \n /** Texture to copy to/from. */\n destination\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 let { width = options.destination.width, height = options.destination.height\n // depthOrArrayLayers = 0\n } = options;\n const { framebuffer, destroyFramebuffer } = getFramebuffer(source);\n const [sourceX, sourceY] = origin;\n const [destinationX, destinationY, destinationZ] = destinationOrigin;\n // @ts-expect-error native bindFramebuffer is overridden by our state tracker\n const prevHandle = device.gl.bindFramebuffer(36160, framebuffer.handle);\n // TODO - support gl.readBuffer (WebGL2 only)\n // const prevBuffer = gl.readBuffer(attachment);\n let texture = null;\n let textureTarget;\n if (destination instanceof WEBGLTexture) {\n texture = destination;\n width = Number.isFinite(width) ? width : texture.width;\n height = Number.isFinite(height) ? height : texture.height;\n texture.bind(0);\n textureTarget = texture.target;\n }\n else {\n throw new Error('invalid destination');\n }\n switch (textureTarget) {\n case 3553:\n case 34067:\n device.gl.copyTexSubImage2D(textureTarget, destinationMipLevel, destinationX, destinationY, sourceX, sourceY, width, height);\n break;\n case 35866:\n case 32879:\n device.gl.copyTexSubImage3D(textureTarget, destinationMipLevel, destinationX, destinationY, destinationZ, sourceX, sourceY, width, height);\n break;\n default:\n }\n if (texture) {\n texture.unbind();\n }\n device.gl.bindFramebuffer(36160, prevHandle);\n if (destroyFramebuffer) {\n framebuffer.destroy();\n }\n}\n// Returns number of components in a specific readPixels WebGL format\nexport function glFormatToComponents(format) {\n switch (format) {\n case 6406:\n case 33326:\n case 6403:\n return 1;\n case 33328:\n case 33319:\n return 2;\n case 6407:\n case 34837:\n return 3;\n case 6408:\n case 34836:\n return 4;\n // TODO: Add support for additional WebGL2 formats\n default:\n throw new Error('GLFormat');\n }\n}\n// Return byte count for given readPixels WebGL type\nexport function glTypeToBytes(type) {\n switch (type) {\n case 5121:\n return 1;\n case 33635:\n case 32819:\n case 32820:\n return 2;\n case 5126:\n return 4;\n // TODO: Add support for additional WebGL2 types\n default:\n throw new Error('GLType');\n }\n}\n// Helper methods\nfunction getFramebuffer(source) {\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 });\n return { framebuffer, destroyFramebuffer: true };\n }\n return { framebuffer: source, destroyFramebuffer: false };\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { VertexArray, getScratchArray, fillArray } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\nimport { getBrowser } from '@probe.gl/env';\nimport { getGLFromVertexType } from \"../converters/vertex-formats.js\";\n// import {getGLFromVertexType} from '../converters/vertex-formats';\n/** VertexArrayObject wrapper */\nexport class WEBGLVertexArray extends VertexArray {\n get [Symbol.toStringTag]() {\n return 'VertexArray';\n }\n device;\n handle;\n /** Attribute 0 buffer constant */\n buffer = null;\n bufferValue = null;\n /** * Attribute 0 can not be disable on most desktop OpenGL based browsers */\n static isConstantAttributeZeroSupported(device) {\n return getBrowser() === 'Chrome';\n }\n // Create a VertexArray\n constructor(device, props) {\n super(device, props);\n this.device = device;\n this.handle = this.device.gl.createVertexArray();\n }\n destroy() {\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 // Auto-delete elements?\n // return [this.elements];\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) {\n const buffer = indexBuffer;\n // Explicitly allow `null` to support clearing the index buffer\n if (buffer && buffer.glTarget !== 34963) {\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(34963, buffer ? buffer.handle : null);\n this.indexBuffer = buffer;\n // Unbind to prevent unintended changes to the VAO.\n this.device.gl.bindVertexArray(null);\n }\n /** Set a location in vertex attributes array to a buffer, enables the location, sets divisor */\n setBuffer(location, attributeBuffer) {\n const buffer = attributeBuffer;\n // Sanity check target\n if (buffer.glTarget === 34963) {\n throw new Error('Use .setIndexBuffer()');\n }\n const { size, type, stride, offset, normalized, integer, divisor } = this._getAccessor(location);\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(34962, buffer.handle);\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 }\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 // 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 this.attributes[location] = buffer;\n // Unbind to prevent unintended changes to the VAO.\n this.device.gl.bindVertexArray(null);\n }\n /** Set a location in vertex attributes array to a constant value, disables the location */\n setConstantWebGL(location, value) {\n this._enable(location, false);\n this.attributes[location] = value;\n }\n bindBeforeRender() {\n this.device.gl.bindVertexArray(this.handle);\n this._applyConstantAttributes();\n }\n unbindAfterRender() {\n // Unbind to prevent unintended changes to the VAO.\n this.device.gl.bindVertexArray(null);\n }\n // Internal methods\n /**\n * Constant attributes need to be reset before every draw call\n * Any attribute that is disabled in the current vertex array object\n * is read from the context's global constant value for that attribute location.\n * @note Constant attributes are only supported in WebGL, not in WebGPU\n */\n _applyConstantAttributes() {\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 * 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 // // 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 /** Get an accessor from the */\n _getAccessor(location) {\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 * 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 _enable(location, enable = true) {\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 if (enable || canDisableAttribute) {\n location = Number(location);\n this.device.gl.bindVertexArray(this.handle);\n if (enable) {\n this.device.gl.enableVertexAttribArray(location);\n }\n else {\n this.device.gl.disableVertexAttribArray(location);\n }\n this.device.gl.bindVertexArray(null);\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, value) {\n // Create buffer only when needed, and reuse it (avoids inflating buffer creation statistics)\n const constantValue = normalizeConstantArrayValue(value);\n const byteLength = constantValue.byteLength * elementCount;\n const length = constantValue.length * elementCount;\n if (this.buffer && byteLength !== this.buffer.byteLength) {\n throw new Error(`Buffer size is immutable, byte length ${byteLength} !== ${this.buffer.byteLength}.`);\n }\n let updateNeeded = !this.buffer;\n this.buffer = this.buffer || this.device.createBuffer({ byteLength });\n // Reallocate and update contents if needed\n updateNeeded = updateNeeded || !compareConstantArrayValues(constantValue, this.bufferValue);\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 return this.buffer;\n }\n}\n// HELPER FUNCTIONS\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) {\n if (Array.isArray(arrayValue)) {\n return new Float32Array(arrayValue);\n }\n return arrayValue;\n}\n/**\n *\n */\nfunction compareConstantArrayValues(v1, v2) {\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", "import { log, TransformFeedback } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\nimport { WEBGLBuffer } from \"../../index.js\";\nimport { getGLPrimitive } from \"../helpers/webgl-topology-utils.js\";\nexport class WEBGLTransformFeedback extends TransformFeedback {\n device;\n gl;\n handle;\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 layout;\n buffers = {};\n unusedBuffers = {};\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 _bound = false;\n constructor(device, props) {\n super(device, props);\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 if (props.buffers) {\n this.setBuffers(props.buffers);\n }\n Object.seal(this);\n }\n destroy() {\n this.gl.deleteTransformFeedback(this.handle);\n super.destroy();\n }\n begin(topology = 'point-list') {\n this.gl.bindTransformFeedback(36386, this.handle);\n if (this.bindOnUse) {\n this._bindBuffers();\n }\n this.gl.beginTransformFeedback(getGLPrimitive(topology));\n }\n end() {\n this.gl.endTransformFeedback();\n if (!this.bindOnUse) {\n this._unbindBuffers();\n }\n this.gl.bindTransformFeedback(36386, null);\n }\n // SUBCLASS\n setBuffers(buffers) {\n this.buffers = {};\n this.unusedBuffers = {};\n this.bind(() => {\n for (const bufferName in buffers) {\n this.setBuffer(bufferName, buffers[bufferName]);\n }\n });\n }\n setBuffer(locationOrName, bufferOrRange) {\n const location = this._getVaryingIndex(locationOrName);\n const { buffer, byteLength, byteOffset } = this._getBufferRange(bufferOrRange);\n if (location < 0) {\n this.unusedBuffers[locationOrName] = buffer;\n log.warn(`${this.id} unusedBuffers varying buffer ${locationOrName}`)();\n return;\n }\n this.buffers[location] = { buffer, byteLength, byteOffset };\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 getBuffer(locationOrName) {\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 bind(funcOrHandle = this.handle) {\n if (typeof funcOrHandle !== 'function') {\n this.gl.bindTransformFeedback(36386, funcOrHandle);\n return this;\n }\n let value;\n if (!this._bound) {\n this.gl.bindTransformFeedback(36386, this.handle);\n this._bound = true;\n value = funcOrHandle();\n this._bound = false;\n this.gl.bindTransformFeedback(36386, null);\n }\n else {\n value = funcOrHandle();\n }\n return value;\n }\n unbind() {\n this.bind(null);\n }\n // PRIVATE METHODS\n /** Extract offsets for bindBufferRange */\n _getBufferRange(bufferOrRange) {\n if (bufferOrRange instanceof WEBGLBuffer) {\n return { buffer: bufferOrRange, byteOffset: 0, byteLength: bufferOrRange.byteLength };\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 _getVaryingIndex(locationOrName) {\n if (isIndex(locationOrName)) {\n return Number(locationOrName);\n }\n for (const varying of this.layout.varyings) {\n if (locationOrName === varying.name) {\n return varying.location;\n }\n }\n return -1;\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 _bindBuffers() {\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 _unbindBuffers() {\n for (const bufferIndex in this.buffers) {\n this.gl.bindBufferBase(35982, Number(bufferIndex), null);\n }\n }\n _bindBuffer(index, buffer, byteOffset = 0, byteLength) {\n const handle = buffer && buffer.handle;\n if (!handle || byteLength === undefined) {\n this.gl.bindBufferBase(35982, index, handle);\n }\n else {\n this.gl.bindBufferRange(35982, index, handle, byteOffset, byteLength);\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) {\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 } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\n/**\n * Asynchronous queries for different kinds of information\n */\nexport class WEBGLQuerySet extends QuerySet {\n device;\n handle;\n target = null;\n _queryPending = false;\n _pollingPromise = null;\n get [Symbol.toStringTag]() {\n return 'Query';\n }\n // Create a query class\n constructor(device, props) {\n super(device, props);\n this.device = device;\n if (props.count > 1) {\n throw new Error('WebGL QuerySet can only have one value');\n }\n this.handle = this.device.gl.createQuery();\n Object.seal(this);\n }\n destroy() {\n this.device.gl.deleteQuery(this.handle);\n }\n // FOR RENDER PASS AND COMMAND ENCODER\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() {\n return this._begin(35007);\n }\n endTimestampQuery() {\n this._end();\n }\n // Shortcut for occlusion queries\n beginOcclusionQuery(options) {\n return this._begin(options?.conservative ? 36202 : 35887);\n }\n endOcclusionQuery() {\n this._end();\n }\n // Shortcut for transformFeedbackQuery\n beginTransformFeedbackQuery() {\n return this._begin(35976);\n }\n endTransformFeedbackQuery() {\n this._end();\n }\n async resolveQuery() {\n const value = await this.pollQuery();\n return [value];\n }\n // PRIVATE METHODS\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 _begin(target) {\n // Don't start a new query if one is already active.\n if (this._queryPending) {\n return;\n }\n this.target = target;\n this.device.gl.beginQuery(this.target, this.handle);\n return;\n }\n // ends the current query\n _end() {\n // Can't end a new query if the last one hasn't been resolved.\n if (this._queryPending) {\n return;\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 // Returns true if the query result is available\n isResultAvailable() {\n if (!this._queryPending) {\n return false;\n }\n const resultAvailable = this.device.gl.getQueryParameter(this.handle, 34919);\n if (resultAvailable) {\n this._queryPending = false;\n }\n return resultAvailable;\n }\n // Timing query is disjoint, i.e. results are invalid\n isTimerDisjoint() {\n return this.device.gl.getParameter(36795);\n }\n // Returns query result.\n getResult() {\n return this.device.gl.getQueryParameter(this.handle, 34918);\n }\n // Returns the query result, converted to milliseconds to match JavaScript conventions.\n getTimerMilliseconds() {\n return this.getResult() / 1e6;\n }\n // Polls the query\n pollQuery(limit = Number.POSITIVE_INFINITY) {\n if (this._pollingPromise) {\n return this._pollingPromise;\n }\n let counter = 0;\n this._pollingPromise = new Promise((resolve, reject) => {\n const poll = () => {\n if (this.isResultAvailable()) {\n resolve(this.getResult());\n this._pollingPromise = null;\n }\n else if (counter++ > limit) {\n reject('Timed out');\n this._pollingPromise = null;\n }\n else {\n requestAnimationFrame(poll);\n }\n };\n requestAnimationFrame(poll);\n });\n return this._pollingPromise;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { assert, Texture, Framebuffer } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\nimport { getGLTypeFromTypedArray, getTypedArrayFromGLType } from \"./typed-array-utils.js\";\nimport { glFormatToComponents, glTypeToBytes } from \"./format-utils.js\";\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(source, options) {\n const { sourceX = 0, sourceY = 0, sourceFormat = 6408, sourceAttachment = 36064 // TODO - support gl.readBuffer\n } = options || {};\n let { target = null, \n // following parameters are auto deduced if not provided\n sourceWidth, sourceHeight, sourceType } = options || {};\n const { framebuffer, deleteFramebuffer } = getFramebuffer(source);\n assert(framebuffer);\n const { gl, handle } = framebuffer;\n sourceWidth = sourceWidth || framebuffer.width;\n sourceHeight = sourceHeight || framebuffer.height;\n // TODO - Set and unset gl.readBuffer\n // if (sourceAttachment === GL.COLOR_ATTACHMENT0 && handle === null) {\n // sourceAttachment = GL.FRONT;\n // }\n const attachment = sourceAttachment - 36064;\n // assert(attachments[sourceAttachment]);\n // Deduce the type from color attachment if not provided.\n sourceType =\n sourceType ||\n framebuffer.colorAttachments[attachment]?.texture?.type || 5121;\n // Deduce type and allocated pixelArray if needed\n target = getPixelArray(target, sourceType, sourceFormat, sourceWidth, sourceHeight);\n // Pixel array available, if necessary, deduce type from it.\n sourceType = sourceType || getGLTypeFromTypedArray(target);\n const prevHandle = gl.bindFramebuffer(36160, handle);\n gl.readPixels(sourceX, sourceY, sourceWidth, sourceHeight, sourceFormat, sourceType, target);\n // @ts-expect-error\n gl.bindFramebuffer(36160, prevHandle || null);\n if (deleteFramebuffer) {\n framebuffer.destroy();\n }\n return target;\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(source, options) {\n const { target, sourceX = 0, sourceY = 0, sourceFormat = 6408, targetByteOffset = 0 } = 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 // Asynchronous read (PIXEL_PACK_BUFFER) is WebGL2 only feature\n const webglFramebuffer = framebuffer;\n // deduce type if not available.\n sourceType = sourceType || 5121;\n let webglBufferTarget = target;\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 // TODO(donmccurdy): Do we have tests to confirm this is working?\n const commandEncoder = source.device.createCommandEncoder();\n commandEncoder.copyTextureToBuffer({\n source: source,\n width: sourceWidth,\n height: sourceHeight,\n origin: [sourceX, sourceY],\n destination: webglBufferTarget,\n byteOffset: targetByteOffset\n });\n commandEncoder.destroy();\n if (deleteFramebuffer) {\n framebuffer.destroy();\n }\n return webglBufferTarget;\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(source, target, options) {\n const { sourceX = 0, sourceY = 0, \n // attachment = GL.COLOR_ATTACHMENT0, // TODO - support gl.readBuffer\n targetMipmaplevel = 0, targetInternalFormat = 6408 } = options || {};\n let { targetX, targetY, targetZ, width, // defaults to target width\n height // defaults to target height\n } = options || {};\n const { framebuffer, deleteFramebuffer } = getFramebuffer(source);\n assert(framebuffer);\n const webglFramebuffer = framebuffer;\n const { device, handle } = webglFramebuffer;\n const isSubCopy = 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(36160, handle);\n // TODO - support gl.readBuffer (WebGL2 only)\n // const prevBuffer = gl.readBuffer(attachment);\n assert(target);\n let texture = null;\n let textureTarget;\n if (target instanceof Texture) {\n texture = target;\n width = Number.isFinite(width) ? width : texture.width;\n height = Number.isFinite(height) ? height : texture.height;\n texture.bind(0);\n textureTarget = texture.target;\n }\n else {\n textureTarget = target;\n }\n if (!isSubCopy) {\n device.gl.copyTexImage2D(textureTarget, targetMipmaplevel, targetInternalFormat, sourceX, sourceY, width, height, 0 /* border must be 0 */);\n }\n else {\n switch (textureTarget) {\n case 3553:\n case 34067:\n device.gl.copyTexSubImage2D(textureTarget, targetMipmaplevel, targetX, targetY, sourceX, sourceY, width, height);\n break;\n case 35866:\n case 32879:\n device.gl.copyTexSubImage3D(textureTarget, targetMipmaplevel, targetX, targetY, targetZ, sourceX, sourceY, width, height);\n break;\n default:\n }\n }\n if (texture) {\n texture.unbind();\n }\n // @ts-expect-error\n device.gl.bindFramebuffer(36160, prevHandle || null);\n if (deleteFramebuffer) {\n framebuffer.destroy();\n }\n return texture;\n}\nfunction getFramebuffer(source) {\n if (!(source instanceof Framebuffer)) {\n return { framebuffer: toFramebuffer(source), deleteFramebuffer: true };\n }\n return { framebuffer: source, deleteFramebuffer: false };\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, props) {\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;\n}\nfunction getPixelArray(pixelArray, type, format, width, height) {\n if (pixelArray) {\n return pixelArray;\n }\n // Allocate pixel array if not already available, using supplied type\n type = type || 5121;\n const ArrayType = getTypedArrayFromGLType(type, { clamped: false });\n const components = glFormatToComponents(format);\n // TODO - check for composite type (components = 1).\n return new ArrayType(width * height * components);\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { assert } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\n// Returns number of components in a specific readPixels WebGL format\nexport function glFormatToComponents(format) {\n switch (format) {\n case 6406:\n case 33326:\n case 6403:\n return 1;\n case 33328:\n case 33319:\n return 2;\n case 6407:\n case 34837:\n return 3;\n case 6408:\n case 34836:\n return 4;\n // TODO: Add support for additional WebGL2 formats\n default:\n assert(false);\n return 0;\n }\n}\n// Return byte count for given readPixels WebGL type\nexport function glTypeToBytes(type) {\n switch (type) {\n case 5121:\n return 1;\n case 33635:\n case 32819:\n case 32820:\n return 2;\n case 5126:\n return 4;\n // TODO: Add support for additional WebGL2 types\n default:\n assert(false);\n return 0;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { assert } from '@luma.gl/core';\nimport { withGLParameters } from \"../context/state-tracker/with-parameters.js\";\n// Should collapse during minification\nconst GL_DEPTH_BUFFER_BIT = 0x00000100;\nconst GL_STENCIL_BUFFER_BIT = 0x00000400;\nconst GL_COLOR_BUFFER_BIT = 0x00004000;\nconst GL_COLOR = 0x1800;\nconst GL_DEPTH = 0x1801;\nconst GL_STENCIL = 0x1802;\nconst GL_DEPTH_STENCIL = 0x84f9;\n// Should disappear if asserts are removed\nconst ERR_ARGUMENTS = 'clear: bad arguments';\n/**\n * Optionally clears depth, color and stencil buffers\n * @deprecated Set clear color when creating a RenderPass.\n */\nexport function clear(device, options) {\n const { framebuffer = null, color = null, depth = null, stencil = null } = options || {};\n const parameters = {};\n if (framebuffer) {\n parameters.framebuffer = framebuffer;\n }\n let clearFlags = 0;\n if (color) {\n clearFlags |= GL_COLOR_BUFFER_BIT;\n if (color !== true) {\n parameters.clearColor = color;\n }\n }\n if (depth) {\n clearFlags |= GL_DEPTH_BUFFER_BIT;\n if (depth !== true) {\n parameters.clearDepth = depth;\n }\n }\n if (stencil) {\n clearFlags |= GL_STENCIL_BUFFER_BIT;\n if (depth !== true) {\n parameters.clearStencil = depth;\n }\n }\n assert(clearFlags !== 0, ERR_ARGUMENTS);\n // Temporarily set any clear \"colors\" and call clear\n const gl = device.gl;\n withGLParameters(gl, parameters, () => {\n gl.clear(clearFlags);\n });\n}\n/**\n * WebGL2 - clear a specific drawing buffer\n * @deprecated Set clear color when creating a RenderPass\n */\nexport function clearBuffer(device, options) {\n const { framebuffer = null, buffer = GL_COLOR, drawBuffer = 0, value = [0, 0, 0, 0] } = options || {};\n const gl = device.gl;\n withGLParameters(gl, { framebuffer }, () => {\n // Method selection per OpenGL ES 3 docs\n switch (buffer) {\n case GL_COLOR:\n switch (value.constructor) {\n case Int32Array:\n gl.clearBufferiv(buffer, drawBuffer, value);\n break;\n case Uint32Array:\n gl.clearBufferuiv(buffer, drawBuffer, value);\n break;\n case Float32Array:\n default:\n gl.clearBufferfv(buffer, drawBuffer, value);\n }\n break;\n case GL_DEPTH:\n gl.clearBufferfv(GL_DEPTH, 0, [value]);\n break;\n case GL_STENCIL:\n gl.clearBufferiv(GL_STENCIL, 0, [value]);\n break;\n case GL_DEPTH_STENCIL:\n const [depth, stencil] = value;\n gl.clearBufferfi(GL_DEPTH_STENCIL, 0, depth, stencil);\n break;\n default:\n assert(false, ERR_ARGUMENTS);\n }\n });\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { Resource, uid, stubRemovedMethods } from '@luma.gl/core';\nconst ERR_RESOURCE_METHOD_UNDEFINED = 'Resource subclass must define virtual methods';\n/**\n * Base class for WebGL object wrappers\n */\nexport class WebGLResource extends Resource {\n device;\n gl;\n gl2;\n _handle;\n _bound = false;\n // Only meaningful for resources that allocate GPU memory\n byteLength = 0;\n constructor(device, props, defaultProps) {\n super(device, props, defaultProps);\n this.device = device;\n const gl = this.device.gl;\n // extends\n const { id } = props || {};\n this.gl = gl;\n this.gl2 = gl;\n this.id = id || uid(this.constructor.name);\n // Set the handle\n // If handle was provided, use it, otherwise create a new handle\n // TODO - Stores the handle with context loss information\n // this.glCount = glGetContextLossCount(this.gl);\n // Default VertexArray needs to be created with null handle, so compare against undefined\n this._handle = props?.handle;\n if (this._handle === undefined) {\n this._handle = this._createHandle();\n }\n this.byteLength = 0;\n }\n toString() {\n return `${this.constructor.name}(${this.id})`;\n }\n get handle() {\n // TODO - Add context loss handling\n // Will regenerate and reinitialize the handle if necessary\n // const glCount = glGetContextLossCount(this.gl);\n // if (this.glCount !== glCount) {\n // this._handle = this._createHandle(this.props);\n // this._glCount = glCount;\n // // Reinitialize object\n // this.initialize(this.props);\n // }\n return this._handle;\n }\n delete({ deleteChildren = false } = {}) {\n // Delete this object, and get refs to any children\n // @ts-expect-error\n const children = this._handle && this._deleteHandle(this._handle);\n if (this._handle) {\n this.removeStats();\n }\n this._handle = null;\n // Optionally, recursively delete the children\n // @ts-expect-error\n if (children && deleteChildren) {\n // @ts-expect-error\n children.filter(Boolean).forEach(child => child.destroy());\n }\n return this;\n }\n bind(funcOrHandle = this.handle) {\n if (typeof funcOrHandle !== 'function') {\n this._bindHandle(funcOrHandle);\n return this;\n }\n let value;\n if (!this._bound) {\n this._bindHandle(this.handle);\n this._bound = true;\n value = funcOrHandle();\n this._bound = false;\n this._bindHandle(null);\n }\n else {\n value = funcOrHandle();\n }\n return value;\n }\n unbind() {\n this.bind(null);\n }\n // Install stubs for removed methods\n stubRemovedMethods(className, version, methodNames) {\n return stubRemovedMethods(this, className, version, methodNames);\n }\n // PUBLIC VIRTUAL METHODS\n initialize(props) { }\n // PROTECTED METHODS - These must be overridden by subclass\n _createHandle() {\n throw new Error(ERR_RESOURCE_METHOD_UNDEFINED);\n }\n _deleteHandle() {\n throw new Error(ERR_RESOURCE_METHOD_UNDEFINED);\n }\n _bindHandle(handle) {\n throw new Error(ERR_RESOURCE_METHOD_UNDEFINED);\n }\n _getOptsFromHandle() {\n throw new Error(ERR_RESOURCE_METHOD_UNDEFINED);\n }\n _getParameter(pname, props) {\n throw new Error(ERR_RESOURCE_METHOD_UNDEFINED);\n }\n _setParameter(pname, value) {\n throw new Error(ERR_RESOURCE_METHOD_UNDEFINED);\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { assert } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\nimport { WebGLResource } from \"./webgl-resource.js\";\nimport { isRenderbufferFormatSupported } from \"../converters/texture-formats.js\";\nimport { convertTextureFormatToGL, getTextureFormatBytesPerPixel } from \"../converters/texture-formats.js\";\n/**\n * Renderbuffers are GPU objects that contain images.\n * In contrast to Textures they are optimized for use as render targets, with Framebuffers.\n * while Textures may not be, and are the logical choice when\n * you do not need to sample (i.e. in a post-pass shader)\n * from the produced image. If you need to resample\n * (such as when reading depth back in a second shader pass),\n * use Textures instead.\n * Renderbuffer objects also natively accommodate Multisampling (MSAA).\n */\nexport class WEBGLRenderbuffer extends WebGLResource {\n static defaultProps = {\n id: undefined,\n handle: undefined,\n userData: undefined,\n format: undefined, // 'depth16unorm'\n width: 1,\n height: 1,\n samples: 0\n };\n get [Symbol.toStringTag]() {\n return 'Renderbuffer';\n }\n get width() {\n return this.props.width;\n }\n get height() {\n return this.props.height;\n }\n get format() {\n return this.props.format;\n }\n get samples() {\n return this.props.samples;\n }\n get attachment() {\n return;\n }\n /** WebGL format constant */\n glFormat;\n static isTextureFormatSupported(device, format) {\n return isRenderbufferFormatSupported(device.gl, format, device._extensions);\n }\n constructor(device, props) {\n // TODO - remove temporary sanity check\n if (typeof props.format === 'number') {\n throw new Error('Renderbuffer');\n }\n super(device, props, WEBGLRenderbuffer.defaultProps);\n this.glFormat = convertTextureFormatToGL(this.props.format);\n this._initialize(this.props);\n }\n resize(size) {\n // Don't resize if width/height haven't changed\n if (size.width !== this.width || size.height !== this.height) {\n Object.assign(this.props, { ...size, format: this.format, samples: this.samples });\n this._initialize(this.props);\n }\n }\n // PRIVATE METHODS\n /** Creates and initializes a renderbuffer object's data store */\n _initialize(props) {\n const { format, width, height, samples } = props;\n assert(format, 'Needs format');\n this.trackDeallocatedMemory();\n this.gl.bindRenderbuffer(36161, this.handle);\n if (samples !== 0) {\n this.gl.renderbufferStorageMultisample(36161, samples, this.glFormat, width, height);\n }\n else {\n this.gl.renderbufferStorage(36161, this.glFormat, width, height);\n }\n this.gl.bindRenderbuffer(36161, null);\n this.trackAllocatedMemory(width * height * (samples || 1) * getTextureFormatBytesPerPixel(this.format));\n }\n // RESOURCE IMPLEMENTATION\n _createHandle() {\n return this.gl.createRenderbuffer();\n }\n _deleteHandle() {\n this.gl.deleteRenderbuffer(this.handle);\n this.trackDeallocatedMemory();\n }\n _bindHandle(handle) {\n this.gl.bindRenderbuffer(36161, handle);\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["import_core", "hint", "log", "enable", "import_constants", "import_core", "import_core", "import_constants", "import_constants", "entry", "import_core", "import_constants", "import_core", "import_core", "import_constants", "import_core", "import_constants", "isObjectEmpty", "import_constants", "import_core", "import_constants", "import_core", "import_constants", "import_core", "import_constants", "import_core", "import_core", "import_core", "import_constants", "GLEnum", "message", "import_core", "import_constants", "messageType", "message", "log", "source", "import_core", "import_constants", "import_core", "import_constants", "import_constants", "import_core", "import_constants", "import_constants", "import_constants", "uniforms", "isArray", "import_constants", "import_constants", "binding", "status", "import_core", "import_core", "import_constants", "cast", "import_core", "import_constants", "import_env", "enable", "import_core", "import_constants", "import_core", "import_constants", "import_core", "import_constants", "import_core", "import_constants", "getFramebuffer", "getFramebuffer", "import_core", "GL_DEPTH_BUFFER_BIT", "GL_STENCIL_BUFFER_BIT", "GL_COLOR_BUFFER_BIT", "GL_COLOR_BUFFER_BIT", "GL_DEPTH_BUFFER_BIT", "GL_STENCIL_BUFFER_BIT", "LOG_LEVEL", "message", "_a", "enable", "compareConstantArrayValues", "import_core", "import_core", "import_constants"]
3
+ "sources": ["index.js", "adapter/webgl-device.js", "context/parameters/webgl-parameter-tables.js", "context/parameters/unified-parameter-api.js", "context/state-tracker/deep-array-equal.js", "context/state-tracker/track-context-state.js", "context/helpers/create-browser-context.js", "adapter/device-helpers/webgl-device-info.js", "context/helpers/webgl-extensions.js", "adapter/device-helpers/webgl-device-features.js", "adapter/converters/texture-formats.js", "adapter/converters/vertex-formats.js", "adapter/device-helpers/webgl-device-limits.js", "adapter/webgl-canvas-context.js", "adapter/resources/webgl-framebuffer.js", "adapter/resources/webgl-texture.js", "context/state-tracker/with-parameters.js", "adapter/converters/sampler-parameters.js", "adapter/converters/device-parameters.js", "adapter/resources/webgl-sampler.js", "adapter/resources/webgl-texture-view.js", "adapter/helpers/webgl-texture-utils.js", "context/debug/spector.js", "utils/load-script.js", "context/debug/webgl-developer-tools.js", "adapter/resources/webgl-buffer.js", "adapter/resources/webgl-shader.js", "adapter/helpers/parse-shader-compiler-log.js", "adapter/resources/webgl-render-pass.js", "adapter/resources/webgl-render-pipeline.js", "adapter/helpers/get-shader-layout.js", "classic/accessor.js", "classic/typed-array-utils.js", "adapter/helpers/decode-webgl-types.js", "adapter/helpers/set-uniform.js", "utils/split-uniforms-and-bindings.js", "adapter/helpers/webgl-topology-utils.js", "adapter/resources/webgl-command-encoder.js", "adapter/resources/webgl-command-buffer.js", "adapter/resources/webgl-vertex-array.js", "utils/fill-array.js", "adapter/resources/webgl-transform-feedback.js", "adapter/resources/webgl-query-set.js", "classic/copy-and-blit.js", "classic/format-utils.js", "classic/clear.js"],
4
+ "sourcesContent": ["// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n// WebGL adapter classes\nexport { WebGLDevice } from \"./adapter/webgl-device.js\";\nexport { WebGLCanvasContext } from \"./adapter/webgl-canvas-context.js\";\n// WebGL Resource classes\nexport { WEBGLBuffer } from \"./adapter/resources/webgl-buffer.js\";\nexport { WEBGLTexture } from \"./adapter/resources/webgl-texture.js\";\n// export {WEBGLExternalTexture} from './adapter/resources/webgl-external-texture';\nexport { WEBGLShader } from \"./adapter/resources/webgl-shader.js\";\nexport { WEBGLSampler } from \"./adapter/resources/webgl-sampler.js\";\nexport { WEBGLFramebuffer } from \"./adapter/resources/webgl-framebuffer.js\";\nexport { WEBGLRenderPipeline } from \"./adapter/resources/webgl-render-pipeline.js\";\n// export {WEBGLComputePipeline} from './adapter/resources/webgl-compute-pipeline';\nexport { WEBGLCommandEncoder } from \"./adapter/resources/webgl-command-encoder.js\";\nexport { WEBGLRenderPass } from \"./adapter/resources/webgl-render-pass.js\";\n// export {WEBGLComputePass} from './adapter/resources/webgl-compute-pass';\nexport { WEBGLVertexArray } from \"./adapter/resources/webgl-vertex-array.js\";\n// WebGL adapter classes\nexport { WEBGLTransformFeedback } from \"./adapter/resources/webgl-transform-feedback.js\";\n// WebGL adapter classes\nexport { Accessor } from \"./classic/accessor.js\";\n// Unified parameter API\nexport { setDeviceParameters, withDeviceParameters } from \"./adapter/converters/device-parameters.js\";\n// HELPERS - EXPERIMENTAL\nexport { getShaderLayout } from \"./adapter/helpers/get-shader-layout.js\";\n// TEST EXPORTS\nexport { TEXTURE_FORMATS as _TEXTURE_FORMATS } from \"./adapter/converters/texture-formats.js\";\n// DEPRECATED TEST EXPORTS\n// State tracking\nexport { trackContextState, pushContextState, popContextState } from \"./context/state-tracker/track-context-state.js\";\nexport { resetGLParameters, setGLParameters, getGLParameters } from \"./context/parameters/unified-parameter-api.js\";\nexport { withGLParameters } from \"./context/state-tracker/with-parameters.js\";\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { Device, CanvasContext, log } from '@luma.gl/core';\nimport { popContextState, pushContextState, trackContextState } from \"../context/state-tracker/track-context-state.js\";\nimport { createBrowserContext } from \"../context/helpers/create-browser-context.js\";\nimport { getDeviceInfo } from \"./device-helpers/webgl-device-info.js\";\nimport { WebGLDeviceFeatures } from \"./device-helpers/webgl-device-features.js\";\nimport { WebGLDeviceLimits } from \"./device-helpers/webgl-device-limits.js\";\nimport { WebGLCanvasContext } from \"./webgl-canvas-context.js\";\nimport { loadSpectorJS, initializeSpectorJS } from \"../context/debug/spector.js\";\nimport { loadWebGLDeveloperTools, makeDebugContext } from \"../context/debug/webgl-developer-tools.js\";\nimport { isTextureFormatSupported, isTextureFormatRenderable, isTextureFormatFilterable } from \"./converters/texture-formats.js\";\nimport { WEBGLBuffer } from \"./resources/webgl-buffer.js\";\nimport { WEBGLShader } from \"./resources/webgl-shader.js\";\nimport { WEBGLSampler } from \"./resources/webgl-sampler.js\";\nimport { WEBGLTexture } from \"./resources/webgl-texture.js\";\nimport { WEBGLFramebuffer } from \"./resources/webgl-framebuffer.js\";\nimport { WEBGLRenderPass } from \"./resources/webgl-render-pass.js\";\nimport { WEBGLRenderPipeline } from \"./resources/webgl-render-pipeline.js\";\nimport { WEBGLCommandEncoder } from \"./resources/webgl-command-encoder.js\";\nimport { WEBGLVertexArray } from \"./resources/webgl-vertex-array.js\";\nimport { WEBGLTransformFeedback } from \"./resources/webgl-transform-feedback.js\";\nimport { WEBGLQuerySet } from \"./resources/webgl-query-set.js\";\nimport { readPixelsToArray, readPixelsToBuffer } from \"../classic/copy-and-blit.js\";\nimport { setGLParameters, getGLParameters, resetGLParameters } from \"../context/parameters/unified-parameter-api.js\";\nimport { withGLParameters } from \"../context/state-tracker/with-parameters.js\";\nimport { clear } from \"../classic/clear.js\";\nimport { getWebGLExtension } from \"../context/helpers/webgl-extensions.js\";\nconst LOG_LEVEL = 1;\n/** WebGPU style Device API for a WebGL context */\nexport class WebGLDevice extends Device {\n //\n // Public `Device` API\n //\n /** type of this device */\n static type = 'webgl';\n /** type of this device */\n type = 'webgl';\n /** The underlying WebGL context */\n handle;\n features;\n limits;\n info;\n canvasContext;\n lost;\n _resolveContextLost;\n //\n // Static methods, expected to be present by `luma.createDevice()`\n //\n /** Check if WebGL 2 is available */\n static isSupported() {\n return typeof WebGL2RenderingContext !== 'undefined';\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 static attach(gl) {\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;\n }\n if (!isWebGL(gl)) {\n throw new Error('Invalid WebGL2RenderingContext');\n }\n return new WebGLDevice({ gl: gl });\n }\n static async create(props = {}) {\n log.groupCollapsed(LOG_LEVEL, 'WebGLDevice created')();\n const promises = [];\n // Load webgl and spector debug scripts from CDN if requested\n if (props.debug) {\n promises.push(loadWebGLDeveloperTools());\n }\n if (props.spector) {\n promises.push(loadSpectorJS());\n }\n // Wait for page to load: if canvas is a string we need to query the DOM for the canvas element.\n // We only wait when props.canvas is string to avoids setting the global page onload callback unless necessary.\n if (typeof props.canvas === 'string') {\n promises.push(CanvasContext.pageLoaded);\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 log.probe(LOG_LEVEL + 1, 'DOM is loaded')();\n // @ts-expect-error\n if (props.gl?.device) {\n log.warn('reattaching existing device')();\n return WebGLDevice.attach(props.gl);\n }\n const device = new WebGLDevice(props);\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 log.groupEnd(LOG_LEVEL)();\n return device;\n }\n //\n // Public API\n //\n constructor(props) {\n super({ ...props, id: props.id || 'webgl-device' });\n // If attaching to an already attached context, return the attached device\n // @ts-expect-error device is attached to context\n const device = props.gl?.device;\n if (device) {\n throw new Error(`WebGL context already attached to device ${device.id}`);\n }\n // Create and instrument context\n const canvas = props.gl?.canvas || props.canvas;\n this.canvasContext = new WebGLCanvasContext(this, { ...props, canvas });\n this.lost = new Promise(resolve => {\n this._resolveContextLost = resolve;\n });\n let gl = props.gl || null;\n gl ||= createBrowserContext(this.canvasContext.canvas, {\n ...props,\n onContextLost: (event) => this._resolveContextLost?.({\n reason: 'destroyed',\n message: 'Entered sleep mode, or too many apps or browser tabs are using the GPU.'\n })\n });\n if (!gl) {\n throw new Error('WebGL context creation failed');\n }\n this.handle = gl;\n this.gl = gl;\n this.gl.device = this; // Update GL context: Link webgl context back to device\n this.gl._version = 2; // Update GL context: Store WebGL version field on gl context (HACK to identify debug contexts)\n // luma Device fields\n this.info = getDeviceInfo(this.gl, this._extensions);\n this.limits = new WebGLDeviceLimits(this.gl);\n this.features = new WebGLDeviceFeatures(this.gl, this._extensions, this.props.disabledFeatures);\n if (this.props.initalizeFeatures) {\n this.features.initializeFeatures();\n }\n this.canvasContext.resize();\n // Install context state tracking\n // @ts-expect-error - hidden parameters\n const { enable = true, copyState = false } = props;\n trackContextState(this.gl, {\n enable,\n copyState,\n log: (...args) => log.log(1, ...args)()\n });\n // DEBUG contexts: Add debug instrumentation to the context, force log level to at least 1\n if (props.debug) {\n this.gl = makeDebugContext(this.gl, { ...props, throwOnError: true });\n this.debug = true;\n log.level = Math.max(log.level, 1);\n log.warn('WebGL debug mode activated. Performance reduced.')();\n }\n if (props.spector) {\n this.spectorJS = initializeSpectorJS({ ...this.props, canvas: this.handle.canvas });\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() { }\n get isLost() {\n return this.gl.isContextLost();\n }\n getSize() {\n return [this.gl.drawingBufferWidth, this.gl.drawingBufferHeight];\n }\n isTextureFormatSupported(format) {\n return isTextureFormatSupported(this.gl, format, this._extensions);\n }\n isTextureFormatFilterable(format) {\n return isTextureFormatFilterable(this.gl, format, this._extensions);\n }\n isTextureFormatRenderable(format) {\n return isTextureFormatRenderable(this.gl, format, this._extensions);\n }\n // IMPLEMENTATION OF ABSTRACT DEVICE\n createCanvasContext(props) {\n throw new Error('WebGL only supports a single canvas');\n }\n createBuffer(props) {\n const newProps = this._getBufferProps(props);\n return new WEBGLBuffer(this, newProps);\n }\n // _createTexture(props: TextureProps): WEBGLTexture {\n _createTexture(props) {\n return new WEBGLTexture(this, props);\n }\n createExternalTexture(props) {\n throw new Error('createExternalTexture() not implemented'); // return new Program(props);\n }\n createSampler(props) {\n return new WEBGLSampler(this, props);\n }\n createShader(props) {\n return new WEBGLShader(this, props);\n }\n createFramebuffer(props) {\n return new WEBGLFramebuffer(this, props);\n }\n createVertexArray(props) {\n return new WEBGLVertexArray(this, props);\n }\n createTransformFeedback(props) {\n return new WEBGLTransformFeedback(this, props);\n }\n createQuerySet(props) {\n return new WEBGLQuerySet(this, props);\n }\n createRenderPipeline(props) {\n return new WEBGLRenderPipeline(this, props);\n }\n beginRenderPass(props) {\n return new WEBGLRenderPass(this, props);\n }\n createComputePipeline(props) {\n throw new Error('ComputePipeline not supported in WebGL');\n }\n beginComputePass(props) {\n throw new Error('ComputePass not supported in WebGL');\n }\n renderPass = null;\n createCommandEncoder(props = {}) {\n return new WEBGLCommandEncoder(this, props);\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() {\n this.renderPass?.end();\n this.renderPass = null;\n // this.canvasContext.commit();\n }\n //\n // TEMPORARY HACKS - will be removed in v9.1\n //\n /** @deprecated - should use command encoder */\n readPixelsToArrayWebGL(source, options) {\n return readPixelsToArray(source, options);\n }\n /** @deprecated - should use command encoder */\n readPixelsToBufferWebGL(source, options) {\n return readPixelsToBuffer(source, options);\n }\n setParametersWebGL(parameters) {\n setGLParameters(this.gl, parameters);\n }\n getParametersWebGL(parameters) {\n return getGLParameters(this.gl, parameters);\n }\n withParametersWebGL(parameters, func) {\n return withGLParameters(this.gl, parameters, func);\n }\n clearWebGL(options) {\n clear(this, options);\n }\n resetWebGL() {\n log.warn('WebGLDevice.resetWebGL is deprecated, use only for debugging')();\n resetGLParameters(this.gl);\n }\n //\n // WebGL-only API (not part of `Device` API)\n //\n /** WebGL2 context. */\n gl;\n debug = false;\n /** State used by luma.gl classes: TODO - move to canvasContext*/\n _canvasSizeInfo = { clientWidth: 0, clientHeight: 0, devicePixelRatio: 1 };\n /** State used by luma.gl classes - TODO - not used? */\n _extensions = {};\n _polyfilled = false;\n /** Instance of Spector.js (if initialized) */\n spectorJS;\n /**\n * Triggers device (or WebGL context) loss.\n * @note primarily intended for testing how application reacts to device loss\n */\n loseDevice() {\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 /** Save current WebGL context state onto an internal stack */\n pushState() {\n pushContextState(this.gl);\n }\n /** Restores previously saved context state */\n popState() {\n popContextState(this.gl);\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, props) {\n // @ts-expect-error\n // eslint-disable-next-line camelcase\n handle.__SPECTOR_Metadata = props;\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, gl) {\n // @ts-ignore expect-error depends on settings\n gl = gl || this.gl2 || this.gl;\n const number = Number(value);\n for (const key in gl) {\n // @ts-ignore expect-error depends on settings\n if (gl[key] === number) {\n return `GL.${key}`;\n }\n }\n // No constant found. Stringify the value and return it.\n return String(value);\n }\n /** Store constants */\n _constants;\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, constant) {\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(1, `setConstantAttributeWebGL(${location}) could have been skipped, value unchanged`)();\n }\n this._constants[location] = constant;\n switch (constant.constructor) {\n case Float32Array:\n setConstantFloatArray(this, location, constant);\n break;\n case Int32Array:\n setConstantIntArray(this, location, constant);\n break;\n case Uint32Array:\n setConstantUintArray(this, location, constant);\n break;\n default:\n throw new Error('constant');\n }\n }\n /** Ensure extensions are only requested once */\n getExtension(name) {\n getWebGLExtension(this.gl, name, this._extensions);\n return this._extensions;\n }\n}\n/** Check if supplied parameter is a WebGL2RenderingContext */\nfunction isWebGL(gl) {\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/** Set constant float array attribute */\nfunction setConstantFloatArray(device, location, array) {\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/** Set constant signed int array attribute */\nfunction setConstantIntArray(device, location, array) {\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/** Set constant unsigned int array attribute */\nfunction setConstantUintArray(device, location, array) {\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 * Compares contents of two typed arrays\n * @todo max length?\n */\nfunction compareConstantArrayValues(v1, v2) {\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// Tables describing WebGL parameters\nimport { GL } from '@luma.gl/constants';\n// DEFAULT SETTINGS - FOR FAST CACHE INITIALIZATION AND CONTEXT RESETS\n/* eslint-disable no-shadow */\nexport const GL_PARAMETER_DEFAULTS = {\n [3042]: false,\n [32773]: new Float32Array([0, 0, 0, 0]),\n [32777]: 32774,\n [34877]: 32774,\n [32969]: 1,\n [32968]: 0,\n [32971]: 1,\n [32970]: 0,\n [3106]: new Float32Array([0, 0, 0, 0]), // TBD\n [3107]: [true, true, true, true],\n [2884]: false,\n [2885]: 1029,\n [2929]: false,\n [2931]: 1,\n [2932]: 513,\n [2928]: new Float32Array([0, 1]), // TBD\n [2930]: true,\n [3024]: true,\n [35725]: null,\n // FRAMEBUFFER_BINDING and DRAW_FRAMEBUFFER_BINDING(WebGL2) refer same state.\n [36006]: null,\n [36007]: null,\n [34229]: null,\n [34964]: null,\n [2886]: 2305,\n [33170]: 4352,\n [2849]: 1,\n [32823]: false,\n [32824]: 0,\n [10752]: 0,\n [32926]: false,\n [32928]: false,\n [32938]: 1.0,\n [32939]: false,\n [3089]: false,\n // Note: Dynamic value. If scissor test enabled we expect users to set correct scissor box\n [3088]: new Int32Array([0, 0, 1024, 1024]),\n [2960]: false,\n [2961]: 0,\n [2968]: 0xffffffff,\n [36005]: 0xffffffff,\n [2962]: 519,\n [2967]: 0,\n [2963]: 0xffffffff,\n [34816]: 519,\n [36003]: 0,\n [36004]: 0xffffffff,\n [2964]: 7680,\n [2965]: 7680,\n [2966]: 7680,\n [34817]: 7680,\n [34818]: 7680,\n [34819]: 7680,\n // Dynamic value: We use [0, 0, 1024, 1024] as default, but usually this is updated in each frame.\n [2978]: [0, 0, 1024, 1024],\n [36389]: null,\n [36662]: null,\n [36663]: null,\n [35053]: null,\n [35055]: null,\n [35723]: 4352,\n [36010]: null,\n [35977]: false,\n [3333]: 4,\n [3317]: 4,\n [37440]: false,\n [37441]: false,\n [37443]: 37444,\n [3330]: 0,\n [3332]: 0,\n [3331]: 0,\n [3314]: 0,\n [32878]: 0,\n [3316]: 0,\n [3315]: 0,\n [32877]: 0\n};\n// SETTER TABLES - ENABLES SETTING ANY PARAMETER WITH A COMMON API\nconst enable = (gl, value, key) => value ? gl.enable(key) : gl.disable(key);\nconst hint = (gl, value, key) => gl.hint(key, value);\nconst pixelStorei = (gl, value, key) => gl.pixelStorei(key, value);\nconst bindFramebuffer = (gl, value, key) => {\n const target = key === 36006 ? 36009 : 36008;\n return gl.bindFramebuffer(target, value);\n};\nconst bindBuffer = (gl, value, key) => {\n const bindingMap = {\n [34964]: 34962,\n [36662]: 36662,\n [36663]: 36663,\n [35053]: 35051,\n [35055]: 35052\n };\n const glTarget = bindingMap[key];\n gl.bindBuffer(glTarget, value);\n};\n// Utility\nfunction isArray(array) {\n return Array.isArray(array) || (ArrayBuffer.isView(array) && !(array instanceof DataView));\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 [3042]: enable,\n [32773]: (gl, value) => gl.blendColor(...value),\n [32777]: 'blendEquation',\n [34877]: 'blendEquation',\n [32969]: 'blendFunc',\n [32968]: 'blendFunc',\n [32971]: 'blendFunc',\n [32970]: 'blendFunc',\n [3106]: (gl, value) => gl.clearColor(...value),\n [3107]: (gl, value) => gl.colorMask(...value),\n [2884]: enable,\n [2885]: (gl, value) => gl.cullFace(value),\n [2929]: enable,\n [2931]: (gl, value) => gl.clearDepth(value),\n [2932]: (gl, value) => gl.depthFunc(value),\n [2928]: (gl, value) => gl.depthRange(...value),\n [2930]: (gl, value) => gl.depthMask(value),\n [3024]: enable,\n [35723]: hint,\n [35725]: (gl, value) => gl.useProgram(value),\n [36007]: (gl, value) => gl.bindRenderbuffer(36161, value),\n [36389]: (gl, value) => gl.bindTransformFeedback?.(36386, value),\n [34229]: (gl, value) => gl.bindVertexArray(value),\n // NOTE: FRAMEBUFFER_BINDING and DRAW_FRAMEBUFFER_BINDING(WebGL2) refer same state.\n [36006]: bindFramebuffer,\n [36010]: bindFramebuffer,\n // Buffers\n [34964]: bindBuffer,\n [36662]: bindBuffer,\n [36663]: bindBuffer,\n [35053]: bindBuffer,\n [35055]: bindBuffer,\n [2886]: (gl, value) => gl.frontFace(value),\n [33170]: hint,\n [2849]: (gl, value) => gl.lineWidth(value),\n [32823]: enable,\n [32824]: 'polygonOffset',\n [10752]: 'polygonOffset',\n [35977]: enable,\n [32926]: enable,\n [32928]: enable,\n [32938]: 'sampleCoverage',\n [32939]: 'sampleCoverage',\n [3089]: enable,\n [3088]: (gl, value) => gl.scissor(...value),\n [2960]: enable,\n [2961]: (gl, value) => gl.clearStencil(value),\n [2968]: (gl, value) => gl.stencilMaskSeparate(1028, value),\n [36005]: (gl, value) => gl.stencilMaskSeparate(1029, value),\n [2962]: 'stencilFuncFront',\n [2967]: 'stencilFuncFront',\n [2963]: 'stencilFuncFront',\n [34816]: 'stencilFuncBack',\n [36003]: 'stencilFuncBack',\n [36004]: 'stencilFuncBack',\n [2964]: 'stencilOpFront',\n [2965]: 'stencilOpFront',\n [2966]: 'stencilOpFront',\n [34817]: 'stencilOpBack',\n [34818]: 'stencilOpBack',\n [34819]: 'stencilOpBack',\n [2978]: (gl, value) => gl.viewport(...value),\n // WEBGL2 EXTENSIONS\n // EXT_depth_clamp https://registry.khronos.org/webgl/extensions/EXT_depth_clamp/\n [34383]: enable,\n // WEBGL_provoking_vertex https://registry.khronos.org/webgl/extensions/WEBGL_provoking_vertex/\n // [GL.PROVOKING_VERTEX_WEBL]: TODO - extension function needed\n // WEBGL_polygon_mode https://registry.khronos.org/webgl/extensions/WEBGL_polygon_mode/\n // POLYGON_MODE_WEBGL TODO - extension function needed\n [10754]: enable,\n // WEBGL_clip_cull_distance https://registry.khronos.org/webgl/extensions/WEBGL_clip_cull_distance/\n [12288]: enable,\n [12289]: enable,\n [12290]: enable,\n [12291]: enable,\n [12292]: enable,\n [12293]: enable,\n [12294]: enable,\n [12295]: enable,\n // PIXEL PACK/UNPACK MODES\n [3333]: pixelStorei,\n [3317]: pixelStorei,\n [37440]: pixelStorei,\n [37441]: pixelStorei,\n [37443]: pixelStorei,\n [3330]: pixelStorei,\n [3332]: pixelStorei,\n [3331]: pixelStorei,\n [3314]: pixelStorei,\n [32878]: pixelStorei,\n [3316]: pixelStorei,\n [3315]: pixelStorei,\n [32877]: pixelStorei,\n // Function-style setters\n framebuffer: (gl, 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(36160, handle);\n },\n blend: (gl, value) => value ? gl.enable(3042) : gl.disable(3042),\n blendColor: (gl, value) => gl.blendColor(...value),\n blendEquation: (gl, args) => {\n const separateModes = typeof args === 'number' ? [args, args] : args;\n gl.blendEquationSeparate(...separateModes);\n },\n blendFunc: (gl, args) => {\n const separateFuncs = args?.length === 2 ? [...args, ...args] : args;\n gl.blendFuncSeparate(...separateFuncs);\n },\n clearColor: (gl, value) => gl.clearColor(...value),\n clearDepth: (gl, value) => gl.clearDepth(value),\n clearStencil: (gl, value) => gl.clearStencil(value),\n colorMask: (gl, value) => gl.colorMask(...value),\n cull: (gl, value) => value ? gl.enable(2884) : gl.disable(2884),\n cullFace: (gl, value) => gl.cullFace(value),\n depthTest: (gl, value) => value ? gl.enable(2929) : gl.disable(2929),\n depthFunc: (gl, value) => gl.depthFunc(value),\n depthMask: (gl, value) => gl.depthMask(value),\n depthRange: (gl, value) => gl.depthRange(...value),\n dither: (gl, value) => value ? gl.enable(3024) : gl.disable(3024),\n derivativeHint: (gl, value) => {\n // gl1: 'OES_standard_derivatives'\n gl.hint(35723, value);\n },\n frontFace: (gl, value) => gl.frontFace(value),\n mipmapHint: (gl, value) => gl.hint(33170, value),\n lineWidth: (gl, value) => gl.lineWidth(value),\n polygonOffsetFill: (gl, value) => value ? gl.enable(32823) : gl.disable(32823),\n polygonOffset: (gl, value) => gl.polygonOffset(...value),\n sampleCoverage: (gl, value) => gl.sampleCoverage(value[0], value[1] || false),\n scissorTest: (gl, value) => value ? gl.enable(3089) : gl.disable(3089),\n scissor: (gl, value) => gl.scissor(...value),\n stencilTest: (gl, value) => value ? gl.enable(2960) : gl.disable(2960),\n stencilMask: (gl, value) => {\n value = isArray(value) ? value : [value, value];\n const [mask, backMask] = value;\n gl.stencilMaskSeparate(1028, mask);\n gl.stencilMaskSeparate(1029, backMask);\n },\n stencilFunc: (gl, args) => {\n args = isArray(args) && args.length === 3 ? [...args, ...args] : args;\n const [func, ref, mask, backFunc, backRef, backMask] = args;\n gl.stencilFuncSeparate(1028, func, ref, mask);\n gl.stencilFuncSeparate(1029, backFunc, backRef, backMask);\n },\n stencilOp: (gl, args) => {\n args = isArray(args) && args.length === 3 ? [...args, ...args] : args;\n const [sfail, dpfail, dppass, backSfail, backDpfail, backDppass] = args;\n gl.stencilOpSeparate(1028, sfail, dpfail, dppass);\n gl.stencilOpSeparate(1029, backSfail, backDpfail, backDppass);\n },\n viewport: (gl, value) => gl.viewport(...value)\n};\nfunction getValue(glEnum, values, cache) {\n return values[glEnum] !== undefined ? values[glEnum] : cache[glEnum];\n}\n// COMPOSITE_WEBGL_PARAMETER_\nexport const GL_COMPOSITE_PARAMETER_SETTERS = {\n blendEquation: (gl, values, cache) => gl.blendEquationSeparate(getValue(32777, values, cache), getValue(34877, values, cache)),\n blendFunc: (gl, values, cache) => gl.blendFuncSeparate(getValue(32969, values, cache), getValue(32968, values, cache), getValue(32971, values, cache), getValue(32970, values, cache)),\n polygonOffset: (gl, values, cache) => gl.polygonOffset(getValue(32824, values, cache), getValue(10752, values, cache)),\n sampleCoverage: (gl, values, cache) => gl.sampleCoverage(getValue(32938, values, cache), getValue(32939, values, cache)),\n stencilFuncFront: (gl, values, cache) => gl.stencilFuncSeparate(1028, getValue(2962, values, cache), getValue(2967, values, cache), getValue(2963, values, cache)),\n stencilFuncBack: (gl, values, cache) => gl.stencilFuncSeparate(1029, getValue(34816, values, cache), getValue(36003, values, cache), getValue(36004, values, cache)),\n stencilOpFront: (gl, values, cache) => gl.stencilOpSeparate(1028, getValue(2964, values, cache), getValue(2965, values, cache), getValue(2966, values, cache)),\n stencilOpBack: (gl, values, cache) => gl.stencilOpSeparate(1029, getValue(34817, values, cache), getValue(34818, values, cache), getValue(34819, values, cache))\n};\n// Setter functions intercepted for cache updates\nexport const GL_HOOKED_SETTERS = {\n // GENERIC SETTERS\n enable: (update, capability) => update({\n [capability]: true\n }),\n disable: (update, capability) => update({\n [capability]: false\n }),\n pixelStorei: (update, pname, value) => update({\n [pname]: value\n }),\n hint: (update, pname, hint) => update({\n [pname]: hint\n }),\n // SPECIFIC SETTERS\n useProgram: (update, value) => update({\n [35725]: value\n }),\n bindRenderbuffer: (update, target, value) => update({\n [36007]: value\n }),\n bindTransformFeedback: (update, target, value) => update({\n [36389]: value\n }),\n bindVertexArray: (update, value) => update({\n [34229]: value\n }),\n bindFramebuffer: (update, target, framebuffer) => {\n switch (target) {\n case 36160:\n return update({\n [36006]: framebuffer,\n [36010]: framebuffer\n });\n case 36009:\n return update({ [36006]: framebuffer });\n case 36008:\n return update({ [36010]: framebuffer });\n default:\n return null;\n }\n },\n bindBuffer: (update, target, buffer) => {\n const pname = {\n [34962]: [34964],\n [36662]: [36662],\n [36663]: [36663],\n [35051]: [35053],\n [35052]: [35055]\n }[target];\n if (pname) {\n return update({ [pname]: buffer });\n }\n // targets that should not be cached\n return { valueChanged: true };\n },\n blendColor: (update, r, g, b, a) => update({\n [32773]: new Float32Array([r, g, b, a])\n }),\n blendEquation: (update, mode) => update({\n [32777]: mode,\n [34877]: mode\n }),\n blendEquationSeparate: (update, modeRGB, modeAlpha) => update({\n [32777]: modeRGB,\n [34877]: modeAlpha\n }),\n blendFunc: (update, src, dst) => update({\n [32969]: src,\n [32968]: dst,\n [32971]: src,\n [32970]: dst\n }),\n blendFuncSeparate: (update, srcRGB, dstRGB, srcAlpha, dstAlpha) => update({\n [32969]: srcRGB,\n [32968]: dstRGB,\n [32971]: srcAlpha,\n [32970]: dstAlpha\n }),\n clearColor: (update, r, g, b, a) => update({\n [3106]: new Float32Array([r, g, b, a])\n }),\n clearDepth: (update, depth) => update({\n [2931]: depth\n }),\n clearStencil: (update, s) => update({\n [2961]: s\n }),\n colorMask: (update, r, g, b, a) => update({\n [3107]: [r, g, b, a]\n }),\n cullFace: (update, mode) => update({\n [2885]: mode\n }),\n depthFunc: (update, func) => update({\n [2932]: func\n }),\n depthRange: (update, zNear, zFar) => update({\n [2928]: new Float32Array([zNear, zFar])\n }),\n depthMask: (update, mask) => update({\n [2930]: mask\n }),\n frontFace: (update, face) => update({\n [2886]: face\n }),\n lineWidth: (update, width) => update({\n [2849]: width\n }),\n polygonOffset: (update, factor, units) => update({\n [32824]: factor,\n [10752]: units\n }),\n sampleCoverage: (update, value, invert) => update({\n [32938]: value,\n [32939]: invert\n }),\n scissor: (update, x, y, width, height) => update({\n [3088]: new Int32Array([x, y, width, height])\n }),\n stencilMask: (update, mask) => update({\n [2968]: mask,\n [36005]: mask\n }),\n stencilMaskSeparate: (update, face, mask) => update({\n [face === 1028 ? 2968 : 36005]: mask\n }),\n stencilFunc: (update, func, ref, mask) => update({\n [2962]: func,\n [2967]: ref,\n [2963]: mask,\n [34816]: func,\n [36003]: ref,\n [36004]: mask\n }),\n stencilFuncSeparate: (update, face, func, ref, mask) => update({\n [face === 1028 ? 2962 : 34816]: func,\n [face === 1028 ? 2967 : 36003]: ref,\n [face === 1028 ? 2963 : 36004]: mask\n }),\n stencilOp: (update, fail, zfail, zpass) => update({\n [2964]: fail,\n [2965]: zfail,\n [2966]: zpass,\n [34817]: fail,\n [34818]: zfail,\n [34819]: zpass\n }),\n stencilOpSeparate: (update, face, fail, zfail, zpass) => update({\n [face === 1028 ? 2964 : 34817]: fail,\n [face === 1028 ? 2965 : 34818]: zfail,\n [face === 1028 ? 2966 : 34819]: zpass\n }),\n viewport: (update, x, y, width, height) => update({\n [2978]: [x, y, width, height]\n })\n};\n// GETTER TABLE - FOR READING OUT AN ENTIRE CONTEXT\nconst isEnabled = (gl, key) => gl.isEnabled(key);\n// Exceptions for any keys that cannot be queried by gl.getParameters\nexport const GL_PARAMETER_GETTERS = {\n [3042]: isEnabled,\n [2884]: isEnabled,\n [2929]: isEnabled,\n [3024]: isEnabled,\n [32823]: isEnabled,\n [32926]: isEnabled,\n [32928]: isEnabled,\n [3089]: isEnabled,\n [2960]: isEnabled,\n [35977]: isEnabled\n};\nexport const NON_CACHE_PARAMETERS = new Set([\n 34016,\n 36388,\n 36387,\n 35983,\n 35368,\n 34965,\n 35739,\n 35738,\n 3074,\n 34853,\n 34854,\n 34855,\n 34856,\n 34857,\n 34858,\n 34859,\n 34860,\n 34861,\n 34862,\n 34863,\n 34864,\n 34865,\n 34866,\n 34867,\n 34868,\n 35097,\n 32873,\n 35869,\n 32874,\n 34068\n]);\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { GL_PARAMETER_DEFAULTS, GL_PARAMETER_SETTERS, GL_COMPOSITE_PARAMETER_SETTERS, GL_PARAMETER_GETTERS } from \"./webgl-parameter-tables.js\";\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, parameters) {\n if (isObjectEmpty(parameters)) {\n return;\n }\n const compositeSetters = {};\n // HANDLE PRIMITIVE SETTERS (and make note of any composite setters)\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 }\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 // HANDLE COMPOSITE SETTERS\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 // Add a log for the else case?\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(gl, parameters = GL_PARAMETER_DEFAULTS) {\n // support both arrays of parameters and objects (keys represent parameters)\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 const parameterKeys = Array.isArray(parameters) ? parameters : Object.keys(parameters);\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 * 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) {\n setGLParameters(gl, GL_PARAMETER_DEFAULTS);\n}\n// Helpers\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/** deeply compare two arrays */\nexport function deepArrayEqual(x, y) {\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// Support for listening to context state changes and intercepting state queries\n// NOTE: this system does not handle buffer bindings\nimport { GL_PARAMETER_DEFAULTS, GL_HOOKED_SETTERS, NON_CACHE_PARAMETERS } from \"../parameters/webgl-parameter-tables.js\";\nimport { setGLParameters, getGLParameters } from \"../parameters/unified-parameter-api.js\";\nimport { deepArrayEqual } from \"./deep-array-equal.js\";\n// HELPER CLASS - GLState\n/* eslint-disable no-shadow */\nclass GLState {\n gl;\n program = null;\n stateStack = [];\n enable = true;\n cache;\n log;\n constructor(gl, { copyState = false, // Copy cache from params (slow) or initialize from WebGL defaults (fast)\n log = () => { } // Logging function, called when gl parameter change calls are actually issued\n } = {}) {\n this.gl = gl;\n this.cache = copyState ? getGLParameters(gl) : Object.assign({}, GL_PARAMETER_DEFAULTS);\n this.log = log;\n this._updateCache = this._updateCache.bind(this);\n Object.seal(this);\n }\n push(values = {}) {\n this.stateStack.push({});\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 // 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) {\n let valueChanged = false;\n let oldValue; // = undefined\n const oldValues = this.stateStack.length > 0 ? this.stateStack[this.stateStack.length - 1] : null;\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 // 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 // Save current value being shadowed\n this.cache[key] = value;\n }\n }\n return { valueChanged, oldValue };\n }\n}\nfunction getContextState(gl) {\n // @ts-expect-error\n return gl.state;\n}\n// PUBLIC API\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 * gl.state.push() and gl.state.pop() will be available for saving,\n * temporarily modifying, and then restoring state.\n */\nexport function trackContextState(gl, options) {\n const { enable = true, copyState } = options || {};\n // assert(copyState !== undefined);\n // @ts-expect-error\n if (!gl.state) {\n // @ts-ignore\n // const {polyfillContext} = global_;\n // if (polyfillContext) {\n // polyfillContext(gl);\n // }\n // Create a state cache\n // @ts-expect-error\n gl.state = new GLState(gl, { copyState });\n installProgramSpy(gl);\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 // intercept all getter functions in the table\n installGetterOverride(gl, 'getParameter');\n installGetterOverride(gl, 'isEnabled');\n }\n const glState = getContextState(gl);\n glState.enable = enable;\n return gl;\n}\n/**\n * Saves current WebGL context state onto an internal per-context stack\n */\nexport function pushContextState(gl) {\n let glState = getContextState(gl);\n if (!glState) {\n trackContextState(gl, { copyState: false });\n glState = getContextState(gl);\n }\n glState.push();\n}\n/**\n * Restores previously saved WebGL context state\n */\nexport function popContextState(gl) {\n const glState = getContextState(gl);\n // assert(glState);\n glState.pop();\n}\n// HELPER FUNCTIONS - INSTALL GET/SET INTERCEPTORS (SPYS) ON THE CONTEXT\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, functionName) {\n // Get the original function from the WebGL2RenderingContext\n const originalGetterFunc = gl[functionName].bind(gl);\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 const glState = getContextState(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 // 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 // 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// 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, functionName, setter) {\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 const originalSetterFunc = gl[functionName].bind(gl);\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 = getContextState(gl);\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const { valueChanged, oldValue } = setter(glState._updateCache, ...params);\n // Call the original WebGL2RenderingContext func to make sure the context actually gets updated\n if (valueChanged) {\n originalSetterFunc(...params);\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 return oldValue;\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}\nfunction installProgramSpy(gl) {\n const originalUseProgram = gl.useProgram.bind(gl);\n gl.useProgram = function useProgramLuma(handle) {\n const glState = getContextState(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\nconst DEFAULT_CONTEXT_PROPS = {\n powerPreference: 'high-performance', // After all, most apps are using WebGL for performance reasons\n // eslint-disable-next-line no-console\n onContextLost: () => console.error('WebGL context lost'),\n // eslint-disable-next-line no-console\n onContextRestored: () => console.info('WebGL context restored')\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(canvas, props) {\n props = { ...DEFAULT_CONTEXT_PROPS, ...props };\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 // Create the desired context\n let gl = null;\n // props.failIfMajorPerformanceCaveat = true;\n // We require webgl2 context\n gl ||= canvas.getContext('webgl2', props);\n // Software GPU\n // props.failIfMajorPerformanceCaveat = false;\n // if (!gl && props.webgl1) {\n // gl = canvas.getContext('webgl', props);\n // }\n // TODO are we removing this listener before giving it a chance to fire?\n canvas.removeEventListener('webglcontextcreationerror', onCreateError, false);\n if (!gl) {\n throw new Error(`Failed to create WebGL context: ${errorMessage || 'Unknown error'}`);\n }\n if (props.onContextLost) {\n // Carefully extract and wrap callbacks to prevent addEventListener from rebinding them.\n const { onContextLost } = props;\n canvas.addEventListener('webglcontextlost', (event) => onContextLost(event), false);\n }\n if (props.onContextRestored) {\n // Carefully extract and wrap callbacks to prevent addEventListener from rebinding them.\n const { onContextRestored } = props;\n canvas.addEventListener('webglcontextrestored', (event) => onContextRestored(event), false);\n }\n return gl;\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\nimport { GL } from '@luma.gl/constants';\nimport { getWebGLExtension } from \"../../context/helpers/webgl-extensions.js\";\n/** @returns strings identifying the GPU vendor and driver. */\nexport function getDeviceInfo(gl, extensions) {\n // \"Masked\" info is always available, but don't contain much useful information\n const vendorMasked = gl.getParameter(7936);\n const rendererMasked = gl.getParameter(7937);\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 : 7936);\n const rendererUnmasked = gl.getParameter(ext ? ext.UNMASKED_RENDERER_WEBGL : 7937);\n const vendor = vendorUnmasked || vendorMasked;\n const renderer = rendererUnmasked || rendererMasked;\n // Driver version\n const version = gl.getParameter(7938);\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 // 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 return {\n type: 'webgl',\n gpu,\n gpuType,\n gpuBackend,\n vendor,\n renderer,\n version,\n shadingLanguage,\n shadingLanguageVersion\n };\n}\n/** \"Sniff\" the GPU type from the info. This works best if unmasked info is available. */\nfunction identifyGPUVendor(vendor, renderer) {\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 (/AMD/i.exec(vendor) ||\n /AMD/i.exec(renderer) ||\n /ATI/i.exec(vendor) ||\n /ATI/i.exec(renderer)) {\n return 'amd';\n }\n if (/SwiftShader/i.exec(vendor) || /SwiftShader/i.exec(renderer)) {\n return 'software';\n }\n return 'unknown';\n}\n/** \"Sniff\" the GPU backend from the info. This works best if unmasked info is available. */\nfunction identifyGPUBackend(vendor, renderer) {\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}\nfunction identifyGPUType(vendor, renderer) {\n if (/SwiftShader/i.exec(vendor) || /SwiftShader/i.exec(renderer)) {\n return 'cpu';\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/** Ensure extensions are only requested once */\nexport function getWebGLExtension(gl, name, extensions) {\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// Feature detection for WebGL\n// Provides a function that enables simple checking of which WebGL features are\nimport { DeviceFeatures } from '@luma.gl/core';\nimport { getWebGLExtension } from \"../../context/helpers/webgl-extensions.js\";\nimport { isTextureFeature, checkTextureFeature } from \"../converters/texture-formats.js\";\nimport { TEXTURE_FEATURES } from \"../converters/texture-formats.js\";\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 = {\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 // 'depth24unorm-stencil8' // GPUTextureFormat 'depth24unorm-stencil8'\n // 'depth32float-stencil8' // GPUTextureFormat 'depth32float-stencil8'\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 // Textures are handled by getTextureFeatures()\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 gl;\n extensions;\n testedFeatures = new Set();\n constructor(gl, extensions, disabledFeatures) {\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 *[Symbol.iterator]() {\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 has(feature) {\n if (this.disabledFeatures?.[feature]) {\n return false;\n }\n // We have already tested this feature\n if (!this.testedFeatures.has(feature)) {\n this.testedFeatures.add(feature);\n // Check the feature once\n if (isTextureFeature(feature) && checkTextureFeature(this.gl, feature, this.extensions)) {\n this.features.add(feature);\n }\n if (this.getWebGLFeature(feature)) {\n this.features.add(feature);\n }\n }\n return this.features.has(feature);\n }\n // FOR DEVICE\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 // IMPLEMENTATION\n getFeatures() {\n return [...Object.keys(WEBGL_FEATURES), ...Object.keys(TEXTURE_FEATURES)];\n }\n /** Extract all WebGL features */\n getWebGLFeature(feature) {\n const featureInfo = WEBGL_FEATURES[feature];\n // string value requires checking the corresponding WebGL extension\n const isSupported = typeof featureInfo === 'string'\n ? Boolean(getWebGLExtension(this.gl, featureInfo, this.extensions))\n : Boolean(featureInfo);\n return isSupported;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { decodeTextureFormat } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\nimport { getWebGLExtension } from \"../../context/helpers/webgl-extensions.js\";\nimport { getGLFromVertexType } from \"./vertex-formats.js\";\n/* eslint-disable camelcase */\n// TEXTURE FEATURES\n// Define local device feature strings to optimize minification\nconst texture_compression_bc = 'texture-compression-bc';\nconst texture_compression_astc = 'texture-compression-astc';\nconst texture_compression_etc2 = 'texture-compression-etc2';\nconst texture_compression_etc1_webgl = 'texture-compression-etc1-webgl';\nconst texture_compression_pvrtc_webgl = 'texture-compression-pvrtc-webgl';\nconst texture_compression_atc_webgl = 'texture-compression-atc-webgl';\nconst float32_renderable = 'float32-renderable-webgl';\nconst float16_renderable = 'float16-renderable-webgl';\nconst rgb9e5ufloat_renderable = 'rgb9e5ufloat_renderable-webgl';\nconst snorm8_renderable = 'snorm8-renderable-webgl';\nconst norm16_renderable = 'norm16-renderable-webgl';\nconst snorm16_renderable = 'snorm16-renderable-webgl';\nconst float32_filterable = 'float32-filterable';\nconst float16_filterable = 'float16-filterable-webgl';\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// 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// prettier-ignore\nexport const TEXTURE_FEATURES = {\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 '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 'texture-blend-float-webgl': ['EXT_float_blend'],\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/** Return a list of texture feature strings (for Device.features). Mainly compressed texture support */\n// export function getTextureFeatures(\n// gl: WebGL2RenderingContext,\n// extensions: GLExtensions\n// ): DeviceFeature[] {\n// const textureFeatures = Object.keys(TEXTURE_FEATURES) as DeviceFeature[];\n// return textureFeatures.filter(feature => checkTextureFeature(gl, feature, extensions));\n// }\nexport function isTextureFeature(feature) {\n return feature in TEXTURE_FEATURES;\n}\n/** Checks a texture feature (for Device.features). Mainly compressed texture support */\nexport function checkTextureFeature(gl, feature, extensions) {\n const textureExtensions = TEXTURE_FEATURES[feature] || [];\n return textureExtensions.every(extension => getWebGLExtension(gl, extension, extensions));\n}\n// TABLES\n/**\n * Texture format data -\n * Exported but can change without notice\n */\n// prettier-ignore\nexport const TEXTURE_FORMATS = {\n // Unsized formats that leave the precision up to the driver. TODO - Fix bpp constants\n 'rgb8unorm-unsized': { gl: 6407, b: 4, c: 2, bpp: 4,\n dataFormat: 6407, types: [5121, 33635] },\n 'rgba8unorm-unsized': { gl: 6408, b: 4, c: 2, bpp: 4,\n dataFormat: 6408, types: [5121, 32819, 32820] },\n // 'r8unorm-unsized': {gl: GL.LUMINANCE, b: 4, c: 2, bpp: 4},\n // 'rgb8unorm-srgb-unsized': {gl: GL.SRGB_EXT, b: 4, c: 2, bpp: 4, gl1Ext: SRGB},\n // 'rgba8unorm-srgb-unsized': {gl: GL.SRGB_ALPHA_EXT, b: 4, c: 2, bpp: 4, gl1Ext: SRGB},\n // 8-bit formats\n 'r8unorm': { gl: 33321, b: 1, c: 1, rb: true },\n 'r8snorm': { gl: 36756, b: 1, c: 1, render: snorm8_renderable },\n 'r8uint': { gl: 33330, b: 1, c: 1, rb: true },\n 'r8sint': { gl: 33329, b: 1, c: 1, rb: true },\n // 16-bit formats\n 'rg8unorm': { gl: 33323, b: 2, c: 2, rb: true },\n 'rg8snorm': { gl: 36757, b: 2, c: 2, render: snorm8_renderable },\n 'rg8uint': { gl: 33336, b: 2, c: 2, rb: true },\n 'rg8sint': { gl: 33335, b: 2, c: 2, rb: true },\n 'r16uint': { gl: 33332, b: 2, c: 1, rb: true },\n 'r16sint': { gl: 33331, b: 2, c: 1, rb: true },\n 'r16float': { gl: 33325, b: 2, c: 1, render: float16_renderable, filter: 'float16-filterable-webgl', rb: true },\n 'r16unorm-webgl': { gl: 33322, b: 2, c: 1, f: norm16_renderable, rb: true },\n 'r16snorm-webgl': { gl: 36760, b: 2, c: 1, f: snorm16_renderable },\n // Packed 16-bit formats\n 'rgba4unorm-webgl': { gl: 32854, b: 2, c: 4, wgpu: false, rb: true },\n 'rgb565unorm-webgl': { gl: 36194, b: 2, c: 4, wgpu: false, rb: true },\n 'rgb5a1unorm-webgl': { gl: 32855, b: 2, c: 4, wgpu: false, rb: true },\n // 24-bit formats\n 'rgb8unorm-webgl': { gl: 32849, b: 3, c: 3, wgpu: false },\n 'rgb8snorm-webgl': { gl: 36758, b: 3, c: 3, wgpu: false },\n // 32-bit formats \n 'rgba8unorm': { gl: 32856, b: 4, c: 2, bpp: 4 },\n 'rgba8unorm-srgb': { gl: 35907, b: 4, c: 4, bpp: 4 },\n 'rgba8snorm': { gl: 36759, b: 4, c: 4, render: snorm8_renderable },\n 'rgba8uint': { gl: 36220, b: 4, c: 4, bpp: 4 },\n 'rgba8sint': { gl: 36238, b: 4, c: 4, bpp: 4 },\n // reverse colors, webgpu only\n 'bgra8unorm': { b: 4, c: 4 },\n 'bgra8unorm-srgb': { b: 4, c: 4 },\n 'rg16uint': { gl: 33338, b: 4, c: 1, bpp: 4 },\n 'rg16sint': { gl: 33337, b: 4, c: 2, bpp: 4 },\n 'rg16float': { gl: 33327, bpp: 4, b: 4, c: 2, render: float16_renderable, filter: float16_filterable, rb: true },\n 'rg16unorm-webgl': { gl: 33324, b: 2, c: 2, render: norm16_renderable },\n 'rg16snorm-webgl': { gl: 36761, b: 2, c: 2, render: snorm16_renderable },\n 'r32uint': { gl: 33334, b: 4, c: 1, bpp: 4, rb: true },\n 'r32sint': { gl: 33333, b: 4, c: 1, bpp: 4, rb: true },\n 'r32float': { gl: 33326, bpp: 4, b: 4, c: 1, render: float32_renderable, filter: float32_filterable },\n // Packed 32-bit formats\n 'rgb9e5ufloat': { gl: 35901, b: 4, c: 3, p: 1, render: rgb9e5ufloat_renderable }, // , filter: true},\n 'rg11b10ufloat': { gl: 35898, b: 4, c: 3, p: 1, render: float32_renderable, rb: true },\n 'rgb10a2unorm': { gl: 32857, b: 4, c: 4, p: 1, rb: true },\n 'rgb10a2uint-webgl': { b: 4, c: 4, gl: 36975, p: 1, wgpu: false, bpp: 4, rb: true },\n // 48-bit formats\n 'rgb16unorm-webgl': { gl: 32852, b: 2, c: 3, f: norm16_renderable }, // rgb not renderable\n 'rgb16snorm-webgl': { gl: 36762, b: 2, c: 3, f: norm16_renderable }, // rgb not renderable\n // 64-bit formats\n 'rg32uint': { gl: 33340, b: 8, c: 2, rb: true },\n 'rg32sint': { gl: 33339, b: 8, c: 2, rb: true },\n 'rg32float': { gl: 33328, b: 8, c: 2, render: float32_renderable, filter: float32_filterable, rb: true },\n 'rgba16uint': { gl: 36214, b: 8, c: 4, rb: true },\n 'rgba16sint': { gl: 36232, b: 8, c: 4, rb: true },\n 'rgba16float': { gl: 34842, b: 8, c: 4, render: float16_renderable, filter: float16_filterable },\n 'rgba16unorm-webgl': { gl: 32859, b: 2, c: 4, render: norm16_renderable, rb: true },\n 'rgba16snorm-webgl': { gl: 36763, b: 2, c: 4, render: snorm16_renderable },\n // 96-bit formats (deprecated!)\n 'rgb32float-webgl': { gl: 34837, render: float32_renderable, filter: float32_filterable,\n gl2ext: EXT_color_buffer_float, dataFormat: 6407, types: [5126] },\n // 128-bit formats\n 'rgba32uint': { gl: 36208, b: 16, c: 4, rb: true },\n 'rgba32sint': { gl: 36226, b: 16, c: 4, rb: true },\n 'rgba32float': { gl: 34836, b: 16, c: 4, render: float32_renderable, filter: float32_filterable, rb: true },\n // Depth and stencil formats\n 'stencil8': { gl: 36168, b: 1, c: 1, attachment: 36128, rb: true }, // 8 stencil bits\n 'depth16unorm': { gl: 33189, b: 2, c: 1, attachment: 36096,\n dataFormat: 6402, types: [5123], rb: true }, // 16 depth bits\n 'depth24plus': { gl: 33190, b: 3, c: 1, attachment: 36096,\n dataFormat: 6402, types: [5125] },\n 'depth32float': { gl: 36012, b: 4, c: 1, attachment: 36096,\n dataFormat: 6402, types: [5126], rb: true },\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: 35056, b: 4, c: 2, p: 1, attachment: 33306, rb: true, depthTexture: true,\n dataFormat: 34041, types: [34042] },\n // \"depth24unorm-stencil8\" feature\n 'depth24unorm-stencil8': { gl: 35056, b: 4, c: 2, p: 1, attachment: 33306,\n dataFormat: 34041, types: [34042], rb: true },\n // \"depth32float-stencil8\" feature - TODO below is render buffer only?\n 'depth32float-stencil8': { gl: 36013, b: 5, c: 2, p: 1, attachment: 33306,\n dataFormat: 34041, types: [36269], rb: true },\n // BC compressed formats: check device.features.has(\"texture-compression-bc\");\n 'bc1-rgb-unorm-webgl': { gl: 33776, x: X_S3TC, f: texture_compression_bc },\n 'bc1-rgb-unorm-srgb-webgl': { gl: 35916, x: X_S3TC_SRGB, f: texture_compression_bc },\n 'bc1-rgba-unorm': { gl: 33777, x: X_S3TC, f: texture_compression_bc },\n 'bc1-rgba-unorm-srgb': { gl: 35916, x: X_S3TC_SRGB, f: texture_compression_bc },\n 'bc2-rgba-unorm': { gl: 33778, x: X_S3TC, f: texture_compression_bc },\n 'bc2-rgba-unorm-srgb': { gl: 35918, x: X_S3TC_SRGB, f: texture_compression_bc },\n 'bc3-rgba-unorm': { gl: 33779, x: X_S3TC, f: texture_compression_bc },\n 'bc3-rgba-unorm-srgb': { gl: 35919, x: X_S3TC_SRGB, f: texture_compression_bc },\n 'bc4-r-unorm': { gl: 36283, x: X_RGTC, f: texture_compression_bc },\n 'bc4-r-snorm': { gl: 36284, x: X_RGTC, f: texture_compression_bc },\n 'bc5-rg-unorm': { gl: 36285, x: X_RGTC, f: texture_compression_bc },\n 'bc5-rg-snorm': { gl: 36286, x: X_RGTC, f: texture_compression_bc },\n 'bc6h-rgb-ufloat': { gl: 36495, x: X_BPTC, f: texture_compression_bc },\n 'bc6h-rgb-float': { gl: 36494, x: X_BPTC, f: texture_compression_bc },\n 'bc7-rgba-unorm': { gl: 36492, x: X_BPTC, f: texture_compression_bc },\n 'bc7-rgba-unorm-srgb': { gl: 36493, x: X_BPTC, f: texture_compression_bc },\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 'etc2-rgb8unorm': { gl: 37492, f: texture_compression_etc2 },\n 'etc2-rgb8unorm-srgb': { gl: 37494, f: texture_compression_etc2 },\n 'etc2-rgb8a1unorm': { gl: 37496, f: texture_compression_etc2 },\n 'etc2-rgb8a1unorm-srgb': { gl: 37497, f: texture_compression_etc2 },\n 'etc2-rgba8unorm': { gl: 37493, f: texture_compression_etc2 },\n 'etc2-rgba8unorm-srgb': { gl: 37495, f: texture_compression_etc2 },\n 'eac-r11unorm': { gl: 37488, f: texture_compression_etc2 },\n 'eac-r11snorm': { gl: 37489, f: texture_compression_etc2 },\n 'eac-rg11unorm': { gl: 37490, f: texture_compression_etc2 },\n 'eac-rg11snorm': { gl: 37491, f: texture_compression_etc2 },\n // X_ASTC compressed formats: device.features.has(\"texture-compression-astc\")\n 'astc-4x4-unorm': { gl: 37808, f: texture_compression_astc },\n 'astc-4x4-unorm-srgb': { gl: 37840, f: texture_compression_astc },\n 'astc-5x4-unorm': { gl: 37809, f: texture_compression_astc },\n 'astc-5x4-unorm-srgb': { gl: 37841, f: texture_compression_astc },\n 'astc-5x5-unorm': { gl: 37810, f: texture_compression_astc },\n 'astc-5x5-unorm-srgb': { gl: 37842, f: texture_compression_astc },\n 'astc-6x5-unorm': { gl: 37811, f: texture_compression_astc },\n 'astc-6x5-unorm-srgb': { gl: 37843, f: texture_compression_astc },\n 'astc-6x6-unorm': { gl: 37812, f: texture_compression_astc },\n 'astc-6x6-unorm-srgb': { gl: 37844, f: texture_compression_astc },\n 'astc-8x5-unorm': { gl: 37813, f: texture_compression_astc },\n 'astc-8x5-unorm-srgb': { gl: 37845, f: texture_compression_astc },\n 'astc-8x6-unorm': { gl: 37814, f: texture_compression_astc },\n 'astc-8x6-unorm-srgb': { gl: 37846, f: texture_compression_astc },\n 'astc-8x8-unorm': { gl: 37815, f: texture_compression_astc },\n 'astc-8x8-unorm-srgb': { gl: 37847, f: texture_compression_astc },\n 'astc-10x5-unorm': { gl: 37819, f: texture_compression_astc },\n 'astc-10x5-unorm-srgb': { gl: 37851, f: texture_compression_astc },\n 'astc-10x6-unorm': { gl: 37817, f: texture_compression_astc },\n 'astc-10x6-unorm-srgb': { gl: 37849, f: texture_compression_astc },\n 'astc-10x8-unorm': { gl: 37818, f: texture_compression_astc },\n 'astc-10x8-unorm-srgb': { gl: 37850, f: texture_compression_astc },\n 'astc-10x10-unorm': { gl: 37819, f: texture_compression_astc },\n 'astc-10x10-unorm-srgb': { gl: 37851, f: texture_compression_astc },\n 'astc-12x10-unorm': { gl: 37820, f: texture_compression_astc },\n 'astc-12x10-unorm-srgb': { gl: 37852, f: texture_compression_astc },\n 'astc-12x12-unorm': { gl: 37821, f: texture_compression_astc },\n 'astc-12x12-unorm-srgb': { gl: 37853, f: texture_compression_astc },\n // WEBGL_compressed_texture_pvrtc\n 'pvrtc-rgb4unorm-webgl': { gl: 35840, f: texture_compression_pvrtc_webgl },\n 'pvrtc-rgba4unorm-webgl': { gl: 35842, f: texture_compression_pvrtc_webgl },\n 'pvrtc-rbg2unorm-webgl': { gl: 35841, f: texture_compression_pvrtc_webgl },\n 'pvrtc-rgba2unorm-webgl': { gl: 35843, f: texture_compression_pvrtc_webgl },\n // WEBGL_compressed_texture_etc1\n 'etc1-rbg-unorm-webgl': { gl: 36196, f: texture_compression_etc1_webgl },\n // WEBGL_compressed_texture_atc\n 'atc-rgb-unorm-webgl': { gl: 35986, f: texture_compression_atc_webgl },\n 'atc-rgba-unorm-webgl': { gl: 35986, f: texture_compression_atc_webgl },\n 'atc-rgbai-unorm-webgl': { gl: 34798, f: texture_compression_atc_webgl }\n};\n/** Legal combinations for internalFormat, format and type *\n// [GL.DEPTH_COMPONENT]: {types: [GL.UNSIGNED_SHORT, GL.UNSIGNED_INT, GL.UNSIGNED_INT_24_8]},\n// [GL.DEPTH_STENCIL]: ,\n// Sized texture format\n// R\n[GL.R8]: {dataFormat: GL.RED, types: [GL.UNSIGNED_BYTE], gl2: true},\n[GL.R16F]: {dataFormat: GL.RED, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true},\n[GL.R8UI]: {dataFormat: GL.RED_INTEGER, types: [GL.UNSIGNED_BYTE], gl2: true},\n// // RG\n[GL.RG8]: {dataFormat: GL.RG, types: [GL.UNSIGNED_BYTE], gl2: true},\n[GL.RG16F]: {dataFormat: GL.RG, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true},\n[GL.RG8UI]: {dataFormat: GL.RG_INTEGER, types: [GL.UNSIGNED_BYTE], gl2: true},\n// // RGB\n[GL.RGB8]: {dataFormat: GL.RGB, types: [GL.UNSIGNED_BYTE], gl2: true},\n[GL.SRGB8]: {dataFormat: GL.RGB, types: [GL.UNSIGNED_BYTE], gl2: true},\n[GL.RGB16F]: {dataFormat: GL.RGB, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true},\n[GL.RGB8UI]: {dataFormat: GL.RGB_INTEGER, types: [GL.UNSIGNED_BYTE], gl2: true},\n// // RGBA\n\n[GL.RGB565]: {dataFormat: GL.RGB, types: [GL.UNSIGNED_BYTE, GL.UNSIGNED_SHORT_5_6_5], gl2: true},\n[GL.R11F_G11F_B10F]: {dataFormat: GL.RGB, types: [GL.UNSIGNED_INT_10F_11F_11F_REV, GL.HALF_FLOAT, GL.FLOAT], gl2: true},\n[GL.RGB9_E5]: {dataFormat: GL.RGB, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true},\n[GL.RGBA8]: {dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE], gl2: true},\n[GL.SRGB8_ALPHA8]: {dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE], gl2: true, gl1ext: EXT_SRGB},\n[GL.RGB5_A1]: {dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE, GL.UNSIGNED_SHORT_5_5_5_1], gl2: true},\n[GL.RGBA4]: {dataFormat: GL.RGBA, types: [GL.UNSIGNED_BYTE, GL.UNSIGNED_SHORT_4_4_4_4], gl2: true},\n[GL.RGBA16F]: {dataFormat: GL.RGBA, types: [GL.HALF_FLOAT, GL.FLOAT], gl2: true},\n[GL.RGBA8UI]: {dataFormat: GL.RGBA_INTEGER, types: [GL.UNSIGNED_BYTE], gl2: true}\n*/\n/* This table is now baked into the above table\ntype RenderbufferFormat = {\n bpp: number;\n gl2?: boolean;\n ext?: string;\n};\n\nexport const RENDERBUFFER_FORMATS: Record<string, RenderbufferFormat> = {\n [GL.DEPTH_COMPONENT16]: {bpp: 2}, // 16 depth bits.\n // TODO - Not clear which webgpu value to map this to.\n // [GL.DEPTH_COMPONENT24]: {gl2: true, bpp: 3},\n [GL.DEPTH_COMPONENT32F]: {gl2: true, bpp: 4},\n\n [GL.STENCIL_INDEX8]: {bpp: 1}, // 8 stencil bits.\n\n [GL.DEPTH_STENCIL]: {bpp: 4},\n [GL.DEPTH24_STENCIL8]: {gl2: true, bpp: 4},\n [GL.DEPTH32F_STENCIL8]: {gl2: true, bpp: 5},\n\n // When using a WebGL 1 context, color renderbuffer formats are limited\n [GL.RGBA4]: {gl2: true, bpp: 2},\n [GL.RGB565]: {gl2: true, bpp: 2},\n [GL.RGB5_A1]: {gl2: true, bpp: 2},\n\n // When using a WebGL 2 context, the following values are available additionally:\n [GL.R8]: {gl2: true, bpp: 1},\n [GL.R8UI]: {gl2: true, bpp: 1},\n [GL.R8I]: {gl2: true, bpp: 1},\n [GL.R16UI]: {gl2: true, bpp: 2},\n [GL.R16I]: {gl2: true, bpp: 2},\n [GL.R32UI]: {gl2: true, bpp: 4},\n [GL.R32I]: {gl2: true, bpp: 4},\n [GL.RG8]: {gl2: true, bpp: 2},\n [GL.RG8UI]: {gl2: true, bpp: 2},\n [GL.RG8I]: {gl2: true, bpp: 2},\n [GL.RG16UI]: {gl2: true, bpp: 4},\n [GL.RG16I]: {gl2: true, bpp: 4},\n [GL.RG32UI]: {gl2: true, bpp: 8},\n [GL.RG32I]: {gl2: true, bpp: 8},\n [GL.RGB8]: {gl2: true, bpp: 3},\n [GL.RGBA8]: {gl2: true, bpp: 4},\n // [GL.SRGB8_ALPHA8]: {gl2: true, gl1: SRGB}, // When using the EXT_sRGB WebGL1 extension\n [GL.RGB10_A2]: {gl2: true, bpp: 4},\n [GL.RGBA8UI]: {gl2: true, bpp: 4},\n [GL.RGBA8I]: {gl2: true, bpp: 4},\n [GL.RGB10_A2UI]: {gl2: true, bpp: 4},\n [GL.RGBA16UI]: {gl2: true, bpp: 8},\n [GL.RGBA16I]: {gl2: true, bpp: 8},\n [GL.RGBA32I]: {gl2: true, bpp: 16},\n [GL.RGBA32UI]: {gl2: true, bpp: 16},\n\n // When using a WebGL 2 context and the EXT_color_buffer_float WebGL2 extension\n [GL.R16F]: {ext: EXT_FLOAT_WEBGL2, bpp: 2},\n [GL.RG16F]: {ext: EXT_FLOAT_WEBGL2, bpp: 4},\n [GL.RGBA16F]: {ext: EXT_FLOAT_WEBGL2, bpp: 8},\n [GL.R32F]: {ext: EXT_FLOAT_WEBGL2, bpp: 4},\n [GL.RG32F]: {ext: EXT_FLOAT_WEBGL2, bpp: 8},\n // TODO - can't get WEBGL_color_buffer_float to work on renderbuffers\n [GL.RGBA32F]: {ext: EXT_FLOAT_WEBGL2, bpp: 16},\n // [GL.RGBA32F]: {ext: EXT_FLOAT_WEBGL2},\n [GL.R11F_G11F_B10F]: {ext: EXT_FLOAT_WEBGL2, bpp: 4}\n};\n*/\n/** @deprecated should be removed */\nconst DATA_FORMAT_CHANNELS = {\n [6403]: 1,\n [36244]: 1,\n [33319]: 2,\n [33320]: 2,\n [6407]: 3,\n [36248]: 3,\n [6408]: 4,\n [36249]: 4,\n [6402]: 1,\n [34041]: 1,\n [6406]: 1,\n [6409]: 1,\n [6410]: 2\n};\n/** @deprecated should be removed */\nconst TYPE_SIZES = {\n [5126]: 4,\n [5125]: 4,\n [5124]: 4,\n [5123]: 2,\n [5122]: 2,\n [5131]: 2,\n [5120]: 1,\n [5121]: 1\n};\n// FUNCTIONS\n/** Checks if a texture format is supported */\nexport function isTextureFormatSupported(gl, format, extensions) {\n const info = TEXTURE_FORMATS[format];\n if (!info) {\n return false;\n }\n // Check that we have a GL constant\n if (info.gl === undefined) {\n return false;\n }\n // Check extensions\n const extension = info.x || info.gl2ext;\n if (extension) {\n return Boolean(getWebGLExtension(gl, extension, extensions));\n }\n return true;\n}\nexport function isRenderbufferFormatSupported(gl, format, extensions) {\n // Note: Order is important since the function call initializes extensions.\n return isTextureFormatSupported(gl, format, extensions) && Boolean(TEXTURE_FORMATS[format]?.rb);\n}\n/** Checks if a texture format is supported */\nexport function getTextureFormatSupport(gl, format, extensions) {\n const info = TEXTURE_FORMATS[format];\n if (!info) {\n return { supported: false };\n }\n // let decoded;\n // try {\n // decoded = decodeTextureFormat(format);\n // } catch {}\n // Support Check that we have a GL constant\n let supported = info.gl === undefined;\n supported = supported && checkTextureFeature(gl, info.f, extensions);\n // Filtering\n // const filterable = info.filter\n // ? checkTextureFeature(gl, infofilter])\n // : decoded && !decoded.signed;\n // const renderable = info.filter\n // ? checkTextureFeature(gl, inforender])\n // : decoded && !decoded.signed;\n return {\n supported,\n renderable: supported && checkTextureFeature(gl, info.render, extensions),\n filterable: supported && checkTextureFeature(gl, info.filter, extensions),\n blendable: false, // tod,\n storable: false\n };\n}\n/** Checks whether linear filtering (interpolated sampling) is available for floating point textures */\nexport function isTextureFormatFilterable(gl, format, extensions) {\n if (!isTextureFormatSupported(gl, format, extensions)) {\n return false;\n }\n if (format.startsWith('depth') || format.startsWith('stencil')) {\n return false;\n }\n try {\n const decoded = decodeTextureFormat(format);\n if (decoded.signed) {\n return false;\n }\n }\n catch {\n return false;\n }\n if (format.endsWith('32float')) {\n return Boolean(getWebGLExtension(gl, 'OES_texture_float_linear, extensions', extensions));\n }\n if (format.endsWith('16float')) {\n return Boolean(getWebGLExtension(gl, 'OES_texture_half_float_linear, extensions', extensions));\n }\n return true;\n}\nexport function isTextureFormatRenderable(gl, format, extensions) {\n if (!isTextureFormatSupported(gl, format, extensions)) {\n return false;\n }\n if (typeof format === 'number') {\n return false; // isTextureFormatFilterableWebGL(gl, format);\n }\n // TODO depends on device...\n return true;\n}\n/** Get parameters necessary to work with format in WebGL: internalFormat, dataFormat, type, compressed, */\nexport function getTextureFormatWebGL(format) {\n const formatData = TEXTURE_FORMATS[format];\n const webglFormat = convertTextureFormatToGL(format);\n const decoded = decodeTextureFormat(format);\n return {\n internalFormat: webglFormat,\n format: formatData?.dataFormat ||\n getWebGLPixelDataFormat(decoded.format, 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] || 5121,\n // @ts-expect-error\n compressed: decoded.compressed\n };\n}\nexport function getDepthStencilAttachmentWebGL(format) {\n const info = TEXTURE_FORMATS[format];\n if (!info?.attachment) {\n throw new Error(`${format} is not a depth stencil format`);\n }\n return info.attachment;\n}\n/** TODO - VERY roundabout legacy way of calculating bytes per pixel */\nexport function getTextureFormatBytesPerPixel(format) {\n // TODO remove webgl1 support\n const params = getTextureFormatWebGL(format);\n // NOTE(Tarek): Default to RGBA bytes\n const channels = DATA_FORMAT_CHANNELS[params.format] || 4;\n const channelSize = TYPE_SIZES[params.type] || 1;\n return channels * channelSize;\n}\n// DATA TYPE HELPERS\nexport function getWebGLPixelDataFormat(dataFormat, integer, normalized, format) {\n // WebGL1 formats use same internalFormat\n if (format === 6408 || format === 6407) {\n return format;\n }\n // prettier-ignore\n switch (dataFormat) {\n case 'r': return integer && !normalized ? 36244 : 6403;\n case 'rg': return integer && !normalized ? 33320 : 33319;\n case 'rgb': return integer && !normalized ? 36248 : 6407;\n case 'rgba': return integer && !normalized ? 36249 : 6408;\n default: return 6408;\n }\n}\n/**\n * Map WebGPU style texture format strings to GL constants\n */\nfunction convertTextureFormatToGL(format) {\n const formatInfo = 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/**\n * Map WebGL texture formats (GL constants) to WebGPU-style TextureFormat strings\nexport function convertGLToTextureFormat(format: GL | TextureFormat): TextureFormat {\n if (typeof format === 'string') {\n return format;\n }\n const entry = Object.entries(TEXTURE_FORMATS).find(([, entry]) => entry.gl === format);\n if (!entry) {\n throw new Error(`Unknown texture format ${format}`);\n }\n return entry[0] as TextureFormat;\n}\n */\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { GL } from '@luma.gl/constants';\n/** Get vertex format from GL constants */\nexport function getVertexFormatFromGL(type, components) {\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/** Get data type from GL constants */\nexport function getVertexTypeFromGL(type, normalized = false) {\n // prettier-ignore\n switch (type) {\n // WebGPU does not support normalized 32 bit integer attributes\n case 5124: return normalized ? 'sint32' : 'sint32';\n case 5125: return normalized ? 'uint32' : 'uint32';\n case 5122: return normalized ? 'sint16' : 'unorm16';\n case 5123: return normalized ? 'uint16' : 'unorm16';\n case 5120: return normalized ? 'sint8' : 'snorm16';\n case 5121: return normalized ? 'uint8' : 'unorm8';\n case 5126: return 'float32';\n case 5131: return 'float16';\n }\n // @ts-ignore unreachable\n throw new Error(String(type));\n}\nexport function getGLFromVertexType(dataType) {\n // prettier-ignore\n switch (dataType) {\n case 'uint8': return 5121;\n case 'sint8': return 5120;\n case 'unorm8': return 5121;\n case 'snorm8': return 5120;\n case 'uint16': return 5123;\n case 'sint16': return 5122;\n case 'unorm16': return 5123;\n case 'snorm16': return 5122;\n case 'uint32': return 5125;\n case 'sint32': return 5124;\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 5131;\n case 'float32': return 5126;\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\nimport { DeviceLimits } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\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(3379); }\n get maxTextureDimension3D() { return this.getParameter(32883); }\n get maxTextureArrayLayers() { return this.getParameter(35071); }\n get maxBindGroups() { return 0; }\n get maxDynamicUniformBuffersPerPipelineLayout() { return 0; } // TBD\n get maxDynamicStorageBuffersPerPipelineLayout() { return 0; } // TBD\n get maxSampledTexturesPerShaderStage() { return this.getParameter(35660); } // ) TBD\n get maxSamplersPerShaderStage() { return this.getParameter(35661); }\n get maxStorageBuffersPerShaderStage() { return 0; } // TBD\n get maxStorageTexturesPerShaderStage() { return 0; } // TBD\n get maxUniformBuffersPerShaderStage() { return this.getParameter(35375); }\n get maxUniformBufferBindingSize() { return this.getParameter(35376); }\n get maxStorageBufferBindingSize() { return 0; }\n get minUniformBufferOffsetAlignment() { return this.getParameter(35380); }\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(34921); }\n get maxVertexBufferArrayStride() { return 2048; } // TBD, this is just the default value from WebGPU\n get maxInterStageShaderComponents() { return this.getParameter(35659); }\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 // PRIVATE\n gl;\n limits = {};\n constructor(gl) {\n super();\n this.gl = gl;\n }\n getParameter(parameter) {\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\nimport { CanvasContext } from '@luma.gl/core';\nimport { WEBGLFramebuffer } from \"./resources/webgl-framebuffer.js\";\n/**\n * A WebGL Canvas Context which manages the canvas and handles drawing buffer resizing etc\n */\nexport class WebGLCanvasContext extends CanvasContext {\n device;\n format = 'rgba8unorm';\n depthStencilFormat = 'depth24plus';\n presentationSize;\n _framebuffer = null;\n constructor(device, props) {\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 getCurrentFramebuffer() {\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 /** Resizes and updates render targets if necessary */\n update() {\n const size = this.getPixelSize();\n const sizeChanged = size[0] !== this.presentationSize[0] || size[1] !== this.presentationSize[1];\n if (sizeChanged) {\n this.presentationSize = size;\n this.resize();\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) {\n if (!this.device.gl)\n return;\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 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\nimport { Framebuffer } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\nimport { WEBGLTexture } from \"./webgl-texture.js\";\nimport { getDepthStencilAttachmentWebGL } from \"../converters/texture-formats.js\";\n/** luma.gl Framebuffer, WebGL implementation */\nexport class WEBGLFramebuffer extends Framebuffer {\n device;\n gl;\n handle;\n colorAttachments = [];\n depthStencilAttachment = null;\n constructor(device, props) {\n super(device, props);\n // WebGL default framebuffer handle is null\n const isDefaultFramebuffer = props.handle === null;\n this.device = device;\n this.gl = device.gl;\n this.handle =\n this.props.handle || isDefaultFramebuffer ? this.props.handle : this.gl.createFramebuffer();\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 // Auto create textures for attachments if needed\n this.autoCreateAttachmentTextures();\n /** Attach from a map of attachments */\n // @ts-expect-error native bindFramebuffer is overridden by our state tracker\n const prevHandle = this.gl.bindFramebuffer(36160, this.handle);\n // Walk the attachments\n for (let i = 0; i < this.colorAttachments.length; ++i) {\n const attachment = this.colorAttachments[i];\n const attachmentPoint = 36064 + i;\n if (attachment) {\n this._attachTexture(attachmentPoint, attachment);\n }\n }\n if (this.depthStencilAttachment) {\n this._attachTexture(getDepthStencilAttachmentWebGL(this.depthStencilAttachment.props.format), this.depthStencilAttachment);\n }\n /** Check the status */\n // @ts-expect-error\n if (props.check !== false) {\n const status = this.gl.checkFramebufferStatus(36160);\n if (status !== 36053) {\n throw new Error(`Framebuffer ${_getFrameBufferStatus(status)}`);\n }\n }\n this.gl.bindFramebuffer(36160, prevHandle);\n }\n }\n /** destroys any auto created resources etc. */\n destroy() {\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 // PRIVATE\n /** In WebGL we must use renderbuffers for depth/stencil attachments (unless we have extensions) */\n createDepthStencilTexture(format) {\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 * Attachment resize is expected to be a noop if size is same\n *\n protected 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 /** Attach one attachment */\n _attachTexture(attachmentPoint, textureView) {\n // if (attachment instanceof WEBGLRenderbuffer) {\n // this._attachWEBGLRenderbuffer(attachmentPoint, attachment);\n // return attachment;\n // }\n this._attachTextureView(attachmentPoint, textureView);\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 _attachTextureView(attachment, textureView) {\n const { gl } = this.device;\n const { texture } = textureView;\n const level = textureView.props.baseMipLevel;\n const layer = textureView.props.baseArrayLayer;\n gl.bindTexture(texture.glTarget, texture.handle);\n switch (texture.glTarget) {\n case 35866:\n case 32879:\n gl.framebufferTextureLayer(36160, attachment, texture.glTarget, level, layer);\n break;\n case 34067:\n // layer must be a cubemap face (or if index, converted to cube map face)\n const face = mapIndexToCubeMapFace(layer);\n gl.framebufferTexture2D(36160, attachment, face, texture.handle, level);\n break;\n case 3553:\n gl.framebufferTexture2D(36160, attachment, 3553, texture.handle, level);\n break;\n default:\n throw new Error('Illegal texture type');\n }\n gl.bindTexture(texture.glTarget, null);\n }\n}\n// Helper functions\n// Map an index to a cube map face constant\nfunction mapIndexToCubeMapFace(layer) {\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 < 34069\n ? layer + 34069\n : layer;\n}\n// Helper METHODS\n// Get a string describing the framebuffer error if installed\nfunction _getFrameBufferStatus(status) {\n switch (status) {\n case 36053:\n return 'success';\n case 36054:\n return 'Mismatched attachments';\n case 36055:\n return 'No attachments';\n case 36057:\n return 'Height/width mismatch';\n case 36061:\n return 'Unsupported or split attachments';\n // WebGL2\n case 36182:\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", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n// import {decodeTextureFormat} from '@luma.gl/core';\n// import {Buffer, Texture, log} from '@luma.gl/core';\nimport { Texture, log } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\n// import {GLPixelDataType} from '@luma.gl/constants';\nimport { withGLParameters } from \"../../context/state-tracker/with-parameters.js\";\n// getTextureFormatBytesPerPixel\nimport { getTextureFormatWebGL } from \"../converters/texture-formats.js\";\nimport { convertSamplerParametersToWebGL } from \"../converters/sampler-parameters.js\";\n// import {WEBGLBuffer} from './webgl-buffer';\nimport { WEBGLSampler } from \"./webgl-sampler.js\";\nimport { WEBGLTextureView } from \"./webgl-texture-view.js\";\n// import type {WebGLSetTextureOptions, WebGLCopyTextureOptions} from '../helpers/webgl-texture-utils';\nimport { initializeTextureStorage, \n// clearMipLevel,\ncopyCPUImageToMipLevel, copyCPUDataToMipLevel, \n// copyGPUBufferToMipLevel,\ngetWebGLTextureTarget } from \"../helpers/webgl-texture-utils.js\";\n// PORTABLE HELPERS (Move to methods on Texture?)\n/**\n * Normalize TextureData to an array of TextureLevelData / ExternalImages\n * @param data\n * @param options\n * @returns array of TextureLevelData / ExternalImages\n */\nfunction normalizeTextureData(data, options) {\n let lodArray;\n if (ArrayBuffer.isView(data)) {\n lodArray = [\n {\n // ts-expect-error does data really need to be Uint8ClampedArray?\n data,\n width: options.width,\n height: options.height\n // depth: options.depth\n }\n ];\n }\n else if (!Array.isArray(data)) {\n lodArray = [data];\n }\n else {\n lodArray = data;\n }\n return lodArray;\n}\n/**\n * WebGL... the texture API from hell... hopefully made simpler\n */\nexport class WEBGLTexture extends Texture {\n MAX_ATTRIBUTES;\n device;\n gl;\n handle;\n sampler = undefined; // TODO - currently unused in WebGL. Create dummy sampler?\n view = undefined; // TODO - currently unused in WebGL. Create dummy view?\n mipmaps = false;\n /**\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;\n // Texture type\n /** The WebGL format - essentially channel structure */\n glFormat;\n /** The WebGL data format - the type of each channel */\n glType;\n /** The WebGL constant corresponding to the WebGPU style constant in format */\n glInternalFormat;\n /** Whether the internal format is compressed */\n compressed;\n // data;\n // inherited props\n // dimension: ...\n // format: GLTextureTarget;\n // width: number = undefined;\n // height: number = undefined;\n // depth: number = undefined;\n // state\n /** Texture binding slot */\n textureUnit = 0;\n /** For automatically updating video */\n _video = null;\n constructor(device, props) {\n // Note: Clear out `props.data` so that we don't hold a reference to any big memory chunks\n super(device, { ...Texture.defaultProps, ...props, data: undefined });\n this.device = device;\n this.gl = this.device.gl;\n // Note: In WebGL the texture target defines the type of texture on first bind.\n this.glTarget = getWebGLTextureTarget(this.props.dimension);\n // The target format of this texture\n const format = getTextureFormatWebGL(this.props.format);\n this.glInternalFormat = format.internalFormat;\n this.glFormat = format.format;\n this.glType = format.type;\n this.compressed = format.compressed;\n if (typeof HTMLVideoElement !== 'undefined' &&\n props.data instanceof HTMLVideoElement &&\n // @ts-expect-error\n props.data.readyState < HTMLVideoElement.HAVE_METADATA) {\n const video = props.data;\n this._video = null; // Declare member before the object is sealed\n video.addEventListener('loadeddata', () => this.initialize(props));\n }\n // We removed data, we need to add it again.\n // @ts-expect-error\n this.initialize({ ...this.props, data: props.data });\n Object.seal(this);\n }\n /**\n * Initialize texture with supplied props\n */\n // eslint-disable-next-line max-statements\n initialize(props = {}) {\n this.handle = this.props.handle || this.gl.createTexture();\n this.device.setSpectorMetadata(this.handle, { ...this.props, data: typeof this.props.data });\n const data = props.data;\n // const {parameters = {} as Record<GL, any>} = props;\n let { width, height } = props;\n if (!width || !height) {\n const textureSize = this.getTextureDataSize(data);\n width = textureSize?.width || 1;\n height = textureSize?.height || 1;\n }\n // Store opts for accessors\n this.width = width;\n this.height = height;\n this.depth = props.depth;\n // Set texture sampler parameters\n this.setSampler(props.sampler);\n // @ts-ignore\n this.view = new WEBGLTextureView(this.device, { ...this.props, texture: this });\n this.bind();\n if (!this.props.data) {\n initializeTextureStorage(this.gl, this.mipLevels, this);\n }\n if (props.data) {\n // prettier-ignore\n switch (props.dimension) {\n case '1d':\n this.setTexture1DData(props.data);\n break;\n case '2d':\n this.setTexture2DData(props.data);\n break;\n case '3d':\n this.setTexture3DData(props.data);\n break;\n case 'cube':\n this.setTextureCubeData(props.data);\n break;\n case '2d-array':\n this.setTextureArrayData(props.data);\n break;\n case 'cube-array':\n this.setTextureCubeArrayData(props.data);\n break;\n // @ts-expect-error\n default: throw new Error(props.dimension);\n }\n }\n this.mipmaps = Boolean(props.mipmaps);\n if (this.mipmaps) {\n this.generateMipmap();\n }\n // if (isVideo) {\n // this._video = {\n // video: data,\n // // TODO - should we be using the sampler parameters here?\n // parameters: {},\n // // @ts-expect-error HTMLVideoElement.HAVE_CURRENT_DATA is not declared\n // lastTime: data.readyState >= HTMLVideoElement.HAVE_CURRENT_DATA ? data.currentTime : -1\n // };\n // }\n }\n /*\n initializeCube(props?: TextureProps): void {\n const {mipmaps = true} = props; // , parameters = {} as Record<GL, any>} = props;\n \n // Store props for accessors\n // this.props = props;\n \n // @ts-expect-error\n this.setCubeMapData(props).then(() => {\n // TODO - should genMipmap() be called on the cubemap or on the faces?\n // TODO - without generateMipmap() cube textures do not work at all!!! Why?\n if (mipmaps) {\n this.generateMipmap(props);\n }\n \n this.setSampler(props.sampler);\n \n // v8 compatibility?\n // const {parameters = {} as Record<GL, any>} = props;\n // this._setSamplerParameters(parameters);\n });\n }\n */\n destroy() {\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 toString() {\n return `Texture(${this.id},${this.width}x${this.height})`;\n }\n createView(props) {\n return new WEBGLTextureView(this.device, { ...props, texture: this });\n }\n setSampler(sampler = {}) {\n let samplerProps;\n if (sampler instanceof WEBGLSampler) {\n this.sampler = sampler;\n samplerProps = sampler.props;\n }\n else {\n this.sampler = new WEBGLSampler(this.device, sampler);\n samplerProps = sampler;\n }\n const parameters = convertSamplerParametersToWebGL(samplerProps);\n this._setSamplerParameters(parameters);\n }\n /** Update external texture (video frame or canvas) */\n update() {\n log.warn('Texture.update() not implemented');\n // if (this._video) {\n // const {video, parameters, lastTime} = this._video;\n // // @ts-expect-error\n // if (lastTime === video.currentTime || video.readyState < HTMLVideoElement.HAVE_CURRENT_DATA) {\n // return;\n // }\n // this.setSubImageData({\n // data: video,\n // parameters\n // });\n // if (this.mipmaps) {\n // this.generateMipmap();\n // }\n // this._video.lastTime = video.currentTime;\n // }\n }\n // Call to regenerate mipmaps after modifying texture(s)\n generateMipmap(params = {}) {\n if (!this.props.data) {\n return;\n }\n this.mipmaps = true;\n this.gl.bindTexture(this.glTarget, this.handle);\n withGLParameters(this.gl, params, () => {\n this.gl.generateMipmap(this.glTarget);\n });\n this.gl.bindTexture(this.glTarget, null);\n }\n // Image Data Setters\n setTexture1DData(data) {\n throw new Error('setTexture1DData not supported in WebGL.');\n }\n /** Set a simple texture */\n setTexture2DData(lodData, depth = 0, glTarget = this.glTarget) {\n this.bind();\n const lodArray = normalizeTextureData(lodData, this);\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 for (let lodLevel = 0; lodLevel < lodArray.length; lodLevel++) {\n const imageData = lodArray[lodLevel];\n this._setMipLevel(depth, lodLevel, imageData);\n }\n this.unbind();\n }\n /**\n * Sets a 3D texture\n * @param data\n */\n setTexture3DData(data) {\n if (this.props.dimension !== '3d') {\n throw new Error(this.id);\n }\n if (ArrayBuffer.isView(data)) {\n copyCPUDataToMipLevel(this.device.gl, data, this);\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, depth = 0) {\n if (this.props.dimension !== 'cube') {\n throw new Error(this.id);\n }\n // for (const face of Texture.CubeFaces) {\n // // this.setTextureCubeFaceData(face, data[face]);\n // }\n }\n /**\n * Sets an entire texture array\n * @param data\n */\n setTextureArrayData(data) {\n if (this.props.dimension !== '2d-array') {\n throw new Error(this.id);\n }\n throw new Error('setTextureArrayData not implemented.');\n }\n /**\n * Sets an entire texture cube array\n * @param data\n */\n setTextureCubeArrayData(data) {\n throw new Error('setTextureCubeArrayData not supported in WebGL2.');\n }\n setTextureCubeFaceData(lodData, face, depth = 0) {\n // assert(this.props.dimension === 'cube');\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 // const glFace = GL.TEXTURE_CUBE_MAP_POSITIVE_X + Texture.CubeFaces.indexOf(face);\n // const glType = GL.UNSIGNED_BYTE;\n // const {width, height, format = GL.RGBA, type = GL.UNSIGNED_BYTE} = this;\n // const {width, height, format = GL.RGBA, type = GL.UNSIGNED_BYTE} = this;\n this.bind();\n // for (let lodLevel = 0; lodLevel < lodData.length; lodLevel++) {\n // const imageData = lodData[lodLevel];\n // if (imageData instanceof ArrayBuffer) {\n // // const imageData = image instanceof ArrayBuffer ? new ImageData(new Uint8ClampedArray(image), this.width) : image;\n // this.device.gl.texImage2D?.(\n // glFace,\n // lodLevel,\n // this.glInternalFormat,\n // this.glInternalFormat,\n // glType,\n // imageData\n // );\n // }\n // }\n this.unbind();\n }\n // INTERNAL METHODS\n /** @todo update this method to accept LODs */\n setImageDataForFace(options) {\n const { face, width, height, pixels, data, format = 6408, type = 5121\n // generateMipmap = false // TODO\n } = options;\n const { gl } = this;\n const imageData = pixels || data;\n this.bind();\n if (imageData instanceof Promise) {\n imageData.then(resolvedImageData => this.setImageDataForFace(Object.assign({}, options, {\n face,\n data: resolvedImageData,\n pixels: resolvedImageData\n })));\n }\n else if (this.width || this.height) {\n gl.texImage2D(face, 0, format, width, height, 0 /* border*/, format, type, imageData);\n }\n else {\n gl.texImage2D(face, 0, format, format, type, imageData);\n }\n }\n _getImageDataMap(faceData) {\n for (let i = 0; i < Texture.CubeFaces.length; ++i) {\n const faceName = Texture.CubeFaces[i];\n if (faceData[faceName]) {\n faceData[34069 + i] = faceData[faceName];\n delete faceData[faceName];\n }\n }\n return faceData;\n }\n // RESOURCE METHODS\n /**\n * Sets sampler parameters on texture\n */\n _setSamplerParameters(parameters) {\n log.log(1, 'texture sampler parameters', parameters)();\n this.gl.bindTexture(this.glTarget, this.handle);\n for (const [pname, pvalue] of Object.entries(parameters)) {\n const param = Number(pname);\n const value = pvalue;\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 33082:\n case 33083:\n this.gl.texParameterf(this.glTarget, param, value);\n break;\n case 10241:\n this.gl.texParameteri(this.glTarget, param, value);\n break;\n case 10242:\n case 10243:\n this.gl.texParameteri(this.glTarget, param, value);\n break;\n case 34046:\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 this.gl.bindTexture(this.glTarget, null);\n }\n // CLASSIC\n /*\n setCubeMapData(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 // INTERNAL SETTERS\n /**\n * Copy a region of data from a CPU memory buffer into this texture.\n * @todo - GLUnpackParameters parameters\n */\n _setMipLevel(depth, level, textureData, offset = 0) {\n // if (!textureData) {\n // clearMipLevel(this.device.gl, {...this, depth, level});\n // return;\n // }\n if (Texture.isExternalImage(textureData)) {\n copyCPUImageToMipLevel(this.device.gl, textureData, { ...this, depth, level });\n return;\n }\n // @ts-expect-error\n if (this.isTextureLevelData(textureData)) {\n copyCPUDataToMipLevel(this.device.gl, textureData.data, {\n ...this,\n depth,\n level\n });\n return;\n }\n throw new Error('Texture: invalid image data');\n }\n // HELPERS\n getActiveUnit() {\n return this.gl.getParameter(34016) - 33984;\n }\n bind(textureUnit) {\n const { gl } = this;\n if (textureUnit !== undefined) {\n this.textureUnit = textureUnit;\n gl.activeTexture(33984 + textureUnit);\n }\n gl.bindTexture(this.glTarget, this.handle);\n return textureUnit;\n }\n unbind(textureUnit) {\n const { gl } = this;\n if (textureUnit !== undefined) {\n this.textureUnit = textureUnit;\n gl.activeTexture(33984 + textureUnit);\n }\n gl.bindTexture(this.glTarget, null);\n return textureUnit;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { setGLParameters } from \"../parameters/unified-parameter-api.js\";\nimport { pushContextState, popContextState } from \"./track-context-state.js\";\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(gl, parameters, func) {\n if (isObjectEmpty(parameters)) {\n // Avoid setting state if no parameters provided. Just call and return\n return func(gl);\n }\n const { nocatch = true } = parameters;\n pushContextState(gl);\n setGLParameters(gl, parameters);\n // Setup is done, call the function\n let value;\n if (nocatch) {\n // Avoid try catch to minimize stack size impact for safe execution paths\n value = func(gl);\n popContextState(gl);\n }\n else {\n // Wrap in a try-catch to ensure that parameters are restored on exceptions\n try {\n value = func(gl);\n }\n finally {\n popContextState(gl);\n }\n }\n return value;\n}\n// Helpers\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\nimport { GL } from '@luma.gl/constants';\nimport { convertCompareFunction } from \"./device-parameters.js\";\n/**\n * Convert WebGPU-style sampler props to WebGL\n * @param props\n * @returns\n */\nexport function convertSamplerParametersToWebGL(props) {\n const params = {};\n if (props.addressModeU) {\n params[10242] = convertAddressMode(props.addressModeU);\n }\n if (props.addressModeV) {\n params[10243] = convertAddressMode(props.addressModeV);\n }\n if (props.addressModeW) {\n params[32882] = convertAddressMode(props.addressModeW);\n }\n if (props.magFilter) {\n params[10240] = convertMaxFilterMode(props.magFilter);\n }\n if (props.minFilter || props.mipmapFilter) {\n // TODO - arbitrary choice of linear?\n params[10241] = convertMinFilterMode(props.minFilter || 'linear', props.mipmapFilter);\n }\n if (props.lodMinClamp !== undefined) {\n params[33082] = props.lodMinClamp;\n }\n if (props.lodMaxClamp !== undefined) {\n params[33083] = props.lodMaxClamp;\n }\n if (props.type === 'comparison-sampler') {\n // Setting prop.compare turns this into a comparison sampler\n params[34892] = 34894;\n }\n if (props.compare) {\n params[34893] = convertCompareFunction('compare', props.compare);\n }\n // Note depends on WebGL extension\n if (props.maxAnisotropy) {\n params[34046] = props.maxAnisotropy;\n }\n return params;\n}\n// HELPERS\n/** Convert address more */\nfunction convertAddressMode(addressMode) {\n switch (addressMode) {\n case 'clamp-to-edge':\n return 33071;\n case 'repeat':\n return 10497;\n case 'mirror-repeat':\n return 33648;\n }\n}\nfunction convertMaxFilterMode(maxFilter) {\n switch (maxFilter) {\n case 'nearest':\n return 9728;\n case 'linear':\n return 9729;\n }\n}\n/**\n * WebGPU has separate min filter and mipmap filter,\n * WebGL is combined and effectively offers 6 options\n */\nfunction convertMinFilterMode(minFilter, mipmapFilter) {\n if (!mipmapFilter) {\n return convertMaxFilterMode(minFilter);\n }\n switch (minFilter) {\n case 'nearest':\n return mipmapFilter === 'nearest' ? 9984 : 9986;\n case 'linear':\n return mipmapFilter === 'nearest' ? 9985 : 9987;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { log } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\nimport { pushContextState, popContextState } from \"../../context/state-tracker/track-context-state.js\";\nimport { setGLParameters } from \"../../context/parameters/unified-parameter-api.js\";\n/* eslint-disable no-unused-expressions */ // For expression ? gl.enable() : gl.disable()\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(device, parameters, glParameters, func) {\n if (isObjectEmpty(parameters)) {\n // Avoid setting state if no parameters provided. Just call and return\n return func(device);\n }\n // Wrap in a try-catch to ensure that parameters are restored on exceptions\n const webglDevice = device;\n pushContextState(webglDevice.gl);\n try {\n setDeviceParameters(device, parameters);\n setGLParameters(webglDevice.gl, glParameters);\n return func(device);\n }\n finally {\n popContextState(webglDevice.gl);\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(device, parameters, func) {\n if (isObjectEmpty(parameters)) {\n // Avoid setting state if no parameters provided. Just call and return\n return func(device);\n }\n // Wrap in a try-catch to ensure that parameters are restored on exceptions\n const webglDevice = device;\n pushContextState(webglDevice.gl);\n try {\n setGLParameters(webglDevice.gl, parameters);\n return func(device);\n }\n finally {\n popContextState(webglDevice.gl);\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(device, parameters, func) {\n if (isObjectEmpty(parameters)) {\n // Avoid setting state if no parameters provided. Just call and return\n return func(device);\n }\n // Wrap in a try-catch to ensure that parameters are restored on exceptions\n // @ts-expect-error\n pushContextState(device.gl);\n try {\n setDeviceParameters(device, parameters);\n return func(device);\n }\n finally {\n // @ts-expect-error\n popContextState(device.gl);\n }\n}\n/** Set WebGPU Style Parameters */\nexport function setDeviceParameters(device, parameters) {\n const webglDevice = device;\n const { gl } = webglDevice;\n // RASTERIZATION SETTINGS\n if (parameters.cullMode) {\n switch (parameters.cullMode) {\n case 'none':\n gl.disable(2884);\n break;\n case 'front':\n gl.enable(2884);\n gl.cullFace(1028);\n break;\n case 'back':\n gl.enable(2884);\n gl.cullFace(1029);\n break;\n }\n }\n if (parameters.frontFace) {\n gl.frontFace(map('frontFace', parameters.frontFace, {\n ccw: 2305,\n cw: 2304\n }));\n }\n if (parameters.unclippedDepth) {\n if (device.features.has('depth-clip-control')) {\n // EXT_depth_clamp\n gl.enable(34383);\n }\n }\n if (parameters.depthBias !== undefined) {\n gl.enable(32823);\n gl.polygonOffset(parameters.depthBias, parameters.depthBiasSlopeScale || 0);\n }\n // depthBiasSlopeScale: {\n // // Handled by depthBias\n // },\n // WEBGL EXTENSIONS\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 const vertex = map('provokingVertex', parameters.provokingVertex, {\n first: 36429,\n last: 36430\n });\n ext?.provokingVertexWEBGL(vertex);\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', parameters.polygonMode, {\n fill: 6914,\n line: 6913\n });\n ext?.polygonModeWEBGL(1028, mode);\n ext?.polygonModeWEBGL(1029, mode);\n }\n if (parameters.polygonOffsetLine) {\n gl.enable(10754);\n }\n }\n }\n if (device.features.has('shader-clip-cull-distance-webgl')) {\n if (parameters.clipDistance0) {\n gl.enable(12288);\n }\n if (parameters.clipDistance1) {\n gl.enable(12289);\n }\n if (parameters.clipDistance2) {\n gl.enable(12290);\n }\n if (parameters.clipDistance3) {\n gl.enable(12291);\n }\n if (parameters.clipDistance4) {\n gl.enable(12292);\n }\n if (parameters.clipDistance5) {\n gl.enable(12293);\n }\n if (parameters.clipDistance6) {\n gl.enable(12294);\n }\n if (parameters.clipDistance7) {\n gl.enable(12295);\n }\n }\n // DEPTH STENCIL\n if (parameters.depthWriteEnabled !== undefined) {\n gl.depthMask(mapBoolean('depthWriteEnabled', parameters.depthWriteEnabled));\n }\n if (parameters.depthCompare) {\n parameters.depthCompare !== 'always' ? gl.enable(2929) : gl.disable(2929);\n gl.depthFunc(convertCompareFunction('depthCompare', parameters.depthCompare));\n }\n if (parameters.stencilWriteMask) {\n const mask = parameters.stencilWriteMask;\n gl.stencilMaskSeparate(1028, mask);\n gl.stencilMaskSeparate(1029, mask);\n }\n if (parameters.stencilReadMask) {\n // stencilReadMask is handle inside stencil***Compare.\n log.warn('stencilReadMask not supported under WebGL');\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(2960)\n : gl.disable(2960);\n gl.stencilFuncSeparate(1028, glValue, 0, mask);\n gl.stencilFuncSeparate(1029, glValue, 0, mask);\n }\n if (parameters.stencilPassOperation &&\n parameters.stencilFailOperation &&\n parameters.stencilDepthFailOperation) {\n const dppass = convertStencilOperation('stencilPassOperation', parameters.stencilPassOperation);\n const sfail = convertStencilOperation('stencilFailOperation', parameters.stencilFailOperation);\n const dpfail = convertStencilOperation('stencilDepthFailOperation', parameters.stencilDepthFailOperation);\n gl.stencilOpSeparate(1028, sfail, dpfail, dppass);\n gl.stencilOpSeparate(1029, sfail, dpfail, dppass);\n }\n // stencilDepthFailOperation() {\n // // handled by stencilPassOperation\n // },\n // stencilFailOperation() {\n // // handled by stencilPassOperation\n // },\n // COLOR STATE\n if (parameters.blendColorOperation || parameters.blendAlphaOperation) {\n gl.enable(3042);\n const colorEquation = convertBlendOperationToEquation('blendColorOperation', parameters.blendColorOperation || 'add');\n const alphaEquation = convertBlendOperationToEquation('blendAlphaOperation', parameters.blendAlphaOperation || 'add');\n gl.blendEquationSeparate(colorEquation, alphaEquation);\n const colorSrcFactor = convertBlendFactorToFunction('blendColorSrcFactor', parameters.blendColorSrcFactor || 'one');\n const colorDstFactor = convertBlendFactorToFunction('blendColorDstFactor', parameters.blendColorDstFactor || 'zero');\n const alphaSrcFactor = convertBlendFactorToFunction('blendAlphaSrcFactor', parameters.blendAlphaSrcFactor || 'one');\n const alphaDstFactor = convertBlendFactorToFunction('blendAlphaDstFactor', parameters.blendAlphaDstFactor || 'zero');\n gl.blendFuncSeparate(colorSrcFactor, colorDstFactor, alphaSrcFactor, alphaDstFactor);\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*/\nexport function convertCompareFunction(parameter, value) {\n return map(parameter, value, {\n never: 512,\n less: 513,\n equal: 514,\n 'less-equal': 515,\n greater: 516,\n 'not-equal': 517,\n 'greater-equal': 518,\n always: 519\n });\n}\nexport function convertToCompareFunction(parameter, value) {\n return map(parameter, value, {\n [512]: 'never',\n [513]: 'less',\n [514]: 'equal',\n [515]: 'less-equal',\n [516]: 'greater',\n [517]: 'not-equal',\n [518]: 'greater-equal',\n [519]: 'always'\n });\n}\nfunction convertStencilOperation(parameter, value) {\n return map(parameter, value, {\n keep: 7680,\n zero: 0,\n replace: 7681,\n invert: 5386,\n 'increment-clamp': 7682,\n 'decrement-clamp': 7683,\n 'increment-wrap': 34055,\n 'decrement-wrap': 34056\n });\n}\nfunction convertBlendOperationToEquation(parameter, value) {\n return map(parameter, value, {\n add: 32774,\n subtract: 32778,\n 'reverse-subtract': 32779,\n min: 32775,\n max: 32776\n });\n}\nfunction convertBlendFactorToFunction(parameter, value) {\n return map(parameter, value, {\n one: 1,\n zero: 0,\n 'src-color': 768,\n 'one-minus-src-color': 769,\n 'dst-color': 774,\n 'one-minus-dst-color': 775,\n 'src-alpha': 770,\n 'one-minus-src-alpha': 771,\n 'dst-alpha': 772,\n 'one-minus-dst-alpha': 773,\n 'src-alpha-saturated': 776,\n 'constant-color': 32769,\n 'one-minus-constant-color': 32770,\n 'constant-alpha': 32771,\n 'one-minus-constant-alpha': 32772\n });\n}\nfunction message(parameter, value) {\n return `Illegal parameter ${value} for ${parameter}`;\n}\nfunction map(parameter, value, valueMap) {\n if (!(value in valueMap)) {\n throw new Error(message(parameter, value));\n }\n return valueMap[value];\n}\nfunction mapBoolean(parameter, value) {\n return value;\n}\n/** Returns true if given object is empty, false otherwise. */\nfunction isObjectEmpty(obj) {\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\nimport { Sampler } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\nimport { convertSamplerParametersToWebGL } from \"../converters/sampler-parameters.js\";\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 device;\n handle;\n parameters;\n constructor(device, props) {\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 destroy() {\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 toString() {\n return `Sampler(${this.id},${JSON.stringify(this.props)})`;\n }\n /** Set sampler parameters on the sampler */\n _setSamplerParameters(parameters) {\n for (const [pname, value] of Object.entries(parameters)) {\n // Apparently there are integer/float conversion issues requires two parameter setting functions in JavaScript.\n // For now, pick the float version for parameters specified as GLfloat.\n const param = Number(pname);\n switch (param) {\n case 33082:\n case 33083:\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// import {decodeTextureFormat} from '@luma.gl/core';\nimport { TextureView, Texture } from '@luma.gl/core';\nexport class WEBGLTextureView extends TextureView {\n device;\n gl;\n handle; // Does not have a WebGL representation\n texture;\n constructor(device, props) {\n super(device, { ...Texture.defaultProps, ...props });\n this.device = device;\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// import {Buffer} from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\n/** A \"border\" parameter is required in many WebGL texture APIs, but must always be 0... */\nconst BORDER = 0;\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(gl, levels, options) {\n const { dimension, width, height, depth = 0 } = options;\n const { glInternalFormat } = options;\n const glTarget = options.glTarget; // getCubeTargetWebGL(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 default:\n gl.texStorage2D(glTarget, levels, glInternalFormat, width, height);\n }\n}\n/**\n * Copy a region of compressed data from a GPU memory buffer into this texture.\n */\nexport function copyCPUImageToMipLevel(gl, image, options) {\n const { dimension, width, height, depth = 0, level = 0 } = options;\n const { x = 0, y = 0, z = 0 } = options;\n const { glFormat, glType } = options;\n const glTarget = getCubeTargetWebGL(options.glTarget, dimension, depth);\n // width = size.width,\n // height = size.height\n switch (dimension) {\n case '2d-array':\n case '3d':\n // prettier-ignore\n gl.texSubImage3D(glTarget, level, x, y, z, width, height, depth, glFormat, glType, image);\n break;\n case '2d':\n case 'cube':\n // prettier-ignore\n gl.texSubImage2D(glTarget, level, x, y, width, height, glFormat, glType, image);\n break;\n default:\n throw new Error(dimension);\n }\n}\n/**\n * Copy a region of data from a CPU memory buffer into this texture.\n */\nexport function copyCPUDataToMipLevel(gl, typedArray, options) {\n const { dimension, width, height, depth = 0, level = 0, byteOffset = 0 } = options;\n const { x = 0, y = 0, z = 0 } = options;\n const { glFormat, glType, compressed } = options;\n const glTarget = getCubeTargetWebGL(options.glTarget, dimension, depth);\n switch (dimension) {\n case '2d-array':\n case '3d':\n if (compressed) {\n // prettier-ignore\n gl.compressedTexSubImage3D(glTarget, level, x, y, z, width, height, depth, glFormat, typedArray, byteOffset); // , byteLength\n }\n else {\n // prettier-ignore\n gl.texSubImage3D(glTarget, level, x, y, z, width, height, depth, glFormat, glType, typedArray, byteOffset); // , byteLength\n }\n break;\n case '2d':\n case 'cube':\n if (compressed) {\n // prettier-ignore\n gl.compressedTexSubImage2D(glTarget, level, x, y, width, height, glFormat, typedArray, byteOffset); // , byteLength\n }\n else {\n // prettier-ignore\n gl.texSubImage2D(glTarget, level, x, y, width, height, glFormat, glType, typedArray, byteOffset); // , byteLength\n }\n break;\n default:\n throw new Error(dimension);\n }\n}\n/**\n * Copy a region of compressed data from a GPU memory buffer into this texture.\n */\nexport function copyGPUBufferToMipLevel(gl, webglBuffer, byteLength, options) {\n const { dimension, width, height, depth = 0, level = 0, byteOffset = 0 } = options;\n const { x = 0, y = 0, z = 0 } = options;\n const { glFormat, glType, compressed } = options;\n const glTarget = getCubeTargetWebGL(options.glTarget, dimension, depth);\n gl.bindBuffer(35052, webglBuffer);\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, level, x, y, z, width, height, depth, glFormat, byteLength, byteOffset);\n }\n else {\n // prettier-ignore\n gl.texSubImage3D(glTarget, level, x, y, z, width, height, depth, glFormat, glType, byteOffset);\n }\n break;\n case '2d':\n case 'cube':\n if (compressed) {\n // prettier-ignore\n gl.compressedTexSubImage2D(glTarget, level, x, y, width, height, glFormat, byteLength, byteOffset);\n }\n else {\n // prettier-ignore\n gl.texSubImage2D(glTarget, level, x, y, width, height, BORDER, glFormat, byteOffset);\n }\n break;\n default:\n throw new Error(dimension);\n }\n}\n// INTERNAL HELPERS\n/** Convert a WebGPU style texture constant to a WebGL style texture constant */\nexport function getWebGLTextureTarget(dimension) {\n // prettier-ignore\n switch (dimension) {\n case '1d': break; // not supported in any WebGL version\n case '2d': return 3553; // supported in WebGL1\n case '3d': return 32879; // supported in WebGL2\n case 'cube': return 34067; // supported in WebGL1\n case '2d-array': return 35866; // supported in WebGL2\n case 'cube-array': break; // not supported in any WebGL version\n }\n throw new Error(dimension);\n}\n/**\n * In WebGL, cube maps specify faces by overriding target instead of using the depth parameter.\n * @returns glTarget unchanged, if dimension !== 'cube'.\n */\nfunction getCubeTargetWebGL(glTarget, dimension, level) {\n return dimension === 'cube' ? 34069 + level : glTarget;\n}\n// texImage methods\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, level = 0} = options;\n const {glInternalFormat, glFormat, glType, compressed} = options;\n const glTarget = getCubeTargetWebGL(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, level, glInternalFormat, width, height, depth, BORDER, null);\n } else {\n // prettier-ignore\n gl.texImage3D( glTarget, level, 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, level, glInternalFormat, width, height, BORDER, null);\n } else {\n // prettier-ignore\n gl.texImage2D(glTarget, level, glInternalFormat, width, height, BORDER, glFormat, glType, null);\n }\n break;\n\n default:\n throw new Error(dimension);\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 = getCubeTargetWebGL(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 = getCubeTargetWebGL(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 = getCubeTargetWebGL(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*/\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { log } from '@luma.gl/core';\nimport { loadScript } from \"../../utils/load-script.js\";\nconst DEFAULT_SPECTOR_PROPS = {\n spector: log.get('spector') || log.get('inspect')\n};\n// https://github.com/BabylonJS/Spector.js#basic-usage\nconst SPECTOR_CDN_URL = 'https://spectorcdn.babylonjs.com/spector.bundle.js';\nconst LOG_LEVEL = 1;\nlet spector = null;\nlet initialized = false;\n/** Loads spector from CDN if not already installed */\nexport async function loadSpectorJS(props) {\n if (!globalThis.SPECTOR) {\n try {\n await loadScript(SPECTOR_CDN_URL);\n }\n catch (error) {\n log.warn(String(error));\n }\n }\n}\nexport function initializeSpectorJS(props) {\n props = { ...DEFAULT_SPECTOR_PROPS, ...props };\n if (!props?.spector) {\n return null;\n }\n if (!spector && globalThis.SPECTOR) {\n log.probe(LOG_LEVEL, 'SPECTOR found and initialized')();\n spector = new globalThis.SPECTOR.Spector();\n if (globalThis.luma) {\n globalThis.luma.spector = spector;\n }\n }\n if (!spector) {\n return null;\n }\n if (!initialized) {\n initialized = true;\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) => log.info('Spector capture started:', capture)());\n spector?.onCapture.add((capture) => {\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 spector?.resultView.display();\n spector?.resultView.addCapture(capture);\n });\n }\n if (props?.canvas) {\n // @ts-expect-error If spector is specified as a canvas id, only monitor that canvas\n if (typeof props.spector === 'string' && props.spector !== props.canvas.id) {\n return spector;\n }\n // capture startup\n // spector?.captureCanvas(props?.canvas);\n spector?.startCapture(props?.canvas, 500); // 500 commands\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 return spector;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\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, scriptId) {\n const head = document.getElementsByTagName('head')[0];\n if (!head) {\n throw new Error('loadScript');\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 return new Promise((resolve, reject) => {\n script.onload = resolve;\n script.onerror = error => reject(new Error(`Unable to load script '${scriptUrl}': ${error}`));\n head.appendChild(script);\n });\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\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.js\";\nconst WEBGL_DEBUG_CDN_URL = 'https://unpkg.com/webgl-debug@2.0.1/index.js';\n// Helper to get shared context data\nfunction getWebGLContextData(gl) {\n gl.luma = gl.luma || {};\n return gl.luma;\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() {\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// Returns (a potentially new) context with debug instrumentation turned off or on.\n// Note that this actually returns a new context\nexport function makeDebugContext(gl, props = {}) {\n return props.debug ? getDebugContext(gl, props) : getRealContext(gl);\n}\n// Returns the real context from either of the real/debug contexts\nfunction getRealContext(gl) {\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// Returns the debug context from either of the real/debug contexts\nfunction getDebugContext(gl, props) {\n if (!globalThis.WebGLDebugUtils) {\n log.warn('webgl-debug not loaded')();\n return gl;\n }\n const data = getWebGLContextData(gl);\n // If this already has a debug context, return it.\n if (data.debugContext) {\n return data.debugContext;\n }\n // Create a new debug context\n globalThis.WebGLDebugUtils.init({ ...GLEnum, ...gl });\n const glDebug = globalThis.WebGLDebugUtils.makeDebugContext(gl, onGLError.bind(null, props), onValidateGLFunc.bind(null, props));\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 // 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 }\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 // Return it\n return debugContext;\n}\n// DEBUG TRACING\nfunction getFunctionString(functionName, functionArgs) {\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}\nfunction onGLError(props, err, functionName, args) {\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 if (props.throwOnError) {\n throw new Error(message);\n }\n}\n// Don't generate function string until it is needed\nfunction onValidateGLFunc(props, functionName, functionArgs) {\n let functionString = '';\n if (log.level >= 1) {\n functionString = getFunctionString(functionName, functionArgs);\n log.log(1, functionString)();\n }\n // If array of breakpoint strings supplied, check if any of them is contained in current GLEnum function\n if (props.break && props.break.length > 0) {\n functionString = functionString || getFunctionString(functionName, functionArgs);\n const isBreakpoint = props.break.every((breakOn) => functionString.indexOf(breakOn) !== -1);\n if (isBreakpoint) {\n debugger; // eslint-disable-line\n }\n }\n for (const arg of functionArgs) {\n if (arg === undefined) {\n functionString = functionString || getFunctionString(functionName, functionArgs);\n if (props.throwOnError) {\n throw new Error(`Undefined argument: ${functionString}`);\n }\n else {\n log.error(`Undefined argument: ${functionString}`)();\n debugger; // eslint-disable-line\n }\n }\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { Buffer } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\n/** WebGL Buffer interface */\nexport class WEBGLBuffer extends Buffer {\n device;\n gl;\n handle;\n /** Target in OpenGL defines the type of buffer */\n glTarget;\n /** Usage is a hint on how frequently the buffer will be updates */\n glUsage;\n /** Index type is needed when issuing draw calls, so we pre-compute it */\n glIndexType = 5123;\n /** Number of bytes allocated on the GPU for this buffer */\n byteLength;\n /** Number of bytes used */\n bytesUsed;\n constructor(device, props = {}) {\n super(device, props);\n this.device = device;\n this.gl = this.device.gl;\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 // - 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' ? 5125 : 5123;\n // Set data: (re)initializes the buffer\n if (props.data) {\n this._initWithData(props.data, props.byteOffset, props.byteLength);\n }\n else {\n this._initWithByteLength(props.byteLength || 0);\n }\n }\n // PRIVATE METHODS\n /** Allocate a new buffer and initialize to contents of typed array */\n _initWithData(data, byteOffset = 0, byteLength = data.byteLength + byteOffset) {\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 this.bytesUsed = byteLength;\n this.byteLength = byteLength;\n this._setDebugData(data, byteOffset, byteLength);\n this.trackAllocatedMemory(byteLength);\n }\n // Allocate a GPU buffer of specified size.\n _initWithByteLength(byteLength) {\n // assert(byteLength >= 0);\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 // 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, data, this.glUsage);\n this.gl.bindBuffer(glTarget, null);\n this.bytesUsed = byteLength;\n this.byteLength = byteLength;\n this._setDebugData(null, 0, byteLength);\n this.trackAllocatedMemory(byteLength);\n return this;\n }\n destroy() {\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 write(data, byteOffset = 0) {\n const srcOffset = 0;\n const byteLength = undefined; // data.byteLength;\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 = 36663;\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 }\n else {\n this.gl.bufferSubData(glTarget, byteOffset, data);\n }\n this.gl.bindBuffer(glTarget, null);\n this._setDebugData(data, byteOffset, data.byteLength);\n }\n /** Asynchronously read data from the buffer */\n async readAsync(byteOffset = 0, byteLength) {\n return this.readSyncWebGL(byteOffset, byteLength);\n }\n /** Synchronously read data from the buffer. WebGL only. */\n readSyncWebGL(byteOffset = 0, byteLength) {\n byteLength = byteLength ?? this.byteLength - byteOffset;\n const data = new Uint8Array(byteLength);\n const dstOffset = 0;\n // Use GL.COPY_READ_BUFFER to avoid disturbing other targets and locking type\n this.gl.bindBuffer(36662, this.handle);\n this.gl.getBufferSubData(36662, byteOffset, data, dstOffset, byteLength);\n this.gl.bindBuffer(36662, null);\n // Update local `data` if offsets are 0\n this._setDebugData(data, byteOffset, byteLength);\n return data;\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(usage) {\n if (usage & Buffer.INDEX) {\n return 34963;\n }\n if (usage & Buffer.VERTEX) {\n return 34962;\n }\n if (usage & Buffer.UNIFORM) {\n return 35345;\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 34962;\n}\n/** @todo usage is not passed correctly */\nfunction getWebGLUsage(usage) {\n if (usage & Buffer.INDEX) {\n return 35044;\n }\n if (usage & Buffer.VERTEX) {\n return 35044;\n }\n if (usage & Buffer.UNIFORM) {\n return 35048;\n }\n return 35044;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { Shader, log } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\nimport { parseShaderCompilerLog } from \"../helpers/parse-shader-compiler-log.js\";\n/**\n * An immutable compiled shader program that execute portions of the GPU Pipeline\n */\nexport class WEBGLShader extends Shader {\n device;\n handle;\n constructor(device, props) {\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(35633);\n break;\n case 'fragment':\n this.handle = this.props.handle || this.device.gl.createShader(35632);\n break;\n default:\n throw new Error(this.props.stage);\n }\n this._compile(this.source);\n }\n destroy() {\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 async getCompilationInfo() {\n await this._waitForCompilationComplete();\n return this.getCompilationInfoSync();\n }\n getCompilationInfoSync() {\n const log = this.device.gl.getShaderInfoLog(this.handle);\n return log ? parseShaderCompilerLog(log) : [];\n }\n getTranslatedSource() {\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 // PRIVATE METHODS\n /** Compile a shader and get compilation status */\n async _compile(source) {\n const addGLSLVersion = (source) => source.startsWith('#version ') ? source : `#version 100\\n${source}`;\n source = addGLSLVersion(source);\n const { gl } = this.device;\n gl.shaderSource(this.handle, source);\n gl.compileShader(this.handle);\n // For performance reasons, avoid checking shader compilation errors on production\n if (log.level === 0) {\n this.compilationStatus = 'pending';\n return;\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 // 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 // The `Shader` base class will determine if debug window should be opened based on this.compilationStatus\n this.debugShader();\n }\n /** Use KHR_parallel_shader_compile extension if available */\n async _waitForCompilationComplete() {\n const waitMs = async (ms) => await new Promise(resolve => setTimeout(resolve, ms));\n const DELAY_MS = 10; // Shader compilation is typically quite fast (with some exceptions)\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 const { gl } = this.device;\n for (;;) {\n const complete = gl.getShaderParameter(this.handle, 37297);\n if (complete) {\n return;\n }\n await waitMs(DELAY_MS);\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 _getCompilationStatus() {\n this.compilationStatus = this.device.gl.getShaderParameter(this.handle, 35713)\n ? 'success'\n : 'error';\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/**\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) {\n // Parse the error - note: browser and driver dependent\n const lines = errLog.split(/\\r?\\n/);\n const messages = [];\n for (const line of lines) {\n if (line.length <= 1) {\n continue; // eslint-disable-line no-continue\n }\n const segments = line.split(':');\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 const [messageType, linePosition, lineNumber, ...rest] = segments;\n let lineNum = parseInt(lineNumber, 10);\n if (isNaN(lineNum)) {\n lineNum = 0;\n }\n let linePos = parseInt(linePosition, 10);\n if (isNaN(linePos)) {\n linePos = 0;\n }\n messages.push({\n message: rest.join(':').trim(),\n type: getMessageType(messageType),\n lineNum,\n linePos // TODO\n });\n }\n return messages;\n}\n/** Ensure supported type */\nfunction getMessageType(messageType) {\n const MESSAGE_TYPES = ['warning', 'error', 'info'];\n const lowerCaseType = messageType.toLowerCase();\n return (MESSAGE_TYPES.includes(lowerCaseType) ? lowerCaseType : 'info');\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { RenderPass } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\nimport { withGLParameters } from \"../../context/state-tracker/with-parameters.js\";\nimport { setGLParameters } from \"../../context/parameters/unified-parameter-api.js\";\nimport { pushContextState, popContextState } from \"../../context/state-tracker/track-context-state.js\";\n// Should collapse during minification\nconst GL_DEPTH_BUFFER_BIT = 0x00000100;\nconst GL_STENCIL_BUFFER_BIT = 0x00000400;\nconst GL_COLOR_BUFFER_BIT = 0x00004000;\nconst GL_COLOR = 0x1800;\nconst COLOR_CHANNELS = [0x1, 0x2, 0x4, 0x8]; // GPUColorWrite RED, GREEN, BLUE, ALPHA\nexport class WEBGLRenderPass extends RenderPass {\n device;\n /** Parameters that should be applied before each draw call */\n glParameters;\n constructor(device, props) {\n super(device, props);\n this.device = device;\n // TODO - do parameters (scissorRect) affect the clear operation?\n pushContextState(this.device.gl);\n this.setParameters(this.props.parameters);\n // Hack - for now WebGL draws in \"immediate mode\" (instead of queueing the operations)...\n this.clear();\n }\n end() {\n popContextState(this.device.gl);\n // should add commands to CommandEncoder.\n }\n pushDebugGroup(groupLabel) { }\n popDebugGroup() { }\n insertDebugMarker(markerLabel) { }\n // beginOcclusionQuery(queryIndex: number): void;\n // endOcclusionQuery(): void;\n // executeBundles(bundles: Iterable<GPURenderBundle>): void;\n /**\n * Maps RenderPass parameters to GL parameters\n */\n setParameters(parameters = {}) {\n const glParameters = { ...this.glParameters };\n // Framebuffers are specified using parameters in WebGL\n glParameters.framebuffer = this.props.framebuffer || null;\n if (this.props.depthReadOnly) {\n glParameters.depthMask = !this.props.depthReadOnly;\n }\n glParameters.stencilMask = this.props.stencilReadOnly ? 0 : 1;\n glParameters[35977] = this.props.discard;\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);\n glParameters.depthRange = [parameters.viewport[4], parameters.viewport[5]];\n }\n else {\n // WebGL viewports are 4 coordinates (X, Y)\n glParameters.viewport = parameters.viewport;\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[2967] = parameters.stencilReference;\n }\n if (parameters.colorMask) {\n glParameters.colorMask = COLOR_CHANNELS.map(channel => Boolean(channel & parameters.colorMask));\n }\n this.glParameters = glParameters;\n setGLParameters(this.device.gl, glParameters);\n }\n beginOcclusionQuery(queryIndex) {\n const webglQuerySet = this.props.occlusionQuerySet;\n webglQuerySet?.beginOcclusionQuery();\n }\n endOcclusionQuery() {\n const webglQuerySet = this.props.occlusionQuerySet;\n webglQuerySet?.endOcclusionQuery();\n }\n // PRIVATE\n /**\n * Optionally clears depth, color and stencil buffers based on parameters\n */\n clear() {\n const glParameters = { ...this.glParameters };\n let clearMask = 0;\n if (this.props.clearColor !== false) {\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 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 // TODO - clear multiple color attachments\n // for (attachment of this.framebuffer.colorAttachments) {\n // this.clearColorBuffer\n // }\n }\n }\n /**\n * WebGL2 - clear a specific color buffer\n */\n clearColorBuffer(drawBuffer = 0, value = [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 Int32Array:\n this.device.gl.clearBufferiv(GL_COLOR, drawBuffer, value);\n break;\n case Uint32Array:\n this.device.gl.clearBufferuiv(GL_COLOR, drawBuffer, value);\n break;\n case Float32Array:\n default:\n this.device.gl.clearBufferfv(GL_COLOR, drawBuffer, value);\n break;\n }\n });\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { RenderPipeline, log } from '@luma.gl/core';\n// import {getAttributeInfosFromLayouts} from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\nimport { getShaderLayout } from \"../helpers/get-shader-layout.js\";\nimport { withDeviceAndGLParameters } from \"../converters/device-parameters.js\";\nimport { setUniform } from \"../helpers/set-uniform.js\";\nimport { splitUniformsAndBindings } from \"../../utils/split-uniforms-and-bindings.js\";\nimport { WEBGLBuffer } from \"./webgl-buffer.js\";\nimport { WEBGLFramebuffer } from \"./webgl-framebuffer.js\";\nimport { WEBGLTexture } from \"./webgl-texture.js\";\nimport { WEBGLTextureView } from \"./webgl-texture-view.js\";\nimport { getGLDrawMode } from \"../helpers/webgl-topology-utils.js\";\nconst LOG_PROGRAM_PERF_PRIORITY = 4;\n/** Creates a new render pipeline */\nexport class WEBGLRenderPipeline extends RenderPipeline {\n /** The WebGL device that created this render pipeline */\n device;\n /** Handle to underlying WebGL program */\n handle;\n /** vertex shader */\n vs;\n /** fragment shader */\n fs;\n /** The layout extracted from shader by WebGL introspection APIs */\n introspectedLayout;\n /** Uniforms set on this model */\n uniforms = {};\n /** Bindings set on this model */\n bindings = {};\n /** WebGL varyings */\n varyings = null;\n _uniformCount = 0;\n _uniformSetters = {}; // TODO are these used?\n constructor(device, props) {\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 // Create shaders if needed\n this.vs = props.vs;\n this.fs = props.fs;\n // assert(this.vs.stage === 'vertex');\n // assert(this.fs.stage === 'fragment');\n // Setup varyings if supplied\n // @ts-expect-error WebGL only\n const { varyings, bufferMode = 35981 } = props;\n if (varyings && varyings.length > 0) {\n this.varyings = varyings;\n this.device.gl.transformFeedbackVaryings(this.handle, varyings, bufferMode);\n }\n this._linkShaders();\n log.time(1, `RenderPipeline ${this.id} - shaderLayout introspection`)();\n this.introspectedLayout = getShaderLayout(this.device.gl, this.handle);\n log.timeEnd(1, `RenderPipeline ${this.id} - shaderLayout introspection`)();\n // Merge provided layout with introspected layout\n this.shaderLayout = mergeShaderLayout(this.introspectedLayout, props.shaderLayout);\n }\n destroy() {\n if (this.handle) {\n this.device.gl.deleteProgram(this.handle);\n // this.handle = null;\n this.destroyed = true;\n }\n }\n /**\n * Bindings include: textures, samplers and uniform buffers\n * @todo needed for portable model\n */\n setBindings(bindings, options) {\n // if (log.priority >= 2) {\n // checkUniformValues(uniforms, this.id, this._uniformSetters);\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 = this.shaderLayout.bindings.find(binding => binding.name === name) ||\n this.shaderLayout.bindings.find(binding => binding.name === `${name}Uniforms`);\n if (!binding) {\n const validBindings = this.shaderLayout.bindings\n .map(binding => `\"${binding.name}\"`)\n .join(', ');\n if (!options?.disableWarnings) {\n log.warn(`Unknown binding \"${name}\" in render pipeline \"${this.id}\", expected one of ${validBindings}`)();\n }\n continue; // eslint-disable-line no-continue\n }\n if (!value) {\n log.warn(`Unsetting binding \"${name}\" in render pipeline \"${this.id}\"`)();\n }\n switch (binding.type) {\n case 'uniform':\n // @ts-expect-error\n if (!(value instanceof WEBGLBuffer) && !(value.buffer instanceof WEBGLBuffer)) {\n throw new Error('buffer value');\n }\n break;\n case 'texture':\n if (!(value instanceof WEBGLTextureView ||\n value instanceof WEBGLTexture ||\n value instanceof WEBGLFramebuffer)) {\n throw new Error('texture value');\n }\n break;\n case 'sampler':\n log.warn(`Ignoring sampler ${name}`)();\n break;\n default:\n throw new Error(binding.type);\n }\n this.bindings[name] = value;\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 const { renderPass, parameters = this.props.parameters, topology = this.props.topology, vertexArray, vertexCount, \n // indexCount,\n instanceCount, isInstanced = false, firstVertex = 0, \n // firstIndex,\n // firstInstance,\n // baseVertex,\n transformFeedback } = options;\n const glDrawMode = getGLDrawMode(topology);\n const isIndexed = Boolean(vertexArray.indexBuffer);\n const glIndexType = vertexArray.indexBuffer?.glIndexType;\n // Note that we sometimes get called with 0 instances\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 // 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 // (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 this.device.gl.useProgram(this.handle);\n // Note: Rebinds constant attributes before each draw call\n vertexArray.bindBeforeRender(renderPass);\n if (transformFeedback) {\n transformFeedback.begin(this.props.topology);\n }\n // We have to apply bindings before every draw call since other draw calls will overwrite\n this._applyBindings();\n this._applyUniforms();\n const webglRenderPass = renderPass;\n withDeviceAndGLParameters(this.device, parameters, webglRenderPass.glParameters, () => {\n if (isIndexed && isInstanced) {\n this.device.gl.drawElementsInstanced(glDrawMode, vertexCount || 0, // indexCount?\n glIndexType, firstVertex, instanceCount || 0);\n // } else if (isIndexed && this.device.isWebGL2 && !isNaN(start) && !isNaN(end)) {\n // this.device.gldrawRangeElements(glDrawMode, start, end, vertexCount, glIndexType, offset);\n }\n else if (isIndexed) {\n this.device.gl.drawElements(glDrawMode, vertexCount || 0, glIndexType, firstVertex); // indexCount?\n }\n else if (isInstanced) {\n this.device.gl.drawArraysInstanced(glDrawMode, firstVertex, vertexCount || 0, instanceCount || 0);\n }\n else {\n this.device.gl.drawArrays(glDrawMode, firstVertex, vertexCount || 0);\n }\n if (transformFeedback) {\n transformFeedback.end();\n }\n });\n vertexArray.unbindAfterRender(renderPass);\n return true;\n }\n // DEPRECATED METHODS\n setUniformsWebGL(uniforms) {\n const { bindings } = splitUniformsAndBindings(uniforms);\n Object.keys(bindings).forEach(name => {\n log.warn(`Unsupported value \"${JSON.stringify(bindings[name])}\" used in setUniforms() for key ${name}. Use setBindings() instead?`)();\n });\n // TODO - check against layout\n Object.assign(this.uniforms, uniforms);\n }\n // PRIVATE METHODS\n // setAttributes(attributes: Record<string, Buffer>): void {}\n // setBindings(bindings: Record<string, Binding>): void {}\n 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 // TODO Avoid checking program linking error in production\n if (log.level === 0) {\n // return;\n }\n if (!this.device.features.has('compilation-status-async-webgl')) {\n const status = this._getLinkStatus();\n this._reportLinkStatus(status);\n return;\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 /** Report link status. First, check for shader compilation failures if linking fails */\n _reportLinkStatus(status) {\n switch (status) {\n case 'success':\n return;\n default:\n // First check for shader compilation failures if linking fails\n if (this.vs.compilationStatus === 'error') {\n this.vs.debugShader();\n throw new Error(`Error during compilation of shader ${this.vs.id}`);\n }\n if (this.fs?.compilationStatus === 'error') {\n this.fs.debugShader();\n throw new Error(`Error during compilation of shader ${this.fs.id}`);\n }\n throw new Error(`Error during ${status}: ${this.device.gl.getProgramInfoLog(this.handle)}`);\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() {\n const { gl } = this.device;\n const linked = gl.getProgramParameter(this.handle, 35714);\n if (!linked) {\n this.linkStatus = 'error';\n return 'linking';\n }\n gl.validateProgram(this.handle);\n const validated = gl.getProgramParameter(this.handle, 35715);\n if (!validated) {\n this.linkStatus = 'error';\n return 'validation';\n }\n this.linkStatus = 'success';\n return 'success';\n }\n /** Use KHR_parallel_shader_compile extension if available */\n async _waitForLinkComplete() {\n const waitMs = async (ms) => await new Promise(resolve => setTimeout(resolve, ms));\n const DELAY_MS = 10; // Shader compilation is typically quite fast (with some exceptions)\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 const { gl } = this.device;\n for (;;) {\n const complete = gl.getProgramParameter(this.handle, 37297);\n if (complete) {\n return;\n }\n await waitMs(DELAY_MS);\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 for (const bindingInfo of this.shaderLayout.bindings) {\n if (!this.bindings[bindingInfo.name] &&\n !this.bindings[bindingInfo.name.replace(/Uniforms$/, '')]) {\n log.warn(`Binding ${bindingInfo.name} not found in ${this.id}`)();\n texturesRenderable = false;\n }\n }\n for (const [, texture] of Object.entries(this.bindings)) {\n if (texture instanceof WEBGLTexture) {\n texture.update();\n }\n }\n return texturesRenderable;\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 const { gl } = this.device;\n gl.useProgram(this.handle);\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 = 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 === 4294967295) {\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(35345, uniformBufferIndex, value.handle);\n }\n else {\n gl.bindBufferRange(35345, 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 uniformBufferIndex += 1;\n break;\n case 'texture':\n if (!(value instanceof WEBGLTextureView ||\n value instanceof WEBGLTexture ||\n value instanceof WEBGLFramebuffer)) {\n throw new Error('texture');\n }\n let texture;\n if (value instanceof WEBGLTextureView) {\n texture = value.texture;\n }\n else if (value instanceof WEBGLTexture) {\n texture = value;\n }\n else if (value instanceof WEBGLFramebuffer &&\n value.colorAttachments[0] instanceof WEBGLTextureView) {\n log.warn('Passing framebuffer in texture binding may be deprecated. Use fbo.colorAttachments[0] instead')();\n texture = value.colorAttachments[0].texture;\n }\n else {\n throw new Error('No texture');\n }\n gl.activeTexture(33984 + textureUnit);\n gl.bindTexture(texture.glTarget, texture.handle);\n // gl.bindSampler(textureUnit, sampler.handle);\n textureUnit += 1;\n break;\n case 'sampler':\n // ignore\n break;\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 * 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 * 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, overrideLayout) {\n // Deep clone the base layout\n const mergedLayout = {\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 }\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\nimport { GL } from '@luma.gl/constants';\nimport { Accessor } from \"../../classic/accessor.js\"; // TODO - should NOT depend on classic API\nimport { decodeGLUniformType, decodeGLAttributeType, isSamplerUniform } from \"./decode-webgl-types.js\";\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 getShaderLayout(gl, program) {\n const shaderLayout = {\n attributes: [],\n bindings: []\n };\n shaderLayout.attributes = readAttributeDeclarations(gl, program);\n // Uniform blocks\n const uniformBlocks = 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 location: uniformBlock.location,\n visibility: (uniformBlock.vertex ? 0x1 : 0) & (uniformBlock.fragment ? 0x2 : 0),\n minBindingSize: uniformBlock.byteLength,\n uniforms\n });\n }\n const uniforms = 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 location: textureUnit,\n viewDimension,\n sampleType\n });\n // @ts-expect-error\n uniform.textureUnit = textureUnit;\n textureUnit += 1;\n }\n }\n if (uniforms.length) {\n shaderLayout.uniforms = uniforms;\n }\n // Varyings\n const varyings = 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 return shaderLayout;\n}\n// HELPERS\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(gl, program) {\n const attributes = [];\n const count = gl.getProgramParameter(program, 35721);\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 // 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 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 // Sort by declaration order\n attributes.sort((a, b) => a.location - b.location);\n return attributes;\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, program) {\n const varyings = [];\n const count = gl.getProgramParameter(program, 35971);\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 accessor = new Accessor({ type: glType, size: size * components });\n const varying = { location, name, accessor }; // Base values\n varyings.push(varying);\n }\n varyings.sort((a, b) => a.location - b.location);\n return varyings;\n}\n/**\n * Extract info about all uniforms\n *\n * Query uniform locations and build name to setter map.\n */\nfunction readUniformBindings(gl, program) {\n const uniforms = [];\n const uniformCount = gl.getProgramParameter(program, 35718);\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,\n name,\n size,\n type,\n isArray\n };\n uniforms.push(uniformInfo);\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 webglLocation = gl.getUniformLocation(program, elementName);\n const arrayElementUniformInfo = {\n ...uniformInfo,\n name: elementName,\n location: webglLocation\n };\n uniforms.push(arrayElementUniformInfo);\n }\n }\n }\n return uniforms;\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(gl, program) {\n const getBlockParameter = (blockIndex, pname) => gl.getActiveUniformBlockParameter(program, blockIndex, pname);\n const uniformBlocks = [];\n const blockCount = gl.getProgramParameter(program, 35382);\n for (let blockIndex = 0; blockIndex < blockCount; blockIndex++) {\n const blockInfo = {\n name: gl.getActiveUniformBlockName(program, blockIndex) || '',\n location: getBlockParameter(blockIndex, 35391),\n byteLength: getBlockParameter(blockIndex, 35392),\n vertex: getBlockParameter(blockIndex, 35396),\n fragment: getBlockParameter(blockIndex, 35398),\n uniformCount: getBlockParameter(blockIndex, 35394),\n uniforms: []\n };\n const uniformIndices = getBlockParameter(blockIndex, 35395) || [];\n const uniformType = gl.getActiveUniforms(program, uniformIndices, 35383); // Array of GLenum indicating the types of the uniforms.\n const uniformArrayLength = gl.getActiveUniforms(program, uniformIndices, 35384); // 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, 35387); // Array of GLint indicating the uniform buffer offsets.\n const uniformStride = gl.getActiveUniforms(program, uniformIndices, 35388); // 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 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 uniformBlocks.push(blockInfo);\n }\n uniformBlocks.sort((a, b) => a.location - b.location);\n return uniformBlocks;\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*/\nconst SAMPLER_UNIFORMS_GL_TO_GPU = {\n [35678]: ['2d', 'float'],\n [35680]: ['cube', 'float'],\n [35679]: ['3d', 'float'],\n [35682]: ['3d', 'depth'],\n [36289]: ['2d-array', 'float'],\n [36292]: ['2d-array', 'depth'],\n [36293]: ['cube', 'float'],\n [36298]: ['2d', 'sint'],\n [36299]: ['3d', 'sint'],\n [36300]: ['cube', 'sint'],\n [36303]: ['2d-array', 'uint'],\n [36306]: ['2d', 'uint'],\n [36307]: ['3d', 'uint'],\n [36308]: ['cube', 'uint'],\n [36311]: ['2d-array', 'uint']\n};\nfunction getSamplerInfo(type) {\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// HELPERS\nfunction parseUniformName(name) {\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 // 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 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\nimport { GL } from '@luma.gl/constants';\nimport { getTypedArrayFromGLType } from \"./typed-array-utils.js\";\nconst DEFAULT_ACCESSOR_VALUES = {\n offset: 0,\n stride: 0,\n type: 5126,\n size: 1,\n divisor: 0,\n normalized: false,\n integer: false\n};\nexport class Accessor {\n offset;\n stride;\n type;\n size;\n divisor;\n normalized;\n integer;\n buffer;\n index;\n static getBytesPerElement(accessor) {\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 || 5126);\n return ArrayType.BYTES_PER_ELEMENT;\n }\n static getBytesPerVertex(accessor) {\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 || 5126);\n return ArrayType.BYTES_PER_ELEMENT * accessor.size;\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) {\n return new Accessor(...[DEFAULT_ACCESSOR_VALUES, ...accessors]); // Default values\n }\n constructor(...accessors) {\n accessors.forEach(accessor => this._assign(accessor)); // Merge in sequence\n Object.freeze(this);\n }\n toString() {\n return JSON.stringify(this);\n }\n // ACCESSORS\n // TODO - remove>\n get BYTES_PER_ELEMENT() {\n return Accessor.getBytesPerElement(this);\n }\n get BYTES_PER_VERTEX() {\n return Accessor.getBytesPerVertex(this);\n }\n // PRIVATE\n // eslint-disable-next-line complexity, max-statements\n _assign(props = {}) {\n if (props.type !== undefined) {\n this.type = props.type;\n // Auto-deduce integer type?\n if (props.type === 5124 || props.type === 5125) {\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 // INSTANCE DIVISOR\n if (props.divisor !== undefined) {\n this.divisor = props.divisor;\n }\n // Buffer is optional\n if (props.buffer !== undefined) {\n this.buffer = props.buffer;\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 }\n else {\n this.index = props.index;\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 if (this.offset === undefined)\n delete this.offset;\n if (this.stride === undefined)\n delete this.stride;\n if (this.type === undefined)\n delete this.type;\n if (this.size === undefined)\n delete this.size;\n if (this.divisor === undefined)\n delete this.divisor;\n if (this.normalized === undefined)\n delete this.normalized;\n if (this.integer === undefined)\n delete this.integer;\n if (this.buffer === undefined)\n delete this.buffer;\n if (this.index === undefined)\n delete this.index;\n return this;\n }\n}\n// TEST EXPORTS\nexport { DEFAULT_ACCESSOR_VALUES };\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { GL } from '@luma.gl/constants';\nconst ERR_TYPE_DEDUCTION = 'Failed to deduce GL constant from typed array';\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) {\n // If typed array, look up constructor\n const type = ArrayBuffer.isView(arrayOrType) ? arrayOrType.constructor : arrayOrType;\n switch (type) {\n case Float32Array:\n return 5126;\n case Uint16Array:\n return 5123;\n case Uint32Array:\n return 5125;\n case Uint8Array:\n return 5121;\n case Uint8ClampedArray:\n return 5121;\n case Int8Array:\n return 5120;\n case Int16Array:\n return 5122;\n case Int32Array:\n return 5124;\n default:\n throw new Error(ERR_TYPE_DEDUCTION);\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(glType, options) {\n const { clamped = true } = options || {};\n // Sorted in some order of likelihood to reduce amount of comparisons\n switch (glType) {\n case 5126:\n return Float32Array;\n case 5123:\n case 33635:\n case 32819:\n case 32820:\n return Uint16Array;\n case 5125:\n return Uint32Array;\n case 5121:\n return clamped ? Uint8ClampedArray : Uint8Array;\n case 5120:\n return Int8Array;\n case 5122:\n return Int16Array;\n case 5124:\n return Int32Array;\n default:\n throw new Error('Failed to deduce typed array type from GL constant');\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 const { data, width, height, bytesPerPixel = 4, temp } = options;\n const bytesPerRow = width * bytesPerPixel;\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}\nexport function scalePixels(options) {\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\nimport { GL } from '@luma.gl/constants';\n/** Check is uniform is of sampler type */\nexport function isSamplerUniform(type) {\n return SAMPLER_TYPES.includes(type);\n}\nconst SAMPLER_TYPES = [\n 35678,\n 35680,\n 35679,\n 35682,\n 36289,\n 36292,\n 36293,\n 36298,\n 36299,\n 36300,\n 36303,\n 36306,\n 36307,\n 36308,\n 36311\n];\n// Composite types table\nconst COMPOSITE_GL_TYPES = {\n [5126]: [5126, 1, 'float', 'f32', 'float32'],\n [35664]: [5126, 2, 'vec2', 'vec2<f32>', 'float32x2'],\n [35665]: [5126, 3, 'vec3', 'vec3<f32>', 'float32x3'],\n [35666]: [5126, 4, 'vec4', 'vec4<f32>', 'float32x4'],\n [5124]: [5124, 1, 'int', 'i32', 'sint32'],\n [35667]: [5124, 2, 'ivec2', 'vec2<i32>', 'sint32x2'],\n [35668]: [5124, 3, 'ivec3', 'vec3<i32>', 'sint32x3'],\n [35669]: [5124, 4, 'ivec4', 'vec4<i32>', 'sint32x4'],\n [5125]: [5125, 1, 'uint', 'u32', 'uint32'],\n [36294]: [5125, 2, 'uvec2', 'vec2<u32>', 'uint32x2'],\n [36295]: [5125, 3, 'uvec3', 'vec3<u32>', 'uint32x3'],\n [36296]: [5125, 4, 'uvec4', 'vec4<u32>', 'uint32x4'],\n [35670]: [5126, 1, 'bool', 'f32', 'float32'],\n [35671]: [5126, 2, 'bvec2', 'vec2<f32>', 'float32x2'],\n [35672]: [5126, 3, 'bvec3', 'vec3<f32>', 'float32x3'],\n [35673]: [5126, 4, 'bvec4', 'vec4<f32>', 'float32x4'],\n // TODO - are sizes/components below correct?\n [35674]: [5126, 8, 'mat2', 'mat2x2<f32>'], // 4\n [35685]: [5126, 8, 'mat2x3', 'mat2x3<f32>'], // 6\n [35686]: [5126, 8, 'mat2x4', 'mat2x4<f32>'], // 8\n [35687]: [5126, 12, 'mat3x2', 'mat3x2<f32>'], // 6\n [35675]: [5126, 12, 'mat3', 'mat3x3<f32>'], // 9\n [35688]: [5126, 12, 'mat3x4', 'mat3x4<f32>'], // 12\n [35689]: [5126, 16, 'mat4x2', 'mat4x2<f32>'], // 8\n [35690]: [5126, 16, 'mat4x3', 'mat4x3<f32>'], // 12\n [35676]: [5126, 16, 'mat4', 'mat4x4<f32>'] // 16\n};\n/** Decomposes a composite type (GL.VEC3) into a basic type (GL.FLOAT) and components (3) */\nexport function decodeGLUniformType(glUniformType) {\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/** Decomposes a composite type (GL.VEC3) into a basic type (GL.FLOAT) and components (3) */\nexport function decodeGLAttributeType(glAttributeType) {\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;\n return { attributeType, vertexFormat, components }; // , glType};\n}\n/** Decomposes a composite type GL.VEC3 into a basic type (GL.FLOAT) and components (3) */\nexport function decomposeCompositeGLDataType(compositeGLDataType) {\n const typeAndSize = COMPOSITE_GL_TYPES[compositeGLDataType];\n if (!typeAndSize) {\n return null;\n }\n const [type, components] = typeAndSize;\n return { type, components };\n}\nexport function getCompositeGLDataType(type, components) {\n switch (type) {\n case 5120:\n case 5121:\n case 5122:\n case 5123:\n type = 5126;\n break;\n default:\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\nimport { GL } from '@luma.gl/constants';\n/** Set a raw uniform (without type conversion and caching) */\n/* eslint-disable max-len */\nexport function setUniform(gl, location, type, value) {\n const gl2 = gl;\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 // prettier-ignore\n switch (type) {\n case 35678:\n case 35680:\n case 35679:\n case 35682:\n case 36289:\n case 36292:\n case 36293:\n case 36298:\n case 36299:\n case 36300:\n case 36303:\n case 36306:\n case 36307:\n case 36308:\n case 36311:\n if (typeof value !== 'number') {\n throw new Error('samplers must be set to integers');\n }\n return gl.uniform1i(location, value);\n case 5126: return gl.uniform1fv(location, arrayValue);\n case 35664: return gl.uniform2fv(location, arrayValue);\n case 35665: return gl.uniform3fv(location, arrayValue);\n case 35666: return gl.uniform4fv(location, arrayValue);\n case 5124: return gl.uniform1iv(location, arrayValue);\n case 35667: return gl.uniform2iv(location, arrayValue);\n case 35668: return gl.uniform3iv(location, arrayValue);\n case 35669: return gl.uniform4iv(location, arrayValue);\n case 35670: return gl.uniform1iv(location, arrayValue);\n case 35671: return gl.uniform2iv(location, arrayValue);\n case 35672: return gl.uniform3iv(location, arrayValue);\n case 35673: return gl.uniform4iv(location, arrayValue);\n // WEBGL2 - unsigned integers\n case 5125: return gl2.uniform1uiv(location, arrayValue, 1);\n case 36294: return gl2.uniform2uiv(location, arrayValue, 2);\n case 36295: return gl2.uniform3uiv(location, arrayValue, 3);\n case 36296: return gl2.uniform4uiv(location, arrayValue, 4);\n // WebGL2 - quadratic matrices\n // false: don't transpose the matrix\n case 35674: return gl.uniformMatrix2fv(location, false, arrayValue);\n case 35675: return gl.uniformMatrix3fv(location, false, arrayValue);\n case 35676: return gl.uniformMatrix4fv(location, false, arrayValue);\n // WebGL2 - rectangular matrices\n case 35685: return gl2.uniformMatrix2x3fv(location, false, arrayValue);\n case 35686: return gl2.uniformMatrix2x4fv(location, false, arrayValue);\n case 35687: return gl2.uniformMatrix3x2fv(location, false, arrayValue);\n case 35688: return gl2.uniformMatrix3x4fv(location, false, arrayValue);\n case 35689: return gl2.uniformMatrix4x2fv(location, false, arrayValue);\n case 35690: return gl2.uniformMatrix4x3fv(location, false, arrayValue);\n }\n throw new Error('Illegal uniform');\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { isNumericArray } from '@math.gl/types';\nexport function isUniformValue(value) {\n return isNumericArray(value) !== null || typeof value === 'number' || typeof value === 'boolean';\n}\nexport function splitUniformsAndBindings(uniforms) {\n const result = { bindings: {}, uniforms: {} };\n Object.keys(uniforms).forEach(name => {\n const uniform = uniforms[name];\n if (isUniformValue(uniform)) {\n result.uniforms[name] = uniform;\n }\n else {\n result.bindings[name] = uniform;\n }\n });\n return result;\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { GL } from '@luma.gl/constants';\n// Counts the number of complete primitives given a number of vertices and a drawMode\nexport function getPrimitiveDrawMode(drawMode) {\n switch (drawMode) {\n case 0:\n return 0;\n case 1:\n return 1;\n case 3:\n return 1;\n case 2:\n return 1;\n case 4:\n return 4;\n case 5:\n return 4;\n case 6:\n return 4;\n default:\n throw new Error('drawMode');\n }\n}\n// Counts the number of complete \"primitives\" given a number of vertices and a drawMode\nexport function getPrimitiveCount(options) {\n const { drawMode, vertexCount } = options;\n switch (drawMode) {\n case 0:\n case 2:\n return vertexCount;\n case 1:\n return vertexCount / 2;\n case 3:\n return vertexCount - 1;\n case 4:\n return vertexCount / 3;\n case 5:\n case 6:\n return vertexCount - 2;\n default:\n throw new Error('drawMode');\n }\n}\n// Counts the number of vertices after splitting the vertex stream into separate \"primitives\"\nexport function getVertexCount(options) {\n const { drawMode, vertexCount } = options;\n const primitiveCount = getPrimitiveCount({ drawMode, vertexCount });\n switch (getPrimitiveDrawMode(drawMode)) {\n case 0:\n return primitiveCount;\n case 1:\n return primitiveCount * 2;\n case 4:\n return primitiveCount * 3;\n default:\n throw new Error('drawMode');\n }\n}\n/** Get the primitive type for draw */\nexport function getGLDrawMode(topology) {\n // prettier-ignore\n switch (topology) {\n case 'point-list': return 0;\n case 'line-list': return 1;\n case 'line-strip': return 3;\n case 'triangle-list': return 4;\n case 'triangle-strip': return 5;\n default: throw new Error(topology);\n }\n}\n/** Get the primitive type for transform feedback */\nexport function getGLPrimitive(topology) {\n // prettier-ignore\n switch (topology) {\n case 'point-list': return 0;\n case 'line-list': return 1;\n case 'line-strip': return 1;\n case 'triangle-list': return 4;\n case 'triangle-strip': return 4;\n default: throw new Error(topology);\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CommandEncoder } from '@luma.gl/core';\nimport { WEBGLCommandBuffer } from \"./webgl-command-buffer.js\";\nexport class WEBGLCommandEncoder extends CommandEncoder {\n device;\n commandBuffer;\n constructor(device, props) {\n super(device, props);\n this.device = device;\n this.commandBuffer = new WEBGLCommandBuffer(device);\n }\n destroy() { }\n finish() {\n this.commandBuffer.submitCommands();\n }\n // beginRenderPass(GPURenderPassDescriptor descriptor): GPURenderPassEncoder;\n // beginComputePass(optional GPUComputePassDescriptor descriptor = {}): GPUComputePassEncoder;\n // finish(options?: {id?: string}): GPUCommandBuffer;\n copyBufferToBuffer(options) {\n this.commandBuffer.commands.push({ name: 'copy-buffer-to-buffer', options });\n }\n copyBufferToTexture(options) {\n this.commandBuffer.commands.push({ name: 'copy-buffer-to-texture', options });\n }\n copyTextureToBuffer(options) {\n this.commandBuffer.commands.push({ name: 'copy-texture-to-buffer', options });\n }\n copyTextureToTexture(options) {\n this.commandBuffer.commands.push({ name: 'copy-texture-to-texture', options });\n }\n pushDebugGroup(groupLabel) { }\n popDebugGroup() { }\n insertDebugMarker(markerLabel) { }\n resolveQuerySet(querySet, destination, options) { }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { CommandBuffer, Texture } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\nimport { WEBGLTexture } from \"./webgl-texture.js\";\nimport { getTextureFormatWebGL } from \"../converters/texture-formats.js\";\nexport class WEBGLCommandBuffer extends CommandBuffer {\n device;\n commands = [];\n constructor(device) {\n super(device, {});\n this.device = device;\n }\n submitCommands(commands = 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 }\n }\n }\n}\nfunction _copyBufferToBuffer(device, options) {\n const source = options.source;\n const destination = options.destination;\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(36662, source.handle);\n device.gl.bindBuffer(36663, destination.handle);\n device.gl.copyBufferSubData(36662, 36663, options.sourceOffset ?? 0, options.destinationOffset ?? 0, options.size);\n device.gl.bindBuffer(36662, null);\n device.gl.bindBuffer(36663, null);\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, options) {\n throw new Error('Not implemented');\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, options) {\n const { \n /** Texture to copy to/from. */\n source, \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 /** Width to copy */\n width = options.source.width, \n /** Height to copy */\n height = options.source.height, 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 /** Destination buffer */\n destination, \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 &times; 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 } = options;\n // TODO - Not possible to read just stencil or depth part in WebGL?\n if (aspect !== 'all') {\n throw new Error('not supported');\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 // Asynchronous read (PIXEL_PACK_BUFFER) is WebGL2 only feature\n const { framebuffer, destroyFramebuffer } = getFramebuffer(source);\n let prevHandle;\n try {\n const webglBuffer = destination;\n const sourceWidth = width || framebuffer.width;\n const sourceHeight = height || framebuffer.height;\n const sourceParams = getTextureFormatWebGL(framebuffer.colorAttachments[0].texture.props.format);\n const sourceFormat = sourceParams.format;\n const sourceType = sourceParams.type;\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 device.gl.bindBuffer(35051, webglBuffer.handle);\n // @ts-expect-error native bindFramebuffer is overridden by our state tracker\n prevHandle = device.gl.bindFramebuffer(36160, framebuffer.handle);\n device.gl.readPixels(origin[0], origin[1], sourceWidth, sourceHeight, sourceFormat, sourceType, byteOffset);\n }\n finally {\n device.gl.bindBuffer(35051, null);\n // prevHandle may be unassigned if the try block failed before binding\n if (prevHandle !== undefined) {\n device.gl.bindFramebuffer(36160, prevHandle);\n }\n if (destroyFramebuffer) {\n framebuffer.destroy();\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 * 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, options) {\n const { \n /** Texture to copy to/from. */\n source, \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 /** Defines the origin of the copy - the minimum corner of the texture sub-region to copy to. */\n destinationOrigin = [0, 0], \n /** Texture to copy to/from. */\n destination\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 let { width = options.destination.width, height = options.destination.height\n // depthOrArrayLayers = 0\n } = options;\n const { framebuffer, destroyFramebuffer } = getFramebuffer(source);\n const [sourceX, sourceY] = origin;\n const [destinationX, destinationY, destinationZ] = destinationOrigin;\n // @ts-expect-error native bindFramebuffer is overridden by our state tracker\n const prevHandle = device.gl.bindFramebuffer(36160, framebuffer.handle);\n // TODO - support gl.readBuffer (WebGL2 only)\n // const prevBuffer = gl.readBuffer(attachment);\n let texture = null;\n let textureTarget;\n if (destination instanceof WEBGLTexture) {\n texture = destination;\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 }\n else {\n throw new Error('invalid destination');\n }\n switch (textureTarget) {\n case 3553:\n case 34067:\n device.gl.copyTexSubImage2D(textureTarget, destinationMipLevel, destinationX, destinationY, sourceX, sourceY, width, height);\n break;\n case 35866:\n case 32879:\n device.gl.copyTexSubImage3D(textureTarget, destinationMipLevel, destinationX, destinationY, destinationZ, sourceX, sourceY, width, height);\n break;\n default:\n }\n if (texture) {\n texture.unbind();\n }\n device.gl.bindFramebuffer(36160, prevHandle);\n if (destroyFramebuffer) {\n framebuffer.destroy();\n }\n}\n// Returns number of components in a specific readPixels WebGL format\nexport function glFormatToComponents(format) {\n switch (format) {\n case 6406:\n case 33326:\n case 6403:\n return 1;\n case 33328:\n case 33319:\n return 2;\n case 6407:\n case 34837:\n return 3;\n case 6408:\n case 34836:\n return 4;\n // TODO: Add support for additional WebGL2 formats\n default:\n throw new Error('GLFormat');\n }\n}\n// Return byte count for given readPixels WebGL type\nexport function glTypeToBytes(type) {\n switch (type) {\n case 5121:\n return 1;\n case 33635:\n case 32819:\n case 32820:\n return 2;\n case 5126:\n return 4;\n // TODO: Add support for additional WebGL2 types\n default:\n throw new Error('GLType');\n }\n}\n// Helper methods\nfunction getFramebuffer(source) {\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 });\n return { framebuffer, destroyFramebuffer: true };\n }\n return { framebuffer: source, destroyFramebuffer: false };\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { VertexArray, getScratchArray } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\nimport { getBrowser } from '@probe.gl/env';\nimport { getGLFromVertexType } from \"../converters/vertex-formats.js\";\nimport { fillArray } from \"../../utils/fill-array.js\";\n/** VertexArrayObject wrapper */\nexport class WEBGLVertexArray extends VertexArray {\n get [Symbol.toStringTag]() {\n return 'VertexArray';\n }\n device;\n handle;\n /** Attribute 0 buffer constant */\n buffer = null;\n bufferValue = null;\n /** * Attribute 0 can not be disable on most desktop OpenGL based browsers */\n static isConstantAttributeZeroSupported(device) {\n return getBrowser() === 'Chrome';\n }\n // Create a VertexArray\n constructor(device, props) {\n super(device, props);\n this.device = device;\n this.handle = this.device.gl.createVertexArray();\n }\n destroy() {\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 // Auto-delete elements?\n // return [this.elements];\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) {\n const buffer = indexBuffer;\n // Explicitly allow `null` to support clearing the index buffer\n if (buffer && buffer.glTarget !== 34963) {\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(34963, buffer ? buffer.handle : null);\n this.indexBuffer = buffer;\n // Unbind to prevent unintended changes to the VAO.\n this.device.gl.bindVertexArray(null);\n }\n /** Set a location in vertex attributes array to a buffer, enables the location, sets divisor */\n setBuffer(location, attributeBuffer) {\n const buffer = attributeBuffer;\n // Sanity check target\n if (buffer.glTarget === 34963) {\n throw new Error('Use .setIndexBuffer()');\n }\n const { size, type, stride, offset, normalized, integer, divisor } = this._getAccessor(location);\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(34962, buffer.handle);\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 }\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 // 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 this.attributes[location] = buffer;\n // Unbind to prevent unintended changes to the VAO.\n this.device.gl.bindVertexArray(null);\n }\n /** Set a location in vertex attributes array to a constant value, disables the location */\n setConstantWebGL(location, value) {\n this._enable(location, false);\n this.attributes[location] = value;\n }\n bindBeforeRender() {\n this.device.gl.bindVertexArray(this.handle);\n this._applyConstantAttributes();\n }\n unbindAfterRender() {\n // Unbind to prevent unintended changes to the VAO.\n this.device.gl.bindVertexArray(null);\n }\n // Internal methods\n /**\n * Constant attributes need to be reset before every draw call\n * Any attribute that is disabled in the current vertex array object\n * is read from the context's global constant value for that attribute location.\n * @note Constant attributes are only supported in WebGL, not in WebGPU\n */\n _applyConstantAttributes() {\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 * 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 // // 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 /** Get an accessor from the */\n _getAccessor(location) {\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 * 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 _enable(location, enable = true) {\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 if (enable || canDisableAttribute) {\n location = Number(location);\n this.device.gl.bindVertexArray(this.handle);\n if (enable) {\n this.device.gl.enableVertexAttribArray(location);\n }\n else {\n this.device.gl.disableVertexAttribArray(location);\n }\n this.device.gl.bindVertexArray(null);\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, value) {\n // Create buffer only when needed, and reuse it (avoids inflating buffer creation statistics)\n const constantValue = normalizeConstantArrayValue(value);\n const byteLength = constantValue.byteLength * elementCount;\n const length = constantValue.length * elementCount;\n if (this.buffer && byteLength !== this.buffer.byteLength) {\n throw new Error(`Buffer size is immutable, byte length ${byteLength} !== ${this.buffer.byteLength}.`);\n }\n let updateNeeded = !this.buffer;\n this.buffer = this.buffer || this.device.createBuffer({ byteLength });\n // Reallocate and update contents if needed\n updateNeeded = updateNeeded || !compareConstantArrayValues(constantValue, this.bufferValue);\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 return this.buffer;\n }\n}\n// HELPER FUNCTIONS\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) {\n if (Array.isArray(arrayValue)) {\n return new Float32Array(arrayValue);\n }\n return arrayValue;\n}\n/**\n *\n */\nfunction compareConstantArrayValues(v1, v2) {\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// Uses copyWithin to significantly speed up typed array value filling\nexport function fillArray(options) {\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 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 }\n else {\n target.copyWithin(start + copied, start, start + total - copied);\n copied = total;\n }\n }\n return options.target;\n}\n", "import { log, TransformFeedback } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\nimport { WEBGLBuffer } from \"../../index.js\";\nimport { getGLPrimitive } from \"../helpers/webgl-topology-utils.js\";\nexport class WEBGLTransformFeedback extends TransformFeedback {\n device;\n gl;\n handle;\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 layout;\n buffers = {};\n unusedBuffers = {};\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 _bound = false;\n constructor(device, props) {\n super(device, props);\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 if (props.buffers) {\n this.setBuffers(props.buffers);\n }\n Object.seal(this);\n }\n destroy() {\n this.gl.deleteTransformFeedback(this.handle);\n super.destroy();\n }\n begin(topology = 'point-list') {\n this.gl.bindTransformFeedback(36386, this.handle);\n if (this.bindOnUse) {\n this._bindBuffers();\n }\n this.gl.beginTransformFeedback(getGLPrimitive(topology));\n }\n end() {\n this.gl.endTransformFeedback();\n if (!this.bindOnUse) {\n this._unbindBuffers();\n }\n this.gl.bindTransformFeedback(36386, null);\n }\n // SUBCLASS\n setBuffers(buffers) {\n this.buffers = {};\n this.unusedBuffers = {};\n this.bind(() => {\n for (const bufferName in buffers) {\n this.setBuffer(bufferName, buffers[bufferName]);\n }\n });\n }\n setBuffer(locationOrName, bufferOrRange) {\n const location = this._getVaryingIndex(locationOrName);\n const { buffer, byteLength, byteOffset } = this._getBufferRange(bufferOrRange);\n if (location < 0) {\n this.unusedBuffers[locationOrName] = buffer;\n log.warn(`${this.id} unusedBuffers varying buffer ${locationOrName}`)();\n return;\n }\n this.buffers[location] = { buffer, byteLength, byteOffset };\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 getBuffer(locationOrName) {\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 bind(funcOrHandle = this.handle) {\n if (typeof funcOrHandle !== 'function') {\n this.gl.bindTransformFeedback(36386, funcOrHandle);\n return this;\n }\n let value;\n if (!this._bound) {\n this.gl.bindTransformFeedback(36386, this.handle);\n this._bound = true;\n value = funcOrHandle();\n this._bound = false;\n this.gl.bindTransformFeedback(36386, null);\n }\n else {\n value = funcOrHandle();\n }\n return value;\n }\n unbind() {\n this.bind(null);\n }\n // PRIVATE METHODS\n /** Extract offsets for bindBufferRange */\n _getBufferRange(bufferOrRange) {\n if (bufferOrRange instanceof WEBGLBuffer) {\n return { buffer: bufferOrRange, byteOffset: 0, byteLength: bufferOrRange.byteLength };\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 _getVaryingIndex(locationOrName) {\n if (isIndex(locationOrName)) {\n return Number(locationOrName);\n }\n for (const varying of this.layout.varyings) {\n if (locationOrName === varying.name) {\n return varying.location;\n }\n }\n return -1;\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 _bindBuffers() {\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 _unbindBuffers() {\n for (const bufferIndex in this.buffers) {\n this.gl.bindBufferBase(35982, Number(bufferIndex), null);\n }\n }\n _bindBuffer(index, buffer, byteOffset = 0, byteLength) {\n const handle = buffer && buffer.handle;\n if (!handle || byteLength === undefined) {\n this.gl.bindBufferBase(35982, index, handle);\n }\n else {\n this.gl.bindBufferRange(35982, index, handle, byteOffset, byteLength);\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) {\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 } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\n/**\n * Asynchronous queries for different kinds of information\n */\nexport class WEBGLQuerySet extends QuerySet {\n device;\n handle;\n target = null;\n _queryPending = false;\n _pollingPromise = null;\n get [Symbol.toStringTag]() {\n return 'Query';\n }\n // Create a query class\n constructor(device, props) {\n super(device, props);\n this.device = device;\n if (props.count > 1) {\n throw new Error('WebGL QuerySet can only have one value');\n }\n this.handle = this.device.gl.createQuery();\n Object.seal(this);\n }\n destroy() {\n this.device.gl.deleteQuery(this.handle);\n }\n // FOR RENDER PASS AND COMMAND ENCODER\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() {\n return this._begin(35007);\n }\n endTimestampQuery() {\n this._end();\n }\n // Shortcut for occlusion queries\n beginOcclusionQuery(options) {\n return this._begin(options?.conservative ? 36202 : 35887);\n }\n endOcclusionQuery() {\n this._end();\n }\n // Shortcut for transformFeedbackQuery\n beginTransformFeedbackQuery() {\n return this._begin(35976);\n }\n endTransformFeedbackQuery() {\n this._end();\n }\n async resolveQuery() {\n const value = await this.pollQuery();\n return [value];\n }\n // PRIVATE METHODS\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 _begin(target) {\n // Don't start a new query if one is already active.\n if (this._queryPending) {\n return;\n }\n this.target = target;\n this.device.gl.beginQuery(this.target, this.handle);\n return;\n }\n // ends the current query\n _end() {\n // Can't end a new query if the last one hasn't been resolved.\n if (this._queryPending) {\n return;\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 // Returns true if the query result is available\n isResultAvailable() {\n if (!this._queryPending) {\n return false;\n }\n const resultAvailable = this.device.gl.getQueryParameter(this.handle, 34919);\n if (resultAvailable) {\n this._queryPending = false;\n }\n return resultAvailable;\n }\n // Timing query is disjoint, i.e. results are invalid\n isTimerDisjoint() {\n return this.device.gl.getParameter(36795);\n }\n // Returns query result.\n getResult() {\n return this.device.gl.getQueryParameter(this.handle, 34918);\n }\n // Returns the query result, converted to milliseconds to match JavaScript conventions.\n getTimerMilliseconds() {\n return this.getResult() / 1e6;\n }\n // Polls the query\n pollQuery(limit = Number.POSITIVE_INFINITY) {\n if (this._pollingPromise) {\n return this._pollingPromise;\n }\n let counter = 0;\n this._pollingPromise = new Promise((resolve, reject) => {\n const poll = () => {\n if (this.isResultAvailable()) {\n resolve(this.getResult());\n this._pollingPromise = null;\n }\n else if (counter++ > limit) {\n reject('Timed out');\n this._pollingPromise = null;\n }\n else {\n requestAnimationFrame(poll);\n }\n };\n requestAnimationFrame(poll);\n });\n return this._pollingPromise;\n }\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { Framebuffer } from '@luma.gl/core';\nimport { GL } from '@luma.gl/constants';\nimport { getGLTypeFromTypedArray, getTypedArrayFromGLType } from \"./typed-array-utils.js\";\nimport { glFormatToComponents, glTypeToBytes } from \"./format-utils.js\";\nimport { WEBGLTexture } from \"../adapter/resources/webgl-texture.js\";\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(source, options) {\n const { sourceX = 0, sourceY = 0, sourceFormat = 6408, sourceAttachment = 36064 // TODO - support gl.readBuffer\n } = options || {};\n let { target = null, \n // following parameters are auto deduced if not provided\n sourceWidth, sourceHeight, sourceType } = options || {};\n const { framebuffer, deleteFramebuffer } = getFramebuffer(source);\n // assert(framebuffer);\n const { gl, handle } = framebuffer;\n sourceWidth = sourceWidth || framebuffer.width;\n sourceHeight = sourceHeight || framebuffer.height;\n // TODO - Set and unset gl.readBuffer\n // if (sourceAttachment === GL.COLOR_ATTACHMENT0 && handle === null) {\n // sourceAttachment = GL.FRONT;\n // }\n const attachment = sourceAttachment - 36064;\n // assert(attachments[sourceAttachment]);\n // Deduce the type from color attachment if not provided.\n sourceType =\n sourceType || framebuffer.colorAttachments[attachment]?.texture?.glType || 5121;\n // Deduce type and allocated pixelArray if needed\n target = getPixelArray(target, sourceType, sourceFormat, sourceWidth, sourceHeight);\n // Pixel array available, if necessary, deduce type from it.\n sourceType = sourceType || getGLTypeFromTypedArray(target);\n const prevHandle = gl.bindFramebuffer(36160, handle);\n gl.readPixels(sourceX, sourceY, sourceWidth, sourceHeight, sourceFormat, sourceType, target);\n // @ts-expect-error\n gl.bindFramebuffer(36160, prevHandle || null);\n if (deleteFramebuffer) {\n framebuffer.destroy();\n }\n return target;\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(source, options) {\n const { target, sourceX = 0, sourceY = 0, sourceFormat = 6408, targetByteOffset = 0 } = 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 // Asynchronous read (PIXEL_PACK_BUFFER) is WebGL2 only feature\n const webglFramebuffer = framebuffer;\n // deduce type if not available.\n sourceType = sourceType || 5121;\n let webglBufferTarget = target;\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 // TODO(donmccurdy): Do we have tests to confirm this is working?\n const commandEncoder = source.device.createCommandEncoder();\n commandEncoder.copyTextureToBuffer({\n source: source,\n width: sourceWidth,\n height: sourceHeight,\n origin: [sourceX, sourceY],\n destination: webglBufferTarget,\n byteOffset: targetByteOffset\n });\n commandEncoder.destroy();\n if (deleteFramebuffer) {\n framebuffer.destroy();\n }\n return webglBufferTarget;\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(source, target, options) {\n const { sourceX = 0, sourceY = 0, \n // attachment = GL.COLOR_ATTACHMENT0, // TODO - support gl.readBuffer\n targetMipmaplevel = 0, targetInternalFormat = 6408 } = options || {};\n let { targetX, targetY, targetZ, width, // defaults to target width\n height // defaults to target height\n } = options || {};\n const { framebuffer, deleteFramebuffer } = getFramebuffer(source);\n // assert(framebuffer);\n const webglFramebuffer = framebuffer;\n const { device, handle } = webglFramebuffer;\n const isSubCopy = 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(36160, handle);\n // TODO - support gl.readBuffer (WebGL2 only)\n // const prevBuffer = gl.readBuffer(attachment);\n // assert(target);\n let texture = null;\n let textureTarget;\n if (target instanceof WEBGLTexture) {\n texture = target;\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 }\n else {\n // @ts-ignore\n textureTarget = target;\n }\n if (!isSubCopy) {\n device.gl.copyTexImage2D(textureTarget, targetMipmaplevel, targetInternalFormat, sourceX, sourceY, width, height, 0 /* border must be 0 */);\n }\n else {\n switch (textureTarget) {\n case 3553:\n case 34067:\n device.gl.copyTexSubImage2D(textureTarget, targetMipmaplevel, targetX, targetY, sourceX, sourceY, width, height);\n break;\n case 35866:\n case 32879:\n device.gl.copyTexSubImage3D(textureTarget, targetMipmaplevel, targetX, targetY, targetZ, sourceX, sourceY, width, height);\n break;\n default:\n }\n }\n if (texture) {\n texture.unbind();\n }\n // @ts-expect-error\n device.gl.bindFramebuffer(36160, prevHandle || null);\n if (deleteFramebuffer) {\n framebuffer.destroy();\n }\n return texture;\n}\nfunction getFramebuffer(source) {\n if (!(source instanceof Framebuffer)) {\n return { framebuffer: toFramebuffer(source), deleteFramebuffer: true };\n }\n return { framebuffer: source, deleteFramebuffer: false };\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, props) {\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;\n}\nfunction getPixelArray(pixelArray, type, format, width, height) {\n if (pixelArray) {\n return pixelArray;\n }\n // Allocate pixel array if not already available, using supplied type\n type = type || 5121;\n const ArrayType = getTypedArrayFromGLType(type, { clamped: false });\n const components = glFormatToComponents(format);\n // TODO - check for composite type (components = 1).\n return new ArrayType(width * height * components);\n}\n", "// luma.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\nimport { GL } from '@luma.gl/constants';\n// Returns number of components in a specific readPixels WebGL format\nexport function glFormatToComponents(format) {\n switch (format) {\n case 6406:\n case 33326:\n case 6403:\n return 1;\n case 33328:\n case 33319:\n return 2;\n case 6407:\n case 34837:\n return 3;\n case 6408:\n case 34836:\n return 4;\n // TODO: Add support for additional WebGL2 formats\n default:\n return 0;\n }\n}\n// Return byte count for given readPixels WebGL type\nexport function glTypeToBytes(type) {\n switch (type) {\n case 5121:\n return 1;\n case 33635:\n case 32819:\n case 32820:\n return 2;\n case 5126:\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\nimport { withGLParameters } from \"../context/state-tracker/with-parameters.js\";\n// Should collapse during minification\nconst GL_DEPTH_BUFFER_BIT = 0x00000100;\nconst GL_STENCIL_BUFFER_BIT = 0x00000400;\nconst GL_COLOR_BUFFER_BIT = 0x00004000;\nconst GL_COLOR = 0x1800;\nconst GL_DEPTH = 0x1801;\nconst GL_STENCIL = 0x1802;\nconst GL_DEPTH_STENCIL = 0x84f9;\n/**\n * Optionally clears depth, color and stencil buffers\n * @deprecated Set clear color when creating a RenderPass.\n */\nexport function clear(device, options) {\n const { framebuffer = null, color = null, depth = null, stencil = null } = options || {};\n const parameters = {};\n if (framebuffer) {\n parameters.framebuffer = framebuffer;\n }\n let clearFlags = 0;\n if (color) {\n clearFlags |= GL_COLOR_BUFFER_BIT;\n if (color !== true) {\n parameters.clearColor = color;\n }\n }\n if (depth) {\n clearFlags |= GL_DEPTH_BUFFER_BIT;\n if (depth !== true) {\n parameters.clearDepth = depth;\n }\n }\n if (stencil) {\n clearFlags |= GL_STENCIL_BUFFER_BIT;\n if (depth !== true) {\n parameters.clearStencil = depth;\n }\n }\n // assert(clearFlags !== 0, ERR_ARGUMENTS);\n // Temporarily set any clear \"colors\" and call clear\n const gl = device.gl;\n withGLParameters(gl, parameters, () => {\n gl.clear(clearFlags);\n });\n}\n/**\n * WebGL2 - clear a specific drawing buffer\n * @deprecated Set clear color when creating a RenderPass\n */\nexport function clearBuffer(device, options) {\n const { framebuffer = null, buffer = GL_COLOR, drawBuffer = 0, value = [0, 0, 0, 0] } = options || {};\n const gl = device.gl;\n withGLParameters(gl, { framebuffer }, () => {\n // Method selection per OpenGL ES 3 docs\n switch (buffer) {\n case GL_COLOR:\n switch (value.constructor) {\n case Int32Array:\n gl.clearBufferiv(buffer, drawBuffer, value);\n break;\n case Uint32Array:\n gl.clearBufferuiv(buffer, drawBuffer, value);\n break;\n case Float32Array:\n default:\n gl.clearBufferfv(buffer, drawBuffer, value);\n }\n break;\n case GL_DEPTH:\n gl.clearBufferfv(GL_DEPTH, 0, [value]);\n break;\n case GL_STENCIL:\n gl.clearBufferiv(GL_STENCIL, 0, [value]);\n break;\n case GL_DEPTH_STENCIL:\n const [depth, stencil] = value;\n gl.clearBufferfi(GL_DEPTH_STENCIL, 0, depth, stencil);\n break;\n default:\n // assert(false, ERR_ARGUMENTS);\n }\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["import_core", "hint", "log", "enable", "import_constants", "import_core", "import_constants", "import_constants", "import_core", "import_constants", "import_core", "import_core", "import_constants", "import_core", "import_constants", "isObjectEmpty", "import_constants", "import_core", "import_constants", "isObjectEmpty", "isObjectEmpty", "isObjectEmpty", "import_core", "import_constants", "import_core", "import_constants", "import_core", "import_core", "import_constants", "GLEnum", "message", "import_core", "import_constants", "import_core", "import_constants", "messageType", "message", "log", "source", "import_core", "import_constants", "import_core", "import_constants", "import_constants", "import_constants", "import_constants", "import_constants", "uniforms", "isArray", "import_constants", "import_constants", "binding", "status", "import_core", "import_core", "import_constants", "import_core", "import_constants", "import_env", "enable", "import_core", "import_constants", "import_core", "import_constants", "import_core", "import_constants", "import_constants", "getFramebuffer", "getFramebuffer", "GL_DEPTH_BUFFER_BIT", "GL_STENCIL_BUFFER_BIT", "GL_COLOR_BUFFER_BIT", "GL_COLOR_BUFFER_BIT", "GL_DEPTH_BUFFER_BIT", "GL_STENCIL_BUFFER_BIT", "LOG_LEVEL", "message", "_a", "enable", "compareConstantArrayValues"]
7
7
  }