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