@luma.gl/webgl 9.0.0-alpha.50 → 9.0.0-alpha.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapter/resources/webgl-shader.d.ts +2 -1
- package/dist/adapter/resources/webgl-shader.d.ts.map +1 -1
- package/dist/adapter/resources/webgl-shader.js +11 -23
- package/dist/adapter/resources/webgl-shader.js.map +1 -1
- package/dist/context/debug/webgl-developer-tools.d.ts.map +1 -1
- package/dist/context/debug/webgl-developer-tools.js +5 -4
- package/dist/context/debug/webgl-developer-tools.js.map +1 -1
- package/dist/dist.dev.js +834 -95
- package/dist/index.cjs +13 -45
- package/dist.min.js +43 -40
- package/package.json +5 -5
- package/src/adapter/resources/webgl-shader.ts +26 -23
- package/src/context/debug/webgl-developer-tools.ts +7 -6
- package/dist/adapter/helpers/get-shader-info.d.ts +0 -9
- package/dist/adapter/helpers/get-shader-info.d.ts.map +0 -1
- package/dist/adapter/helpers/get-shader-info.js +0 -25
- package/dist/adapter/helpers/get-shader-info.js.map +0 -1
- package/src/adapter/helpers/get-shader-info.ts +0 -41
|
@@ -8,7 +8,8 @@ export declare class WEBGLShader extends Shader {
|
|
|
8
8
|
readonly handle: WebGLShader;
|
|
9
9
|
constructor(device: WebGLDevice, props: ShaderProps);
|
|
10
10
|
destroy(): void;
|
|
11
|
-
|
|
11
|
+
getCompilationInfo(): Promise<readonly CompilerMessage[]>;
|
|
12
|
+
getCompilationInfoSync(): readonly CompilerMessage[];
|
|
12
13
|
_compile(source: string): void;
|
|
13
14
|
}
|
|
14
15
|
//# sourceMappingURL=webgl-shader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgl-shader.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgl-shader.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"webgl-shader.d.ts","sourceRoot":"","sources":["../../../src/adapter/resources/webgl-shader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,MAAM,EAAE,WAAW,EAAE,eAAe,EAAC,MAAM,eAAe,CAAC;AAGnE,OAAO,EAAC,WAAW,EAAC,MAAM,iBAAiB,CAAC;AAE5C;;GAEG;AACH,qBAAa,WAAY,SAAQ,MAAM;IACrC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;gBAEjB,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW;IAgB1C,OAAO,IAAI,IAAI;IAST,kBAAkB,IAAI,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC;IAI/D,sBAAsB;IAO/B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAqB/B"}
|
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { getShaderInfo } from "../helpers/get-shader-info.js";
|
|
1
|
+
import { Shader } from '@luma.gl/core';
|
|
3
2
|
import { parseShaderCompilerLog } from "../helpers/parse-shader-compiler-log.js";
|
|
4
3
|
export class WEBGLShader extends Shader {
|
|
5
4
|
constructor(device, props) {
|
|
6
|
-
super(device,
|
|
7
|
-
id: getShaderIdFromProps(props),
|
|
8
|
-
...props
|
|
9
|
-
});
|
|
5
|
+
super(device, props);
|
|
10
6
|
this.device = void 0;
|
|
11
7
|
this.handle = void 0;
|
|
12
8
|
this.device = device;
|
|
@@ -29,9 +25,12 @@ export class WEBGLShader extends Shader {
|
|
|
29
25
|
this.destroyed = true;
|
|
30
26
|
}
|
|
31
27
|
}
|
|
32
|
-
async
|
|
28
|
+
async getCompilationInfo() {
|
|
29
|
+
return this.getCompilationInfoSync();
|
|
30
|
+
}
|
|
31
|
+
getCompilationInfoSync() {
|
|
33
32
|
const log = this.device.gl.getShaderInfoLog(this.handle);
|
|
34
|
-
return
|
|
33
|
+
return parseShaderCompilerLog(log);
|
|
35
34
|
}
|
|
36
35
|
_compile(source) {
|
|
37
36
|
const addGLSLVersion = source => source.startsWith('#version ') ? source : `#version 100\n${source}`;
|
|
@@ -41,22 +40,11 @@ export class WEBGLShader extends Shader {
|
|
|
41
40
|
} = this.device;
|
|
42
41
|
gl.shaderSource(this.handle, source);
|
|
43
42
|
gl.compileShader(this.handle);
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
const messages = parsedLog.filter(message => message.type === 'error');
|
|
49
|
-
const formattedLog = formatCompilerLog(messages, source, {
|
|
50
|
-
showSourceCode: true
|
|
51
|
-
});
|
|
52
|
-
const shaderName = getShaderInfo(source).name;
|
|
53
|
-
const shaderDescription = `${this.stage} shader ${shaderName}`;
|
|
54
|
-
log.error(`GLSL compilation errors in ${shaderDescription}\n${formattedLog}`)();
|
|
55
|
-
throw new Error(`GLSL compilation errors in ${shaderName}`);
|
|
43
|
+
this.compilationStatus = gl.getShaderParameter(this.handle, 35713) ? 'success' : 'error';
|
|
44
|
+
this.debugShader();
|
|
45
|
+
if (this.compilationStatus === 'error') {
|
|
46
|
+
throw new Error(`GLSL compilation errors in ${this.props.stage} shader ${this.props.id}`);
|
|
56
47
|
}
|
|
57
48
|
}
|
|
58
49
|
}
|
|
59
|
-
function getShaderIdFromProps(props) {
|
|
60
|
-
return getShaderInfo(props.source).name || props.id || uid(`unnamed ${props.stage}-shader`);
|
|
61
|
-
}
|
|
62
50
|
//# sourceMappingURL=webgl-shader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgl-shader.js","names":["
|
|
1
|
+
{"version":3,"file":"webgl-shader.js","names":["Shader","parseShaderCompilerLog","WEBGLShader","constructor","device","props","handle","stage","gl","createShader","Error","_compile","source","destroy","removeStats","deleteShader","destroyed","getCompilationInfo","getCompilationInfoSync","log","getShaderInfoLog","addGLSLVersion","startsWith","shaderSource","compileShader","compilationStatus","getShaderParameter","debugShader","id"],"sources":["../../../src/adapter/resources/webgl-shader.ts"],"sourcesContent":["// luma.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport {Shader, ShaderProps, CompilerMessage} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\nimport {parseShaderCompilerLog} from '../helpers/parse-shader-compiler-log';\nimport {WebGLDevice} from '../webgl-device';\n\n/**\n * An immutable compiled shader program that execute portions of the GPU Pipeline\n */\nexport class WEBGLShader extends Shader {\n readonly device: WebGLDevice;\n readonly handle: WebGLShader;\n\n constructor(device: WebGLDevice, props: ShaderProps) {\n super(device, props);\n this.device = device;\n switch (this.props.stage) {\n case 'vertex':\n this.handle = this.props.handle || this.device.gl.createShader(GL.VERTEX_SHADER);\n break;\n case 'fragment':\n this.handle = this.props.handle || this.device.gl.createShader(GL.FRAGMENT_SHADER);\n break;\n default:\n throw new Error(this.props.stage);\n }\n this._compile(this.source);\n }\n\n override destroy(): void {\n if (this.handle) {\n this.removeStats();\n this.device.gl.deleteShader(this.handle);\n // this.handle = null;\n this.destroyed = true;\n }\n }\n\n override async getCompilationInfo(): Promise<readonly CompilerMessage[]> {\n return this.getCompilationInfoSync();\n }\n\n override getCompilationInfoSync() {\n const log = this.device.gl.getShaderInfoLog(this.handle);\n return parseShaderCompilerLog(log);\n }\n\n // PRIVATE METHODS\n\n _compile(source: string): void {\n const addGLSLVersion = (source: string) =>\n source.startsWith('#version ') ? source : `#version 100\\n${source}`;\n source = addGLSLVersion(source);\n\n const {gl} = this.device;\n gl.shaderSource(this.handle, source);\n gl.compileShader(this.handle);\n\n // TODO - For performance reasons, avoid checking shader compilation errors on production?\n // TODO - Load log even when no error reported, to catch warnings?\n // https://gamedev.stackexchange.com/questions/30429/how-to-detect-glsl-warnings\n this.compilationStatus = gl.getShaderParameter(this.handle, GL.COMPILE_STATUS) ? 'success' : 'error';\n\n // The `Shader` base class will determine if debug window should be opened based on props\n this.debugShader();\n\n if (this.compilationStatus === 'error') {\n throw new Error(`GLSL compilation errors in ${this.props.stage} shader ${this.props.id}`);\n }\n }\n}\n\n// TODO - Original code from luma.gl v8 - keep until new debug functionality has matured\n// if (!compilationSuccess) {\n// const parsedLog = shaderLog ? parseShaderCompilerLog(shaderLog) : [];\n// const messages = parsedLog.filter(message => message.type === 'error');\n// const formattedLog = formatCompilerLog(messages, source, {showSourceCode: 'all', html: true});\n// const shaderDescription = `${this.stage} shader ${shaderName}`;\n// log.error(`GLSL compilation errors in ${shaderDescription}\\n${formattedLog}`)();\n// displayShaderLog(parsedLog, source, shaderName);\n// }\n\n"],"mappings":"AAGA,SAAQA,MAAM,QAAqC,eAAe;AAAC,SAE3DC,sBAAsB;AAM9B,OAAO,MAAMC,WAAW,SAASF,MAAM,CAAC;EAItCG,WAAWA,CAACC,MAAmB,EAAEC,KAAkB,EAAE;IACnD,KAAK,CAACD,MAAM,EAAEC,KAAK,CAAC;IAAC,KAJdD,MAAM;IAAA,KACNE,MAAM;IAIb,IAAI,CAACF,MAAM,GAAGA,MAAM;IACpB,QAAQ,IAAI,CAACC,KAAK,CAACE,KAAK;MACtB,KAAK,QAAQ;QACX,IAAI,CAACD,MAAM,GAAG,IAAI,CAACD,KAAK,CAACC,MAAM,IAAI,IAAI,CAACF,MAAM,CAACI,EAAE,CAACC,YAAY,MAAiB,CAAC;QAChF;MACF,KAAK,UAAU;QACb,IAAI,CAACH,MAAM,GAAG,IAAI,CAACD,KAAK,CAACC,MAAM,IAAI,IAAI,CAACF,MAAM,CAACI,EAAE,CAACC,YAAY,MAAmB,CAAC;QAClF;MACF;QACE,MAAM,IAAIC,KAAK,CAAC,IAAI,CAACL,KAAK,CAACE,KAAK,CAAC;IACrC;IACA,IAAI,CAACI,QAAQ,CAAC,IAAI,CAACC,MAAM,CAAC;EAC5B;EAESC,OAAOA,CAAA,EAAS;IACvB,IAAI,IAAI,CAACP,MAAM,EAAE;MACf,IAAI,CAACQ,WAAW,CAAC,CAAC;MAClB,IAAI,CAACV,MAAM,CAACI,EAAE,CAACO,YAAY,CAAC,IAAI,CAACT,MAAM,CAAC;MAExC,IAAI,CAACU,SAAS,GAAG,IAAI;IACvB;EACF;EAEA,MAAeC,kBAAkBA,CAAA,EAAwC;IACvE,OAAO,IAAI,CAACC,sBAAsB,CAAC,CAAC;EACtC;EAESA,sBAAsBA,CAAA,EAAG;IAChC,MAAMC,GAAG,GAAG,IAAI,CAACf,MAAM,CAACI,EAAE,CAACY,gBAAgB,CAAC,IAAI,CAACd,MAAM,CAAC;IACxD,OAAOL,sBAAsB,CAACkB,GAAG,CAAC;EACpC;EAIAR,QAAQA,CAACC,MAAc,EAAQ;IAC7B,MAAMS,cAAc,GAAIT,MAAc,IACpCA,MAAM,CAACU,UAAU,CAAC,WAAW,CAAC,GAAGV,MAAM,GAAI,iBAAgBA,MAAO,EAAC;IACrEA,MAAM,GAAGS,cAAc,CAACT,MAAM,CAAC;IAE/B,MAAM;MAACJ;IAAE,CAAC,GAAG,IAAI,CAACJ,MAAM;IACxBI,EAAE,CAACe,YAAY,CAAC,IAAI,CAACjB,MAAM,EAAEM,MAAM,CAAC;IACpCJ,EAAE,CAACgB,aAAa,CAAC,IAAI,CAAClB,MAAM,CAAC;IAK7B,IAAI,CAACmB,iBAAiB,GAAGjB,EAAE,CAACkB,kBAAkB,CAAC,IAAI,CAACpB,MAAM,OAAmB,CAAC,GAAG,SAAS,GAAG,OAAO;IAGpG,IAAI,CAACqB,WAAW,CAAC,CAAC;IAElB,IAAI,IAAI,CAACF,iBAAiB,KAAK,OAAO,EAAE;MACtC,MAAM,IAAIf,KAAK,CAAE,8BAA6B,IAAI,CAACL,KAAK,CAACE,KAAM,WAAU,IAAI,CAACF,KAAK,CAACuB,EAAG,EAAC,CAAC;IAC3F;EACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgl-developer-tools.d.ts","sourceRoot":"","sources":["../../../src/context/debug/webgl-developer-tools.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"webgl-developer-tools.d.ts","sourceRoot":"","sources":["../../../src/context/debug/webgl-developer-tools.ts"],"names":[],"mappings":"AAUA,KAAK,iBAAiB,GAAG;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAoBF,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,eAAe,EAAE,GAAG,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAO7D;AAID,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,qBAAqB,EAAE,KAAK,GAAE,iBAAsB,GAAG,qBAAqB,GAAG,IAAI,CAOvH"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { log, loadScript } from '@luma.gl/core';
|
|
2
|
+
import { GL as GLEnum } from '@luma.gl/constants';
|
|
2
3
|
import { isBrowser } from '@probe.gl/env';
|
|
3
4
|
const WEBGL_DEBUG_CDN_URL = 'https://unpkg.com/webgl-debug@2.0.1/index.js';
|
|
4
5
|
function getContextData(gl) {
|
|
@@ -33,13 +34,13 @@ function getDebugContext(gl, props) {
|
|
|
33
34
|
return data.debugContext;
|
|
34
35
|
}
|
|
35
36
|
globalThis.WebGLDebugUtils.init({
|
|
36
|
-
...
|
|
37
|
+
...GLEnum,
|
|
37
38
|
...gl
|
|
38
39
|
});
|
|
39
40
|
const glDebug = globalThis.WebGLDebugUtils.makeDebugContext(gl, onGLError.bind(null, props), onValidateGLFunc.bind(null, props));
|
|
40
|
-
for (const key in
|
|
41
|
-
if (!(key in glDebug) && typeof
|
|
42
|
-
glDebug[key] =
|
|
41
|
+
for (const key in GLEnum) {
|
|
42
|
+
if (!(key in glDebug) && typeof GLEnum[key] === 'number') {
|
|
43
|
+
glDebug[key] = GLEnum[key];
|
|
43
44
|
}
|
|
44
45
|
}
|
|
45
46
|
class WebGLDebugContext {}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgl-developer-tools.js","names":["log","loadScript","isBrowser","WEBGL_DEBUG_CDN_URL","getContextData","gl","luma","loadWebGLDeveloperTools","globalThis","WebGLDebugUtils","global","module","makeDebugContext","props","arguments","length","undefined","debug","getDebugContext","getRealContext","data","realContext","warn","debugContext","init","GL","glDebug","onGLError","bind","onValidateGLFunc","key","WebGLDebugContext","Object","setPrototypeOf","getPrototypeOf","create","getFunctionString","functionName","functionArgs","Array","from","map","arg","args","glFunctionArgsToString","slice","err","errorMessage","glEnumToString","glName","webgl2","message","error","throwOnError","Error","functionString","level","break","isBreakpoint","every","breakOn","indexOf"],"sources":["../../../src/context/debug/webgl-developer-tools.ts"],"sourcesContent":["// luma.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport {log, loadScript} from '@luma.gl/core';\nimport {GL} from '@luma.gl/constants';\nimport {isBrowser} from '@probe.gl/env'\n\nconst WEBGL_DEBUG_CDN_URL = 'https://unpkg.com/webgl-debug@2.0.1/index.js';\n\ntype DebugContextProps = {\n debug?: boolean;\n throwOnError?: boolean;\n break?: string[];\n webgl2?: boolean;\n};\n\n// const DEFAULT_DEBUG_CONTEXT_PROPS: Required<DebugContextProps> = {\n// debug: true,\n// throwOnError: false,\n// break: [],\n// webgl2: false,\n// }\n\ntype ContextData = {\n realContext?: WebGLRenderingContext;\n debugContext?: WebGLRenderingContext;\n}\n\n// Helper to get shared context data\nfunction getContextData(gl: any): ContextData {\n gl.luma = gl.luma || {};\n return gl.luma;\n}\n\ndeclare global {\n // eslint-disable-next-line no-var\n var WebGLDebugUtils: any;\n}\n\n/**\n * Loads Khronos WebGLDeveloperTools from CDN if not already installed \n * const WebGLDebugUtils = require('webgl-debug');\n * @see https://github.com/KhronosGroup/WebGLDeveloperTools\n * @see https://github.com/vorg/webgl-debug\n */\nexport async function loadWebGLDeveloperTools(): Promise<void> {\n if (isBrowser() && !globalThis.WebGLDebugUtils) {\n globalThis.global = globalThis.global || globalThis;\n // @ts-expect-error Developer tools expects global to be set\n globalThis.global.module = {};\n await loadScript(WEBGL_DEBUG_CDN_URL);\n }\n}\n\n// Returns (a potentially new) context with debug instrumentation turned off or on.\n// Note that this actually returns a new context\nexport function makeDebugContext(gl: WebGLRenderingContext, props: DebugContextProps = {}): WebGLRenderingContext | null {\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\n return props.debug ? getDebugContext(gl, props) : getRealContext(gl);\n}\n\n// Returns the real context from either of the real/debug contexts\nfunction getRealContext(gl: WebGLRenderingContext): WebGLRenderingContext {\n const data = getContextData(gl);\n // If the context has a realContext member, it is a debug context so return the realContext\n return data.realContext ? data.realContext : gl;\n}\n\n// Returns the debug context from either of the real/debug contexts\nfunction getDebugContext(gl: WebGLRenderingContext, props: DebugContextProps): WebGLRenderingContext {\n if (!globalThis.WebGLDebugUtils) {\n log.warn('webgl-debug not loaded')();\n return gl;\n }\n\n const data = getContextData(gl);\n\n // If this already has a debug context, return it.\n if (data.debugContext) {\n return data.debugContext;\n }\n\n // Create a new debug context\n globalThis.WebGLDebugUtils.init({...GL, ...gl});\n const glDebug = globalThis.WebGLDebugUtils.makeDebugContext(\n gl,\n onGLError.bind(null, props),\n onValidateGLFunc.bind(null, props)\n );\n\n // Make sure we have all WebGL2 and extension constants (todo dynamic import to circumvent minification?)\n for (const key in GL) {\n if (!(key in glDebug) && typeof GL[key] === 'number') {\n glDebug[key] = GL[key];\n }\n }\n \n // Ensure we have a clean prototype on the instrumented object\n // Note: setPrototypeOf does come with perf warnings, but we already take a bigger perf reduction\n // by synchronizing the WebGL errors after each WebGL call.\n class WebGLDebugContext {}\n Object.setPrototypeOf(glDebug, Object.getPrototypeOf(gl));\n Object.setPrototypeOf(WebGLDebugContext, glDebug);\n const debugContext = Object.create(WebGLDebugContext);\n // Store the debug context\n data.realContext = gl;\n data.debugContext = debugContext;\n debugContext.debug = true;\n\n // Return it\n return debugContext;\n}\n\n// DEBUG TRACING\n\nfunction getFunctionString(functionName: string, functionArgs): string {\n // Cover bug in webgl-debug-tools\n functionArgs = Array.from(functionArgs).map(arg => arg === undefined ? 'undefined' : arg);\n let args = globalThis.WebGLDebugUtils.glFunctionArgsToString(functionName, functionArgs);\n args = `${args.slice(0, 100)}${args.length > 100 ? '...' : ''}`;\n return `gl.${functionName}(${args})`;\n}\n\nfunction onGLError(props: DebugContextProps, err, functionName: string, args: any[]): void {\n // Cover bug in webgl-debug-tools\n args = Array.from(args).map(arg => arg === undefined ? 'undefined' : arg);\n const errorMessage = globalThis.WebGLDebugUtils.glEnumToString(err);\n const functionArgs = globalThis.WebGLDebugUtils.glFunctionArgsToString(functionName, args);\n const glName = props.webgl2 ? 'gl2' : 'gl1';\n const message = `${errorMessage} in ${glName}.${functionName}(${functionArgs})`;\n log.error(message)();\n debugger; // eslint-disable-line\n if (props.throwOnError) {\n throw new Error(message);\n }\n}\n\n// Don't generate function string until it is needed\nfunction onValidateGLFunc(props: DebugContextProps, functionName: string, functionArgs: any[]): void {\n let functionString: string = '';\n if (log.level >= 1) {\n functionString = getFunctionString(functionName, functionArgs);\n log.log(1, functionString)();\n }\n\n // If array of breakpoint strings supplied, check if any of them is contained in current GL function\n if (props.break && props.break.length > 0) {\n functionString = functionString || getFunctionString(functionName, functionArgs);\n const isBreakpoint = props.break.every((breakOn: string) => functionString.indexOf(breakOn) !== -1);\n if (isBreakpoint) {\n debugger; // eslint-disable-line\n }\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 } else {\n log.error(`Undefined argument: ${functionString}`)();\n debugger; // eslint-disable-line\n }\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"webgl-developer-tools.js","names":["log","loadScript","GL","GLEnum","isBrowser","WEBGL_DEBUG_CDN_URL","getContextData","gl","luma","loadWebGLDeveloperTools","globalThis","WebGLDebugUtils","global","module","makeDebugContext","props","arguments","length","undefined","debug","getDebugContext","getRealContext","data","realContext","warn","debugContext","init","glDebug","onGLError","bind","onValidateGLFunc","key","WebGLDebugContext","Object","setPrototypeOf","getPrototypeOf","create","getFunctionString","functionName","functionArgs","Array","from","map","arg","args","glFunctionArgsToString","slice","err","errorMessage","glEnumToString","glName","webgl2","message","error","throwOnError","Error","functionString","level","break","isBreakpoint","every","breakOn","indexOf"],"sources":["../../../src/context/debug/webgl-developer-tools.ts"],"sourcesContent":["// luma.gl, MIT license\n// Copyright (c) vis.gl contributors\n\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'\n\nconst WEBGL_DEBUG_CDN_URL = 'https://unpkg.com/webgl-debug@2.0.1/index.js';\n\ntype DebugContextProps = {\n debug?: boolean;\n throwOnError?: boolean;\n break?: string[];\n webgl2?: boolean;\n};\n\n// const DEFAULT_DEBUG_CONTEXT_PROPS: Required<DebugContextProps> = {\n// debug: true,\n// throwOnError: false,\n// break: [],\n// webgl2: false,\n// }\n\ntype ContextData = {\n realContext?: WebGLRenderingContext;\n debugContext?: WebGLRenderingContext;\n}\n\n// Helper to get shared context data\nfunction getContextData(gl: any): ContextData {\n gl.luma = gl.luma || {};\n return gl.luma;\n}\n\ndeclare global {\n // eslint-disable-next-line no-var\n var WebGLDebugUtils: any;\n}\n\n/**\n * Loads Khronos WebGLDeveloperTools from CDN if not already installed \n * const WebGLDebugUtils = require('webgl-debug');\n * @see https://github.com/KhronosGroup/WebGLDeveloperTools\n * @see https://github.com/vorg/webgl-debug\n */\nexport async function loadWebGLDeveloperTools(): Promise<void> {\n if (isBrowser() && !globalThis.WebGLDebugUtils) {\n globalThis.global = globalThis.global || globalThis;\n // @ts-expect-error Developer tools expects global to be set\n globalThis.global.module = {};\n await loadScript(WEBGL_DEBUG_CDN_URL);\n }\n}\n\n// Returns (a potentially new) context with debug instrumentation turned off or on.\n// Note that this actually returns a new context\nexport function makeDebugContext(gl: WebGLRenderingContext, props: DebugContextProps = {}): WebGLRenderingContext | null {\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\n return props.debug ? getDebugContext(gl, props) : getRealContext(gl);\n}\n\n// Returns the real context from either of the real/debug contexts\nfunction getRealContext(gl: WebGLRenderingContext): WebGLRenderingContext {\n const data = getContextData(gl);\n // If the context has a realContext member, it is a debug context so return the realContext\n return data.realContext ? data.realContext : gl;\n}\n\n// Returns the debug context from either of the real/debug contexts\nfunction getDebugContext(gl: WebGLRenderingContext, props: DebugContextProps): WebGLRenderingContext {\n if (!globalThis.WebGLDebugUtils) {\n log.warn('webgl-debug not loaded')();\n return gl;\n }\n\n const data = getContextData(gl);\n\n // If this already has a debug context, return it.\n if (data.debugContext) {\n return data.debugContext;\n }\n\n // Create a new debug context\n globalThis.WebGLDebugUtils.init({...GLEnum, ...gl});\n const glDebug = globalThis.WebGLDebugUtils.makeDebugContext(\n gl,\n onGLError.bind(null, props),\n onValidateGLFunc.bind(null, props)\n );\n\n // Make sure we have all WebGL2 and extension constants (todo dynamic import to circumvent minification?)\n for (const key in GLEnum) {\n if (!(key in glDebug) && typeof GLEnum[key] === 'number') {\n glDebug[key] = GLEnum[key];\n }\n }\n \n // Ensure we have a clean prototype on the instrumented object\n // Note: setPrototypeOf does come with perf warnings, but we already take a bigger perf reduction\n // by synchronizing the WebGL errors after each WebGL call.\n class WebGLDebugContext {}\n Object.setPrototypeOf(glDebug, Object.getPrototypeOf(gl));\n Object.setPrototypeOf(WebGLDebugContext, glDebug);\n const debugContext = Object.create(WebGLDebugContext);\n // Store the debug context\n data.realContext = gl;\n data.debugContext = debugContext;\n debugContext.debug = true;\n\n // Return it\n return debugContext;\n}\n\n// DEBUG TRACING\n\nfunction getFunctionString(functionName: string, functionArgs): string {\n // Cover bug in webgl-debug-tools\n functionArgs = Array.from(functionArgs).map(arg => arg === undefined ? 'undefined' : arg);\n let args = globalThis.WebGLDebugUtils.glFunctionArgsToString(functionName, functionArgs);\n args = `${args.slice(0, 100)}${args.length > 100 ? '...' : ''}`;\n return `gl.${functionName}(${args})`;\n}\n\nfunction onGLError(props: DebugContextProps, err, functionName: string, args: any[]): void {\n // Cover bug in webgl-debug-tools\n args = Array.from(args).map(arg => arg === undefined ? 'undefined' : arg);\n const errorMessage = globalThis.WebGLDebugUtils.glEnumToString(err);\n const functionArgs = globalThis.WebGLDebugUtils.glFunctionArgsToString(functionName, args);\n const glName = props.webgl2 ? 'gl2' : 'gl1';\n const message = `${errorMessage} in ${glName}.${functionName}(${functionArgs})`;\n log.error(message)();\n debugger; // eslint-disable-line\n if (props.throwOnError) {\n throw new Error(message);\n }\n}\n\n// Don't generate function string until it is needed\nfunction onValidateGLFunc(props: DebugContextProps, functionName: string, functionArgs: any[]): void {\n let functionString: string = '';\n if (log.level >= 1) {\n functionString = getFunctionString(functionName, functionArgs);\n log.log(1, functionString)();\n }\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: string) => functionString.indexOf(breakOn) !== -1);\n if (isBreakpoint) {\n debugger; // eslint-disable-line\n }\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 } else {\n log.error(`Undefined argument: ${functionString}`)();\n debugger; // eslint-disable-line\n }\n }\n }\n}\n"],"mappings":"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"}
|