aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-04-16 15:31:13 -0700
committerAlon Zakai <alonzakai@gmail.com>2012-04-16 15:31:13 -0700
commit8d338b4ac241974a3fedb3b8977e8cbe569dd1e2 (patch)
tree7f1bf8c9ae7003105f8558af7865a868fecd1de7
parent95d23e50f4e008e27f0e3aa08bdb092ffed11480 (diff)
gl emulation workarounds for glsl differences
-rw-r--r--src/library_gl.js36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/library_gl.js b/src/library_gl.js
index 507ac2ca..5f720842 100644
--- a/src/library_gl.js
+++ b/src/library_gl.js
@@ -892,6 +892,42 @@ var LibraryGL = {
}
glGetIntegerv(pname, params);
};
+ // Do some automatic rewriting to work around GLSL differences. Note that this must be done in
+ // tandem with the rest of the program, by itself it cannot suffice.
+ // Note that we need to remember shader types for this rewriting, saving sources makes it easier to debug.
+ GL.shaderTypes = {};
+ GL.shaderSources = {};
+ var glCreateShader = _glCreateShader;
+ _glCreateShader = function(shaderType) {
+ var id = glCreateShader(shaderType);
+ GL.shaderTypes[id] = shaderType;
+ return id;
+ };
+ var glShaderSource = _glShaderSource;
+ _glShaderSource = function(shader, count, string, length) {
+ var source = GL.getSource(shader, count, string, length);
+ if (GL.shaderTypes[shader] == Module.ctx.VERTEX_SHADER) {
+ if (source.indexOf('ftransform()') >= 0) {
+ // Replace ftransform() with explicit project/modelview transforms, and add position and matrix info.
+ source = 'attribute vec3 a_position; \n\
+ uniform mat4 u_modelView; \n\
+ uniform mat4 u_projection; \n' +
+ source.replace('ftransform()', 'u_projection * u_modelView * vec4(a.position, 1.0)');
+ }
+ }
+ GL.shaderSources[shader] = source;
+ Module.ctx.shaderSource(GL.shaders[shader], source);
+ };
+ var glCompileShader = _glCompileShader;
+ _glCompileShader = function(shader) {
+ Module.ctx.compileShader(GL.shaders[shader]);
+ if (!Module.ctx.getShaderParameter(GL.shaders[shader], Module.ctx.COMPILE_STATUS)) {
+ console.log('Failed to compile shader: ' + Module.ctx.getShaderInfoLog(GL.shaders[shader]));
+ console.log('Type: ' + GL.shaderTypes[shader]);
+ console.log('Source: ' + GL.shaderSources[shader]);
+ throw 'Shader compilation halt';
+ }
+ };
},
procReplacements: {