Mesa (main): mesa: add IsBorderColorNonZero to skip border color update for st/mesa faster
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Sun Jun 27 15:02:27 UTC 2021
Module: Mesa
Branch: main
Commit: 8403e068d42bc08239258d6c6193a2565f56c39d
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=8403e068d42bc08239258d6c6193a2565f56c39d
Author: Marek Olšák <marek.olsak at amd.com>
Date: Sun Jun 6 14:23:49 2021 -0400
mesa: add IsBorderColorNonZero to skip border color update for st/mesa faster
0.8% less overhead.
Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Reviewed-by: Emma Anholt <emma at anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11339>
---
src/mesa/main/mtypes.h | 1 +
src/mesa/main/samplerobj.c | 4 ++++
src/mesa/main/samplerobj.h | 9 +++++++++
src/mesa/main/texparam.c | 3 +++
src/mesa/state_tracker/st_atom_sampler.c | 9 +++------
5 files changed, 20 insertions(+), 6 deletions(-)
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 4be2c7f773d..2a37f9d1ea5 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -914,6 +914,7 @@ struct gl_sampler_attrib
GLenum16 CompareMode; /**< GL_ARB_shadow */
GLenum16 CompareFunc; /**< GL_ARB_shadow */
GLboolean CubeMapSeamless; /**< GL_AMD_seamless_cubemap_per_texture */
+ GLboolean IsBorderColorNonZero; /**< Does the border color have any effect? */
GLenum16 ReductionMode; /**< GL_EXT_texture_filter_minmax */
struct pipe_sampler_state state; /**< Gallium representation */
diff --git a/src/mesa/main/samplerobj.c b/src/mesa/main/samplerobj.c
index 0ee8f7c1160..20a17d789da 100644
--- a/src/mesa/main/samplerobj.c
+++ b/src/mesa/main/samplerobj.c
@@ -132,6 +132,7 @@ _mesa_init_sampler_object(struct gl_sampler_object *sampObj, GLuint name)
sampObj->Attrib.state.border_color.f[1] = 0;
sampObj->Attrib.state.border_color.f[2] = 0;
sampObj->Attrib.state.border_color.f[3] = 0;
+ _mesa_update_is_border_color_nonzero(sampObj);
sampObj->Attrib.MinLod = -1000.0F;
sampObj->Attrib.MaxLod = 1000.0F;
sampObj->Attrib.state.min_lod = 0; /* Gallium doesn't allow negative numbers */
@@ -704,6 +705,7 @@ set_sampler_border_colorf(struct gl_context *ctx,
{
flush(ctx);
memcpy(samp->Attrib.state.border_color.f, params, 4 * sizeof(float));
+ _mesa_update_is_border_color_nonzero(samp);
return GL_TRUE;
}
@@ -715,6 +717,7 @@ set_sampler_border_colori(struct gl_context *ctx,
{
flush(ctx);
memcpy(samp->Attrib.state.border_color.i, params, 4 * sizeof(float));
+ _mesa_update_is_border_color_nonzero(samp);
return GL_TRUE;
}
@@ -726,6 +729,7 @@ set_sampler_border_colorui(struct gl_context *ctx,
{
flush(ctx);
memcpy(samp->Attrib.state.border_color.ui, params, 4 * sizeof(float));
+ _mesa_update_is_border_color_nonzero(samp);
return GL_TRUE;
}
diff --git a/src/mesa/main/samplerobj.h b/src/mesa/main/samplerobj.h
index dfa5e1244ba..d020c77ffba 100644
--- a/src/mesa/main/samplerobj.h
+++ b/src/mesa/main/samplerobj.h
@@ -218,6 +218,15 @@ func_to_gallium(GLenum func)
return (enum pipe_compare_func)(func - GL_NEVER);
}
+static inline void
+_mesa_update_is_border_color_nonzero(struct gl_sampler_object *samp)
+{
+ samp->Attrib.IsBorderColorNonZero = samp->Attrib.state.border_color.ui[0] ||
+ samp->Attrib.state.border_color.ui[1] ||
+ samp->Attrib.state.border_color.ui[2] ||
+ samp->Attrib.state.border_color.ui[3];
+}
+
#ifdef __cplusplus
}
#endif
diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c
index 4121548b1e2..63df1ac7b1d 100644
--- a/src/mesa/main/texparam.c
+++ b/src/mesa/main/texparam.c
@@ -817,6 +817,7 @@ set_tex_parameterf(struct gl_context *ctx,
texObj->Sampler.Attrib.state.border_color.f[BCOMP] = CLAMP(params[2], 0.0F, 1.0F);
texObj->Sampler.Attrib.state.border_color.f[ACOMP] = CLAMP(params[3], 0.0F, 1.0F);
}
+ _mesa_update_is_border_color_nonzero(&texObj->Sampler);
return GL_TRUE;
case GL_TEXTURE_TILING_EXT:
@@ -1081,6 +1082,7 @@ _mesa_texture_parameterIiv(struct gl_context *ctx,
FLUSH_VERTICES(ctx, _NEW_TEXTURE_OBJECT, GL_TEXTURE_BIT);
/* set the integer-valued border color */
COPY_4V(texObj->Sampler.Attrib.state.border_color.i, params);
+ _mesa_update_is_border_color_nonzero(&texObj->Sampler);
break;
default:
_mesa_texture_parameteriv(ctx, texObj, pname, params, dsa);
@@ -1109,6 +1111,7 @@ _mesa_texture_parameterIuiv(struct gl_context *ctx,
FLUSH_VERTICES(ctx, _NEW_TEXTURE_OBJECT, GL_TEXTURE_BIT);
/* set the unsigned integer-valued border color */
COPY_4V(texObj->Sampler.Attrib.state.border_color.ui, params);
+ _mesa_update_is_border_color_nonzero(&texObj->Sampler);
break;
default:
_mesa_texture_parameteriv(ctx, texObj, pname, (const GLint *) params,
diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c
index 35bf2dc8c75..82e61d5396b 100644
--- a/src/mesa/state_tracker/st_atom_sampler.c
+++ b/src/mesa/state_tracker/st_atom_sampler.c
@@ -108,12 +108,9 @@ st_convert_sampler(const struct st_context *st,
PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE) & 0x1) == 0);
/* For non-black borders... */
- if (/* This is true if wrap modes are using the border color: */
- (sampler->wrap_s | sampler->wrap_t | sampler->wrap_r) & 0x1 &&
- (msamp->Attrib.state.border_color.ui[0] ||
- msamp->Attrib.state.border_color.ui[1] ||
- msamp->Attrib.state.border_color.ui[2] ||
- msamp->Attrib.state.border_color.ui[3])) {
+ if (msamp->Attrib.IsBorderColorNonZero &&
+ /* This is true if wrap modes are using the border color: */
+ (sampler->wrap_s | sampler->wrap_t | sampler->wrap_r) & 0x1) {
const GLboolean is_integer = texobj->_IsIntegerFormat;
GLenum texBaseFormat = _mesa_base_tex_image(texobj)->_BaseFormat;
More information about the mesa-commit
mailing list