mesa: Restore gl_array_object::NewArray
authorFredrik Höglund <fredrik@kde.org>
Sat, 11 May 2013 17:23:46 +0000 (19:23 +0200)
committerFredrik Höglund <fredrik@kde.org>
Thu, 7 Nov 2013 15:20:44 +0000 (16:20 +0100)
This will be used by the ARB_vertex_attrib_binding implementation.
This reverts commit db38e9a0e179441f59274f6f2a751912c29872e2.

Reviewed-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/mesa/main/enable.c
src/mesa/main/mtypes.h
src/mesa/main/state.c
src/mesa/main/varray.c

index dd6a772f96c6266e9b15b965a15e80d12047b90c..c047f5df2c5e22667fa57f8c3f1b3d8e532af016 100644 (file)
@@ -135,6 +135,8 @@ client_state(struct gl_context *ctx, GLenum cap, GLboolean state)
    else
       arrayObj->_Enabled &= ~flag;
 
+   arrayObj->NewArrays |= flag;
+
    if (ctx->Driver.Enable) {
       ctx->Driver.Enable( ctx, cap, state );
    }
index b5c5583d6d34e313a3abd8bd05d41dc11ca50250..500f6701de75b38f0df86869366a77af5db8cd7e 100644 (file)
@@ -1513,6 +1513,9 @@ struct gl_array_object
    /** Mask of VERT_BIT_* values indicating which arrays are enabled */
    GLbitfield64 _Enabled;
 
+   /** Mask of VERT_BIT_* values indicating changed/dirty arrays */
+   GLbitfield64 NewArrays;
+
    /**
     * Min of all enabled arrays' _MaxElement.  When arrays reside inside VBOs
     * we can determine the max legal (in bounds) glDrawElements array index.
index 23926410b3491b9d84c030ecba3e986e532f33b8..bf216312b8322d697ee9dc0032f183d4258364c3 100644 (file)
@@ -430,6 +430,7 @@ _mesa_update_state_locked( struct gl_context *ctx )
    new_state = ctx->NewState | new_prog_state;
    ctx->NewState = 0;
    ctx->Driver.UpdateState(ctx, new_state);
+   ctx->Array.ArrayObj->NewArrays = 0x0;
 }
 
 
index dee476abbae0f49506d6e45d29eb0935dff13e33..24cd324cb99e3228c355018acb53b4d4ed59d6ba 100644 (file)
@@ -286,6 +286,7 @@ update_array(struct gl_context *ctx,
                                  ctx->Array.ArrayBufferObj);
 
    ctx->NewState |= _NEW_ARRAY;
+   ctx->Array.ArrayObj->NewArrays |= VERT_BIT(attrib);
 }
 
 
@@ -537,6 +538,7 @@ _mesa_EnableVertexAttribArray(GLuint index)
       FLUSH_VERTICES(ctx, _NEW_ARRAY);
       arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled = GL_TRUE;
       arrayObj->_Enabled |= VERT_BIT_GENERIC(index);
+      arrayObj->NewArrays |= VERT_BIT_GENERIC(index);
    }
 }
 
@@ -562,6 +564,7 @@ _mesa_DisableVertexAttribArray(GLuint index)
       FLUSH_VERTICES(ctx, _NEW_ARRAY);
       arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled = GL_FALSE;
       arrayObj->_Enabled &= ~VERT_BIT_GENERIC(index);
+      arrayObj->NewArrays |= VERT_BIT_GENERIC(index);
    }
 }
 
@@ -1161,6 +1164,7 @@ _mesa_VertexAttribDivisor(GLuint index, GLuint divisor)
    if (array->InstanceDivisor != divisor) {
       FLUSH_VERTICES(ctx, _NEW_ARRAY);
       array->InstanceDivisor = divisor;
+      ctx->Array.ArrayObj->NewArrays |= VERT_BIT(VERT_ATTRIB_GENERIC(index));
    }
 }