mesa: add EXT_dsa glEnabledIndexedEXT

The implementation uses _mesa_ActiveTexture to change the active texture unit and
then reset it.

It causes an unnecessary _NEW_TEXTURE_STATE but:
  - adding an index argument to _mesa_set_enable causes a lot of changes (~140 callers)
  - enable_texture (called by _mesa_set_enable) might cause a _NEW_TEXTURE_STATE
    anyway.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Pierre-Eric Pelloux-Prayer 2019-04-26 16:50:57 +02:00 committed by Marek Olšák
parent ff0cafc8f3
commit b1efc9d05f
2 changed files with 74 additions and 0 deletions

View file

@ -1246,6 +1246,28 @@ _mesa_set_enablei(struct gl_context *ctx, GLenum cap,
ctx->Scissor.EnableFlags &= ~(1 << index);
}
break;
/* EXT_direct_state_access */
case GL_TEXTURE_1D:
case GL_TEXTURE_2D:
case GL_TEXTURE_3D:
case GL_TEXTURE_CUBE_MAP:
case GL_TEXTURE_GEN_S:
case GL_TEXTURE_GEN_T:
case GL_TEXTURE_GEN_R:
case GL_TEXTURE_GEN_Q:
case GL_TEXTURE_RECTANGLE_ARB: {
const GLuint curTexUnitSave = ctx->Texture.CurrentUnit;
if (index >= MAX2(ctx->Const.MaxCombinedTextureImageUnits,
ctx->Const.MaxTextureCoordUnits)) {
_mesa_error(ctx, GL_INVALID_VALUE, "%s(index=%u)",
state ? "glEnablei" : "glDisablei", index);
return;
}
_mesa_ActiveTexture(GL_TEXTURE0 + index);
_mesa_set_enable( ctx, cap, state );
_mesa_ActiveTexture(GL_TEXTURE0 + curTexUnitSave);
break;
}
default:
goto invalid_enum_error;
}
@ -1294,6 +1316,29 @@ _mesa_IsEnabledi( GLenum cap, GLuint index )
return GL_FALSE;
}
return (ctx->Scissor.EnableFlags >> index) & 1;
/* EXT_direct_state_access */
case GL_TEXTURE_1D:
case GL_TEXTURE_2D:
case GL_TEXTURE_3D:
case GL_TEXTURE_CUBE_MAP:
case GL_TEXTURE_GEN_S:
case GL_TEXTURE_GEN_T:
case GL_TEXTURE_GEN_R:
case GL_TEXTURE_GEN_Q:
case GL_TEXTURE_RECTANGLE_ARB: {
GLboolean state;
const GLuint curTexUnitSave = ctx->Texture.CurrentUnit;
if (index >= MAX2(ctx->Const.MaxCombinedTextureImageUnits,
ctx->Const.MaxTextureCoordUnits)) {
_mesa_error(ctx, GL_INVALID_VALUE, "glIsEnabledIndexed(index=%u)",
index);
return GL_FALSE;
}
_mesa_ActiveTexture(GL_TEXTURE0 + index);
state = _mesa_IsEnabled(cap);
_mesa_ActiveTexture(GL_TEXTURE0 + curTexUnitSave);
return state;
}
default:
_mesa_error(ctx, GL_INVALID_ENUM, "glIsEnabledIndexed(cap=%s)",
_mesa_enum_to_string(cap));

View file

@ -2742,6 +2742,35 @@ find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
goto invalid_value;
_mesa_get_device_uuid(ctx, v->value_int_4);
return TYPE_INT_4;
/* GL_EXT_direct_state_access */
case GL_TEXTURE_1D:
case GL_TEXTURE_2D:
case GL_TEXTURE_3D:
case GL_TEXTURE_CUBE_MAP:
case GL_TEXTURE_GEN_S:
case GL_TEXTURE_GEN_T:
case GL_TEXTURE_GEN_R:
case GL_TEXTURE_GEN_Q:
case GL_TEXTURE_RECTANGLE_ARB: {
GLuint curTexUnitSave;
if (index >= _mesa_max_tex_unit(ctx))
goto invalid_enum;
curTexUnitSave = ctx->Texture.CurrentUnit;
_mesa_ActiveTexture_no_error(GL_TEXTURE0 + index);
v->value_int = _mesa_IsEnabled(pname);
_mesa_ActiveTexture_no_error(GL_TEXTURE0 + curTexUnitSave);
return TYPE_INT;
}
case GL_TEXTURE_COORD_ARRAY: {
GLuint curTexUnitSave;
if (index >= ctx->Const.MaxTextureCoordUnits)
goto invalid_enum;
curTexUnitSave = ctx->Array.ActiveTexture;
_mesa_ClientActiveTexture(GL_TEXTURE0 + index);
v->value_int = _mesa_IsEnabled(pname);
_mesa_ClientActiveTexture(GL_TEXTURE0 + curTexUnitSave);
return TYPE_INT;
}
}
invalid_enum: