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, 226 insertions(+), 4 deletions(-) diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp index eea611b..169db46 100644 --- a/src/mesa/main/uniform_query.cpp +++ b/src/mesa/main/uniform_query.cpp @@ -332,7 +332,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; @@ -354,7 +355,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 = @@ -384,6 +389,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; default: assert(!"Should not get here."); break; @@ -405,6 +416,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; @@ -439,12 +456,41 @@ _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; + break; default: assert(!"Should not get here."); break; @@ -482,6 +528,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; @@ -633,6 +685,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 13577ae..b6c00e9 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); } -- 2.5.5 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev