--- /dev/null
+
+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);
+ }
+ }
+};
[ "$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='.'
+++ /dev/null
-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); },
-
-};
+++ /dev/null
-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" ---
--- /dev/null
+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;
+ };
+ },
+});
--- /dev/null
+// 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" ---
--- /dev/null
+
+#load "modules/js_events/js_events"
--- /dev/null
+
+#load "modules/webgl2/webgl2"
--- /dev/null
+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); },
+});
--- /dev/null
+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" ---