Index: /trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_client.c
===================================================================
--- /trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_client.c	(revision 35911)
+++ /trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_client.c	(revision 35912)
@@ -597,5 +597,12 @@
 void PACKSPU_APIENTRY packspu_UnlockArraysEXT()
 {
+    GET_CONTEXT(ctx);
+    CRClientState *clientState = &(ctx->clientState->client);
+
+    if (clientState->array.locked && clientState->array.synced)
+    {
+        crPackUnlockArraysEXT();
+    }
+
     crStateUnlockArraysEXT();
-    crPackUnlockArraysEXT();
-}
+}
Index: /trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_client.c
===================================================================
--- /trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_client.c	(revision 35911)
+++ /trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_client.c	(revision 35912)
@@ -1488,4 +1488,10 @@
     int i;
 
+    if (!c->array.locked)
+    {
+        crDebug("crStateUnlockArraysEXT ignored because arrays aren't locked");
+        return;
+    }
+
     c->array.locked = GL_FALSE;
 #ifdef IN_GUEST
@@ -1624,4 +1630,5 @@
     CRClientState *from = &(fromCtx->client);
     const CRClientState *to = &(toCtx->client);
+    GLint curClientTextureUnit = from->curClientTextureUnit;
     int i;
 
@@ -1695,4 +1702,5 @@
                         from->array.t[i].buffer != to->array.t[i].buffer) {
                     diff_api.ClientActiveTextureARB(GL_TEXTURE0_ARB + i);
+                    curClientTextureUnit = i;
                     diff_api.TexCoordPointer(to->array.t[i].size, to->array.t[i].type,
                                                                 to->array.t[i].stride, to->array.t[i].p);
@@ -1798,4 +1806,5 @@
             if (from->array.t[i].enabled != to->array.t[i].enabled) {
                 diff_api.ClientActiveTextureARB(GL_TEXTURE0_ARB + i);
+                curClientTextureUnit = i;
                 able[to->array.t[i].enabled](GL_TEXTURE_COORD_ARRAY);
                 from->array.t[i].enabled = to->array.t[i].enabled;
@@ -1825,4 +1834,9 @@
         CLEARDIRTY2(cb->enableClientState, bitID);
     }
+
+    if (to->curClientTextureUnit != curClientTextureUnit)
+    {
+        diff_api.ClientActiveTextureARB(GL_TEXTURE0_ARB + to->curClientTextureUnit);
+    }
 }
 
@@ -1834,4 +1848,5 @@
     const CRClientState *from = &(fromCtx->client);
     const CRClientState *to = &(toCtx->client);
+    GLint curClientTextureUnit = from->curClientTextureUnit;
     int i;
 
@@ -1899,4 +1914,5 @@
                         from->array.t[i].buffer != to->array.t[i].buffer) {
                     diff_api.ClientActiveTextureARB(GL_TEXTURE0_ARB + i);
+                    curClientTextureUnit = i;
                     diff_api.TexCoordPointer(to->array.t[i].size, to->array.t[i].type,
                                                                 to->array.t[i].stride, to->array.t[i].p);
@@ -1998,4 +2014,5 @@
             if (from->array.t[i].enabled != to->array.t[i].enabled) {
                 diff_api.ClientActiveTextureARB(GL_TEXTURE0_ARB + i);
+                curClientTextureUnit = i;
                 able[to->array.t[i].enabled](GL_TEXTURE_COORD_ARRAY);
                 FILLDIRTY(cb->enableClientState);
@@ -2029,4 +2046,9 @@
         }
         CLEARDIRTY2(cb->enableClientState, bitID);
+    }
+
+    if (to->curClientTextureUnit != curClientTextureUnit)
+    {
+        diff_api.ClientActiveTextureARB(GL_TEXTURE0_ARB + to->curClientTextureUnit);
     }
 
Index: /trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_texture.c
===================================================================
--- /trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_texture.c	(revision 35911)
+++ /trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_texture.c	(revision 35912)
@@ -791,4 +791,6 @@
 
     c->curClientTextureUnit = texture - GL_TEXTURE0_ARB;
+
+    DIRTY(GetCurrentBits()->client.dirty, g->neg_bitid);
 }
 
