finish some loose ends in _mesa_uniform()
authorBrian <brian@yutani.localnet.net>
Thu, 4 Jan 2007 21:35:44 +0000 (14:35 -0700)
committerBrian <brian@yutani.localnet.net>
Thu, 4 Jan 2007 21:35:44 +0000 (14:35 -0700)
src/mesa/shader/shader_api.c

index 5af236cfff53ef0eb5024d85b9361f1322a99e97..d6dacdd6793d30df5f50af6a37e4b20c8ee98483 100644 (file)
@@ -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;
+      }
    }
 }