Index: /trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_client.c
===================================================================
--- /trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_client.c	(revision 35851)
+++ /trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_client.c	(revision 35852)
@@ -1445,9 +1445,27 @@
 }
 
+static GLboolean crStateCanLockClientPointer(CRClientPointer* cp)
+{
+    return !(cp->enabled && cp->buffer && cp->buffer->id);
+}
+
 void STATE_APIENTRY crStateLockArraysEXT(GLint first, GLint count)
 {
     CRContext *g = GetCurrentContext();
     CRClientState *c = &(g->client);
-    unsigned int i;
+    int i;
+
+    for (i=0; i<CRSTATECLIENT_MAX_VERTEXARRAYS; ++i)
+    {
+        if (!crStateCanLockClientPointer(crStateGetClientPointerByIndex(i, &c->array)))
+        {
+            break;
+        }
+    }
+    if (i<CRSTATECLIENT_MAX_VERTEXARRAYS)
+    {
+        crDebug("crStateLockArraysEXT ignored because array %i have a bound VBO", i);
+        return;
+    }
 
     c->array.locked = GL_TRUE;
@@ -1458,18 +1476,7 @@
 #endif
 
-    crStateLockClientPointer(&c->array.v);
-    crStateLockClientPointer(&c->array.c);
-    crStateLockClientPointer(&c->array.f);
-    crStateLockClientPointer(&c->array.s);
-    crStateLockClientPointer(&c->array.e);
-    crStateLockClientPointer(&c->array.i);
-    crStateLockClientPointer(&c->array.n);
-    for (i = 0 ; i < CR_MAX_TEXTURE_UNITS ; i++)
-    {
-        crStateLockClientPointer(&c->array.t[i]);
-    }
-    for (i = 0; i < CR_MAX_VERTEX_ATTRIBS; i++)
-    {
-        crStateLockClientPointer(&c->array.a[i]);
+    for (i=0; i<CRSTATECLIENT_MAX_VERTEXARRAYS; ++i)
+    {
+        crStateLockClientPointer(crStateGetClientPointerByIndex(i, &c->array));
     }
 }
@@ -1479,5 +1486,5 @@
     CRContext *g = GetCurrentContext();
     CRClientState *c = &(g->client);
-    unsigned int i;
+    int i;
 
     c->array.locked = GL_FALSE;
@@ -1486,18 +1493,7 @@
 #endif
 
-    crStateUnlockClientPointer(&c->array.v);
-    crStateUnlockClientPointer(&c->array.c);
-    crStateUnlockClientPointer(&c->array.f);
-    crStateUnlockClientPointer(&c->array.s);
-    crStateUnlockClientPointer(&c->array.e);
-    crStateUnlockClientPointer(&c->array.i);
-    crStateUnlockClientPointer(&c->array.n);
-    for (i = 0 ; i < CR_MAX_TEXTURE_UNITS ; i++)
-    {
-        crStateUnlockClientPointer(&c->array.t[i]);
-    }
-    for (i = 0; i < CR_MAX_VERTEX_ATTRIBS; i++)
-    {
-        crStateUnlockClientPointer(&c->array.a[i]);
+    for (i=0; i<CRSTATECLIENT_MAX_VERTEXARRAYS; ++i)
+    {
+        crStateUnlockClientPointer(crStateGetClientPointerByIndex(i, &c->array));
     }
 }
