mesa: add new internal state for tracking current vertex attribs
This commit is contained in:
@@ -2744,6 +2744,7 @@ struct gl_matrix_stack
|
||||
#define _NEW_MULTISAMPLE 0x2000000 /**< __GLcontextRec::Multisample */
|
||||
#define _NEW_TRACK_MATRIX 0x4000000 /**< __GLcontextRec::VertexProgram */
|
||||
#define _NEW_PROGRAM 0x8000000 /**< __GLcontextRec::VertexProgram */
|
||||
#define _NEW_CURRENT_ATTRIB 0x10000000 /**< __GLcontextRec::Current */
|
||||
#define _NEW_ALL ~0
|
||||
/*@}*/
|
||||
|
||||
|
@@ -407,6 +407,9 @@ _mesa_update_state_locked( GLcontext *ctx )
|
||||
GLbitfield new_state = ctx->NewState;
|
||||
GLbitfield prog_flags = _NEW_PROGRAM;
|
||||
|
||||
if (new_state == _NEW_CURRENT_ATTRIB)
|
||||
goto out;
|
||||
|
||||
if (MESA_VERBOSE & VERBOSE_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
|
||||
* Driver.UpdateState() has to call FLUSH_VERTICES(). (fixed?)
|
||||
*/
|
||||
out:
|
||||
new_state = ctx->NewState;
|
||||
ctx->NewState = 0;
|
||||
ctx->Driver.UpdateState(ctx, new_state);
|
||||
|
@@ -395,6 +395,12 @@ _mesa_fetch_state(GLcontext *ctx, const gl_state_index state[],
|
||||
|
||||
case STATE_INTERNAL:
|
||||
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:
|
||||
ASSIGN_4V(value,
|
||||
ctx->_ModelViewInvScale,
|
||||
@@ -565,6 +571,8 @@ _mesa_program_state_flags(const gl_state_index state[STATE_LENGTH])
|
||||
|
||||
case STATE_INTERNAL:
|
||||
switch (state[1]) {
|
||||
case STATE_CURRENT_ATTRIB:
|
||||
return _NEW_CURRENT_ATTRIB;
|
||||
|
||||
case STATE_NORMAL_SCALE:
|
||||
return _NEW_MODELVIEW;
|
||||
|
@@ -104,6 +104,7 @@ typedef enum gl_state_index_ {
|
||||
STATE_LOCAL,
|
||||
|
||||
STATE_INTERNAL, /* Mesa additions */
|
||||
STATE_CURRENT_ATTRIB, /* ctx->Current vertex attrib value */
|
||||
STATE_NORMAL_SCALE,
|
||||
STATE_TEXRECT_SCALE,
|
||||
STATE_FOG_PARAMS_OPTIMIZED, /* for faster fog calc */
|
||||
|
@@ -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++) {
|
||||
if (exec->vtx.attrsz[i]) {
|
||||
GLfloat *current = (GLfloat *)vbo->currval[i].Ptr;
|
||||
|
||||
/* Note: the exec->vtx.current[i] pointers point into the
|
||||
* 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.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
|
||||
* 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 &&
|
||||
i <= VBO_ATTRIB_MAT_BACK_INDEXES)
|
||||
ctx->NewState |= _NEW_LIGHT;
|
||||
|
||||
ctx->NewState |= _NEW_CURRENT_ATTRIB;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -64,18 +64,26 @@ static void _playback_copy_to_current( GLcontext *ctx,
|
||||
for (i = VBO_ATTRIB_POS+1 ; i < VBO_ATTRIB_MAX ; i++) {
|
||||
if (node->attrsz[i]) {
|
||||
GLfloat *current = (GLfloat *)vbo->currval[i].Ptr;
|
||||
GLfloat tmp[4];
|
||||
|
||||
COPY_CLEAN_4V(current,
|
||||
COPY_CLEAN_4V(tmp,
|
||||
node->attrsz[i],
|
||||
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 &&
|
||||
i <= VBO_ATTRIB_LAST_MATERIAL)
|
||||
ctx->NewState |= _NEW_LIGHT;
|
||||
|
||||
ctx->NewState |= _NEW_CURRENT_ATTRIB;
|
||||
}
|
||||
|
||||
data += node->attrsz[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user