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:
parent
c17bfc5309
commit
068239dad0
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue