Index: /trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_client.c
===================================================================
--- /trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_client.c	(revision 43763)
+++ /trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_client.c	(revision 43764)
@@ -1623,4 +1623,5 @@
 }
 
+#define CR_BUFFER_HWID(_p) ((_p) ? (_p)->hwid : 0)
 
 void
@@ -1850,4 +1851,14 @@
     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)) {
@@ -1858,4 +1869,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);
@@ -1871,4 +1888,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);
@@ -1885,4 +1908,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);
@@ -1898,4 +1927,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);
@@ -1913,4 +1948,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;
@@ -1928,4 +1969,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);
                 FILLDIRTY(cb->e);
@@ -1941,4 +1988,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);
@@ -1954,4 +2007,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);
@@ -1971,4 +2030,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.a[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,
@@ -1986,4 +2051,9 @@
     }
 
+    if (idHwArrayBuffer != idHwInitialBuffer)
+    {
+        diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwInitialBuffer);
+    }
+
     if (CHECKDIRTY(cb->enableClientState, bitID)) {
         /* update vertex array enable/disable flags */
