Index: /trunk/src/VBox/Frontends/VirtualBox/include/VBoxFBOverlay.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/include/VBoxFBOverlay.h	(revision 23645)
+++ /trunk/src/VBox/Frontends/VirtualBox/include/VBoxFBOverlay.h	(revision 23646)
@@ -586,6 +586,6 @@
     void deleteDisplay();
 
-    int createDisplay(VBoxVHWASurfaceBase *pPrimary, GLuint *pDisplay);
-    void doDisplay(VBoxVHWASurfaceBase *pPrimary, VBoxVHWAGlProgramVHWA * pProgram, bool bBindDst);
+    int createDisplay(VBoxVHWASurfaceBase *pPrimary, GLuint *pDisplay, class VBoxVHWAGlProgram ** ppProgram);
+    void doDisplay(VBoxVHWASurfaceBase *pPrimary, bool bProgram, bool bBindDst);
     bool synchTexMem(const QRect * aRect);
 
@@ -605,4 +605,5 @@
 
     GLuint mVisibleDisplay;
+    class VBoxVHWAGlProgram * mpProgram;
 
     bool mVisibleDisplayInitialized;
Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.cpp	(revision 23645)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.cpp	(revision 23646)
@@ -1828,4 +1828,5 @@
                     bool bVGA) :
                 mRect(0,0,aSize.width(),aSize.height()),
+                mpProgram(NULL),
                 mVisibleDisplayInitialized(false),
                 mAddress(NULL),
@@ -2824,15 +2825,19 @@
             glDeleteLists(mVisibleDisplay, 1);
         }
+        if(mpProgram)
+        {
+            mpProgram = NULL;
+        }
         mVisibleDisplayInitialized = false;
     }
 }
 
-void VBoxVHWASurfaceBase::doDisplay(VBoxVHWASurfaceBase *pPrimary, VBoxVHWAGlProgramVHWA * pProgram, bool bBindDst)
+void VBoxVHWASurfaceBase::doDisplay(VBoxVHWASurfaceBase *pPrimary, bool bProgram, bool bBindDst)
 {
     bool bInvokeMultiTex2 = false;
 
-    if(pProgram)
-    {
-        pProgram->start();
+    if(bProgram)
+    {
+//        pProgram->start();
 
 //            if(pSrcCKey != NULL)
@@ -2902,11 +2907,11 @@
     }
 
-    if(pProgram)
-    {
-        pProgram->stop();
-    }
-}
-
-int VBoxVHWASurfaceBase::createDisplay(VBoxVHWASurfaceBase *pPrimary, GLuint *pDisplay)
+//    if(pProgram)
+//    {
+//        pProgram->stop();
+//    }
+}
+
+int VBoxVHWASurfaceBase::createDisplay(VBoxVHWASurfaceBase *pPrimary, GLuint *pDisplay, class VBoxVHWAGlProgram ** ppProgram)
 {
     if(mVisibleTargRect.isEmpty())
@@ -2968,9 +2973,10 @@
             glNewList(display, GL_COMPILE);
 
-            doDisplay(pPrimary, pProgram, pDstCKey != NULL);
+            doDisplay(pPrimary, pProgram != 0, pDstCKey != NULL);
 
             glEndList();
             VBOXQGL_ASSERTNOERR();
             *pDisplay = display;
+            *ppProgram = pProgram;
             return VINF_SUCCESS;
         }
@@ -2989,8 +2995,12 @@
     deleteDisplay();
 
-    int rc = createDisplay(pPrimary, &mVisibleDisplay);
+    int rc = createDisplay(pPrimary, &mVisibleDisplay, &mpProgram);
     if(RT_SUCCESS(rc))
     {
         mVisibleDisplayInitialized = true;
+    }
+    else
+    {
+        mVisibleDisplayInitialized = false;
     }
 }
@@ -3058,5 +3068,10 @@
         }
 
-        doDisplay(pPrimary, pProgram, pDstCKey != NULL);
+        if(pProgram)
+            pProgram->start();
+        doDisplay(pPrimary, pProgram != 0, pDstCKey != NULL);
+        if(pProgram)
+            pProgram->stop();
+
 
 //        doDisplay(pPrimary, NULL, false);
@@ -3064,7 +3079,12 @@
     else
     {
+        if(mpProgram)
+            mpProgram->start();
         VBOXQGL_CHECKERR(
                 glCallList(mVisibleDisplay);
                 );
+        if(mpProgram)
+            mpProgram->stop();
+
     }
 
