Index: /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_rpw.cpp
===================================================================
--- /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_rpw.cpp	(revision 45375)
+++ /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_rpw.cpp	(revision 45376)
@@ -73,4 +73,6 @@
         cr_server.head_spu->dispatch_table.UnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);
 
+        cr_server.head_spu->dispatch_table.BufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, pCurEntry->Size.cx*pCurEntry->Size.cy*4, 0, GL_STREAM_READ_ARB);
+
         cr_server.head_spu->dispatch_table.BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
     }
@@ -128,8 +130,9 @@
     bool fExit = false;
     bool fForceComplete = false;
+    bool fNotifyCmdCompleted = false;
 
     CRASSERT(pDummyMural);
 
-    int rc = RTSemEventSignal(pWorker->hSubmitEvent);
+    int rc = RTSemEventSignal(pWorker->Ctl.hCompleteEvent);
     if (!RT_SUCCESS(rc))
     {
@@ -181,4 +184,5 @@
             enmCtlType = CR_SERVER_RPW_CTL_TYPE_UNDEFINED;
             pCtlEntry = NULL;
+            fNotifyCmdCompleted = true;
         }
 
@@ -220,4 +224,15 @@
             RTCritSectLeave(&pWorker->CritSect);
 
+            if (fNotifyCmdCompleted)
+            {
+                rc = RTSemEventSignal(pWorker->Ctl.hCompleteEvent);
+                if (!RT_SUCCESS(rc))
+                {
+                    crWarning("RTSemEventSignal failed rc %d", rc);
+                    break;
+                }
+                fNotifyCmdCompleted = false;
+            }
+
             if (fExit)
                 break;
@@ -239,4 +254,11 @@
                 Assert(!RTListIsEmpty(&GpuSubmittedList));
                 fForceComplete = true;
+            }
+
+            rc = RTCritSectEnter(&pWorker->CritSect);
+            if (!RT_SUCCESS(rc))
+            {
+                crWarning("RTCritSectEnter failed, rc %d", rc);
+                break;
             }
         }
@@ -366,5 +388,5 @@
                         if (RT_SUCCESS(rc))
                         {
-                            rc = RTSemEventWait(pWorker->hSubmitEvent, RT_INDEFINITE_WAIT);
+                            rc = RTSemEventWait(pWorker->Ctl.hCompleteEvent, RT_INDEFINITE_WAIT);
                             if (RT_SUCCESS(rc))
                             {
