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