mesa: track which sampler wrap params use GL_CLAMP

this adds a bitmask to sampler objects for tracking whether GL_CLAMP
is active

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17459>
This commit is contained in:
Mike Blumenkrantz 2022-07-11 15:27:37 -04:00 committed by Marge Bot
parent c17bfc5309
commit 068239dad0
4 changed files with 27 additions and 12 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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);