Mesa (main): mesa: track which sampler wrap params use GL_CLAMP

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jul 15 19:22:51 UTC 2022


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Mon Jul 11 15:27:37 2022 -0400

mesa: track which sampler wrap params use GL_CLAMP

this adds a bitmask to sampler objects for tracking whether GL_CLAMP
is active

Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17459>

---

 src/mesa/main/mtypes.h     | 10 ++++++++++
 src/mesa/main/samplerobj.c |  9 +++------
 src/mesa/main/samplerobj.h | 11 +++++++++++
 src/mesa/main/texparam.c   |  9 +++------
 4 files changed, 27 insertions(+), 12 deletions(-)

diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index ba43cea3009..b6911e898df 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -876,6 +876,14 @@ struct gl_texture_object_attrib
    GLubyte NumLevels;          /**< GL_ARB_texture_view */
 };
 
+
+typedef enum
+{
+   WRAP_S = (1<<0),
+   WRAP_T = (1<<1),
+   WRAP_R = (1<<2),
+} gl_sampler_wrap;
+
 /**
  * Sampler object state.  These objects are new with GL_ARB_sampler_objects
  * and OpenGL 3.3.  Legacy texture objects also contain a sampler object.
@@ -888,6 +896,8 @@ struct gl_sampler_object
 
    struct gl_sampler_attrib Attrib;  /**< State saved by glPushAttrib */
 
+   uint8_t glclamp_mask; /**< mask of GL_CLAMP wraps active */
+
    /** GL_ARB_bindless_texture */
    bool HandleAllocated;
    struct util_dynarray Handles;
diff --git a/src/mesa/main/samplerobj.c b/src/mesa/main/samplerobj.c
index d8a75de0e36..c1d379ddc8a 100644
--- a/src/mesa/main/samplerobj.c
+++ b/src/mesa/main/samplerobj.c
@@ -540,8 +540,7 @@ set_sampler_wrap_s(struct gl_context *ctx, struct gl_sampler_object *samp,
       return GL_FALSE;
    if (validate_texture_wrap_mode(ctx, param)) {
       flush(ctx);
-      if (is_wrap_gl_clamp(samp->Attrib.WrapS) != is_wrap_gl_clamp(param))
-         ctx->NewDriverState |= ctx->DriverFlags.NewSamplersWithClamp;
+      update_sampler_gl_clamp(ctx, samp, is_wrap_gl_clamp(samp->Attrib.WrapS), is_wrap_gl_clamp(param), WRAP_S);
       samp->Attrib.WrapS = param;
       samp->Attrib.state.wrap_s = wrap_to_gallium(param);
       _mesa_lower_gl_clamp(ctx, samp);
@@ -559,8 +558,7 @@ set_sampler_wrap_t(struct gl_context *ctx, struct gl_sampler_object *samp,
       return GL_FALSE;
    if (validate_texture_wrap_mode(ctx, param)) {
       flush(ctx);
-      if (is_wrap_gl_clamp(samp->Attrib.WrapT) != is_wrap_gl_clamp(param))
-         ctx->NewDriverState |= ctx->DriverFlags.NewSamplersWithClamp;
+      update_sampler_gl_clamp(ctx, samp, is_wrap_gl_clamp(samp->Attrib.WrapT), is_wrap_gl_clamp(param), WRAP_T);
       samp->Attrib.WrapT = param;
       samp->Attrib.state.wrap_t = wrap_to_gallium(param);
       _mesa_lower_gl_clamp(ctx, samp);
@@ -578,8 +576,7 @@ set_sampler_wrap_r(struct gl_context *ctx, struct gl_sampler_object *samp,
       return GL_FALSE;
    if (validate_texture_wrap_mode(ctx, param)) {
       flush(ctx);
-      if (is_wrap_gl_clamp(samp->Attrib.WrapR) != is_wrap_gl_clamp(param))
-         ctx->NewDriverState |= ctx->DriverFlags.NewSamplersWithClamp;
+      update_sampler_gl_clamp(ctx, samp, is_wrap_gl_clamp(samp->Attrib.WrapR), is_wrap_gl_clamp(param), WRAP_R);
       samp->Attrib.WrapR = param;
       samp->Attrib.state.wrap_r = wrap_to_gallium(param);
       _mesa_lower_gl_clamp(ctx, samp);
diff --git a/src/mesa/main/samplerobj.h b/src/mesa/main/samplerobj.h
index 0e4b7e1d567..a716c5dcc3d 100644
--- a/src/mesa/main/samplerobj.h
+++ b/src/mesa/main/samplerobj.h
@@ -189,6 +189,17 @@ is_wrap_gl_clamp(GLint param)
    return param == GL_CLAMP || param == GL_MIRROR_CLAMP_EXT;
 }
 
+static inline void
+update_sampler_gl_clamp(struct gl_context *ctx, struct gl_sampler_object *samp, bool cur_state, bool new_state, gl_sampler_wrap wrap)
+{
+   if (cur_state == new_state)
+      return;
+   ctx->NewDriverState |= ctx->DriverFlags.NewSamplersWithClamp;
+   if (new_state)
+      samp->glclamp_mask |= wrap;
+   else
+      samp->glclamp_mask &= ~wrap;
+}
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c
index feb68a70d2c..fd84515d2b0 100644
--- a/src/mesa/main/texparam.c
+++ b/src/mesa/main/texparam.c
@@ -334,8 +334,7 @@ set_tex_parameteri(struct gl_context *ctx,
          return GL_FALSE;
       if (validate_texture_wrap_mode(ctx, texObj->Target, params[0])) {
          flush(ctx);
-         if (is_wrap_gl_clamp(texObj->Sampler.Attrib.WrapS) != is_wrap_gl_clamp(params[0]))
-            ctx->NewDriverState |= ctx->DriverFlags.NewSamplersWithClamp;
+         update_sampler_gl_clamp(ctx, &texObj->Sampler, is_wrap_gl_clamp(texObj->Sampler.Attrib.WrapS), is_wrap_gl_clamp(params[0]), WRAP_S);
          texObj->Sampler.Attrib.WrapS = params[0];
          texObj->Sampler.Attrib.state.wrap_s = wrap_to_gallium(params[0]);
          _mesa_lower_gl_clamp(ctx, &texObj->Sampler);
@@ -351,8 +350,7 @@ set_tex_parameteri(struct gl_context *ctx,
          return GL_FALSE;
       if (validate_texture_wrap_mode(ctx, texObj->Target, params[0])) {
          flush(ctx);
-         if (is_wrap_gl_clamp(texObj->Sampler.Attrib.WrapT) != is_wrap_gl_clamp(params[0]))
-            ctx->NewDriverState |= ctx->DriverFlags.NewSamplersWithClamp;
+         update_sampler_gl_clamp(ctx, &texObj->Sampler, is_wrap_gl_clamp(texObj->Sampler.Attrib.WrapT), is_wrap_gl_clamp(params[0]), WRAP_T);
          texObj->Sampler.Attrib.WrapT = params[0];
          texObj->Sampler.Attrib.state.wrap_t = wrap_to_gallium(params[0]);
          _mesa_lower_gl_clamp(ctx, &texObj->Sampler);
@@ -368,8 +366,7 @@ set_tex_parameteri(struct gl_context *ctx,
          return GL_FALSE;
       if (validate_texture_wrap_mode(ctx, texObj->Target, params[0])) {
          flush(ctx);
-         if (is_wrap_gl_clamp(texObj->Sampler.Attrib.WrapR) != is_wrap_gl_clamp(params[0]))
-            ctx->NewDriverState |= ctx->DriverFlags.NewSamplersWithClamp;
+         update_sampler_gl_clamp(ctx, &texObj->Sampler, is_wrap_gl_clamp(texObj->Sampler.Attrib.WrapR), is_wrap_gl_clamp(params[0]), WRAP_R);
          texObj->Sampler.Attrib.WrapR = params[0];
          texObj->Sampler.Attrib.state.wrap_r = wrap_to_gallium(params[0]);
          _mesa_lower_gl_clamp(ctx, &texObj->Sampler);



More information about the mesa-commit mailing list