[Mesa-dev] [PATCH 05/13] mesa: add double uniform support. (v4)
Brian Paul
brianp at vmware.com
Thu Feb 5 08:17:46 PST 2015
On 02/05/2015 12:27 AM, Ilia Mirkin wrote:
> From: Dave Airlie <airlied at redhat.com>
>
> This adds support for the new uniform interfaces
> from ARB_gpu_shader_fp64.
>
> v2:
> support ARB_separate_shader_objects ProgramUniform*d* (Ian)
> don't allow boolean uniforms to be updated (issue 15) (Ian)
>
> v3: fix size_mul
> v4: Teach uniform update to take into account double precision (Topi)
>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
> src/mesa/main/uniform_query.cpp | 27 +++---
> src/mesa/main/uniforms.c | 185 ++++++++++++++++++++++++++++++++++----
> src/mesa/main/uniforms.h | 3 +-
> src/mesa/program/ir_to_mesa.cpp | 17 +++-
> src/mesa/program/prog_parameter.c | 16 ++--
> 5 files changed, 210 insertions(+), 38 deletions(-)
>
> diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp
> index d36f506..7db8c36 100644
> --- a/src/mesa/main/uniform_query.cpp
> +++ b/src/mesa/main/uniform_query.cpp
> @@ -469,6 +469,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;
> @@ -529,11 +532,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];
> @@ -608,6 +611,7 @@ _mesa_uniform(struct gl_context *ctx, struct gl_shader_program *shProg,
> unsigned src_components)
> {
> unsigned offset;
> + int size_mul = basicType == GLSL_TYPE_DOUBLE ? 2 : 1;
>
> struct gl_uniform_storage *const uni =
> validate_uniform_parameters(ctx, shProg, location, count,
> @@ -615,15 +619,13 @@ _mesa_uniform(struct gl_context *ctx, struct gl_shader_program *shProg,
> if (uni == NULL)
> return;
>
> - /* Verify that the types are compatible.
> - */
> const unsigned components = uni->type->is_sampler()
> ? 1 : uni->type->vector_elements;
>
> bool match;
> switch (uni->type->base_type) {
> case GLSL_TYPE_BOOL:
> - match = true;
> + match = (basicType != GLSL_TYPE_DOUBLE);
> break;
> case GLSL_TYPE_SAMPLER:
> case GLSL_TYPE_IMAGE:
> @@ -710,8 +712,8 @@ _mesa_uniform(struct gl_context *ctx, struct gl_shader_program *shProg,
> /* Store the data in the "actual type" backing storage for the uniform.
> */
> if (!uni->type->is_boolean()) {
> - memcpy(&uni->storage[components * offset], values,
> - sizeof(uni->storage[0]) * components * count);
> + memcpy(&uni->storage[size_mul * components * offset], values,
> + sizeof(uni->storage[0]) * components * count * size_mul);
> } else {
> const union gl_constant_value *src =
> (const union gl_constant_value *) values;
> @@ -808,13 +810,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)
You can use void instead of GLvoid.
> {
> unsigned offset;
> unsigned vectors;
> unsigned components;
> unsigned elements;
> -
> + int size_mul = mesa_type_is_double(type) ? 2 : 1;
I think you can do this instead:
unsigned size_mul;
assert(type == GL_FLOAT || type == GL_DOUBLE);
size_mul = type == GL_DOUBLE ? 2 : 1;
> struct gl_uniform_storage *const uni =
> validate_uniform_parameters(ctx, shProg, location, count,
> &offset, "glUniformMatrix");
> @@ -852,7 +855,7 @@ _mesa_uniform_matrix(struct gl_context *ctx, struct gl_shader_program *shProg,
> }
>
> if (unlikely(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);
> }
>
> @@ -879,11 +882,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++) {
Don't you need to handle double values in the transpose code?
> diff --git a/src/mesa/main/uniforms.c b/src/mesa/main/uniforms.c
> index 2a6bd4b..8c1cb9a 100644
> --- a/src/mesa/main/uniforms.c
> +++ b/src/mesa/main/uniforms.c
> @@ -553,7 +553,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
> @@ -562,7 +562,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
> @@ -571,7 +571,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 **/
> @@ -683,7 +683,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
> @@ -694,7 +694,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
> @@ -705,7 +705,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);
> }
>
>
> @@ -718,7 +718,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
> @@ -727,7 +727,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
> @@ -736,7 +736,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
> @@ -745,7 +745,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
> @@ -754,7 +754,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
> @@ -763,7 +763,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 **/
> @@ -776,7 +776,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
> @@ -787,7 +787,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
> @@ -798,7 +798,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
> @@ -809,7 +809,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
> @@ -820,7 +820,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
> @@ -831,7 +831,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);
> }
>
>
> @@ -1342,194 +1342,343 @@ _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, GLSL_TYPE_DOUBLE, 1);
> }
>
> 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, GLSL_TYPE_DOUBLE, 2);
> }
>
> 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, GLSL_TYPE_DOUBLE, 3);
> }
>
> 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, GLSL_TYPE_DOUBLE, 4);
> }
>
> void GLAPIENTRY
> _mesa_Uniform1dv(GLint location, GLsizei count, const GLdouble * value)
> {
> + GET_CURRENT_CONTEXT(ctx);
> + _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GLSL_TYPE_DOUBLE, 1);
> }
>
> void GLAPIENTRY
> _mesa_Uniform2dv(GLint location, GLsizei count, const GLdouble * value)
> {
> + GET_CURRENT_CONTEXT(ctx);
> + _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GLSL_TYPE_DOUBLE, 2);
> }
>
> void GLAPIENTRY
> _mesa_Uniform3dv(GLint location, GLsizei count, const GLdouble * value)
> {
> + GET_CURRENT_CONTEXT(ctx);
> + _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GLSL_TYPE_DOUBLE, 3);
> }
>
> void GLAPIENTRY
> _mesa_Uniform4dv(GLint location, GLsizei count, const GLdouble * value)
> {
> + GET_CURRENT_CONTEXT(ctx);
> + _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, count, value, GLSL_TYPE_DOUBLE, 4);
> }
>
> 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);
> }
>
> void GLAPIENTRY
> _mesa_ProgramUniform1d(GLuint program, GLint location, GLdouble v0)
> {
> + GET_CURRENT_CONTEXT(ctx);
> + struct gl_shader_program *shProg =
> + _mesa_lookup_shader_program_err(ctx, program,
> + "glProgramUniform1d");
> + _mesa_uniform(ctx, shProg, location, 1, &v0, GLSL_TYPE_DOUBLE, 1);
> }
>
> void GLAPIENTRY
> _mesa_ProgramUniform2d(GLuint program, GLint location, GLdouble v0, GLdouble v1)
> {
> + GET_CURRENT_CONTEXT(ctx);
> + GLdouble v[2];
> + struct gl_shader_program *shProg;
> + v[0] = v0;
> + v[1] = v1;
> + shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform2d");
> + _mesa_uniform(ctx, shProg, location, 1, v, GLSL_TYPE_DOUBLE, 2);
> }
>
> void GLAPIENTRY
> _mesa_ProgramUniform3d(GLuint program, GLint location, GLdouble v0, GLdouble v1,
> GLdouble v2)
> {
> + GET_CURRENT_CONTEXT(ctx);
> + GLdouble v[3];
> + struct gl_shader_program *shProg;
> + v[0] = v0;
> + v[1] = v1;
> + v[2] = v2;
> + shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform3d");
> + _mesa_uniform(ctx, shProg, location, 1, v, GLSL_TYPE_DOUBLE, 3);
> }
>
> void GLAPIENTRY
> _mesa_ProgramUniform4d(GLuint program, GLint location, GLdouble v0, GLdouble v1,
> GLdouble v2, GLdouble v3)
> {
> + GET_CURRENT_CONTEXT(ctx);
> + GLdouble v[4];
> + struct gl_shader_program *shProg;
> + v[0] = v0;
> + v[1] = v1;
> + v[2] = v2;
> + v[3] = v3;
> + shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramUniform4d");
> + _mesa_uniform(ctx, shProg, location, 1, v, GLSL_TYPE_DOUBLE, 4);
> }
>
> void GLAPIENTRY
> _mesa_ProgramUniform1dv(GLuint program, GLint location, GLsizei count,
> const GLdouble * value)
> {
> + GET_CURRENT_CONTEXT(ctx);
> + struct gl_shader_program *shProg =
> + _mesa_lookup_shader_program_err(ctx, program,
> + "glProgramUniform1dv");
> + _mesa_uniform(ctx, shProg, location, count, value, GLSL_TYPE_DOUBLE, 1);
> }
>
> void GLAPIENTRY
> _mesa_ProgramUniform2dv(GLuint program, GLint location, GLsizei count,
> const GLdouble * value)
> {
> + GET_CURRENT_CONTEXT(ctx);
> + struct gl_shader_program *shProg =
> + _mesa_lookup_shader_program_err(ctx, program,
> + "glProgramUniform2dv");
> + _mesa_uniform(ctx, shProg, location, count, value, GLSL_TYPE_DOUBLE, 2);
> }
>
> void GLAPIENTRY
> _mesa_ProgramUniform3dv(GLuint program, GLint location, GLsizei count,
> const GLdouble * value)
> {
> + GET_CURRENT_CONTEXT(ctx);
> + struct gl_shader_program *shProg =
> + _mesa_lookup_shader_program_err(ctx, program,
> + "glProgramUniform3dv");
> + _mesa_uniform(ctx, shProg, location, count, value, GLSL_TYPE_DOUBLE, 3);
> }
>
> void GLAPIENTRY
> _mesa_ProgramUniform4dv(GLuint program, GLint location, GLsizei count,
> const GLdouble * value)
> {
> + GET_CURRENT_CONTEXT(ctx);
> + struct gl_shader_program *shProg =
> + _mesa_lookup_shader_program_err(ctx, program,
> + "glProgramUniform4dv");
> + _mesa_uniform(ctx, shProg, location, count, value, GLSL_TYPE_DOUBLE, 4);
> }
>
> void GLAPIENTRY
> _mesa_ProgramUniformMatrix2dv(GLuint program, GLint location, GLsizei count,
> GLboolean transpose, const GLdouble * value)
> {
> + GET_CURRENT_CONTEXT(ctx);
> + struct gl_shader_program *shProg =
> + _mesa_lookup_shader_program_err(ctx, program,
> + "glProgramUniformMatrix2dv");
> + _mesa_uniform_matrix(ctx, shProg, 2, 2, location, count, transpose, value, GL_DOUBLE);
> }
>
> void GLAPIENTRY
> _mesa_ProgramUniformMatrix3dv(GLuint program, GLint location, GLsizei count,
> GLboolean transpose, const GLdouble * value)
> {
> + GET_CURRENT_CONTEXT(ctx);
> + struct gl_shader_program *shProg =
> + _mesa_lookup_shader_program_err(ctx, program,
> + "glProgramUniformMatrix3dv");
> + _mesa_uniform_matrix(ctx, shProg, 3, 3, location, count, transpose, value, GL_DOUBLE);
> }
>
> void GLAPIENTRY
> _mesa_ProgramUniformMatrix4dv(GLuint program, GLint location, GLsizei count,
> GLboolean transpose, const GLdouble * value)
> {
> + GET_CURRENT_CONTEXT(ctx);
> + struct gl_shader_program *shProg =
> + _mesa_lookup_shader_program_err(ctx, program,
> + "glProgramUniformMatrix4dv");
> + _mesa_uniform_matrix(ctx, shProg, 4, 4, location, count, transpose, value, GL_DOUBLE);
> }
>
> void GLAPIENTRY
> _mesa_ProgramUniformMatrix2x3dv(GLuint program, GLint location, GLsizei count,
> GLboolean transpose, const GLdouble * value)
> {
> + GET_CURRENT_CONTEXT(ctx);
> + struct gl_shader_program *shProg =
> + _mesa_lookup_shader_program_err(ctx, program,
> + "glProgramUniformMatrix2x3dv");
> + _mesa_uniform_matrix(ctx, shProg, 2, 3, location, count, transpose, value, GL_DOUBLE);
> }
>
> void GLAPIENTRY
> _mesa_ProgramUniformMatrix3x2dv(GLuint program, GLint location, GLsizei count,
> GLboolean transpose, const GLdouble * value)
> {
> + GET_CURRENT_CONTEXT(ctx);
> + struct gl_shader_program *shProg =
> + _mesa_lookup_shader_program_err(ctx, program,
> + "glProgramUniformMatrix3x2dv");
> + _mesa_uniform_matrix(ctx, shProg, 3, 2, location, count, transpose, value, GL_DOUBLE);
> }
>
> void GLAPIENTRY
> _mesa_ProgramUniformMatrix2x4dv(GLuint program, GLint location, GLsizei count,
> GLboolean transpose, const GLdouble * value)
> {
> + GET_CURRENT_CONTEXT(ctx);
> + struct gl_shader_program *shProg =
> + _mesa_lookup_shader_program_err(ctx, program,
> + "glProgramUniformMatrix2x4dv");
> + _mesa_uniform_matrix(ctx, shProg, 2, 4, location, count, transpose, value, GL_DOUBLE);
> }
>
> void GLAPIENTRY
> _mesa_ProgramUniformMatrix4x2dv(GLuint program, GLint location, GLsizei count,
> GLboolean transpose, const GLdouble * value)
> {
> + GET_CURRENT_CONTEXT(ctx);
> + struct gl_shader_program *shProg =
> + _mesa_lookup_shader_program_err(ctx, program,
> + "glProgramUniformMatrix4x2dv");
> + _mesa_uniform_matrix(ctx, shProg, 4, 2, location, count, transpose, value, GL_DOUBLE);
> }
>
> void GLAPIENTRY
> _mesa_ProgramUniformMatrix3x4dv(GLuint program, GLint location, GLsizei count,
> GLboolean transpose, const GLdouble * value)
> {
> + GET_CURRENT_CONTEXT(ctx);
> + struct gl_shader_program *shProg =
> + _mesa_lookup_shader_program_err(ctx, program,
> + "glProgramUniformMatrix3x4dv");
> + _mesa_uniform_matrix(ctx, shProg, 3, 4, location, count, transpose, value, GL_DOUBLE);
> }
>
> void GLAPIENTRY
> _mesa_ProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count,
> GLboolean transpose, const GLdouble * value)
> {
> + GET_CURRENT_CONTEXT(ctx);
> + struct gl_shader_program *shProg =
> + _mesa_lookup_shader_program_err(ctx, program,
> + "glProgramUniformMatrix4x3dv");
> + _mesa_uniform_matrix(ctx, shProg, 4, 3, location, count, transpose, value, GL_DOUBLE);
> }
> diff --git a/src/mesa/main/uniforms.h b/src/mesa/main/uniforms.h
> index 520fbbf..0e6113f 100644
> --- a/src/mesa/main/uniforms.h
> +++ b/src/mesa/main/uniforms.h
> @@ -362,7 +362,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 725e51d..54413cd 100644
> --- a/src/mesa/program/ir_to_mesa.cpp
> +++ b/src/mesa/program/ir_to_mesa.cpp
> @@ -606,6 +606,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;
Indentation looks funny there. Using tabs?
> case GLSL_TYPE_ARRAY:
> assert(type->length > 0);
> return type_size(type->fields.array) * type->length;
> @@ -2489,6 +2497,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);
> @@ -2500,6 +2509,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;
> @@ -2524,8 +2537,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,
> ¶ms->ParameterValues[i]);
>
> diff --git a/src/mesa/program/prog_parameter.c b/src/mesa/program/prog_parameter.c
> index 0ef4641..e1bbc00 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);
>
> @@ -150,15 +156,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;
> @@ -176,7 +182,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