Index: /trunk/include/VBox/VBoxVideo.h
===================================================================
--- /trunk/include/VBox/VBoxVideo.h	(revision 55970)
+++ /trunk/include/VBox/VBoxVideo.h	(revision 55971)
@@ -1850,5 +1850,8 @@
     VBOXCMDVBVA_HDR Hdr;
     VBOXCMDVBVA_ALLOCINFO src;
+    VBOXCMDVBVA_RECT aRects[1];
 } VBOXCMDVBVA_FLIP;
+
+#define VBOXCMDVBVA_SIZEOF_FLIPSTRUCT_MIN (RT_OFFSETOF(VBOXCMDVBVA_FLIP, aRects))
 
 typedef struct VBOXCMDVBVA_CLRFILL_HDR
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp	(revision 55970)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp	(revision 55971)
@@ -6157,4 +6157,14 @@
     }
 
+#ifdef VBOX_WDDM_DUMP_REGIONS_ON_PRESENT
+    LogRel(("%s: [%ld, %ld, %ld, %ld] -> [%ld, %ld, %ld, %ld] (SubRectCnt=%u)\n",
+        pPresent->Flags.Blt ? "Blt" : (pPresent->Flags.Flip ? "Flip" : (pPresent->Flags.ColorFill ? "ColorFill" : "Unknown OP")),
+        pPresent->SrcRect.left, pPresent->SrcRect.top, pPresent->SrcRect.right, pPresent->SrcRect.bottom,
+        pPresent->DstRect.left, pPresent->DstRect.top, pPresent->DstRect.right, pPresent->DstRect.bottom,
+        pPresent->SubRectCnt));
+    for (unsigned int i = 0; i < pPresent->SubRectCnt; i++)
+        LogRel(("\tsub#%u = [%ld, %ld, %ld, %ld]\n", i, pPresent->pDstSubRects[i].left, pPresent->pDstSubRects[i].top, pPresent->pDstSubRects[i].right, pPresent->pDstSubRects[i].bottom));
+#endif
+
     if (pPresent->Flags.Blt)
     {
@@ -6295,5 +6305,6 @@
 
         cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE;
-        cbPrivateData = sizeof (*pFlip);
+        paRects = pFlip->aRects;
+        cbPrivateData = VBOXCMDVBVA_SIZEOF_FLIPSTRUCT_MIN;
     }
     else if (pPresent->Flags.ColorFill)
Index: /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/presenter/server_presenter.cpp
===================================================================
--- /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/presenter/server_presenter.cpp	(revision 55970)
+++ /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/presenter/server_presenter.cpp	(revision 55971)
@@ -3955,7 +3955,10 @@
 }
 
-int8_t crVBoxServerCrCmdFlipProcess(const VBOXCMDVBVA_FLIP *pFlip)
+int8_t crVBoxServerCrCmdFlipProcess(const VBOXCMDVBVA_FLIP *pFlip, uint32_t cbCmd)
 {
     uint32_t hostId;
+    const VBOXCMDVBVA_RECT *pPRects = pFlip->aRects;
+    uint32_t cRects;
+
     if (pFlip->Hdr.u8Flags & VBOXCMDVBVA_OPF_OPERAND1_ISID)
     {
@@ -3981,7 +3984,16 @@
     }
 
-    const RTRECT *pRect = CrVrScrCompositorRectGet(&hFb->Compositor);
-    crServerDispatchVBoxTexPresent(hostId, idFb, 0, 0, 1, (const GLint*)pRect);
-    return 0;
+    cRects = (cbCmd - VBOXCMDVBVA_SIZEOF_FLIPSTRUCT_MIN) / sizeof (VBOXCMDVBVA_RECT);
+    if (cRects > 0)
+    {
+        RTRECT *pRects = crVBoxServerCrCmdBltRecsUnpack(pPRects, cRects);
+        if (pRects)
+        {
+            crServerDispatchVBoxTexPresent(hostId, idFb, 0, 0, cRects, (const GLint*)pRects);
+            return 0;
+        }
+    }
+
+    return -1;
 }
 
Index: /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h
===================================================================
--- /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h	(revision 55970)
+++ /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h	(revision 55971)
@@ -472,5 +472,5 @@
 int8_t crVBoxServerCrCmdBltProcess(const VBOXCMDVBVA_BLT_HDR *pCmd, uint32_t cbCmd);
 int8_t crVBoxServerCrCmdClrFillProcess(const VBOXCMDVBVA_CLRFILL_HDR *pCmd, uint32_t cbCmd);
-int8_t crVBoxServerCrCmdFlipProcess(const VBOXCMDVBVA_FLIP *pFlip);
+int8_t crVBoxServerCrCmdFlipProcess(const VBOXCMDVBVA_FLIP *pFlip, uint32_t cbCmd);
 
 
Index: /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c
===================================================================
--- /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c	(revision 55970)
+++ /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c	(revision 55971)
@@ -3553,12 +3553,12 @@
             const VBOXCMDVBVA_FLIP *pFlip;
 
-            if (cbCmd < sizeof (VBOXCMDVBVA_FLIP))
+            if (cbCmd < VBOXCMDVBVA_SIZEOF_FLIPSTRUCT_MIN)
             {
-                WARN(("invalid buffer size"));
+                WARN(("invalid buffer size (cbCmd(%u) < sizeof(VBOXCMDVBVA_FLIP)(%u))", cbCmd, sizeof(VBOXCMDVBVA_FLIP)));
                 return -1;
             }
 
             pFlip = (const VBOXCMDVBVA_FLIP*)pCmd;
-            return crVBoxServerCrCmdFlipProcess(pFlip);
+            return crVBoxServerCrCmdFlipProcess(pFlip, cbCmd);
         }
         case VBOXCMDVBVA_OPTYPE_BLT:
