summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mesa/shader/shader_api.c57
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;
+ }
}
}