gl-wiretap
Version:
A gl debugger that listens and replays gl (WebGL, WebGL2, and HeadlessGL) gpu commands
95 lines (73 loc) • 3.29 kB
Markdown
A gl debugger that listens and replays gl (WebGL, WebGL2, and HeadlessGL) gpu commands
## Example
```js
const gl = glWiretap(realGL);
// do a bunch of webgl commands..
// then later, get all commands as a string of runnable javascript
const commands = gl.toString();
// possibly write commands to file, for unit testing or reproducing bug
require('fs').writeFileSync('./file.js',
// create a `gl` variable for the script to use
"const canvas = document.createElement('canvas');"
+ "const gl = canvas.getContext('webgl');"
+ commands
);
```
```js
const canvas = document.createElement('canvas');
const realGL = canvas.getContext('webgl');
const gl = glWiretap(realGL);
```
```js
const canvas = document.createElement('canvas');
const realGL = canvas.getContext('webgl2');
const gl = glWiretap(realGL);
```
```js
const { glWiretap } = require('gl-wiretap');
const realGL = require('gl')(1, 1);
const gl = glWiretap(realGL);
```
See [the HeadlessGL project](https://github.com/stackgl/headless-gl) for more information on using it.
```js
const gl = glWiretap(realGL, options);
// do a bunch of webgl commands..
// then later, see all commands ran
const commands = gl.toString();
```
Add a comment for later when calling `glWiretap().toString()`, to help human doing debugging
This is where the gl context outputs all values as runnable javascript.
The value for context here is `gl` by default, for simplicity.
But can be changed to the value of with `options.contextName`.
Any variables created here (example: `gl.createProgram()`, or `gl.createShader(gl.VERTEX_SHADER)`) are simply constants that increment on an index to prevent collision.
### glWiretap().checkThrowError()
Causes a thrown exception when error detected from `gl` context, to help human doing debugging
### glWiretap().getReadPixelsVariableName()
Gets the last internal variable name used as a target value for `gl.readPixels()`
### glWiretap().insertVariable(name, value)
Insert a value into the `glWiretap()` playback string.
### glWiretap().reset()
Reset the playback string.
### glWiretap().setIndent(spaces)
Set the playback indentation. Useful for formatting results.
### glWiretap().getContextVariableName(value)
Get a variable name from the context. Useful for adding additional functionality to, for example, textures, etc.
## glWiretap options
* contextName: String - A string that refers to the gl context for `glWiretap().toString()`
* recording: String[] - A array of strings that
* readPixelsFile: String - When set, writes a file by this name to the current directory when on node HeadlessGL using readPixels
* throwGetError: Boolean - Causes `gl.getError()` to throw if there is an error
* throwGetShaderParameter: Boolean - Causes `gl.getShaderParameter()` to throw if there is an error
* throwGetProgramParameter: Boolean - Causes `gl.getProgramParameter()` to throw if there is an error
* onReadPixels: Function(targetName, argumentAsStrings);
* onUnrecognizedArgumentLookup: Function(argument) => string - Allows for just in time value tracking and insertion.
By default, typescript is supported