mesa: Factor out _mesa_disable_vertex_array_attrib.
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@web.de> Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
parent
236657842b
commit
e8a9473d32
|
@ -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
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
@ -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,
|
||||
void
|
||||
_mesa_disable_vertex_array_attrib(struct gl_context *ctx,
|
||||
struct gl_vertex_array_object *vao,
|
||||
GLuint index)
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue