Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVidPn.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVidPn.cpp	(revision 51268)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVidPn.cpp	(revision 51269)
@@ -1406,5 +1406,5 @@
     const DXGK_VIDPNTARGETMODESET_INTERFACE *pNewVidPnTargetModeSetInterface;
 
-    Assert(VidPnSourceId == VidPnTargetId);
+    Assert(pDevExt->fCmdVbvaEnabled || VidPnSourceId == VidPnTargetId);
 
     D3DKMDT_HVIDPNSOURCEMODESET hCurVidPnSourceModeSet;
@@ -1446,5 +1446,5 @@
         {
             Assert(hNewVidPnTargetModeSet);
-            Assert(VidPnSourceId == VidPnTargetId);
+            Assert(pDevExt->fCmdVbvaEnabled || VidPnSourceId == VidPnTargetId);
 //            if (VidPnSourceId == VidPnTargetId && pCbContext->apPathInfos[VidPnTargetId].enmState == VBOXVIDPNPATHITEM_STATE_PRESENT)
             {
@@ -1537,5 +1537,5 @@
     const DXGK_VIDPNSOURCEMODESET_INTERFACE *pNewVidPnSourceModeSetInterface;
 
-    Assert(VidPnSourceId == VidPnTargetId);
+    Assert(pDevExt->fCmdVbvaEnabled || VidPnSourceId == VidPnTargetId);
 
     D3DKMDT_HVIDPNTARGETMODESET hCurVidPnTargetModeSet;
@@ -1577,5 +1577,5 @@
         {
             Assert(hNewVidPnSourceModeSet);
-            Assert(VidPnSourceId == VidPnTargetId);
+            Assert(pDevExt->fCmdVbvaEnabled || VidPnSourceId == VidPnTargetId);
 //            if (VidPnSourceId == VidPnTargetId && pCbContext->apPathInfos[VidPnSourceId].enmState == VBOXVIDPNPATHITEM_STATE_PRESENT)
             {
@@ -1741,7 +1741,7 @@
 }
 
-static BOOLEAN vboxVidPnIsPathSupported(const D3DKMDT_VIDPN_PRESENT_PATH *pNewVidPnPresentPathInfo)
-{
-    if (pNewVidPnPresentPathInfo->VidPnSourceId != pNewVidPnPresentPathInfo->VidPnTargetId)
+static BOOLEAN vboxVidPnIsPathSupported(PVBOXMP_DEVEXT pDevExt, const D3DKMDT_VIDPN_PRESENT_PATH *pNewVidPnPresentPathInfo)
+{
+    if (!pDevExt->fCmdVbvaEnabled && pNewVidPnPresentPathInfo->VidPnSourceId != pNewVidPnPresentPathInfo->VidPnTargetId)
     {
         LOG(("unsupported source(%d)->target(%d) pair", pNewVidPnPresentPathInfo->VidPnSourceId, pNewVidPnPresentPathInfo->VidPnTargetId));
@@ -1866,9 +1866,8 @@
 typedef struct VBOXVIDPNGETPATHSINFO
 {
+    PVBOXMP_DEVEXT pDevExt;
     NTSTATUS Status;
     BOOLEAN fBreakOnDisabled;
     BOOLEAN fDisabledFound;
-    UINT cItems;
-    PVBOXVIDPNPATHITEM paItems;
 } VBOXVIDPNGETPATHSINFO, *PVBOXVIDPNGETPATHSINFO;
 
@@ -1880,51 +1879,5 @@
     CONST D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId = pNewVidPnPresentPathInfo->VidPnSourceId;
     CONST D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId = pNewVidPnPresentPathInfo->VidPnTargetId;
-    BOOLEAN fDisabledFound = !vboxVidPnIsPathSupported(pNewVidPnPresentPathInfo);
-    do
-    {
-        if (fDisabledFound)
-        {
-            if (pCbContext->cItems > VidPnSourceId)
-            {
-                pCbContext->paItems[VidPnSourceId].enmState = VBOXVIDPNPATHITEM_STATE_DISABLED;
-            }
-            else
-            {
-                WARN(("cItems(%d) <= VidPnSourceId(%d)", pCbContext->cItems, VidPnSourceId));
-                Status = STATUS_BUFFER_OVERFLOW;
-                break;
-            }
-
-            if (pCbContext->cItems > VidPnTargetId)
-            {
-                pCbContext->paItems[VidPnTargetId].enmState = VBOXVIDPNPATHITEM_STATE_DISABLED;
-            }
-            else
-            {
-                WARN(("cItems(%d) <= VidPnTargetId(%d)", pCbContext->cItems, VidPnTargetId));
-                Status = STATUS_BUFFER_OVERFLOW;
-                break;
-            }
-
-            break;
-        }
-
-        /* VidPnSourceId == VidPnTargetId */
-        Assert(VidPnSourceId == VidPnTargetId);
-        if (pCbContext->cItems > VidPnSourceId)
-        {
-            if (pCbContext->paItems[VidPnSourceId].enmState != VBOXVIDPNPATHITEM_STATE_DISABLED)
-            {
-                Assert(pCbContext->paItems[VidPnSourceId].enmState == VBOXVIDPNPATHITEM_STATE_NOT_EXISTS);
-                pCbContext->paItems[VidPnSourceId].enmState = VBOXVIDPNPATHITEM_STATE_PRESENT;
-            }
-        }
-        else
-        {
-            WARN(("cItems(%d) <= VidPnSource/TargetId(%d)", pCbContext->cItems, VidPnSourceId));
-            Status = STATUS_BUFFER_OVERFLOW;
-            break;
-        }
-    } while (0);
+    BOOLEAN fDisabledFound = !vboxVidPnIsPathSupported(pCbContext->pDevExt, pNewVidPnPresentPathInfo);
 
     pCbContext->fDisabledFound |= fDisabledFound;
@@ -1938,19 +1891,12 @@
 /* we currently support only 0 -> 0, 1 -> 1, 2 -> 2 paths, AND 0 -> 0 must be present
  * this routine disables all paths unsupported */
-NTSTATUS vboxVidPnCheckTopology(D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface, BOOLEAN *pfSupported)
-{
-    VBOXVIDPNPATHITEM aItems[VBOX_VIDEO_MAX_SCREENS];
-    const uint32_t cItems = RT_ELEMENTS(aItems);
+NTSTATUS VBoxVidPnCheckTopology(PVBOXMP_DEVEXT pDevExt, D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface, BOOLEAN *pfSupported)
+{
     UINT i;
-    for (i = 0; i < cItems; ++i)
-    {
-        aItems[i].enmState = VBOXVIDPNPATHITEM_STATE_NOT_EXISTS;
-    }
     VBOXVIDPNGETPATHSINFO CbContext = {0};
+    CbContext.pDevExt = pDevExt;
     CbContext.Status = STATUS_SUCCESS;
     CbContext.fBreakOnDisabled = FALSE;
     CbContext.fDisabledFound = FALSE;
-    CbContext.cItems = cItems;
-    CbContext.paItems = aItems;
     NTSTATUS Status = vboxVidPnEnumPaths(hVidPnTopology, pVidPnTopologyInterface, vboxVidPnCheckTopologyEnum, &CbContext);
     if (!NT_SUCCESS(Status))
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVidPn.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVidPn.h	(revision 51268)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVidPn.h	(revision 51269)
@@ -166,5 +166,5 @@
 NTSTATUS vboxVidPnCofuncModalityForPath(PVBOXVIDPNCOFUNCMODALITY pCbContext, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, D3DDDI_VIDEO_PRESENT_TARGET_ID VidPnTargetId);
 
-NTSTATUS vboxVidPnCheckTopology(D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface, BOOLEAN *pfSupported);
+NTSTATUS VBoxVidPnCheckTopology(PVBOXMP_DEVEXT pDevExt, D3DKMDT_HVIDPNTOPOLOGY hVidPnTopology, const DXGK_VIDPNTOPOLOGY_INTERFACE* pVidPnTopologyInterface, BOOLEAN *pfSupported);
 
 NTSTATUS vboxVidPnPathAdd(D3DKMDT_HVIDPN hVidPn, const DXGK_VIDPN_INTERFACE* pVidPnInterface,
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp	(revision 51268)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp	(revision 51269)
@@ -5053,7 +5053,7 @@
     NTSTATUS Status = STATUS_SUCCESS;
 
-    PVBOXMP_DEVEXT pContext = (PVBOXMP_DEVEXT)hAdapter;
+    PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)hAdapter;
     const DXGK_VIDPN_INTERFACE* pVidPnInterface = NULL;
-    Status = pContext->u.primary.DxgkInterface.DxgkCbQueryVidPnInterface(pIsSupportedVidPnArg->hDesiredVidPn, DXGK_VIDPN_INTERFACE_VERSION_V1, &pVidPnInterface);
+    Status = pDevExt->u.primary.DxgkInterface.DxgkCbQueryVidPnInterface(pIsSupportedVidPnArg->hDesiredVidPn, DXGK_VIDPN_INTERFACE_VERSION_V1, &pVidPnInterface);
     if (!NT_SUCCESS(Status))
     {
@@ -5063,5 +5063,5 @@
 
 #ifdef VBOXWDDM_DEBUG_VIDPN
-    vboxVidPnDumpVidPn("\n>>>>IS SUPPORTED VidPN : >>>>", pContext, pIsSupportedVidPnArg->hDesiredVidPn, pVidPnInterface, "<<<<<<<<<<<<<<<<<<<<");
+    vboxVidPnDumpVidPn("\n>>>>IS SUPPORTED VidPN : >>>>", pDevExt, pIsSupportedVidPnArg->hDesiredVidPn, pVidPnInterface, "<<<<<<<<<<<<<<<<<<<<");
 #endif
 
@@ -5076,8 +5076,8 @@
 
     BOOLEAN fSupported = FALSE;
-    Status = vboxVidPnCheckTopology(hVidPnTopology, pVidPnTopologyInterface, &fSupported);
+    Status = VBoxVidPnCheckTopology(pDevExt, hVidPnTopology, pVidPnTopologyInterface, &fSupported);
     if (!NT_SUCCESS(Status))
     {
-        WARN(("vboxVidPnCheckTopology failed Status()0x%x\n", Status));
+        WARN(("VBoxVidPnCheckTopology failed Status()0x%x\n", Status));
         return Status;
     }
@@ -5265,13 +5265,12 @@
 
 #ifdef DEBUG_misha
-    BOOLEAN fSupported = FALSE;
-    Status = vboxVidPnCheckTopology(hVidPnTopology, pVidPnTopologyInterface, &fSupported);
-    if (!NT_SUCCESS(Status))
-    {
-        WARN(("vboxVidPnCheckTopology failed Status()0x%x\n", Status));
-        return Status;
-    }
-
-    Assert(fSupported);
+    {
+        BOOLEAN fSupported = FALSE;
+        Status = VBoxVidPnCheckTopology(pDevExt, hVidPnTopology, pVidPnTopologyInterface, &fSupported);
+        if (!NT_SUCCESS(Status))
+            WARN(("VBoxVidPnCheckTopology failed Status()0x%x\n", Status));
+
+        Assert(fSupported);
+    }
 #endif
     VBOXVIDPNCOFUNCMODALITY CbContext = {0};
Index: /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp
===================================================================
--- /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp	(revision 51268)
+++ /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp	(revision 51269)
@@ -5274,13 +5274,11 @@
 }
 
-static void crVBoxServerCrCmdBltPrimaryUpdate(const VBVAINFOSCREEN *pScreen, uint32_t cRects, const RTRECT *pRects)
-{
-    if (!cRects)
-        return;
-
-    uint32_t u32PrimaryID = pScreen->u32ViewIndex;
+static void crPMgrPrimaryUpdateScreen(HCR_FRAMEBUFFER hFb, uint32_t idScreen, uint32_t cRects, const RTRECT *pRects)
+{
+    const VBVAINFOSCREEN *pScreen = CrFbGetScreenInfo(hFb);
+
     bool fDirtyEmpty = true;
     RTRECT dirtyRect;
-    cr_server.CrCmdClientInfo.pfnCltScrUpdateBegin(cr_server.CrCmdClientInfo.hCltScr, u32PrimaryID);
+    cr_server.CrCmdClientInfo.pfnCltScrUpdateBegin(cr_server.CrCmdClientInfo.hCltScr, idScreen);
 
     VBVACMDHDR hdr;
@@ -5292,5 +5290,5 @@
         hdr.h = hdr.y + pRects[i].yBottom;
 
-        cr_server.CrCmdClientInfo.pfnCltScrUpdateProcess(cr_server.CrCmdClientInfo.hCltScr, u32PrimaryID, &hdr, sizeof (hdr));
+        cr_server.CrCmdClientInfo.pfnCltScrUpdateProcess(cr_server.CrCmdClientInfo.hCltScr, idScreen, &hdr, sizeof (hdr));
 
         if (fDirtyEmpty)
@@ -5330,10 +5328,29 @@
     if (dirtyRect.xRight - dirtyRect.xLeft)
     {
-        cr_server.CrCmdClientInfo.pfnCltScrUpdateEnd(cr_server.CrCmdClientInfo.hCltScr, u32PrimaryID, pScreen->i32OriginX + dirtyRect.xLeft, pScreen->i32OriginY + dirtyRect.yTop,
+        cr_server.CrCmdClientInfo.pfnCltScrUpdateEnd(cr_server.CrCmdClientInfo.hCltScr, idScreen, pScreen->i32OriginX + dirtyRect.xLeft, pScreen->i32OriginY + dirtyRect.yTop,
                                            dirtyRect.xRight - dirtyRect.xLeft, dirtyRect.yBottom - dirtyRect.yTop);
     }
     else
     {
-        cr_server.CrCmdClientInfo.pfnCltScrUpdateEnd(cr_server.CrCmdClientInfo.hCltScr, u32PrimaryID, 0, 0, 0, 0);
+        cr_server.CrCmdClientInfo.pfnCltScrUpdateEnd(cr_server.CrCmdClientInfo.hCltScr, idScreen, 0, 0, 0, 0);
+    }
+
+}
+
+static void crPMgrPrimaryUpdate(HCR_FRAMEBUFFER hFb, uint32_t cRects, const RTRECT *pRects)
+{
+    if (!cRects)
+        return;
+
+    const VBVAINFOSCREEN *pScreen = CrFbGetScreenInfo(hFb);
+
+    uint32_t idFb = pScreen->u32ViewIndex;
+    CR_FB_INFO *pFbInfo = &g_CrPresenter.aFbInfos[idFb];
+
+    for (int i = ASMBitFirstSet(pFbInfo->aTargetMap, cr_server.screenCount);
+            i >= 0;
+            i = ASMBitNextSet(pFbInfo->aTargetMap, cr_server.screenCount, i))
+    {
+        crPMgrPrimaryUpdateScreen(hFb, i, cRects, pRects);
     }
 }
@@ -5445,5 +5462,5 @@
     }
 
-    crVBoxServerCrCmdBltPrimaryUpdate(CrFbGetScreenInfo(hFb), cRects, pRects);
+    crPMgrPrimaryUpdate(hFb, cRects, pRects);
 
     return 0;
@@ -5596,5 +5613,5 @@
         }
 
-        crVBoxServerCrCmdBltPrimaryUpdate(pScreen, cRects, pRects);
+        crPMgrPrimaryUpdate(hDstFb, cRects, pRects);
 
         return 0;
