mesa: optimize saving/restoring bound textures for glPush/PopAttrib

Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6946>
This commit is contained in:
Marek Olšák 2020-10-03 00:48:30 -04:00 committed by Marge Bot
parent 9a8b54285d
commit d0e18550e2
3 changed files with 18 additions and 117 deletions

View File

@ -241,8 +241,13 @@ _mesa_PushAttrib(GLbitfield mask)
/* copy state/contents of the currently bound texture objects */
for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
for (tex = 0; tex < NUM_TEXTURE_TARGETS; tex++) {
_mesa_copy_texture_object(&head->Texture.SavedObj[u][tex],
ctx->Texture.Unit[u].CurrentTex[tex]);
struct gl_texture_object *dst = &head->Texture.SavedObj[u][tex];
struct gl_texture_object *src = ctx->Texture.Unit[u].CurrentTex[tex];
dst->Target = src->Target;
dst->Name = src->Name;
memcpy(&dst->Sampler.Attrib, &src->Sampler.Attrib, sizeof(src->Sampler.Attrib));
memcpy(&dst->Attrib, &src->Attrib, sizeof(src->Attrib));
}
}
@ -563,70 +568,20 @@ pop_texture_group(struct gl_context *ctx, struct gl_texture_attrib_node *texstat
/* Restore texture object state for each target */
for (tgt = 0; tgt < NUM_TEXTURE_TARGETS; tgt++) {
const struct gl_texture_object *obj = NULL;
const struct gl_sampler_object *samp;
GLenum target;
const struct gl_texture_object *savedObj = &texstate->SavedObj[u][tgt];
struct gl_texture_object *texObj =
texObj = _mesa_get_tex_unit(ctx, u)->CurrentTex[tgt];
obj = &texstate->SavedObj[u][tgt];
/* don't restore state for unsupported targets to prevent
* raising GL errors.
*/
if (obj->Target == GL_TEXTURE_CUBE_MAP &&
!ctx->Extensions.ARB_texture_cube_map) {
continue;
if (texObj->Name != savedObj->Name) {
/* We don't need to check whether the texture target is supported,
* because we wouldn't get in this conditional block if it wasn't.
*/
_mesa_BindTexture_no_error(savedObj->Target, savedObj->Name);
}
else if (obj->Target == GL_TEXTURE_RECTANGLE_NV &&
!ctx->Extensions.NV_texture_rectangle) {
continue;
}
else if ((obj->Target == GL_TEXTURE_1D_ARRAY_EXT ||
obj->Target == GL_TEXTURE_2D_ARRAY_EXT) &&
!ctx->Extensions.EXT_texture_array) {
continue;
}
else if (obj->Target == GL_TEXTURE_CUBE_MAP_ARRAY &&
!ctx->Extensions.ARB_texture_cube_map_array) {
continue;
} else if (obj->Target == GL_TEXTURE_BUFFER)
continue;
else if (obj->Target == GL_TEXTURE_EXTERNAL_OES)
continue;
else if (obj->Target == GL_TEXTURE_2D_MULTISAMPLE ||
obj->Target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
continue;
target = obj->Target;
_mesa_BindTexture(target, obj->Name);
samp = &obj->Sampler;
_mesa_TexParameterfv(target, GL_TEXTURE_BORDER_COLOR, samp->Attrib.BorderColor.f);
_mesa_TexParameteri(target, GL_TEXTURE_WRAP_S, samp->Attrib.WrapS);
_mesa_TexParameteri(target, GL_TEXTURE_WRAP_T, samp->Attrib.WrapT);
_mesa_TexParameteri(target, GL_TEXTURE_WRAP_R, samp->Attrib.WrapR);
_mesa_TexParameteri(target, GL_TEXTURE_MIN_FILTER, samp->Attrib.MinFilter);
_mesa_TexParameteri(target, GL_TEXTURE_MAG_FILTER, samp->Attrib.MagFilter);
_mesa_TexParameterf(target, GL_TEXTURE_MIN_LOD, samp->Attrib.MinLod);
_mesa_TexParameterf(target, GL_TEXTURE_MAX_LOD, samp->Attrib.MaxLod);
_mesa_TexParameterf(target, GL_TEXTURE_LOD_BIAS, samp->Attrib.LodBias);
_mesa_TexParameterf(target, GL_TEXTURE_PRIORITY, obj->Attrib.Priority);
_mesa_TexParameteri(target, GL_TEXTURE_BASE_LEVEL, obj->Attrib.BaseLevel);
if (target != GL_TEXTURE_RECTANGLE_ARB)
_mesa_TexParameteri(target, GL_TEXTURE_MAX_LEVEL, obj->Attrib.MaxLevel);
if (ctx->Extensions.EXT_texture_filter_anisotropic) {
_mesa_TexParameterf(target, GL_TEXTURE_MAX_ANISOTROPY_EXT,
samp->Attrib.MaxAnisotropy);
}
if (ctx->Extensions.ARB_shadow) {
_mesa_TexParameteri(target, GL_TEXTURE_COMPARE_MODE,
samp->Attrib.CompareMode);
_mesa_TexParameteri(target, GL_TEXTURE_COMPARE_FUNC,
samp->Attrib.CompareFunc);
}
if (ctx->Extensions.ARB_depth_texture)
_mesa_TexParameteri(target, GL_DEPTH_TEXTURE_MODE, obj->Attrib.DepthMode);
memcpy(&texObj->Sampler.Attrib, &savedObj->Sampler.Attrib,
sizeof(savedObj->Sampler.Attrib));
memcpy(&texObj->Attrib, &savedObj->Attrib, sizeof(savedObj->Attrib));
}
/* remove saved references to the texture objects */

View File

@ -459,56 +459,6 @@ _mesa_delete_texture_object(struct gl_context *ctx,
}
/**
* Copy texture object state from one texture object to another.
* Use for glPush/PopAttrib.
*
* \param dest destination texture object.
* \param src source texture object.
*/
void
_mesa_copy_texture_object( struct gl_texture_object *dest,
const struct gl_texture_object *src )
{
dest->Target = src->Target;
dest->TargetIndex = src->TargetIndex;
dest->Name = src->Name;
dest->Attrib.Priority = src->Attrib.Priority;
dest->Sampler.Attrib.BorderColor.f[0] = src->Sampler.Attrib.BorderColor.f[0];
dest->Sampler.Attrib.BorderColor.f[1] = src->Sampler.Attrib.BorderColor.f[1];
dest->Sampler.Attrib.BorderColor.f[2] = src->Sampler.Attrib.BorderColor.f[2];
dest->Sampler.Attrib.BorderColor.f[3] = src->Sampler.Attrib.BorderColor.f[3];
dest->Sampler.Attrib.WrapS = src->Sampler.Attrib.WrapS;
dest->Sampler.Attrib.WrapT = src->Sampler.Attrib.WrapT;
dest->Sampler.Attrib.WrapR = src->Sampler.Attrib.WrapR;
dest->Sampler.Attrib.MinFilter = src->Sampler.Attrib.MinFilter;
dest->Sampler.Attrib.MagFilter = src->Sampler.Attrib.MagFilter;
dest->Sampler.Attrib.MinLod = src->Sampler.Attrib.MinLod;
dest->Sampler.Attrib.MaxLod = src->Sampler.Attrib.MaxLod;
dest->Sampler.Attrib.LodBias = src->Sampler.Attrib.LodBias;
dest->Attrib.BaseLevel = src->Attrib.BaseLevel;
dest->Attrib.MaxLevel = src->Attrib.MaxLevel;
dest->Sampler.Attrib.MaxAnisotropy = src->Sampler.Attrib.MaxAnisotropy;
dest->Sampler.Attrib.CompareMode = src->Sampler.Attrib.CompareMode;
dest->Sampler.Attrib.CompareFunc = src->Sampler.Attrib.CompareFunc;
dest->Sampler.Attrib.CubeMapSeamless = src->Sampler.Attrib.CubeMapSeamless;
dest->Attrib.DepthMode = src->Attrib.DepthMode;
dest->Attrib.StencilSampling = src->Attrib.StencilSampling;
dest->Sampler.Attrib.sRGBDecode = src->Sampler.Attrib.sRGBDecode;
dest->_MaxLevel = src->_MaxLevel;
dest->_MaxLambda = src->_MaxLambda;
dest->Attrib.GenerateMipmap = src->Attrib.GenerateMipmap;
dest->_BaseComplete = src->_BaseComplete;
dest->_MipmapComplete = src->_MipmapComplete;
COPY_4V(dest->Attrib.Swizzle, src->Attrib.Swizzle);
dest->Attrib._Swizzle = src->Attrib._Swizzle;
dest->_IsHalfFloat = src->_IsHalfFloat;
dest->_IsFloat = src->_IsFloat;
dest->RequiredTextureImageUnits = src->RequiredTextureImageUnits;
}
/**
* Free all texture images of the given texture objectm, except for
* \p retainTexImage.

View File

@ -79,10 +79,6 @@ extern void
_mesa_delete_texture_object( struct gl_context *ctx,
struct gl_texture_object *obj );
extern void
_mesa_copy_texture_object( struct gl_texture_object *dest,
const struct gl_texture_object *src );
extern void
_mesa_clear_texture_object(struct gl_context *ctx,
struct gl_texture_object *obj,