This has been fairly extensively updated, per your comments: http://cgit.freedesktop.org/~ldeks/mesa/commit/?h=adsa-textures&id=9a3a8c4fcc95cc6e8834cd7af6b5d8c262942d9a
Thanks. Laura On Tue, Dec 16, 2014 at 7:46 AM, Brian Paul <bri...@vmware.com> wrote: > On 12/15/2014 06:22 PM, Laura Ekstrand wrote: > >> --- >> 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) >> > > s/levels/level/ and add a comment on the function? > > > +{ >> + 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; >> > > This seems kind of clunky. > > > > + >> + 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 >> >> >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev