mesa: add IsBorderColorNonZero to skip border color update for st/mesa faster
0.8% less overhead. Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com> Reviewed-by: Emma Anholt <emma@anholt.net> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11339>
This commit is contained in:
@@ -914,6 +914,7 @@ struct gl_sampler_attrib
|
||||
GLenum16 CompareMode; /**< GL_ARB_shadow */
|
||||
GLenum16 CompareFunc; /**< GL_ARB_shadow */
|
||||
GLboolean CubeMapSeamless; /**< GL_AMD_seamless_cubemap_per_texture */
|
||||
GLboolean IsBorderColorNonZero; /**< Does the border color have any effect? */
|
||||
GLenum16 ReductionMode; /**< GL_EXT_texture_filter_minmax */
|
||||
|
||||
struct pipe_sampler_state state; /**< Gallium representation */
|
||||
|
@@ -132,6 +132,7 @@ _mesa_init_sampler_object(struct gl_sampler_object *sampObj, GLuint name)
|
||||
sampObj->Attrib.state.border_color.f[1] = 0;
|
||||
sampObj->Attrib.state.border_color.f[2] = 0;
|
||||
sampObj->Attrib.state.border_color.f[3] = 0;
|
||||
_mesa_update_is_border_color_nonzero(sampObj);
|
||||
sampObj->Attrib.MinLod = -1000.0F;
|
||||
sampObj->Attrib.MaxLod = 1000.0F;
|
||||
sampObj->Attrib.state.min_lod = 0; /* Gallium doesn't allow negative numbers */
|
||||
@@ -704,6 +705,7 @@ set_sampler_border_colorf(struct gl_context *ctx,
|
||||
{
|
||||
flush(ctx);
|
||||
memcpy(samp->Attrib.state.border_color.f, params, 4 * sizeof(float));
|
||||
_mesa_update_is_border_color_nonzero(samp);
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
@@ -715,6 +717,7 @@ set_sampler_border_colori(struct gl_context *ctx,
|
||||
{
|
||||
flush(ctx);
|
||||
memcpy(samp->Attrib.state.border_color.i, params, 4 * sizeof(float));
|
||||
_mesa_update_is_border_color_nonzero(samp);
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
@@ -726,6 +729,7 @@ set_sampler_border_colorui(struct gl_context *ctx,
|
||||
{
|
||||
flush(ctx);
|
||||
memcpy(samp->Attrib.state.border_color.ui, params, 4 * sizeof(float));
|
||||
_mesa_update_is_border_color_nonzero(samp);
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
@@ -218,6 +218,15 @@ func_to_gallium(GLenum func)
|
||||
return (enum pipe_compare_func)(func - GL_NEVER);
|
||||
}
|
||||
|
||||
static inline void
|
||||
_mesa_update_is_border_color_nonzero(struct gl_sampler_object *samp)
|
||||
{
|
||||
samp->Attrib.IsBorderColorNonZero = samp->Attrib.state.border_color.ui[0] ||
|
||||
samp->Attrib.state.border_color.ui[1] ||
|
||||
samp->Attrib.state.border_color.ui[2] ||
|
||||
samp->Attrib.state.border_color.ui[3];
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@@ -817,6 +817,7 @@ set_tex_parameterf(struct gl_context *ctx,
|
||||
texObj->Sampler.Attrib.state.border_color.f[BCOMP] = CLAMP(params[2], 0.0F, 1.0F);
|
||||
texObj->Sampler.Attrib.state.border_color.f[ACOMP] = CLAMP(params[3], 0.0F, 1.0F);
|
||||
}
|
||||
_mesa_update_is_border_color_nonzero(&texObj->Sampler);
|
||||
return GL_TRUE;
|
||||
|
||||
case GL_TEXTURE_TILING_EXT:
|
||||
@@ -1081,6 +1082,7 @@ _mesa_texture_parameterIiv(struct gl_context *ctx,
|
||||
FLUSH_VERTICES(ctx, _NEW_TEXTURE_OBJECT, GL_TEXTURE_BIT);
|
||||
/* set the integer-valued border color */
|
||||
COPY_4V(texObj->Sampler.Attrib.state.border_color.i, params);
|
||||
_mesa_update_is_border_color_nonzero(&texObj->Sampler);
|
||||
break;
|
||||
default:
|
||||
_mesa_texture_parameteriv(ctx, texObj, pname, params, dsa);
|
||||
@@ -1109,6 +1111,7 @@ _mesa_texture_parameterIuiv(struct gl_context *ctx,
|
||||
FLUSH_VERTICES(ctx, _NEW_TEXTURE_OBJECT, GL_TEXTURE_BIT);
|
||||
/* set the unsigned integer-valued border color */
|
||||
COPY_4V(texObj->Sampler.Attrib.state.border_color.ui, params);
|
||||
_mesa_update_is_border_color_nonzero(&texObj->Sampler);
|
||||
break;
|
||||
default:
|
||||
_mesa_texture_parameteriv(ctx, texObj, pname, (const GLint *) params,
|
||||
|
@@ -108,12 +108,9 @@ st_convert_sampler(const struct st_context *st,
|
||||
PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE) & 0x1) == 0);
|
||||
|
||||
/* For non-black borders... */
|
||||
if (/* This is true if wrap modes are using the border color: */
|
||||
(sampler->wrap_s | sampler->wrap_t | sampler->wrap_r) & 0x1 &&
|
||||
(msamp->Attrib.state.border_color.ui[0] ||
|
||||
msamp->Attrib.state.border_color.ui[1] ||
|
||||
msamp->Attrib.state.border_color.ui[2] ||
|
||||
msamp->Attrib.state.border_color.ui[3])) {
|
||||
if (msamp->Attrib.IsBorderColorNonZero &&
|
||||
/* This is true if wrap modes are using the border color: */
|
||||
(sampler->wrap_s | sampler->wrap_t | sampler->wrap_r) & 0x1) {
|
||||
const GLboolean is_integer = texobj->_IsIntegerFormat;
|
||||
GLenum texBaseFormat = _mesa_base_tex_image(texobj)->_BaseFormat;
|
||||
|
||||
|
Reference in New Issue
Block a user