Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp	(revision 27428)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp	(revision 27429)
@@ -1310,4 +1310,5 @@
                         {
                             pAllocation->enmType = VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE;
+                            pAllocation->offVram = VBOXVIDEOOFFSET_VOID;
                             pAllocation->u.SurfInfo = pAllocInfo->u.SurfInfo;
                             PVBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE pAlloc = VBOXWDDM_ALLOCATION_BODY(pAllocation, VBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE);
@@ -1365,4 +1366,5 @@
                     {
                         pAllocation->enmType = pAllocInfo->enmType;
+                        pAllocation->offVram = VBOXVIDEOOFFSET_VOID;
                         pAllocation->u.SurfInfo = pAllocInfo->u.SurfInfo;
 
Index: /trunk/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp	(revision 27428)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp	(revision 27429)
@@ -170,4 +170,32 @@
 }
 
+static void vboxVDMARectlUnite(VBOXVDMA_RECTL * pRectl1, const VBOXVDMA_RECTL * pRectl2)
+{
+    if (!pRectl1->width)
+        *pRectl1 = *pRectl2;
+    else
+    {
+        int16_t x21 = pRectl1->left + pRectl1->width;
+        int16_t x22 = pRectl2->left + pRectl2->width;
+        if (pRectl1->left > pRectl2->left)
+        {
+            pRectl1->left = pRectl2->left;
+            pRectl1->width = x21 < x22 ? x22 - pRectl1->left : x21 - pRectl1->left;
+        }
+        else if (x21 < x22)
+            pRectl1->width = x22 - pRectl1->left;
+
+        x21 = pRectl1->top + pRectl1->height;
+        x22 = pRectl2->top + pRectl2->height;
+        if (pRectl1->top > pRectl2->top)
+        {
+            pRectl1->top = pRectl2->top;
+            pRectl1->height = x21 < x22 ? x22 - pRectl1->top : x21 - pRectl1->top;
+        }
+        else if (x21 < x22)
+            pRectl1->height = x22 - pRectl1->top;
+    }
+}
+
 /*
  * @return on success the number of bytes the command contained, otherwise - VERR_xxx error code
@@ -190,4 +218,5 @@
 
     uint8_t * pvRam = pVdma->pVGAState->vram_ptrR3;
+    VBOXVDMA_RECTL updateRectl = {0};
 
     if (pBlt->cDstSubRects)
@@ -224,4 +253,6 @@
             if (!RT_SUCCESS(rc))
                 return rc;
+
+            vboxVDMARectlUnite(&updateRectl, pDstRectl);
         }
     }
@@ -235,9 +266,11 @@
         if (!RT_SUCCESS(rc))
             return rc;
+
+        vboxVDMARectlUnite(&updateRectl, &pBlt->dstRectl);
     }
 
     int iView = 0;
     /* @todo: fixme: check if update is needed and get iView */
-    vboxVDMANotifyPrimaryUpdate (pVdma->pVGAState, iView, &pBlt->dstRectl);
+    vboxVDMANotifyPrimaryUpdate (pVdma->pVGAState, iView, &updateRectl);
 
     return cbBlt;
