mesa: add new internal state for tracking current vertex attribs

This commit is contained in:
Keith Whitwell
2008-10-03 13:55:40 +01:00
parent 0e008d3797
commit fa1b533012
6 changed files with 55 additions and 25 deletions

View File

@@ -2744,6 +2744,7 @@ struct gl_matrix_stack
#define _NEW_MULTISAMPLE 0x2000000 /**< __GLcontextRec::Multisample */ #define _NEW_MULTISAMPLE 0x2000000 /**< __GLcontextRec::Multisample */
#define _NEW_TRACK_MATRIX 0x4000000 /**< __GLcontextRec::VertexProgram */ #define _NEW_TRACK_MATRIX 0x4000000 /**< __GLcontextRec::VertexProgram */
#define _NEW_PROGRAM 0x8000000 /**< __GLcontextRec::VertexProgram */ #define _NEW_PROGRAM 0x8000000 /**< __GLcontextRec::VertexProgram */
#define _NEW_CURRENT_ATTRIB 0x10000000 /**< __GLcontextRec::Current */
#define _NEW_ALL ~0 #define _NEW_ALL ~0
/*@}*/ /*@}*/

View File

@@ -407,6 +407,9 @@ _mesa_update_state_locked( GLcontext *ctx )
GLbitfield new_state = ctx->NewState; GLbitfield new_state = ctx->NewState;
GLbitfield prog_flags = _NEW_PROGRAM; GLbitfield prog_flags = _NEW_PROGRAM;
if (new_state == _NEW_CURRENT_ATTRIB)
goto out;
if (MESA_VERBOSE & VERBOSE_STATE) if (MESA_VERBOSE & VERBOSE_STATE)
_mesa_print_state("_mesa_update_state", new_state); _mesa_print_state("_mesa_update_state", new_state);
@@ -484,6 +487,7 @@ _mesa_update_state_locked( GLcontext *ctx )
* Set ctx->NewState to zero to avoid recursion if * Set ctx->NewState to zero to avoid recursion if
* Driver.UpdateState() has to call FLUSH_VERTICES(). (fixed?) * Driver.UpdateState() has to call FLUSH_VERTICES(). (fixed?)
*/ */
out:
new_state = ctx->NewState; new_state = ctx->NewState;
ctx->NewState = 0; ctx->NewState = 0;
ctx->Driver.UpdateState(ctx, new_state); ctx->Driver.UpdateState(ctx, new_state);

View File

@@ -395,6 +395,12 @@ _mesa_fetch_state(GLcontext *ctx, const gl_state_index state[],
case STATE_INTERNAL: case STATE_INTERNAL:
switch (state[1]) { switch (state[1]) {
case STATE_CURRENT_ATTRIB: {
const GLuint idx = (GLuint) state[2];
COPY_4V(value, ctx->Current.Attrib[idx]);
return;
}
case STATE_NORMAL_SCALE: case STATE_NORMAL_SCALE:
ASSIGN_4V(value, ASSIGN_4V(value,
ctx->_ModelViewInvScale, ctx->_ModelViewInvScale,
@@ -565,6 +571,8 @@ _mesa_program_state_flags(const gl_state_index state[STATE_LENGTH])
case STATE_INTERNAL: case STATE_INTERNAL:
switch (state[1]) { switch (state[1]) {
case STATE_CURRENT_ATTRIB:
return _NEW_CURRENT_ATTRIB;
case STATE_NORMAL_SCALE: case STATE_NORMAL_SCALE:
return _NEW_MODELVIEW; return _NEW_MODELVIEW;

View File

@@ -104,6 +104,7 @@ typedef enum gl_state_index_ {
STATE_LOCAL, STATE_LOCAL,
STATE_INTERNAL, /* Mesa additions */ STATE_INTERNAL, /* Mesa additions */
STATE_CURRENT_ATTRIB, /* ctx->Current vertex attrib value */
STATE_NORMAL_SCALE, STATE_NORMAL_SCALE,
STATE_TEXRECT_SCALE, STATE_TEXRECT_SCALE,
STATE_FOG_PARAMS_OPTIMIZED, /* for faster fog calc */ STATE_FOG_PARAMS_OPTIMIZED, /* for faster fog calc */

View File

@@ -143,15 +143,20 @@ static void vbo_exec_copy_to_current( struct vbo_exec_context *exec )
for (i = VBO_ATTRIB_POS+1 ; i < VBO_ATTRIB_MAX ; i++) { for (i = VBO_ATTRIB_POS+1 ; i < VBO_ATTRIB_MAX ; i++) {
if (exec->vtx.attrsz[i]) { if (exec->vtx.attrsz[i]) {
GLfloat *current = (GLfloat *)vbo->currval[i].Ptr;
/* Note: the exec->vtx.current[i] pointers point into the /* Note: the exec->vtx.current[i] pointers point into the
* ctx->Current.Attrib and ctx->Light.Material.Attrib arrays. * ctx->Current.Attrib and ctx->Light.Material.Attrib arrays.
*/ */
COPY_CLEAN_4V(current, GLfloat *current = (GLfloat *)vbo->currval[i].Ptr;
GLfloat tmp[4];
COPY_CLEAN_4V(tmp,
exec->vtx.attrsz[i], exec->vtx.attrsz[i],
exec->vtx.attrptr[i]); exec->vtx.attrptr[i]);
if (memcmp(current, tmp, sizeof(tmp)) != 0)
{
memcpy(current, tmp, sizeof(tmp));
/* Given that we explicitly state size here, there is no need /* Given that we explicitly state size here, there is no need
* for the COPY_CLEAN above, could just copy 16 bytes and be * for the COPY_CLEAN above, could just copy 16 bytes and be
@@ -166,6 +171,9 @@ static void vbo_exec_copy_to_current( struct vbo_exec_context *exec )
if (i >= VBO_ATTRIB_MAT_FRONT_AMBIENT && if (i >= VBO_ATTRIB_MAT_FRONT_AMBIENT &&
i <= VBO_ATTRIB_MAT_BACK_INDEXES) i <= VBO_ATTRIB_MAT_BACK_INDEXES)
ctx->NewState |= _NEW_LIGHT; ctx->NewState |= _NEW_LIGHT;
ctx->NewState |= _NEW_CURRENT_ATTRIB;
}
} }
} }

View File

@@ -64,18 +64,26 @@ static void _playback_copy_to_current( GLcontext *ctx,
for (i = VBO_ATTRIB_POS+1 ; i < VBO_ATTRIB_MAX ; i++) { for (i = VBO_ATTRIB_POS+1 ; i < VBO_ATTRIB_MAX ; i++) {
if (node->attrsz[i]) { if (node->attrsz[i]) {
GLfloat *current = (GLfloat *)vbo->currval[i].Ptr; GLfloat *current = (GLfloat *)vbo->currval[i].Ptr;
GLfloat tmp[4];
COPY_CLEAN_4V(current, COPY_CLEAN_4V(tmp,
node->attrsz[i], node->attrsz[i],
data); data);
vbo->currval[i].Size = node->attrsz[i]; if (memcmp(current, tmp, 4 * sizeof(GLfloat)) != 0)
{
memcpy(current, tmp, 4 * sizeof(GLfloat));
data += node->attrsz[i]; vbo->currval[i].Size = node->attrsz[i];
if (i >= VBO_ATTRIB_FIRST_MATERIAL && if (i >= VBO_ATTRIB_FIRST_MATERIAL &&
i <= VBO_ATTRIB_LAST_MATERIAL) i <= VBO_ATTRIB_LAST_MATERIAL)
ctx->NewState |= _NEW_LIGHT; ctx->NewState |= _NEW_LIGHT;
ctx->NewState |= _NEW_CURRENT_ATTRIB;
}
data += node->attrsz[i];
} }
} }