From: Marek Olšák Date: Sun, 6 Jun 2021 18:23:49 +0000 (-0400) Subject: mesa: add IsBorderColorNonZero to skip border color update for st/mesa faster X-Git-Tag: upstream/21.2.3~1225 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8403e068d42bc08239258d6c6193a2565f56c39d;p=platform%2Fupstream%2Fmesa.git mesa: add IsBorderColorNonZero to skip border color update for st/mesa faster 0.8% less overhead. Reviewed-By: Mike Blumenkrantz Reviewed-by: Emma Anholt Part-of: --- diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 4be2c7f..2a37f9d 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -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 */ diff --git a/src/mesa/main/samplerobj.c b/src/mesa/main/samplerobj.c index 0ee8f7c..20a17d7 100644 --- a/src/mesa/main/samplerobj.c +++ b/src/mesa/main/samplerobj.c @@ -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; } diff --git a/src/mesa/main/samplerobj.h b/src/mesa/main/samplerobj.h index dfa5e12..d020c77 100644 --- a/src/mesa/main/samplerobj.h +++ b/src/mesa/main/samplerobj.h @@ -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 diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c index 4121548..63df1ac 100644 --- a/src/mesa/main/texparam.c +++ b/src/mesa/main/texparam.c @@ -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, diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c index 35bf2dc..82e61d5 100644 --- a/src/mesa/state_tracker/st_atom_sampler.c +++ b/src/mesa/state_tracker/st_atom_sampler.c @@ -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;