aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library_gl.js1481
-rw-r--r--tests/aniso.c16
-rw-r--r--tests/gl_ps.c40
-rw-r--r--tests/gl_ps_workaround.c230
-rw-r--r--tests/gl_ps_workaround2.c230
-rw-r--r--tests/glbegin_points.c44
-rwxr-xr-xtests/runner.py168
-rw-r--r--tests/s3tc.c16
-rw-r--r--tests/s3tc_crunch.c16
-rw-r--r--tests/sdl_fog_density.c48
-rw-r--r--tests/sdl_fog_exp2.c48
-rw-r--r--tests/sdl_fog_linear.c48
-rw-r--r--tests/sdl_fog_negative.c48
-rw-r--r--tests/sdl_fog_simple.c51
-rw-r--r--tests/sdl_ogl.c48
-rw-r--r--tests/sdl_ogl_defaultMatrixMode.c46
-rw-r--r--tests/sdl_ogl_p.c44
-rw-r--r--third_party/lzma.js/lzip/Makefile18
18 files changed, 1609 insertions, 1031 deletions
diff --git a/src/library_gl.js b/src/library_gl.js
index ba99eaa8..ac8d9bf7 100644
--- a/src/library_gl.js
+++ b/src/library_gl.js
@@ -373,7 +373,7 @@ var LibraryGL = {
glGetIntegerv__sig: 'vii',
glGetIntegerv: function(name_, p) {
- switch(name_) { // Handle a few trivial GLES values
+ switch(name_) { // Handle a few trivial GLES values
case 0x8DFA: // GL_SHADER_COMPILER
{{{ makeSetValue('p', '0', '1', 'i32') }}};
return;
@@ -507,7 +507,7 @@ var LibraryGL = {
glGenTextures__sig: 'vii',
glGenTextures: function(n, textures) {
for (var i = 0; i < n; i++) {
- var id = GL.getNewId(GL.textures);
+ var id = GL.getNewId(GL.textures);
GL.textures[id] = Module.ctx.createTexture();
{{{ makeSetValue('textures', 'i*4', 'id', 'i32') }}};
}
@@ -726,7 +726,7 @@ var LibraryGL = {
var ptable = GL.uniformTable[program];
if (!ptable) ptable = GL.uniformTable[program] = {};
var id = ptable[name];
- if (id) return id;
+ if (id) return id;
var loc = Module.ctx.getUniformLocation(GL.programs[program], name);
if (!loc) return -1;
id = GL.getNewId(GL.uniforms);
@@ -989,13 +989,16 @@ var LibraryGL = {
glBindBuffer__sig: 'vii',
glBindBuffer: function(target, buffer) {
+ var bufferObj = buffer ? GL.buffers[buffer] : null;
+
if (target == Module.ctx.ARRAY_BUFFER) {
GL.currArrayBuffer = buffer;
+ GL.currArrayBufferObj = bufferObj;
} else if (target == Module.ctx.ELEMENT_ARRAY_BUFFER) {
GL.currElementArrayBuffer = buffer;
}
- Module.ctx.bindBuffer(target, buffer ? GL.buffers[buffer] : null);
+ Module.ctx.bindBuffer(target, bufferObj);
},
glVertexAttrib1fv__sig: 'vii',
@@ -1275,7 +1278,15 @@ var LibraryGL = {
currentVao: null,
enabledVertexAttribArrays: {}, // helps with vao cleanups
+ hasRunInit: false,
+
init: function() {
+ if (GLEmulation.hasRunInit) {
+ return;
+ }
+
+ GLEmulation.hasRunInit = true;
+
GLEmulation.fogColor = new Float32Array(4);
// Add some emulation workarounds
@@ -1297,6 +1308,7 @@ var LibraryGL = {
0x80A0: 1 // GL_SAMPLE_COVERAGE
};
+ var glEnable = _glEnable;
_glEnable = function(cap) {
// Clean up the renderer on any change to the rendering state. The optimization of
// skipping renderer setup is aimed at the case of multiple glDraw* right after each other
@@ -1307,13 +1319,18 @@ var LibraryGL = {
} else if (cap == 0x0de1 /* GL_TEXTURE_2D */) {
// XXX not according to spec, and not in desktop GL, but works in some GLES1.x apparently, so support
// it by forwarding to glEnableClientState
+ /* Actually, let's not, for now. (This sounds exceedingly broken)
+ * This is in gl_ps_workaround2.c.
_glEnableClientState(cap);
+ */
return;
} else if (!(cap in validCapabilities)) {
return;
}
- Module.ctx.enable(cap);
+ glEnable(cap);
};
+
+ var glDisable = _glDisable;
_glDisable = function(cap) {
if (GL.immediate.lastRenderer) GL.immediate.lastRenderer.cleanup();
if (cap == 0x0B60 /* GL_FOG */) {
@@ -1322,12 +1339,15 @@ var LibraryGL = {
} else if (cap == 0x0de1 /* GL_TEXTURE_2D */) {
// XXX not according to spec, and not in desktop GL, but works in some GLES1.x apparently, so support
// it by forwarding to glDisableClientState
+ /* Actually, let's not, for now. (This sounds exceedingly broken)
+ * This is in gl_ps_workaround2.c.
_glDisableClientState(cap);
+ */
return;
} else if (!(cap in validCapabilities)) {
return;
}
- Module.ctx.disable(cap);
+ glDisable(cap);
};
_glIsEnabled = function(cap) {
if (cap == 0x0B60 /* GL_FOG */) {
@@ -1453,6 +1473,7 @@ var LibraryGL = {
_glShaderSource = function(shader, count, string, length) {
var source = GL.getSource(shader, count, string, length);
#if GL_DEBUG
+ console.log("glShaderSource: Input: \n" + source);
GL.shaderOriginalSources[shader] = source;
#endif
// XXX We add attributes and uniforms to shaders. The program can ask for the # of them, and see the
@@ -1510,9 +1531,7 @@ var LibraryGL = {
}
if (source.indexOf('gl_Color') >= 0) {
source = 'attribute vec4 a_color; \n' +
- 'uniform vec4 u_color; \n' +
- 'uniform int u_hasColorAttrib; \n' +
- source.replace(/gl_Color/g, '(u_hasColorAttrib > 0 ? a_color : u_color)');
+ source.replace(/gl_Color/g, 'a_color');
}
if (source.indexOf('gl_Normal') >= 0) {
source = 'attribute vec3 a_normal; \n' +
@@ -1558,6 +1577,7 @@ var LibraryGL = {
}
#if GL_DEBUG
GL.shaderSources[shader] = source;
+ console.log("glShaderSource: Output: \n" + source);
#endif
Module.ctx.shaderSource(GL.shaders[shader], source);
};
@@ -1706,8 +1726,12 @@ var LibraryGL = {
getAttributeFromCapability: function(cap) {
var attrib = null;
switch (cap) {
- case 0x8078: // GL_TEXTURE_COORD_ARRAY
case 0x0de1: // GL_TEXTURE_2D - XXX not according to spec, and not in desktop GL, but works in some GLES1.x apparently, so support it
+#if ASSERTIONS
+ abort("GL_TEXTURE_2D is not a spec-defined capability for gl{Enable,Disable}ClientState.");
+#endif
+ // Fall through:
+ case 0x8078: // GL_TEXTURE_COORD_ARRAY
attrib = GL.immediate.TEXTURE0 + GL.immediate.clientActiveTexture; break;
case 0x8074: // GL_VERTEX_ARRAY
attrib = GL.immediate.VERTEX; break;
@@ -1767,19 +1791,19 @@ var LibraryGL = {
case 'glEnableVertexAttribArray': ret = {{{ Functions.getIndex('_glEnableVertexAttribArray', true) }}}; break;
case 'glDisableVertexAttribArray': ret = {{{ Functions.getIndex('_glDisableVertexAttribArray', true) }}}; break;
case 'glVertexAttribPointer': ret = {{{ Functions.getIndex('_glVertexAttribPointer', true) }}}; break;
- case 'glVertexAttrib1f': ret = {{{ Functions.getIndex('_glVertexAttrib1f', true) }}}; break;
- case 'glVertexAttrib2f': ret = {{{ Functions.getIndex('_glVertexAttrib2f', true) }}}; break;
- case 'glVertexAttrib3f': ret = {{{ Functions.getIndex('_glVertexAttrib3f', true) }}}; break;
- case 'glVertexAttrib4f': ret = {{{ Functions.getIndex('_glVertexAttrib4f', true) }}}; break;
- case 'glVertexAttrib1fv': ret = {{{ Functions.getIndex('_glVertexAttrib1fv', true) }}}; break;
- case 'glVertexAttrib2fv': ret = {{{ Functions.getIndex('_glVertexAttrib2fv', true) }}}; break;
- case 'glVertexAttrib3fv': ret = {{{ Functions.getIndex('_glVertexAttrib3fv', true) }}}; break;
- case 'glVertexAttrib4fv': ret = {{{ Functions.getIndex('_glVertexAttrib4fv', true) }}}; break;
- case 'glGetVertexAttribfv': ret = {{{ Functions.getIndex('_glGetVertexAttribfv', true) }}}; break;
- case 'glGetVertexAttribiv': ret = {{{ Functions.getIndex('_glGetVertexAttribiv', true) }}}; break;
- case 'glGetVertexAttribPointerv': ret = {{{ Functions.getIndex('_glGetVertexAttribPointerv', true) }}}; break;
- case 'glGetAttribLocation': ret = {{{ Functions.getIndex('_glGetAttribLocation', true) }}}; break;
- case 'glGetActiveAttrib': ret = {{{ Functions.getIndex('_glGetActiveAttrib', true) }}}; break;
+ case 'glVertexAttrib1f': ret = {{{ Functions.getIndex('_glVertexAttrib1f', true) }}}; break;
+ case 'glVertexAttrib2f': ret = {{{ Functions.getIndex('_glVertexAttrib2f', true) }}}; break;
+ case 'glVertexAttrib3f': ret = {{{ Functions.getIndex('_glVertexAttrib3f', true) }}}; break;
+ case 'glVertexAttrib4f': ret = {{{ Functions.getIndex('_glVertexAttrib4f', true) }}}; break;
+ case 'glVertexAttrib1fv': ret = {{{ Functions.getIndex('_glVertexAttrib1fv', true) }}}; break;
+ case 'glVertexAttrib2fv': ret = {{{ Functions.getIndex('_glVertexAttrib2fv', true) }}}; break;
+ case 'glVertexAttrib3fv': ret = {{{ Functions.getIndex('_glVertexAttrib3fv', true) }}}; break;
+ case 'glVertexAttrib4fv': ret = {{{ Functions.getIndex('_glVertexAttrib4fv', true) }}}; break;
+ case 'glGetVertexAttribfv': ret = {{{ Functions.getIndex('_glGetVertexAttribfv', true) }}}; break;
+ case 'glGetVertexAttribiv': ret = {{{ Functions.getIndex('_glGetVertexAttribiv', true) }}}; break;
+ case 'glGetVertexAttribPointerv': ret = {{{ Functions.getIndex('_glGetVertexAttribPointerv', true) }}}; break;
+ case 'glGetAttribLocation': ret = {{{ Functions.getIndex('_glGetAttribLocation', true) }}}; break;
+ case 'glGetActiveAttrib': ret = {{{ Functions.getIndex('_glGetActiveAttrib', true) }}}; break;
case 'glBindRenderbuffer': ret = {{{ Functions.getIndex('_glBindRenderbuffer', true) }}}; break;
case 'glDeleteRenderbuffers': ret = {{{ Functions.getIndex('_glDeleteRenderbuffers', true) }}}; break;
case 'glGenRenderbuffers': ret = {{{ Functions.getIndex('_glGenRenderbuffers', true) }}}; break;
@@ -1798,86 +1822,86 @@ var LibraryGL = {
case 'glDeleteVertexArrays': ret = {{{ Functions.getIndex('_glDeleteVertexArrays', true) }}}; break;
case 'glBindVertexArray': ret = {{{ Functions.getIndex('_glBindVertexArray', true) }}}; break;
case 'glGetString': ret = {{{ Functions.getIndex('_glGetString', true) }}}; break;
- case 'glBindTexture': ret = {{{ Functions.getIndex('_glBindTexture', true) }}}; break;
- case 'glGetBufferParameteriv': ret = {{{ Functions.getIndex('_glGetBufferParameteriv', true) }}}; break;
- case 'glIsBuffer': ret = {{{ Functions.getIndex('_glIsBuffer', true) }}}; break;
- case 'glDeleteShader': ret = {{{ Functions.getIndex('_glDeleteShader', true) }}}; break;
+ case 'glBindTexture': ret = {{{ Functions.getIndex('_glBindTexture', true) }}}; break;
+ case 'glGetBufferParameteriv': ret = {{{ Functions.getIndex('_glGetBufferParameteriv', true) }}}; break;
+ case 'glIsBuffer': ret = {{{ Functions.getIndex('_glIsBuffer', true) }}}; break;
+ case 'glDeleteShader': ret = {{{ Functions.getIndex('_glDeleteShader', true) }}}; break;
case 'glUniformMatrix2fv': ret = {{{ Functions.getIndex('_glUniformMatrix2fv', true) }}}; break;
case 'glUniformMatrix3fv': ret = {{{ Functions.getIndex('_glUniformMatrix3fv', true) }}}; break;
case 'glUniformMatrix4fv': ret = {{{ Functions.getIndex('_glUniformMatrix4fv', true) }}}; break;
- case 'glIsRenderbuffer': ret = {{{ Functions.getIndex('_glIsRenderbuffer', true) }}}; break;
- case 'glBlendEquation': ret = {{{ Functions.getIndex('_glBlendEquation', true) }}}; break;
- case 'glBlendFunc': ret = {{{ Functions.getIndex('_glBlendFunc', true) }}}; break;
- case 'glBlendFuncSeparate': ret = {{{ Functions.getIndex('_glBlendFuncSeparate', true) }}}; break;
- case 'glBlendEquationSeparate': ret = {{{ Functions.getIndex('_glBlendEquationSeparate', true) }}}; break;
- case 'glDepthRangef': ret = {{{ Functions.getIndex('_glDepthRangef', true) }}}; break;
- case 'glClear': ret = {{{ Functions.getIndex('_glClear', true) }}}; break;
- case 'glGenerateMipmap': ret = {{{ Functions.getIndex('_glGenerateMipmap', true) }}}; break;
- case 'glBlendColor': ret = {{{ Functions.getIndex('_glBlendColor', true) }}}; break;
- case 'glClearDepthf': ret = {{{ Functions.getIndex('_glClearDepthf', true) }}}; break;
- case 'glDeleteProgram': ret = {{{ Functions.getIndex('_glDeleteProgram', true) }}}; break;
- case 'glUniformMatrix3fv': ret = {{{ Functions.getIndex('_glUniformMatrix3fv', true) }}}; break;
- case 'glClearColor': ret = {{{ Functions.getIndex('_glClearColor', true) }}}; break;
- case 'glGetRenderbufferParameteriv': ret = {{{ Functions.getIndex('_glGetRenderbufferParameteriv', true) }}}; break;
- case 'glGetShaderInfoLog': ret = {{{ Functions.getIndex('_glGetShaderInfoLog', true) }}}; break;
- case 'glUniformMatrix4fv': ret = {{{ Functions.getIndex('_glUniformMatrix4fv', true) }}}; break;
- case 'glClearStencil': ret = {{{ Functions.getIndex('_glClearStencil', true) }}}; break;
- case 'glGetProgramInfoLog': ret = {{{ Functions.getIndex('_glGetProgramInfoLog', true) }}}; break;
- case 'glGetUniformfv': ret = {{{ Functions.getIndex('_glGetUniformfv', true) }}}; break;
- case 'glStencilFuncSeparate': ret = {{{ Functions.getIndex('_glStencilFuncSeparate', true) }}}; break;
- case 'glSampleCoverage': ret = {{{ Functions.getIndex('_glSampleCoverage', true) }}}; break;
- case 'glColorMask': ret = {{{ Functions.getIndex('_glColorMask', true) }}}; break;
- case 'glGetShaderiv': ret = {{{ Functions.getIndex('_glGetShaderiv', true) }}}; break;
- case 'glGetUniformiv': ret = {{{ Functions.getIndex('_glGetUniformiv', true) }}}; break;
- case 'glCopyTexSubImage2D': ret = {{{ Functions.getIndex('_glCopyTexSubImage2D', true) }}}; break;
- case 'glDetachShader': ret = {{{ Functions.getIndex('_glDetachShader', true) }}}; break;
- case 'glGetShaderSource': ret = {{{ Functions.getIndex('_glGetShaderSource', true) }}}; break;
- case 'glDeleteTextures': ret = {{{ Functions.getIndex('_glDeleteTextures', true) }}}; break;
- case 'glGetAttachedShaders': ret = {{{ Functions.getIndex('_glGetAttachedShaders', true) }}}; break;
- case 'glValidateProgram': ret = {{{ Functions.getIndex('_glValidateProgram', true) }}}; break;
- case 'glDepthFunc': ret = {{{ Functions.getIndex('_glDepthFunc', true) }}}; break;
- case 'glIsShader': ret = {{{ Functions.getIndex('_glIsShader', true) }}}; break;
- case 'glDepthMask': ret = {{{ Functions.getIndex('_glDepthMask', true) }}}; break;
- case 'glStencilMaskSeparate': ret = {{{ Functions.getIndex('_glStencilMaskSeparate', true) }}}; break;
- case 'glIsProgram': ret = {{{ Functions.getIndex('_glIsProgram', true) }}}; break;
- case 'glDisable': ret = {{{ Functions.getIndex('_glDisable', true) }}}; break;
- case 'glStencilOpSeparate': ret = {{{ Functions.getIndex('_glStencilOpSeparate', true) }}}; break;
- case 'glDrawArrays': ret = {{{ Functions.getIndex('_glDrawArrays', true) }}}; break;
- case 'glDrawElements': ret = {{{ Functions.getIndex('_glDrawElements', true) }}}; break;
- case 'glEnable': ret = {{{ Functions.getIndex('_glEnable', true) }}}; break;
- case 'glFinish': ret = {{{ Functions.getIndex('_glFinish', true) }}}; break;
- case 'glFlush': ret = {{{ Functions.getIndex('_glFlush', true) }}}; break;
- case 'glFrontFace': ret = {{{ Functions.getIndex('_glFrontFace', true) }}}; break;
- case 'glCullFace': ret = {{{ Functions.getIndex('_glCullFace', true) }}}; break;
- case 'glGenTextures': ret = {{{ Functions.getIndex('_glGenTextures', true) }}}; break;
- case 'glGetError': ret = {{{ Functions.getIndex('_glGetError', true) }}}; break;
- case 'glGetIntegerv': ret = {{{ Functions.getIndex('_glGetIntegerv', true) }}}; break;
- case 'glGetBooleanv': ret = {{{ Functions.getIndex('_glGetBooleanv', true) }}}; break;
- case 'glGetFloatv': ret = {{{ Functions.getIndex('_glGetFloatv', true) }}}; break;
- case 'glHint': ret = {{{ Functions.getIndex('_glHint', true) }}}; break;
- case 'glIsTexture': ret = {{{ Functions.getIndex('_glIsTexture', true) }}}; break;
- case 'glPixelStorei': ret = {{{ Functions.getIndex('_glPixelStorei', true) }}}; break;
- case 'glReadPixels': ret = {{{ Functions.getIndex('_glReadPixels', true) }}}; break;
- case 'glScissor': ret = {{{ Functions.getIndex('_glScissor', true) }}}; break;
- case 'glStencilFunc': ret = {{{ Functions.getIndex('_glStencilFunc', true) }}}; break;
- case 'glStencilMask': ret = {{{ Functions.getIndex('_glStencilMask', true) }}}; break;
- case 'glStencilOp': ret = {{{ Functions.getIndex('_glStencilOp', true) }}}; break;
- case 'glTexImage2D': ret = {{{ Functions.getIndex('_glTexImage2D', true) }}}; break;
- case 'glTexParameterf': ret = {{{ Functions.getIndex('_glTexParameterf', true) }}}; break;
- case 'glTexParameterfv': ret = {{{ Functions.getIndex('_glTexParameterfv', true) }}}; break;
- case 'glTexParameteri': ret = {{{ Functions.getIndex('_glTexParameteri', true) }}}; break;
- case 'glTexParameteriv': ret = {{{ Functions.getIndex('_glTexParameteriv', true) }}}; break;
- case 'glGetTexParameterfv': ret = {{{ Functions.getIndex('_glGetTexParameterfv', true) }}}; break;
- case 'glGetTexParameteriv': ret = {{{ Functions.getIndex('_glGetTexParameteriv', true) }}}; break;
- case 'glTexSubImage2D': ret = {{{ Functions.getIndex('_glTexSubImage2D', true) }}}; break;
- case 'glCopyTexImage2D': ret = {{{ Functions.getIndex('_glCopyTexImage2D', true) }}}; break;
- case 'glViewport': ret = {{{ Functions.getIndex('_glViewport', true) }}}; break;
- case 'glIsEnabled': ret = {{{ Functions.getIndex('_glIsEnabled', true) }}}; break;
- case 'glLineWidth': ret = {{{ Functions.getIndex('_glLineWidth', true) }}}; break;
- case 'glPolygonOffset': ret = {{{ Functions.getIndex('_glPolygonOffset', true) }}}; break;
- case 'glReleaseShaderCompiler': ret = {{{ Functions.getIndex('_glReleaseShaderCompiler', true) }}}; break;
- case 'glGetShaderPrecisionFormat': ret = {{{ Functions.getIndex('_glGetShaderPrecisionFormat', true) }}}; break;
- case 'glShaderBinary': ret = {{{ Functions.getIndex('_glShaderBinary', true) }}}; break;
+ case 'glIsRenderbuffer': ret = {{{ Functions.getIndex('_glIsRenderbuffer', true) }}}; break;
+ case 'glBlendEquation': ret = {{{ Functions.getIndex('_glBlendEquation', true) }}}; break;
+ case 'glBlendFunc': ret = {{{ Functions.getIndex('_glBlendFunc', true) }}}; break;
+ case 'glBlendFuncSeparate': ret = {{{ Functions.getIndex('_glBlendFuncSeparate', true) }}}; break;
+ case 'glBlendEquationSeparate': ret = {{{ Functions.getIndex('_glBlendEquationSeparate', true) }}}; break;
+ case 'glDepthRangef': ret = {{{ Functions.getIndex('_glDepthRangef', true) }}}; break;
+ case 'glClear': ret = {{{ Functions.getIndex('_glClear', true) }}}; break;
+ case 'glGenerateMipmap': ret = {{{ Functions.getIndex('_glGenerateMipmap', true) }}}; break;
+ case 'glBlendColor': ret = {{{ Functions.getIndex('_glBlendColor', true) }}}; break;
+ case 'glClearDepthf': ret = {{{ Functions.getIndex('_glClearDepthf', true) }}}; break;
+ case 'glDeleteProgram': ret = {{{ Functions.getIndex('_glDeleteProgram', true) }}}; break;
+ case 'glUniformMatrix3fv': ret = {{{ Functions.getIndex('_glUniformMatrix3fv', true) }}}; break;
+ case 'glClearColor': ret = {{{ Functions.getIndex('_glClearColor', true) }}}; break;
+ case 'glGetRenderbufferParameteriv': ret = {{{ Functions.getIndex('_glGetRenderbufferParameteriv', true) }}}; break;
+ case 'glGetShaderInfoLog': ret = {{{ Functions.getIndex('_glGetShaderInfoLog', true) }}}; break;
+ case 'glUniformMatrix4fv': ret = {{{ Functions.getIndex('_glUniformMatrix4fv', true) }}}; break;
+ case 'glClearStencil': ret = {{{ Functions.getIndex('_glClearStencil', true) }}}; break;
+ case 'glGetProgramInfoLog': ret = {{{ Functions.getIndex('_glGetProgramInfoLog', true) }}}; break;
+ case 'glGetUniformfv': ret = {{{ Functions.getIndex('_glGetUniformfv', true) }}}; break;
+ case 'glStencilFuncSeparate': ret = {{{ Functions.getIndex('_glStencilFuncSeparate', true) }}}; break;
+ case 'glSampleCoverage': ret = {{{ Functions.getIndex('_glSampleCoverage', true) }}}; break;
+ case 'glColorMask': ret = {{{ Functions.getIndex('_glColorMask', true) }}}; break;
+ case 'glGetShaderiv': ret = {{{ Functions.getIndex('_glGetShaderiv', true) }}}; break;
+ case 'glGetUniformiv': ret = {{{ Functions.getIndex('_glGetUniformiv', true) }}}; break;
+ case 'glCopyTexSubImage2D': ret = {{{ Functions.getIndex('_glCopyTexSubImage2D', true) }}}; break;
+ case 'glDetachShader': ret = {{{ Functions.getIndex('_glDetachShader', true) }}}; break;
+ case 'glGetShaderSource': ret = {{{ Functions.getIndex('_glGetShaderSource', true) }}}; break;
+ case 'glDeleteTextures': ret = {{{ Functions.getIndex('_glDeleteTextures', true) }}}; break;
+ case 'glGetAttachedShaders': ret = {{{ Functions.getIndex('_glGetAttachedShaders', true) }}}; break;
+ case 'glValidateProgram': ret = {{{ Functions.getIndex('_glValidateProgram', true) }}}; break;
+ case 'glDepthFunc': ret = {{{ Functions.getIndex('_glDepthFunc', true) }}}; break;
+ case 'glIsShader': ret = {{{ Functions.getIndex('_glIsShader', true) }}}; break;
+ case 'glDepthMask': ret = {{{ Functions.getIndex('_glDepthMask', true) }}}; break;
+ case 'glStencilMaskSeparate': ret = {{{ Functions.getIndex('_glStencilMaskSeparate', true) }}}; break;
+ case 'glIsProgram': ret = {{{ Functions.getIndex('_glIsProgram', true) }}}; break;
+ case 'glDisable': ret = {{{ Functions.getIndex('_glDisable', true) }}}; break;
+ case 'glStencilOpSeparate': ret = {{{ Functions.getIndex('_glStencilOpSeparate', true) }}}; break;
+ case 'glDrawArrays': ret = {{{ Functions.getIndex('_glDrawArrays', true) }}}; break;
+ case 'glDrawElements': ret = {{{ Functions.getIndex('_glDrawElements', true) }}}; break;
+ case 'glEnable': ret = {{{ Functions.getIndex('_glEnable', true) }}}; break;
+ case 'glFinish': ret = {{{ Functions.getIndex('_glFinish', true) }}}; break;
+ case 'glFlush': ret = {{{ Functions.getIndex('_glFlush', true) }}}; break;
+ case 'glFrontFace': ret = {{{ Functions.getIndex('_glFrontFace', true) }}}; break;
+ case 'glCullFace': ret = {{{ Functions.getIndex('_glCullFace', true) }}}; break;
+ case 'glGenTextures': ret = {{{ Functions.getIndex('_glGenTextures', true) }}}; break;
+ case 'glGetError': ret = {{{ Functions.getIndex('_glGetError', true) }}}; break;
+ case 'glGetIntegerv': ret = {{{ Functions.getIndex('_glGetIntegerv', true) }}}; break;
+ case 'glGetBooleanv': ret = {{{ Functions.getIndex('_glGetBooleanv', true) }}}; break;
+ case 'glGetFloatv': ret = {{{ Functions.getIndex('_glGetFloatv', true) }}}; break;
+ case 'glHint': ret = {{{ Functions.getIndex('_glHint', true) }}}; break;
+ case 'glIsTexture': ret = {{{ Functions.getIndex('_glIsTexture', true) }}}; break;
+ case 'glPixelStorei': ret = {{{ Functions.getIndex('_glPixelStorei', true) }}}; break;
+ case 'glReadPixels': ret = {{{ Functions.getIndex('_glReadPixels', true) }}}; break;
+ case 'glScissor': ret = {{{ Functions.getIndex('_glScissor', true) }}}; break;
+ case 'glStencilFunc': ret = {{{ Functions.getIndex('_glStencilFunc', true) }}}; break;
+ case 'glStencilMask': ret = {{{ Functions.getIndex('_glStencilMask', true) }}}; break;
+ case 'glStencilOp': ret = {{{ Functions.getIndex('_glStencilOp', true) }}}; break;
+ case 'glTexImage2D': ret = {{{ Functions.getIndex('_glTexImage2D', true) }}}; break;
+ case 'glTexParameterf': ret = {{{ Functions.getIndex('_glTexParameterf', true) }}}; break;
+ case 'glTexParameterfv': ret = {{{ Functions.getIndex('_glTexParameterfv', true) }}}; break;
+ case 'glTexParameteri': ret = {{{ Functions.getIndex('_glTexParameteri', true) }}}; break;
+ case 'glTexParameteriv': ret = {{{ Functions.getIndex('_glTexParameteriv', true) }}}; break;
+ case 'glGetTexParameterfv': ret = {{{ Functions.getIndex('_glGetTexParameterfv', true) }}}; break;
+ case 'glGetTexParameteriv': ret = {{{ Functions.getIndex('_glGetTexParameteriv', true) }}}; break;
+ case 'glTexSubImage2D': ret = {{{ Functions.getIndex('_glTexSubImage2D', true) }}}; break;
+ case 'glCopyTexImage2D': ret = {{{ Functions.getIndex('_glCopyTexImage2D', true) }}}; break;
+ case 'glViewport': ret = {{{ Functions.getIndex('_glViewport', true) }}}; break;
+ case 'glIsEnabled': ret = {{{ Functions.getIndex('_glIsEnabled', true) }}}; break;
+ case 'glLineWidth': ret = {{{ Functions.getIndex('_glLineWidth', true) }}}; break;
+ case 'glPolygonOffset': ret = {{{ Functions.getIndex('_glPolygonOffset', true) }}}; break;
+ case 'glReleaseShaderCompiler': ret = {{{ Functions.getIndex('_glReleaseShaderCompiler', true) }}}; break;
+ case 'glGetShaderPrecisionFormat': ret = {{{ Functions.getIndex('_glGetShaderPrecisionFormat', true) }}}; break;
+ case 'glShaderBinary': ret = {{{ Functions.getIndex('_glShaderBinary', true) }}}; break;
}
if (!ret) Module.printErr('WARNING: getProcAddress failed for ' + name);
return ret;
@@ -1963,7 +1987,873 @@ var LibraryGL = {
$GLImmediate__postset: 'GL.immediate.setupFuncs(); Browser.moduleContextCreatedCallbacks.push(function() { GL.immediate.init() });',
$GLImmediate__deps: ['$Browser', '$GL', '$GLEmulation'],
$GLImmediate: {
- MAX_TEXTURES: 7,
+ MapTreeLib: null,
+ spawnMapTreeLib: function() {
+ /* A naive implementation of a map backed by an array, and accessed by
+ * naive iteration along the array. (hashmap with only one bucket)
+ */
+ function CNaiveListMap() {
+ var list = [];
+
+ this.insert = function(key, val) {
+ if (this.contains(key|0)) return false;
+ list.push([key, val]);
+ return true;
+ };
+
+ var __contains_i;
+ this.contains = function(key) {
+ for (__contains_i = 0; __contains_i < list.length; ++__contains_i) {
+ if (list[__contains_i][0] === key) return true;
+ }
+ return false;
+ };
+
+ var __get_i;
+ this.get = function(key) {
+ for (__get_i = 0; __get_i < list.length; ++__get_i) {
+ if (list[__get_i][0] === key) return list[__get_i][1];
+ }
+ return undefined;
+ };
+ };
+
+ /* A tree of map nodes.
+ Uses `KeyView`s to allow descending the tree without garbage.
+ Example: {
+ // Create our map object.
+ var map = new ObjTreeMap();
+
+ // Grab the static keyView for the map.
+ var keyView = map.GetStaticKeyView();
+
+ // Let's make a map for:
+ // root: <undefined>
+ // 1: <undefined>
+ // 2: <undefined>
+ // 5: "Three, sir!"
+ // 3: "Three!"
+
+ // Note how we can chain together `Reset` and `Next` to
+ // easily descend based on multiple key fragments.
+ keyView.Reset().Next(1).Next(2).Next(5).Set("Three, sir!");
+ keyView.Reset().Next(1).Next(2).Next(3).Set("Three!");
+ }
+ */
+ function CMapTree() {
+ function CNLNode() {
+ var map = new CNaiveListMap();
+
+ this.child = function(keyFrag) {
+ if (!map.contains(keyFrag|0)) {
+ map.insert(keyFrag|0, new CNLNode());
+ }
+ return map.get(keyFrag|0);
+ };
+
+ this.value = undefined;
+ this.get = function() {
+ return this.value;
+ };
+
+ this.set = function(val) {
+ this.value = val;
+ };
+ }
+
+ function CKeyView(root) {
+ var cur;
+
+ this.reset = function() {
+ cur = root;
+ return this;
+ };
+ this.reset();
+
+ this.next = function(keyFrag) {
+ cur = cur.child(keyFrag);
+ return this;
+ };
+
+ this.get = function() {
+ return cur.get();
+ };
+
+ this.set = function(val) {
+ cur.set(val);
+ };
+ };
+
+ var root;
+ var staticKeyView;
+
+ this.createKeyView = function() {
+ return new CKeyView(root);
+ }
+
+ this.clear = function() {
+ root = new CNLNode();
+ staticKeyView = this.createKeyView();
+ };
+ this.clear();
+
+ this.getStaticKeyView = function() {
+ staticKeyView.reset();
+ return staticKeyView;
+ };
+ };
+
+ // Exports:
+ return {
+ create: function() {
+ return new CMapTree();
+ },
+ };
+ },
+
+ TexEnvJIT: null,
+ spawnTexEnvJIT: function() {
+ // GL defs:
+ var GL_TEXTURE0 = 0x84C0;
+ var GL_TEXTURE_1D = 0x0DE0;
+ var GL_TEXTURE_2D = 0x0DE1;
+ var GL_TEXTURE_3D = 0x806f;
+ var GL_TEXTURE_CUBE_MAP = 0x8513;
+ var GL_TEXTURE_ENV = 0x2300;
+ var GL_TEXTURE_ENV_MODE = 0x2200;
+ var GL_TEXTURE_ENV_COLOR = 0x2201;
+ var GL_TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515;
+ var GL_TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516;
+ var GL_TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517;
+ var GL_TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518;
+ var GL_TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519;
+ var GL_TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A;
+
+ var GL_SRC0_RGB = 0x8580;
+ var GL_SRC1_RGB = 0x8581;
+ var GL_SRC2_RGB = 0x8582;
+
+ var GL_SRC0_ALPHA = 0x8588;
+ var GL_SRC1_ALPHA = 0x8589;
+ var GL_SRC2_ALPHA = 0x858A;
+
+ var GL_OPERAND0_RGB = 0x8590;
+ var GL_OPERAND1_RGB = 0x8591;
+ var GL_OPERAND2_RGB = 0x8592;
+
+ var GL_OPERAND0_ALPHA = 0x8598;
+ var GL_OPERAND1_ALPHA = 0x8599;
+ var GL_OPERAND2_ALPHA = 0x859A;
+
+ var GL_COMBINE_RGB = 0x8571;
+ var GL_COMBINE_ALPHA = 0x8572;
+
+ var GL_RGB_SCALE = 0x8573;
+ var GL_ALPHA_SCALE = 0x0D1C;
+
+ // env.mode
+ var GL_ADD = 0x0104;
+ var GL_BLEND = 0x0BE2;
+ var GL_REPLACE = 0x1E01;
+ var GL_MODULATE = 0x2100;
+ var GL_DECAL = 0x2101;
+ var GL_COMBINE = 0x8570;
+
+ // env.color/alphaCombiner
+ //var GL_ADD = 0x0104;
+ //var GL_REPLACE = 0x1E01;
+ //var GL_MODULATE = 0x2100;
+ var GL_SUBTRACT = 0x84E7;
+ var GL_INTERPOLATE = 0x8575;
+
+ // env.color/alphaSrc
+ var GL_TEXTURE = 0x1702;
+ var GL_CONSTANT = 0x8576;
+ var GL_PRIMARY_COLOR = 0x8577;
+ var GL_PREVIOUS = 0x8578;
+
+ // env.color/alphaOp
+ var GL_SRC_COLOR = 0x0300;
+ var GL_ONE_MINUS_SRC_COLOR = 0x0301;
+ var GL_SRC_ALPHA = 0x0302;
+ var GL_ONE_MINUS_SRC_ALPHA = 0x0303;
+
+ var GL_RGB = 0x1907;
+ var GL_RGBA = 0x1908;
+
+ // Our defs:
+ var TEXENVJIT_NAMESPACE_PREFIX = "tej_";
+ // Not actually constant, as they can be changed between JIT passes:
+ var TEX_UNIT_UNIFORM_PREFIX = "uTexUnit";
+ var TEX_COORD_VARYING_PREFIX = "vTexCoord";
+ var PRIM_COLOR_VARYING = "vPrimColor";
+ var TEX_MATRIX_UNIFORM_PREFIX = "uTexMatrix";
+
+ // Static vars:
+ var s_texUnits = null; //[];
+ var s_activeTexture = 0;
+
+ var s_requiredTexUnitsForPass = [];
+
+ // Static funcs:
+ function abort(info) {
+ assert(false, "[TexEnvJIT] ABORT: " + info);
+ }
+
+ function abort_noSupport(info) {
+ abort("No support: " + info);
+ }
+
+ function abort_sanity(info) {
+ abort("Sanity failure: " + info);
+ }
+
+ function genTexUnitSampleExpr(texUnitID) {
+ var texUnit = s_texUnits[texUnitID];
+ var texType = texUnit.getTexType();
+
+ var func = null;
+ switch (texType) {
+ case GL_TEXTURE_1D:
+ func = "texture2D";
+ break;
+ case GL_TEXTURE_2D:
+ func = "texture2D";
+ break;
+ case GL_TEXTURE_3D:
+ return abort_noSupport("No support for 3D textures.");
+ case GL_TEXTURE_CUBE_MAP:
+ func = "textureCube";
+ break;
+ default:
+ return abort_sanity("Unknown texType: 0x" + texType.toString(16));
+ }
+
+ var texCoordExpr = TEX_COORD_VARYING_PREFIX + texUnitID;
+ if (TEX_MATRIX_UNIFORM_PREFIX != null) {
+ texCoordExpr = "(" + TEX_MATRIX_UNIFORM_PREFIX + texUnitID + " * " + texCoordExpr + ")";
+ }
+ return func + "(" + TEX_UNIT_UNIFORM_PREFIX + texUnitID + ", " + texCoordExpr + ".xy)";
+ }
+
+ function getTypeFromCombineOp(op) {
+ switch (op) {
+ case GL_SRC_COLOR:
+ case GL_ONE_MINUS_SRC_COLOR:
+ return "vec3";
+ case GL_SRC_ALPHA:
+ case GL_ONE_MINUS_SRC_ALPHA:
+ return "float";
+ }
+
+ return Abort_NoSupport("Unsupported combiner op: 0x" + op.toString(16));
+ }
+
+ function getCurTexUnit() {
+ return s_texUnits[s_activeTexture];
+ }
+
+ function genCombinerSourceExpr(texUnitID, constantExpr, previousVar,
+ src, op)
+ {
+ var srcExpr = null;
+ switch (src) {
+ case GL_TEXTURE:
+ srcExpr = genTexUnitSampleExpr(texUnitID);
+ break;
+ case GL_CONSTANT:
+ srcExpr = constantExpr;
+ break;
+ case GL_PRIMARY_COLOR:
+ srcExpr = PRIM_COLOR_VARYING;
+ break;
+ case GL_PREVIOUS:
+ srcExpr = previousVar;
+ break;
+ default:
+ return abort_noSupport("Unsupported combiner src: 0x" + src.toString(16));
+ }
+
+ var expr = null;
+ switch (op) {
+ case GL_SRC_COLOR:
+ expr = srcExpr + ".rgb";
+ break;
+ case GL_ONE_MINUS_SRC_COLOR:
+ expr = "(vec3(1.0) - " + srcExpr + ".rgb)";
+ break;
+ case GL_SRC_ALPHA:
+ expr = srcExpr + ".a";
+ break;
+ case GL_ONE_MINUS_SRC_ALPHA:
+ expr = "(1.0 - " + srcExpr + ".a)";
+ break;
+ default:
+ return abort_noSupport("Unsupported combiner op: 0x" + op.toString(16));
+ }
+
+ return expr;
+ }
+
+ function valToFloatLiteral(val) {
+ if (val == Math.round(val)) return val + '.0';
+ return val;
+ }
+
+
+ // Classes:
+ function CTexEnv() {
+ this.mode = GL_MODULATE;
+ this.colorCombiner = GL_MODULATE;
+ this.alphaCombiner = GL_MODULATE;
+ this.colorScale = 1;
+ this.alphaScale = 1;
+ this.envColor = [0, 0, 0, 0];
+
+ this.colorSrc = [
+ GL_TEXTURE,
+ GL_PREVIOUS,
+ GL_CONSTANT
+ ];
+ this.alphaSrc = [
+ GL_TEXTURE,
+ GL_PREVIOUS,
+ GL_CONSTANT
+ ];
+ this.colorOp = [
+ GL_SRC_COLOR,
+ GL_SRC_COLOR,
+ GL_SRC_ALPHA
+ ];
+ this.alphaOp = [
+ GL_SRC_ALPHA,
+ GL_SRC_ALPHA,
+ GL_SRC_ALPHA
+ ];
+
+ this.traverseState = function(keyView) {
+ keyView.next(this.mode);
+ keyView.next(this.colorCombiner);
+ keyView.next(this.alphaCombiner);
+ keyView.next(this.colorCombiner);
+ keyView.next(this.alphaScale);
+ keyView.next(this.envColor[0]);
+ keyView.next(this.envColor[1]);
+ keyView.next(this.envColor[2]);
+ keyView.next(this.envColor[3]);
+
+ keyView.next(this.colorSrc[0]);
+ keyView.next(this.colorSrc[1]);
+ keyView.next(this.colorSrc[2]);
+
+ keyView.next(this.alphaSrc[0]);
+ keyView.next(this.alphaSrc[1]);
+ keyView.next(this.alphaSrc[2]);
+
+ keyView.next(this.colorOp[0]);
+ keyView.next(this.colorOp[1]);
+ keyView.next(this.colorOp[2]);
+
+ keyView.next(this.alphaOp[0]);
+ keyView.next(this.alphaOp[1]);
+ keyView.next(this.alphaOp[2]);
+ };
+ }
+
+ function CTexUnit() {
+ this.env = new CTexEnv();
+ this.enabled_tex1D = false;
+ this.enabled_tex2D = false;
+ this.enabled_tex3D = false;
+ this.enabled_texCube = false;
+
+ this.traverseState = function(keyView) {
+ var texUnitType = this.getTexType();
+ keyView.next(texUnitType);
+ if (!texUnitType) return;
+ this.env.traverseState(keyView);
+ };
+ };
+
+ // Class impls:
+ CTexUnit.prototype.enabled = function() {
+ return this.getTexType() != 0;
+ }
+
+ CTexUnit.prototype.genPassLines = function(passOutputVar, passInputVar, texUnitID) {
+ if (!this.enabled()) {
+ return ["vec4 " + passOutputVar + " = " + passInputVar + ";"];
+ }
+
+ return this.env.genPassLines(passOutputVar, passInputVar, texUnitID);
+ }
+
+ CTexUnit.prototype.getTexType = function() {
+ if (this.enabled_texCube) {
+ return GL_TEXTURE_CUBE_MAP;
+ } else if (this.enabled_tex3D) {
+ return GL_TEXTURE_3D;
+ } else if (this.enabled_tex2D) {
+ return GL_TEXTURE_2D;
+ } else if (this.enabled_tex1D) {
+ return GL_TEXTURE_1D;
+ }
+ return 0