On 06/19/2016 10:06 PM, Dave Airlie wrote: > From: Dave Airlie <airl...@redhat.com> > > This hooks up the API to the internals for 64-bit integer uniforms. > > Signed-off-by: Dave Airlie <airl...@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); > } > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev