Call _ae_update_state when array enable state changes
authorKrzysztof Czurylo <krzysztof.czurylo@intel.com>
Thu, 21 Aug 2008 22:01:20 +0000 (15:01 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Thu, 21 Aug 2008 22:01:59 +0000 (15:01 -0700)
Basically, the application enables client vertex and color arrays,
renders something, then disables color array, and renders something
else (using vertex array only).  Even though the color array is
disabled (and the pointer is no longer valid), the driver still tries
to read color data from this array (which results in an exception).

This is because enabling/disabling array does not trigger
_ae_update_state() and the list of enabled arrays is not updated.
_ae_update_state() it's called on the first state validation only (as
all the "dirty" flags are set at the beginning). Any further change to
client arrays' state has no effect.

src/mesa/main/enable.c

index 9fe979a6b2ec2fe7f602a9dc6cc58f83b686d5cd..827d84765afb81d8ff95d7ec97a1c78aabaec9b8 100644 (file)
@@ -38,6 +38,7 @@
 #include "enums.h"
 #include "math/m_matrix.h"
 #include "math/m_xform.h"
+#include "api_arrayelt.h"
 
 
 
@@ -129,6 +130,9 @@ client_state(GLcontext *ctx, GLenum cap, GLboolean state)
 
    FLUSH_VERTICES(ctx, _NEW_ARRAY);
    ctx->Array.NewState |= flag;
+
+   _ae_invalidate_state(ctx, _NEW_ARRAY);
+
    *var = state;
 
    if (state)