[Mesa-dev] [PATCH 05/11] mesa: add double uniform support.

Ian Romanick idr at freedesktop.org
Fri Aug 22 17:49:02 PDT 2014


It's hard to tell from just the patch whether this restriction is
enforced:

    (15) Can the 64-bit uniform APIs be used to load values for uniforms of
         type "bool", "bvec2", "bvec3", or "bvec4"?

      RESOLVED:  No.  OpenGL 2.0 and beyond did allow "bool" variable to be
      set with Uniform*i* and Uniform*f APIs, and OpenGL 3.0 extended that
      support to Uniform*ui* for orthogonality.  But it seems pointless to
      extended this capability forward to 64-bit Uniform APIs as well.


On 08/14/2014 03:52 AM, Dave Airlie wrote:
> From: Dave Airlie <airlied at redhat.com>
> 
> This adds support for the new uniform interfaces
> from ARB_gpu_shader_fp64.
> 
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
>  src/mesa/main/uniform_query.cpp   | 50 +++++++++++++++++----
>  src/mesa/main/uniforms.c          | 91 +++++++++++++++++++++++++++++++--------
>  src/mesa/main/uniforms.h          |  3 +-
>  src/mesa/program/ir_to_mesa.cpp   | 17 +++++++-
>  src/mesa/program/prog_parameter.c | 16 ++++---
>  5 files changed, 143 insertions(+), 34 deletions(-)
> 
> diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp
> index 7e630e6..d7024cb 100644
> --- a/src/mesa/main/uniform_query.cpp
> +++ b/src/mesa/main/uniform_query.cpp
> @@ -449,6 +449,9 @@ log_uniform(const void *values, enum glsl_base_type basicType,
>        case GLSL_TYPE_FLOAT:
>  	 printf("%g ", v[i].f);
>  	 break;
> +      case GLSL_TYPE_DOUBLE:
> +	 printf("%g ", *(double* )&v[i * 2].f);
> +	 break;
>        default:
>  	 assert(!"Should not get here.");
>  	 break;
> @@ -509,11 +512,11 @@ _mesa_propagate_uniforms_to_driver_storage(struct gl_uniform_storage *uni,
>      */
>     const unsigned components = MAX2(1, uni->type->vector_elements);
>     const unsigned vectors = MAX2(1, uni->type->matrix_columns);
> -
> +   const int dmul = uni->type->base_type == GLSL_TYPE_DOUBLE ? 2 : 1;
>     /* Store the data in the driver's requested type in the driver's storage
>      * areas.
>      */
> -   unsigned src_vector_byte_stride = components * 4;
> +   unsigned src_vector_byte_stride = components * 4 * dmul;
>  
>     for (i = 0; i < uni->num_driver_storage; i++) {
>        struct gl_uniform_driver_storage *const store = &uni->driver_storage[i];
> @@ -612,6 +615,7 @@ _mesa_uniform(struct gl_context *ctx, struct gl_shader_program *shProg,
>     unsigned components;
>     unsigned src_components;
>     enum glsl_base_type basicType;
> +   int size_mul = 1;
>  
>     struct gl_uniform_storage *const uni =
>        validate_uniform_parameters(ctx, shProg, location, count,
> @@ -670,6 +674,26 @@ _mesa_uniform(struct gl_context *ctx, struct gl_shader_program *shProg,
>        basicType = GLSL_TYPE_INT;
>        src_components = 4;
>        break;
> +   case GL_DOUBLE:
> +      basicType = GLSL_TYPE_DOUBLE;
> +      src_components = 1;
> +      size_mul = 2;
> +      break;
> +   case GL_DOUBLE_VEC2:
> +      basicType = GLSL_TYPE_DOUBLE;
> +      src_components = 2;
> +      size_mul = 2;
> +      break;
> +   case GL_DOUBLE_VEC3:
> +      basicType = GLSL_TYPE_DOUBLE;
> +      src_components = 3;
> +      size_mul = 2;
> +      break;
> +   case GL_DOUBLE_VEC4:
> +      basicType = GLSL_TYPE_DOUBLE;
> +      src_components = 4;
> +      size_mul = 2;
> +      break;
>     case GL_BOOL:
>     case GL_BOOL_VEC2:
>     case GL_BOOL_VEC3:
> @@ -683,6 +707,15 @@ _mesa_uniform(struct gl_context *ctx, struct gl_shader_program *shProg,
>     case GL_FLOAT_MAT4x2:
>     case GL_FLOAT_MAT4x3:
>     case GL_FLOAT_MAT4:
> +   case GL_DOUBLE_MAT2:
> +   case GL_DOUBLE_MAT2x3:
> +   case GL_DOUBLE_MAT2x4:
> +   case GL_DOUBLE_MAT3x2:
> +   case GL_DOUBLE_MAT3:
> +   case GL_DOUBLE_MAT3x4:
> +   case GL_DOUBLE_MAT4x2:
> +   case GL_DOUBLE_MAT4x3:
> +   case GL_DOUBLE_MAT4:
>     default:
>        _mesa_problem(NULL, "Invalid type in %s", __func__);
>        return;
> @@ -789,7 +822,7 @@ _mesa_uniform(struct gl_context *ctx, struct gl_shader_program *shProg,
>      */
>     if (!uni->type->is_boolean()) {
>        memcpy(&uni->storage[components * offset], values,
> -	     sizeof(uni->storage[0]) * components * count);
> +	     sizeof(uni->storage[0]) * components * count * size_mul);
>     } else {
>        const union gl_constant_value *src =
>  	 (const union gl_constant_value *) values;
> @@ -892,13 +925,14 @@ extern "C" void
>  _mesa_uniform_matrix(struct gl_context *ctx, struct gl_shader_program *shProg,
>  		     GLuint cols, GLuint rows,
>                       GLint location, GLsizei count,
> -                     GLboolean transpose, const GLfloat *values)
> +                     GLboolean transpose,
> +                     const GLvoid *values, GLenum type)
>  {
>     unsigned offset;
>     unsigned vectors;
>     unsigned components;
>     unsigned elements;
> -
> +   int size_mul = mesa_type_is_double(type) ? 2 : 1;
>     struct gl_uniform_storage *const uni =
>        validate_uniform_parameters(ctx, shProg, location, count,
>                                    &offset, "glUniformMatrix", false);
> @@ -936,7 +970,7 @@ _mesa_uniform_matrix(struct gl_context *ctx, struct gl_shader_program *shProg,
>     }
>  
>     if (ctx->_Shader->Flags & GLSL_UNIFORMS) {
> -      log_uniform(values, GLSL_TYPE_FLOAT, components, vectors, count,
> +      log_uniform(values, uni->type->base_type, components, vectors, count,
>  		  bool(transpose), shProg, location, uni);
>     }
>  
> @@ -963,11 +997,11 @@ _mesa_uniform_matrix(struct gl_context *ctx, struct gl_shader_program *shProg,
>  
>     if (!transpose) {
>        memcpy(&uni->storage[elements * offset], values,
> -	     sizeof(uni->storage[0]) * elements * count);
> +	     sizeof(uni->storage[0]) * elements * count * size_mul);
>     } else {
>        /* Copy and transpose the matrix.
>         */
> -      const float *src = values;
> +      const float *src = (const float *)values;
>        float *dst = &uni->storage[elements * offset].f;
>  
>        for (int i = 0; i < count; i++) {
> diff --git a/src/mesa/main/uniforms.c b/src/mesa/main/uniforms.c
> index 6bd7e42..88909f53 100644
> --- a/src/mesa/main/uniforms.c
> +++ b/src/mesa/main/uniforms.c
> @@ -539,7 +539,7 @@ _mesa_UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose,
>  {
>     GET_CURRENT_CONTEXT(ctx);
>     _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
> -			2, 2, location, count, transpose, value);
> +			2, 2, location, count, transpose, value, GL_FLOAT);
>  }
>  
>  void GLAPIENTRY
> @@ -548,7 +548,7 @@ _mesa_UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose,
>  {
>     GET_CURRENT_CONTEXT(ctx);
>     _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
> -			3, 3, location, count, transpose, value);
> +			3, 3, location, count, transpose, value, GL_FLOAT);
>  }
>  
>  void GLAPIENTRY
> @@ -557,7 +557,7 @@ _mesa_UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose,
>  {
>     GET_CURRENT_CONTEXT(ctx);
>     _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
> -			4, 4, location, count, transpose, value);
> +			4, 4, location, count, transpose, value, GL_FLOAT);
>  }
>  
>  /** Same as above with direct state access **/
> @@ -669,7 +669,7 @@ _mesa_ProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count,
>     struct gl_shader_program *shProg =
>        _mesa_lookup_shader_program_err(ctx, program,
>              "glProgramUniformMatrix2fv");
> -   _mesa_uniform_matrix(ctx, shProg, 2, 2, location, count, transpose, value);
> +   _mesa_uniform_matrix(ctx, shProg, 2, 2, location, count, transpose, value, GL_FLOAT);
>  }
>  
>  void GLAPIENTRY
> @@ -680,7 +680,7 @@ _mesa_ProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count,
>     struct gl_shader_program *shProg =
>        _mesa_lookup_shader_program_err(ctx, program,
>              "glProgramUniformMatrix3fv");
> -   _mesa_uniform_matrix(ctx, shProg, 3, 3, location, count, transpose, value);
> +   _mesa_uniform_matrix(ctx, shProg, 3, 3, location, count, transpose, value, GL_FLOAT);
>  }
>  
>  void GLAPIENTRY
> @@ -691,7 +691,7 @@ _mesa_ProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count,
>     struct gl_shader_program *shProg =
>        _mesa_lookup_shader_program_err(ctx, program,
>              "glProgramUniformMatrix4fv");
> -   _mesa_uniform_matrix(ctx, shProg, 4, 4, location, count, transpose, value);
> +   _mesa_uniform_matrix(ctx, shProg, 4, 4, location, count, transpose, value, GL_FLOAT);
>  }
>  
>  
> @@ -704,7 +704,7 @@ _mesa_UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose,
>  {
>     GET_CURRENT_CONTEXT(ctx);
>     _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
> -			2, 3, location, count, transpose, value);
> +			2, 3, location, count, transpose, value, GL_FLOAT);
>  }
>  
>  void GLAPIENTRY
> @@ -713,7 +713,7 @@ _mesa_UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose,
>  {
>     GET_CURRENT_CONTEXT(ctx);
>     _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
> -			3, 2, location, count, transpose, value);
> +			3, 2, location, count, transpose, value, GL_FLOAT);
>  }
>  
>  void GLAPIENTRY
> @@ -722,7 +722,7 @@ _mesa_UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose,
>  {
>     GET_CURRENT_CONTEXT(ctx);
>     _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
> -			2, 4, location, count, transpose, value);
> +			2, 4, location, count, transpose, value, GL_FLOAT);
>  }
>  
>  void GLAPIENTRY
> @@ -731,7 +731,7 @@ _mesa_UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose,
>  {
>     GET_CURRENT_CONTEXT(ctx);
>     _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
> -			4, 2, location, count, transpose, value);
> +			4, 2, location, count, transpose, value, GL_FLOAT);
>  }
>  
>  void GLAPIENTRY
> @@ -740,7 +740,7 @@ _mesa_UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose,
>  {
>     GET_CURRENT_CONTEXT(ctx);
>     _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
> -			3, 4, location, count, transpose, value);
> +			3, 4, location, count, transpose, value, GL_FLOAT);
>  }
>  
>  void GLAPIENTRY
> @@ -749,7 +749,7 @@ _mesa_UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose,
>  {
>     GET_CURRENT_CONTEXT(ctx);
>     _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
> -			4, 3, location, count, transpose, value);
> +			4, 3, location, count, transpose, value, GL_FLOAT);
>  }
>  
>  /** Same as above with direct state access **/
> @@ -762,7 +762,7 @@ _mesa_ProgramUniformMatrix2x3fv(GLuint program, GLint location, GLsizei count,
>     struct gl_shader_program *shProg =
>        _mesa_lookup_shader_program_err(ctx, program,
>              "glProgramUniformMatrix2x3fv");
> -   _mesa_uniform_matrix(ctx, shProg, 2, 3, location, count, transpose, value);
> +   _mesa_uniform_matrix(ctx, shProg, 2, 3, location, count, transpose, value, GL_FLOAT);
>  }
>  
>  void GLAPIENTRY
> @@ -773,7 +773,7 @@ _mesa_ProgramUniformMatrix3x2fv(GLuint program, GLint location, GLsizei count,
>     struct gl_shader_program *shProg =
>        _mesa_lookup_shader_program_err(ctx, program,
>              "glProgramUniformMatrix3x2fv");
> -   _mesa_uniform_matrix(ctx, shProg, 3, 2, location, count, transpose, value);
> +   _mesa_uniform_matrix(ctx, shProg, 3, 2, location, count, transpose, value, GL_FLOAT);
>  }
>  
>  void GLAPIENTRY
> @@ -784,7 +784,7 @@ _mesa_ProgramUniformMatrix2x4fv(GLuint program, GLint location, GLsizei count,
>     struct gl_shader_program *shProg =
>        _mesa_lookup_shader_program_err(ctx, program,
>              "glProgramUniformMatrix2x4fv");
> -   _mesa_uniform_matrix(ctx, shProg, 2, 4, location, count, transpose, value);
> +   _mesa_uniform_matrix(ctx, shProg, 2, 4, location, count, transpose, value, GL_FLOAT);
>  }
>  
>  void GLAPIENTRY
> @@ -795,7 +795,7 @@ _mesa_ProgramUniformMatrix4x2fv(GLuint program, GLint location, GLsizei count,
>     struct gl_shader_program *shProg =
>        _mesa_lookup_shader_program_err(ctx, program,
>              "glProgramUniformMatrix4x2fv");
> -   _mesa_uniform_matrix(ctx, shProg, 4, 2, location, count, transpose, value);
> +   _mesa_uniform_matrix(ctx, shProg, 4, 2, location, count, transpose, value, GL_FLOAT);
>  }
>  
>  void GLAPIENTRY
> @@ -806,7 +806,7 @@ _mesa_ProgramUniformMatrix3x4fv(GLuint program, GLint location, GLsizei count,
>     struct gl_shader_program *shProg =
>        _mesa_lookup_shader_program_err(ctx, program,
>              "glProgramUniformMatrix3x4fv");
> -   _mesa_uniform_matrix(ctx, shProg, 3, 4, location, count, transpose, value);
> +   _mesa_uniform_matrix(ctx, shProg, 3, 4, location, count, transpose, value, GL_FLOAT);
>  }
>  
>  void GLAPIENTRY
> @@ -817,7 +817,7 @@ _mesa_ProgramUniformMatrix4x3fv(GLuint program, GLint location, GLsizei count,
>     struct gl_shader_program *shProg =
>        _mesa_lookup_shader_program_err(ctx, program,
>              "glProgramUniformMatrix4x3fv");
> -   _mesa_uniform_matrix(ctx, shProg, 4, 3, location, count, transpose, value);
> +   _mesa_uniform_matrix(ctx, shProg, 4, 3, location, count, transpose, value, GL_FLOAT);
>  }
>  
>  
> @@ -1328,94 +1328,149 @@ _mesa_GetActiveAtomicCounterBufferiv(GLuint program, GLuint bufferIndex,
>  void GLAPIENTRY
>  _mesa_Uniform1d(GLint location, GLdouble v0)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, &v0, GL_DOUBLE);
>  }
>  
>  void GLAPIENTRY
>  _mesa_Uniform2d(GLint location, GLdouble v0, GLdouble v1)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   GLdouble v[2];
> +   v[0] = v0;
> +   v[1] = v1;
> +   _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, v, GL_DOUBLE_VEC2);
>  }
>  
>  void GLAPIENTRY
>  _mesa_Uniform3d(GLint location, GLdouble v0, GLdouble v1, GLdouble v2)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   GLdouble v[3];
> +   v[0] = v0;
> +   v[1] = v1;
> +   v[2] = v2;
> +   _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, v, GL_DOUBLE_VEC3);
>  }
>  
>  void GLAPIENTRY
>  _mesa_Uniform4d(GLint location, GLdouble v0, GLdouble v1, GLdouble v2,
>                     GLdouble v3)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   GLdouble v[4];
> +   v[0] = v0;
> +   v[1] = v1;
> +   v[2] = v2;
> +   v[3] = v3;
> +   _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, v, GL_DOUBLE_VEC4);
>  }
>  
>  void GLAPIENTRY
>  _mesa_Uniform1dv(GLint location, GLsizei count, const GLdouble * value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GL_DOUBLE);
>  }
>  
>  void GLAPIENTRY
>  _mesa_Uniform2dv(GLint location, GLsizei count, const GLdouble * value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GL_DOUBLE_VEC2);
>  }
>  
>  void GLAPIENTRY
>  _mesa_Uniform3dv(GLint location, GLsizei count, const GLdouble * value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GL_DOUBLE_VEC3);
>  }
>  
>  void GLAPIENTRY
>  _mesa_Uniform4dv(GLint location, GLsizei count, const GLdouble * value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GL_DOUBLE_VEC4);
>  }
>  
>  void GLAPIENTRY
>  _mesa_UniformMatrix2dv(GLint location, GLsizei count, GLboolean transpose,
>                            const GLdouble * value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
> +			2, 2, location, count, transpose, value, GL_DOUBLE);
>  }
>  
>  void GLAPIENTRY
>  _mesa_UniformMatrix3dv(GLint location, GLsizei count, GLboolean transpose,
>                            const GLdouble * value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
> +			3, 3, location, count, transpose, value, GL_DOUBLE);
>  }
>  
>  void GLAPIENTRY
>  _mesa_UniformMatrix4dv(GLint location, GLsizei count, GLboolean transpose,
>                            const GLdouble * value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
> +			4, 4, location, count, transpose, value, GL_DOUBLE);
>  }
>  
>  void GLAPIENTRY
>  _mesa_UniformMatrix2x3dv(GLint location, GLsizei count, GLboolean transpose,
>                           const GLdouble *value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
> +			2, 3, location, count, transpose, value, GL_DOUBLE);
>  }
>  
>  void GLAPIENTRY
>  _mesa_UniformMatrix3x2dv(GLint location, GLsizei count, GLboolean transpose,
>                           const GLdouble *value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
> +			3, 2, location, count, transpose, value, GL_DOUBLE);
>  }
>  
>  void GLAPIENTRY
>  _mesa_UniformMatrix2x4dv(GLint location, GLsizei count, GLboolean transpose,
>                           const GLdouble *value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
> +			2, 4, location, count, transpose, value, GL_DOUBLE);
>  }
>  
>  void GLAPIENTRY
>  _mesa_UniformMatrix4x2dv(GLint location, GLsizei count, GLboolean transpose,
>                           const GLdouble *value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
> +			4, 2, location, count, transpose, value, GL_DOUBLE);
>  }
>  
>  void GLAPIENTRY
>  _mesa_UniformMatrix3x4dv(GLint location, GLsizei count, GLboolean transpose,
>                           const GLdouble *value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
> +			3, 4, location, count, transpose, value, GL_DOUBLE);
>  }
>  
>  void GLAPIENTRY
>  _mesa_UniformMatrix4x3dv(GLint location, GLsizei count, GLboolean transpose,
>                           const GLdouble *value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_uniform_matrix(ctx, ctx->_Shader->ActiveProgram,
> +			4, 3, location, count, transpose, value, GL_DOUBLE);
>  }
> diff --git a/src/mesa/main/uniforms.h b/src/mesa/main/uniforms.h
> index ea9f729..8309872 100644
> --- a/src/mesa/main/uniforms.h
> +++ b/src/mesa/main/uniforms.h
> @@ -314,7 +314,8 @@ void
>  _mesa_uniform_matrix(struct gl_context *ctx, struct gl_shader_program *shProg,
>  		     GLuint cols, GLuint rows,
>                       GLint location, GLsizei count,
> -                     GLboolean transpose, const GLfloat *values);
> +                     GLboolean transpose,
> +                     const GLvoid *values, GLenum type);
>  
>  void
>  _mesa_get_uniform(struct gl_context *ctx, GLuint program, GLint location,
> diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp
> index 4c246d1..f7eb87d 100644
> --- a/src/mesa/program/ir_to_mesa.cpp
> +++ b/src/mesa/program/ir_to_mesa.cpp
> @@ -608,6 +608,14 @@ type_size(const struct glsl_type *type)
>  	  */
>  	 return 1;
>        }
> +      break;
> +   case GLSL_TYPE_DOUBLE:
> +      if (type->is_matrix()) {
> +	 return type->matrix_columns * 2;
> +      } else {
> +         return 2;
> +      }
> +      break;
>     case GLSL_TYPE_ARRAY:
>        assert(type->length > 0);
>        return type_size(type->fields.array) * type->length;
> @@ -2528,6 +2536,7 @@ _mesa_associate_uniform_storage(struct gl_context *ctx,
>  	 enum gl_uniform_driver_format format = uniform_native;
>  
>  	 unsigned columns = 0;
> +	 int dmul = 4 * sizeof(float);
>  	 switch (storage->type->base_type) {
>  	 case GLSL_TYPE_UINT:
>  	    assert(ctx->Const.NativeIntegers);
> @@ -2539,6 +2548,10 @@ _mesa_associate_uniform_storage(struct gl_context *ctx,
>  	       (ctx->Const.NativeIntegers) ? uniform_native : uniform_int_float;
>  	    columns = 1;
>  	    break;
> +
> +	 case GLSL_TYPE_DOUBLE:
> +	    dmul = 4 * sizeof(GLdouble);
> +	    /* fallthrough */
>  	 case GLSL_TYPE_FLOAT:
>  	    format = uniform_native;
>  	    columns = storage->type->matrix_columns;
> @@ -2568,8 +2581,8 @@ _mesa_associate_uniform_storage(struct gl_context *ctx,
>  	 }
>  
>  	 _mesa_uniform_attach_driver_storage(storage,
> -					     4 * sizeof(float) * columns,
> -					     4 * sizeof(float),
> +					     dmul * columns,
> +					     dmul,
>  					     format,
>  					     &params->ParameterValues[i]);
>  
> diff --git a/src/mesa/program/prog_parameter.c b/src/mesa/program/prog_parameter.c
> index 54531d2..63368c3 100644
> --- a/src/mesa/program/prog_parameter.c
> +++ b/src/mesa/program/prog_parameter.c
> @@ -111,7 +111,13 @@ _mesa_add_parameter(struct gl_program_parameter_list *paramList,
>                      const gl_state_index state[STATE_LENGTH])
>  {
>     const GLuint oldNum = paramList->NumParameters;
> -   const GLuint sz4 = (size + 3) / 4; /* no. of new param slots needed */
> +   GLuint sz4 = (size + 3) / 4; /* no. of new param slots needed */
> +   int actual_size = size;
> +
> +   if (mesa_type_is_double(datatype)) {
> +      actual_size *= 2;
> +      sz4 = ((actual_size + 3) / 4);
> +   }
>  
>     assert(size > 0);
>  
> @@ -151,15 +157,15 @@ _mesa_add_parameter(struct gl_program_parameter_list *paramList,
>           struct gl_program_parameter *p = paramList->Parameters + oldNum + i;
>           p->Name = name ? _mesa_strdup(name) : NULL;
>           p->Type = type;
> -         p->Size = size;
> +         p->Size = actual_size;
>           p->DataType = datatype;
>           if (values) {
> -            if (size >= 4) {
> +            if (actual_size >= 4) {
>                 COPY_4V(paramList->ParameterValues[oldNum + i], values);
>              }
>              else {
>                 /* copy 1, 2 or 3 values */
> -               GLuint remaining = size % 4;
> +               GLuint remaining = actual_size % 4;
>                 assert(remaining < 4);
>                 for (j = 0; j < remaining; j++) {
>                    paramList->ParameterValues[oldNum + i][j].f = values[j].f;
> @@ -177,7 +183,7 @@ _mesa_add_parameter(struct gl_program_parameter_list *paramList,
>              for (j = 0; j < 4; j++)
>              	paramList->ParameterValues[oldNum + i][j].f = 0;
>           }
> -         size -= 4;
> +         actual_size -= 4;
>        }
>  
>        if (state) {
> 



More information about the mesa-dev mailing list