diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-05-05 18:45:10 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-05-05 18:45:10 -0700 |
commit | efc736eccb5bc0d5255d6a31e8ec23ddb68cee39 (patch) | |
tree | a61517c972b11efa42b32e3911585a2329a709de | |
parent | 642819024e8bef56119d37a34394bf85397d777c (diff) |
refactor getProcAddress for closure
-rw-r--r-- | src/library_gl.js | 127 | ||||
-rwxr-xr-x | tests/runner.py | 2 |
2 files changed, 67 insertions, 62 deletions
diff --git a/src/library_gl.js b/src/library_gl.js index 7f596aef..91e5d548 100644 --- a/src/library_gl.js +++ b/src/library_gl.js @@ -1105,70 +1105,75 @@ var LibraryGL = { }; }, - procReplacements: { - 'glCreateShaderObjectARB': 'glCreateShader', - 'glCreateProgramObjectARB': 'glCreateProgram', - 'glAttachObjectARB': 'glAttachShader', - 'glUseProgramObjectARB': 'glUseProgram' - }, - - procs: { - glDeleteObjectARB: function(id) { - if (GL.programs[id]) { - _glDeleteProgram(id); - } else if (GL.shaders[id]) { - _glDeleteShader(id); - } else { - console.log('WARNING: deleteObjectARB received invalid id: ' + id); - } - }, - - glGetObjectParameterivARB: function(id, type, result) { - if (GL.programs[id]) { - if (type == 0x8B84) { // GL_OBJECT_INFO_LOG_LENGTH_ARB - {{{ makeSetValue('result', '0', 'Module.ctx.getProgramInfoLog(GL.programs[id]).length', 'i32') }}}; - return; + getProcAddress: function(name) { + name = name.replace('EXT', '').replace('ARB', ''); + // Do the translation carefully because of closure + switch (name) { + case 'glCreateShaderObject': case 'glCreateShader': func = _glCreateShader; break; + case 'glCreateProgramObject': case 'glCreateProgram': func = _glCreateProgram; break; + case 'glAttachObject': case 'glAttachShader': func = _glAttachShader; break; + case 'glUseProgramObject': case 'glUseProgram': func = _glUseProgram; break; + case 'glDeleteObject': func = function(id) { + if (GL.programs[id]) { + _glDeleteProgram(id); + } else if (GL.shaders[id]) { + _glDeleteShader(id); + } else { + console.log('WARNING: deleteObject received invalid id: ' + id); } - _glGetProgramiv(id, type, result); - } else if (GL.shaders[id]) { - if (type == 0x8B84) { // GL_OBJECT_INFO_LOG_LENGTH_ARB - {{{ makeSetValue('result', '0', 'Module.ctx.getShaderInfoLog(GL.shaders[id]).length', 'i32') }}}; - return; + }; break; + case 'glGetObjectParameteriv': func = function(id, type, result) { + if (GL.programs[id]) { + if (type == 0x8B84) { // GL_OBJECT_INFO_LOG_LENGTH_ARB + {{{ makeSetValue('result', '0', 'Module.ctx.getProgramInfoLog(GL.programs[id]).length', 'i32') }}}; + return; + } + _glGetProgramiv(id, type, result); + } else if (GL.shaders[id]) { + if (type == 0x8B84) { // GL_OBJECT_INFO_LOG_LENGTH_ARB + {{{ makeSetValue('result', '0', 'Module.ctx.getShaderInfoLog(GL.shaders[id]).length', 'i32') }}}; + return; + } + _glGetShaderiv(id, type, result); + } else { + console.log('WARNING: getObjectParameteriv received invalid id: ' + id); } - _glGetShaderiv(id, type, result); - } else { - console.log('WARNING: getObjectParameterivARB received invalid id: ' + id); - } - }, - - glGetInfoLogARB: function(id, maxLength, length, infoLog) { - if (GL.programs[id]) { - _glGetProgramInfoLog(id, maxLength, length, infoLog); - } else if (GL.shaders[id]) { - _glGetShaderInfoLog(id, maxLength, length, infoLog); - } else { - console.log('WARNING: getObjectParameterivARB received invalid id: ' + id); - } - }, - - glBindProgramARB: function(type, id) { - assert(id == 0); - } - }, - - getProcAddress: function(name) { - name = GLEmulation.procReplacements[name] || name; - var func = GLEmulation.procs[name]; - if (!func) { - try { - try { - func = eval('_' + name); // XXX closure, need Module. and for them to be exported - } catch(e) { - if (name.substr(-3) == 'ARB') name = name.substr(0, name.length-3); - if (name.substr(-3) == 'EXT') name = name.substr(0, name.length-3); - func = eval('_' + name); // XXX closure, need Module. and for them to be exported + }; break; + case 'glGetInfoLog': func = function(id, maxLength, length, infoLog) { + if (GL.programs[id]) { + _glGetProgramInfoLog(id, maxLength, length, infoLog); + } else if (GL.shaders[id]) { + _glGetShaderInfoLog(id, maxLength, length, infoLog); + } else { + console.log('WARNING: getObjectParameteriv received invalid id: ' + id); } - } catch(e) { + }; break; + case 'glBindProgram': func = function(type, id) { + assert(id == 0); + }; break; + case 'glShaderSource': func = _glShaderSource; break; + case 'glCompileShader': func = _glCompileShader; break; + case 'glLinkProgram': func = _glLinkProgram; break; + case 'glGetUniformLocation': func = _glGetUniformLocation; break; + case 'glUniform1f': func = _glUniform1f; break; + case 'glUniform2f': func = _glUniform2f; break; + case 'glUniform3f': func = _glUniform3f; break; + case 'glUniform4f': func = _glUniform4f; break; + case 'glUniform1fv': func = _glUniform1fv; break; + case 'glUniform2fv': func = _glUniform2fv; break; + case 'glUniform3fv': func = _glUniform3fv; break; + case 'glUniform4fv': func = _glUniform4fv; break; + case 'glUniform1i': func = _glUniform1i; break; + case 'glUniform2i': func = _glUniform2i; break; + case 'glUniform3i': func = _glUniform3i; break; + case 'glUniform4i': func = _glUniform4i; break; + case 'glUniform1iv': func = _glUniform1iv; break; + case 'glUniform2iv': func = _glUniform2iv; break; + case 'glUniform3iv': func = _glUniform3iv; break; + case 'glUniform4iv': func = _glUniform4iv; break; + case 'glBindAttribLocation': func = _glBindAttribLocation; break; + case 'glGetActiveUniform': func = _glGetActiveUniform; break; + default: { console.log('WARNING: getProcAddress failed for ' + name); func = function() { console.log('WARNING: empty replacement for ' + name + ' called, no-op'); diff --git a/tests/runner.py b/tests/runner.py index 01ae704e..6e086200 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -7240,7 +7240,7 @@ elif 'browser' in str(sys.argv): self.btest('emscripten_api_browser.cpp', '1') def test_sdlglshader(self): - self.btest('sdlglshader.c', reference='sdlglshader.png') + self.btest('sdlglshader.c', reference='sdlglshader.png', args=['--closure', '1']) def test_gl_ps(self): # pointers and a shader |