[Mesa-dev] [PATCH 05/27] mesa: add support for 64-bit integer uniforms.

Ian Romanick idr at freedesktop.org
Wed Jun 29 22:29:17 UTC 2016


On 06/19/2016 10:06 PM, Dave Airlie wrote:
> From: Dave Airlie <airlied at redhat.com>
> 
> This hooks up the API to the internals for 64-bit integer uniforms.
> 
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
>  src/mesa/main/uniform_query.cpp |  60 +++++++++++++-
>  src/mesa/main/uniforms.c        | 170 +++++++++++++++++++++++++++++++++++++++-
>  2 files changed, 225 insertions(+), 5 deletions(-)
> 
> diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp
> index 127f097..08f2555 100644
> --- a/src/mesa/main/uniform_query.cpp
> +++ b/src/mesa/main/uniform_query.cpp
> @@ -333,7 +333,8 @@ _mesa_get_uniform(struct gl_context *ctx, GLuint program, GLint location,
>  	 &uni->storage[offset * elements * dmul];
>  
>        assert(returnType == GLSL_TYPE_FLOAT || returnType == GLSL_TYPE_INT ||
> -             returnType == GLSL_TYPE_UINT || returnType == GLSL_TYPE_DOUBLE);
> +             returnType == GLSL_TYPE_UINT || returnType == GLSL_TYPE_DOUBLE ||
> +             returnType == GLSL_TYPE_UINT64 || returnType == GLSL_TYPE_INT64);
>  
>        /* doubles have a different size than the other 3 types */
>        unsigned bytes = sizeof(src[0]) * elements * rmul;
> @@ -355,7 +356,11 @@ _mesa_get_uniform(struct gl_context *ctx, GLuint program, GLint location,
>  	      (uni->type->base_type == GLSL_TYPE_INT
>  	       || uni->type->base_type == GLSL_TYPE_UINT
>                 || uni->type->base_type == GLSL_TYPE_SAMPLER
> -               || uni->type->base_type == GLSL_TYPE_IMAGE))) {
> +               || uni->type->base_type == GLSL_TYPE_IMAGE))
> +          || ((returnType == GLSL_TYPE_UINT64 ||
> +               returnType == GLSL_TYPE_INT64 ) &&
> +              (uni->type->base_type == GLSL_TYPE_UINT64 ||
> +               uni->type->base_type == GLSL_TYPE_INT64))) {
>  	 memcpy(paramsOut, src, bytes);
>        } else {
>  	 union gl_constant_value *const dst =
> @@ -385,6 +390,12 @@ _mesa_get_uniform(struct gl_context *ctx, GLuint program, GLint location,
>  	       case GLSL_TYPE_DOUBLE:
>  		  dst[didx].f = *(double *)&src[sidx].f;
>  		  break;
> +               case GLSL_TYPE_UINT64:
> +                  dst[didx].f = *(uint64_t *)&src[sidx].u;
> +                  break;
> +               case GLSL_TYPE_INT64:
> +                  dst[didx].f = *(int64_t *)&src[sidx].i;
> +                  break;

This hunk and a few below will conflict with Matt's "Enable
-fstrict-aliasing" series.  I think his patch 2 provides a model to
avoid the problem.

>  	       default:
>  		  assert(!"Should not get here.");
>  		  break;
> @@ -406,6 +417,12 @@ _mesa_get_uniform(struct gl_context *ctx, GLuint program, GLint location,
>  	       case GLSL_TYPE_FLOAT:
>  		  *(double *)&dst[didx].f = (double) src[sidx].f;
>  		  break;
> +               case GLSL_TYPE_UINT64:
> +                  *(double *)&dst[didx].f = *(uint64_t *)&src[sidx].u;
> +                  break;
> +               case GLSL_TYPE_INT64:
> +                  *(double *)&dst[didx].f = *(int64_t *)&src[sidx].i;
> +                  break;
>  	       default:
>  		  assert(!"Should not get here.");
>  		  break;
> @@ -440,12 +457,39 @@ _mesa_get_uniform(struct gl_context *ctx, GLuint program, GLint location,
>  	       case GLSL_TYPE_DOUBLE:
>  		  dst[didx].i = IROUNDD(*(double *)&src[sidx].f);
>  		  break;
> +               case GLSL_TYPE_UINT64:
> +                  dst[didx].i = *(uint64_t *)&src[sidx].u;
> +                  break;
> +               case GLSL_TYPE_INT64:
> +                  dst[didx].i = *(int64_t *)&src[sidx].i;
> +                  break;
>  	       default:
>  		  assert(!"Should not get here.");
>  		  break;
>  	       }
>  	       break;
> -
> +            case GLSL_TYPE_INT64:
> +            case GLSL_TYPE_UINT64:
> +               switch (uni->type->base_type) {
> +               case GLSL_TYPE_UINT:
> +                  *(int64_t *)&dst[didx].u = (int64_t) src[sidx].u;
> +                  break;
> +               case GLSL_TYPE_INT:
> +               case GLSL_TYPE_SAMPLER:
> +               case GLSL_TYPE_IMAGE:
> +                  *(int64_t *)&dst[didx].u = (int64_t) src[sidx].i;
> +                  break;
> +               case GLSL_TYPE_BOOL:
> +                  *(int64_t *)&dst[didx].u = src[sidx].i ? 1.0f : 0.0f;
> +                  break;
> +               case GLSL_TYPE_FLOAT:
> +                  *(int64_t *)&dst[didx].u = (int64_t) src[sidx].f;
> +                  break;
> +               default:
> +                  assert(!"Should not get here.");
> +                  break;
> +               }
> +               break;
>  	    default:
>  	       assert(!"Should not get here.");
>  	       break;
> @@ -483,6 +527,12 @@ log_uniform(const void *values, enum glsl_base_type basicType,
>        case GLSL_TYPE_INT:
>  	 printf("%d ", v[i].i);
>  	 break;
> +      case GLSL_TYPE_UINT64:
> +         printf("%lu ", *(uint64_t* )&v[i * 2].u);
> +         break;
> +      case GLSL_TYPE_INT64:
> +         printf("%ld ", *(int64_t* )&v[i * 2].u);
> +         break;
>        case GLSL_TYPE_FLOAT:
>  	 printf("%g ", v[i].f);
>  	 break;
> @@ -634,6 +684,10 @@ glsl_type_name(enum glsl_base_type type)
>        return "float";
>     case GLSL_TYPE_DOUBLE:
>        return "double";
> +   case GLSL_TYPE_UINT64:
> +      return "uint64";
> +   case GLSL_TYPE_INT64:
> +      return "int64";
>     case GLSL_TYPE_BOOL:
>        return "bool";
>     case GLSL_TYPE_SAMPLER:
> diff --git a/src/mesa/main/uniforms.c b/src/mesa/main/uniforms.c
> index 4d88266..8757571 100644
> --- a/src/mesa/main/uniforms.c
> +++ b/src/mesa/main/uniforms.c
> @@ -901,21 +901,27 @@ void GLAPIENTRY
>  _mesa_GetnUniformi64vARB(GLuint program, GLint location,
>                           GLsizei bufSize, GLint64 *params)
>  {
> -
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_get_uniform(ctx, program, location, bufSize, GLSL_TYPE_INT64, params);
>  }
>  void GLAPIENTRY
>  _mesa_GetUniformi64vARB(GLuint program, GLint location, GLint64 *params)
>  {
> +   _mesa_GetnUniformi64vARB(program, location, INT_MAX, params);
>  }
>  
>  void GLAPIENTRY
>  _mesa_GetnUniformui64vARB(GLuint program, GLint location,
>                           GLsizei bufSize, GLuint64 *params)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_get_uniform(ctx, program, location, bufSize, GLSL_TYPE_UINT64, params);
>  }
> +
>  void GLAPIENTRY
>  _mesa_GetUniformui64vARB(GLuint program, GLint location, GLuint64 *params)
>  {
> +   _mesa_GetnUniformui64vARB(program, location, INT_MAX, params);
>  }
>  
>  
> @@ -1635,160 +1641,320 @@ _mesa_ProgramUniformMatrix4x3dv(GLuint program, GLint location, GLsizei count,
>  void GLAPIENTRY
>  _mesa_Uniform1i64ARB(GLint location, GLint64 v0)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, &v0, GLSL_TYPE_INT64, 1);
>  }
>  
>  void GLAPIENTRY
>  _mesa_Uniform2i64ARB(GLint location, GLint64 v0, GLint64 v1)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   int64_t v[2];
> +   v[0] = v0;
> +   v[1] = v1;
> +   _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, v, GLSL_TYPE_INT64, 2);
>  }
>  
>  void GLAPIENTRY
>  _mesa_Uniform3i64ARB(GLint location, GLint64 v0, GLint64 v1, GLint64 v2)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   int64_t v[3];
> +   v[0] = v0;
> +   v[1] = v1;
> +   v[2] = v2;
> +   _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, v, GLSL_TYPE_INT64, 3);
>  }
>  
>  void GLAPIENTRY
>  _mesa_Uniform4i64ARB(GLint location,  GLint64 v0, GLint64 v1, GLint64 v2, GLint64 v3)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   int64_t 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_INT64, 4);
>  }
>  
>  void GLAPIENTRY
>  _mesa_Uniform1i64vARB(GLint location, GLsizei count, const GLint64 *value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, value, GLSL_TYPE_INT64, 1);
>  }
>  
>  void GLAPIENTRY
>  _mesa_Uniform2i64vARB(GLint location,  GLsizei count, const GLint64 *value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, value, GLSL_TYPE_INT64, 2);
>  }
>  
>  void GLAPIENTRY
>  _mesa_Uniform3i64vARB(GLint location,  GLsizei count, const GLint64 *value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, value, GLSL_TYPE_INT64, 3);
>  }
>  
>  void GLAPIENTRY
>  _mesa_Uniform4i64vARB(GLint location,  GLsizei count, const GLint64 *value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, value, GLSL_TYPE_INT64, 4);
>  }
>  
>  void GLAPIENTRY
>  _mesa_Uniform1ui64ARB(GLint location,  GLuint64 v0)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, &v0, GLSL_TYPE_UINT64, 1);
>  }
>  
>  void GLAPIENTRY
>  _mesa_Uniform2ui64ARB(GLint location,  GLuint64 v0, GLuint64 v1)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   uint64_t v[2];
> +   v[0] = v0;
> +   v[1] = v1;
> +   _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, v, GLSL_TYPE_UINT64, 2);
>  }
>  
>  void GLAPIENTRY
>  _mesa_Uniform3ui64ARB(GLint location, GLuint64 v0, GLuint64 v1, GLuint64 v2)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   uint64_t v[3];
> +   v[0] = v0;
> +   v[1] = v1;
> +   v[2] = v2;
> +   _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, v, GLSL_TYPE_UINT64, 3);
>  }
>  
>  void GLAPIENTRY
>  _mesa_Uniform4ui64ARB(GLint location,  GLuint64 v0, GLuint64 v1, GLuint64 v2, GLuint64 v3)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   uint64_t 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_UINT64, 4);
>  }
>  
>  void GLAPIENTRY
>  _mesa_Uniform1ui64vARB(GLint location,  GLsizei count, const GLuint64 *value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, value, GLSL_TYPE_UINT64, 1);
>  }
>  
>  void GLAPIENTRY
>  _mesa_Uniform2ui64vARB(GLint location,  GLsizei count, const GLuint64 *value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, value, GLSL_TYPE_UINT64, 2);
>  }
>  
>  void GLAPIENTRY
>  _mesa_Uniform3ui64vARB(GLint location,  GLsizei count, const GLuint64 *value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, value, GLSL_TYPE_UINT64, 3);
>  }
>  
>  void GLAPIENTRY
>  _mesa_Uniform4ui64vARB(GLint location,  GLsizei count, const GLuint64 *value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   _mesa_uniform(ctx, ctx->_Shader->ActiveProgram, location, 1, value, GLSL_TYPE_UINT64, 4);
>  }
>  
> -/* DSA int64 entrypoints */
> +/* DSA entrypoints */
>  void GLAPIENTRY
>  _mesa_ProgramUniform1i64ARB(GLuint program, GLint location, GLint64 v0)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   struct gl_shader_program *shProg =
> +      _mesa_lookup_shader_program_err(ctx, program,
> +            "glProgramUniform1i64ARB");
> +   _mesa_uniform(ctx, shProg, location, 1, &v0, GLSL_TYPE_INT64, 1);
>  }
>  
>  void GLAPIENTRY
>  _mesa_ProgramUniform2i64ARB(GLuint program, GLint location, GLint64 v0, GLint64 v1)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   struct gl_shader_program *shProg =
> +      _mesa_lookup_shader_program_err(ctx, program,
> +                                      "glProgramUniform2i64ARB");
> +   int64_t v[2];
> +   v[0] = v0;
> +   v[1] = v1;
> +   _mesa_uniform(ctx, shProg, location, 1, v, GLSL_TYPE_INT64, 2);
>  }
>  
>  void GLAPIENTRY
>  _mesa_ProgramUniform3i64ARB(GLuint program, GLint location, GLint64 v0, GLint64 v1, GLint64 v2)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   struct gl_shader_program *shProg =
> +      _mesa_lookup_shader_program_err(ctx, program,
> +                                      "glProgramUniform3i64ARB");
> +   int64_t v[3];
> +   v[0] = v0;
> +   v[1] = v1;
> +   v[2] = v2;
> +   _mesa_uniform(ctx, shProg, location, 1, v, GLSL_TYPE_INT64, 3);
>  }
>  
>  void GLAPIENTRY
>  _mesa_ProgramUniform4i64ARB(GLuint program, GLint location,  GLint64 v0, GLint64 v1, GLint64 v2, GLint64 v3)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   struct gl_shader_program *shProg =
> +      _mesa_lookup_shader_program_err(ctx, program,
> +                                      "glProgramUniform4i64ARB");
> +   int64_t v[4];
> +   v[0] = v0;
> +   v[1] = v1;
> +   v[2] = v2;
> +   v[3] = v3;
> +   _mesa_uniform(ctx, shProg, location, 1, v, GLSL_TYPE_INT64, 4);
>  }
>  
>  void GLAPIENTRY
>  _mesa_ProgramUniform1i64vARB(GLuint program, GLint location, GLsizei count, const GLint64 *value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   struct gl_shader_program *shProg =
> +      _mesa_lookup_shader_program_err(ctx, program,
> +                                      "glProgramUniform1i64vARB");
> +   _mesa_uniform(ctx, shProg, location, 1, value, GLSL_TYPE_INT64, 1);
>  }
>  
>  void GLAPIENTRY
>  _mesa_ProgramUniform2i64vARB(GLuint program, GLint location,  GLsizei count, const GLint64 *value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   struct gl_shader_program *shProg =
> +      _mesa_lookup_shader_program_err(ctx, program,
> +                                      "glProgramUniform2i64vARB");
> +   _mesa_uniform(ctx, shProg, location, 1, value, GLSL_TYPE_INT64, 2);
>  }
>  
>  void GLAPIENTRY
>  _mesa_ProgramUniform3i64vARB(GLuint program, GLint location,  GLsizei count, const GLint64 *value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   struct gl_shader_program *shProg =
> +      _mesa_lookup_shader_program_err(ctx, program,
> +                                      "glProgramUniform3i64vARB");
> +   _mesa_uniform(ctx, shProg, location, 1, value, GLSL_TYPE_INT64, 3);
>  }
>  
>  void GLAPIENTRY
>  _mesa_ProgramUniform4i64vARB(GLuint program, GLint location,  GLsizei count, const GLint64 *value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   struct gl_shader_program *shProg =
> +      _mesa_lookup_shader_program_err(ctx, program,
> +                                      "glProgramUniform4i64vARB");
> +   _mesa_uniform(ctx, shProg, location, 1, value, GLSL_TYPE_INT64, 4);
>  }
>  
>  void GLAPIENTRY
>  _mesa_ProgramUniform1ui64ARB(GLuint program, GLint location,  GLuint64 v0)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   struct gl_shader_program *shProg =
> +      _mesa_lookup_shader_program_err(ctx, program,
> +                                      "glProgramUniform1ui64ARB");
> +   _mesa_uniform(ctx, shProg, location, 1, &v0, GLSL_TYPE_UINT64, 1);
>  }
>  
>  void GLAPIENTRY
>  _mesa_ProgramUniform2ui64ARB(GLuint program, GLint location,  GLuint64 v0, GLuint64 v1)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   struct gl_shader_program *shProg =
> +      _mesa_lookup_shader_program_err(ctx, program,
> +                                      "glProgramUniform2ui64ARB");
> +   uint64_t v[2];
> +   v[0] = v0;
> +   v[1] = v1;
> +   _mesa_uniform(ctx, shProg, location, 1, v, GLSL_TYPE_UINT64, 2);
>  }
>  
>  void GLAPIENTRY
>  _mesa_ProgramUniform3ui64ARB(GLuint program, GLint location, GLuint64 v0, GLuint64 v1, GLuint64 v2)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   struct gl_shader_program *shProg =
> +      _mesa_lookup_shader_program_err(ctx, program,
> +                                      "glProgramUniform3ui64ARB");
> +   uint64_t v[3];
> +   v[0] = v0;
> +   v[1] = v1;
> +   v[2] = v2;
> +   _mesa_uniform(ctx, shProg, location, 1, v, GLSL_TYPE_UINT64, 3);
>  }
>  
>  void GLAPIENTRY
>  _mesa_ProgramUniform4ui64ARB(GLuint program, GLint location,  GLuint64 v0, GLuint64 v1, GLuint64 v2, GLuint64 v3)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   struct gl_shader_program *shProg =
> +      _mesa_lookup_shader_program_err(ctx, program,
> +                                      "glProgramUniform4ui64ARB");
> +   uint64_t v[4];
> +   v[0] = v0;
> +   v[1] = v1;
> +   v[2] = v2;
> +   v[3] = v3;
> +   _mesa_uniform(ctx, shProg, location, 1, v, GLSL_TYPE_UINT64, 4);
>  }
>  
>  void GLAPIENTRY
>  _mesa_ProgramUniform1ui64vARB(GLuint program, GLint location,  GLsizei count, const GLuint64 *value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   struct gl_shader_program *shProg =
> +      _mesa_lookup_shader_program_err(ctx, program,
> +                                      "glProgramUniform1ui64vARB");
> +   _mesa_uniform(ctx, shProg, location, 1, value, GLSL_TYPE_UINT64, 1);
>  }
>  
>  void GLAPIENTRY
>  _mesa_ProgramUniform2ui64vARB(GLuint program, GLint location,  GLsizei count, const GLuint64 *value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   struct gl_shader_program *shProg =
> +      _mesa_lookup_shader_program_err(ctx, program,
> +                                      "glProgramUniform2ui64vARB");
> +   _mesa_uniform(ctx, shProg, location, 1, value, GLSL_TYPE_UINT64, 2);
>  }
>  
>  void GLAPIENTRY
>  _mesa_ProgramUniform3ui64vARB(GLuint program, GLint location,  GLsizei count, const GLuint64 *value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   struct gl_shader_program *shProg =
> +      _mesa_lookup_shader_program_err(ctx, program,
> +                                      "glProgramUniform3ui64vARB");
> +   _mesa_uniform(ctx, shProg, location, 1, value, GLSL_TYPE_UINT64, 3);
>  }
>  
>  void GLAPIENTRY
>  _mesa_ProgramUniform4ui64vARB(GLuint program, GLint location,  GLsizei count, const GLuint64 *value)
>  {
> +   GET_CURRENT_CONTEXT(ctx);
> +   struct gl_shader_program *shProg =
> +      _mesa_lookup_shader_program_err(ctx, program,
> +                                      "glProgramUniform4ui64vARB");
> +   _mesa_uniform(ctx, shProg, location, 1, value, GLSL_TYPE_UINT64, 4);
>  }
> 



More information about the mesa-dev mailing list