diff options
author | Ehsan Akhgari <ehsan.akhgari@gmail.com> | 2012-01-22 18:37:51 -0500 |
---|---|---|
committer | Ehsan Akhgari <ehsan.akhgari@gmail.com> | 2012-01-22 18:37:51 -0500 |
commit | 92b660065c16e4089ef9fcf419de0ea444566fff (patch) | |
tree | 9bc5bf9b69a463fbad1edf5e30d9cf4ee83fcab6 | |
parent | 8ff943af1652f2a0a57977e277dc8e56013a9e7c (diff) |
Make it possible to compile shaders
-rw-r--r-- | src/library_gl.js | 44 | ||||
-rw-r--r-- | src/preamble.js | 19 |
2 files changed, 63 insertions, 0 deletions
diff --git a/src/library_gl.js b/src/library_gl.js index a5d73774..ef72112e 100644 --- a/src/library_gl.js +++ b/src/library_gl.js @@ -257,6 +257,50 @@ var LibraryGL = { Module.ctx.drawArrays(mode, first, count); }, + glCreateShader_deps: ['$GL'], + glCreateShader: function(shaderType) { + var shader = Module.ctx.createShader(shaderType); + return GL.hashtable("shader").add(shader); + }, + + glShaderSource_deps: ['$GL'], + glShaderSource: function(shader, count, string, length) { + var source = ""; + for (var i = 0; i < count; ++i) { + var frag = string[i]; + if (length && IHEAP[length + QUANTUM_SIZE*i]) { + var len = IHEAP[length + QUANTUM_SIZE*i]; + if (len < 0) { + frag = Pointer_stringify(IHEAP[string + QUANTUM_SIZE*i]); + } else { + frag = Pointer_stringify(IHEAP[string + QUANTUM_SIZE*i], len); + } + } else { + frag = Pointer_stringify(IHEAP[string + QUANTUM_SIZE*i]); + } + if (source.length) { + source += "\n"; + } + source += frag; + } + Module.ctx.shaderSource(GL.hashtable("shader").get(shader), source); + }, + + glCompileShader_deps: ['$GL'], + glCompileShader: function(shader) { + Module.ctx.compileShader(GL.hashtable("shader").get(shader)); + }, + + glGetShaderInfoLog_deps: ['$GL'], + glGetShaderInfoLog: function(shader, maxLength, length, infoLog) { + var log = Module.ctx.getShaderInfoLog(GL.hashtable("shader").get(shader)); + log.slice(0, maxLength - 1); + writeStringToMemory(log, infoLog); + if (length) { + {{{ makeSetValue('length', 'i', 'log.length', 'i32') }}} + } + }, + glClearColor: function(red, green, blue, alpha) { Module.ctx.clearColor(red, green, blue, alpha); }, diff --git a/src/preamble.js b/src/preamble.js index 103b786d..f19a68f1 100644 --- a/src/preamble.js +++ b/src/preamble.js @@ -752,6 +752,25 @@ function intArrayToString(array) { } Module['intArrayToString'] = intArrayToString; +// Write a Javascript array to somewhere in the heap +function writeStringToMemory(string, buffer, dontAddNull) { + var i = 0; + while (i < string.length) { + var chr = string.charCodeAt(i); + if (chr > 0xFF) { +#if ASSERTIONS + assert(false, 'Character code ' + chr + ' (' + string[i] + ') at offset ' + i + ' not in 0x00-0xFF.'); +#endif + chr &= 0xFF; + } + {{{ makeSetValue('buffer', 'i', 'chr', 'i8') }}} + i = i + 1; + } + if (!dontAddNull) { + {{{ makeSetValue('buffer', 'i', '0', 'i8') }}} + } +} + {{{ unSign }}} {{{ reSign }}} |