--- src/mapi/glapi/gen/ARB_direct_state_access.xml | 14 +++ src/mesa/main/texparam.c | 136 ++++++++++++++++++++----- src/mesa/main/texparam.h | 9 ++ 3 files changed, 131 insertions(+), 28 deletions(-)
diff --git a/src/mapi/glapi/gen/ARB_direct_state_access.xml b/src/mapi/glapi/gen/ARB_direct_state_access.xml index 9658fd1..c4213eb 100644 --- a/src/mapi/glapi/gen/ARB_direct_state_access.xml +++ b/src/mapi/glapi/gen/ARB_direct_state_access.xml @@ -116,5 +116,19 @@ <param name="texture" type="GLuint" /> </function> + <function name="GetTextureLevelParameterfv" offset="assign"> + <param name="texture" type="GLuint" /> + <param name="level" type="GLint" /> + <param name="pname" type="GLenum" /> + <param name="params" type="GLfloat *" /> + </function> + + <function name="GetTextureLevelParameteriv" offset="assign"> + <param name="texture" type="GLuint" /> + <param name="level" type="GLint" /> + <param name="pname" type="GLenum" /> + <param name="params" type="GLint *" /> + </function> + </category> </OpenGLAPI> diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c index 6e3a877..51fbd2a 100644 --- a/src/mesa/main/texparam.c +++ b/src/mesa/main/texparam.c @@ -1285,7 +1285,8 @@ static void get_tex_level_parameter_image(struct gl_context *ctx, const struct gl_texture_object *texObj, GLenum target, GLint level, - GLenum pname, GLint *params) + GLenum pname, GLint *params, + const char *func) { const struct gl_texture_image *img = NULL; struct gl_texture_image dummy_image; @@ -1400,7 +1401,7 @@ get_tex_level_parameter_image(struct gl_context *ctx, } else { _mesa_error(ctx, GL_INVALID_OPERATION, - "glGetTexLevelParameter[if]v(pname)"); + "%s(pname)", func); } break; case GL_TEXTURE_COMPRESSED: @@ -1448,7 +1449,7 @@ get_tex_level_parameter_image(struct gl_context *ctx, invalid_pname: _mesa_error(ctx, GL_INVALID_ENUM, - "glGetTexLevelParameter[if]v(pname=%s)", + "%s(pname=%s)", func, _mesa_lookup_enum_by_nr(pname)); } @@ -1456,7 +1457,8 @@ invalid_pname: static void get_tex_level_parameter_buffer(struct gl_context *ctx, const struct gl_texture_object *texObj, - GLenum pname, GLint *params) + GLenum pname, GLint *params, + const char *func) { const struct gl_buffer_object *bo = texObj->BufferObject; mesa_format texFormat = texObj->_BufferObjectFormat; @@ -1531,7 +1533,7 @@ get_tex_level_parameter_buffer(struct gl_context *ctx, case GL_TEXTURE_COMPRESSED_IMAGE_SIZE: /* Always illegal for GL_TEXTURE_BUFFER */ _mesa_error(ctx, GL_INVALID_OPERATION, - "glGetTexLevelParameter[if]v(pname)"); + "%s(pname)", func); break; /* GL_ARB_texture_float */ @@ -1559,57 +1561,135 @@ get_tex_level_parameter_buffer(struct gl_context *ctx, invalid_pname: _mesa_error(ctx, GL_INVALID_ENUM, - "glGetTexLevelParameter[if]v(pname=%s)", + "%s(pname=%s)", func, _mesa_lookup_enum_by_nr(pname)); } +static bool +levels_valid( struct gl_context *ctx, GLenum target, GLint level, + const char *func) +{ + GLint maxLevels; + + /* Need this because glGetTexLevelParameteri and f are different. We don't + * want to keep track of both the dsa flag and iv, i, f, etc. That's too + * much work. */ + bool dsa = strstr(func, "Texture") ? true : false; + + if (ctx->Texture.CurrentUnit >= ctx->Const.MaxCombinedTextureImageUnits) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "%s(current unit)", func); + return false; + } + + if (!legal_get_tex_level_parameter_target(ctx, target, dsa)) { + _mesa_error(ctx, GL_INVALID_ENUM, + "%s(target=0x%x)", func, target); + return false; + } + + maxLevels = _mesa_max_texture_levels(ctx, target); + assert(maxLevels != 0); + + if (level < 0 || level >= maxLevels) { + _mesa_error( ctx, GL_INVALID_VALUE, "%s", func ); + return false; + } + + return true; +} + +/** + * This isn't exposed to the rest of the driver because it is a part of the + * OpenGL API that is rarely used. + */ +static void +get_tex_level_parameteriv( struct gl_context *ctx, + struct gl_texture_object *texObj, + GLenum target, GLint level, + GLenum pname, GLint *params, + const char *func ) +{ + if (!levels_valid(ctx, target, level, func)) + return; + + if (target == GL_TEXTURE_BUFFER) { + get_tex_level_parameter_buffer(ctx, texObj, pname, params, func); + } + else { + get_tex_level_parameter_image(ctx, texObj, target, + level, pname, params, func); + } +} + void GLAPIENTRY _mesa_GetTexLevelParameterfv( GLenum target, GLint level, GLenum pname, GLfloat *params ) { + struct gl_texture_object *texObj; GLint iparam; - _mesa_GetTexLevelParameteriv( target, level, pname, &iparam ); + GET_CURRENT_CONTEXT(ctx); + + texObj = _mesa_get_current_tex_object(ctx, target); + if (!texObj) + return; + + get_tex_level_parameteriv(ctx, texObj, target, level, + pname, &iparam, "glGetTexLevelParameterfv"); + *params = (GLfloat) iparam; } - void GLAPIENTRY _mesa_GetTexLevelParameteriv( GLenum target, GLint level, GLenum pname, GLint *params ) { struct gl_texture_object *texObj; - GLint maxLevels; GET_CURRENT_CONTEXT(ctx); - if (ctx->Texture.CurrentUnit >= ctx->Const.MaxCombinedTextureImageUnits) { - _mesa_error(ctx, GL_INVALID_OPERATION, - "glGetTexLevelParameteriv(current unit)"); + texObj = _mesa_get_current_tex_object(ctx, target); + if (!texObj) return; - } - if (!legal_get_tex_level_parameter_target(ctx, target, false)) { - _mesa_error(ctx, GL_INVALID_ENUM, - "glGetTexLevelParameter[if]v(target=0x%x)", target); - return; - } + get_tex_level_parameteriv(ctx, texObj, target, level, + pname, params, "glGetTexLevelParameteriv"); +} - maxLevels = _mesa_max_texture_levels(ctx, target); - assert(maxLevels != 0); +void GLAPIENTRY +_mesa_GetTextureLevelParameterfv( GLuint texture, GLint level, + GLenum pname, GLfloat *params ) +{ + struct gl_texture_object *texObj; + GLint iparam; + GET_CURRENT_CONTEXT(ctx); - if (level < 0 || level >= maxLevels) { - _mesa_error( ctx, GL_INVALID_VALUE, "glGetTexLevelParameter[if]v" ); + texObj = _mesa_lookup_texture_err(ctx, texture, + "glGetTextureLevelParameterfv"); + if (!texObj) return; - } - texObj = _mesa_get_current_tex_object(ctx, target); + get_tex_level_parameteriv(ctx, texObj, texObj->Target, level, + pname, &iparam, "glGetTextureLevelParameterfv"); - if (target == GL_TEXTURE_BUFFER) - get_tex_level_parameter_buffer(ctx, texObj, pname, params); - else - get_tex_level_parameter_image(ctx, texObj, target, level, pname, params); + *params = (GLfloat) iparam; } +void GLAPIENTRY +_mesa_GetTextureLevelParameteriv( GLuint texture, GLint level, + GLenum pname, GLint *params ) +{ + struct gl_texture_object *texObj; + GET_CURRENT_CONTEXT(ctx); + + texObj = _mesa_lookup_texture_err(ctx, texture, + "glGetTextureLevelParameteriv"); + if (!texObj) + return; + + get_tex_level_parameteriv(ctx, texObj, texObj->Target, level, + pname, params, "glGetTextureLevelParameteriv"); +} void GLAPIENTRY _mesa_GetTexParameterfv( GLenum target, GLenum pname, GLfloat *params ) diff --git a/src/mesa/main/texparam.h b/src/mesa/main/texparam.h index a2fb3ff..05aeb8a 100644 --- a/src/mesa/main/texparam.h +++ b/src/mesa/main/texparam.h @@ -81,6 +81,15 @@ _mesa_GetTexLevelParameteriv( GLenum target, GLint level, GLenum pname, GLint *params ); extern void GLAPIENTRY +_mesa_GetTextureLevelParameterfv( GLuint texture, GLint level, + GLenum pname, GLfloat *params ); + +extern void GLAPIENTRY +_mesa_GetTextureLevelParameteriv( GLuint texture, GLint level, + GLenum pname, GLint *params ); + + +extern void GLAPIENTRY _mesa_GetTexParameterfv( GLenum target, GLenum pname, GLfloat *params ); extern void GLAPIENTRY -- 2.1.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev