Index: /trunk/src/VBox/Additions/x11/vboxvideo/vboxutils.c
===================================================================
--- /trunk/src/VBox/Additions/x11/vboxvideo/vboxutils.c	(revision 35267)
+++ /trunk/src/VBox/Additions/x11/vboxvideo/vboxutils.c	(revision 35268)
@@ -244,5 +244,5 @@
         pViews[i].u32ViewOffset = 0;
         pViews[i].u32ViewSize = pVBox->cbView;
-        pViews[i].u32MaxScreenSize = pVBox->cbFramebuffer;
+        pViews[i].u32MaxScreenSize = pVBox->cbFBMax;
     }
     return VINF_SUCCESS;
@@ -309,5 +309,5 @@
         return FALSE;
     }
-    pVBox->cbView = pVBox->cbFramebuffer = offVRAMBaseMapping;
+    pVBox->cbView = pVBox->cbFBMax = offVRAMBaseMapping;
     pVBox->cScreens = VBoxHGSMIGetMonitorCount(&pVBox->guestCtx);
     xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Requested monitor count: %u\n",
@@ -315,8 +315,8 @@
     for (i = 0; i < pVBox->cScreens; ++i)
     {
-        pVBox->cbFramebuffer -= VBVA_MIN_BUFFER_SIZE;
-        pVBox->aoffVBVABuffer[i] = pVBox->cbFramebuffer;
+        pVBox->cbFBMax -= VBVA_MIN_BUFFER_SIZE;
+        pVBox->aoffVBVABuffer[i] = pVBox->cbFBMax;
         TRACE_LOG("VBVA buffer offset for screen %u: 0x%lx\n", i,
-                  (unsigned long) pVBox->cbFramebuffer);
+                  (unsigned long) pVBox->cbFBMax);
         VBoxVBVASetupBufferContext(&pVBox->aVbvaCtx[i],
                                    pVBox->aoffVBVABuffer[i], 
@@ -324,6 +324,6 @@
     }
     TRACE_LOG("Maximum framebuffer size: %lu (0x%lx)\n",
-              (unsigned long) pVBox->cbFramebuffer,
-              (unsigned long) pVBox->cbFramebuffer);
+              (unsigned long) pVBox->cbFBMax,
+              (unsigned long) pVBox->cbFBMax);
     rc = VBoxHGSMISendViewInfo(&pVBox->guestCtx, pVBox->cScreens,
                                vboxFillViewInfo, (void *)pVBox);
Index: /trunk/src/VBox/Additions/x11/vboxvideo/vboxvideo.c
===================================================================
--- /trunk/src/VBox/Additions/x11/vboxvideo/vboxvideo.c	(revision 35267)
+++ /trunk/src/VBox/Additions/x11/vboxvideo/vboxvideo.c	(revision 35268)
@@ -837,6 +837,6 @@
     /* Using the PCI information caused problems with non-powers-of-two
        sized video RAM configurations */
-    pVBox->cbFramebuffer = inl(VBE_DISPI_IOPORT_DATA);
-    pScrn->videoRam = pVBox->cbFramebuffer / 1024;
+    pVBox->cbFBMax = inl(VBE_DISPI_IOPORT_DATA);
+    pScrn->videoRam = pVBox->cbFBMax / 1024;
 
     /* Check if the chip restricts horizontal resolution or not. */
@@ -1152,4 +1152,22 @@
 }
 
+/** Clear the virtual framebuffer in VRAM.  Optionally also clear up to the
+ * size of a new framebuffer.  Framebuffer sizes larger than available VRAM
+ * be treated as zero and passed over. */
+static void
+vboxClearVRAM(ScrnInfoPtr pScrn, int32_t cNewX, int32_t cNewY)
+{
+    VBOXPtr pVBox = VBOXGetRec(pScrn);
+    int64_t cbOldFB, cbNewFB;
+
+    cbOldFB = pVBox->cbLine * pScrn->virtualX;
+    cbNewFB = vboxLineLength(pScrn, cNewX) * cNewY;
+    if (cbOldFB > pVBox->cbFBMax)
+        cbOldFB = 0;
+    if (cbNewFB > pVBox->cbFBMax)
+        cbNewFB = 0;
+    memset(pVBox->base, 0, max(cbOldFB, cbNewFB));
+}
+
 static Bool
 VBOXEnterVT(int scrnIndex, int flags)
@@ -1159,4 +1177,5 @@
 
     TRACE_ENTRY();
+    vboxClearVRAM(pScrn, 0, 0);
     if (pVBox->fHaveHGSMI)
         vboxEnableVbva(pScrn);
@@ -1186,7 +1205,8 @@
     TRACE_ENTRY();
     pVBox->vtSwitch = TRUE;
-    VBOXSaveRestore(pScrn, MODE_RESTORE);
     if (pVBox->fHaveHGSMI)
         vboxDisableVbva(pScrn);
+    vboxClearVRAM(pScrn, 0, 0);
+    VBOXSaveRestore(pScrn, MODE_RESTORE);
     vboxDisableGraphicsCap(pVBox);
 #ifdef VBOX_DRI
@@ -1203,4 +1223,8 @@
     VBOXPtr pVBox = VBOXGetRec(pScrn);
 
+    if (pVBox->fHaveHGSMI)
+        vboxDisableVbva(pScrn);
+    vboxDisableGraphicsCap(pVBox);
+    vboxClearVRAM(pScrn, 0, 0);
 #ifdef VBOX_DRI
     if (pVBox->useDRI)
@@ -1209,7 +1233,4 @@
 #endif
 
-    if (pVBox->fHaveHGSMI)
-        vboxDisableVbva(pScrn);
-    vboxDisableGraphicsCap(pVBox);
     if (pScrn->vtSema) {
         VBOXSaveRestore(xf86Screens[scrnIndex], MODE_RESTORE);
@@ -1289,6 +1310,6 @@
      * too large for VRAM as we sometimes have to do this - see comments in
      * VBOXPreInit. */
-    if (   offStart + pVBox->cbLine * cHeight > pVBox->cbFramebuffer
-        || pVBox->cbLine * pScrn->virtualY > pVBox->cbFramebuffer)
+    if (   offStart + pVBox->cbLine * cHeight > pVBox->cbFBMax
+        || pVBox->cbLine * pScrn->virtualY > pVBox->cbFBMax)
         fActive = FALSE;
     /* Deactivate the screen if it is outside of the virtual framebuffer and
@@ -1329,5 +1350,4 @@
     VBOXPtr pVBox = VBOXGetRec(pScrn);
     uint64_t cbLine = vboxLineLength(pScrn, width);
-    uint32_t cbOldPixmap;
 
     TRACE_LOG("width=%d, height=%d\n", width, height);
@@ -1337,9 +1357,9 @@
         return FALSE;
     }
-    if (cbLine > UINT32_MAX || cbLine * height >= pVBox->cbFramebuffer)
+    if (cbLine > UINT32_MAX || cbLine * height >= pVBox->cbFBMax)
     {
         xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
                    "Unable to set up a virtual screen size of %dx%d with %lu of %d Kb of video memory available.  Please increase the video memory size.\n",
-                   width, height, pVBox->cbFramebuffer / 1024, pScrn->videoRam);
+                   width, height, pVBox->cbFBMax / 1024, pScrn->videoRam);
         return FALSE;
     }
@@ -1347,13 +1367,9 @@
                                 pScrn->depth, vboxBPP(pScrn), cbLine,
                                 pVBox->base);
-    cbOldPixmap = pVBox->cbLine * pScrn->virtualY;
-    if (cbOldPixmap > pVBox->cbFramebuffer)
-        cbOldPixmap = 0;
+    vboxClearVRAM(pScrn, width, height);
     pScrn->virtualX = width;
     pScrn->virtualY = height;
     pScrn->displayWidth = vboxDisplayPitch(pScrn, cbLine);
     pVBox->cbLine = cbLine;
-    /* Clear video RAM for esthetic reasons */
-    memset(pVBox->base, 0, max(cbLine * height, cbOldPixmap));
 #ifdef VBOX_DRI
     if (pVBox->useDRI)
Index: /trunk/src/VBox/Additions/x11/vboxvideo/vboxvideo.h
===================================================================
--- /trunk/src/VBox/Additions/x11/vboxvideo/vboxvideo.h	(revision 35267)
+++ /trunk/src/VBox/Additions/x11/vboxvideo/vboxvideo.h	(revision 35268)
@@ -184,5 +184,5 @@
     void *base;
     /** The amount of VRAM available for use as a framebuffer */
-    unsigned long cbFramebuffer;
+    unsigned long cbFBMax;
     /** The size of the framebuffer and the VBVA buffers at the end of it. */
     unsigned long cbView;
Index: /trunk/src/VBox/Additions/x11/vboxvideo/vboxvideo_dri.c
===================================================================
--- /trunk/src/VBox/Additions/x11/vboxvideo/vboxvideo_dri.c	(revision 35267)
+++ /trunk/src/VBox/Additions/x11/vboxvideo/vboxvideo_dri.c	(revision 35268)
@@ -175,5 +175,5 @@
         || (pVBox->pciInfo == NULL)
         || (pVBox->base == NULL)
-        || (pVBox->cbFramebuffer == 0))
+        || (pVBox->cbFBMax == 0))
     {
         xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "%s: preconditions failed\n",
@@ -256,5 +256,5 @@
         pDRIInfo->maxDrawableTableEntry = VBOX_MAX_DRAWABLES;
         pDRIInfo->frameBufferPhysicalAddress = (pointer)pScrn->memPhysBase;
-        pDRIInfo->frameBufferSize = pVBox->cbFramebuffer;
+        pDRIInfo->frameBufferSize = pVBox->cbFBMax;
         pDRIInfo->frameBufferStride =   pScrn->displayWidth
                                       * pScrn->bitsPerPixel / 8;
