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;