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:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user