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_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
|
||||||
/*@}*/
|
/*@}*/
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
|
@@ -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 */
|
||||||
|
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user