Index: /trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_client.c
===================================================================
--- /trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_client.c	(revision 43765)
+++ /trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_client.c	(revision 43766)
@@ -1633,4 +1633,15 @@
     GLint curClientTextureUnit = from->curClientTextureUnit;
     int i;
+    GLint idHwArrayBuffer = CR_BUFFER_HWID(toCtx->bufferobject.arrayBuffer);
+    const GLint idHwInitialBuffer = idHwArrayBuffer;
+
+#ifdef DEBUG_misha
+    {
+        GLint tstHwBuffer = -1;
+        diff_api.GetIntegerv(GL_ARRAY_BUFFER_BINDING, &tstHwBuffer);
+        CRASSERT(idHwInitialBuffer == tstHwBuffer);
+    }
+#endif
+
 
     if (CHECKDIRTY(cb->clientPointer, bitID)) {
@@ -1641,4 +1652,10 @@
                     from->array.v.stride != to->array.v.stride ||
                     from->array.v.buffer != to->array.v.buffer) {
+                GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.v.buffer);
+                if (idHwArrayBufferUsed != idHwArrayBuffer)
+                {
+                    diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+                    idHwArrayBuffer = idHwArrayBufferUsed;
+                }
                 diff_api.VertexPointer(to->array.v.size, to->array.v.type,
                                                              to->array.v.stride, to->array.v.p);
@@ -1656,4 +1673,10 @@
                     from->array.n.stride != to->array.n.stride ||
                     from->array.n.buffer != to->array.n.buffer) {
+                GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.n.buffer);
+                if (idHwArrayBufferUsed != idHwArrayBuffer)
+                {
+                    diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+                    idHwArrayBuffer = idHwArrayBufferUsed;
+                }
                 diff_api.NormalPointer(to->array.n.type,
                                                              to->array.n.stride, to->array.n.p);
@@ -1671,4 +1694,10 @@
                     from->array.c.stride != to->array.c.stride ||
                     from->array.c.buffer != to->array.c.buffer) {
+                GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.c.buffer);
+                if (idHwArrayBufferUsed != idHwArrayBuffer)
+                {
+                    diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+                    idHwArrayBuffer = idHwArrayBufferUsed;
+                }
                 diff_api.ColorPointer(to->array.c.size, to->array.c.type,
                                                             to->array.c.stride, to->array.c.p);
@@ -1686,4 +1715,10 @@
                     from->array.i.stride != to->array.i.stride ||
                     from->array.i.buffer != to->array.i.buffer) {
+                GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.i.buffer);
+                if (idHwArrayBufferUsed != idHwArrayBuffer)
+                {
+                    diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+                    idHwArrayBuffer = idHwArrayBufferUsed;
+                }
                 diff_api.IndexPointer(to->array.i.type,
                                                             to->array.i.stride, to->array.i.p);
@@ -1702,4 +1737,10 @@
                         from->array.t[i].stride != to->array.t[i].stride ||
                         from->array.t[i].buffer != to->array.t[i].buffer) {
+                    GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.t[i].buffer);
+                    if (idHwArrayBufferUsed != idHwArrayBuffer)
+                    {
+                        diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+                        idHwArrayBuffer = idHwArrayBufferUsed;
+                    }
                     diff_api.ClientActiveTextureARB(GL_TEXTURE0_ARB + i);
                     curClientTextureUnit = i;
@@ -1719,4 +1760,10 @@
             if (from->array.e.stride != to->array.e.stride ||
                     from->array.e.buffer != to->array.e.buffer) {
+                GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.e.buffer);
+                if (idHwArrayBufferUsed != idHwArrayBuffer)
+                {
+                    diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+                    idHwArrayBuffer = idHwArrayBufferUsed;
+                }
                 diff_api.EdgeFlagPointer(to->array.e.stride, to->array.e.p);
                 from->array.e.stride = to->array.e.stride;
@@ -1732,4 +1779,10 @@
                     from->array.s.stride != to->array.s.stride ||
                     from->array.s.buffer != to->array.s.buffer) {
+                GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.s.buffer);
+                if (idHwArrayBufferUsed != idHwArrayBuffer)
+                {
+                    diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+                    idHwArrayBuffer = idHwArrayBufferUsed;
+                }
                 diff_api.SecondaryColorPointerEXT(to->array.s.size, to->array.s.type,
                                                                                     to->array.s.stride, to->array.s.p);
@@ -1747,4 +1800,10 @@
                     from->array.f.stride != to->array.f.stride ||
                     from->array.f.buffer != to->array.f.buffer) {
+                GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.f.buffer);
+                if (idHwArrayBufferUsed != idHwArrayBuffer)
+                {
+                    diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+                    idHwArrayBuffer = idHwArrayBufferUsed;
+                }
                 diff_api.FogCoordPointerEXT(to->array.f.type,
                                                                         to->array.f.stride, to->array.f.p);
@@ -1765,4 +1824,10 @@
                         from->array.a[i].normalized != to->array.a[i].normalized ||
                         from->array.a[i].buffer != to->array.a[i].buffer) {
+                    GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.[i].buffer);
+                    if (idHwArrayBufferUsed != idHwArrayBuffer)
+                    {
+                        diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+                        idHwArrayBuffer = idHwArrayBufferUsed;
+                    }
                     diff_api.VertexAttribPointerARB(i, to->array.a[i].size,
                                                                                     to->array.a[i].type,
@@ -1781,4 +1846,9 @@
         }
 #endif
+    }
+
+    if (idHwArrayBuffer != idHwInitialBuffer)
+    {
+        diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwInitialBuffer);
     }
 
@@ -2109,5 +2179,5 @@
                 if (to->array.a[i].enabled)
                     diff_api.EnableVertexAttribArrayARB(i);
-                else 
+                else
                     diff_api.DisableVertexAttribArrayARB(i);
                 FILLDIRTY(cb->enableClientState);
