[Mesa-dev] [PATCH] mesa: Factor out _mesa_disable_vertex_array_attrib.
Brian Paul
brianp at vmware.com
Tue Feb 6 15:36:50 UTC 2018
All three look good to me.
Reviewed-by: Brian Paul <brianp at vmware.com>
On 02/06/2018 12:59 AM, Mathias.Froehlich at gmx.net wrote:
> From: Mathias Fröhlich <mathias.froehlich at web.de>
>
> Hi,
>
> Simple code deduplication and factoring out a function that
> will be usefull soon.
>
> please review
>
> thanks!!
>
> Mathias
>
>
>
> And use it in the enable code path.
> Move _mesa_update_attribute_map_mode into its only remaining file.
>
> Signed-off-by: Mathias Fröhlich <Mathias.Froehlich at web.de>
> ---
> src/mesa/main/arrayobj.h | 26 --------------------
> src/mesa/main/enable.c | 64 ++++++++++++++++++------------------------------
> src/mesa/main/varray.c | 58 ++++++++++++++++++++++++++++++++-----------
> src/mesa/main/varray.h | 7 ++++++
> 4 files changed, 75 insertions(+), 80 deletions(-)
>
> diff --git a/src/mesa/main/arrayobj.h b/src/mesa/main/arrayobj.h
> index 411ed65c50..5de74505bb 100644
> --- a/src/mesa/main/arrayobj.h
> +++ b/src/mesa/main/arrayobj.h
> @@ -99,32 +99,6 @@ extern const GLubyte
> _mesa_vao_attribute_map[ATTRIBUTE_MAP_MODE_MAX][VERT_ATTRIB_MAX];
>
>
> -/**
> - * Depending on the position and generic0 attributes enable flags select
> - * the one that is used for both attributes.
> - * The generic0 attribute takes precedence.
> - */
> -static inline void
> -_mesa_update_attribute_map_mode(const struct gl_context *ctx,
> - struct gl_vertex_array_object *vao)
> -{
> - /*
> - * There is no need to change the mapping away from the
> - * identity mapping if we are not in compat mode.
> - */
> - if (ctx->API != API_OPENGL_COMPAT)
> - return;
> - /* The generic0 attribute superseeds the position attribute */
> - const GLbitfield enabled = vao->_Enabled;
> - if (enabled & VERT_BIT_GENERIC0)
> - vao->_AttributeMapMode = ATTRIBUTE_MAP_MODE_GENERIC0;
> - else if (enabled & VERT_BIT_POS)
> - vao->_AttributeMapMode = ATTRIBUTE_MAP_MODE_POSITION;
> - else
> - vao->_AttributeMapMode = ATTRIBUTE_MAP_MODE_IDENTITY;
> -}
> -
> -
> /**
> * Apply the position/generic0 aliasing map to a bitfield from the vao.
> * Use for example to convert gl_vertex_array_object::_Enabled
> diff --git a/src/mesa/main/enable.c b/src/mesa/main/enable.c
> index bc22410bda..967d23080c 100644
> --- a/src/mesa/main/enable.c
> +++ b/src/mesa/main/enable.c
> @@ -40,6 +40,7 @@
> #include "mtypes.h"
> #include "enums.h"
> #include "texstate.h"
> +#include "varray.h"
>
>
>
> @@ -58,55 +59,56 @@ update_derived_primitive_restart_state(struct gl_context *ctx)
> || ctx->Array.PrimitiveRestartFixedIndex;
> }
>
> +
> +/**
> + * Helper to enable/disable VAO client-side state.
> + */
> +static void
> +vao_state(struct gl_context *ctx, gl_vert_attrib attr, GLboolean state)
> +{
> + if (state)
> + _mesa_enable_vertex_array_attrib(ctx, ctx->Array.VAO, attr);
> + else
> + _mesa_disable_vertex_array_attrib(ctx, ctx->Array.VAO, attr);
> +}
> +
> +
> /**
> * Helper to enable/disable client-side state.
> */
> static void
> client_state(struct gl_context *ctx, GLenum cap, GLboolean state)
> {
> - struct gl_vertex_array_object *vao = ctx->Array.VAO;
> - GLbitfield vert_attrib_bit;
> - GLboolean *enable_var;
> -
> switch (cap) {
> case GL_VERTEX_ARRAY:
> - enable_var = &vao->VertexAttrib[VERT_ATTRIB_POS].Enabled;
> - vert_attrib_bit = VERT_BIT_POS;
> + vao_state(ctx, VERT_ATTRIB_POS, state);
> break;
> case GL_NORMAL_ARRAY:
> - enable_var = &vao->VertexAttrib[VERT_ATTRIB_NORMAL].Enabled;
> - vert_attrib_bit = VERT_BIT_NORMAL;
> + vao_state(ctx, VERT_ATTRIB_NORMAL, state);
> break;
> case GL_COLOR_ARRAY:
> - enable_var = &vao->VertexAttrib[VERT_ATTRIB_COLOR0].Enabled;
> - vert_attrib_bit = VERT_BIT_COLOR0;
> + vao_state(ctx, VERT_ATTRIB_COLOR0, state);
> break;
> case GL_INDEX_ARRAY:
> - enable_var = &vao->VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Enabled;
> - vert_attrib_bit = VERT_BIT_COLOR_INDEX;
> + vao_state(ctx, VERT_ATTRIB_COLOR_INDEX, state);
> break;
> case GL_TEXTURE_COORD_ARRAY:
> - enable_var = &vao->VertexAttrib[VERT_ATTRIB_TEX(ctx->Array.ActiveTexture)].Enabled;
> - vert_attrib_bit = VERT_BIT_TEX(ctx->Array.ActiveTexture);
> + vao_state(ctx, VERT_ATTRIB_TEX(ctx->Array.ActiveTexture), state);
> break;
> case GL_EDGE_FLAG_ARRAY:
> - enable_var = &vao->VertexAttrib[VERT_ATTRIB_EDGEFLAG].Enabled;
> - vert_attrib_bit = VERT_BIT_EDGEFLAG;
> + vao_state(ctx, VERT_ATTRIB_EDGEFLAG, state);
> break;
> case GL_FOG_COORDINATE_ARRAY_EXT:
> - enable_var = &vao->VertexAttrib[VERT_ATTRIB_FOG].Enabled;
> - vert_attrib_bit = VERT_BIT_FOG;
> + vao_state(ctx, VERT_ATTRIB_FOG, state);
> break;
> case GL_SECONDARY_COLOR_ARRAY_EXT:
> - enable_var = &vao->VertexAttrib[VERT_ATTRIB_COLOR1].Enabled;
> - vert_attrib_bit = VERT_BIT_COLOR1;
> + vao_state(ctx, VERT_ATTRIB_COLOR1, state);
> break;
>
> case GL_POINT_SIZE_ARRAY_OES:
> - enable_var = &vao->VertexAttrib[VERT_ATTRIB_POINT_SIZE].Enabled;
> - vert_attrib_bit = VERT_BIT_POINT_SIZE;
> FLUSH_VERTICES(ctx, _NEW_PROGRAM);
> ctx->VertexProgram.PointSizeEnabled = state;
> + vao_state(ctx, VERT_ATTRIB_POINT_SIZE, state);
> break;
>
> /* GL_NV_primitive_restart */
> @@ -125,24 +127,6 @@ client_state(struct gl_context *ctx, GLenum cap, GLboolean state)
> goto invalid_enum_error;
> }
>
> - if (*enable_var == state)
> - return;
> -
> - FLUSH_VERTICES(ctx, _NEW_ARRAY);
> -
> - *enable_var = state;
> -
> - if (state)
> - vao->_Enabled |= vert_attrib_bit;
> - else
> - vao->_Enabled &= ~vert_attrib_bit;
> -
> - vao->NewArrays |= vert_attrib_bit;
> -
> - /* Something got en/disabled, so update the map mode */
> - if (vert_attrib_bit & (VERT_BIT_POS|VERT_BIT_GENERIC0))
> - _mesa_update_attribute_map_mode(ctx, vao);
> -
> if (ctx->Driver.Enable) {
> ctx->Driver.Enable( ctx, cap, state );
> }
> diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c
> index cd5b4b7644..162b57970d 100644
> --- a/src/mesa/main/varray.c
> +++ b/src/mesa/main/varray.c
> @@ -125,6 +125,32 @@ type_to_bit(const struct gl_context *ctx, GLenum type)
> }
>
>
> +/**
> + * Depending on the position and generic0 attributes enable flags select
> + * the one that is used for both attributes.
> + * The generic0 attribute takes precedence.
> + */
> +static inline void
> +update_attribute_map_mode(const struct gl_context *ctx,
> + struct gl_vertex_array_object *vao)
> +{
> + /*
> + * There is no need to change the mapping away from the
> + * identity mapping if we are not in compat mode.
> + */
> + if (ctx->API != API_OPENGL_COMPAT)
> + return;
> + /* The generic0 attribute superseeds the position attribute */
> + const GLbitfield enabled = vao->_Enabled;
> + if (enabled & VERT_BIT_GENERIC0)
> + vao->_AttributeMapMode = ATTRIBUTE_MAP_MODE_GENERIC0;
> + else if (enabled & VERT_BIT_POS)
> + vao->_AttributeMapMode = ATTRIBUTE_MAP_MODE_POSITION;
> + else
> + vao->_AttributeMapMode = ATTRIBUTE_MAP_MODE_IDENTITY;
> +}
> +
> +
> /**
> * Sets the BufferBindingIndex field for the vertex attribute given by
> * attribIndex.
> @@ -1054,7 +1080,7 @@ _mesa_enable_vertex_array_attrib(struct gl_context *ctx,
>
> /* Update the map mode if needed */
> if (array_bit & (VERT_BIT_POS|VERT_BIT_GENERIC0))
> - _mesa_update_attribute_map_mode(ctx, vao);
> + update_attribute_map_mode(ctx, vao);
> }
> }
>
> @@ -1121,17 +1147,17 @@ _mesa_EnableVertexArrayAttrib_no_error(GLuint vaobj, GLuint index)
> }
>
>
> -static void
> -disable_vertex_array_attrib(struct gl_context *ctx,
> - struct gl_vertex_array_object *vao,
> - GLuint index)
> +void
> +_mesa_disable_vertex_array_attrib(struct gl_context *ctx,
> + struct gl_vertex_array_object *vao,
> + gl_vert_attrib attrib)
> {
> - assert(VERT_ATTRIB_GENERIC(index) < ARRAY_SIZE(vao->VertexAttrib));
> + assert(attrib < ARRAY_SIZE(vao->VertexAttrib));
>
> - if (vao->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled) {
> + if (vao->VertexAttrib[attrib].Enabled) {
> /* was enabled, now being disabled */
> - vao->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled = GL_FALSE;
> - const GLbitfield array_bit = VERT_BIT_GENERIC(index);
> + vao->VertexAttrib[attrib].Enabled = GL_FALSE;
> + const GLbitfield array_bit = VERT_BIT(attrib);
> vao->_Enabled &= ~array_bit;
> vao->NewArrays |= array_bit;
>
> @@ -1140,7 +1166,7 @@ disable_vertex_array_attrib(struct gl_context *ctx,
>
> /* Update the map mode if needed */
> if (array_bit & (VERT_BIT_POS|VERT_BIT_GENERIC0))
> - _mesa_update_attribute_map_mode(ctx, vao);
> + update_attribute_map_mode(ctx, vao);
> }
> }
>
> @@ -1155,7 +1181,8 @@ _mesa_DisableVertexAttribArray(GLuint index)
> return;
> }
>
> - disable_vertex_array_attrib(ctx, ctx->Array.VAO, index);
> + const gl_vert_attrib attrib = VERT_ATTRIB_GENERIC(index);
> + _mesa_disable_vertex_array_attrib(ctx, ctx->Array.VAO, attrib);
> }
>
>
> @@ -1163,7 +1190,8 @@ void GLAPIENTRY
> _mesa_DisableVertexAttribArray_no_error(GLuint index)
> {
> GET_CURRENT_CONTEXT(ctx);
> - disable_vertex_array_attrib(ctx, ctx->Array.VAO, index);
> + const gl_vert_attrib attrib = VERT_ATTRIB_GENERIC(index);
> + _mesa_disable_vertex_array_attrib(ctx, ctx->Array.VAO, attrib);
> }
>
>
> @@ -1189,7 +1217,8 @@ _mesa_DisableVertexArrayAttrib(GLuint vaobj, GLuint index)
> return;
> }
>
> - disable_vertex_array_attrib(ctx, vao, index);
> + const gl_vert_attrib attrib = VERT_ATTRIB_GENERIC(index);
> + _mesa_disable_vertex_array_attrib(ctx, vao, attrib);
> }
>
>
> @@ -1198,7 +1227,8 @@ _mesa_DisableVertexArrayAttrib_no_error(GLuint vaobj, GLuint index)
> {
> GET_CURRENT_CONTEXT(ctx);
> struct gl_vertex_array_object *vao = _mesa_lookup_vao(ctx, vaobj);
> - disable_vertex_array_attrib(ctx, vao, index);
> + const gl_vert_attrib attrib = VERT_ATTRIB_GENERIC(index);
> + _mesa_disable_vertex_array_attrib(ctx, vao, attrib);
> }
>
>
> diff --git a/src/mesa/main/varray.h b/src/mesa/main/varray.h
> index ede7a004e4..46f83b2200 100644
> --- a/src/mesa/main/varray.h
> +++ b/src/mesa/main/varray.h
> @@ -113,6 +113,13 @@ _mesa_enable_vertex_array_attrib(struct gl_context *ctx,
> struct gl_vertex_array_object *vao,
> gl_vert_attrib attrib);
>
> +
> +extern void
> +_mesa_disable_vertex_array_attrib(struct gl_context *ctx,
> + struct gl_vertex_array_object *vao,
> + gl_vert_attrib attrib);
> +
> +
> extern void
> _mesa_bind_vertex_buffer(struct gl_context *ctx,
> struct gl_vertex_array_object *vao,
>
More information about the mesa-dev
mailing list