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

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 (79) hide show
  1. package/dist/adapter/converters/device-parameters.d.ts.map +1 -1
  2. package/dist/adapter/converters/device-parameters.js +18 -11
  3. package/dist/adapter/converters/texture-formats.d.ts +1 -1
  4. package/dist/adapter/converters/texture-formats.d.ts.map +1 -1
  5. package/dist/adapter/converters/texture-formats.js +9 -16
  6. package/dist/adapter/device-helpers/webgl-device-features.d.ts.map +1 -1
  7. package/dist/adapter/device-helpers/webgl-device-features.js +0 -1
  8. package/dist/adapter/helpers/webgl-texture-utils.d.ts +4 -4
  9. package/dist/adapter/helpers/webgl-texture-utils.d.ts.map +1 -1
  10. package/dist/adapter/helpers/webgl-texture-utils.js +11 -9
  11. package/dist/adapter/resources/webgl-framebuffer.js +1 -1
  12. package/dist/adapter/resources/webgl-render-pass.d.ts.map +1 -1
  13. package/dist/adapter/resources/webgl-render-pass.js +17 -4
  14. package/dist/adapter/resources/webgl-render-pipeline.d.ts.map +1 -1
  15. package/dist/adapter/resources/webgl-render-pipeline.js +1 -1
  16. package/dist/adapter/resources/webgl-shader.js +1 -1
  17. package/dist/adapter/resources/webgl-texture.d.ts +2 -2
  18. package/dist/adapter/resources/webgl-texture.d.ts.map +1 -1
  19. package/dist/adapter/resources/webgl-texture.js +12 -27
  20. package/dist/adapter/resources/webgl-transform-feedback.js +1 -1
  21. package/dist/adapter/resources/webgl-vertex-array.d.ts.map +1 -1
  22. package/dist/adapter/resources/webgl-vertex-array.js +3 -0
  23. package/dist/adapter/webgl-adapter.d.ts +21 -0
  24. package/dist/adapter/webgl-adapter.d.ts.map +1 -0
  25. package/dist/adapter/webgl-adapter.js +91 -0
  26. package/dist/adapter/webgl-device.d.ts +15 -27
  27. package/dist/adapter/webgl-device.d.ts.map +1 -1
  28. package/dist/adapter/webgl-device.js +32 -112
  29. package/dist/classic/copy-and-blit.d.ts +1 -0
  30. package/dist/classic/copy-and-blit.d.ts.map +1 -1
  31. package/dist/classic/copy-and-blit.js +11 -10
  32. package/dist/context/debug/spector-types.d.ts +1108 -0
  33. package/dist/context/debug/spector-types.d.ts.map +1 -0
  34. package/dist/context/debug/spector-types.js +697 -0
  35. package/dist/context/debug/spector.d.ts +12 -8
  36. package/dist/context/debug/spector.d.ts.map +1 -1
  37. package/dist/context/debug/spector.js +23 -17
  38. package/dist/context/polyfills/polyfill-webgl1-extensions.d.ts +9 -0
  39. package/dist/context/polyfills/polyfill-webgl1-extensions.d.ts.map +1 -0
  40. package/dist/context/polyfills/polyfill-webgl1-extensions.js +181 -0
  41. package/dist/context/state-tracker/webgl-state-tracker.d.ts +43 -0
  42. package/dist/context/state-tracker/webgl-state-tracker.d.ts.map +1 -0
  43. package/dist/context/state-tracker/{track-context-state.js → webgl-state-tracker.js} +44 -74
  44. package/dist/context/state-tracker/with-parameters.d.ts.map +1 -1
  45. package/dist/context/state-tracker/with-parameters.js +5 -4
  46. package/dist/dist.dev.js +341 -234
  47. package/dist/dist.min.js +2 -2
  48. package/dist/index.cjs +344 -236
  49. package/dist/index.cjs.map +4 -4
  50. package/dist/index.d.ts +3 -1
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +3 -2
  53. package/dist/utils/uid.d.ts +7 -0
  54. package/dist/utils/uid.d.ts.map +1 -0
  55. package/dist/utils/uid.js +14 -0
  56. package/package.json +3 -3
  57. package/src/adapter/converters/device-parameters.ts +18 -12
  58. package/src/adapter/converters/texture-formats.ts +12 -20
  59. package/src/adapter/device-helpers/webgl-device-features.ts +0 -1
  60. package/src/adapter/helpers/webgl-texture-utils.ts +12 -9
  61. package/src/adapter/resources/webgl-framebuffer.ts +1 -1
  62. package/src/adapter/resources/webgl-render-pass.ts +17 -4
  63. package/src/adapter/resources/webgl-render-pipeline.ts +2 -1
  64. package/src/adapter/resources/webgl-shader.ts +1 -1
  65. package/src/adapter/resources/webgl-texture.ts +17 -27
  66. package/src/adapter/resources/webgl-transform-feedback.ts +1 -1
  67. package/src/adapter/resources/webgl-vertex-array.ts +3 -0
  68. package/src/adapter/webgl-adapter.ts +113 -0
  69. package/src/adapter/webgl-device.ts +32 -135
  70. package/src/classic/copy-and-blit.ts +14 -9
  71. package/src/context/debug/spector-types.ts +1154 -0
  72. package/src/context/debug/spector.ts +38 -29
  73. package/src/context/polyfills/polyfill-webgl1-extensions.ts +202 -0
  74. package/src/context/state-tracker/{track-context-state.ts → webgl-state-tracker.ts} +55 -94
  75. package/src/context/state-tracker/with-parameters.ts +5 -4
  76. package/src/index.ts +5 -7
  77. package/src/utils/uid.ts +16 -0
  78. package/dist/context/state-tracker/track-context-state.d.ts +0 -22
  79. package/dist/context/state-tracker/track-context-state.d.ts.map +0 -1
package/dist/dist.dev.js CHANGED
@@ -11,7 +11,6 @@ var __exports__ = (() => {
11
11
  var __getOwnPropNames = Object.getOwnPropertyNames;
12
12
  var __getProtoOf = Object.getPrototypeOf;
13
13
  var __hasOwnProp = Object.prototype.hasOwnProperty;
14
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
15
14
  var __commonJS = (cb, mod) => function __require() {
16
15
  return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
17
16
  };
@@ -37,10 +36,6 @@ var __exports__ = (() => {
37
36
  mod
38
37
  ));
39
38
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
40
- var __publicField = (obj, key, value) => {
41
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
42
- return value;
43
- };
44
39
 
45
40
  // external-global-plugin:@luma.gl/core
46
41
  var require_core = __commonJS({
@@ -65,20 +60,22 @@ var __exports__ = (() => {
65
60
  WEBGLVertexArray: () => WEBGLVertexArray,
66
61
  WebGLCanvasContext: () => WebGLCanvasContext,
67
62
  WebGLDevice: () => WebGLDevice,
63
+ WebGLStateTracker: () => WebGLStateTracker,
68
64
  _TEXTURE_FORMATS: () => TEXTURE_FORMATS,
69
65
  getGLParameters: () => getGLParameters,
70
66
  getShaderLayout: () => getShaderLayout,
71
- popContextState: () => popContextState,
72
- pushContextState: () => pushContextState,
73
67
  resetGLParameters: () => resetGLParameters,
74
68
  setDeviceParameters: () => setDeviceParameters,
75
69
  setGLParameters: () => setGLParameters,
76
- trackContextState: () => trackContextState,
70
+ webgl2Adapter: () => webgl2Adapter,
77
71
  withDeviceParameters: () => withDeviceParameters,
78
72
  withGLParameters: () => withGLParameters
79
73
  });
80
74
  __reExport(bundle_exports, __toESM(require_core(), 1));
81
75
 
76
+ // src/adapter/webgl-adapter.ts
77
+ var import_core23 = __toESM(require_core(), 1);
78
+
82
79
  // src/adapter/webgl-device.ts
83
80
  var import_core22 = __toESM(require_core(), 1);
84
81
 
@@ -1309,24 +1306,22 @@ var __exports__ = (() => {
1309
1306
  return false;
1310
1307
  }
1311
1308
 
1312
- // src/context/state-tracker/track-context-state.ts
1313
- var GLState = class {
1309
+ // src/context/state-tracker/webgl-state-tracker.ts
1310
+ var WebGLStateTracker = class {
1311
+ static get(gl) {
1312
+ return gl.state;
1313
+ }
1314
1314
  gl;
1315
1315
  program = null;
1316
1316
  stateStack = [];
1317
1317
  enable = true;
1318
- cache;
1318
+ cache = null;
1319
1319
  log;
1320
- constructor(gl, {
1321
- copyState = false,
1322
- // Copy cache from params (slow) or initialize from WebGL defaults (fast)
1323
- log: log9 = () => {
1324
- }
1325
- // Logging function, called when gl parameter change calls are actually issued
1326
- } = {}) {
1320
+ initialized = false;
1321
+ constructor(gl, props) {
1327
1322
  this.gl = gl;
1328
- this.cache = copyState ? getGLParameters(gl) : Object.assign({}, GL_PARAMETER_DEFAULTS);
1329
- this.log = log9;
1323
+ this.log = props?.log || (() => {
1324
+ });
1330
1325
  this._updateCache = this._updateCache.bind(this);
1331
1326
  Object.seal(this);
1332
1327
  }
@@ -1338,6 +1333,29 @@ var __exports__ = (() => {
1338
1333
  setGLParameters(this.gl, oldValues);
1339
1334
  this.stateStack.pop();
1340
1335
  }
1336
+ /**
1337
+ * Initialize WebGL state caching on a context
1338
+ * can be called multiple times to enable/disable
1339
+ *
1340
+ * @note After calling this function, context state will be cached
1341
+ * .push() and .pop() will be available for saving,
1342
+ * temporarily modifying, and then restoring state.
1343
+ */
1344
+ trackState(gl, options) {
1345
+ this.cache = options.copyState ? getGLParameters(gl) : Object.assign({}, GL_PARAMETER_DEFAULTS);
1346
+ if (this.initialized) {
1347
+ throw new Error("WebGLStateTracker");
1348
+ }
1349
+ this.initialized = true;
1350
+ this.gl.state = this;
1351
+ installProgramSpy(gl);
1352
+ for (const key in GL_HOOKED_SETTERS) {
1353
+ const setter = GL_HOOKED_SETTERS[key];
1354
+ installSetterSpy(gl, key, setter);
1355
+ }
1356
+ installGetterOverride(gl, "getParameter");
1357
+ installGetterOverride(gl, "isEnabled");
1358
+ }
1341
1359
  /**
1342
1360
  // interceptor for context set functions - update our cache and our stack
1343
1361
  // values (Object) - the key values for this setter
@@ -1363,44 +1381,13 @@ var __exports__ = (() => {
1363
1381
  return { valueChanged, oldValue };
1364
1382
  }
1365
1383
  };
1366
- function getContextState(gl) {
1367
- return gl.state;
1368
- }
1369
- function trackContextState(gl, options) {
1370
- const { enable: enable2 = true, copyState } = options || {};
1371
- if (!gl.state) {
1372
- gl.state = new GLState(gl, { copyState });
1373
- installProgramSpy(gl);
1374
- for (const key in GL_HOOKED_SETTERS) {
1375
- const setter = GL_HOOKED_SETTERS[key];
1376
- installSetterSpy(gl, key, setter);
1377
- }
1378
- installGetterOverride(gl, "getParameter");
1379
- installGetterOverride(gl, "isEnabled");
1380
- }
1381
- const glState = getContextState(gl);
1382
- glState.enable = enable2;
1383
- return gl;
1384
- }
1385
- function pushContextState(gl) {
1386
- let glState = getContextState(gl);
1387
- if (!glState) {
1388
- trackContextState(gl, { copyState: false });
1389
- glState = getContextState(gl);
1390
- }
1391
- glState.push();
1392
- }
1393
- function popContextState(gl) {
1394
- const glState = getContextState(gl);
1395
- glState.pop();
1396
- }
1397
1384
  function installGetterOverride(gl, functionName) {
1398
1385
  const originalGetterFunc = gl[functionName].bind(gl);
1399
1386
  gl[functionName] = function get(pname) {
1400
1387
  if (pname === void 0 || NON_CACHE_PARAMETERS.has(pname)) {
1401
1388
  return originalGetterFunc(pname);
1402
1389
  }
1403
- const glState = getContextState(gl);
1390
+ const glState = WebGLStateTracker.get(gl);
1404
1391
  if (!(pname in glState.cache)) {
1405
1392
  glState.cache[pname] = originalGetterFunc(pname);
1406
1393
  }
@@ -1423,7 +1410,7 @@ var __exports__ = (() => {
1423
1410
  }
1424
1411
  const originalSetterFunc = gl[functionName].bind(gl);
1425
1412
  gl[functionName] = function set(...params) {
1426
- const glState = getContextState(gl);
1413
+ const glState = WebGLStateTracker.get(gl);
1427
1414
  const { valueChanged, oldValue } = setter(glState._updateCache, ...params);
1428
1415
  if (valueChanged) {
1429
1416
  originalSetterFunc(...params);
@@ -1438,7 +1425,7 @@ var __exports__ = (() => {
1438
1425
  function installProgramSpy(gl) {
1439
1426
  const originalUseProgram = gl.useProgram.bind(gl);
1440
1427
  gl.useProgram = function useProgramLuma(handle) {
1441
- const glState = getContextState(gl);
1428
+ const glState = WebGLStateTracker.get(gl);
1442
1429
  if (glState.program !== handle) {
1443
1430
  originalUseProgram(handle);
1444
1431
  glState.program = handle;
@@ -1655,26 +1642,6 @@ var __exports__ = (() => {
1655
1642
  return textureExtensions.every((extension) => getWebGLExtension(gl, extension, extensions));
1656
1643
  }
1657
1644
  var TEXTURE_FORMATS = {
1658
- // Unsized formats that leave the precision up to the driver. TODO - Fix bpp constants
1659
- "rgb8unorm-unsized": {
1660
- gl: 6407 /* RGB */,
1661
- b: 4,
1662
- c: 2,
1663
- bpp: 4,
1664
- dataFormat: 6407 /* RGB */,
1665
- types: [5121 /* UNSIGNED_BYTE */, 33635 /* UNSIGNED_SHORT_5_6_5 */]
1666
- },
1667
- "rgba8unorm-unsized": {
1668
- gl: 6408 /* RGBA */,
1669
- b: 4,
1670
- c: 2,
1671
- bpp: 4,
1672
- dataFormat: 6408 /* RGBA */,
1673
- types: [5121 /* UNSIGNED_BYTE */, 32819 /* UNSIGNED_SHORT_4_4_4_4 */, 32820 /* UNSIGNED_SHORT_5_5_5_1 */]
1674
- },
1675
- // 'r8unorm-unsized': {gl: GL.LUMINANCE, b: 4, c: 2, bpp: 4},
1676
- // 'rgb8unorm-srgb-unsized': {gl: GL.SRGB_EXT, b: 4, c: 2, bpp: 4, gl1Ext: SRGB},
1677
- // 'rgba8unorm-srgb-unsized': {gl: GL.SRGB_ALPHA_EXT, b: 4, c: 2, bpp: 4, gl1Ext: SRGB},
1678
1645
  // 8-bit formats
1679
1646
  "r8unorm": { gl: 33321 /* R8 */, b: 1, c: 1, rb: true },
1680
1647
  "r8snorm": { gl: 36756 /* R8_SNORM */, b: 1, c: 1, render: snorm8_renderable },
@@ -1789,17 +1756,6 @@ var __exports__ = (() => {
1789
1756
  dataFormat: 34041 /* DEPTH_STENCIL */,
1790
1757
  types: [34042 /* UNSIGNED_INT_24_8 */]
1791
1758
  },
1792
- // "depth24unorm-stencil8" feature
1793
- "depth24unorm-stencil8": {
1794
- gl: 35056 /* DEPTH24_STENCIL8 */,
1795
- b: 4,
1796
- c: 2,
1797
- p: 1,
1798
- attachment: 33306 /* DEPTH_STENCIL_ATTACHMENT */,
1799
- dataFormat: 34041 /* DEPTH_STENCIL */,
1800
- types: [34042 /* UNSIGNED_INT_24_8 */],
1801
- rb: true
1802
- },
1803
1759
  // "depth32float-stencil8" feature - TODO below is render buffer only?
1804
1760
  "depth32float-stencil8": {
1805
1761
  gl: 36013 /* DEPTH32F_STENCIL8 */,
@@ -1914,6 +1870,10 @@ var __exports__ = (() => {
1914
1870
  if (info.gl === void 0) {
1915
1871
  return false;
1916
1872
  }
1873
+ const feature = info.f;
1874
+ if (feature) {
1875
+ return checkTextureFeature(gl, feature, extensions);
1876
+ }
1917
1877
  const extension = info.x || info.gl2ext;
1918
1878
  if (extension) {
1919
1879
  return Boolean(getWebGLExtension(gl, extension, extensions));
@@ -1958,11 +1918,10 @@ var __exports__ = (() => {
1958
1918
  const decoded = (0, import_core.decodeTextureFormat)(format);
1959
1919
  return {
1960
1920
  internalFormat: webglFormat,
1961
- format: formatData?.dataFormat || getWebGLPixelDataFormat(decoded.format, decoded.integer, decoded.normalized, webglFormat),
1921
+ format: formatData?.dataFormat || getWebGLPixelDataFormat(decoded.channels, decoded.integer, decoded.normalized, webglFormat),
1962
1922
  // depth formats don't have a type
1963
1923
  type: decoded.dataType ? getGLFromVertexType(decoded.dataType) : formatData?.types?.[0] || 5121 /* UNSIGNED_BYTE */,
1964
- // @ts-expect-error
1965
- compressed: decoded.compressed
1924
+ compressed: decoded.compressed || false
1966
1925
  };
1967
1926
  }
1968
1927
  function getDepthStencilAttachmentWebGL(format) {
@@ -1972,11 +1931,11 @@ var __exports__ = (() => {
1972
1931
  }
1973
1932
  return info.attachment;
1974
1933
  }
1975
- function getWebGLPixelDataFormat(dataFormat, integer, normalized, format) {
1934
+ function getWebGLPixelDataFormat(channels, integer, normalized, format) {
1976
1935
  if (format === 6408 /* RGBA */ || format === 6407 /* RGB */) {
1977
1936
  return format;
1978
1937
  }
1979
- switch (dataFormat) {
1938
+ switch (channels) {
1980
1939
  case "r":
1981
1940
  return integer && !normalized ? 36244 /* RED_INTEGER */ : 6403 /* RED */;
1982
1941
  case "rg":
@@ -1985,6 +1944,8 @@ var __exports__ = (() => {
1985
1944
  return integer && !normalized ? 36248 /* RGB_INTEGER */ : 6407 /* RGB */;
1986
1945
  case "rgba":
1987
1946
  return integer && !normalized ? 36249 /* RGBA_INTEGER */ : 6408 /* RGBA */;
1947
+ case "bgra":
1948
+ throw new Error("bgra pixels not supported by WebGL");
1988
1949
  default:
1989
1950
  return 6408 /* RGBA */;
1990
1951
  }
@@ -2006,7 +1967,6 @@ var __exports__ = (() => {
2006
1967
  // 'timestamp-query' // GPUQueryType "timestamp-query"
2007
1968
  // "indirect-first-instance"
2008
1969
  // Textures are handled by getTextureFeatures()
2009
- // 'depth24unorm-stencil8' // GPUTextureFormat 'depth24unorm-stencil8'
2010
1970
  // 'depth32float-stencil8' // GPUTextureFormat 'depth32float-stencil8'
2011
1971
  // optional WebGL features
2012
1972
  "timer-query-webgl": "EXT_disjoint_timer_query_webgl2",
@@ -2196,17 +2156,18 @@ var __exports__ = (() => {
2196
2156
  return func(gl);
2197
2157
  }
2198
2158
  const { nocatch = true } = parameters;
2199
- pushContextState(gl);
2159
+ const webglState = WebGLStateTracker.get(gl);
2160
+ webglState.push();
2200
2161
  setGLParameters(gl, parameters);
2201
2162
  let value;
2202
2163
  if (nocatch) {
2203
2164
  value = func(gl);
2204
- popContextState(gl);
2165
+ webglState.pop();
2205
2166
  } else {
2206
2167
  try {
2207
2168
  value = func(gl);
2208
2169
  } finally {
2209
- popContextState(gl);
2170
+ webglState.pop();
2210
2171
  }
2211
2172
  }
2212
2173
  return value;
@@ -2225,25 +2186,26 @@ var __exports__ = (() => {
2225
2186
  return func(device);
2226
2187
  }
2227
2188
  const webglDevice = device;
2228
- pushContextState(webglDevice.gl);
2189
+ webglDevice.pushState();
2229
2190
  try {
2230
2191
  setDeviceParameters(device, parameters);
2231
2192
  setGLParameters(webglDevice.gl, glParameters);
2232
2193
  return func(device);
2233
2194
  } finally {
2234
- popContextState(webglDevice.gl);
2195
+ webglDevice.popState();
2235
2196
  }
2236
2197
  }
2237
2198
  function withDeviceParameters(device, parameters, func) {
2238
2199
  if (isObjectEmpty3(parameters)) {
2239
2200
  return func(device);
2240
2201
  }
2241
- pushContextState(device.gl);
2202
+ const webglDevice = device;
2203
+ webglDevice.pushState();
2242
2204
  try {
2243
2205
  setDeviceParameters(device, parameters);
2244
2206
  return func(device);
2245
2207
  } finally {
2246
- popContextState(device.gl);
2208
+ webglDevice.popState();
2247
2209
  }
2248
2210
  }
2249
2211
  function setDeviceParameters(device, parameters) {
@@ -2371,8 +2333,16 @@ var __exports__ = (() => {
2371
2333
  gl.stencilOpSeparate(1028 /* FRONT */, sfail, dpfail, dppass);
2372
2334
  gl.stencilOpSeparate(1029 /* BACK */, sfail, dpfail, dppass);
2373
2335
  }
2336
+ switch (parameters.blend) {
2337
+ case true:
2338
+ gl.enable(3042 /* BLEND */);
2339
+ break;
2340
+ case false:
2341
+ gl.disable(3042 /* BLEND */);
2342
+ break;
2343
+ default:
2344
+ }
2374
2345
  if (parameters.blendColorOperation || parameters.blendAlphaOperation) {
2375
- gl.enable(3042 /* BLEND */);
2376
2346
  const colorEquation = convertBlendOperationToEquation(
2377
2347
  "blendColorOperation",
2378
2348
  parameters.blendColorOperation || "add"
@@ -2616,7 +2586,7 @@ var __exports__ = (() => {
2616
2586
  const { dimension, width, height, depth = 0, level = 0 } = options;
2617
2587
  const { x = 0, y = 0, z = 0 } = options;
2618
2588
  const { glFormat, glType } = options;
2619
- const glTarget = getCubeTargetWebGL(options.glTarget, dimension, depth);
2589
+ const glTarget = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);
2620
2590
  switch (dimension) {
2621
2591
  case "2d-array":
2622
2592
  case "3d":
@@ -2634,7 +2604,7 @@ var __exports__ = (() => {
2634
2604
  const { dimension, width, height, depth = 0, level = 0, byteOffset = 0 } = options;
2635
2605
  const { x = 0, y = 0, z = 0 } = options;
2636
2606
  const { glFormat, glType, compressed } = options;
2637
- const glTarget = getCubeTargetWebGL(options.glTarget, dimension, depth);
2607
+ const glTarget = getWebGLCubeFaceTarget(options.glTarget, dimension, depth);
2638
2608
  switch (dimension) {
2639
2609
  case "2d-array":
2640
2610
  case "3d":
@@ -2673,7 +2643,7 @@ var __exports__ = (() => {
2673
2643
  }
2674
2644
  throw new Error(dimension);
2675
2645
  }
2676
- function getCubeTargetWebGL(glTarget, dimension, level) {
2646
+ function getWebGLCubeFaceTarget(glTarget, dimension, level) {
2677
2647
  return dimension === "cube" ? 34069 /* TEXTURE_CUBE_MAP_POSITIVE_X */ + level : glTarget;
2678
2648
  }
2679
2649
 
@@ -2878,7 +2848,7 @@ var __exports__ = (() => {
2878
2848
  throw new Error("setTexture1DData not supported in WebGL.");
2879
2849
  }
2880
2850
  /** Set a simple texture */
2881
- setTexture2DData(lodData, depth = 0, glTarget = this.glTarget) {
2851
+ setTexture2DData(lodData, depth = 0) {
2882
2852
  this.bind();
2883
2853
  const lodArray = normalizeTextureData(lodData, this);
2884
2854
  if (lodArray.length > 1 && this.props.mipmaps !== false) {
@@ -2899,7 +2869,9 @@ var __exports__ = (() => {
2899
2869
  throw new Error(this.id);
2900
2870
  }
2901
2871
  if (ArrayBuffer.isView(data)) {
2872
+ this.bind();
2902
2873
  copyCPUDataToMipLevel(this.device.gl, data, this);
2874
+ this.unbind();
2903
2875
  }
2904
2876
  }
2905
2877
  /**
@@ -2912,6 +2884,9 @@ var __exports__ = (() => {
2912
2884
  if (this.props.dimension !== "cube") {
2913
2885
  throw new Error(this.id);
2914
2886
  }
2887
+ for (const face of import_core7.Texture.CubeFaces) {
2888
+ this.setTextureCubeFaceData(data[face], face);
2889
+ }
2915
2890
  }
2916
2891
  /**
2917
2892
  * Sets an entire texture array
@@ -2934,8 +2909,8 @@ var __exports__ = (() => {
2934
2909
  if (Array.isArray(lodData) && lodData.length > 1 && this.props.mipmaps !== false) {
2935
2910
  import_core7.log.warn(`${this.id} has mipmap and multiple LODs.`)();
2936
2911
  }
2937
- this.bind();
2938
- this.unbind();
2912
+ const faceDepth = import_core7.Texture.CubeFaces.indexOf(face);
2913
+ this.setTexture2DData(lodData, faceDepth);
2939
2914
  }
2940
2915
  // INTERNAL METHODS
2941
2916
  /** @todo update this method to accept LODs */
@@ -3073,16 +3048,17 @@ var __exports__ = (() => {
3073
3048
  * Copy a region of data from a CPU memory buffer into this texture.
3074
3049
  * @todo - GLUnpackParameters parameters
3075
3050
  */
3076
- _setMipLevel(depth, level, textureData, offset = 0) {
3051
+ _setMipLevel(depth, level, textureData, glTarget = this.glTarget) {
3077
3052
  if (import_core7.Texture.isExternalImage(textureData)) {
3078
- copyCPUImageToMipLevel(this.device.gl, textureData, { ...this, depth, level });
3053
+ copyCPUImageToMipLevel(this.device.gl, textureData, { ...this, depth, level, glTarget });
3079
3054
  return;
3080
3055
  }
3081
3056
  if (this.isTextureLevelData(textureData)) {
3082
3057
  copyCPUDataToMipLevel(this.device.gl, textureData.data, {
3083
3058
  ...this,
3084
3059
  depth,
3085
- level
3060
+ level,
3061
+ glTarget
3086
3062
  });
3087
3063
  return;
3088
3064
  }
@@ -3221,7 +3197,7 @@ var __exports__ = (() => {
3221
3197
  switch (texture.glTarget) {
3222
3198
  case 35866 /* TEXTURE_2D_ARRAY */:
3223
3199
  case 32879 /* TEXTURE_3D */:
3224
- gl.framebufferTextureLayer(36160 /* FRAMEBUFFER */, attachment, texture.glTarget, level, layer);
3200
+ gl.framebufferTextureLayer(36160 /* FRAMEBUFFER */, attachment, texture.handle, level, layer);
3225
3201
  break;
3226
3202
  case 34067 /* TEXTURE_CUBE_MAP */:
3227
3203
  const face = mapIndexToCubeMapFace(layer);
@@ -3334,17 +3310,21 @@ var __exports__ = (() => {
3334
3310
  }
3335
3311
 
3336
3312
  // src/context/debug/spector.ts
3337
- var DEFAULT_SPECTOR_PROPS = {
3338
- spector: import_core10.log.get("spector") || import_core10.log.get("inspect")
3339
- };
3340
- var SPECTOR_CDN_URL = "https://spectorcdn.babylonjs.com/spector.bundle.js";
3341
3313
  var LOG_LEVEL = 1;
3342
3314
  var spector = null;
3343
3315
  var initialized = false;
3316
+ var DEFAULT_SPECTOR_PROPS = {
3317
+ debugWithSpectorJS: import_core10.log.get("spector") || import_core10.log.get("spectorjs"),
3318
+ // https://github.com/BabylonJS/Spector.js#basic-usage
3319
+ // https://forum.babylonjs.com/t/spectorcdn-is-temporarily-off/48241
3320
+ // spectorUrl: 'https://spectorcdn.babylonjs.com/spector.bundle.js';
3321
+ spectorUrl: "https://cdn.jsdelivr.net/npm/spectorjs@0.9.30/dist/spector.bundle.js",
3322
+ gl: void 0
3323
+ };
3344
3324
  async function loadSpectorJS(props) {
3345
3325
  if (!globalThis.SPECTOR) {
3346
3326
  try {
3347
- await loadScript(SPECTOR_CDN_URL);
3327
+ await loadScript(props.spectorUrl || DEFAULT_SPECTOR_PROPS.spectorUrl);
3348
3328
  } catch (error) {
3349
3329
  import_core10.log.warn(String(error));
3350
3330
  }
@@ -3352,12 +3332,13 @@ var __exports__ = (() => {
3352
3332
  }
3353
3333
  function initializeSpectorJS(props) {
3354
3334
  props = { ...DEFAULT_SPECTOR_PROPS, ...props };
3355
- if (!props?.spector) {
3335
+ if (!props.debugWithSpectorJS) {
3356
3336
  return null;
3357
3337
  }
3358
- if (!spector && globalThis.SPECTOR) {
3359
- import_core10.log.probe(LOG_LEVEL, "SPECTOR found and initialized")();
3360
- spector = new globalThis.SPECTOR.Spector();
3338
+ if (!spector && globalThis.SPECTOR && !globalThis.luma?.spector) {
3339
+ import_core10.log.probe(LOG_LEVEL, "SPECTOR found and initialized. Start with `luma.spector.displayUI()`")();
3340
+ const { Spector } = globalThis.SPECTOR;
3341
+ spector = new Spector();
3361
3342
  if (globalThis.luma) {
3362
3343
  globalThis.luma.spector = spector;
3363
3344
  }
@@ -3378,11 +3359,11 @@ var __exports__ = (() => {
3378
3359
  spector?.resultView.addCapture(capture);
3379
3360
  });
3380
3361
  }
3381
- if (props?.canvas) {
3382
- if (typeof props.spector === "string" && props.spector !== props.canvas.id) {
3383
- return spector;
3384
- }
3385
- spector?.startCapture(props?.canvas, 500);
3362
+ if (props.gl) {
3363
+ const gl = props.gl;
3364
+ const device = gl.device;
3365
+ spector?.startCapture(props.gl, 500);
3366
+ gl.device = device;
3386
3367
  new Promise((resolve) => setTimeout(resolve, 2e3)).then((_) => {
3387
3368
  import_core10.log.info("Spector capture stopped after 2 seconds")();
3388
3369
  spector?.stopCapture();
@@ -3541,6 +3522,14 @@ var __exports__ = (() => {
3541
3522
  }
3542
3523
  }
3543
3524
 
3525
+ // src/utils/uid.ts
3526
+ var uidCounters = {};
3527
+ function uid(id = "id") {
3528
+ uidCounters[id] = uidCounters[id] || 1;
3529
+ const count = uidCounters[id]++;
3530
+ return `${id}-${count}`;
3531
+ }
3532
+
3544
3533
  // src/adapter/resources/webgl-buffer.ts
3545
3534
  var import_core12 = __toESM(require_core(), 1);
3546
3535
  var WEBGLBuffer = class extends import_core12.Buffer {
@@ -3743,8 +3732,8 @@ var __exports__ = (() => {
3743
3732
  return this.getCompilationInfoSync();
3744
3733
  }
3745
3734
  getCompilationInfoSync() {
3746
- const log9 = this.device.gl.getShaderInfoLog(this.handle);
3747
- return log9 ? parseShaderCompilerLog(log9) : [];
3735
+ const log10 = this.device.gl.getShaderInfoLog(this.handle);
3736
+ return log10 ? parseShaderCompilerLog(log10) : [];
3748
3737
  }
3749
3738
  getTranslatedSource() {
3750
3739
  const extensions = this.device.getExtension("WEBGL_debug_shaders");
@@ -3754,7 +3743,7 @@ var __exports__ = (() => {
3754
3743
  // PRIVATE METHODS
3755
3744
  /** Compile a shader and get compilation status */
3756
3745
  async _compile(source) {
3757
- const addGLSLVersion = (source2) => source2.startsWith("#version ") ? source2 : `#version 100
3746
+ const addGLSLVersion = (source2) => source2.startsWith("#version ") ? source2 : `#version 300 es
3758
3747
  ${source2}`;
3759
3748
  source = addGLSLVersion(source);
3760
3749
  const { gl } = this.device;
@@ -3819,12 +3808,22 @@ ${source2}`;
3819
3808
  constructor(device, props) {
3820
3809
  super(device, props);
3821
3810
  this.device = device;
3822
- pushContextState(this.device.gl);
3823
- this.setParameters(this.props.parameters);
3811
+ let viewport;
3812
+ if (!props?.parameters?.viewport) {
3813
+ if (props?.framebuffer) {
3814
+ const { width, height } = props.framebuffer;
3815
+ viewport = [0, 0, width, height];
3816
+ } else {
3817
+ const [width, height] = device.getCanvasContext().getDrawingBufferSize();
3818
+ viewport = [0, 0, width, height];
3819
+ }
3820
+ }
3821
+ this.device.pushState();
3822
+ this.setParameters({ viewport, ...this.props.parameters });
3824
3823
  this.clear();
3825
3824
  }
3826
3825
  end() {
3827
- popContextState(this.device.gl);
3826
+ this.device.popState();
3828
3827
  }
3829
3828
  pushDebugGroup(groupLabel) {
3830
3829
  }
@@ -4612,7 +4611,8 @@ ${source2}`;
4612
4611
  const validBindings = this.shaderLayout.bindings.map((binding2) => `"${binding2.name}"`).join(", ");
4613
4612
  if (!options?.disableWarnings) {
4614
4613
  import_core15.log.warn(
4615
- `Unknown binding "${name}" in render pipeline "${this.id}", expected one of ${validBindings}`
4614
+ `No binding "${name}" in render pipeline "${this.id}", expected one of ${validBindings}`,
4615
+ value
4616
4616
  )();
4617
4617
  }
4618
4618
  continue;
@@ -5253,6 +5253,7 @@ ${source2}`;
5253
5253
  } else {
5254
5254
  this.device.gl.vertexAttribPointer(location, size, type, normalized, stride, offset);
5255
5255
  }
5256
+ this.device.gl.bindBuffer(34962 /* ARRAY_BUFFER */, null);
5256
5257
  this.device.gl.enableVertexAttribArray(location);
5257
5258
  this.device.gl.vertexAttribDivisor(location, divisor || 0);
5258
5259
  this.attributes[location] = buffer;
@@ -5432,7 +5433,7 @@ ${source2}`;
5432
5433
  }
5433
5434
  end() {
5434
5435
  this.gl.endTransformFeedback();
5435
- if (!this.bindOnUse) {
5436
+ if (this.bindOnUse) {
5436
5437
  this._unbindBuffers();
5437
5438
  }
5438
5439
  this.gl.bindTransformFeedback(36386 /* TRANSFORM_FEEDBACK */, null);
@@ -5715,7 +5716,6 @@ ${source2}`;
5715
5716
  const {
5716
5717
  sourceX = 0,
5717
5718
  sourceY = 0,
5718
- sourceFormat = 6408 /* RGBA */,
5719
5719
  sourceAttachment = 36064 /* COLOR_ATTACHMENT0 */
5720
5720
  // TODO - support gl.readBuffer
5721
5721
  } = options || {};
@@ -5724,15 +5724,19 @@ ${source2}`;
5724
5724
  // following parameters are auto deduced if not provided
5725
5725
  sourceWidth,
5726
5726
  sourceHeight,
5727
+ sourceDepth,
5728
+ sourceFormat,
5727
5729
  sourceType
5728
5730
  } = options || {};
5729
5731
  const { framebuffer, deleteFramebuffer } = getFramebuffer2(source);
5730
5732
  const { gl, handle } = framebuffer;
5731
- sourceWidth = sourceWidth || framebuffer.width;
5732
- sourceHeight = sourceHeight || framebuffer.height;
5733
5733
  const attachment = sourceAttachment - 36064 /* COLOR_ATTACHMENT0 */;
5734
- sourceType = sourceType || framebuffer.colorAttachments[attachment]?.texture?.glType || 5121 /* UNSIGNED_BYTE */;
5735
- target = getPixelArray(target, sourceType, sourceFormat, sourceWidth, sourceHeight);
5734
+ sourceWidth ||= framebuffer.width;
5735
+ sourceHeight ||= framebuffer.height;
5736
+ sourceDepth = framebuffer.colorAttachments[attachment]?.texture?.depth || 1;
5737
+ sourceFormat ||= framebuffer.colorAttachments[attachment]?.texture?.glFormat || 6408 /* RGBA */;
5738
+ sourceType ||= framebuffer.colorAttachments[attachment]?.texture?.glType || 5121 /* UNSIGNED_BYTE */;
5739
+ target = getPixelArray(target, sourceType, sourceFormat, sourceWidth, sourceHeight, sourceDepth);
5736
5740
  sourceType = sourceType || getGLTypeFromTypedArray(target);
5737
5741
  const prevHandle = gl.bindFramebuffer(36160 /* FRAMEBUFFER */, handle);
5738
5742
  gl.readPixels(sourceX, sourceY, sourceWidth, sourceHeight, sourceFormat, sourceType, target);
@@ -5795,7 +5799,7 @@ ${source2}`;
5795
5799
  });
5796
5800
  return framebuffer;
5797
5801
  }
5798
- function getPixelArray(pixelArray, type, format, width, height) {
5802
+ function getPixelArray(pixelArray, type, format, width, height, depth) {
5799
5803
  if (pixelArray) {
5800
5804
  return pixelArray;
5801
5805
  }
@@ -5841,8 +5845,10 @@ ${source2}`;
5841
5845
  }
5842
5846
 
5843
5847
  // src/adapter/webgl-device.ts
5844
- var LOG_LEVEL2 = 1;
5845
- var _WebGLDevice = class extends import_core22.Device {
5848
+ var WebGLDevice = class extends import_core22.Device {
5849
+ //
5850
+ // Public `Device` API
5851
+ //
5846
5852
  /** type of this device */
5847
5853
  type = "webgl";
5848
5854
  /** The underlying WebGL context */
@@ -5853,66 +5859,21 @@ ${source2}`;
5853
5859
  canvasContext;
5854
5860
  lost;
5855
5861
  _resolveContextLost;
5856
- //
5857
- // Static methods, expected to be present by `luma.createDevice()`
5858
- //
5859
- /** Check if WebGL 2 is available */
5860
- static isSupported() {
5861
- return typeof WebGL2RenderingContext !== "undefined";
5862
- }
5863
- /**
5864
- * Get a device instance from a GL context
5865
- * Creates and instruments the device if not already created
5866
- * @param gl
5867
- * @returns
5868
- */
5869
- static attach(gl) {
5870
- if (gl instanceof _WebGLDevice) {
5871
- return gl;
5872
- }
5873
- if (gl?.device instanceof import_core22.Device) {
5874
- return gl.device;
5875
- }
5876
- if (!isWebGL(gl)) {
5877
- throw new Error("Invalid WebGL2RenderingContext");
5878
- }
5879
- return new _WebGLDevice({ gl });
5880
- }
5881
- static async create(props = {}) {
5882
- import_core22.log.groupCollapsed(LOG_LEVEL2, "WebGLDevice created")();
5883
- const promises = [];
5884
- if (props.debug) {
5885
- promises.push(loadWebGLDeveloperTools());
5886
- }
5887
- if (props.spector) {
5888
- promises.push(loadSpectorJS());
5889
- }
5890
- if (typeof props.canvas === "string") {
5891
- promises.push(import_core22.CanvasContext.pageLoaded);
5892
- }
5893
- const results = await Promise.allSettled(promises);
5894
- for (const result of results) {
5895
- if (result.status === "rejected") {
5896
- import_core22.log.error(`Failed to initialize debug libraries ${result.reason}`)();
5897
- }
5898
- }
5899
- import_core22.log.probe(LOG_LEVEL2 + 1, "DOM is loaded")();
5900
- if (props.gl?.device) {
5901
- import_core22.log.warn("reattaching existing device")();
5902
- return _WebGLDevice.attach(props.gl);
5903
- }
5904
- const device = new _WebGLDevice(props);
5905
- const message2 = `Created ${device.type}${device.debug ? " debug" : ""} context: ${device.info.vendor}, ${device.info.renderer} for canvas: ${device.canvasContext.id}`;
5906
- import_core22.log.probe(LOG_LEVEL2, message2)();
5907
- import_core22.log.table(LOG_LEVEL2, device.info)();
5908
- import_core22.log.groupEnd(LOG_LEVEL2)();
5909
- return device;
5910
- }
5862
+ /** WebGL2 context. */
5863
+ gl;
5864
+ debug = false;
5865
+ /** State used by luma.gl classes: TODO - move to canvasContext*/
5866
+ _canvasSizeInfo = { clientWidth: 0, clientHeight: 0, devicePixelRatio: 1 };
5867
+ /** State used by luma.gl classes - TODO - not used? */
5868
+ _extensions = {};
5869
+ _polyfilled = false;
5870
+ /** Instance of Spector.js (if initialized) */
5871
+ spectorJS;
5911
5872
  //
5912
5873
  // Public API
5913
5874
  //
5914
5875
  constructor(props) {
5915
- super({ ...props, id: props.id || "webgl-device" });
5876
+ super({ ...props, id: props.id || uid("webgl-device") });
5916
5877
  const device = props.gl?.device;
5917
5878
  if (device) {
5918
5879
  throw new Error(`WebGL context already attached to device ${device.id}`);
@@ -5922,19 +5883,18 @@ ${source2}`;
5922
5883
  this.lost = new Promise((resolve) => {
5923
5884
  this._resolveContextLost = resolve;
5924
5885
  });
5925
- let gl = props.gl || null;
5926
- gl ||= createBrowserContext(this.canvasContext.canvas, {
5886
+ this.handle = createBrowserContext(this.canvasContext.canvas, {
5927
5887
  ...props,
5928
5888
  onContextLost: (event) => this._resolveContextLost?.({
5929
5889
  reason: "destroyed",
5930
5890
  message: "Entered sleep mode, or too many apps or browser tabs are using the GPU."
5931
5891
  })
5932
5892
  });
5933
- if (!gl) {
5893
+ this.gl = this.handle;
5894
+ if (!this.handle) {
5934
5895
  throw new Error("WebGL context creation failed");
5935
5896
  }
5936
- this.handle = gl;
5937
- this.gl = gl;
5897
+ this.spectorJS = initializeSpectorJS({ ...this.props, gl: this.handle });
5938
5898
  this.gl.device = this;
5939
5899
  this.gl._version = 2;
5940
5900
  this.info = getDeviceInfo(this.gl, this._extensions);
@@ -5944,21 +5904,16 @@ ${source2}`;
5944
5904
  this.features.initializeFeatures();
5945
5905
  }
5946
5906
  this.canvasContext.resize();
5947
- const { enable: enable2 = true, copyState = false } = props;
5948
- trackContextState(this.gl, {
5949
- enable: enable2,
5950
- copyState,
5907
+ const glState = new WebGLStateTracker(this.gl, {
5951
5908
  log: (...args) => import_core22.log.log(1, ...args)()
5952
5909
  });
5910
+ glState.trackState(this.gl, { copyState: false });
5953
5911
  if (props.debug) {
5954
5912
  this.gl = makeDebugContext(this.gl, { ...props, throwOnError: true });
5955
5913
  this.debug = true;
5956
5914
  import_core22.log.level = Math.max(import_core22.log.level, 1);
5957
5915
  import_core22.log.warn("WebGL debug mode activated. Performance reduced.")();
5958
5916
  }
5959
- if (props.spector) {
5960
- this.spectorJS = initializeSpectorJS({ ...this.props, canvas: this.handle.canvas });
5961
- }
5962
5917
  }
5963
5918
  /**
5964
5919
  * Destroys the context
@@ -5969,9 +5924,6 @@ ${source2}`;
5969
5924
  get isLost() {
5970
5925
  return this.gl.isContextLost();
5971
5926
  }
5972
- getSize() {
5973
- return [this.gl.drawingBufferWidth, this.gl.drawingBufferHeight];
5974
- }
5975
5927
  isTextureFormatSupported(format) {
5976
5928
  return isTextureFormatSupported(this.gl, format, this._extensions);
5977
5929
  }
@@ -6069,16 +6021,6 @@ ${source2}`;
6069
6021
  //
6070
6022
  // WebGL-only API (not part of `Device` API)
6071
6023
  //
6072
- /** WebGL2 context. */
6073
- gl;
6074
- debug = false;
6075
- /** State used by luma.gl classes: TODO - move to canvasContext*/
6076
- _canvasSizeInfo = { clientWidth: 0, clientHeight: 0, devicePixelRatio: 1 };
6077
- /** State used by luma.gl classes - TODO - not used? */
6078
- _extensions = {};
6079
- _polyfilled = false;
6080
- /** Instance of Spector.js (if initialized) */
6081
- spectorJS;
6082
6024
  /**
6083
6025
  * Triggers device (or WebGL context) loss.
6084
6026
  * @note primarily intended for testing how application reacts to device loss
@@ -6099,11 +6041,13 @@ ${source2}`;
6099
6041
  }
6100
6042
  /** Save current WebGL context state onto an internal stack */
6101
6043
  pushState() {
6102
- pushContextState(this.gl);
6044
+ const webglState = WebGLStateTracker.get(this.gl);
6045
+ webglState.push();
6103
6046
  }
6104
6047
  /** Restores previously saved context state */
6105
6048
  popState() {
6106
- popContextState(this.gl);
6049
+ const webglState = WebGLStateTracker.get(this.gl);
6050
+ webglState.pop();
6107
6051
  }
6108
6052
  /**
6109
6053
  * Storing data on a special field on WebGLObjects makes that data visible in SPECTOR chrome debug extension
@@ -6166,18 +6110,6 @@ ${source2}`;
6166
6110
  return this._extensions;
6167
6111
  }
6168
6112
  };
6169
- var WebGLDevice = _WebGLDevice;
6170
- //
6171
- // Public `Device` API
6172
- //
6173
- /** type of this device */
6174
- __publicField(WebGLDevice, "type", "webgl");
6175
- function isWebGL(gl) {
6176
- if (typeof WebGL2RenderingContext !== "undefined" && gl instanceof WebGL2RenderingContext) {
6177
- return true;
6178
- }
6179
- return Boolean(gl && Number.isFinite(gl._version));
6180
- }
6181
6113
  function setConstantFloatArray(device, location, array) {
6182
6114
  switch (array.length) {
6183
6115
  case 1:
@@ -6212,6 +6144,181 @@ ${source2}`;
6212
6144
  }
6213
6145
  return true;
6214
6146
  }
6147
+
6148
+ // src/context/polyfills/polyfill-webgl1-extensions.ts
6149
+ var WEBGL1_STATIC_EXTENSIONS = {
6150
+ WEBGL_depth_texture: {
6151
+ UNSIGNED_INT_24_8_WEBGL: 34042 /* UNSIGNED_INT_24_8 */
6152
+ },
6153
+ OES_element_index_uint: {},
6154
+ OES_texture_float: {},
6155
+ OES_texture_half_float: {
6156
+ // @ts-expect-error different numbers?
6157
+ HALF_FLOAT_OES: 5131 /* HALF_FLOAT */
6158
+ },
6159
+ EXT_color_buffer_float: {},
6160
+ OES_standard_derivatives: {
6161
+ FRAGMENT_SHADER_DERIVATIVE_HINT_OES: 35723 /* FRAGMENT_SHADER_DERIVATIVE_HINT */
6162
+ },
6163
+ EXT_frag_depth: {},
6164
+ EXT_blend_minmax: {
6165
+ MIN_EXT: 32775 /* MIN */,
6166
+ MAX_EXT: 32776 /* MAX */
6167
+ },
6168
+ EXT_shader_texture_lod: {}
6169
+ };
6170
+ var getWEBGL_draw_buffers = (gl) => ({
6171
+ drawBuffersWEBGL(buffers) {
6172
+ return gl.drawBuffers(buffers);
6173
+ },
6174
+ COLOR_ATTACHMENT0_WEBGL: 36064 /* COLOR_ATTACHMENT0 */,
6175
+ COLOR_ATTACHMENT1_WEBGL: 36065 /* COLOR_ATTACHMENT1 */,
6176
+ COLOR_ATTACHMENT2_WEBGL: 36066 /* COLOR_ATTACHMENT2 */,
6177
+ COLOR_ATTACHMENT3_WEBGL: 36067 /* COLOR_ATTACHMENT3 */
6178
+ });
6179
+ var getOES_vertex_array_object = (gl) => ({
6180
+ VERTEX_ARRAY_BINDING_OES: 34229 /* VERTEX_ARRAY_BINDING */,
6181
+ createVertexArrayOES() {
6182
+ return gl.createVertexArray();
6183
+ },
6184
+ deleteVertexArrayOES(vertexArray) {
6185
+ return gl.deleteVertexArray(vertexArray);
6186
+ },
6187
+ isVertexArrayOES(vertexArray) {
6188
+ return gl.isVertexArray(vertexArray);
6189
+ },
6190
+ bindVertexArrayOES(vertexArray) {
6191
+ return gl.bindVertexArray(vertexArray);
6192
+ }
6193
+ });
6194
+ var getANGLE_instanced_arrays = (gl) => ({
6195
+ VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: 35070,
6196
+ drawArraysInstancedANGLE(...args) {
6197
+ return gl.drawArraysInstanced(...args);
6198
+ },
6199
+ drawElementsInstancedANGLE(...args) {
6200
+ return gl.drawElementsInstanced(...args);
6201
+ },
6202
+ vertexAttribDivisorANGLE(...args) {
6203
+ return gl.vertexAttribDivisor(...args);
6204
+ }
6205
+ });
6206
+ function enforceWebGL2(enforce = true) {
6207
+ const prototype = HTMLCanvasElement.prototype;
6208
+ if (!enforce && prototype.originalGetContext) {
6209
+ prototype.getContext = prototype.originalGetContext;
6210
+ prototype.originalGetContext = void 0;
6211
+ return;
6212
+ }
6213
+ prototype.originalGetContext = prototype.getContext;
6214
+ prototype.getContext = function(contextId, options) {
6215
+ if (contextId === "webgl" || contextId === "experimental-webgl") {
6216
+ const context = this.originalGetContext("webgl2", options);
6217
+ if (context instanceof HTMLElement) {
6218
+ polyfillWebGL1Extensions(context);
6219
+ }
6220
+ return context;
6221
+ }
6222
+ return this.originalGetContext(contextId, options);
6223
+ };
6224
+ }
6225
+ function polyfillWebGL1Extensions(gl) {
6226
+ gl.getExtension("EXT_color_buffer_float");
6227
+ const boundExtensions = {
6228
+ ...WEBGL1_STATIC_EXTENSIONS,
6229
+ WEBGL_disjoint_timer_query: gl.getExtension("EXT_disjoint_timer_query_webgl2"),
6230
+ WEBGL_draw_buffers: getWEBGL_draw_buffers(gl),
6231
+ OES_vertex_array_object: getOES_vertex_array_object(gl),
6232
+ ANGLE_instanced_arrays: getANGLE_instanced_arrays(gl)
6233
+ };
6234
+ const originalGetExtension = gl.getExtension;
6235
+ gl.getExtension = function(extensionName) {
6236
+ const ext = originalGetExtension.call(gl, extensionName);
6237
+ if (ext) {
6238
+ return ext;
6239
+ }
6240
+ if (extensionName in boundExtensions) {
6241
+ return boundExtensions[extensionName];
6242
+ }
6243
+ return null;
6244
+ };
6245
+ const originalGetSupportedExtensions = gl.getSupportedExtensions;
6246
+ gl.getSupportedExtensions = function() {
6247
+ const extensions = originalGetSupportedExtensions.apply(gl) || [];
6248
+ return extensions?.concat(Object.keys(boundExtensions));
6249
+ };
6250
+ }
6251
+
6252
+ // src/adapter/webgl-adapter.ts
6253
+ var LOG_LEVEL2 = 1;
6254
+ var WebGLAdapter = class extends import_core23.Adapter {
6255
+ /** type of device's created by this adapter */
6256
+ type = "webgl";
6257
+ constructor() {
6258
+ super();
6259
+ import_core23.Device.defaultProps = { ...import_core23.Device.defaultProps, ...DEFAULT_SPECTOR_PROPS };
6260
+ WebGLDevice.adapter = this;
6261
+ }
6262
+ /** Check if WebGL 2 is available */
6263
+ isSupported() {
6264
+ return typeof WebGL2RenderingContext !== "undefined";
6265
+ }
6266
+ /** Force any created WebGL contexts to be WebGL2 contexts, polyfilled with WebGL1 extensions */
6267
+ enforceWebGL2(enable2) {
6268
+ enforceWebGL2(enable2);
6269
+ }
6270
+ /**
6271
+ * Get a device instance from a GL context
6272
+ * Creates and instruments the device if not already created
6273
+ * @param gl
6274
+ * @returns
6275
+ */
6276
+ async attach(gl) {
6277
+ if (gl instanceof WebGLDevice) {
6278
+ return gl;
6279
+ }
6280
+ if (gl?.device instanceof import_core23.Device) {
6281
+ return gl.device;
6282
+ }
6283
+ if (!isWebGL(gl)) {
6284
+ throw new Error("Invalid WebGL2RenderingContext");
6285
+ }
6286
+ return new WebGLDevice({ gl });
6287
+ }
6288
+ async create(props = {}) {
6289
+ import_core23.log.groupCollapsed(LOG_LEVEL2, "WebGLDevice created")();
6290
+ const promises = [];
6291
+ if (props.debug) {
6292
+ promises.push(loadWebGLDeveloperTools());
6293
+ }
6294
+ if (props.debugWithSpectorJS) {
6295
+ promises.push(loadSpectorJS(props));
6296
+ }
6297
+ if (typeof props.canvas === "string") {
6298
+ promises.push(import_core23.CanvasContext.pageLoaded);
6299
+ }
6300
+ const results = await Promise.allSettled(promises);
6301
+ for (const result of results) {
6302
+ if (result.status === "rejected") {
6303
+ import_core23.log.error(`Failed to initialize debug libraries ${result.reason}`)();
6304
+ }
6305
+ }
6306
+ import_core23.log.probe(LOG_LEVEL2 + 1, "DOM is loaded")();
6307
+ const device = new WebGLDevice(props);
6308
+ const message2 = `Created ${device.type}${device.debug ? " debug" : ""} context: ${device.info.vendor}, ${device.info.renderer} for canvas: ${device.canvasContext.id}`;
6309
+ import_core23.log.probe(LOG_LEVEL2, message2)();
6310
+ import_core23.log.table(LOG_LEVEL2, device.info)();
6311
+ import_core23.log.groupEnd(LOG_LEVEL2)();
6312
+ return device;
6313
+ }
6314
+ };
6315
+ function isWebGL(gl) {
6316
+ if (typeof WebGL2RenderingContext !== "undefined" && gl instanceof WebGL2RenderingContext) {
6317
+ return true;
6318
+ }
6319
+ return Boolean(gl && Number.isFinite(gl._version));
6320
+ }
6321
+ var webgl2Adapter = new WebGLAdapter();
6215
6322
  return __toCommonJS(bundle_exports);
6216
6323
  })();
6217
6324
  return __exports__;