diff options
Diffstat (limited to 'src/mesa/shader/shader_api.c')
-rw-r--r-- | src/mesa/shader/shader_api.c | 57 |
1 files changed, 44 insertions, 13 deletions
diff --git a/src/mesa/shader/shader_api.c b/src/mesa/shader/shader_api.c index 5af236cfff5..d6dacdd6793 100644 --- a/src/mesa/shader/shader_api.c +++ b/src/mesa/shader/shader_api.c @@ -866,6 +866,7 @@ _mesa_uniform(GLcontext *ctx, GLint location, GLsizei count, const GLvoid *values, GLenum type) { struct gl_shader_program *shProg = ctx->Shader.CurrentProgram; + GLfloat *uniformVal; if (!shProg || !shProg->LinkStatus) { _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform(program not linked)"); @@ -879,20 +880,50 @@ _mesa_uniform(GLcontext *ctx, GLint location, GLsizei count, FLUSH_VERTICES(ctx, _NEW_PROGRAM); - { - GLfloat *v = shProg->Uniforms->ParameterValues[location]; + uniformVal = shProg->Uniforms->ParameterValues[location]; + + if (type == GL_INT || + type == GL_INT_VEC2 || + type == GL_INT_VEC3 || + type == GL_INT_VEC4) { + const GLint *iValues = (const GLint *) values; + switch (type) { + case GL_INT_VEC4: + uniformVal[3] = (GLfloat) iValues[3]; + /* fall-through */ + case GL_INT_VEC3: + uniformVal[2] = (GLfloat) iValues[2]; + /* fall-through */ + case GL_INT_VEC2: + uniformVal[1] = (GLfloat) iValues[1]; + /* fall-through */ + case GL_INT: + uniformVal[0] = (GLfloat) iValues[0]; + break; + default: + _mesa_problem(ctx, "Invalid type in _mesa_uniform"); + return; + } + } + else { const GLfloat *fValues = (const GLfloat *) values; /* XXX */ - GLint i; - if (type == GL_FLOAT_VEC4) - count *= 4; - else if (type == GL_FLOAT_VEC3) - count *= 3; - else - abort(); - - for (i = 0; i < count; i++) - v[i] = fValues[i]; - return; + switch (type) { + case GL_FLOAT_VEC4: + uniformVal[3] = fValues[3]; + /* fall-through */ + case GL_FLOAT_VEC3: + uniformVal[2] = fValues[2]; + /* fall-through */ + case GL_FLOAT_VEC2: + uniformVal[1] = fValues[1]; + /* fall-through */ + case GL_FLOAT: + uniformVal[0] = fValues[0]; + break; + default: + _mesa_problem(ctx, "Invalid type in _mesa_uniform"); + return; + } } } |