aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEhsan Akhgari <ehsan.akhgari@gmail.com>2012-01-22 18:37:51 -0500
committerEhsan Akhgari <ehsan.akhgari@gmail.com>2012-01-22 18:37:51 -0500
commit92b660065c16e4089ef9fcf419de0ea444566fff (patch)
tree9bc5bf9b69a463fbad1edf5e30d9cf4ee83fcab6
parent8ff943af1652f2a0a57977e277dc8e56013a9e7c (diff)
Make it possible to compile shaders
-rw-r--r--src/library_gl.js44
-rw-r--r--src/preamble.js19
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 }}}