starting to work on reusable modules for webgl and event systems
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 22 Apr 2021 03:38:37 +0000 (22:38 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 22 Apr 2021 03:38:37 +0000 (22:38 -0500)
bin/onyx-loader.js [new file with mode: 0644]
build.sh
core/js/webgl.js [deleted file]
core/js/webgl.onyx [deleted file]
modules/js_events/js_events.js [new file with mode: 0644]
modules/js_events/js_events.onyx [new file with mode: 0644]
modules/js_events/module.onyx [new file with mode: 0644]
modules/webgl2/module.onyx [new file with mode: 0644]
modules/webgl2/webgl2.js [new file with mode: 0644]
modules/webgl2/webgl2.onyx [new file with mode: 0644]

diff --git a/bin/onyx-loader.js b/bin/onyx-loader.js
new file mode 100644 (file)
index 0000000..a48a38a
--- /dev/null
@@ -0,0 +1,47 @@
+
+window.ONYX_MODULES  = window.ONYX_MODULES || [];
+window.ONYX_MEMORY   = null;
+window.ONYX_INSTANCE = null;
+
+window.ONYX_MODULES.push({
+    module_name: "host",
+
+    print_str: function(ptr, len) {
+        var buffer = new Uint8Array(ONYX_MEMORY.buffer, ptr, len);
+        var string = new TextDecoder().decode(buffer);
+        console.log(string);
+    },
+
+    exit: function() { debugger; }
+});
+
+function launch_onyx_program(script_path, call_start) {
+    fetch(script_path)
+    .then(function(res) { return res.arrayBuffer(); })
+    .then(function(wasm_code) {
+        var import_object = {};
+
+        for (var i = 0; i < window.ONYX_MODULES.length; i++) {
+            import_object[window.ONYX_MODULES[i].module_name] = window.ONYX_MODULES[i];
+        }
+
+        return WebAssembly.instantiate(wasm_code, import_object);
+    })
+    .then(function(wasm_module) {
+        window.ONYX_MEMORY = wasm_module.instance.exports.memory;
+        window.ONYX_INSTANCE = wasm_module.instance;
+
+        wasm_module.instance.exports._start();
+    });
+}
+
+window.onload = function() {
+    var script_tags = document.getElementsByTagName("script");
+
+    for (var i = 0; i < script_tags.length; i++) {
+        if (script_tags[i].getAttribute("type") == "application/onyx") {
+            // @ROBUSTNESS: It should be configurable which function is called on start up of a Onyx WASM module.
+            launch_onyx_program(script_tags[i].getAttribute("src"), true);
+        }
+    }
+};
index 07fbeb47b4d2776a8baa6852cb77b491feb41f65..1558a98c867c47081e7cc46be2415f1e3a40c2e1 100755 (executable)
--- a/build.sh
+++ b/build.sh
@@ -8,15 +8,16 @@ sudo cp -r ./core/ "$CORE_DIR"
 [ "$1" = "libs_only" ] && exit 0
 
 C_FILES="onyx onyxastnodes onyxbuiltins onyxchecker onyxclone onyxdoc onyxentities onyxerrors onyxlex onyxparser onyxsymres onyxtypes onyxutils onyxwasm"
-TARGET='./bin/onyx'
 CC='gcc'
 
 WARNINGS='-Wimplicit -Wmisleading-indentation -Wparentheses -Wsequence-point -Wreturn-type -Wshift-negative-value -Wunused-but-set-parameter -Wunused-but-set-variable -Wunused-function -Wunused-label -Wmaybe-uninitialized -Wsign-compare -Wstrict-overflow -Wduplicated-branches -Wduplicated-cond -Wtrigraphs -Waddress -Wlogical-op'
 
 if [ "$1" = "debug" ]; then
     FLAGS="$WARNINGS -g3 -I./include"
+    TARGET="./bin/onyx-debug"
 else
     FLAGS="$WARNINGS -O3 -I./include"
+    TARGET='./bin/onyx'
 fi
 
 BUILD_DIR='.'
diff --git a/core/js/webgl.js b/core/js/webgl.js
deleted file mode 100644 (file)
index 4c483c9..0000000
+++ /dev/null
@@ -1,285 +0,0 @@
-WebGl_Wasm = {
-    init(name, namelen) {
-        const decoder = new TextDecoder();
-        const str = new Uint8Array(WASM_MEMORY.buffer, name, namelen);
-        const canvasname = decoder.decode(str);
-
-        this.programs = [];
-        this.shaders = [];
-        this.buffers = [];
-        this.framebuffers = [];
-        this.renderbuffers = [];
-        this.textures = [];
-        this.uniformlocs = [];
-        this.vertexArrays = [];
-
-        this.canvas = document.getElementById(canvasname);
-        if (this.canvas == null) return 0;
-
-        this.gl = this.canvas.getContext("webgl2");
-        if (this.gl == null) return 0;
-
-        return 1;
-    },
-
-    activeTexture(texture) { this.gl.activeTexture(texture); },
-    attachShader(program, shader) { this.gl.attachShader(this.programs[program], this.shaders[shader]); return this.programs[program]; },
-    bindAttribLocation(program, index, name, namelen) { console.log("NOT IMPLEMENTED!"); },
-    bindBuffer(target, buffer) {
-        if (buffer == -1) {
-            this.gl.bindBuffer(target, null);
-        } else {
-            this.gl.bindBuffer(target, this.buffers[buffer]);
-        }
-    },
-    bindFramebuffer(target, framebuffer) { this.gl.bindFramebuffer(target, this.framebuffers[framebuffer]); },
-    bindRenderbuffer(target, renderbuffer) { this.gl.bindRenderbuffer(target, this.renderbuffers[renderbuffer]); },
-    bindTexture(target, texture) { this.gl.bindTexture(target, this.textures[texture]); },
-    bindVertexArray(vertexArray) { this.gl.bindVertexArray(this.vertexArrays[vertexArray]); },
-
-    blendColor(red, green, blue, alpha) { this.gl.blendColor(red, green, blue, alpha); },
-    blendEquation(mode) { this.gl.blendEquation(mode); },
-    blendEquationSeparate(modeRGB, modeAlpha) { this.gl.blendEquationSeparate(modeRGB, modeAlpha); },
-    blendFunc(sfactor, dfactor) { this.gl.blendFunc(sfactor, dfactor); },
-    blendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha) { this.gl.blendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha); },
-
-    blitFramebuffer(sx0, sy0, sx1, sy1, dx0, dy0, dx1, dy1, mask, filter) {
-        this.gl.blitFramebuffer(sx0, sy0, sx1, sy1, dx0, dy0, dx1, dy1, mask, filter);
-    },
-
-    bufferDataWithData(target, bufferdata, bufferlen, usage) {
-        const data = new DataView(WASM_MEMORY.buffer, bufferdata, bufferlen);
-        this.gl.bufferData(target, data, usage);
-    },
-
-    bufferDataNoData(target, size, usage) { this.gl.bufferData(target, size, usage); },
-    bufferSubData(target, offset, bufferdata, bufferlen) {
-        const data = new DataView(WASM_MEMORY.buffer, bufferdata, bufferlen);
-        this.gl.bufferSubData(target, offset, data);
-    },
-    canvasSize(width, height) {
-        this.canvas.width = width;
-        this.canvas.height = height;
-    },
-    checkFrameBufferStatus(target) { return this.gl.checkFrameBufferStatus(target); },
-    clear(bit) { this.gl.clear(bit); },
-    clearColor(r, g, b, a) { this.gl.clearColor(r, g, b, a); },
-    clearDepth(depth) { this.gl.clearDepth(depth); },
-    clearStencil(stencil) { this.gl.clearStencil(stencil); },
-    colorMask(r, g, b, a) { this.gl.colorMask(r, g, b, a); },
-    compileShader(shader) { this.gl.compileShader(this.shaders[shader]); },
-    compressedTexImage2D(target, level, internalformat, width, height, border, data, datalen) {
-        const pixels = new DataView(WASM_MEMORY.buffer, data, datalen);
-        this.gl.compressedTexImage2D(target, level, internalformat, width, height, border, pixels);
-    },
-    compressedTexSubImage2D(target, level, internalformat, xoff, yoff, width, height, format, data, datalen) {
-        const pixels = new DataView(WASM_MEMORY.buffer, data, datalen);
-        this.gl.compressedSubTexImage2D(target, level, internalformat, xoff, yoff, width, height, format, pixels);
-    },
-    copyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size) { this.gl.copyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size); },
-    copyTexImage2D(target, level, internalforamt, x, y, width, height, border) {
-        this.gl.copyTexImage2D(target, level, internalforamt, x, y, width, height, border);
-    },
-    copyTexSubImage2D(target, level, xoff, yoff, x, y, width, height) {
-        this.gl.copyTexSubImage2D(target, level, xoff, yoff, x, y, width, height);
-    },
-    createBuffer() {
-        const buf = this.gl.createBuffer();
-        if (buf == null) return -1;
-
-        this.buffers.push(buf);
-        return this.buffers.length - 1;
-    },
-    createFramebuffer() {
-        const buf = this.gl.createFramebuffer();
-        if (buf == null) return -1;
-
-        this.framebuffers.push(buf);
-        return this.framebuffers.length - 1;
-    },
-    createProgram() {
-        const prog = this.gl.createProgram();
-        if (prog == null) return -1;
-
-        this.programs.push(prog);
-        return this.programs.length - 1;
-    },
-    createRenderbuffer() {
-        const buf = this.gl.createRenderbuffer();
-        if (buf == null) return -1;
-
-        this.renderbuffers.push(buf);
-        return this.renderbuffers.length - 1;
-    },
-    createShader(type) {
-        const shader = this.gl.createShader(type);
-        if (shader == null) return -1;
-
-        this.shaders.push(shader);
-        return this.shaders.length - 1;
-    },
-    createTexture() {
-        const texture = this.gl.createTexture();
-        if (texture == null) return -1;
-
-        this.textures.push(texture);
-        return this.textures.length - 1;
-    },
-    createVertexArray() {
-        const vao = this.gl.createVertexArray();
-        if (vao == null) return -1;
-
-        this.vertexArrays.push(vao);
-        return this.vertexArrays.length - 1;
-    },
-    cullFace(mode) { this.gl.cullFace(mode); },
-    deleteBuffer(buffer) { this.gl.deleteBuffer(this.buffers[buffer]); },
-    deleteFramebuffer(framebuffer) { this.gl.deleteFramebuffer(this.framebuffers[framebuffer]); },
-    deleteProgram(program) { this.gl.deleteProgram(this.programs[program]); },
-    deleteRenderbuffer(renderbuffer) { this.gl.deleteRenderbuffer(this.renderbuffers[renderbuffer]); },
-    deleteShader(shader) { this.gl.deleteShader(this.shaders[shader]); },
-    deleteTexture(texture) { this.gl.deleteTexture(this.textures[texture]); },
-    deleteVertexArray(vertexArray) { this.gl.deleteVertexArray(this.vertexArrays[vertexArray]); },
-    depthFunc(func) { this.gl.depthFunc(func); },
-    depthMask(flag) { this.gl.depthMask(flag); },
-    depthRange(znear, zfar) { this.gl.depthRange(znear, zfar); },
-    detachShader(program, shader) { this.gl.detachShader(this.programs[program], this.shaders[shader]); },
-    disable(cap) { this.gl.disable(cap); },
-    disableVertexAttribArray(index) { this.gl.disableVertexAttribArray(index); },
-    drawArrays(mode, first, count) { this.gl.drawArrays(mode, first, count); },
-    drawArraysInstanced(mode, first, count, instanceCount) { this.gl.drawArraysInstanced(mode, first, count, instanceCount); },
-    drawElements(mode, count, type, offset) { this.gl.drawElements(mode, count, type, offset); },
-    drawElementsInstanced(mode, count, type, offset, instanceCount) { this.gl.drawElementsInstanced(mode, count, type, offset, instanceCount); },
-    enable(cap) { this.gl.enable(cap); },
-    enableVertexAttribArray(index) { this.gl.enableVertexAttribArray(index); },
-    finish() { this.gl.finish(); },
-    flush() { this.gl.flush(); },
-    framebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer) {
-        this.gl.framebufferRenderbuffer(target, attachment, renderbuffertarget, this.renderbuffers[renderbuffer]);
-    },
-    framebufferTexture2D(target, attachment, texttarget, texture, level) {
-        this.gl.framebufferTexture2D(target, attachment, texttarget, this.textures[texture], level);
-    },
-    framebufferTextureLayer(target, attachment, texture, level, layer) { this.gl.framebufferTextureLayer(target, attachment, this.textures[texture], level, layer); },
-    frontFace(mode) { this.gl.frontFace(mode); },
-    generateMipmap(target) { this.gl.generateMipmap(target); },
-    getActiveAttrib(program, index, out) {
-        const loc = this.gl.getActiveAttrib(this.programs[program], index);
-        const data = new Int32Array(WASM_MEMORY.buffer, out, 2);
-        data[0] = loc.size;
-        data[1] = loc.type;
-    },
-    getActiveUniform(program, index, out) {
-        const loc = this.gl.getActiveUniform(this.programs[program], index);
-        const data = new Int32Array(WASM_MEMORY.buffer, out, 2);
-        data[0] = loc.size;
-        data[1] = loc.type;
-    },
-    // getAttachedShaders() { console.log("NOT IMPLEMENTED!"); },
-    getAttribLocation(program, name, namelen) {
-        const decoder = new TextDecoder();
-        const str = new Uint8Array(WASM_MEMORY.buffer, name, namelen);
-        const attribname = decoder.decode(str);
-
-        return this.gl.getAttribLocation(this.programs[program], attribname);
-    },
-    // getBufferParameter() { console.log("NOT IMPLEMENTED!"); },
-    getBufferSubData(target, srcbyteoffset, dstbufferdata, dstbufferlen, dstoffset, length) {
-        const dst = new DataView(WASM_MEMORY.buffer, dstbufferdata, dstbufferlen);
-        this.gl.getBufferSubData(target, srcbyteoffset, dst, dstoffset, length);
-    },
-    getError() { return this.gl.getError(); },
-    getInternalformatParameter(target, internalformat, pname) { return this.gl.getInternalformatParameter(target, internalformat, pname); },
-    // many of the 'gets() { console.log("NOT IMPLEMENTED!"); },
-    getShaderParameter(shader, param) { return this.gl.getShaderParameter(this.shaders[shader], param); },
-    getProgramParameter(program, param) { return this.gl.getProgramParameter(this.programs[program], param); },
-    getUniformLocation(program, name, namelen) {
-        const decoder = new TextDecoder();
-        const str = new Int8Array(WASM_MEMORY.buffer, name, namelen);
-        const uniname = decoder.decode(str);
-
-        this.uniformlocs.push(this.gl.getUniformLocation(this.programs[program], uniname));
-        return this.uniformlocs.length - 1;
-    },
-    getVertexAttribOffset(index, pname) { return this.gl.getVertexAttribOffset(index, pname); },
-    hint(target, mode) { this.gl.hint(target, mode); },
-    isEnabled(cap) { return this.gl.isEnabled(cap); },
-    invalidateFramebuffer(target, attachdata, attachlen) {
-        const attachments = new Int32Array(WASM_MEMORY.buffer, attachdata, attachlen);
-        this.gl.invalidateFramebuffer(target, attacements);
-    },
-    invalidateSubFramebuffer(target, attachdata, attachlen, x, y, width, height) {
-        const attachments = new Int32Array(WASM_MEMORY.buffer, attachdata, attachlen);
-        this.gl.invalidateFramebuffer(target, attacements, x, y, width, height);
-    },
-    lineWidth(width) { this.gl.lineWidth(width); },
-    linkProgram(program) { this.gl.linkProgram(this.programs[program]); },
-    pixelStorei(pname, param) { this.gl.pixelStorei(pname, param); },
-    polygonOffset(factor, units) { this.gl.polygonOffset(factor, units); },
-    printProgramInfoLog(program) { console.log(this.gl.getProgramInfoLog(this.programs[program])); },
-    printShaderInfoLog(shader) { console.log(this.gl.getShaderInfoLog(this.shaders[shader])); },
-    readPixels(x, y, width, height, format, type, pixels, pixelslen) {
-        const pixeldata = new Uint8Array(WASM_MEMORY.buffer, pixels, pixelslen);
-        this.gl.readPixels(x, y, width, height, format, type, pixeldata);
-    },
-    readBuffer(src) { this.gl.readBuffer(src); },
-    renderbufferStorageMultisample(target, samples, internalforamt, width, height) {
-        this.gl.renderbufferStorageMultisample(target, samples, internalforamt, width, height);
-    },
-    sampleCoverage(value, invert) { this.gl.sampleCoverage(value, invert); },
-    scissor(x, y, width, height) { this.gl.scissor(x, y, width, height); },
-    setSize(width, height) { this.canvas.width = width; this.canvas.height = height; },
-    shaderSource(shader, source, sourcelen) {
-        const decoder = new TextDecoder();
-        const str = new Int8Array(WASM_MEMORY.buffer, source, sourcelen);
-        const sourcedata = decoder.decode(str);
-
-        this.gl.shaderSource(this.shaders[shader], sourcedata);
-    },
-    stencilFunc(func, ref, mask) { this.gl.stencilFunc(func, ref, mask); },
-    stencilFuncSeparate(face, func, ref, mask) { this.gl.stencilFuncSeparate(face, func, ref, mask); },
-    stencilMask(mask) { this.gl.stencilMask(mask); },
-    stencilMaskSeparate(face, mask) { this.gl.stencilMaskSeparate(face, mask); },
-    stencilOp(fail, zfail, mask) { this.gl.stencilOp(fail, zfail, mask); },
-    stencilOpSeparate(face, fail, zfail, zpass) { this.gl.stencilOpSeparate(face, fail, zfail, zpass); },
-    texImage2D(target, level, internalforamt, width, height, border, format, type, pixels, pixelslen) {
-        const data = new DataView(WASM_MEMORY.buffer, pixels, pixelslen);
-        this.gl.texImage2D(target, level, internalforamt, width, height, border, format, type, data);
-    },
-    texParameterf(target, pname, param) { this.gl.texParameterf(target, pname, param); },
-    texParameteri(target, pname, param) { this.gl.texParameteri(target, pname, param); },
-    texSubImage2D(target, level, xoff, yoff, width, height, format, type, pixels, pixelslen) {
-        const data = new Uint8Array(WASM_MEMORY.buffer, pixels, pixelslen);
-        this.gl.texSubImage2D(target, level, xoff, yoff, width, height, format, type, data);
-    },
-    uniform1f(loc, x) { this.gl.uniform1f(this.uniformlocs[loc], x); },
-    uniform1i(loc, x) { this.gl.uniform1i(this.uniformlocs[loc], x); },
-    uniform2f(loc, x, y) { this.gl.uniform2f(this.uniformlocs[loc], x, y); },
-    uniform2i(loc, x, y) { this.gl.uniform2i(this.uniformlocs[loc], x, y); },
-    uniform3f(loc, x, y, z) { this.gl.uniform3f(this.uniformlocs[loc], x, y, z); },
-    uniform3i(loc, x, y, z) { this.gl.uniform3i(this.uniformlocs[loc], x, y, z); },
-    uniform4f(loc, x, y, z, w) { this.gl.uniform4f(this.uniformlocs[loc], x, y, z, w); },
-    uniform4i(loc, x, y, z, w) { this.gl.uniform4i(this.uniformlocs[loc], x, y, z, w); },
-    uniformMatrix2(loc, transpose, valueptr) {
-        const data = new Float32Array(WASM_MEMORY.buffer, valueptr, 4);
-        this.gl.uniformMatrix2fv(this.uniformlocs[loc], transpose, data);
-    },
-    uniformMatrix3(loc, transpose, valueptr) {
-        const data = new Float32Array(WASM_MEMORY.buffer, valueptr, 9);
-        this.gl.uniformMatrix3fv(this.uniformlocs[loc], transpose, data);
-    },
-    uniformMatrix4(loc, transpose, valueptr) {
-        const data = new Float32Array(WASM_MEMORY.buffer, valueptr, 16);
-        this.gl.uniformMatrix4fv(this.uniformlocs[loc], transpose, data);
-    },
-    useProgram(program) { this.gl.useProgram(this.programs[program]); },
-    validateProgram(program) { this.gl.validateProgram(this.program[program]); },
-    vertexAttrib1f(idx, x) { this.gl.vertexAttrib1f(idx, x); },
-    vertexAttrib2f(idx, x, y) { this.gl.vertexAttrib2f(idx, x, y); },
-    vertexAttrib3f(idx, x, y, z) { this.gl.vertexAttrib3f(idx, x, y, z); },
-    vertexAttrib4f(idx, x, y, z, w) { this.gl.vertexAttrib4f(idx, x, y, z, w); },
-    vertexAttribPointer(idx, size, type, normalized, stride, offset) { this.gl.vertexAttribPointer(idx, size, type, normalized, stride, offset); },
-    vertexAttribDivisor(idx, divisor) { this.gl.vertexAttribDivisor(idx, divisor); },
-    viewport(x, y, width, height) { this.gl.viewport(x, y, width, height); },
-
-};
diff --git a/core/js/webgl.onyx b/core/js/webgl.onyx
deleted file mode 100644 (file)
index 8ec5a14..0000000
+++ /dev/null
@@ -1,856 +0,0 @@
-package gl
-
-// To be used with the corresponding gl.js
-// There are many things that are missing but this suffices for me.
-
-#private_file runtime :: package runtime
-#if runtime.Runtime != runtime.Runtime_Js {
-    #error "'webgl' can only be used with the 'js' runtime."
-}
-
-
-// ClearBufferMask 
-DEPTH_BUFFER_BIT               :: 0x00000100
-STENCIL_BUFFER_BIT             :: 0x00000400
-COLOR_BUFFER_BIT               :: 0x00004000
-
-// BeginMode 
-POINTS                         :: 0x0000
-LINES                          :: 0x0001
-LINE_LOOP                      :: 0x0002
-LINE_STRIP                     :: 0x0003
-TRIANGLES                      :: 0x0004
-TRIANGLE_STRIP                 :: 0x0005
-TRIANGLE_FAN                   :: 0x0006
-
-// AlphaFunction (not supported in ES20) 
-//      NEVER 
-//      LESS 
-//      EQUAL 
-//      LEQUAL 
-//      GREATER 
-//      NOTEQUAL 
-//      GEQUAL 
-//      ALWAYS 
-
-// BlendingFactorDest 
-ZERO                           :: 0
-ONE                            :: 1
-SRC_COLOR                      :: 0x0300
-ONE_MINUS_SRC_COLOR            :: 0x0301
-SRC_ALPHA                      :: 0x0302
-ONE_MINUS_SRC_ALPHA            :: 0x0303
-DST_ALPHA                      :: 0x0304
-ONE_MINUS_DST_ALPHA            :: 0x0305
-
-// BlendingFactorSrc 
-//      ZERO 
-//      ONE 
-DST_COLOR                      :: 0x0306
-ONE_MINUS_DST_COLOR            :: 0x0307
-SRC_ALPHA_SATURATE             :: 0x0308
-//      SRC_ALPHA 
-//      ONE_MINUS_SRC_ALPHA 
-//      DST_ALPHA 
-//      ONE_MINUS_DST_ALPHA 
-
-// BlendEquationSeparate 
-FUNC_ADD                       :: 0x8006
-BLEND_EQUATION                 :: 0x8009
-BLEND_EQUATION_RGB             :: 0x8009   // same as BLEND_EQUATION
-BLEND_EQUATION_ALPHA           :: 0x883D
-
-// BlendSubtract 
-FUNC_SUBTRACT                  :: 0x800A
-FUNC_REVERSE_SUBTRACT          :: 0x800B
-
-// Separate Blend Functions 
-BLEND_DST_RGB                  :: 0x80C8
-BLEND_SRC_RGB                  :: 0x80C9
-BLEND_DST_ALPHA                :: 0x80CA
-BLEND_SRC_ALPHA                :: 0x80CB
-CONSTANT_COLOR                 :: 0x8001
-ONE_MINUS_CONSTANT_COLOR       :: 0x8002
-CONSTANT_ALPHA                 :: 0x8003
-ONE_MINUS_CONSTANT_ALPHA       :: 0x8004
-BLEND_COLOR                    :: 0x8005
-
-// Buffer Objects 
-ARRAY_BUFFER                   :: 0x8892
-ELEMENT_ARRAY_BUFFER           :: 0x8893
-ARRAY_BUFFER_BINDING           :: 0x8894
-ELEMENT_ARRAY_BUFFER_BINDING   :: 0x8895
-
-STREAM_DRAW                    :: 0x88E0
-STATIC_DRAW                    :: 0x88E4
-DYNAMIC_DRAW                   :: 0x88E8
-
-BUFFER_SIZE                    :: 0x8764
-BUFFER_USAGE                   :: 0x8765
-
-CURRENT_VERTEX_ATTRIB          :: 0x8626
-
-// CullFaceMode 
-FRONT                          :: 0x0404
-BACK                           :: 0x0405
-FRONT_AND_BACK                 :: 0x0408
-
-// DepthFunction 
-//      NEVER 
-//      LESS 
-//      EQUAL 
-//      LEQUAL 
-//      GREATER 
-//      NOTEQUAL 
-//      GEQUAL 
-//      ALWAYS 
-
-// EnableCap 
-// TEXTURE_2D 
-CULL_FACE                      :: 0x0B44
-BLEND                          :: 0x0BE2
-DITHER                         :: 0x0BD0
-STENCIL_TEST                   :: 0x0B90
-DEPTH_TEST                     :: 0x0B71
-SCISSOR_TEST                   :: 0x0C11
-POLYGON_OFFSET_FILL            :: 0x8037
-SAMPLE_ALPHA_TO_COVERAGE       :: 0x809E
-SAMPLE_COVERAGE                :: 0x80A0
-
-// ErrorCode 
-NO_ERROR                       :: 0
-INVALID_ENUM                   :: 0x0500
-INVALID_VALUE                  :: 0x0501
-INVALID_OPERATION              :: 0x0502
-OUT_OF_MEMORY                  :: 0x0505
-
-// FrontFaceDirection 
-CW                             :: 0x0900
-CCW                            :: 0x0901
-
-// GetPName 
-LINE_WIDTH                     :: 0x0B21
-ALIASED_POINT_SIZE_RANGE       :: 0x846D
-ALIASED_LINE_WIDTH_RANGE       :: 0x846E
-CULL_FACE_MODE                 :: 0x0B45
-FRONT_FACE                     :: 0x0B46
-DEPTH_RANGE                    :: 0x0B70
-DEPTH_WRITEMASK                :: 0x0B72
-DEPTH_CLEAR_VALUE              :: 0x0B73
-DEPTH_FUNC                     :: 0x0B74
-STENCIL_CLEAR_VALUE            :: 0x0B91
-STENCIL_FUNC                   :: 0x0B92
-STENCIL_FAIL                   :: 0x0B94
-STENCIL_PASS_DEPTH_FAIL        :: 0x0B95
-STENCIL_PASS_DEPTH_PASS        :: 0x0B96
-STENCIL_REF                    :: 0x0B97
-STENCIL_VALUE_MASK             :: 0x0B93
-STENCIL_WRITEMASK              :: 0x0B98
-STENCIL_BACK_FUNC              :: 0x8800
-STENCIL_BACK_FAIL              :: 0x8801
-STENCIL_BACK_PASS_DEPTH_FAIL   :: 0x8802
-STENCIL_BACK_PASS_DEPTH_PASS   :: 0x8803
-STENCIL_BACK_REF               :: 0x8CA3
-STENCIL_BACK_VALUE_MASK        :: 0x8CA4
-STENCIL_BACK_WRITEMASK         :: 0x8CA5
-VIEWPORT                       :: 0x0BA2
-SCISSOR_BOX                    :: 0x0C10
-//      SCISSOR_TEST 
-COLOR_CLEAR_VALUE              :: 0x0C22
-COLOR_WRITEMASK                :: 0x0C23
-UNPACK_ALIGNMENT               :: 0x0CF5
-PACK_ALIGNMENT                 :: 0x0D05
-MAX_TEXTURE_SIZE               :: 0x0D33
-MAX_VIEWPORT_DIMS              :: 0x0D3A
-SUBPIXEL_BITS                  :: 0x0D50
-RED_BITS                       :: 0x0D52
-GREEN_BITS                     :: 0x0D53
-BLUE_BITS                      :: 0x0D54
-ALPHA_BITS                     :: 0x0D55
-DEPTH_BITS                     :: 0x0D56
-STENCIL_BITS                   :: 0x0D57
-POLYGON_OFFSET_UNITS           :: 0x2A00
-//      POLYGON_OFFSET_FILL 
-POLYGON_OFFSET_FACTOR          :: 0x8038
-TEXTURE_BINDING_2D             :: 0x8069
-SAMPLE_BUFFERS                 :: 0x80A8
-SAMPLES                        :: 0x80A9
-SAMPLE_COVERAGE_VALUE          :: 0x80AA
-SAMPLE_COVERAGE_INVERT         :: 0x80AB
-
-// GetTextureParameter 
-//      TEXTURE_MAG_FILTER 
-//      TEXTURE_MIN_FILTER 
-//      TEXTURE_WRAP_S 
-//      TEXTURE_WRAP_T 
-
-COMPRESSED_TEXTURE_FORMATS     :: 0x86A3
-
-// HintMode 
-DONT_CARE                      :: 0x1100
-FASTEST                        :: 0x1101
-NICEST                         :: 0x1102
-
-// HintTarget 
-GENERATE_MIPMAP_HINT            :: 0x8192
-
-// DataType 
-BYTE                           :: 0x1400
-UNSIGNED_BYTE                  :: 0x1401
-SHORT                          :: 0x1402
-UNSIGNED_SHORT                 :: 0x1403
-INT                            :: 0x1404
-UNSIGNED_INT                   :: 0x1405
-FLOAT                          :: 0x1406
-
-// PixelFormat 
-DEPTH_COMPONENT                :: 0x1902
-ALPHA                          :: 0x1906
-RGB                            :: 0x1907
-RGBA                           :: 0x1908
-LUMINANCE                      :: 0x1909
-LUMINANCE_ALPHA                :: 0x190A
-
-// PixelType 
-//      UNSIGNED_BYTE 
-UNSIGNED_SHORT_4_4_4_4         :: 0x8033
-UNSIGNED_SHORT_5_5_5_1         :: 0x8034
-UNSIGNED_SHORT_5_6_5           :: 0x8363
-
-// Shaders 
-FRAGMENT_SHADER                  :: 0x8B30
-VERTEX_SHADER                    :: 0x8B31
-MAX_VERTEX_ATTRIBS               :: 0x8869
-MAX_VERTEX_UNIFORM_VECTORS       :: 0x8DFB
-MAX_VARYING_VECTORS              :: 0x8DFC
-MAX_COMBINED_TEXTURE_IMAGE_UNITS :: 0x8B4D
-MAX_VERTEX_TEXTURE_IMAGE_UNITS   :: 0x8B4C
-MAX_TEXTURE_IMAGE_UNITS          :: 0x8872
-MAX_FRAGMENT_UNIFORM_VECTORS     :: 0x8DFD
-SHADER_TYPE                      :: 0x8B4F
-DELETE_STATUS                    :: 0x8B80
-LINK_STATUS                      :: 0x8B82
-VALIDATE_STATUS                  :: 0x8B83
-ATTACHED_SHADERS                 :: 0x8B85
-ACTIVE_UNIFORMS                  :: 0x8B86
-ACTIVE_ATTRIBUTES                :: 0x8B89
-SHADING_LANGUAGE_VERSION         :: 0x8B8C
-CURRENT_PROGRAM                  :: 0x8B8D
-
-// StencilFunction 
-NEVER                          :: 0x0200
-LESS                           :: 0x0201
-EQUAL                          :: 0x0202
-LEQUAL                         :: 0x0203
-GREATER                        :: 0x0204
-NOTEQUAL                       :: 0x0205
-GEQUAL                         :: 0x0206
-ALWAYS                         :: 0x0207
-
-// StencilOp 
-//      ZERO 
-KEEP                           :: 0x1E00
-REPLACE                        :: 0x1E01
-INCR                           :: 0x1E02
-DECR                           :: 0x1E03
-INVERT                         :: 0x150A
-INCR_WRAP                      :: 0x8507
-DECR_WRAP                      :: 0x8508
-
-// StringName 
-VENDOR                         :: 0x1F00
-RENDERER                       :: 0x1F01
-VERSION                        :: 0x1F02
-
-// TextureMagFilter 
-NEAREST                        :: 0x2600
-LINEAR                         :: 0x2601
-
-// TextureMinFilter 
-//      NEAREST 
-//      LINEAR 
-NEAREST_MIPMAP_NEAREST         :: 0x2700
-LINEAR_MIPMAP_NEAREST          :: 0x2701
-NEAREST_MIPMAP_LINEAR          :: 0x2702
-LINEAR_MIPMAP_LINEAR           :: 0x2703
-
-// TextureParameterName 
-TEXTURE_MAG_FILTER             :: 0x2800
-TEXTURE_MIN_FILTER             :: 0x2801
-TEXTURE_WRAP_S                 :: 0x2802
-TEXTURE_WRAP_T                 :: 0x2803
-
-// TextureTarget 
-TEXTURE_2D                     :: 0x0DE1
-TEXTURE                        :: 0x1702
-
-TEXTURE_CUBE_MAP               :: 0x8513
-TEXTURE_BINDING_CUBE_MAP       :: 0x8514
-TEXTURE_CUBE_MAP_POSITIVE_X    :: 0x8515
-TEXTURE_CUBE_MAP_NEGATIVE_X    :: 0x8516
-TEXTURE_CUBE_MAP_POSITIVE_Y    :: 0x8517
-TEXTURE_CUBE_MAP_NEGATIVE_Y    :: 0x8518
-TEXTURE_CUBE_MAP_POSITIVE_Z    :: 0x8519
-TEXTURE_CUBE_MAP_NEGATIVE_Z    :: 0x851A
-MAX_CUBE_MAP_TEXTURE_SIZE      :: 0x851C
-
-// TextureUnit 
-TEXTURE0                       :: 0x84C0
-TEXTURE1                       :: 0x84C1
-TEXTURE2                       :: 0x84C2
-TEXTURE3                       :: 0x84C3
-TEXTURE4                       :: 0x84C4
-TEXTURE5                       :: 0x84C5
-TEXTURE6                       :: 0x84C6
-TEXTURE7                       :: 0x84C7
-TEXTURE8                       :: 0x84C8
-TEXTURE9                       :: 0x84C9
-TEXTURE10                      :: 0x84CA
-TEXTURE11                      :: 0x84CB
-TEXTURE12                      :: 0x84CC
-TEXTURE13                      :: 0x84CD
-TEXTURE14                      :: 0x84CE
-TEXTURE15                      :: 0x84CF
-TEXTURE16                      :: 0x84D0
-TEXTURE17                      :: 0x84D1
-TEXTURE18                      :: 0x84D2
-TEXTURE19                      :: 0x84D3
-TEXTURE20                      :: 0x84D4
-TEXTURE21                      :: 0x84D5
-TEXTURE22                      :: 0x84D6
-TEXTURE23                      :: 0x84D7
-TEXTURE24                      :: 0x84D8
-TEXTURE25                      :: 0x84D9
-TEXTURE26                      :: 0x84DA
-TEXTURE27                      :: 0x84DB
-TEXTURE28                      :: 0x84DC
-TEXTURE29                      :: 0x84DD
-TEXTURE30                      :: 0x84DE
-TEXTURE31                      :: 0x84DF
-ACTIVE_TEXTURE                 :: 0x84E0
-
-// TextureWrapMode 
-REPEAT                         :: 0x2901
-CLAMP_TO_EDGE                  :: 0x812F
-MIRRORED_REPEAT                :: 0x8370
-
-// Uniform Types 
-FLOAT_VEC2                     :: 0x8B50
-FLOAT_VEC3                     :: 0x8B51
-FLOAT_VEC4                     :: 0x8B52
-INT_VEC2                       :: 0x8B53
-INT_VEC3                       :: 0x8B54
-INT_VEC4                       :: 0x8B55
-BOOL                           :: 0x8B56
-BOOL_VEC2                      :: 0x8B57
-BOOL_VEC3                      :: 0x8B58
-BOOL_VEC4                      :: 0x8B59
-FLOAT_MAT2                     :: 0x8B5A
-FLOAT_MAT3                     :: 0x8B5B
-FLOAT_MAT4                     :: 0x8B5C
-SAMPLER_2D                     :: 0x8B5E
-SAMPLER_CUBE                   :: 0x8B60
-
-// Vertex Arrays 
-VERTEX_ATTRIB_ARRAY_ENABLED        :: 0x8622
-VERTEX_ATTRIB_ARRAY_SIZE           :: 0x8623
-VERTEX_ATTRIB_ARRAY_STRIDE         :: 0x8624
-VERTEX_ATTRIB_ARRAY_TYPE           :: 0x8625
-VERTEX_ATTRIB_ARRAY_NORMALIZED     :: 0x886A
-VERTEX_ATTRIB_ARRAY_POINTER        :: 0x8645
-VERTEX_ATTRIB_ARRAY_BUFFER_BINDING :: 0x889F
-
-// Read Format 
-IMPLEMENTATION_COLOR_READ_TYPE   :: 0x8B9A
-IMPLEMENTATION_COLOR_READ_FORMAT :: 0x8B9B
-
-// Shader Source 
-COMPILE_STATUS                 :: 0x8B81
-
-// Shader Precision-Specified Types 
-LOW_FLOAT                      :: 0x8DF0
-MEDIUM_FLOAT                   :: 0x8DF1
-HIGH_FLOAT                     :: 0x8DF2
-LOW_INT                        :: 0x8DF3
-MEDIUM_INT                     :: 0x8DF4
-HIGH_INT                       :: 0x8DF5
-
-// Framebuffer Object. 
-FRAMEBUFFER                    :: 0x8D40
-RENDERBUFFER                   :: 0x8D41
-
-RGBA4                          :: 0x8056
-RGB5_A1                        :: 0x8057
-RGB565                         :: 0x8D62
-DEPTH_COMPONENT16              :: 0x81A5
-STENCIL_INDEX                  :: 0x1901
-STENCIL_INDEX8                 :: 0x8D48
-DEPTH_STENCIL                  :: 0x84F9
-
-RENDERBUFFER_WIDTH             :: 0x8D42
-RENDERBUFFER_HEIGHT            :: 0x8D43
-RENDERBUFFER_INTERNAL_FORMAT   :: 0x8D44
-RENDERBUFFER_RED_SIZE          :: 0x8D50
-RENDERBUFFER_GREEN_SIZE        :: 0x8D51
-RENDERBUFFER_BLUE_SIZE         :: 0x8D52
-RENDERBUFFER_ALPHA_SIZE        :: 0x8D53
-RENDERBUFFER_DEPTH_SIZE        :: 0x8D54
-RENDERBUFFER_STENCIL_SIZE      :: 0x8D55
-
-FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE           :: 0x8CD0
-FRAMEBUFFER_ATTACHMENT_OBJECT_NAME           :: 0x8CD1
-FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL         :: 0x8CD2
-FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE :: 0x8CD3
-
-COLOR_ATTACHMENT0              :: 0x8CE0
-DEPTH_ATTACHMENT               :: 0x8D00
-STENCIL_ATTACHMENT             :: 0x8D20
-DEPTH_STENCIL_ATTACHMENT       :: 0x821A
-
-NONE                           :: 0
-
-FRAMEBUFFER_COMPLETE                      :: 0x8CD5
-FRAMEBUFFER_INCOMPLETE_ATTACHMENT         :: 0x8CD6
-FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT :: 0x8CD7
-FRAMEBUFFER_INCOMPLETE_DIMENSIONS         :: 0x8CD9
-FRAMEBUFFER_UNSUPPORTED                   :: 0x8CDD
-
-FRAMEBUFFER_BINDING            :: 0x8CA6
-RENDERBUFFER_BINDING           :: 0x8CA7
-MAX_RENDERBUFFER_SIZE          :: 0x84E8
-
-INVALID_FRAMEBUFFER_OPERATION  :: 0x0506
-
-READ_BUFFER                                   :: 0x0C02
-UNPACK_ROW_LENGTH                             :: 0x0CF2
-UNPACK_SKIP_ROWS                              :: 0x0CF3
-UNPACK_SKIP_PIXELS                            :: 0x0CF4
-PACK_ROW_LENGTH                               :: 0x0D02
-PACK_SKIP_ROWS                                :: 0x0D03
-PACK_SKIP_PIXELS                              :: 0x0D04
-COLOR                                         :: 0x1800
-DEPTH                                         :: 0x1801
-STENCIL                                       :: 0x1802
-RED                                           :: 0x1903
-RGB8                                          :: 0x8051
-RGBA8                                         :: 0x8058
-RGB10_A2                                      :: 0x8059
-TEXTURE_BINDING_3D                            :: 0x806A
-UNPACK_SKIP_IMAGES                            :: 0x806D
-UNPACK_IMAGE_HEIGHT                           :: 0x806E
-TEXTURE_3D                                    :: 0x806F
-TEXTURE_WRAP_R                                :: 0x8072
-MAX_3D_TEXTURE_SIZE                           :: 0x8073
-UNSIGNED_INT_2_10_10_10_REV                   :: 0x8368
-MAX_ELEMENTS_VERTICES                         :: 0x80E8
-MAX_ELEMENTS_INDICES                          :: 0x80E9
-TEXTURE_MIN_LOD                               :: 0x813A
-TEXTURE_MAX_LOD                               :: 0x813B
-TEXTURE_BASE_LEVEL                            :: 0x813C
-TEXTURE_MAX_LEVEL                             :: 0x813D
-MIN                                           :: 0x8007
-MAX                                           :: 0x8008
-DEPTH_COMPONENT24                             :: 0x81A6
-MAX_TEXTURE_LOD_BIAS                          :: 0x84FD
-TEXTURE_COMPARE_MODE                          :: 0x884C
-TEXTURE_COMPARE_FUNC                          :: 0x884D
-CURRENT_QUERY                                 :: 0x8865
-QUERY_RESULT                                  :: 0x8866
-QUERY_RESULT_AVAILABLE                        :: 0x8867
-STREAM_READ                                   :: 0x88E1
-STREAM_COPY                                   :: 0x88E2
-STATIC_READ                                   :: 0x88E5
-STATIC_COPY                                   :: 0x88E6
-DYNAMIC_READ                                  :: 0x88E9
-DYNAMIC_COPY                                  :: 0x88EA
-MAX_DRAW_BUFFERS                              :: 0x8824
-DRAW_BUFFER0                                  :: 0x8825
-DRAW_BUFFER1                                  :: 0x8826
-DRAW_BUFFER2                                  :: 0x8827
-DRAW_BUFFER3                                  :: 0x8828
-DRAW_BUFFER4                                  :: 0x8829
-DRAW_BUFFER5                                  :: 0x882A
-DRAW_BUFFER6                                  :: 0x882B
-DRAW_BUFFER7                                  :: 0x882C
-DRAW_BUFFER8                                  :: 0x882D
-DRAW_BUFFER9                                  :: 0x882E
-DRAW_BUFFER10                                 :: 0x882F
-DRAW_BUFFER11                                 :: 0x8830
-DRAW_BUFFER12                                 :: 0x8831
-DRAW_BUFFER13                                 :: 0x8832
-DRAW_BUFFER14                                 :: 0x8833
-DRAW_BUFFER15                                 :: 0x8834
-MAX_FRAGMENT_UNIFORM_COMPONENTS               :: 0x8B49
-MAX_VERTEX_UNIFORM_COMPONENTS                 :: 0x8B4A
-SAMPLER_3D                                    :: 0x8B5F
-SAMPLER_2D_SHADOW                             :: 0x8B62
-FRAGMENT_SHADER_DERIVATIVE_HINT               :: 0x8B8B
-PIXEL_PACK_BUFFER                             :: 0x88EB
-PIXEL_UNPACK_BUFFER                           :: 0x88EC
-PIXEL_PACK_BUFFER_BINDING                     :: 0x88ED
-PIXEL_UNPACK_BUFFER_BINDING                   :: 0x88EF
-FLOAT_MAT2x3                                  :: 0x8B65
-FLOAT_MAT2x4                                  :: 0x8B66
-FLOAT_MAT3x2                                  :: 0x8B67
-FLOAT_MAT3x4                                  :: 0x8B68
-FLOAT_MAT4x2                                  :: 0x8B69
-FLOAT_MAT4x3                                  :: 0x8B6A
-SRGB                                          :: 0x8C40
-SRGB8                                         :: 0x8C41
-SRGB8_ALPHA8                                  :: 0x8C43
-COMPARE_REF_TO_TEXTURE                        :: 0x884E
-RGBA32F                                       :: 0x8814
-RGB32F                                        :: 0x8815
-RGBA16F                                       :: 0x881A
-RGB16F                                        :: 0x881B
-VERTEX_ATTRIB_ARRAY_INTEGER                   :: 0x88FD
-MAX_ARRAY_TEXTURE_LAYERS                      :: 0x88FF
-MIN_PROGRAM_TEXEL_OFFSET                      :: 0x8904
-MAX_PROGRAM_TEXEL_OFFSET                      :: 0x8905
-MAX_VARYING_COMPONENTS                        :: 0x8B4B
-TEXTURE_2D_ARRAY                              :: 0x8C1A
-TEXTURE_BINDING_2D_ARRAY                      :: 0x8C1D
-R11F_G11F_B10F                                :: 0x8C3A
-UNSIGNED_INT_10F_11F_11F_REV                  :: 0x8C3B
-RGB9_E5                                       :: 0x8C3D
-UNSIGNED_INT_5_9_9_9_REV                      :: 0x8C3E
-TRANSFORM_FEEDBACK_BUFFER_MODE                :: 0x8C7F
-MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS    :: 0x8C80
-TRANSFORM_FEEDBACK_VARYINGS                   :: 0x8C83
-TRANSFORM_FEEDBACK_BUFFER_START               :: 0x8C84
-TRANSFORM_FEEDBACK_BUFFER_SIZE                :: 0x8C85
-TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN         :: 0x8C88
-RASTERIZER_DISCARD                            :: 0x8C89
-MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS :: 0x8C8A
-MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS       :: 0x8C8B
-INTERLEAVED_ATTRIBS                           :: 0x8C8C
-SEPARATE_ATTRIBS                              :: 0x8C8D
-TRANSFORM_FEEDBACK_BUFFER                     :: 0x8C8E
-TRANSFORM_FEEDBACK_BUFFER_BINDING             :: 0x8C8F
-RGBA32UI                                      :: 0x8D70
-RGB32UI                                       :: 0x8D71
-RGBA16UI                                      :: 0x8D76
-RGB16UI                                       :: 0x8D77
-RGBA8UI                                       :: 0x8D7C
-RGB8UI                                        :: 0x8D7D
-RGBA32I                                       :: 0x8D82
-RGB32I                                        :: 0x8D83
-RGBA16I                                       :: 0x8D88
-RGB16I                                        :: 0x8D89
-RGBA8I                                        :: 0x8D8E
-RGB8I                                         :: 0x8D8F
-RED_INTEGER                                   :: 0x8D94
-RGB_INTEGER                                   :: 0x8D98
-RGBA_INTEGER                                  :: 0x8D99
-SAMPLER_2D_ARRAY                              :: 0x8DC1
-SAMPLER_2D_ARRAY_SHADOW                       :: 0x8DC4
-SAMPLER_CUBE_SHADOW                           :: 0x8DC5
-UNSIGNED_INT_VEC2                             :: 0x8DC6
-UNSIGNED_INT_VEC3                             :: 0x8DC7
-UNSIGNED_INT_VEC4                             :: 0x8DC8
-INT_SAMPLER_2D                                :: 0x8DCA
-INT_SAMPLER_3D                                :: 0x8DCB
-INT_SAMPLER_CUBE                              :: 0x8DCC
-INT_SAMPLER_2D_ARRAY                          :: 0x8DCF
-UNSIGNED_INT_SAMPLER_2D                       :: 0x8DD2
-UNSIGNED_INT_SAMPLER_3D                       :: 0x8DD3
-UNSIGNED_INT_SAMPLER_CUBE                     :: 0x8DD4
-UNSIGNED_INT_SAMPLER_2D_ARRAY                 :: 0x8DD7
-DEPTH_COMPONENT32F                            :: 0x8CAC
-DEPTH32F_STENCIL8                             :: 0x8CAD
-FLOAT_32_UNSIGNED_INT_24_8_REV                :: 0x8DAD
-FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING         :: 0x8210
-FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE         :: 0x8211
-FRAMEBUFFER_ATTACHMENT_RED_SIZE               :: 0x8212
-FRAMEBUFFER_ATTACHMENT_GREEN_SIZE             :: 0x8213
-FRAMEBUFFER_ATTACHMENT_BLUE_SIZE              :: 0x8214
-FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE             :: 0x8215
-FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE             :: 0x8216
-FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE           :: 0x8217
-FRAMEBUFFER_DEFAULT                           :: 0x8218
-UNSIGNED_INT_24_8                             :: 0x84FA
-DEPTH24_STENCIL8                              :: 0x88F0
-UNSIGNED_NORMALIZED                           :: 0x8C17
-DRAW_FRAMEBUFFER_BINDING                      :: 0x8CA6
-READ_FRAMEBUFFER                              :: 0x8CA8
-DRAW_FRAMEBUFFER                              :: 0x8CA9
-READ_FRAMEBUFFER_BINDING                      :: 0x8CAA
-RENDERBUFFER_SAMPLES                          :: 0x8CAB
-FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER          :: 0x8CD4
-MAX_COLOR_ATTACHMENTS                         :: 0x8CDF
-COLOR_ATTACHMENT1                             :: 0x8CE1
-COLOR_ATTACHMENT2                             :: 0x8CE2
-COLOR_ATTACHMENT3                             :: 0x8CE3
-COLOR_ATTACHMENT4                             :: 0x8CE4
-COLOR_ATTACHMENT5                             :: 0x8CE5
-COLOR_ATTACHMENT6                             :: 0x8CE6
-COLOR_ATTACHMENT7                             :: 0x8CE7
-COLOR_ATTACHMENT8                             :: 0x8CE8
-COLOR_ATTACHMENT9                             :: 0x8CE9
-COLOR_ATTACHMENT10                            :: 0x8CEA
-COLOR_ATTACHMENT11                            :: 0x8CEB
-COLOR_ATTACHMENT12                            :: 0x8CEC
-COLOR_ATTACHMENT13                            :: 0x8CED
-COLOR_ATTACHMENT14                            :: 0x8CEE
-COLOR_ATTACHMENT15                            :: 0x8CEF
-FRAMEBUFFER_INCOMPLETE_MULTISAMPLE            :: 0x8D56
-MAX_SAMPLES                                   :: 0x8D57
-HALF_FLOAT                                    :: 0x140B
-RG                                            :: 0x8227
-RG_INTEGER                                    :: 0x8228
-R8                                            :: 0x8229
-RG8                                           :: 0x822B
-R16F                                          :: 0x822D
-R32F                                          :: 0x822E
-RG16F                                         :: 0x822F
-RG32F                                         :: 0x8230
-R8I                                           :: 0x8231
-R8UI                                          :: 0x8232
-R16I                                          :: 0x8233
-R16UI                                         :: 0x8234
-R32I                                          :: 0x8235
-R32UI                                         :: 0x8236
-RG8I                                          :: 0x8237
-RG8UI                                         :: 0x8238
-RG16I                                         :: 0x8239
-RG16UI                                        :: 0x823A
-RG32I                                         :: 0x823B
-RG32UI                                        :: 0x823C
-VERTEX_ARRAY_BINDING                          :: 0x85B5
-R8_SNORM                                      :: 0x8F94
-RG8_SNORM                                     :: 0x8F95
-RGB8_SNORM                                    :: 0x8F96
-RGBA8_SNORM                                   :: 0x8F97
-SIGNED_NORMALIZED                             :: 0x8F9C
-COPY_READ_BUFFER                              :: 0x8F36
-COPY_WRITE_BUFFER                             :: 0x8F37
-COPY_READ_BUFFER_BINDING                      :: 0x8F36
-COPY_WRITE_BUFFER_BINDING                     :: 0x8F37
-UNIFORM_BUFFER                                :: 0x8A11
-UNIFORM_BUFFER_BINDING                        :: 0x8A28
-UNIFORM_BUFFER_START                          :: 0x8A29
-UNIFORM_BUFFER_SIZE                           :: 0x8A2A
-MAX_VERTEX_UNIFORM_BLOCKS                     :: 0x8A2B
-MAX_FRAGMENT_UNIFORM_BLOCKS                   :: 0x8A2D
-MAX_COMBINED_UNIFORM_BLOCKS                   :: 0x8A2E
-MAX_UNIFORM_BUFFER_BINDINGS                   :: 0x8A2F
-MAX_UNIFORM_BLOCK_SIZE                        :: 0x8A30
-MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS        :: 0x8A31
-MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS      :: 0x8A33
-UNIFORM_BUFFER_OFFSET_ALIGNMENT               :: 0x8A34
-ACTIVE_UNIFORM_BLOCKS                         :: 0x8A36
-UNIFORM_TYPE                                  :: 0x8A37
-UNIFORM_SIZE                                  :: 0x8A38
-UNIFORM_BLOCK_INDEX                           :: 0x8A3A
-UNIFORM_OFFSET                                :: 0x8A3B
-UNIFORM_ARRAY_STRIDE                          :: 0x8A3C
-UNIFORM_MATRIX_STRIDE                         :: 0x8A3D
-UNIFORM_IS_ROW_MAJOR                          :: 0x8A3E
-UNIFORM_BLOCK_BINDING                         :: 0x8A3F
-UNIFORM_BLOCK_DATA_SIZE                       :: 0x8A40
-UNIFORM_BLOCK_ACTIVE_UNIFORMS                 :: 0x8A42
-UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES          :: 0x8A43
-UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER     :: 0x8A44
-UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER   :: 0x8A46
-INVALID_INDEX                                 :: 0xFFFFFFF
-MAX_VERTEX_OUTPUT_COMPONENTS                  :: 0x9122
-MAX_FRAGMENT_INPUT_COMPONENTS                 :: 0x9125
-MAX_SERVER_WAIT_TIMEOUT                       :: 0x9111
-OBJECT_TYPE                                   :: 0x9112
-SYNC_CONDITION                                :: 0x9113
-SYNC_STATUS                                   :: 0x9114
-SYNC_FLAGS                                    :: 0x9115
-SYNC_FENCE                                    :: 0x9116
-SYNC_GPU_COMMANDS_COMPLETE                    :: 0x9117
-UNSIGNALED                                    :: 0x9118
-SIGNALED                                      :: 0x9119
-ALREADY_SIGNALED                              :: 0x911A
-TIMEOUT_EXPIRED                               :: 0x911B
-CONDITION_SATISFIED                           :: 0x911C
-WAIT_FAILED                                   :: 0x911D
-SYNC_FLUSH_COMMANDS_BIT                       :: 0x0000001
-VERTEX_ATTRIB_ARRAY_DIVISOR                   :: 0x88FE
-ANY_SAMPLES_PASSED                            :: 0x8C2F
-ANY_SAMPLES_PASSED_CONSERVATIVE               :: 0x8D6A
-SAMPLER_BINDING                               :: 0x8919
-RGB10_A2UI                                    :: 0x906F
-INT_2_10_10_10_REV                            :: 0x8D9F
-TRANSFORM_FEEDBACK                            :: 0x8E22
-TRANSFORM_FEEDBACK_PAUSED                     :: 0x8E23
-TRANSFORM_FEEDBACK_ACTIVE                     :: 0x8E24
-TRANSFORM_FEEDBACK_BINDING                    :: 0x8E25
-TEXTURE_IMMUTABLE_FORMAT                      :: 0x912F
-MAX_ELEMENT_INDEX                             :: 0x8D6B
-TEXTURE_IMMUTABLE_LEVELS                      :: 0x82DF
-TIMEOUT_IGNORED                               :: -1
-
-// WebGL-specific enums 
-UNPACK_FLIP_Y_WEBGL            :: 0x9240
-UNPACK_PREMULTIPLY_ALPHA_WEBGL :: 0x9241
-CONTEXT_LOST_WEBGL             :: 0x9242
-UNPACK_COLORSPACE_CONVERSION_WEBGL :: 0x9243
-BROWSER_DEFAULT_WEBGL          :: 0x9244
-MAX_CLIENT_WAIT_TIMEOUT_WEBGL  :: 0x9247
-
-GLenum     :: #type u32
-GLboolean  :: #type bool
-GLbitfield :: #type u32
-GLbyte     :: #type i8
-GLshort    :: #type i16
-GLint      :: #type i32
-GLsizei    :: #type i32
-GLintptr   :: #type i64
-GLsizeiptr :: #type i64
-GLubyte    :: #type u8
-GLushort   :: #type u16
-GLuint     :: #type u32
-GLfloat    :: #type f32
-GLclampf   :: #type f32
-
-GLProgram :: #type i32
-GLShader  :: #type i32
-GLFramebuffer :: #type i32
-GLRenderbuffer :: #type i32
-GLTexture :: #type i32
-GLBuffer :: #type i32
-GLUniformLocation :: #type i32
-GLVertexArrayObject :: #type i32
-
-GLActiveInfo :: struct {
-    size     : GLint;
-    type     : GLenum;
-
-    // Not used
-    name     : ^u8;
-}
-
-GLMat2 :: #type [4] GLfloat
-GLMat3 :: #type [9] GLfloat
-GLMat4 :: #type [16] GLfloat
-
-activeTexture                  :: (texture: GLenum) -> void #foreign "gl" "activeTexture" ---
-attachShader                   :: (program: GLProgram, shader: GLShader) -> GLProgram #foreign "gl" "attachShader" ---
-bindAttribLocation             :: (program: GLProgram, index: GLuint, name: str) -> void #foreign "gl" "bindAttribLocation" ---
-bindBuffer                     :: (target: GLenum, buffer: GLBuffer) -> void #foreign "gl" "bindBuffer" ---
-bindFramebuffer                :: (target: GLenum, framebuffer: GLFramebuffer) -> void #foreign "gl" "bindFramebuffer" ---
-bindRenderbuffer               :: (target: GLenum, renderbuffer: GLRenderbuffer) -> void #foreign "gl" "bindRenderbuffer" ---
-bindTexture                    :: (target: GLenum, texture: GLTexture) -> void #foreign "gl" "bindTexture" ---
-bindVertexArray                :: (vertexArray: GLVertexArrayObject) -> void #foreign "gl" "bindVertexArray" ---
-blendColor                     :: (red: GLclampf, green: GLclampf, blue: GLclampf, alpha: GLclampf) -> void #foreign "gl" "blendColor" ---
-blendEquation                  :: (mode: GLenum) -> void #foreign "gl" "blendEquation" ---
-blendEquationSeparate          :: (modeRGB: GLenum, modeAlpha: GLenum) -> void #foreign "gl" "blendEquationSeparate" ---
-blendFunc                      :: (sfactor: GLenum, dfactor: GLenum) -> void #foreign "gl" "blendFunc" ---
-blendFuncSeparate              :: (srcRGB: GLenum, dstRGB: GLenum, srcAlpha: GLenum, dstAlpha: GLenum) -> void #foreign "gl" "blendFuncSeparate" ---
-blitFramebuffer                :: (sx0: GLint, sy0: GLint, sx1: GLint, sy1: GLint, dx0: GLint, dy0: GLint, dx1: GLint, dy1: GLint, mask: GLbitfield, filter: GLenum) -> void #foreign "gl" "blitFramebuffer" ---
-bufferDataWithData             :: (target: GLenum, buffer: [] void, usage: GLenum) -> void #foreign "gl" "bufferDataWithData" ---
-bufferDataNoData               :: (target: GLenum, size: GLsizei, usage: GLenum) -> void #foreign "gl" "bufferDataNoData" ---
-bufferData                     :: proc { bufferDataWithData, bufferDataNoData }
-bufferSubData                  :: (target: GLenum, offset: GLsizei, data: [] void) -> void #foreign "gl" "bufferSubData" ---
-canvasSize                     :: (width: GLsizei, height: GLsizei) -> void #foreign "gl" "canvasSize" ---
-checkFrameBufferStatus         :: (target: GLenum) -> GLenum #foreign "gl" "checkFrameBufferStatus" ---
-clear                          :: (mask: GLbitfield) -> void #foreign "gl" "clear" ---
-clearColor                     :: (red: GLclampf, green: GLclampf, blue: GLclampf, alpha: GLclampf) -> void #foreign "gl" "clearColor" ---
-clearDepth                     :: (depth: GLclampf) -> void #foreign "gl" "clearDepth" ---
-clearStencil                   :: (s: GLint) -> void #foreign "gl" "clearStencil" ---
-colorMask                      :: (red: GLboolean, green: GLboolean, blue: GLboolean, alpha: GLboolean) -> void #foreign "gl" "colorMask" ---
-compileShader                  :: (shader: GLShader) -> void #foreign "gl" "compileShader" ---
-compressedTexImage2D           :: (target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, data: str) -> void #foreign "gl" "compressedTexImage2D" ---
-compressedTexSubImage2D        :: (target: GLenum, level: GLint, internalformat: GLenum, xoff: GLint, yoff: GLint, width: GLsizei, height: GLsizei, format: GLenum, data: str) -> void #foreign "gl" "compressedTexSubImage2D" ---
-copyBufferSubData              :: (readTarget: GLenum, writeTarget: GLenum, readOffset: GLintptr, writeOffset: GLintptr, size: GLsizeiptr) -> void #foreign "gl" "copyBufferSubData" ---
-copyTexImage2D                 :: (target: GLenum, level: GLint, internalformat: GLenum, x: GLint, y: GLint, width: GLsizei, height: GLsizei, border: GLint) -> void #foreign "gl" "copyTexImage2D" ---
-copyTexSubImage2D              :: (target: GLenum, level: GLint, xoff: GLint, yoff: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei) -> void #foreign "gl" "copyTexSubImage2D" ---
-createBuffer                   :: () -> GLBuffer #foreign "gl" "createBuffer" ---
-createFramebuffer              :: () -> GLFramebuffer #foreign "gl" "createFramebuffer" ---
-createProgram                  :: () -> GLProgram #foreign "gl" "createProgram" ---
-createRenderbuffer             :: () -> GLRenderbuffer #foreign "gl" "createRenderbuffer" ---
-createShader                   :: (type: GLenum) -> GLShader #foreign "gl" "createShader" ---
-createTexture                  :: () -> GLTexture #foreign "gl" "createTexture" ---
-createVertexArray              :: () -> GLVertexArrayObject #foreign "gl" "createVertexArray" ---
-cullFace                       :: (mode: GLenum) -> void #foreign "gl" "cullFace" ---
-deleteBuffer                   :: (buffer: GLBuffer) -> void #foreign "gl" "deleteBuffer" ---
-deleteFramebuffer              :: (framebuffer: GLFramebuffer) -> void #foreign "gl" "deleteFramebuffer" ---
-deleteProgram                  :: (program: GLProgram) -> void #foreign "gl" "deleteProgram" ---
-deleteRenderbuffer             :: (renderbuffer: GLRenderbuffer) -> void #foreign "gl" "deleteRenderbuffer" ---
-deleteShader                   :: (shader: GLShader) -> void #foreign "gl" "deleteShader" ---
-deleteTexture                  :: (texture: GLTexture) -> void #foreign "gl" "deleteTexture" ---
-deleteVertexArray              :: (vertexArray: GLVertexArrayObject) -> void #foreign "gl" "deleteVertexArray" ---
-depthFunc                      :: (func: GLenum) -> void #foreign "gl" "depthFunc" ---
-depthMask                      :: (flag: GLboolean) -> void #foreign "gl" "depthMask" ---
-depthRange                     :: (zNear: GLclampf, zFar: GLclampf) -> void #foreign "gl" "depthRange" ---
-detachShader                   :: (program: GLProgram, shader: GLShader) -> void #foreign "gl" "detachShader" ---
-disable                        :: (cap: GLenum) -> void #foreign "gl" "disable" ---
-disableVertexAttribArray       :: (index: GLuint) -> void #foreign "gl" "disableVertexAttribArray" ---
-drawArrays                     :: (mode: GLenum, first: GLint, count: GLsizei) -> void #foreign "gl" "drawArrays" ---
-drawArraysInstanced            :: (mode: GLenum, first: GLint, count: GLsizei, instanceCount: GLsizei) -> void #foreign "gl" "drawArraysInstanced" ---
-drawElements                   :: (mode: GLenum, count: GLsizei, type: GLenum, offset: GLint) -> void #foreign "gl" "drawElements" ---
-drawElementsInstanced          :: (mode: GLenum, count: GLsizei, type: GLenum, offset: GLint, instanceCount: GLsizei) -> void #foreign "gl" "drawElementsInstanced" ---
-enable                         :: (cap: GLenum) -> void #foreign "gl" "enable" ---
-enableVertexAttribArray        :: (index: GLuint) -> void #foreign "gl" "enableVertexAttribArray" ---
-finish                         :: () -> void #foreign "gl" "finish" ---
-flush                          :: () -> void #foreign "gl" "flush" ---
-framebufferRenderbuffer        :: (target: GLenum, attachment: GLenum, renderbuffertarget: GLenum, renderbuffer: GLRenderbuffer) -> void #foreign "gl" "framebufferRenderbuffer" ---
-framebufferTexture2D           :: (target: GLenum, attachment: GLenum, textarget: GLenum, texture: GLTexture, level: GLint) -> void #foreign "gl" "framebufferTexture2D" ---
-framebufferTextureLayer        :: (target: GLenum, attachment: GLenum, texture: GLTexture, level: GLint, layer: GLint) -> void #foreign "gl" "framebufferTextureLayer" ---
-frontFace                      :: (mode: GLenum) -> void #foreign "gl" "frontFace" ---
-generateMipmap                 :: (target: GLenum) -> void #foreign "gl" "generateMipmap" ---
-getActiveAttrib                :: (program: GLProgram, index: GLuint, out: ^GLActiveInfo) -> void #foreign "gl" "getActiveAttrib" ---
-getActiveUniform               :: (program: GLProgram, index: GLuint, out: ^GLActiveInfo) -> void #foreign "gl" "getActiveUniform" ---
-// getAttachedShaders does not work yet because we can't return a list of things
-getAttribLocation              :: (program: GLProgram, name: str) -> GLint #foreign "gl" "getAttribLocation" ---
-getBufferSubData               :: (target: GLenum, srcByteOffset: GLintptr, dstBuffer: str, dstOffset: GLuint, length: GLuint) -> void #foreign "gl" "getBufferSubData" ---
-// getBufferParameter and getParameter do not work
-getError                       :: () -> GLenum #foreign "gl" "getError" ---
-getInternalformatParameter     :: (target: GLenum, internalFormat: GLenum, pname: GLenum) -> GLenum #foreign "gl" "getInternalformatParameter" ---
-// many of the 'gets' don't work yet because they return very javascripty things
-getProgramParameter            :: (program: GLProgram, pname: GLenum) -> GLenum #foreign "gl" "getProgramParameter" ---
-getShaderParameter             :: (shader: GLShader, pname: GLenum) -> GLenum #foreign "gl" "getShaderParameter" ---
-getUniformLocation             :: (program: GLProgram, name: str) -> GLUniformLocation #foreign "gl" "getUniformLocation" ---
-getVertexAttribOffset          :: (index: GLuint, pname: GLenum) -> void #foreign "gl" "getVertexAttribOffset" ---
-hint                           :: (target: GLenum, mode: GLenum) -> void #foreign "gl" "hint" ---
-init                           :: (canvasname: str) -> GLboolean #foreign "gl" "init" ---
-invalidateFramebuffer          :: (target: GLenum, attachments: str) -> void #foreign "gl" "invalidateFramebuffer" ---
-invalidateSubFramebuffer       :: (target: GLenum, attachments: str, x: GLint, y: GLint, width: GLsizei, height: GLsizei) -> void #foreign "gl" "invalidateSubFramebuffer" ---
-isEnabled                      :: (cap: GLenum) -> GLboolean #foreign "gl" "isEnabled" ---
-lineWidth                      :: (width: GLfloat) -> void #foreign "gl" "lineWidth" ---
-linkProgram                    :: (program: GLProgram) -> void #foreign "gl" "linkProgram" ---
-pixelStorei                    :: (pname: GLenum, param: GLenum) -> void #foreign "gl" "pixelStorei" ---
-polygonOffset                  :: (factor: GLfloat, units: GLfloat) -> void #foreign "gl" "polygonOffset" ---
-printProgramInfoLog            :: (program: GLProgram) -> void #foreign "gl" "printProgramInfoLog" ---
-printShaderInfoLog             :: (shader: GLShader) -> void #foreign "gl" "printShaderInfoLog" ---
-readBuffer                     :: (src: GLenum) -> void #foreign "gl" "readBuffer" ---
-readPixels                     :: (x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: str) -> void #foreign "gl" "readPixels" ---
-renderbufferStorageMultisample :: (target: GLenum, samples: GLsizei, internalforamt: GLenum, width: GLsizei, height: GLsizei) -> void #foreign "gl" "renderbufferStorageMultisample" ---
-sampleCoverage                 :: (value: GLclampf, invert: GLboolean) -> void #foreign "gl" "sampleCoverage" ---
-scissor                        :: (x: GLint, y: GLint, width: GLsizei, height: GLsizei) -> void #foreign "gl" "scissor" ---
-setSize                        :: (width: GLint, y: GLint) -> void #foreign "gl" "setSize" ---
-shaderSource                   :: (shader: GLShader, source: str) -> void #foreign "gl" "shaderSource" ---
-stencilFunc                    :: (func: GLenum, ref: GLint, mask: GLuint) -> void #foreign "gl" "stencilFunc" ---
-stencilFuncSeparate            :: (face: GLenum, func: GLenum, ref: GLint, mask: GLuint) -> void #foreign "gl" "stencilFuncSeparate" ---
-stencilMask                    :: (mask: GLuint) -> void #foreign "gl" "stencilMask" ---
-stencilMaskSeparate            :: (face: GLenum, mask: GLenum) -> void #foreign "gl" "stencilMaskSeparate" ---
-stencilOp                      :: (fail: GLenum, zfail: GLenum, zpass: GLenum) -> void #foreign "gl" "stencilOp" ---
-stencilOpSeparate              :: (face: GLenum, fail: GLenum, zfail: GLenum, zpass: GLenum) -> void #foreign "gl" "stencilOpSeparate" ---
-texImage2D                     :: (target: GLenum, level: GLint, internalFormat: GLenum, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, pixels: str) -> void #foreign "gl" "texImage2D" ---
-texParameterf                  :: (target: GLenum, pname: GLenum, param: GLfloat) -> void #foreign "gl" "texParameterf" ---
-texParameteri                  :: (target: GLenum, pname: GLenum, param: GLint) -> void #foreign "gl" "texParameteri" ---
-texSubImage2D                  :: (target: GLenum, level: GLint, xoff: GLint, yoff: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: str) -> void #foreign "gl" "texSubImage2D" ---
-uniform1f                      :: (loc: GLUniformLocation, x: GLfloat) -> void #foreign "gl" "uniform1f" ---
-uniform1i                      :: (loc: GLUniformLocation, x: GLint) -> void #foreign "gl" "uniform1i" ---
-uniform2f                      :: (loc: GLUniformLocation, x: GLfloat, y: GLfloat) -> void #foreign "gl" "uniform2f" ---
-uniform2i                      :: (loc: GLUniformLocation, x: GLint, y: GLint) -> void #foreign "gl" "uniform2i" ---
-uniform3f                      :: (loc: GLUniformLocation, x: GLfloat, y: GLfloat, z: GLfloat) -> void #foreign "gl" "uniform3f" ---
-uniform3i                      :: (loc: GLUniformLocation, x: GLint, y: GLint, z: GLint) -> void #foreign "gl" "uniform3i" ---
-uniform4f                      :: (loc: GLUniformLocation, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) -> void #foreign "gl" "uniform4f" ---
-uniform4i                      :: (loc: GLUniformLocation, x: GLint, y: GLint, z: GLint, w: GLint) -> void #foreign "gl" "uniform4i" ---
-uniformMatrix2                 :: (loc: GLUniformLocation, transpose: GLboolean, value: GLMat2) -> void #foreign "gl" "uniformMatrix2" ---
-uniformMatrix3                 :: (loc: GLUniformLocation, transpose: GLboolean, value: GLMat3) -> void #foreign "gl" "uniformMatrix3" ---
-uniformMatrix4                 :: (loc: GLUniformLocation, transpose: GLboolean, value: GLMat4) -> void #foreign "gl" "uniformMatrix4" ---
-useProgram                     :: (program: GLProgram) -> void #foreign "gl" "useProgram" ---
-validateProgram                :: (program: GLProgram) -> void #foreign "gl" "validateProgram" ---
-vertexAttrib1f                 :: (idx: GLuint, x: GLfloat) -> void #foreign "gl" "vertexAttrib1f" ---
-vertexAttrib2f                 :: (idx: GLuint, x: GLfloat, y: GLfloat) -> void #foreign "gl" "vertexAttrib2f" ---
-vertexAttrib3f                 :: (idx: GLuint, x: GLfloat, y: GLfloat, z: GLfloat) -> void #foreign "gl" "vertexAttrib3f" ---
-vertexAttrib4f                 :: (idx: GLuint, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) -> void #foreign "gl" "vertexAttrib4f" ---
-vertexAttribPointer            :: (idx: GLuint, size: GLint, type: GLenum, normalized: GLboolean, stride: GLsizei, offset: GLint) -> void #foreign "gl" "vertexAttribPointer" ---
-vertexAttribDivisor            :: (idx: GLuint, divisor: GLuint) -> void #foreign "gl" "vertexAttribDivisor" ---
-viewport                       :: (x: GLint, y: GLint, width: GLsizei, height: GLsizei) -> void #foreign "gl" "viewport" ---      
diff --git a/modules/js_events/js_events.js b/modules/js_events/js_events.js
new file mode 100644 (file)
index 0000000..df3bb83
--- /dev/null
@@ -0,0 +1,67 @@
+window.ONYX_MODULES = window.ONYX_MODULES || [];
+
+function push_event_to_buffer(esp, event_size, event_kind, data) {
+    let WASM_U32 = new Uint32Array(ONYX_MEMORY.buffer);
+
+    if (WASM_U32[esp] >= WASM_U32[esp + 1]) {
+        console.log("Event buffer full!");
+        return;
+    }
+
+    WASM_U32[esp] += 1;
+
+    let event_idx = esp + (WASM_U32[esp] - 1) * (event_size / 4) + 2;
+    WASM_U32[event_idx] = event_kind;
+    WASM_U32[event_idx + 1] = Date.now();
+
+    for (let i = 0; i < data.length; i++) {
+        WASM_U32[event_idx + 2 + i] = data[i];
+    }
+}
+
+window.ONYX_MODULES.push({
+    module_name: "js_events",
+
+    setup: function(esp, event_size) {
+        // Indicies into a Uint32Array are not based on bytes,
+        // but on the index.
+        esp /= 4;
+
+        document.addEventListener("keydown", function (ev) {
+            if (ev.isComposing || ev.keyCode === 229) return;
+            push_event_to_buffer(esp, event_size, 0x04, [ ev.keyCode ]);
+        });
+
+        document.addEventListener("keyup", function (ev) {
+            if (ev.isComposing || ev.keyCode === 229) return;
+            push_event_to_buffer(esp, event_size, 0x05, [ ev.keyCode ]);
+        });
+
+        document.addEventListener("mousedown", function (ev) {
+            push_event_to_buffer(esp, event_size, 0x01, [ ev.clientX, ev.clientY, ev.button ]);
+        });
+
+        document.addEventListener("mouseup", function (ev) {
+            push_event_to_buffer(esp, event_size, 0x02, [ ev.clientX, ev.clientY, ev.button ]);
+        });
+
+        document.addEventListener("mousemove", function (ev) {
+            push_event_to_buffer(esp, event_size, 0x03, [ ev.clientX, ev.clientY, -1 ]);
+        });
+
+        document.addEventListener("wheel", function (ev) {
+            push_event_to_buffer(esp, event_size, 0x07, [ ev.clientX, ev.clientY, ev.deltaY >= 0 ? 0x04 : 0x03 ]);
+        });
+
+        window.addEventListener("resize", function (ev) {
+            push_event_to_buffer(esp, event_size, 0x06, [ window.innerWidth, window.innerHeight ]);
+        });
+
+        push_event_to_buffer(esp, event_size, 0x06, [ window.innerWidth, window.innerHeight ]);
+
+        document.oncontextmenu = (e) => {
+            e.preventDefault = true;
+            return false;
+        };
+    },
+});
diff --git a/modules/js_events/js_events.onyx b/modules/js_events/js_events.onyx
new file mode 100644 (file)
index 0000000..f7fbee9
--- /dev/null
@@ -0,0 +1,109 @@
+// This is a simple buffered system to receive events from the webbrowser
+// in a buffer that you can poll and consume all of the events. It is not
+// direclty used by the immediate mode graphics, but it makes standing up
+// a simple application much easier.
+
+package js_events
+
+#private_file Num_Buffered_Events :: 16
+
+// NOTE: These need to match exactly what is in the corresponding javascript
+DomEventKind :: enum {
+    None       :: 0x00;
+
+    MouseDown  :: 0x01;
+    MouseUp    :: 0x02;
+    MouseMove  :: 0x03;
+    MouseWheel :: 0x07;
+
+    KeyDown    :: 0x04;
+    KeyUp      :: 0x05;
+
+    Resize     :: 0x06;
+}
+
+DomEvent :: struct {
+    kind : DomEventKind;
+    timestamp : u32;
+}
+
+KeyboardEvent :: struct {
+    use event : DomEvent;
+
+    keycode : u32;
+}
+
+MouseButton :: enum {
+    Left :: 0x00;
+    Middle :: 0x01;
+    Right :: 0x02;
+
+    WheelUp :: 0x03;
+    WheelDown :: 0x04;
+}
+
+MouseEvent :: struct {
+    use event : DomEvent;
+
+    pos_x  : u32;
+    pos_y  : u32;
+    button : MouseButton;
+}
+
+ResizeEvent :: struct {
+    use event : DomEvent;
+
+    width  : u32;
+    height : u32;
+}
+
+Event :: struct #union {
+    use dom : DomEvent;
+
+    keyboard : KeyboardEvent;
+    mouse    : MouseEvent;
+    resize   : ResizeEvent;
+}
+
+clear_event :: (ev: ^Event) {
+    ev.kind = DomEventKind.None;
+    ev.timestamp = 0;
+}
+
+init :: () {
+    event_storage.event_count = 0;
+    event_storage.max_events = Num_Buffered_Events;
+
+    for ^ev: event_storage.event_buffer do clear_event(ev);
+
+    event_setup(^event_storage, sizeof Event);
+}
+
+consume :: () -> Iterator(Event) {
+    next :: (_: rawptr) -> (Event, bool) {
+        use package core.intrinsics.onyx { __zero_value }
+        if event_storage.event_count == 0 do return __zero_value(Event), false;
+
+        event := event_storage.event_buffer[0];
+
+        for i: 0 .. Num_Buffered_Events - 2 {
+            event_storage.event_buffer[i] = event_storage.event_buffer[i + 1];
+        }
+        event_storage.event_count -= 1;
+        
+        return event, true;
+    }
+
+    return .{ null, next };
+}
+
+/* Private members */
+
+#private_file EventStorage :: struct {
+    event_count  : u32;
+    max_events   : u32;
+    event_buffer : [Num_Buffered_Events] Event;
+}
+
+#private_file event_storage : EventStorage;
+#private_file event_setup :: (event_storage: ^EventStorage, event_size: u32) -> void #foreign "js_events" "setup" ---
diff --git a/modules/js_events/module.onyx b/modules/js_events/module.onyx
new file mode 100644 (file)
index 0000000..23215cf
--- /dev/null
@@ -0,0 +1,2 @@
+
+#load "modules/js_events/js_events"
diff --git a/modules/webgl2/module.onyx b/modules/webgl2/module.onyx
new file mode 100644 (file)
index 0000000..77b04ea
--- /dev/null
@@ -0,0 +1,2 @@
+
+#load "modules/webgl2/webgl2"
diff --git a/modules/webgl2/webgl2.js b/modules/webgl2/webgl2.js
new file mode 100644 (file)
index 0000000..61d565a
--- /dev/null
@@ -0,0 +1,291 @@
+window.ONYX_MODULES = window.ONYX_MODULES || [];
+
+var programs = [];
+var shaders = [];
+var buffers = [];
+var framebuffers = [];
+var renderbuffers = [];
+var textures = [];
+var uniformlocs = [];
+var vertexArrays = [];
+var canvas = null;
+var gl = null;
+
+window.ONYX_MODULES.push({
+    module_name: "gl",
+
+    init(name, namelen) {
+        const decoder = new TextDecoder();
+        const str = new Uint8Array(window.ONYX_MEMORY.buffer, name, namelen);
+        const canvasname = decoder.decode(str);
+
+        canvas = document.getElementById(canvasname);
+        if (canvas == null) return 0;
+
+        gl = canvas.getContext("webgl2");
+        if (gl == null) return 0;
+
+        return 1;
+    },
+
+    activeTexture(texture) { gl.activeTexture(texture); },
+    attachShader(program, shader) { gl.attachShader(programs[program], shaders[shader]); return programs[program]; },
+    bindAttribLocation(program, index, name, namelen) { console.log("NOT IMPLEMENTED!"); },
+    bindBuffer(target, buffer) {
+        if (buffer == -1) {
+            gl.bindBuffer(target, null);
+        } else {
+            gl.bindBuffer(target, buffers[buffer]);
+        }
+    },
+    bindFramebuffer(target, framebuffer) { gl.bindFramebuffer(target, framebuffers[framebuffer]); },
+    bindRenderbuffer(target, renderbuffer) { gl.bindRenderbuffer(target, renderbuffers[renderbuffer]); },
+    bindTexture(target, texture) { gl.bindTexture(target, textures[texture]); },
+    bindVertexArray(vertexArray) { gl.bindVertexArray(vertexArrays[vertexArray]); },
+
+    blendColor(red, green, blue, alpha) { gl.blendColor(red, green, blue, alpha); },
+    blendEquation(mode) { gl.blendEquation(mode); },
+    blendEquationSeparate(modeRGB, modeAlpha) { gl.blendEquationSeparate(modeRGB, modeAlpha); },
+    blendFunc(sfactor, dfactor) { gl.blendFunc(sfactor, dfactor); },
+    blendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha) { gl.blendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha); },
+
+    blitFramebuffer(sx0, sy0, sx1, sy1, dx0, dy0, dx1, dy1, mask, filter) {
+        gl.blitFramebuffer(sx0, sy0, sx1, sy1, dx0, dy0, dx1, dy1, mask, filter);
+    },
+
+    bufferDataWithData(target, bufferdata, bufferlen, usage) {
+        const data = new DataView(window.ONYX_MEMORY.buffer, bufferdata, bufferlen);
+        gl.bufferData(target, data, usage);
+    },
+
+    bufferDataNoData(target, size, usage) { gl.bufferData(target, size, usage); },
+    bufferSubData(target, offset, bufferdata, bufferlen) {
+        const data = new DataView(window.ONYX_MEMORY.buffer, bufferdata, bufferlen);
+        gl.bufferSubData(target, offset, data);
+    },
+    canvasSize(width, height) {
+        canvas.width = width;
+        canvas.height = height;
+    },
+    checkFrameBufferStatus(target) { return gl.checkFrameBufferStatus(target); },
+    clear(bit) { gl.clear(bit); },
+    clearColor(r, g, b, a) { gl.clearColor(r, g, b, a); },
+    clearDepth(depth) { gl.clearDepth(depth); },
+    clearStencil(stencil) { gl.clearStencil(stencil); },
+    colorMask(r, g, b, a) { gl.colorMask(r, g, b, a); },
+    compileShader(shader) { gl.compileShader(shaders[shader]); },
+    compressedTexImage2D(target, level, internalformat, width, height, border, data, datalen) {
+        const pixels = new DataView(window.ONYX_MEMORY.buffer, data, datalen);
+        gl.compressedTexImage2D(target, level, internalformat, width, height, border, pixels);
+    },
+    compressedTexSubImage2D(target, level, internalformat, xoff, yoff, width, height, format, data, datalen) {
+        const pixels = new DataView(window.ONYX_MEMORY.buffer, data, datalen);
+        gl.compressedSubTexImage2D(target, level, internalformat, xoff, yoff, width, height, format, pixels);
+    },
+    copyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size) { gl.copyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size); },
+    copyTexImage2D(target, level, internalforamt, x, y, width, height, border) {
+        gl.copyTexImage2D(target, level, internalforamt, x, y, width, height, border);
+    },
+    copyTexSubImage2D(target, level, xoff, yoff, x, y, width, height) {
+        gl.copyTexSubImage2D(target, level, xoff, yoff, x, y, width, height);
+    },
+    createBuffer() {
+        const buf = gl.createBuffer();
+        if (buf == null) return -1;
+
+        buffers.push(buf);
+        return buffers.length - 1;
+    },
+    createFramebuffer() {
+        const buf = gl.createFramebuffer();
+        if (buf == null) return -1;
+
+        framebuffers.push(buf);
+        return framebuffers.length - 1;
+    },
+    createProgram() {
+        const prog = gl.createProgram();
+        if (prog == null) return -1;
+
+        programs.push(prog);
+        return programs.length - 1;
+    },
+    createRenderbuffer() {
+        const buf = gl.createRenderbuffer();
+        if (buf == null) return -1;
+
+        renderbuffers.push(buf);
+        return renderbuffers.length - 1;
+    },
+    createShader(type) {
+        const shader = gl.createShader(type);
+        if (shader == null) return -1;
+
+        shaders.push(shader);
+        return shaders.length - 1;
+    },
+    createTexture() {
+        const texture = gl.createTexture();
+        if (texture == null) return -1;
+
+        textures.push(texture);
+        return textures.length - 1;
+    },
+    createVertexArray() {
+        const vao = gl.createVertexArray();
+        if (vao == null) return -1;
+
+        vertexArrays.push(vao);
+        return vertexArrays.length - 1;
+    },
+    cullFace(mode) { gl.cullFace(mode); },
+    deleteBuffer(buffer) { gl.deleteBuffer(buffers[buffer]); },
+    deleteFramebuffer(framebuffer) { gl.deleteFramebuffer(framebuffers[framebuffer]); },
+    deleteProgram(program) { gl.deleteProgram(programs[program]); },
+    deleteRenderbuffer(renderbuffer) { gl.deleteRenderbuffer(renderbuffers[renderbuffer]); },
+    deleteShader(shader) { gl.deleteShader(shaders[shader]); },
+    deleteTexture(texture) { gl.deleteTexture(textures[texture]); },
+    deleteVertexArray(vertexArray) { gl.deleteVertexArray(vertexArrays[vertexArray]); },
+    depthFunc(func) { gl.depthFunc(func); },
+    depthMask(flag) { gl.depthMask(flag); },
+    depthRange(znear, zfar) { gl.depthRange(znear, zfar); },
+    detachShader(program, shader) { gl.detachShader(programs[program], shaders[shader]); },
+    disable(cap) { gl.disable(cap); },
+    disableVertexAttribArray(index) { gl.disableVertexAttribArray(index); },
+    drawArrays(mode, first, count) { gl.drawArrays(mode, first, count); },
+    drawArraysInstanced(mode, first, count, instanceCount) { gl.drawArraysInstanced(mode, first, count, instanceCount); },
+    drawElements(mode, count, type, offset) { gl.drawElements(mode, count, type, offset); },
+    drawElementsInstanced(mode, count, type, offset, instanceCount) { gl.drawElementsInstanced(mode, count, type, offset, instanceCount); },
+    enable(cap) { gl.enable(cap); },
+    enableVertexAttribArray(index) { gl.enableVertexAttribArray(index); },
+    finish() { gl.finish(); },
+    flush() { gl.flush(); },
+    framebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer) {
+        gl.framebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffers[renderbuffer]);
+    },
+    framebufferTexture2D(target, attachment, texttarget, texture, level) {
+        gl.framebufferTexture2D(target, attachment, texttarget, textures[texture], level);
+    },
+    framebufferTextureLayer(target, attachment, texture, level, layer) { gl.framebufferTextureLayer(target, attachment, textures[texture], level, layer); },
+    frontFace(mode) { gl.frontFace(mode); },
+    generateMipmap(target) { gl.generateMipmap(target); },
+    getActiveAttrib(program, index, out) {
+        const loc = gl.getActiveAttrib(programs[program], index);
+        const data = new Int32Array(window.ONYX_MEMORY.buffer, out, 2);
+        data[0] = loc.size;
+        data[1] = loc.type;
+    },
+    getActiveUniform(program, index, out) {
+        const loc = gl.getActiveUniform(programs[program], index);
+        const data = new Int32Array(window.ONYX_MEMORY.buffer, out, 2);
+        data[0] = loc.size;
+        data[1] = loc.type;
+    },
+    // getAttachedShaders() { console.log("NOT IMPLEMENTED!"); },
+    getAttribLocation(program, name, namelen) {
+        const decoder = new TextDecoder();
+        const str = new Uint8Array(window.ONYX_MEMORY.buffer, name, namelen);
+        const attribname = decoder.decode(str);
+
+        return gl.getAttribLocation(programs[program], attribname);
+    },
+    // getBufferParameter() { console.log("NOT IMPLEMENTED!"); },
+    getBufferSubData(target, srcbyteoffset, dstbufferdata, dstbufferlen, dstoffset, length) {
+        const dst = new DataView(window.ONYX_MEMORY.buffer, dstbufferdata, dstbufferlen);
+        gl.getBufferSubData(target, srcbyteoffset, dst, dstoffset, length);
+    },
+    getError() { return gl.getError(); },
+    getInternalformatParameter(target, internalformat, pname) { return gl.getInternalformatParameter(target, internalformat, pname); },
+    // many of the 'gets() { console.log("NOT IMPLEMENTED!"); },
+    getShaderParameter(shader, param) { return gl.getShaderParameter(shaders[shader], param); },
+    getProgramParameter(program, param) { return gl.getProgramParameter(programs[program], param); },
+    getUniformLocation(program, name, namelen) {
+        const decoder = new TextDecoder();
+        const str = new Int8Array(window.ONYX_MEMORY.buffer, name, namelen);
+        const uniname = decoder.decode(str);
+
+        uniformlocs.push(gl.getUniformLocation(programs[program], uniname));
+        return uniformlocs.length - 1;
+    },
+    getVertexAttribOffset(index, pname) { return gl.getVertexAttribOffset(index, pname); },
+    hint(target, mode) { gl.hint(target, mode); },
+    isEnabled(cap) { return gl.isEnabled(cap); },
+    invalidateFramebuffer(target, attachdata, attachlen) {
+        const attachments = new Int32Array(window.ONYX_MEMORY.buffer, attachdata, attachlen);
+        gl.invalidateFramebuffer(target, attacements);
+    },
+    invalidateSubFramebuffer(target, attachdata, attachlen, x, y, width, height) {
+        const attachments = new Int32Array(window.ONYX_MEMORY.buffer, attachdata, attachlen);
+        gl.invalidateFramebuffer(target, attacements, x, y, width, height);
+    },
+    lineWidth(width) { gl.lineWidth(width); },
+    linkProgram(program) { gl.linkProgram(programs[program]); },
+    pixelStorei(pname, param) { gl.pixelStorei(pname, param); },
+    polygonOffset(factor, units) { gl.polygonOffset(factor, units); },
+    printProgramInfoLog(program) { console.log(gl.getProgramInfoLog(programs[program])); },
+    printShaderInfoLog(shader) { console.log(gl.getShaderInfoLog(shaders[shader])); },
+    readPixels(x, y, width, height, format, type, pixels, pixelslen) {
+        const pixeldata = new Uint8Array(window.ONYX_MEMORY.buffer, pixels, pixelslen);
+        gl.readPixels(x, y, width, height, format, type, pixeldata);
+    },
+    readBuffer(src) { gl.readBuffer(src); },
+    renderbufferStorageMultisample(target, samples, internalforamt, width, height) {
+        gl.renderbufferStorageMultisample(target, samples, internalforamt, width, height);
+    },
+    sampleCoverage(value, invert) { gl.sampleCoverage(value, invert); },
+    scissor(x, y, width, height) { gl.scissor(x, y, width, height); },
+    setSize(width, height) { canvas.width = width; canvas.height = height; },
+    shaderSource(shader, source, sourcelen) {
+        const decoder = new TextDecoder();
+        const str = new Int8Array(window.ONYX_MEMORY.buffer, source, sourcelen);
+        const sourcedata = decoder.decode(str);
+
+        gl.shaderSource(shaders[shader], sourcedata);
+    },
+    stencilFunc(func, ref, mask) { gl.stencilFunc(func, ref, mask); },
+    stencilFuncSeparate(face, func, ref, mask) { gl.stencilFuncSeparate(face, func, ref, mask); },
+    stencilMask(mask) { gl.stencilMask(mask); },
+    stencilMaskSeparate(face, mask) { gl.stencilMaskSeparate(face, mask); },
+    stencilOp(fail, zfail, mask) { gl.stencilOp(fail, zfail, mask); },
+    stencilOpSeparate(face, fail, zfail, zpass) { gl.stencilOpSeparate(face, fail, zfail, zpass); },
+    texImage2D(target, level, internalforamt, width, height, border, format, type, pixels, pixelslen) {
+        const data = new DataView(window.ONYX_MEMORY.buffer, pixels, pixelslen);
+        gl.texImage2D(target, level, internalforamt, width, height, border, format, type, data);
+    },
+    texParameterf(target, pname, param) { gl.texParameterf(target, pname, param); },
+    texParameteri(target, pname, param) { gl.texParameteri(target, pname, param); },
+    texSubImage2D(target, level, xoff, yoff, width, height, format, type, pixels, pixelslen) {
+        const data = new Uint8Array(window.ONYX_MEMORY.buffer, pixels, pixelslen);
+        gl.texSubImage2D(target, level, xoff, yoff, width, height, format, type, data);
+    },
+    uniform1f(loc, x) { gl.uniform1f(uniformlocs[loc], x); },
+    uniform1i(loc, x) { gl.uniform1i(uniformlocs[loc], x); },
+    uniform2f(loc, x, y) { gl.uniform2f(uniformlocs[loc], x, y); },
+    uniform2i(loc, x, y) { gl.uniform2i(uniformlocs[loc], x, y); },
+    uniform3f(loc, x, y, z) { gl.uniform3f(uniformlocs[loc], x, y, z); },
+    uniform3i(loc, x, y, z) { gl.uniform3i(uniformlocs[loc], x, y, z); },
+    uniform4f(loc, x, y, z, w) { gl.uniform4f(uniformlocs[loc], x, y, z, w); },
+    uniform4i(loc, x, y, z, w) { gl.uniform4i(uniformlocs[loc], x, y, z, w); },
+    uniformMatrix2(loc, transpose, valueptr) {
+        const data = new Float32Array(window.ONYX_MEMORY.buffer, valueptr, 4);
+        gl.uniformMatrix2fv(uniformlocs[loc], transpose, data);
+    },
+    uniformMatrix3(loc, transpose, valueptr) {
+        const data = new Float32Array(window.ONYX_MEMORY.buffer, valueptr, 9);
+        gl.uniformMatrix3fv(uniformlocs[loc], transpose, data);
+    },
+    uniformMatrix4(loc, transpose, valueptr) {
+        const data = new Float32Array(window.ONYX_MEMORY.buffer, valueptr, 16);
+        gl.uniformMatrix4fv(uniformlocs[loc], transpose, data);
+    },
+    useProgram(program) { gl.useProgram(programs[program]); },
+    validateProgram(program) { gl.validateProgram(program[program]); },
+    vertexAttrib1f(idx, x) { gl.vertexAttrib1f(idx, x); },
+    vertexAttrib2f(idx, x, y) { gl.vertexAttrib2f(idx, x, y); },
+    vertexAttrib3f(idx, x, y, z) { gl.vertexAttrib3f(idx, x, y, z); },
+    vertexAttrib4f(idx, x, y, z, w) { gl.vertexAttrib4f(idx, x, y, z, w); },
+    vertexAttribIPointer(idx, size, type, stride, offset) { gl.vertexAttribIPointer(idx, size, type, stride, offset); },
+    vertexAttribPointer(idx, size, type, normalized, stride, offset) { gl.vertexAttribPointer(idx, size, type, normalized, stride, offset); },
+    vertexAttribDivisor(idx, divisor) { gl.vertexAttribDivisor(idx, divisor); },
+    viewport(x, y, width, height) { gl.viewport(x, y, width, height); },
+});
diff --git a/modules/webgl2/webgl2.onyx b/modules/webgl2/webgl2.onyx
new file mode 100644 (file)
index 0000000..d59501b
--- /dev/null
@@ -0,0 +1,857 @@
+package gl
+
+// To be used with the corresponding gl.js
+// There are many things that are missing but this suffices for me.
+
+#private_file runtime :: package runtime
+#if runtime.Runtime != runtime.Runtime_Js {
+    #error "'webgl' can only be used with the 'js' runtime."
+}
+
+
+// ClearBufferMask 
+DEPTH_BUFFER_BIT               :: 0x00000100
+STENCIL_BUFFER_BIT             :: 0x00000400
+COLOR_BUFFER_BIT               :: 0x00004000
+
+// BeginMode 
+POINTS                         :: 0x0000
+LINES                          :: 0x0001
+LINE_LOOP                      :: 0x0002
+LINE_STRIP                     :: 0x0003
+TRIANGLES                      :: 0x0004
+TRIANGLE_STRIP                 :: 0x0005
+TRIANGLE_FAN                   :: 0x0006
+
+// AlphaFunction (not supported in ES20) 
+//      NEVER 
+//      LESS 
+//      EQUAL 
+//      LEQUAL 
+//      GREATER 
+//      NOTEQUAL 
+//      GEQUAL 
+//      ALWAYS 
+
+// BlendingFactorDest 
+ZERO                           :: 0
+ONE                            :: 1
+SRC_COLOR                      :: 0x0300
+ONE_MINUS_SRC_COLOR            :: 0x0301
+SRC_ALPHA                      :: 0x0302
+ONE_MINUS_SRC_ALPHA            :: 0x0303
+DST_ALPHA                      :: 0x0304
+ONE_MINUS_DST_ALPHA            :: 0x0305
+
+// BlendingFactorSrc 
+//      ZERO 
+//      ONE 
+DST_COLOR                      :: 0x0306
+ONE_MINUS_DST_COLOR            :: 0x0307
+SRC_ALPHA_SATURATE             :: 0x0308
+//      SRC_ALPHA 
+//      ONE_MINUS_SRC_ALPHA 
+//      DST_ALPHA 
+//      ONE_MINUS_DST_ALPHA 
+
+// BlendEquationSeparate 
+FUNC_ADD                       :: 0x8006
+BLEND_EQUATION                 :: 0x8009
+BLEND_EQUATION_RGB             :: 0x8009   // same as BLEND_EQUATION
+BLEND_EQUATION_ALPHA           :: 0x883D
+
+// BlendSubtract 
+FUNC_SUBTRACT                  :: 0x800A
+FUNC_REVERSE_SUBTRACT          :: 0x800B
+
+// Separate Blend Functions 
+BLEND_DST_RGB                  :: 0x80C8
+BLEND_SRC_RGB                  :: 0x80C9
+BLEND_DST_ALPHA                :: 0x80CA
+BLEND_SRC_ALPHA                :: 0x80CB
+CONSTANT_COLOR                 :: 0x8001
+ONE_MINUS_CONSTANT_COLOR       :: 0x8002
+CONSTANT_ALPHA                 :: 0x8003
+ONE_MINUS_CONSTANT_ALPHA       :: 0x8004
+BLEND_COLOR                    :: 0x8005
+
+// Buffer Objects 
+ARRAY_BUFFER                   :: 0x8892
+ELEMENT_ARRAY_BUFFER           :: 0x8893
+ARRAY_BUFFER_BINDING           :: 0x8894
+ELEMENT_ARRAY_BUFFER_BINDING   :: 0x8895
+
+STREAM_DRAW                    :: 0x88E0
+STATIC_DRAW                    :: 0x88E4
+DYNAMIC_DRAW                   :: 0x88E8
+
+BUFFER_SIZE                    :: 0x8764
+BUFFER_USAGE                   :: 0x8765
+
+CURRENT_VERTEX_ATTRIB          :: 0x8626
+
+// CullFaceMode 
+FRONT                          :: 0x0404
+BACK                           :: 0x0405
+FRONT_AND_BACK                 :: 0x0408
+
+// DepthFunction 
+//      NEVER 
+//      LESS 
+//      EQUAL 
+//      LEQUAL 
+//      GREATER 
+//      NOTEQUAL 
+//      GEQUAL 
+//      ALWAYS 
+
+// EnableCap 
+// TEXTURE_2D 
+CULL_FACE                      :: 0x0B44
+BLEND                          :: 0x0BE2
+DITHER                         :: 0x0BD0
+STENCIL_TEST                   :: 0x0B90
+DEPTH_TEST                     :: 0x0B71
+SCISSOR_TEST                   :: 0x0C11
+POLYGON_OFFSET_FILL            :: 0x8037
+SAMPLE_ALPHA_TO_COVERAGE       :: 0x809E
+SAMPLE_COVERAGE                :: 0x80A0
+
+// ErrorCode 
+NO_ERROR                       :: 0
+INVALID_ENUM                   :: 0x0500
+INVALID_VALUE                  :: 0x0501
+INVALID_OPERATION              :: 0x0502
+OUT_OF_MEMORY                  :: 0x0505
+
+// FrontFaceDirection 
+CW                             :: 0x0900
+CCW                            :: 0x0901
+
+// GetPName 
+LINE_WIDTH                     :: 0x0B21
+ALIASED_POINT_SIZE_RANGE       :: 0x846D
+ALIASED_LINE_WIDTH_RANGE       :: 0x846E
+CULL_FACE_MODE                 :: 0x0B45
+FRONT_FACE                     :: 0x0B46
+DEPTH_RANGE                    :: 0x0B70
+DEPTH_WRITEMASK                :: 0x0B72
+DEPTH_CLEAR_VALUE              :: 0x0B73
+DEPTH_FUNC                     :: 0x0B74
+STENCIL_CLEAR_VALUE            :: 0x0B91
+STENCIL_FUNC                   :: 0x0B92
+STENCIL_FAIL                   :: 0x0B94
+STENCIL_PASS_DEPTH_FAIL        :: 0x0B95
+STENCIL_PASS_DEPTH_PASS        :: 0x0B96
+STENCIL_REF                    :: 0x0B97
+STENCIL_VALUE_MASK             :: 0x0B93
+STENCIL_WRITEMASK              :: 0x0B98
+STENCIL_BACK_FUNC              :: 0x8800
+STENCIL_BACK_FAIL              :: 0x8801
+STENCIL_BACK_PASS_DEPTH_FAIL   :: 0x8802
+STENCIL_BACK_PASS_DEPTH_PASS   :: 0x8803
+STENCIL_BACK_REF               :: 0x8CA3
+STENCIL_BACK_VALUE_MASK        :: 0x8CA4
+STENCIL_BACK_WRITEMASK         :: 0x8CA5
+VIEWPORT                       :: 0x0BA2
+SCISSOR_BOX                    :: 0x0C10
+//      SCISSOR_TEST 
+COLOR_CLEAR_VALUE              :: 0x0C22
+COLOR_WRITEMASK                :: 0x0C23
+UNPACK_ALIGNMENT               :: 0x0CF5
+PACK_ALIGNMENT                 :: 0x0D05
+MAX_TEXTURE_SIZE               :: 0x0D33
+MAX_VIEWPORT_DIMS              :: 0x0D3A
+SUBPIXEL_BITS                  :: 0x0D50
+RED_BITS                       :: 0x0D52
+GREEN_BITS                     :: 0x0D53
+BLUE_BITS                      :: 0x0D54
+ALPHA_BITS                     :: 0x0D55
+DEPTH_BITS                     :: 0x0D56
+STENCIL_BITS                   :: 0x0D57
+POLYGON_OFFSET_UNITS           :: 0x2A00
+//      POLYGON_OFFSET_FILL 
+POLYGON_OFFSET_FACTOR          :: 0x8038
+TEXTURE_BINDING_2D             :: 0x8069
+SAMPLE_BUFFERS                 :: 0x80A8
+SAMPLES                        :: 0x80A9
+SAMPLE_COVERAGE_VALUE          :: 0x80AA
+SAMPLE_COVERAGE_INVERT         :: 0x80AB
+
+// GetTextureParameter 
+//      TEXTURE_MAG_FILTER 
+//      TEXTURE_MIN_FILTER 
+//      TEXTURE_WRAP_S 
+//      TEXTURE_WRAP_T 
+
+COMPRESSED_TEXTURE_FORMATS     :: 0x86A3
+
+// HintMode 
+DONT_CARE                      :: 0x1100
+FASTEST                        :: 0x1101
+NICEST                         :: 0x1102
+
+// HintTarget 
+GENERATE_MIPMAP_HINT            :: 0x8192
+
+// DataType 
+BYTE                           :: 0x1400
+UNSIGNED_BYTE                  :: 0x1401
+SHORT                          :: 0x1402
+UNSIGNED_SHORT                 :: 0x1403
+INT                            :: 0x1404
+UNSIGNED_INT                   :: 0x1405
+FLOAT                          :: 0x1406
+
+// PixelFormat 
+DEPTH_COMPONENT                :: 0x1902
+ALPHA                          :: 0x1906
+RGB                            :: 0x1907
+RGBA                           :: 0x1908
+LUMINANCE                      :: 0x1909
+LUMINANCE_ALPHA                :: 0x190A
+
+// PixelType 
+//      UNSIGNED_BYTE 
+UNSIGNED_SHORT_4_4_4_4         :: 0x8033
+UNSIGNED_SHORT_5_5_5_1         :: 0x8034
+UNSIGNED_SHORT_5_6_5           :: 0x8363
+
+// Shaders 
+FRAGMENT_SHADER                  :: 0x8B30
+VERTEX_SHADER                    :: 0x8B31
+MAX_VERTEX_ATTRIBS               :: 0x8869
+MAX_VERTEX_UNIFORM_VECTORS       :: 0x8DFB
+MAX_VARYING_VECTORS              :: 0x8DFC
+MAX_COMBINED_TEXTURE_IMAGE_UNITS :: 0x8B4D
+MAX_VERTEX_TEXTURE_IMAGE_UNITS   :: 0x8B4C
+MAX_TEXTURE_IMAGE_UNITS          :: 0x8872
+MAX_FRAGMENT_UNIFORM_VECTORS     :: 0x8DFD
+SHADER_TYPE                      :: 0x8B4F
+DELETE_STATUS                    :: 0x8B80
+LINK_STATUS                      :: 0x8B82
+VALIDATE_STATUS                  :: 0x8B83
+ATTACHED_SHADERS                 :: 0x8B85
+ACTIVE_UNIFORMS                  :: 0x8B86
+ACTIVE_ATTRIBUTES                :: 0x8B89
+SHADING_LANGUAGE_VERSION         :: 0x8B8C
+CURRENT_PROGRAM                  :: 0x8B8D
+
+// StencilFunction 
+NEVER                          :: 0x0200
+LESS                           :: 0x0201
+EQUAL                          :: 0x0202
+LEQUAL                         :: 0x0203
+GREATER                        :: 0x0204
+NOTEQUAL                       :: 0x0205
+GEQUAL                         :: 0x0206
+ALWAYS                         :: 0x0207
+
+// StencilOp 
+//      ZERO 
+KEEP                           :: 0x1E00
+REPLACE                        :: 0x1E01
+INCR                           :: 0x1E02
+DECR                           :: 0x1E03
+INVERT                         :: 0x150A
+INCR_WRAP                      :: 0x8507
+DECR_WRAP                      :: 0x8508
+
+// StringName 
+VENDOR                         :: 0x1F00
+RENDERER                       :: 0x1F01
+VERSION                        :: 0x1F02
+
+// TextureMagFilter 
+NEAREST                        :: 0x2600
+LINEAR                         :: 0x2601
+
+// TextureMinFilter 
+//      NEAREST 
+//      LINEAR 
+NEAREST_MIPMAP_NEAREST         :: 0x2700
+LINEAR_MIPMAP_NEAREST          :: 0x2701
+NEAREST_MIPMAP_LINEAR          :: 0x2702
+LINEAR_MIPMAP_LINEAR           :: 0x2703
+
+// TextureParameterName 
+TEXTURE_MAG_FILTER             :: 0x2800
+TEXTURE_MIN_FILTER             :: 0x2801
+TEXTURE_WRAP_S                 :: 0x2802
+TEXTURE_WRAP_T                 :: 0x2803
+
+// TextureTarget 
+TEXTURE_2D                     :: 0x0DE1
+TEXTURE                        :: 0x1702
+
+TEXTURE_CUBE_MAP               :: 0x8513
+TEXTURE_BINDING_CUBE_MAP       :: 0x8514
+TEXTURE_CUBE_MAP_POSITIVE_X    :: 0x8515
+TEXTURE_CUBE_MAP_NEGATIVE_X    :: 0x8516
+TEXTURE_CUBE_MAP_POSITIVE_Y    :: 0x8517
+TEXTURE_CUBE_MAP_NEGATIVE_Y    :: 0x8518
+TEXTURE_CUBE_MAP_POSITIVE_Z    :: 0x8519
+TEXTURE_CUBE_MAP_NEGATIVE_Z    :: 0x851A
+MAX_CUBE_MAP_TEXTURE_SIZE      :: 0x851C
+
+// TextureUnit 
+TEXTURE0                       :: 0x84C0
+TEXTURE1                       :: 0x84C1
+TEXTURE2                       :: 0x84C2
+TEXTURE3                       :: 0x84C3
+TEXTURE4                       :: 0x84C4
+TEXTURE5                       :: 0x84C5
+TEXTURE6                       :: 0x84C6
+TEXTURE7                       :: 0x84C7
+TEXTURE8                       :: 0x84C8
+TEXTURE9                       :: 0x84C9
+TEXTURE10                      :: 0x84CA
+TEXTURE11                      :: 0x84CB
+TEXTURE12                      :: 0x84CC
+TEXTURE13                      :: 0x84CD
+TEXTURE14                      :: 0x84CE
+TEXTURE15                      :: 0x84CF
+TEXTURE16                      :: 0x84D0
+TEXTURE17                      :: 0x84D1
+TEXTURE18                      :: 0x84D2
+TEXTURE19                      :: 0x84D3
+TEXTURE20                      :: 0x84D4
+TEXTURE21                      :: 0x84D5
+TEXTURE22                      :: 0x84D6
+TEXTURE23                      :: 0x84D7
+TEXTURE24                      :: 0x84D8
+TEXTURE25                      :: 0x84D9
+TEXTURE26                      :: 0x84DA
+TEXTURE27                      :: 0x84DB
+TEXTURE28                      :: 0x84DC
+TEXTURE29                      :: 0x84DD
+TEXTURE30                      :: 0x84DE
+TEXTURE31                      :: 0x84DF
+ACTIVE_TEXTURE                 :: 0x84E0
+
+// TextureWrapMode 
+REPEAT                         :: 0x2901
+CLAMP_TO_EDGE                  :: 0x812F
+MIRRORED_REPEAT                :: 0x8370
+
+// Uniform Types 
+FLOAT_VEC2                     :: 0x8B50
+FLOAT_VEC3                     :: 0x8B51
+FLOAT_VEC4                     :: 0x8B52
+INT_VEC2                       :: 0x8B53
+INT_VEC3                       :: 0x8B54
+INT_VEC4                       :: 0x8B55
+BOOL                           :: 0x8B56
+BOOL_VEC2                      :: 0x8B57
+BOOL_VEC3                      :: 0x8B58
+BOOL_VEC4                      :: 0x8B59
+FLOAT_MAT2                     :: 0x8B5A
+FLOAT_MAT3                     :: 0x8B5B
+FLOAT_MAT4                     :: 0x8B5C
+SAMPLER_2D                     :: 0x8B5E
+SAMPLER_CUBE                   :: 0x8B60
+
+// Vertex Arrays 
+VERTEX_ATTRIB_ARRAY_ENABLED        :: 0x8622
+VERTEX_ATTRIB_ARRAY_SIZE           :: 0x8623
+VERTEX_ATTRIB_ARRAY_STRIDE         :: 0x8624
+VERTEX_ATTRIB_ARRAY_TYPE           :: 0x8625
+VERTEX_ATTRIB_ARRAY_NORMALIZED     :: 0x886A
+VERTEX_ATTRIB_ARRAY_POINTER        :: 0x8645
+VERTEX_ATTRIB_ARRAY_BUFFER_BINDING :: 0x889F
+
+// Read Format 
+IMPLEMENTATION_COLOR_READ_TYPE   :: 0x8B9A
+IMPLEMENTATION_COLOR_READ_FORMAT :: 0x8B9B
+
+// Shader Source 
+COMPILE_STATUS                 :: 0x8B81
+
+// Shader Precision-Specified Types 
+LOW_FLOAT                      :: 0x8DF0
+MEDIUM_FLOAT                   :: 0x8DF1
+HIGH_FLOAT                     :: 0x8DF2
+LOW_INT                        :: 0x8DF3
+MEDIUM_INT                     :: 0x8DF4
+HIGH_INT                       :: 0x8DF5
+
+// Framebuffer Object. 
+FRAMEBUFFER                    :: 0x8D40
+RENDERBUFFER                   :: 0x8D41
+
+RGBA4                          :: 0x8056
+RGB5_A1                        :: 0x8057
+RGB565                         :: 0x8D62
+DEPTH_COMPONENT16              :: 0x81A5
+STENCIL_INDEX                  :: 0x1901
+STENCIL_INDEX8                 :: 0x8D48
+DEPTH_STENCIL                  :: 0x84F9
+
+RENDERBUFFER_WIDTH             :: 0x8D42
+RENDERBUFFER_HEIGHT            :: 0x8D43
+RENDERBUFFER_INTERNAL_FORMAT   :: 0x8D44
+RENDERBUFFER_RED_SIZE          :: 0x8D50
+RENDERBUFFER_GREEN_SIZE        :: 0x8D51
+RENDERBUFFER_BLUE_SIZE         :: 0x8D52
+RENDERBUFFER_ALPHA_SIZE        :: 0x8D53
+RENDERBUFFER_DEPTH_SIZE        :: 0x8D54
+RENDERBUFFER_STENCIL_SIZE      :: 0x8D55
+
+FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE           :: 0x8CD0
+FRAMEBUFFER_ATTACHMENT_OBJECT_NAME           :: 0x8CD1
+FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL         :: 0x8CD2
+FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE :: 0x8CD3
+
+COLOR_ATTACHMENT0              :: 0x8CE0
+DEPTH_ATTACHMENT               :: 0x8D00
+STENCIL_ATTACHMENT             :: 0x8D20
+DEPTH_STENCIL_ATTACHMENT       :: 0x821A
+
+NONE                           :: 0
+
+FRAMEBUFFER_COMPLETE                      :: 0x8CD5
+FRAMEBUFFER_INCOMPLETE_ATTACHMENT         :: 0x8CD6
+FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT :: 0x8CD7
+FRAMEBUFFER_INCOMPLETE_DIMENSIONS         :: 0x8CD9
+FRAMEBUFFER_UNSUPPORTED                   :: 0x8CDD
+
+FRAMEBUFFER_BINDING            :: 0x8CA6
+RENDERBUFFER_BINDING           :: 0x8CA7
+MAX_RENDERBUFFER_SIZE          :: 0x84E8
+
+INVALID_FRAMEBUFFER_OPERATION  :: 0x0506
+
+READ_BUFFER                                   :: 0x0C02
+UNPACK_ROW_LENGTH                             :: 0x0CF2
+UNPACK_SKIP_ROWS                              :: 0x0CF3
+UNPACK_SKIP_PIXELS                            :: 0x0CF4
+PACK_ROW_LENGTH                               :: 0x0D02
+PACK_SKIP_ROWS                                :: 0x0D03
+PACK_SKIP_PIXELS                              :: 0x0D04
+COLOR                                         :: 0x1800
+DEPTH                                         :: 0x1801
+STENCIL                                       :: 0x1802
+RED                                           :: 0x1903
+RGB8                                          :: 0x8051
+RGBA8                                         :: 0x8058
+RGB10_A2                                      :: 0x8059
+TEXTURE_BINDING_3D                            :: 0x806A
+UNPACK_SKIP_IMAGES                            :: 0x806D
+UNPACK_IMAGE_HEIGHT                           :: 0x806E
+TEXTURE_3D                                    :: 0x806F
+TEXTURE_WRAP_R                                :: 0x8072
+MAX_3D_TEXTURE_SIZE                           :: 0x8073
+UNSIGNED_INT_2_10_10_10_REV                   :: 0x8368
+MAX_ELEMENTS_VERTICES                         :: 0x80E8
+MAX_ELEMENTS_INDICES                          :: 0x80E9
+TEXTURE_MIN_LOD                               :: 0x813A
+TEXTURE_MAX_LOD                               :: 0x813B
+TEXTURE_BASE_LEVEL                            :: 0x813C
+TEXTURE_MAX_LEVEL                             :: 0x813D
+MIN                                           :: 0x8007
+MAX                                           :: 0x8008
+DEPTH_COMPONENT24                             :: 0x81A6
+MAX_TEXTURE_LOD_BIAS                          :: 0x84FD
+TEXTURE_COMPARE_MODE                          :: 0x884C
+TEXTURE_COMPARE_FUNC                          :: 0x884D
+CURRENT_QUERY                                 :: 0x8865
+QUERY_RESULT                                  :: 0x8866
+QUERY_RESULT_AVAILABLE                        :: 0x8867
+STREAM_READ                                   :: 0x88E1
+STREAM_COPY                                   :: 0x88E2
+STATIC_READ                                   :: 0x88E5
+STATIC_COPY                                   :: 0x88E6
+DYNAMIC_READ                                  :: 0x88E9
+DYNAMIC_COPY                                  :: 0x88EA
+MAX_DRAW_BUFFERS                              :: 0x8824
+DRAW_BUFFER0                                  :: 0x8825
+DRAW_BUFFER1                                  :: 0x8826
+DRAW_BUFFER2                                  :: 0x8827
+DRAW_BUFFER3                                  :: 0x8828
+DRAW_BUFFER4                                  :: 0x8829
+DRAW_BUFFER5                                  :: 0x882A
+DRAW_BUFFER6                                  :: 0x882B
+DRAW_BUFFER7                                  :: 0x882C
+DRAW_BUFFER8                                  :: 0x882D
+DRAW_BUFFER9                                  :: 0x882E
+DRAW_BUFFER10                                 :: 0x882F
+DRAW_BUFFER11                                 :: 0x8830
+DRAW_BUFFER12                                 :: 0x8831
+DRAW_BUFFER13                                 :: 0x8832
+DRAW_BUFFER14                                 :: 0x8833
+DRAW_BUFFER15                                 :: 0x8834
+MAX_FRAGMENT_UNIFORM_COMPONENTS               :: 0x8B49
+MAX_VERTEX_UNIFORM_COMPONENTS                 :: 0x8B4A
+SAMPLER_3D                                    :: 0x8B5F
+SAMPLER_2D_SHADOW                             :: 0x8B62
+FRAGMENT_SHADER_DERIVATIVE_HINT               :: 0x8B8B
+PIXEL_PACK_BUFFER                             :: 0x88EB
+PIXEL_UNPACK_BUFFER                           :: 0x88EC
+PIXEL_PACK_BUFFER_BINDING                     :: 0x88ED
+PIXEL_UNPACK_BUFFER_BINDING                   :: 0x88EF
+FLOAT_MAT2x3                                  :: 0x8B65
+FLOAT_MAT2x4                                  :: 0x8B66
+FLOAT_MAT3x2                                  :: 0x8B67
+FLOAT_MAT3x4                                  :: 0x8B68
+FLOAT_MAT4x2                                  :: 0x8B69
+FLOAT_MAT4x3                                  :: 0x8B6A
+SRGB                                          :: 0x8C40
+SRGB8                                         :: 0x8C41
+SRGB8_ALPHA8                                  :: 0x8C43
+COMPARE_REF_TO_TEXTURE                        :: 0x884E
+RGBA32F                                       :: 0x8814
+RGB32F                                        :: 0x8815
+RGBA16F                                       :: 0x881A
+RGB16F                                        :: 0x881B
+VERTEX_ATTRIB_ARRAY_INTEGER                   :: 0x88FD
+MAX_ARRAY_TEXTURE_LAYERS                      :: 0x88FF
+MIN_PROGRAM_TEXEL_OFFSET                      :: 0x8904
+MAX_PROGRAM_TEXEL_OFFSET                      :: 0x8905
+MAX_VARYING_COMPONENTS                        :: 0x8B4B
+TEXTURE_2D_ARRAY                              :: 0x8C1A
+TEXTURE_BINDING_2D_ARRAY                      :: 0x8C1D
+R11F_G11F_B10F                                :: 0x8C3A
+UNSIGNED_INT_10F_11F_11F_REV                  :: 0x8C3B
+RGB9_E5                                       :: 0x8C3D
+UNSIGNED_INT_5_9_9_9_REV                      :: 0x8C3E
+TRANSFORM_FEEDBACK_BUFFER_MODE                :: 0x8C7F
+MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS    :: 0x8C80
+TRANSFORM_FEEDBACK_VARYINGS                   :: 0x8C83
+TRANSFORM_FEEDBACK_BUFFER_START               :: 0x8C84
+TRANSFORM_FEEDBACK_BUFFER_SIZE                :: 0x8C85
+TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN         :: 0x8C88
+RASTERIZER_DISCARD                            :: 0x8C89
+MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS :: 0x8C8A
+MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS       :: 0x8C8B
+INTERLEAVED_ATTRIBS                           :: 0x8C8C
+SEPARATE_ATTRIBS                              :: 0x8C8D
+TRANSFORM_FEEDBACK_BUFFER                     :: 0x8C8E
+TRANSFORM_FEEDBACK_BUFFER_BINDING             :: 0x8C8F
+RGBA32UI                                      :: 0x8D70
+RGB32UI                                       :: 0x8D71
+RGBA16UI                                      :: 0x8D76
+RGB16UI                                       :: 0x8D77
+RGBA8UI                                       :: 0x8D7C
+RGB8UI                                        :: 0x8D7D
+RGBA32I                                       :: 0x8D82
+RGB32I                                        :: 0x8D83
+RGBA16I                                       :: 0x8D88
+RGB16I                                        :: 0x8D89
+RGBA8I                                        :: 0x8D8E
+RGB8I                                         :: 0x8D8F
+RED_INTEGER                                   :: 0x8D94
+RGB_INTEGER                                   :: 0x8D98
+RGBA_INTEGER                                  :: 0x8D99
+SAMPLER_2D_ARRAY                              :: 0x8DC1
+SAMPLER_2D_ARRAY_SHADOW                       :: 0x8DC4
+SAMPLER_CUBE_SHADOW                           :: 0x8DC5
+UNSIGNED_INT_VEC2                             :: 0x8DC6
+UNSIGNED_INT_VEC3                             :: 0x8DC7
+UNSIGNED_INT_VEC4                             :: 0x8DC8
+INT_SAMPLER_2D                                :: 0x8DCA
+INT_SAMPLER_3D                                :: 0x8DCB
+INT_SAMPLER_CUBE                              :: 0x8DCC
+INT_SAMPLER_2D_ARRAY                          :: 0x8DCF
+UNSIGNED_INT_SAMPLER_2D                       :: 0x8DD2
+UNSIGNED_INT_SAMPLER_3D                       :: 0x8DD3
+UNSIGNED_INT_SAMPLER_CUBE                     :: 0x8DD4
+UNSIGNED_INT_SAMPLER_2D_ARRAY                 :: 0x8DD7
+DEPTH_COMPONENT32F                            :: 0x8CAC
+DEPTH32F_STENCIL8                             :: 0x8CAD
+FLOAT_32_UNSIGNED_INT_24_8_REV                :: 0x8DAD
+FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING         :: 0x8210
+FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE         :: 0x8211
+FRAMEBUFFER_ATTACHMENT_RED_SIZE               :: 0x8212
+FRAMEBUFFER_ATTACHMENT_GREEN_SIZE             :: 0x8213
+FRAMEBUFFER_ATTACHMENT_BLUE_SIZE              :: 0x8214
+FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE             :: 0x8215
+FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE             :: 0x8216
+FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE           :: 0x8217
+FRAMEBUFFER_DEFAULT                           :: 0x8218
+UNSIGNED_INT_24_8                             :: 0x84FA
+DEPTH24_STENCIL8                              :: 0x88F0
+UNSIGNED_NORMALIZED                           :: 0x8C17
+DRAW_FRAMEBUFFER_BINDING                      :: 0x8CA6
+READ_FRAMEBUFFER                              :: 0x8CA8
+DRAW_FRAMEBUFFER                              :: 0x8CA9
+READ_FRAMEBUFFER_BINDING                      :: 0x8CAA
+RENDERBUFFER_SAMPLES                          :: 0x8CAB
+FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER          :: 0x8CD4
+MAX_COLOR_ATTACHMENTS                         :: 0x8CDF
+COLOR_ATTACHMENT1                             :: 0x8CE1
+COLOR_ATTACHMENT2                             :: 0x8CE2
+COLOR_ATTACHMENT3                             :: 0x8CE3
+COLOR_ATTACHMENT4                             :: 0x8CE4
+COLOR_ATTACHMENT5                             :: 0x8CE5
+COLOR_ATTACHMENT6                             :: 0x8CE6
+COLOR_ATTACHMENT7                             :: 0x8CE7
+COLOR_ATTACHMENT8                             :: 0x8CE8
+COLOR_ATTACHMENT9                             :: 0x8CE9
+COLOR_ATTACHMENT10                            :: 0x8CEA
+COLOR_ATTACHMENT11                            :: 0x8CEB
+COLOR_ATTACHMENT12                            :: 0x8CEC
+COLOR_ATTACHMENT13                            :: 0x8CED
+COLOR_ATTACHMENT14                            :: 0x8CEE
+COLOR_ATTACHMENT15                            :: 0x8CEF
+FRAMEBUFFER_INCOMPLETE_MULTISAMPLE            :: 0x8D56
+MAX_SAMPLES                                   :: 0x8D57
+HALF_FLOAT                                    :: 0x140B
+RG                                            :: 0x8227
+RG_INTEGER                                    :: 0x8228
+R8                                            :: 0x8229
+RG8                                           :: 0x822B
+R16F                                          :: 0x822D
+R32F                                          :: 0x822E
+RG16F                                         :: 0x822F
+RG32F                                         :: 0x8230
+R8I                                           :: 0x8231
+R8UI                                          :: 0x8232
+R16I                                          :: 0x8233
+R16UI                                         :: 0x8234
+R32I                                          :: 0x8235
+R32UI                                         :: 0x8236
+RG8I                                          :: 0x8237
+RG8UI                                         :: 0x8238
+RG16I                                         :: 0x8239
+RG16UI                                        :: 0x823A
+RG32I                                         :: 0x823B
+RG32UI                                        :: 0x823C
+VERTEX_ARRAY_BINDING                          :: 0x85B5
+R8_SNORM                                      :: 0x8F94
+RG8_SNORM                                     :: 0x8F95
+RGB8_SNORM                                    :: 0x8F96
+RGBA8_SNORM                                   :: 0x8F97
+SIGNED_NORMALIZED                             :: 0x8F9C
+COPY_READ_BUFFER                              :: 0x8F36
+COPY_WRITE_BUFFER                             :: 0x8F37
+COPY_READ_BUFFER_BINDING                      :: 0x8F36
+COPY_WRITE_BUFFER_BINDING                     :: 0x8F37
+UNIFORM_BUFFER                                :: 0x8A11
+UNIFORM_BUFFER_BINDING                        :: 0x8A28
+UNIFORM_BUFFER_START                          :: 0x8A29
+UNIFORM_BUFFER_SIZE                           :: 0x8A2A
+MAX_VERTEX_UNIFORM_BLOCKS                     :: 0x8A2B
+MAX_FRAGMENT_UNIFORM_BLOCKS                   :: 0x8A2D
+MAX_COMBINED_UNIFORM_BLOCKS                   :: 0x8A2E
+MAX_UNIFORM_BUFFER_BINDINGS                   :: 0x8A2F
+MAX_UNIFORM_BLOCK_SIZE                        :: 0x8A30
+MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS        :: 0x8A31
+MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS      :: 0x8A33
+UNIFORM_BUFFER_OFFSET_ALIGNMENT               :: 0x8A34
+ACTIVE_UNIFORM_BLOCKS                         :: 0x8A36
+UNIFORM_TYPE                                  :: 0x8A37
+UNIFORM_SIZE                                  :: 0x8A38
+UNIFORM_BLOCK_INDEX                           :: 0x8A3A
+UNIFORM_OFFSET                                :: 0x8A3B
+UNIFORM_ARRAY_STRIDE                          :: 0x8A3C
+UNIFORM_MATRIX_STRIDE                         :: 0x8A3D
+UNIFORM_IS_ROW_MAJOR                          :: 0x8A3E
+UNIFORM_BLOCK_BINDING                         :: 0x8A3F
+UNIFORM_BLOCK_DATA_SIZE                       :: 0x8A40
+UNIFORM_BLOCK_ACTIVE_UNIFORMS                 :: 0x8A42
+UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES          :: 0x8A43
+UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER     :: 0x8A44
+UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER   :: 0x8A46
+INVALID_INDEX                                 :: 0xFFFFFFF
+MAX_VERTEX_OUTPUT_COMPONENTS                  :: 0x9122
+MAX_FRAGMENT_INPUT_COMPONENTS                 :: 0x9125
+MAX_SERVER_WAIT_TIMEOUT                       :: 0x9111
+OBJECT_TYPE                                   :: 0x9112
+SYNC_CONDITION                                :: 0x9113
+SYNC_STATUS                                   :: 0x9114
+SYNC_FLAGS                                    :: 0x9115
+SYNC_FENCE                                    :: 0x9116
+SYNC_GPU_COMMANDS_COMPLETE                    :: 0x9117
+UNSIGNALED                                    :: 0x9118
+SIGNALED                                      :: 0x9119
+ALREADY_SIGNALED                              :: 0x911A
+TIMEOUT_EXPIRED                               :: 0x911B
+CONDITION_SATISFIED                           :: 0x911C
+WAIT_FAILED                                   :: 0x911D
+SYNC_FLUSH_COMMANDS_BIT                       :: 0x0000001
+VERTEX_ATTRIB_ARRAY_DIVISOR                   :: 0x88FE
+ANY_SAMPLES_PASSED                            :: 0x8C2F
+ANY_SAMPLES_PASSED_CONSERVATIVE               :: 0x8D6A
+SAMPLER_BINDING                               :: 0x8919
+RGB10_A2UI                                    :: 0x906F
+INT_2_10_10_10_REV                            :: 0x8D9F
+TRANSFORM_FEEDBACK                            :: 0x8E22
+TRANSFORM_FEEDBACK_PAUSED                     :: 0x8E23
+TRANSFORM_FEEDBACK_ACTIVE                     :: 0x8E24
+TRANSFORM_FEEDBACK_BINDING                    :: 0x8E25
+TEXTURE_IMMUTABLE_FORMAT                      :: 0x912F
+MAX_ELEMENT_INDEX                             :: 0x8D6B
+TEXTURE_IMMUTABLE_LEVELS                      :: 0x82DF
+TIMEOUT_IGNORED                               :: -1
+
+// WebGL-specific enums 
+UNPACK_FLIP_Y_WEBGL            :: 0x9240
+UNPACK_PREMULTIPLY_ALPHA_WEBGL :: 0x9241
+CONTEXT_LOST_WEBGL             :: 0x9242
+UNPACK_COLORSPACE_CONVERSION_WEBGL :: 0x9243
+BROWSER_DEFAULT_WEBGL          :: 0x9244
+MAX_CLIENT_WAIT_TIMEOUT_WEBGL  :: 0x9247
+
+GLenum     :: #type u32
+GLboolean  :: #type bool
+GLbitfield :: #type u32
+GLbyte     :: #type i8
+GLshort    :: #type i16
+GLint      :: #type i32
+GLsizei    :: #type i32
+GLintptr   :: #type i64
+GLsizeiptr :: #type i64
+GLubyte    :: #type u8
+GLushort   :: #type u16
+GLuint     :: #type u32
+GLfloat    :: #type f32
+GLclampf   :: #type f32
+
+GLProgram :: #type i32
+GLShader  :: #type i32
+GLFramebuffer :: #type i32
+GLRenderbuffer :: #type i32
+GLTexture :: #type i32
+GLBuffer :: #type i32
+GLUniformLocation :: #type i32
+GLVertexArrayObject :: #type i32
+
+GLActiveInfo :: struct {
+    size     : GLint;
+    type     : GLenum;
+
+    // Not used
+    name     : ^u8;
+}
+
+GLMat2 :: #type [4] GLfloat
+GLMat3 :: #type [9] GLfloat
+GLMat4 :: #type [16] GLfloat
+
+activeTexture                  :: (texture: GLenum) -> void #foreign "gl" "activeTexture" ---
+attachShader                   :: (program: GLProgram, shader: GLShader) -> GLProgram #foreign "gl" "attachShader" ---
+bindAttribLocation             :: (program: GLProgram, index: GLuint, name: str) -> void #foreign "gl" "bindAttribLocation" ---
+bindBuffer                     :: (target: GLenum, buffer: GLBuffer) -> void #foreign "gl" "bindBuffer" ---
+bindFramebuffer                :: (target: GLenum, framebuffer: GLFramebuffer) -> void #foreign "gl" "bindFramebuffer" ---
+bindRenderbuffer               :: (target: GLenum, renderbuffer: GLRenderbuffer) -> void #foreign "gl" "bindRenderbuffer" ---
+bindTexture                    :: (target: GLenum, texture: GLTexture) -> void #foreign "gl" "bindTexture" ---
+bindVertexArray                :: (vertexArray: GLVertexArrayObject) -> void #foreign "gl" "bindVertexArray" ---
+blendColor                     :: (red: GLclampf, green: GLclampf, blue: GLclampf, alpha: GLclampf) -> void #foreign "gl" "blendColor" ---
+blendEquation                  :: (mode: GLenum) -> void #foreign "gl" "blendEquation" ---
+blendEquationSeparate          :: (modeRGB: GLenum, modeAlpha: GLenum) -> void #foreign "gl" "blendEquationSeparate" ---
+blendFunc                      :: (sfactor: GLenum, dfactor: GLenum) -> void #foreign "gl" "blendFunc" ---
+blendFuncSeparate              :: (srcRGB: GLenum, dstRGB: GLenum, srcAlpha: GLenum, dstAlpha: GLenum) -> void #foreign "gl" "blendFuncSeparate" ---
+blitFramebuffer                :: (sx0: GLint, sy0: GLint, sx1: GLint, sy1: GLint, dx0: GLint, dy0: GLint, dx1: GLint, dy1: GLint, mask: GLbitfield, filter: GLenum) -> void #foreign "gl" "blitFramebuffer" ---
+bufferDataWithData             :: (target: GLenum, buffer: [] void, usage: GLenum) -> void #foreign "gl" "bufferDataWithData" ---
+bufferDataNoData               :: (target: GLenum, size: GLsizei, usage: GLenum) -> void #foreign "gl" "bufferDataNoData" ---
+bufferData                     :: proc { bufferDataWithData, bufferDataNoData }
+bufferSubData                  :: (target: GLenum, offset: GLsizei, data: [] void) -> void #foreign "gl" "bufferSubData" ---
+canvasSize                     :: (width: GLsizei, height: GLsizei) -> void #foreign "gl" "canvasSize" ---
+checkFrameBufferStatus         :: (target: GLenum) -> GLenum #foreign "gl" "checkFrameBufferStatus" ---
+clear                          :: (mask: GLbitfield) -> void #foreign "gl" "clear" ---
+clearColor                     :: (red: GLclampf, green: GLclampf, blue: GLclampf, alpha: GLclampf) -> void #foreign "gl" "clearColor" ---
+clearDepth                     :: (depth: GLclampf) -> void #foreign "gl" "clearDepth" ---
+clearStencil                   :: (s: GLint) -> void #foreign "gl" "clearStencil" ---
+colorMask                      :: (red: GLboolean, green: GLboolean, blue: GLboolean, alpha: GLboolean) -> void #foreign "gl" "colorMask" ---
+compileShader                  :: (shader: GLShader) -> void #foreign "gl" "compileShader" ---
+compressedTexImage2D           :: (target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, data: str) -> void #foreign "gl" "compressedTexImage2D" ---
+compressedTexSubImage2D        :: (target: GLenum, level: GLint, internalformat: GLenum, xoff: GLint, yoff: GLint, width: GLsizei, height: GLsizei, format: GLenum, data: str) -> void #foreign "gl" "compressedTexSubImage2D" ---
+copyBufferSubData              :: (readTarget: GLenum, writeTarget: GLenum, readOffset: GLintptr, writeOffset: GLintptr, size: GLsizeiptr) -> void #foreign "gl" "copyBufferSubData" ---
+copyTexImage2D                 :: (target: GLenum, level: GLint, internalformat: GLenum, x: GLint, y: GLint, width: GLsizei, height: GLsizei, border: GLint) -> void #foreign "gl" "copyTexImage2D" ---
+copyTexSubImage2D              :: (target: GLenum, level: GLint, xoff: GLint, yoff: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei) -> void #foreign "gl" "copyTexSubImage2D" ---
+createBuffer                   :: () -> GLBuffer #foreign "gl" "createBuffer" ---
+createFramebuffer              :: () -> GLFramebuffer #foreign "gl" "createFramebuffer" ---
+createProgram                  :: () -> GLProgram #foreign "gl" "createProgram" ---
+createRenderbuffer             :: () -> GLRenderbuffer #foreign "gl" "createRenderbuffer" ---
+createShader                   :: (type: GLenum) -> GLShader #foreign "gl" "createShader" ---
+createTexture                  :: () -> GLTexture #foreign "gl" "createTexture" ---
+createVertexArray              :: () -> GLVertexArrayObject #foreign "gl" "createVertexArray" ---
+cullFace                       :: (mode: GLenum) -> void #foreign "gl" "cullFace" ---
+deleteBuffer                   :: (buffer: GLBuffer) -> void #foreign "gl" "deleteBuffer" ---
+deleteFramebuffer              :: (framebuffer: GLFramebuffer) -> void #foreign "gl" "deleteFramebuffer" ---
+deleteProgram                  :: (program: GLProgram) -> void #foreign "gl" "deleteProgram" ---
+deleteRenderbuffer             :: (renderbuffer: GLRenderbuffer) -> void #foreign "gl" "deleteRenderbuffer" ---
+deleteShader                   :: (shader: GLShader) -> void #foreign "gl" "deleteShader" ---
+deleteTexture                  :: (texture: GLTexture) -> void #foreign "gl" "deleteTexture" ---
+deleteVertexArray              :: (vertexArray: GLVertexArrayObject) -> void #foreign "gl" "deleteVertexArray" ---
+depthFunc                      :: (func: GLenum) -> void #foreign "gl" "depthFunc" ---
+depthMask                      :: (flag: GLboolean) -> void #foreign "gl" "depthMask" ---
+depthRange                     :: (zNear: GLclampf, zFar: GLclampf) -> void #foreign "gl" "depthRange" ---
+detachShader                   :: (program: GLProgram, shader: GLShader) -> void #foreign "gl" "detachShader" ---
+disable                        :: (cap: GLenum) -> void #foreign "gl" "disable" ---
+disableVertexAttribArray       :: (index: GLuint) -> void #foreign "gl" "disableVertexAttribArray" ---
+drawArrays                     :: (mode: GLenum, first: GLint, count: GLsizei) -> void #foreign "gl" "drawArrays" ---
+drawArraysInstanced            :: (mode: GLenum, first: GLint, count: GLsizei, instanceCount: GLsizei) -> void #foreign "gl" "drawArraysInstanced" ---
+drawElements                   :: (mode: GLenum, count: GLsizei, type: GLenum, offset: GLint) -> void #foreign "gl" "drawElements" ---
+drawElementsInstanced          :: (mode: GLenum, count: GLsizei, type: GLenum, offset: GLint, instanceCount: GLsizei) -> void #foreign "gl" "drawElementsInstanced" ---
+enable                         :: (cap: GLenum) -> void #foreign "gl" "enable" ---
+enableVertexAttribArray        :: (index: GLuint) -> void #foreign "gl" "enableVertexAttribArray" ---
+finish                         :: () -> void #foreign "gl" "finish" ---
+flush                          :: () -> void #foreign "gl" "flush" ---
+framebufferRenderbuffer        :: (target: GLenum, attachment: GLenum, renderbuffertarget: GLenum, renderbuffer: GLRenderbuffer) -> void #foreign "gl" "framebufferRenderbuffer" ---
+framebufferTexture2D           :: (target: GLenum, attachment: GLenum, textarget: GLenum, texture: GLTexture, level: GLint) -> void #foreign "gl" "framebufferTexture2D" ---
+framebufferTextureLayer        :: (target: GLenum, attachment: GLenum, texture: GLTexture, level: GLint, layer: GLint) -> void #foreign "gl" "framebufferTextureLayer" ---
+frontFace                      :: (mode: GLenum) -> void #foreign "gl" "frontFace" ---
+generateMipmap                 :: (target: GLenum) -> void #foreign "gl" "generateMipmap" ---
+getActiveAttrib                :: (program: GLProgram, index: GLuint, out: ^GLActiveInfo) -> void #foreign "gl" "getActiveAttrib" ---
+getActiveUniform               :: (program: GLProgram, index: GLuint, out: ^GLActiveInfo) -> void #foreign "gl" "getActiveUniform" ---
+// getAttachedShaders does not work yet because we can't return a list of things
+getAttribLocation              :: (program: GLProgram, name: str) -> GLint #foreign "gl" "getAttribLocation" ---
+getBufferSubData               :: (target: GLenum, srcByteOffset: GLintptr, dstBuffer: str, dstOffset: GLuint, length: GLuint) -> void #foreign "gl" "getBufferSubData" ---
+// getBufferParameter and getParameter do not work
+getError                       :: () -> GLenum #foreign "gl" "getError" ---
+getInternalformatParameter     :: (target: GLenum, internalFormat: GLenum, pname: GLenum) -> GLenum #foreign "gl" "getInternalformatParameter" ---
+// many of the 'gets' don't work yet because they return very javascripty things
+getProgramParameter            :: (program: GLProgram, pname: GLenum) -> GLenum #foreign "gl" "getProgramParameter" ---
+getShaderParameter             :: (shader: GLShader, pname: GLenum) -> GLenum #foreign "gl" "getShaderParameter" ---
+getUniformLocation             :: (program: GLProgram, name: str) -> GLUniformLocation #foreign "gl" "getUniformLocation" ---
+getVertexAttribOffset          :: (index: GLuint, pname: GLenum) -> void #foreign "gl" "getVertexAttribOffset" ---
+hint                           :: (target: GLenum, mode: GLenum) -> void #foreign "gl" "hint" ---
+init                           :: (canvasname: str) -> GLboolean #foreign "gl" "init" ---
+invalidateFramebuffer          :: (target: GLenum, attachments: str) -> void #foreign "gl" "invalidateFramebuffer" ---
+invalidateSubFramebuffer       :: (target: GLenum, attachments: str, x: GLint, y: GLint, width: GLsizei, height: GLsizei) -> void #foreign "gl" "invalidateSubFramebuffer" ---
+isEnabled                      :: (cap: GLenum) -> GLboolean #foreign "gl" "isEnabled" ---
+lineWidth                      :: (width: GLfloat) -> void #foreign "gl" "lineWidth" ---
+linkProgram                    :: (program: GLProgram) -> void #foreign "gl" "linkProgram" ---
+pixelStorei                    :: (pname: GLenum, param: GLenum) -> void #foreign "gl" "pixelStorei" ---
+polygonOffset                  :: (factor: GLfloat, units: GLfloat) -> void #foreign "gl" "polygonOffset" ---
+printProgramInfoLog            :: (program: GLProgram) -> void #foreign "gl" "printProgramInfoLog" ---
+printShaderInfoLog             :: (shader: GLShader) -> void #foreign "gl" "printShaderInfoLog" ---
+readBuffer                     :: (src: GLenum) -> void #foreign "gl" "readBuffer" ---
+readPixels                     :: (x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: str) -> void #foreign "gl" "readPixels" ---
+renderbufferStorageMultisample :: (target: GLenum, samples: GLsizei, internalforamt: GLenum, width: GLsizei, height: GLsizei) -> void #foreign "gl" "renderbufferStorageMultisample" ---
+sampleCoverage                 :: (value: GLclampf, invert: GLboolean) -> void #foreign "gl" "sampleCoverage" ---
+scissor                        :: (x: GLint, y: GLint, width: GLsizei, height: GLsizei) -> void #foreign "gl" "scissor" ---
+setSize                        :: (width: GLint, y: GLint) -> void #foreign "gl" "setSize" ---
+shaderSource                   :: (shader: GLShader, source: str) -> void #foreign "gl" "shaderSource" ---
+stencilFunc                    :: (func: GLenum, ref: GLint, mask: GLuint) -> void #foreign "gl" "stencilFunc" ---
+stencilFuncSeparate            :: (face: GLenum, func: GLenum, ref: GLint, mask: GLuint) -> void #foreign "gl" "stencilFuncSeparate" ---
+stencilMask                    :: (mask: GLuint) -> void #foreign "gl" "stencilMask" ---
+stencilMaskSeparate            :: (face: GLenum, mask: GLenum) -> void #foreign "gl" "stencilMaskSeparate" ---
+stencilOp                      :: (fail: GLenum, zfail: GLenum, zpass: GLenum) -> void #foreign "gl" "stencilOp" ---
+stencilOpSeparate              :: (face: GLenum, fail: GLenum, zfail: GLenum, zpass: GLenum) -> void #foreign "gl" "stencilOpSeparate" ---
+texImage2D                     :: (target: GLenum, level: GLint, internalFormat: GLenum, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type: GLenum, pixels: str) -> void #foreign "gl" "texImage2D" ---
+texParameterf                  :: (target: GLenum, pname: GLenum, param: GLfloat) -> void #foreign "gl" "texParameterf" ---
+texParameteri                  :: (target: GLenum, pname: GLenum, param: GLint) -> void #foreign "gl" "texParameteri" ---
+texSubImage2D                  :: (target: GLenum, level: GLint, xoff: GLint, yoff: GLint, width: GLsizei, height: GLsizei, format: GLenum, type: GLenum, pixels: str) -> void #foreign "gl" "texSubImage2D" ---
+uniform1f                      :: (loc: GLUniformLocation, x: GLfloat) -> void #foreign "gl" "uniform1f" ---
+uniform1i                      :: (loc: GLUniformLocation, x: GLint) -> void #foreign "gl" "uniform1i" ---
+uniform2f                      :: (loc: GLUniformLocation, x: GLfloat, y: GLfloat) -> void #foreign "gl" "uniform2f" ---
+uniform2i                      :: (loc: GLUniformLocation, x: GLint, y: GLint) -> void #foreign "gl" "uniform2i" ---
+uniform3f                      :: (loc: GLUniformLocation, x: GLfloat, y: GLfloat, z: GLfloat) -> void #foreign "gl" "uniform3f" ---
+uniform3i                      :: (loc: GLUniformLocation, x: GLint, y: GLint, z: GLint) -> void #foreign "gl" "uniform3i" ---
+uniform4f                      :: (loc: GLUniformLocation, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) -> void #foreign "gl" "uniform4f" ---
+uniform4i                      :: (loc: GLUniformLocation, x: GLint, y: GLint, z: GLint, w: GLint) -> void #foreign "gl" "uniform4i" ---
+uniformMatrix2                 :: (loc: GLUniformLocation, transpose: GLboolean, value: GLMat2) -> void #foreign "gl" "uniformMatrix2" ---
+uniformMatrix3                 :: (loc: GLUniformLocation, transpose: GLboolean, value: GLMat3) -> void #foreign "gl" "uniformMatrix3" ---
+uniformMatrix4                 :: (loc: GLUniformLocation, transpose: GLboolean, value: GLMat4) -> void #foreign "gl" "uniformMatrix4" ---
+useProgram                     :: (program: GLProgram) -> void #foreign "gl" "useProgram" ---
+validateProgram                :: (program: GLProgram) -> void #foreign "gl" "validateProgram" ---
+vertexAttrib1f                 :: (idx: GLuint, x: GLfloat) -> void #foreign "gl" "vertexAttrib1f" ---
+vertexAttrib2f                 :: (idx: GLuint, x: GLfloat, y: GLfloat) -> void #foreign "gl" "vertexAttrib2f" ---
+vertexAttrib3f                 :: (idx: GLuint, x: GLfloat, y: GLfloat, z: GLfloat) -> void #foreign "gl" "vertexAttrib3f" ---
+vertexAttrib4f                 :: (idx: GLuint, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) -> void #foreign "gl" "vertexAttrib4f" ---
+vertexAttribIPointer           :: (idx: GLuint, size: GLint, type: GLenum, stride: GLsizei, offset: GLint) -> void #foreign "gl" "vertexAttribIPointer" ---
+vertexAttribPointer            :: (idx: GLuint, size: GLint, type: GLenum, normalized: GLboolean, stride: GLsizei, offset: GLint) -> void #foreign "gl" "vertexAttribPointer" ---
+vertexAttribDivisor            :: (idx: GLuint, divisor: GLuint) -> void #foreign "gl" "vertexAttribDivisor" ---
+viewport                       :: (x: GLint, y: GLint, width: GLsizei, height: GLsizei) -> void #foreign "gl" "viewport" ---