diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index ba43cea3009..b6911e898df 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -876,6 +876,14 @@ struct gl_texture_object_attrib GLubyte NumLevels; /**< GL_ARB_texture_view */ }; + +typedef enum +{ + WRAP_S = (1<<0), + WRAP_T = (1<<1), + WRAP_R = (1<<2), +} gl_sampler_wrap; + /** * Sampler object state. These objects are new with GL_ARB_sampler_objects * and OpenGL 3.3. Legacy texture objects also contain a sampler object. @@ -888,6 +896,8 @@ struct gl_sampler_object struct gl_sampler_attrib Attrib; /**< State saved by glPushAttrib */ + uint8_t glclamp_mask; /**< mask of GL_CLAMP wraps active */ + /** GL_ARB_bindless_texture */ bool HandleAllocated; struct util_dynarray Handles; diff --git a/src/mesa/main/samplerobj.c b/src/mesa/main/samplerobj.c index d8a75de0e36..c1d379ddc8a 100644 --- a/src/mesa/main/samplerobj.c +++ b/src/mesa/main/samplerobj.c @@ -540,8 +540,7 @@ set_sampler_wrap_s(struct gl_context *ctx, struct gl_sampler_object *samp, return GL_FALSE; if (validate_texture_wrap_mode(ctx, param)) { flush(ctx); - if (is_wrap_gl_clamp(samp->Attrib.WrapS) != is_wrap_gl_clamp(param)) - ctx->NewDriverState |= ctx->DriverFlags.NewSamplersWithClamp; + update_sampler_gl_clamp(ctx, samp, is_wrap_gl_clamp(samp->Attrib.WrapS), is_wrap_gl_clamp(param), WRAP_S); samp->Attrib.WrapS = param; samp->Attrib.state.wrap_s = wrap_to_gallium(param); _mesa_lower_gl_clamp(ctx, samp); @@ -559,8 +558,7 @@ set_sampler_wrap_t(struct gl_context *ctx, struct gl_sampler_object *samp, return GL_FALSE; if (validate_texture_wrap_mode(ctx, param)) { flush(ctx); - if (is_wrap_gl_clamp(samp->Attrib.WrapT) != is_wrap_gl_clamp(param)) - ctx->NewDriverState |= ctx->DriverFlags.NewSamplersWithClamp; + update_sampler_gl_clamp(ctx, samp, is_wrap_gl_clamp(samp->Attrib.WrapT), is_wrap_gl_clamp(param), WRAP_T); samp->Attrib.WrapT = param; samp->Attrib.state.wrap_t = wrap_to_gallium(param); _mesa_lower_gl_clamp(ctx, samp); @@ -578,8 +576,7 @@ set_sampler_wrap_r(struct gl_context *ctx, struct gl_sampler_object *samp, return GL_FALSE; if (validate_texture_wrap_mode(ctx, param)) { flush(ctx); - if (is_wrap_gl_clamp(samp->Attrib.WrapR) != is_wrap_gl_clamp(param)) - ctx->NewDriverState |= ctx->DriverFlags.NewSamplersWithClamp; + update_sampler_gl_clamp(ctx, samp, is_wrap_gl_clamp(samp->Attrib.WrapR), is_wrap_gl_clamp(param), WRAP_R); samp->Attrib.WrapR = param; samp->Attrib.state.wrap_r = wrap_to_gallium(param); _mesa_lower_gl_clamp(ctx, samp); diff --git a/src/mesa/main/samplerobj.h b/src/mesa/main/samplerobj.h index 0e4b7e1d567..a716c5dcc3d 100644 --- a/src/mesa/main/samplerobj.h +++ b/src/mesa/main/samplerobj.h @@ -189,6 +189,17 @@ is_wrap_gl_clamp(GLint param) return param == GL_CLAMP || param == GL_MIRROR_CLAMP_EXT; } +static inline void +update_sampler_gl_clamp(struct gl_context *ctx, struct gl_sampler_object *samp, bool cur_state, bool new_state, gl_sampler_wrap wrap) +{ + if (cur_state == new_state) + return; + ctx->NewDriverState |= ctx->DriverFlags.NewSamplersWithClamp; + if (new_state) + samp->glclamp_mask |= wrap; + else + samp->glclamp_mask &= ~wrap; +} #ifdef __cplusplus } #endif diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c index feb68a70d2c..fd84515d2b0 100644 --- a/src/mesa/main/texparam.c +++ b/src/mesa/main/texparam.c @@ -334,8 +334,7 @@ set_tex_parameteri(struct gl_context *ctx, return GL_FALSE; if (validate_texture_wrap_mode(ctx, texObj->Target, params[0])) { flush(ctx); - if (is_wrap_gl_clamp(texObj->Sampler.Attrib.WrapS) != is_wrap_gl_clamp(params[0])) - ctx->NewDriverState |= ctx->DriverFlags.NewSamplersWithClamp; + update_sampler_gl_clamp(ctx, &texObj->Sampler, is_wrap_gl_clamp(texObj->Sampler.Attrib.WrapS), is_wrap_gl_clamp(params[0]), WRAP_S); texObj->Sampler.Attrib.WrapS = params[0]; texObj->Sampler.Attrib.state.wrap_s = wrap_to_gallium(params[0]); _mesa_lower_gl_clamp(ctx, &texObj->Sampler); @@ -351,8 +350,7 @@ set_tex_parameteri(struct gl_context *ctx, return GL_FALSE; if (validate_texture_wrap_mode(ctx, texObj->Target, params[0])) { flush(ctx); - if (is_wrap_gl_clamp(texObj->Sampler.Attrib.WrapT) != is_wrap_gl_clamp(params[0])) - ctx->NewDriverState |= ctx->DriverFlags.NewSamplersWithClamp; + update_sampler_gl_clamp(ctx, &texObj->Sampler, is_wrap_gl_clamp(texObj->Sampler.Attrib.WrapT), is_wrap_gl_clamp(params[0]), WRAP_T); texObj->Sampler.Attrib.WrapT = params[0]; texObj->Sampler.Attrib.state.wrap_t = wrap_to_gallium(params[0]); _mesa_lower_gl_clamp(ctx, &texObj->Sampler); @@ -368,8 +366,7 @@ set_tex_parameteri(struct gl_context *ctx, return GL_FALSE; if (validate_texture_wrap_mode(ctx, texObj->Target, params[0])) { flush(ctx); - if (is_wrap_gl_clamp(texObj->Sampler.Attrib.WrapR) != is_wrap_gl_clamp(params[0])) - ctx->NewDriverState |= ctx->DriverFlags.NewSamplersWithClamp; + update_sampler_gl_clamp(ctx, &texObj->Sampler, is_wrap_gl_clamp(texObj->Sampler.Attrib.WrapR), is_wrap_gl_clamp(params[0]), WRAP_R); texObj->Sampler.Attrib.WrapR = params[0]; texObj->Sampler.Attrib.state.wrap_r = wrap_to_gallium(params[0]); _mesa_lower_gl_clamp(ctx, &texObj->Sampler);