Index: /trunk/src/VBox/Additions/common/crOpenGL/glx.c
===================================================================
--- /trunk/src/VBox/Additions/common/crOpenGL/glx.c	(revision 37029)
+++ /trunk/src/VBox/Additions/common/crOpenGL/glx.c	(revision 37030)
@@ -14,4 +14,5 @@
 #include "dri_glx.h"
 #include "GL/internal/glcore.h"
+#include "cr_glstate.h"
 
 #include <X11/Xregion.h>
@@ -2219,4 +2220,36 @@
 }
 
+static const CRPixelPackState defaultPacking =
+{
+    0,          /*rowLength*/
+    0,          /*skipRows*/
+    0,          /*skipPixels*/
+    1,          /*alignment*/
+    0,          /*imageHeight*/
+    0,          /*skipImages*/
+    GL_FALSE,   /*swapBytes*/
+    GL_FALSE    /*lsbFirst*/
+};
+
+static void stubGetUnpackState(CRPixelPackState *pUnpackState)
+{
+    stub.spu->dispatch_table.GetIntegerv(GL_UNPACK_ROW_LENGTH, &pUnpackState->rowLength);
+    stub.spu->dispatch_table.GetIntegerv(GL_UNPACK_SKIP_ROWS, &pUnpackState->skipRows);
+    stub.spu->dispatch_table.GetIntegerv(GL_UNPACK_SKIP_PIXELS, &pUnpackState->skipPixels);
+    stub.spu->dispatch_table.GetIntegerv(GL_UNPACK_ALIGNMENT, &pUnpackState->alignment);
+    stub.spu->dispatch_table.GetBooleanv(GL_UNPACK_SWAP_BYTES, &pUnpackState->swapBytes);
+    stub.spu->dispatch_table.GetBooleanv(GL_UNPACK_LSB_FIRST, &pUnpackState->psLSBFirst);
+}
+
+static void stubSetUnpackState(const CRPixelPackState *pUnpackState)
+{
+    stub.spu->dispatch_table.PixelStorei(GL_UNPACK_ROW_LENGTH, pUnpackState->rowLength);
+    stub.spu->dispatch_table.PixelStorei(GL_UNPACK_SKIP_ROWS, pUnpackState->skipRows);
+    stub.spu->dispatch_table.PixelStorei(GL_UNPACK_SKIP_PIXELS, pUnpackState->skipPixels);
+    stub.spu->dispatch_table.PixelStorei(GL_UNPACK_ALIGNMENT, pUnpackState->alignment);
+    stub.spu->dispatch_table.PixelStorei(GL_UNPACK_SWAP_BYTES, pUnpackState->swapBytes);
+    stub.spu->dispatch_table.PixelStorei(GL_UNPACK_LSB_FIRST, pUnpackState->psLSBFirst);
+}
+
 static GLX_Pixmap_t* stubInitGlxPixmap(GLX_Pixmap_t* pCreateInfoPixmap, Display *dpy, GLXDrawable draw, ContextInfo *pContext)
 {
@@ -2355,4 +2388,6 @@
     else
     {
+        CRPixelPackState unpackState;
+
         XLOCK(dpy);
         XCopyArea(dpy, (Pixmap)draw, pGlxPixmap->hShmPixmap, pGlxPixmap->gc, 
@@ -2361,6 +2396,10 @@
         XSync(dpy, False);
         XUNLOCK(dpy);
+        
+        stubGetUnpackState(&unpackState);
+        stubSetUnpackState(&defaultPacking);
         stub.spu->dispatch_table.TexImage2D(pGlxPixmap->target, 0, pGlxPixmap->format, pGlxPixmap->w, pGlxPixmap->h, 0, 
                                             GL_BGRA, GL_UNSIGNED_BYTE, stub.xshmSI.shmaddr);
+        stubSetUnpackState(&unpackState);
         /*crDebug("Sync texture for drawable 0x%x(dmg handle 0x%x) [%i,%i,%i,%i]", 
                   (unsigned int) draw, (unsigned int)pGlxPixmap->hDamage, 
@@ -2397,5 +2436,5 @@
     else
     {
-        GLint origUnpackRowLength;
+        CRPixelPackState unpackState;
 
         XLOCK(dpy);
@@ -2406,17 +2445,13 @@
         XUNLOCK(dpy);
 
-        /* Save original value, doesn't cause sync as it's reported by state tracker*/
+        stubGetUnpackState(&unpackState);
+        stubSetUnpackState(&defaultPacking);
         if (pRect->width!=pGlxPixmap->w)
         {
-            stub.spu->dispatch_table.GetIntegerv(GL_UNPACK_ROW_LENGTH, &origUnpackRowLength);
             stub.spu->dispatch_table.PixelStorei(GL_UNPACK_ROW_LENGTH, pGlxPixmap->w);
         }
         stub.spu->dispatch_table.TexSubImage2D(pGlxPixmap->target, 0, pRect->x, pRect->y, pRect->width, pRect->height, 
                                                GL_BGRA, GL_UNSIGNED_BYTE, stub.xshmSI.shmaddr);
-        if (pRect->width!=pGlxPixmap->w)
-        {
-            /* Restore original value*/
-            stub.spu->dispatch_table.PixelStorei(GL_UNPACK_ROW_LENGTH, origUnpackRowLength);
-        }
+        stubSetUnpackState(&unpackState);
 
         /*crDebug("Region sync texture for drawable 0x%x(dmg handle 0x%x) [%i,%i,%i,%i]", 
@@ -2503,4 +2538,5 @@
         /*@todo add damage support here too*/
         XImage *pxim;
+        CRPixelPackState unpackState;
 
         XLOCK(dpy);
@@ -2532,6 +2568,9 @@
         }
 
+        stubGetUnpackState(&unpackState);
+        stubSetUnpackState(&defaultPacking);
         stub.spu->dispatch_table.TexImage2D(pGlxPixmap->target, 0, pGlxPixmap->format, pxim->width, pxim->height, 0, 
                                             GL_BGRA, GL_UNSIGNED_BYTE, (void*)(&(pxim->data[0])));
+        stubSetUnpackState(&unpackState);
         XDestroyImage(pxim);
     }
Index: /trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_get.py
===================================================================
--- /trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_get.py	(revision 37029)
+++ /trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_get.py	(revision 37030)
@@ -18,4 +18,32 @@
 #include "cr_mem.h"
 #include "packspu_proto.h"
+"""
+
+print """
+GLboolean crPackIsPixelStoreParm(GLenum pname)
+{
+    if (pname == GL_UNPACK_ALIGNMENT
+        || pname == GL_UNPACK_ROW_LENGTH
+        || pname == GL_UNPACK_SKIP_PIXELS
+        || pname == GL_UNPACK_LSB_FIRST
+        || pname == GL_UNPACK_SWAP_BYTES
+#ifdef CR_OPENGL_VERSION_1_2
+        || pname == GL_UNPACK_IMAGE_HEIGHT
+#endif
+        || pname == GL_UNPACK_SKIP_ROWS
+        || pname == GL_PACK_ALIGNMENT
+        || pname == GL_PACK_ROW_LENGTH
+        || pname == GL_PACK_SKIP_PIXELS
+        || pname == GL_PACK_LSB_FIRST
+        || pname == GL_PACK_SWAP_BYTES
+#ifdef CR_OPENGL_VERSION_1_2
+        || pname == GL_PACK_IMAGE_HEIGHT
+#endif
+        || pname == GL_PACK_SKIP_ROWS)
+    {
+        return GL_TRUE;
+    }
+    return GL_FALSE;
+}
 """
 
@@ -71,22 +99,5 @@
         if func_name in simple_funcs:
             print """
-    if (pname == GL_UNPACK_ALIGNMENT
-        || pname == GL_UNPACK_ROW_LENGTH
-        || pname == GL_UNPACK_SKIP_PIXELS
-        || pname == GL_UNPACK_LSB_FIRST
-        || pname == GL_UNPACK_SWAP_BYTES
-#ifdef CR_OPENGL_VERSION_1_2
-        || pname == GL_UNPACK_IMAGE_HEIGHT
-#endif
-        || pname == GL_UNPACK_SKIP_ROWS
-        || pname == GL_PACK_ALIGNMENT
-        || pname == GL_PACK_ROW_LENGTH
-        || pname == GL_PACK_SKIP_PIXELS
-        || pname == GL_PACK_LSB_FIRST
-        || pname == GL_PACK_SWAP_BYTES
-#ifdef CR_OPENGL_VERSION_1_2
-        || pname == GL_PACK_IMAGE_HEIGHT
-#endif
-        || pname == GL_PACK_SKIP_ROWS
+    if (crPackIsPixelStoreParm(pname)
         || pname == GL_DRAW_BUFFER
 #ifdef CR_OPENGL_VERSION_1_3
@@ -106,29 +117,34 @@
         )
         {
-#ifndef DEBUG
-            crState%s( pname, params );
-            return;
-#else
-            %s localparams;
-            localparams = (%s) crAlloc(__numValues(pname) * sizeof(*localparams));
-            crState%s(pname, localparams);
-            crPack%s(%s, &writeback);
-            packspuFlush( (void *) thread );
-            while (writeback)
-                crNetRecv();
-            for (i=0; i<__numValues(pname); ++i)
+#ifdef DEBUG
+            if (!crPackIsPixelStoreParm(pname))
             {
-                if (localparams[i] != params[i])
+                %s localparams;
+                localparams = (%s) crAlloc(__numValues(pname) * sizeof(*localparams));
+                crState%s(pname, localparams);
+                crPack%s(%s, &writeback);
+                packspuFlush( (void *) thread );
+                while (writeback)
+                    crNetRecv();
+                for (i=0; i<__numValues(pname); ++i)
                 {
-                    crWarning("Incorrect local state in %s for %%x param %%i", pname, i);
-                    crWarning("Expected %%i but got %%i", (int)localparams[i], (int)params[i]);
+                    if (localparams[i] != params[i])
+                    {
+                        crWarning("Incorrect local state in %s for %%x param %%i", pname, i);
+                        crWarning("Expected %%i but got %%i", (int)localparams[i], (int)params[i]);
+                    }
                 }
+                crFree(localparams);
+                return;
             }
-            crFree(localparams);
-            return;
-#endif
+            else
+#endif
+            {
+                crState%s(pname, params);
+                return;
+            }
             
         }
-            """ % (func_name, params[-1][1], params[-1][1], func_name, func_name, apiutil.MakeCallString(params), func_name)
+            """ % (params[-1][1], params[-1][1], func_name, func_name, apiutil.MakeCallString(params), func_name, func_name)
         params.append( ("&writeback", "foo", 0) )
         print '\tif (pack_spu.swap)'
