diff options
Diffstat (limited to 'src/mesa')
| -rw-r--r-- | src/mesa/main/mtypes.h | 1 | ||||
| -rw-r--r-- | src/mesa/main/state.c | 4 | ||||
| -rw-r--r-- | src/mesa/shader/prog_statevars.c | 8 | ||||
| -rw-r--r-- | src/mesa/shader/prog_statevars.h | 1 | ||||
| -rw-r--r-- | src/mesa/vbo/vbo_exec_api.c | 42 | ||||
| -rw-r--r-- | src/mesa/vbo/vbo_save_draw.c | 24 | 
6 files changed, 55 insertions, 25 deletions
| diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index a5e1cf6a27..bc099dabeb 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -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  /*@}*/ diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c index d355f78a0e..eb8dc2a339 100644 --- a/src/mesa/main/state.c +++ b/src/mesa/main/state.c @@ -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); diff --git a/src/mesa/shader/prog_statevars.c b/src/mesa/shader/prog_statevars.c index 47c46f63ec..9cc33fa2c1 100644 --- a/src/mesa/shader/prog_statevars.c +++ b/src/mesa/shader/prog_statevars.c @@ -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; diff --git a/src/mesa/shader/prog_statevars.h b/src/mesa/shader/prog_statevars.h index 7b490e3d63..1f728c64e8 100644 --- a/src/mesa/shader/prog_statevars.h +++ b/src/mesa/shader/prog_statevars.h @@ -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 */ diff --git a/src/mesa/vbo/vbo_exec_api.c b/src/mesa/vbo/vbo_exec_api.c index d70b4bb1a1..23f4f8331e 100644 --- a/src/mesa/vbo/vbo_exec_api.c +++ b/src/mesa/vbo/vbo_exec_api.c @@ -143,29 +143,37 @@ 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,  -		       exec->vtx.attrsz[i],  -		       exec->vtx.attrptr[i]); +	 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 -	  * done.  The only problem is when Mesa accesses ctx->Current -	  * directly. -	  */ -	 vbo->currval[i].Size = exec->vtx.attrsz[i]; +            /* Given that we explicitly state size here, there is no need +             * for the COPY_CLEAN above, could just copy 16 bytes and be +             * done.  The only problem is when Mesa accesses ctx->Current +             * directly. +             */ +            vbo->currval[i].Size = exec->vtx.attrsz[i]; -	 /* This triggers rather too much recalculation of Mesa state -	  * that doesn't get used (eg light positions). -	  */ -	 if (i >= VBO_ATTRIB_MAT_FRONT_AMBIENT && -	     i <= VBO_ATTRIB_MAT_BACK_INDEXES) -	    ctx->NewState |= _NEW_LIGHT; +            /* This triggers rather too much recalculation of Mesa state +             * that doesn't get used (eg light positions). +             */ +            if (i >= VBO_ATTRIB_MAT_FRONT_AMBIENT && +                i <= VBO_ATTRIB_MAT_BACK_INDEXES) +               ctx->NewState |= _NEW_LIGHT; +             +            ctx->NewState |= _NEW_CURRENT_ATTRIB; +         }        }     } diff --git a/src/mesa/vbo/vbo_save_draw.c b/src/mesa/vbo/vbo_save_draw.c index ed82f09958..4c97acddb9 100644 --- a/src/mesa/vbo/vbo_save_draw.c +++ b/src/mesa/vbo/vbo_save_draw.c @@ -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,  -		       node->attrsz[i],  -		       data); +         COPY_CLEAN_4V(tmp,  +                       node->attrsz[i],  +                       data); +          +         if (memcmp(current, tmp, 4 * sizeof(GLfloat)) != 0) +         { +            memcpy(current, tmp, 4 * sizeof(GLfloat)); -	 vbo->currval[i].Size = node->attrsz[i]; +            vbo->currval[i].Size = node->attrsz[i]; -	 data += node->attrsz[i]; +            if (i >= VBO_ATTRIB_FIRST_MATERIAL && +                i <= VBO_ATTRIB_LAST_MATERIAL) +               ctx->NewState |= _NEW_LIGHT; + +            ctx->NewState |= _NEW_CURRENT_ATTRIB; +         } -	 if (i >= VBO_ATTRIB_FIRST_MATERIAL && -	     i <= VBO_ATTRIB_LAST_MATERIAL) -	    ctx->NewState |= _NEW_LIGHT; +	 data += node->attrsz[i];        }     } | 
