Index: /trunk/src/VBox/Frontends/VirtualBox/include/VBoxFrameBuffer.h
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/include/VBoxFrameBuffer.h	(revision 22794)
+++ /trunk/src/VBox/Frontends/VirtualBox/include/VBoxFrameBuffer.h	(revision 22795)
@@ -1440,5 +1440,5 @@
     void vboxShowOverlay(bool show);
     void vboxUpdateOverlayPosition(const QPoint & pos);
-    void vboxUpdateOverlay(const QPoint & pos, const QRect & rect, bool show);
+    void vboxUpdateOverlay(const QRect & rect, bool show);
     VBoxGLWidget *mpOverlayWidget;
     bool mGlOn;
Index: /trunk/src/VBox/Frontends/VirtualBox/src/VBoxFBQGL.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VirtualBox/src/VBoxFBQGL.cpp	(revision 22794)
+++ /trunk/src/VBox/Frontends/VirtualBox/src/VBoxFBQGL.cpp	(revision 22795)
@@ -2679,4 +2679,5 @@
         vsy2 = sy2 + int(dy2*stretchY);
         mVisibleSrcRect.setCoords(vsx1, vsy1, vsx2, vsy2);
+        Assert(!mVisibleSrcRect.isEmpty());
         Assert(mSrcRect.contains(mVisibleSrcRect));
     }
@@ -2777,5 +2778,5 @@
     if(bInvokeMultiTex2)
     {
-        doMultiTex2FB(&mTargRect, pPrimary->mpTex[0], &mSrcRect,
+        doMultiTex2FB(&mVisibleTargRect, pPrimary->mpTex[0], &mVisibleSrcRect,
                 (fourcc() == FOURCC_YV12) ? 3 : 1);
     }
@@ -2784,11 +2785,11 @@
         if(fourcc() == FOURCC_YV12)
         {
-            doMultiTex2FB(&mTargRect, &mSrcRect, 3 );
+            doMultiTex2FB(&mVisibleTargRect, &mVisibleSrcRect, 3 );
         }
         else
         {
-            VBOXQGLLOG_QRECT("mTargRect: ", &mTargRect, "\n");
-            VBOXQGLLOG_QRECT("mSrcRect: ", &mSrcRect, "\n");
-            doTex2FB(&mTargRect, &mSrcRect);
+            VBOXQGLLOG_QRECT("mVisibleTargRect: ", &mVisibleTargRect, "\n");
+            VBOXQGLLOG_QRECT("mVisibleSrcRect: ", &mVisibleSrcRect, "\n");
+            doTex2FB(&mVisibleTargRect, &mVisibleSrcRect);
         }
     }
@@ -2802,4 +2803,16 @@
 GLuint VBoxVHWASurfaceBase::createDisplay(VBoxVHWASurfaceBase *pPrimary)
 {
+    if(mVisibleTargRect.isEmpty())
+    {
+        Assert(mVisibleSrcRect.isEmpty());
+        return 0;
+    }
+    Assert(!mVisibleSrcRect.isEmpty());
+    /* just for the fallback */
+    if(mVisibleSrcRect.isEmpty())
+    {
+        return 0;
+    }
+
     VBoxVHWAGlProgramVHWA * pProgram = NULL;
     const VBoxVHWAColorKey * pSrcCKey = NULL, *pDstCKey = NULL;
@@ -2835,9 +2848,6 @@
     deleteDisplay();
 
-
-    {
-        mVisibleDisplay = createDisplay(pPrimary);
-        mVisibleDisplayInitialized = true;
-    }
+    mVisibleDisplay = createDisplay(pPrimary);
+    mVisibleDisplayInitialized = true;
 }
 
@@ -2860,9 +2870,22 @@
 {
     Assert(mVisibleDisplayInitialized);
-
-    synchTexMem(&mSrcRect);
+    if(mVisibleDisplay == 0)
+    {
+        /* nothing to display, i.e. the surface is not visible,
+         * in the sense that it's located behind the viewport ranges */
+        Assert(mVisibleSrcRect.isEmpty());
+        Assert(mVisibleTargRect.isEmpty());
+        return;
+    }
+    else
+    {
+        Assert(!mVisibleSrcRect.isEmpty());
+        Assert(!mVisibleTargRect.isEmpty());
+    }
+
+    synchTexMem(&mVisibleSrcRect);
     if(pPrimary && getActiveDstOverlayCKey(pPrimary))
     {
-        pPrimary->synchTexMem(&mTargRect);
+        pPrimary->synchTexMem(&mVisibleTargRect);
     }
 
@@ -3375,10 +3398,11 @@
     if(pCmd->SurfInfo.surfCaps & VBOXVHWA_SCAPS_OFFSCREENPLAIN)
     {
+        Assert(0);
         pCmd->u.out.ErrInfo = 1;
         return VINF_SUCCESS;
     }
 
-    Assert(pCmd->SurfInfo.surfCaps & VBOXVHWA_SCAPS_OFFSCREENPLAIN
-            || pCmd->SurfInfo.surfCaps & VBOXVHWA_SCAPS_OVERLAY);
+    Assert(/*pCmd->SurfInfo.surfCaps & VBOXVHWA_SCAPS_OFFSCREENPLAIN
+            || */ pCmd->SurfInfo.surfCaps & VBOXVHWA_SCAPS_OVERLAY);
 
     if(pCmd->u.in.bIsDifferentPixelFormat)
@@ -5351,18 +5375,17 @@
 void VBoxQGLOverlayFrameBuffer::vboxShowOverlay(bool show)
 {
-    /** @todo */
-    Assert(0);
+    mpOverlayWidget->setVisible(show);
 }
 
 void VBoxQGLOverlayFrameBuffer::vboxUpdateOverlayPosition(const QPoint & pos)
 {
-    /** @todo */
-    Assert(0);
-}
-
-void VBoxQGLOverlayFrameBuffer::vboxUpdateOverlay(const QPoint & pos, const QRect & rect, bool show)
-{
-    /** @todo */
-    Assert(0);
+    mpOverlayWidget->move(pos);
+}
+
+void VBoxQGLOverlayFrameBuffer::vboxUpdateOverlay(const QRect & rect, bool show)
+{
+    mpOverlayWidget->move(rect.x(), rect.y());
+    mpOverlayWidget->resize(rect.width(), rect.height());
+    mpOverlayWidget->setVisible(show);
 }
 
@@ -5389,5 +5412,5 @@
             {
                 QRect overRect = mpOverlayWidget->overlaysRectUnion();
-                vboxUpdateOverlay(QPoint(overRect.x(), overRect.y()), overRect, true);
+                vboxUpdateOverlay(overRect, true);
             }
         } break;
@@ -5428,5 +5451,5 @@
             {
                 QRect overRect = mpOverlayWidget->overlaysRectUnion();
-                vboxUpdateOverlay(QPoint(overRect.x(), overRect.y()), overRect, true);
+                vboxUpdateOverlay(overRect, true);
             }
         } break;
