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:
Marek Olšák
2021-06-06 14:23:49 -04:00
parent 9ea8f67a1e
commit 8403e068d4
5 changed files with 20 additions and 6 deletions

View File

@@ -914,6 +914,7 @@ struct gl_sampler_attrib
GLenum16 CompareMode; /**< GL_ARB_shadow */ GLenum16 CompareMode; /**< GL_ARB_shadow */
GLenum16 CompareFunc; /**< GL_ARB_shadow */ GLenum16 CompareFunc; /**< GL_ARB_shadow */
GLboolean CubeMapSeamless; /**< GL_AMD_seamless_cubemap_per_texture */ GLboolean CubeMapSeamless; /**< GL_AMD_seamless_cubemap_per_texture */
GLboolean IsBorderColorNonZero; /**< Does the border color have any effect? */
GLenum16 ReductionMode; /**< GL_EXT_texture_filter_minmax */ GLenum16 ReductionMode; /**< GL_EXT_texture_filter_minmax */
struct pipe_sampler_state state; /**< Gallium representation */ struct pipe_sampler_state state; /**< Gallium representation */

View File

@@ -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[1] = 0;
sampObj->Attrib.state.border_color.f[2] = 0; sampObj->Attrib.state.border_color.f[2] = 0;
sampObj->Attrib.state.border_color.f[3] = 0; sampObj->Attrib.state.border_color.f[3] = 0;
_mesa_update_is_border_color_nonzero(sampObj);
sampObj->Attrib.MinLod = -1000.0F; sampObj->Attrib.MinLod = -1000.0F;
sampObj->Attrib.MaxLod = 1000.0F; sampObj->Attrib.MaxLod = 1000.0F;
sampObj->Attrib.state.min_lod = 0; /* Gallium doesn't allow negative numbers */ 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); flush(ctx);
memcpy(samp->Attrib.state.border_color.f, params, 4 * sizeof(float)); memcpy(samp->Attrib.state.border_color.f, params, 4 * sizeof(float));
_mesa_update_is_border_color_nonzero(samp);
return GL_TRUE; return GL_TRUE;
} }
@@ -715,6 +717,7 @@ set_sampler_border_colori(struct gl_context *ctx,
{ {
flush(ctx); flush(ctx);
memcpy(samp->Attrib.state.border_color.i, params, 4 * sizeof(float)); memcpy(samp->Attrib.state.border_color.i, params, 4 * sizeof(float));
_mesa_update_is_border_color_nonzero(samp);
return GL_TRUE; return GL_TRUE;
} }
@@ -726,6 +729,7 @@ set_sampler_border_colorui(struct gl_context *ctx,
{ {
flush(ctx); flush(ctx);
memcpy(samp->Attrib.state.border_color.ui, params, 4 * sizeof(float)); memcpy(samp->Attrib.state.border_color.ui, params, 4 * sizeof(float));
_mesa_update_is_border_color_nonzero(samp);
return GL_TRUE; return GL_TRUE;
} }

View File

@@ -218,6 +218,15 @@ func_to_gallium(GLenum func)
return (enum pipe_compare_func)(func - GL_NEVER); 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 #ifdef __cplusplus
} }
#endif #endif

View File

@@ -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[BCOMP] = CLAMP(params[2], 0.0F, 1.0F);
texObj->Sampler.Attrib.state.border_color.f[ACOMP] = CLAMP(params[3], 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; return GL_TRUE;
case GL_TEXTURE_TILING_EXT: 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); FLUSH_VERTICES(ctx, _NEW_TEXTURE_OBJECT, GL_TEXTURE_BIT);
/* set the integer-valued border color */ /* set the integer-valued border color */
COPY_4V(texObj->Sampler.Attrib.state.border_color.i, params); COPY_4V(texObj->Sampler.Attrib.state.border_color.i, params);
_mesa_update_is_border_color_nonzero(&texObj->Sampler);
break; break;
default: default:
_mesa_texture_parameteriv(ctx, texObj, pname, params, dsa); _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); FLUSH_VERTICES(ctx, _NEW_TEXTURE_OBJECT, GL_TEXTURE_BIT);
/* set the unsigned integer-valued border color */ /* set the unsigned integer-valued border color */
COPY_4V(texObj->Sampler.Attrib.state.border_color.ui, params); COPY_4V(texObj->Sampler.Attrib.state.border_color.ui, params);
_mesa_update_is_border_color_nonzero(&texObj->Sampler);
break; break;
default: default:
_mesa_texture_parameteriv(ctx, texObj, pname, (const GLint *) params, _mesa_texture_parameteriv(ctx, texObj, pname, (const GLint *) params,

View File

@@ -108,12 +108,9 @@ st_convert_sampler(const struct st_context *st,
PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE) & 0x1) == 0); PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE) & 0x1) == 0);
/* For non-black borders... */ /* For non-black borders... */
if (/* This is true if wrap modes are using the border color: */ if (msamp->Attrib.IsBorderColorNonZero &&
(sampler->wrap_s | sampler->wrap_t | sampler->wrap_r) & 0x1 && /* This is true if wrap modes are using the border color: */
(msamp->Attrib.state.border_color.ui[0] || (sampler->wrap_s | sampler->wrap_t | sampler->wrap_r) & 0x1) {
msamp->Attrib.state.border_color.ui[1] ||
msamp->Attrib.state.border_color.ui[2] ||
msamp->Attrib.state.border_color.ui[3])) {
const GLboolean is_integer = texobj->_IsIntegerFormat; const GLboolean is_integer = texobj->_IsIntegerFormat;
GLenum texBaseFormat = _mesa_base_tex_image(texobj)->_BaseFormat; GLenum texBaseFormat = _mesa_base_tex_image(texobj)->_BaseFormat;