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