aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library_gl.js119
-rw-r--r--tests/glgettexenv.c71
-rw-r--r--tests/test_browser.py3
3 files changed, 190 insertions, 3 deletions
diff --git a/src/library_gl.js b/src/library_gl.js
index edd5890e..3055309b 100644
--- a/src/library_gl.js
+++ b/src/library_gl.js
@@ -2644,7 +2644,7 @@ var LibraryGL = {
return "float";
}
- return Abort_NoSupport("Unsupported combiner op: 0x" + op.toString(16));
+ return abort_noSupport("Unsupported combiner op: 0x" + op.toString(16));
}
function getCurTexUnit() {
@@ -2997,7 +2997,7 @@ var LibraryGL = {
}
}
- return Abort_NoSupport("Unsupported TexEnv mode: 0x" + this.mode.toString(16));
+ return abort_noSupport("Unsupported TexEnv mode: 0x" + this.mode.toString(16));
}
CTexEnv.prototype.genCombinerLines = function CTexEnv_getCombinerLines(isColor, outputVar,
@@ -3417,6 +3417,107 @@ var LibraryGL = {
Module.printErr('WARNING: Unhandled `pname` in call to `glTexEnvfv`.');
}
},
+
+ hook_getTexEnviv: function(target, pname, param) {
+ if (target != GL_TEXTURE_ENV)
+ return;
+
+ var env = getCurTexUnit().env;
+ switch (pname) {
+ case GL_TEXTURE_ENV_MODE:
+ {{{ makeSetValue('param', '0', 'env.mode', 'i32') }}};
+ return;
+
+ case GL_TEXTURE_ENV_COLOR:
+ {{{ makeSetValue('param', '0', 'Math.max(Math.min(env.envColor[0]*255, 255, -255))', 'i32') }}};
+ {{{ makeSetValue('param', '1', 'Math.max(Math.min(env.envColor[1]*255, 255, -255))', 'i32') }}};
+ {{{ makeSetValue('param', '2', 'Math.max(Math.min(env.envColor[2]*255, 255, -255))', 'i32') }}};
+ {{{ makeSetValue('param', '3', 'Math.max(Math.min(env.envColor[3]*255, 255, -255))', 'i32') }}};
+ return;
+
+ case GL_COMBINE_RGB:
+ {{{ makeSetValue('param', '0', 'env.colorCombiner', 'i32') }}};
+ return;
+
+ case GL_COMBINE_ALPHA:
+ {{{ makeSetValue('param', '0', 'env.alphaCombiner', 'i32') }}};
+ return;
+
+ case GL_SRC0_RGB:
+ {{{ makeSetValue('param', '0', 'env.colorSrc[0]', 'i32') }}};
+ return;
+
+ case GL_SRC1_RGB:
+ {{{ makeSetValue('param', '0', 'env.colorSrc[1]', 'i32') }}};
+ return;
+
+ case GL_SRC2_RGB:
+ {{{ makeSetValue('param', '0', 'env.colorSrc[2]', 'i32') }}};
+ return;
+
+ case GL_SRC0_ALPHA:
+ {{{ makeSetValue('param', '0', 'env.alphaSrc[0]', 'i32') }}};
+ return;
+
+ case GL_SRC1_ALPHA:
+ {{{ makeSetValue('param', '0', 'env.alphaSrc[1]', 'i32') }}};
+ return;
+
+ case GL_SRC2_ALPHA:
+ {{{ makeSetValue('param', '0', 'env.alphaSrc[2]', 'i32') }}};
+ return;
+
+ case GL_OPERAND0_RGB:
+ {{{ makeSetValue('param', '0', 'env.colorOp[0]', 'i32') }}};
+ return;
+
+ case GL_OPERAND1_RGB:
+ {{{ makeSetValue('param', '0', 'env.colorOp[1]', 'i32') }}};
+ return;
+
+ case GL_OPERAND2_RGB:
+ {{{ makeSetValue('param', '0', 'env.colorOp[2]', 'i32') }}};
+ return;
+
+ case GL_OPERAND0_ALPHA:
+ {{{ makeSetValue('param', '0', 'env.alphaOp[0]', 'i32') }}};
+ return;
+
+ case GL_OPERAND1_ALPHA:
+ {{{ makeSetValue('param', '0', 'env.alphaOp[1]', 'i32') }}};
+ return;
+
+ case GL_OPERAND2_ALPHA:
+ {{{ makeSetValue('param', '0', 'env.alphaOp[2]', 'i32') }}};
+ return;
+
+ case GL_RGB_SCALE:
+ {{{ makeSetValue('param', '0', 'env.colorScale', 'i32') }}};
+ return;
+
+ case GL_ALPHA_SCALE:
+ {{{ makeSetValue('param', '0', 'env.alphaScale', 'i32') }}};
+ return;
+
+ default:
+ Module.printErr('WARNING: Unhandled `pname` in call to `glGetTexEnvi`.');
+ }
+ },
+
+ hook_getTexEnvfv: function(target, pname, param) {
+ if (target != GL_TEXTURE_ENV)
+ return;
+
+ var env = getCurTexUnit().env;
+ switch (pname) {
+ case GL_TEXTURE_ENV_COLOR:
+ {{{ makeSetValue('param', '0', 'env.envColor[0]', 'float') }}};
+ {{{ makeSetValue('param', '4', 'env.envColor[1]', 'float') }}};
+ {{{ makeSetValue('param', '8', 'env.envColor[2]', 'float') }}};
+ {{{ makeSetValue('param', '12', 'env.envColor[3]', 'float') }}};
+ return;
+ }
+ }
};
},
@@ -3738,7 +3839,8 @@ var LibraryGL = {
GLctx.bindAttribLocation(this.program, GLImmediate.VERTEX, 'a_position');
GLctx.bindAttribLocation(this.program, GLImmediate.COLOR, 'a_color');
GLctx.bindAttribLocation(this.program, GLImmediate.NORMAL, 'a_normal');
- for (var i = 0; i < GLImmediate.MAX_TEXTURES; i++) {
+ var maxVertexAttribs = GLctx.getParameter(GLctx.MAX_VERTEX_ATTRIBS);
+ for (var i = 0; i < GLImmediate.MAX_TEXTURES && GLImmediate.TEXTURE0 + i < maxVertexAttribs; i++) {
GLctx.bindAttribLocation(this.program, GLImmediate.TEXTURE0 + i, 'a_texCoord'+i);
GLctx.bindAttribLocation(this.program, GLImmediate.TEXTURE0 + i, aTexCoordPrefix+i);
}
@@ -4093,6 +4195,14 @@ var LibraryGL = {
//glTexEnvfv(target, pname, param);
};
+ _glGetTexEnviv = function _glGetTexEnviv(target, pname, param) {
+ GLImmediate.TexEnvJIT.hook_getTexEnviv(target, pname, param);
+ };
+
+ _glGetTexEnvfv = function _glGetTexEnvfv(target, pname, param) {
+ GLImmediate.TexEnvJIT.hook_getTexEnvfv(target, pname, param);
+ };
+
var glGetIntegerv = _glGetIntegerv;
_glGetIntegerv = function _glGetIntegerv(pname, params) {
switch (pname) {
@@ -4885,6 +4995,9 @@ var LibraryGL = {
glTexEnvf: function() { Runtime.warnOnce('glTexEnvf: TODO') },
glTexEnvfv: function() { Runtime.warnOnce('glTexEnvfv: TODO') },
+ glGetTexEnviv: function(target, pname, param) { throw 'GL emulation not initialized!'; },
+ glGetTexEnvfv: function(target, pname, param) { throw 'GL emulation not initialized!'; },
+
glTexImage1D: function() { throw 'glTexImage1D: TODO' },
glTexCoord3f: function() { throw 'glTexCoord3f: TODO' },
glGetTexLevelParameteriv: function() { throw 'glGetTexLevelParameteriv: TODO' },
diff --git a/tests/glgettexenv.c b/tests/glgettexenv.c
new file mode 100644
index 00000000..a051a690
--- /dev/null
+++ b/tests/glgettexenv.c
@@ -0,0 +1,71 @@
+/*
+THIS WORK, INCLUDING THE SOURCE CODE, DOCUMENTATION
+AND RELATED MEDIA AND DATA, IS PLACED INTO THE PUBLIC DOMAIN.
+
+THE ORIGINAL AUTHOR IS KYLE FOLEY.
+
+THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY
+OF ANY KIND, NOT EVEN THE IMPLIED WARRANTY OF
+MERCHANTABILITY. THE AUTHOR OF THIS SOFTWARE,
+ASSUMES _NO_ RESPONSIBILITY FOR ANY CONSEQUENCE
+RESULTING FROM THE USE, MODIFICATION, OR
+REDISTRIBUTION OF THIS SOFTWARE.
+*/
+
+#if !EMSCRIPTEN
+#define USE_GLEW 1
+#endif
+
+#if USE_GLEW
+#include "GL/glew.h"
+#endif
+
+#include "SDL/SDL.h"
+#if !USE_GLEW
+#include "SDL/SDL_opengl.h"
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+int main(int argc, char *argv[])
+{
+ SDL_Surface *screen;
+ if ( SDL_Init(SDL_INIT_VIDEO) != 0 ) {
+ printf("Unable to initialize SDL: %s\n", SDL_GetError());
+ return 1;
+ }
+
+ SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
+ screen = SDL_SetVideoMode( 640, 480, 24, SDL_OPENGL );
+ if ( !screen ) {
+ printf("Unable to set video mode: %s\n", SDL_GetError());
+ return 1;
+ }
+
+ GLint value = 0;
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
+ glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, &value);
+ assert(value == GL_BLEND);
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, &value);
+ assert(value == GL_MODULATE);
+
+ GLfloat colora[4] = { 0.2f, 0.3f, 0.4f, 0.5f };
+ GLfloat colorb[4] = {};
+ glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, colora);
+ glGetTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, colorb);
+ printf("%f %f %f %f\n", colorb[0], colorb[1], colorb[2], colorb[3]);
+ assert(colora[0] == colorb[0]);
+ assert(colora[1] == colorb[1]);
+ assert(colora[2] == colorb[2]);
+ assert(colora[3] == colorb[3]);
+ SDL_Quit();
+
+#ifdef REPORT_RESULT
+ int result = 1;
+ REPORT_RESULT();
+#endif
+ return 0;
+}
diff --git a/tests/test_browser.py b/tests/test_browser.py
index 8c75c861..02bcecbd 100644
--- a/tests/test_browser.py
+++ b/tests/test_browser.py
@@ -1546,6 +1546,9 @@ keydown(100);keyup(100); // trigger the end
def test_cube_explosion(self):
self.btest('cube_explosion.c', reference='cube_explosion.png', args=['-s', 'LEGACY_GL_EMULATION=1'])
+ def test_glgettexenv(self):
+ self.btest('glgettexenv.c', args=['-s', 'LEGACY_GL_EMULATION=1'], expected=['1'])
+
def test_sdl_canvas_blank(self):
self.btest('sdl_canvas_blank.c', reference='sdl_canvas_blank.png')