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@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11339>
This commit is contained in:
Marek Olšák
2021-06-07 07:34:45 -04:00
parent 8403e068d4
commit fb586a8e3c
4 changed files with 42 additions and 20 deletions
+7
View File
@@ -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;
+29
View File
@@ -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
+6
View File
@@ -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;
-20
View File
@@ -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;