Mesa (main): mesa: lower GL_CLAMP in texture and sampler functions instead of st/mesa

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sun Jun 27 15:02:27 UTC 2021


Module: Mesa
Branch: main
Commit: fb586a8e3c7259d94f06fb764ac25310e54d3e5a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=fb586a8e3c7259d94f06fb764ac25310e54d3e5a

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Mon Jun  7 07:34:45 2021 -0400

mesa: lower GL_CLAMP in texture and sampler functions instead of st/mesa

This moves the GL_CLAMP translation out of st/mesa.
This should be faster assuming constant sampler states.

Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11339>

---

 src/mesa/main/samplerobj.c               |  7 +++++++
 src/mesa/main/samplerobj.h               | 29 +++++++++++++++++++++++++++++
 src/mesa/main/texparam.c                 |  6 ++++++
 src/mesa/state_tracker/st_atom_sampler.c | 20 --------------------
 4 files changed, 42 insertions(+), 20 deletions(-)

diff --git a/src/mesa/main/samplerobj.c b/src/mesa/main/samplerobj.c
index 20a17d789da..e3c22841fca 100644
--- a/src/mesa/main/samplerobj.c
+++ b/src/mesa/main/samplerobj.c
@@ -549,6 +549,7 @@ _mesa_set_sampler_wrap(struct gl_context *ctx, struct gl_sampler_object *samp,
    samp->Attrib.state.wrap_s = wrap_to_gallium(s);
    samp->Attrib.state.wrap_t = wrap_to_gallium(t);
    samp->Attrib.state.wrap_r = wrap_to_gallium(r);
+   _mesa_lower_gl_clamp(ctx, samp);
 }
 
 #define INVALID_PARAM 0x100
@@ -573,6 +574,7 @@ set_sampler_wrap_s(struct gl_context *ctx, struct gl_sampler_object *samp,
          ctx->NewDriverState |= ctx->DriverFlags.NewSamplersWithClamp;
       samp->Attrib.WrapS = param;
       samp->Attrib.state.wrap_s = wrap_to_gallium(param);
+      _mesa_lower_gl_clamp(ctx, samp);
       return GL_TRUE;
    }
    return INVALID_PARAM;
@@ -591,6 +593,7 @@ set_sampler_wrap_t(struct gl_context *ctx, struct gl_sampler_object *samp,
          ctx->NewDriverState |= ctx->DriverFlags.NewSamplersWithClamp;
       samp->Attrib.WrapT = param;
       samp->Attrib.state.wrap_t = wrap_to_gallium(param);
+      _mesa_lower_gl_clamp(ctx, samp);
       return GL_TRUE;
    }
    return INVALID_PARAM;
@@ -609,6 +612,7 @@ set_sampler_wrap_r(struct gl_context *ctx, struct gl_sampler_object *samp,
          ctx->NewDriverState |= ctx->DriverFlags.NewSamplersWithClamp;
       samp->Attrib.WrapR = param;
       samp->Attrib.state.wrap_r = wrap_to_gallium(param);
+      _mesa_lower_gl_clamp(ctx, samp);
       return GL_TRUE;
    }
    return INVALID_PARAM;
@@ -637,6 +641,7 @@ _mesa_set_sampler_filters(struct gl_context *ctx,
    samp->Attrib.state.min_img_filter = filter_to_gallium(min_filter);
    samp->Attrib.state.min_mip_filter = mipfilter_to_gallium(min_filter);
    samp->Attrib.state.mag_img_filter = filter_to_gallium(mag_filter);
+   _mesa_lower_gl_clamp(ctx, samp);
 }
 
 static GLuint
@@ -657,6 +662,7 @@ set_sampler_min_filter(struct gl_context *ctx, struct gl_sampler_object *samp,
       samp->Attrib.MinFilter = param;
       samp->Attrib.state.min_img_filter = filter_to_gallium(param);
       samp->Attrib.state.min_mip_filter = mipfilter_to_gallium(param);
+      _mesa_lower_gl_clamp(ctx, samp);
       return GL_TRUE;
    default:
       return INVALID_PARAM;
@@ -677,6 +683,7 @@ set_sampler_mag_filter(struct gl_context *ctx, struct gl_sampler_object *samp,
       flush(ctx);
       samp->Attrib.MagFilter = param;
       samp->Attrib.state.mag_img_filter = filter_to_gallium(param);
+      _mesa_lower_gl_clamp(ctx, samp);
       return GL_TRUE;
    default:
       return INVALID_PARAM;
diff --git a/src/mesa/main/samplerobj.h b/src/mesa/main/samplerobj.h
index d020c77ffba..bf014ce623e 100644
--- a/src/mesa/main/samplerobj.h
+++ b/src/mesa/main/samplerobj.h
@@ -227,6 +227,35 @@ _mesa_update_is_border_color_nonzero(struct gl_sampler_object *samp)
                                        samp->Attrib.state.border_color.ui[3];
 }
 
+static inline enum pipe_tex_wrap
+lower_gl_clamp(enum pipe_tex_wrap old_wrap, GLenum wrap, bool clamp_to_border)
+{
+   if (wrap == GL_CLAMP)
+      return clamp_to_border ? PIPE_TEX_WRAP_CLAMP_TO_BORDER :
+                               PIPE_TEX_WRAP_CLAMP_TO_EDGE;
+   else if (wrap == GL_MIRROR_CLAMP_EXT)
+      return clamp_to_border ? PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER :
+                               PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE;
+   return old_wrap;
+}
+
+static inline void
+_mesa_lower_gl_clamp(struct gl_context *ctx, struct gl_sampler_object *samp)
+{
+   if (ctx->DriverFlags.NewSamplersWithClamp) {
+      struct pipe_sampler_state *s = &samp->Attrib.state;
+      bool clamp_to_border = s->min_img_filter != PIPE_TEX_FILTER_NEAREST &&
+                             s->mag_img_filter != PIPE_TEX_FILTER_NEAREST;
+
+      s->wrap_s = lower_gl_clamp((enum pipe_tex_wrap)s->wrap_s,
+                                 samp->Attrib.WrapS, clamp_to_border);
+      s->wrap_t = lower_gl_clamp((enum pipe_tex_wrap)s->wrap_t,
+                                 samp->Attrib.WrapT, clamp_to_border);
+      s->wrap_r = lower_gl_clamp((enum pipe_tex_wrap)s->wrap_r,
+                                 samp->Attrib.WrapR, clamp_to_border);
+   }
+}
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c
index 63df1ac7b1d..d849facdd18 100644
--- a/src/mesa/main/texparam.c
+++ b/src/mesa/main/texparam.c
@@ -287,6 +287,7 @@ set_tex_parameteri(struct gl_context *ctx,
          texObj->Sampler.Attrib.MinFilter = params[0];
          texObj->Sampler.Attrib.state.min_img_filter = filter_to_gallium(params[0]);
          texObj->Sampler.Attrib.state.min_mip_filter = mipfilter_to_gallium(params[0]);
+         _mesa_lower_gl_clamp(ctx, &texObj->Sampler);
          return GL_TRUE;
       case GL_NEAREST_MIPMAP_NEAREST:
       case GL_LINEAR_MIPMAP_NEAREST:
@@ -298,6 +299,7 @@ set_tex_parameteri(struct gl_context *ctx,
             texObj->Sampler.Attrib.MinFilter = params[0];
             texObj->Sampler.Attrib.state.min_img_filter = filter_to_gallium(params[0]);
             texObj->Sampler.Attrib.state.min_mip_filter = mipfilter_to_gallium(params[0]);
+            _mesa_lower_gl_clamp(ctx, &texObj->Sampler);
             return GL_TRUE;
          }
          FALLTHROUGH;
@@ -318,6 +320,7 @@ set_tex_parameteri(struct gl_context *ctx,
          flush(ctx); /* does not effect completeness */
          texObj->Sampler.Attrib.MagFilter = params[0];
          texObj->Sampler.Attrib.state.mag_img_filter = filter_to_gallium(params[0]);
+         _mesa_lower_gl_clamp(ctx, &texObj->Sampler);
          return GL_TRUE;
       default:
          goto invalid_param;
@@ -336,6 +339,7 @@ set_tex_parameteri(struct gl_context *ctx,
             ctx->NewDriverState |= ctx->DriverFlags.NewSamplersWithClamp;
          texObj->Sampler.Attrib.WrapS = params[0];
          texObj->Sampler.Attrib.state.wrap_s = wrap_to_gallium(params[0]);
+         _mesa_lower_gl_clamp(ctx, &texObj->Sampler);
          return GL_TRUE;
       }
       return GL_FALSE;
@@ -352,6 +356,7 @@ set_tex_parameteri(struct gl_context *ctx,
             ctx->NewDriverState |= ctx->DriverFlags.NewSamplersWithClamp;
          texObj->Sampler.Attrib.WrapT = params[0];
          texObj->Sampler.Attrib.state.wrap_t = wrap_to_gallium(params[0]);
+         _mesa_lower_gl_clamp(ctx, &texObj->Sampler);
          return GL_TRUE;
       }
       return GL_FALSE;
@@ -368,6 +373,7 @@ set_tex_parameteri(struct gl_context *ctx,
             ctx->NewDriverState |= ctx->DriverFlags.NewSamplersWithClamp;
          texObj->Sampler.Attrib.WrapR = params[0];
          texObj->Sampler.Attrib.state.wrap_r = wrap_to_gallium(params[0]);
+         _mesa_lower_gl_clamp(ctx, &texObj->Sampler);
          return GL_TRUE;
       }
       return GL_FALSE;
diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c
index 82e61d5396b..9f5a35720e5 100644
--- a/src/mesa/state_tracker/st_atom_sampler.c
+++ b/src/mesa/state_tracker/st_atom_sampler.c
@@ -53,18 +53,6 @@
 #include "util/format/u_format.h"
 
 
-static inline unsigned
-get_border_clamp(unsigned wrap, bool clamp_to_border)
-{
-   if (wrap == PIPE_TEX_WRAP_CLAMP)
-      wrap = clamp_to_border ? PIPE_TEX_WRAP_CLAMP_TO_BORDER :
-                               PIPE_TEX_WRAP_CLAMP_TO_EDGE;
-   else if (wrap == PIPE_TEX_WRAP_MIRROR_CLAMP)
-      wrap = clamp_to_border ? PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER :
-                               PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE;
-   return wrap;
-}
-
 /**
  * Convert a gl_sampler_object to a pipe_sampler_state object.
  */
@@ -82,14 +70,6 @@ st_convert_sampler(const struct st_context *st,
       sampler->mag_img_filter = PIPE_TEX_FILTER_NEAREST;
    }
 
-   if (st->emulate_gl_clamp) {
-      bool clamp_to_border = sampler->min_img_filter != PIPE_TEX_FILTER_NEAREST &&
-                             sampler->mag_img_filter != PIPE_TEX_FILTER_NEAREST;
-      sampler->wrap_s = get_border_clamp(sampler->wrap_s, clamp_to_border);
-      sampler->wrap_t = get_border_clamp(sampler->wrap_t, clamp_to_border);
-      sampler->wrap_r = get_border_clamp(sampler->wrap_r, clamp_to_border);
-   }
-
    if (texobj->Target != GL_TEXTURE_RECTANGLE_ARB)
       sampler->normalized_coords = 1;
 



More information about the mesa-commit mailing list