diff options
-rw-r--r-- | src/mesa/main/arrayobj.c | 131 | ||||
-rw-r--r-- | src/mesa/main/arrayobj.h | 74 | ||||
-rw-r--r-- | src/mesa/main/enable.c | 5 | ||||
-rw-r--r-- | src/mesa/main/mtypes.h | 18 | ||||
-rw-r--r-- | src/mesa/main/varray.c | 18 |
5 files changed, 242 insertions, 4 deletions
diff --git a/src/mesa/main/arrayobj.c b/src/mesa/main/arrayobj.c index 7208f4c534f..360d097ec1d 100644 --- a/src/mesa/main/arrayobj.c +++ b/src/mesa/main/arrayobj.c @@ -54,6 +54,135 @@ #include "util/bitscan.h" +const GLubyte +_mesa_vao_attribute_map[ATTRIBUTE_MAP_MODE_MAX][VERT_ATTRIB_MAX] = +{ + /* ATTRIBUTE_MAP_MODE_IDENTITY + * + * Grab vertex processing attribute VERT_ATTRIB_POS from + * the VAO attribute VERT_ATTRIB_POS, and grab vertex processing + * attribute VERT_ATTRIB_GENERIC0 from the VAO attribute + * VERT_ATTRIB_GENERIC0. + */ + { + VERT_ATTRIB_POS, /* VERT_ATTRIB_POS */ + VERT_ATTRIB_NORMAL, /* VERT_ATTRIB_NORMAL */ + VERT_ATTRIB_COLOR0, /* VERT_ATTRIB_COLOR0 */ + VERT_ATTRIB_COLOR1, /* VERT_ATTRIB_COLOR1 */ + VERT_ATTRIB_FOG, /* VERT_ATTRIB_FOG */ + VERT_ATTRIB_COLOR_INDEX, /* VERT_ATTRIB_COLOR_INDEX */ + VERT_ATTRIB_EDGEFLAG, /* VERT_ATTRIB_EDGEFLAG */ + VERT_ATTRIB_TEX0, /* VERT_ATTRIB_TEX0 */ + VERT_ATTRIB_TEX1, /* VERT_ATTRIB_TEX1 */ + VERT_ATTRIB_TEX2, /* VERT_ATTRIB_TEX2 */ + VERT_ATTRIB_TEX3, /* VERT_ATTRIB_TEX3 */ + VERT_ATTRIB_TEX4, /* VERT_ATTRIB_TEX4 */ + VERT_ATTRIB_TEX5, /* VERT_ATTRIB_TEX5 */ + VERT_ATTRIB_TEX6, /* VERT_ATTRIB_TEX6 */ + VERT_ATTRIB_TEX7, /* VERT_ATTRIB_TEX7 */ + VERT_ATTRIB_POINT_SIZE, /* VERT_ATTRIB_POINT_SIZE */ + VERT_ATTRIB_GENERIC0, /* VERT_ATTRIB_GENERIC0 */ + VERT_ATTRIB_GENERIC1, /* VERT_ATTRIB_GENERIC1 */ + VERT_ATTRIB_GENERIC2, /* VERT_ATTRIB_GENERIC2 */ + VERT_ATTRIB_GENERIC3, /* VERT_ATTRIB_GENERIC3 */ + VERT_ATTRIB_GENERIC4, /* VERT_ATTRIB_GENERIC4 */ + VERT_ATTRIB_GENERIC5, /* VERT_ATTRIB_GENERIC5 */ + VERT_ATTRIB_GENERIC6, /* VERT_ATTRIB_GENERIC6 */ + VERT_ATTRIB_GENERIC7, /* VERT_ATTRIB_GENERIC7 */ + VERT_ATTRIB_GENERIC8, /* VERT_ATTRIB_GENERIC8 */ + VERT_ATTRIB_GENERIC9, /* VERT_ATTRIB_GENERIC9 */ + VERT_ATTRIB_GENERIC10, /* VERT_ATTRIB_GENERIC10 */ + VERT_ATTRIB_GENERIC11, /* VERT_ATTRIB_GENERIC11 */ + VERT_ATTRIB_GENERIC12, /* VERT_ATTRIB_GENERIC12 */ + VERT_ATTRIB_GENERIC13, /* VERT_ATTRIB_GENERIC13 */ + VERT_ATTRIB_GENERIC14, /* VERT_ATTRIB_GENERIC14 */ + VERT_ATTRIB_GENERIC15 /* VERT_ATTRIB_GENERIC15 */ + }, + + /* ATTRIBUTE_MAP_MODE_POSITION + * + * Grab vertex processing attribute VERT_ATTRIB_POS as well as + * vertex processing attribute VERT_ATTRIB_GENERIC0 from the + * VAO attribute VERT_ATTRIB_POS. + */ + { + VERT_ATTRIB_POS, /* VERT_ATTRIB_POS */ + VERT_ATTRIB_NORMAL, /* VERT_ATTRIB_NORMAL */ + VERT_ATTRIB_COLOR0, /* VERT_ATTRIB_COLOR0 */ + VERT_ATTRIB_COLOR1, /* VERT_ATTRIB_COLOR1 */ + VERT_ATTRIB_FOG, /* VERT_ATTRIB_FOG */ + VERT_ATTRIB_COLOR_INDEX, /* VERT_ATTRIB_COLOR_INDEX */ + VERT_ATTRIB_EDGEFLAG, /* VERT_ATTRIB_EDGEFLAG */ + VERT_ATTRIB_TEX0, /* VERT_ATTRIB_TEX0 */ + VERT_ATTRIB_TEX1, /* VERT_ATTRIB_TEX1 */ + VERT_ATTRIB_TEX2, /* VERT_ATTRIB_TEX2 */ + VERT_ATTRIB_TEX3, /* VERT_ATTRIB_TEX3 */ + VERT_ATTRIB_TEX4, /* VERT_ATTRIB_TEX4 */ + VERT_ATTRIB_TEX5, /* VERT_ATTRIB_TEX5 */ + VERT_ATTRIB_TEX6, /* VERT_ATTRIB_TEX6 */ + VERT_ATTRIB_TEX7, /* VERT_ATTRIB_TEX7 */ + VERT_ATTRIB_POINT_SIZE, /* VERT_ATTRIB_POINT_SIZE */ + VERT_ATTRIB_POS, /* VERT_ATTRIB_GENERIC0 */ + VERT_ATTRIB_GENERIC1, /* VERT_ATTRIB_GENERIC1 */ + VERT_ATTRIB_GENERIC2, /* VERT_ATTRIB_GENERIC2 */ + VERT_ATTRIB_GENERIC3, /* VERT_ATTRIB_GENERIC3 */ + VERT_ATTRIB_GENERIC4, /* VERT_ATTRIB_GENERIC4 */ + VERT_ATTRIB_GENERIC5, /* VERT_ATTRIB_GENERIC5 */ + VERT_ATTRIB_GENERIC6, /* VERT_ATTRIB_GENERIC6 */ + VERT_ATTRIB_GENERIC7, /* VERT_ATTRIB_GENERIC7 */ + VERT_ATTRIB_GENERIC8, /* VERT_ATTRIB_GENERIC8 */ + VERT_ATTRIB_GENERIC9, /* VERT_ATTRIB_GENERIC9 */ + VERT_ATTRIB_GENERIC10, /* VERT_ATTRIB_GENERIC10 */ + VERT_ATTRIB_GENERIC11, /* VERT_ATTRIB_GENERIC11 */ + VERT_ATTRIB_GENERIC12, /* VERT_ATTRIB_GENERIC12 */ + VERT_ATTRIB_GENERIC13, /* VERT_ATTRIB_GENERIC13 */ + VERT_ATTRIB_GENERIC14, /* VERT_ATTRIB_GENERIC14 */ + VERT_ATTRIB_GENERIC15 /* VERT_ATTRIB_GENERIC15 */ + }, + + /* ATTRIBUTE_MAP_MODE_GENERIC0 + * + * Grab vertex processing attribute VERT_ATTRIB_POS as well as + * vertex processing attribute VERT_ATTRIB_GENERIC0 from the + * VAO attribute VERT_ATTRIB_GENERIC0. + */ + { + VERT_ATTRIB_GENERIC0, /* VERT_ATTRIB_POS */ + VERT_ATTRIB_NORMAL, /* VERT_ATTRIB_NORMAL */ + VERT_ATTRIB_COLOR0, /* VERT_ATTRIB_COLOR0 */ + VERT_ATTRIB_COLOR1, /* VERT_ATTRIB_COLOR1 */ + VERT_ATTRIB_FOG, /* VERT_ATTRIB_FOG */ + VERT_ATTRIB_COLOR_INDEX, /* VERT_ATTRIB_COLOR_INDEX */ + VERT_ATTRIB_EDGEFLAG, /* VERT_ATTRIB_EDGEFLAG */ + VERT_ATTRIB_TEX0, /* VERT_ATTRIB_TEX0 */ + VERT_ATTRIB_TEX1, /* VERT_ATTRIB_TEX1 */ + VERT_ATTRIB_TEX2, /* VERT_ATTRIB_TEX2 */ + VERT_ATTRIB_TEX3, /* VERT_ATTRIB_TEX3 */ + VERT_ATTRIB_TEX4, /* VERT_ATTRIB_TEX4 */ + VERT_ATTRIB_TEX5, /* VERT_ATTRIB_TEX5 */ + VERT_ATTRIB_TEX6, /* VERT_ATTRIB_TEX6 */ + VERT_ATTRIB_TEX7, /* VERT_ATTRIB_TEX7 */ + VERT_ATTRIB_POINT_SIZE, /* VERT_ATTRIB_POINT_SIZE */ + VERT_ATTRIB_GENERIC0, /* VERT_ATTRIB_GENERIC0 */ + VERT_ATTRIB_GENERIC1, /* VERT_ATTRIB_GENERIC1 */ + VERT_ATTRIB_GENERIC2, /* VERT_ATTRIB_GENERIC2 */ + VERT_ATTRIB_GENERIC3, /* VERT_ATTRIB_GENERIC3 */ + VERT_ATTRIB_GENERIC4, /* VERT_ATTRIB_GENERIC4 */ + VERT_ATTRIB_GENERIC5, /* VERT_ATTRIB_GENERIC5 */ + VERT_ATTRIB_GENERIC6, /* VERT_ATTRIB_GENERIC6 */ + VERT_ATTRIB_GENERIC7, /* VERT_ATTRIB_GENERIC7 */ + VERT_ATTRIB_GENERIC8, /* VERT_ATTRIB_GENERIC8 */ + VERT_ATTRIB_GENERIC9, /* VERT_ATTRIB_GENERIC9 */ + VERT_ATTRIB_GENERIC10, /* VERT_ATTRIB_GENERIC10 */ + VERT_ATTRIB_GENERIC11, /* VERT_ATTRIB_GENERIC11 */ + VERT_ATTRIB_GENERIC12, /* VERT_ATTRIB_GENERIC12 */ + VERT_ATTRIB_GENERIC13, /* VERT_ATTRIB_GENERIC13 */ + VERT_ATTRIB_GENERIC14, /* VERT_ATTRIB_GENERIC14 */ + VERT_ATTRIB_GENERIC15 /* VERT_ATTRIB_GENERIC15 */ + } +}; + + /** * Look up the array object for the given ID. * @@ -305,6 +434,8 @@ _mesa_initialize_vao(struct gl_context *ctx, } } + vao->_AttributeMapMode = ATTRIBUTE_MAP_MODE_IDENTITY; + _mesa_reference_buffer_object(ctx, &vao->IndexBufferObj, ctx->Shared->NullBufferObj); } diff --git a/src/mesa/main/arrayobj.h b/src/mesa/main/arrayobj.h index ff26157c79e..411ed65c50b 100644 --- a/src/mesa/main/arrayobj.h +++ b/src/mesa/main/arrayobj.h @@ -89,6 +89,80 @@ _mesa_all_varyings_in_vbos(const struct gl_vertex_array_object *vao); extern bool _mesa_all_buffers_are_unmapped(const struct gl_vertex_array_object *vao); + +/** + * Array to apply the position/generic0 aliasing map to + * an attribute value used in vertex processing inputs to an attribute + * as they appear in the vao. + */ +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 + * or gl_vertex_buffer_binding::_VertexBinding from the vao numbering to + * the numbering used with vertex processing inputs. + */ +static inline GLbitfield +_mesa_vao_enable_to_vp_inputs(gl_attribute_map_mode mode, GLbitfield enabled) +{ + switch (mode) { + case ATTRIBUTE_MAP_MODE_IDENTITY: + return enabled; + case ATTRIBUTE_MAP_MODE_POSITION: + /* Copy VERT_ATTRIB_POS enable bit into GENERIC0 position */ + return (enabled & ~VERT_BIT_GENERIC0) + | ((enabled & VERT_BIT_POS) << VERT_ATTRIB_GENERIC0); + case ATTRIBUTE_MAP_MODE_GENERIC0: + /* Copy VERT_ATTRIB_GENERIC0 enable bit into POS position */ + return (enabled & ~VERT_BIT_POS) + | ((enabled & VERT_BIT_GENERIC0) >> VERT_ATTRIB_GENERIC0); + default: + return 0; + } +} + + +/** + * Return the vp_inputs enabled bitmask after application of + * the position/generic0 aliasing map. + */ +static inline GLbitfield +_mesa_get_vao_vp_inputs(const struct gl_vertex_array_object *vao) +{ + const gl_attribute_map_mode mode = vao->_AttributeMapMode; + return _mesa_vao_enable_to_vp_inputs(mode, vao->_Enabled); +} + + /* * API functions */ diff --git a/src/mesa/main/enable.c b/src/mesa/main/enable.c index 0b3de5220df..451a9c918f4 100644 --- a/src/mesa/main/enable.c +++ b/src/mesa/main/enable.c @@ -29,6 +29,7 @@ #include "glheader.h" +#include "arrayobj.h" #include "blend.h" #include "clip.h" #include "context.h" @@ -138,6 +139,10 @@ client_state(struct gl_context *ctx, GLenum cap, GLboolean state) 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/mtypes.h b/src/mesa/main/mtypes.h index f6fa6f45618..b00f059e39a 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -1513,6 +1513,21 @@ struct gl_vertex_array /** + * Enum for defining the mapping for the position/generic0 attribute. + * + * Do not change the order of the values as these are used as + * array indices. + */ +typedef enum +{ + ATTRIBUTE_MAP_MODE_IDENTITY, /**< 1:1 mapping */ + ATTRIBUTE_MAP_MODE_POSITION, /**< get position and generic0 from position */ + ATTRIBUTE_MAP_MODE_GENERIC0, /**< get position and generic0 from generic0 */ + ATTRIBUTE_MAP_MODE_MAX /**< for sizing arrays */ +} gl_attribute_map_mode; + + +/** * Attributes to describe a vertex array. * * Contains the size, type, format and normalization flag, @@ -1598,6 +1613,9 @@ struct gl_vertex_array_object /** Mask of VERT_BIT_* values indicating which arrays are enabled */ GLbitfield _Enabled; + /** Denotes the way the position/generic0 attribute is mapped */ + gl_attribute_map_mode _AttributeMapMode; + /** Mask of VERT_BIT_* values indicating changed/dirty arrays */ GLbitfield NewArrays; diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c index bc0afa6bcf5..81b8fbe8ca7 100644 --- a/src/mesa/main/varray.c +++ b/src/mesa/main/varray.c @@ -1071,8 +1071,13 @@ _mesa_enable_vertex_array_attrib(struct gl_context *ctx, /* was disabled, now being enabled */ FLUSH_VERTICES(ctx, _NEW_ARRAY); vao->VertexAttrib[attrib].Enabled = GL_TRUE; - vao->_Enabled |= VERT_BIT(attrib); - vao->NewArrays |= VERT_BIT(attrib); + const GLbitfield array_bit = VERT_BIT(attrib); + vao->_Enabled |= array_bit; + vao->NewArrays |= array_bit; + + /* Update the map mode if needed */ + if (array_bit & (VERT_BIT_POS|VERT_BIT_GENERIC0)) + _mesa_update_attribute_map_mode(ctx, vao); } } @@ -1150,8 +1155,13 @@ disable_vertex_array_attrib(struct gl_context *ctx, /* was enabled, now being disabled */ FLUSH_VERTICES(ctx, _NEW_ARRAY); vao->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled = GL_FALSE; - vao->_Enabled &= ~VERT_BIT_GENERIC(index); - vao->NewArrays |= VERT_BIT_GENERIC(index); + const GLbitfield array_bit = VERT_BIT_GENERIC(index); + vao->_Enabled &= ~array_bit; + vao->NewArrays |= array_bit; + + /* Update the map mode if needed */ + if (array_bit & (VERT_BIT_POS|VERT_BIT_GENERIC0)) + _mesa_update_attribute_map_mode(ctx, vao); } } |