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>
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
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;
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;
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;
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
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;
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;
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
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:
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;
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;
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;
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;
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;
#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.
*/
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;