summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mesa/main/arrayobj.h26
-rw-r--r--src/mesa/main/enable.c64
-rw-r--r--src/mesa/main/varray.c58
-rw-r--r--src/mesa/main/varray.h7
4 files changed, 75 insertions, 80 deletions
diff --git a/src/mesa/main/arrayobj.h b/src/mesa/main/arrayobj.h
index 411ed65c50b..5de74505bb8 100644
--- a/src/mesa/main/arrayobj.h
+++ b/src/mesa/main/arrayobj.h
@@ -100,32 +100,6 @@ _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
diff --git a/src/mesa/main/enable.c b/src/mesa/main/enable.c
index bc22410bda4..967d23080c7 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 81b8fbe8ca7..b268aaa9a3c 100644
--- a/src/mesa/main/varray.c
+++ b/src/mesa/main/varray.c
@@ -126,6 +126,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.
*/
@@ -1077,7 +1103,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);
}
}
@@ -1144,24 +1170,24 @@ _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 */
FLUSH_VERTICES(ctx, _NEW_ARRAY);
- 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;
/* 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);
}
}
@@ -1176,7 +1202,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);
}
@@ -1184,7 +1211,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);
}
@@ -1210,7 +1238,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);
}
@@ -1219,7 +1248,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 fe7eb816319..ddabd0bc585 100644
--- a/src/mesa/main/varray.h
+++ b/src/mesa/main/varray.h
@@ -106,6 +106,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,