Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVbva.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVbva.cpp	(revision 51265)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVbva.cpp	(revision 51266)
@@ -868,5 +868,8 @@
     PVBOXMP_DEVEXT pDevExt;
     VBOXCMDVBVA *pVbva;
-    uint32_t u32FenceID;
+    /* last completted fence id */
+    uint32_t u32FenceCompleted;
+    /* last submitted fence id */
+    uint32_t u32FenceSubmitted;
 } VBOXCMDVBVA_CHECK_COMPLETED_CB;
 
@@ -876,10 +879,19 @@
     BOOLEAN bRc = DxgkDdiInterruptRoutineNew(pCompleted->pDevExt, 0);
     if (pCompleted->pVbva)
-        pCompleted->u32FenceID = pCompleted->pVbva->u32FenceCompleted;
+    {
+        pCompleted->u32FenceCompleted = pCompleted->pVbva->u32FenceCompleted;
+        pCompleted->u32FenceSubmitted = pCompleted->pVbva->u32FenceSubmitted;
+    }
+    else
+    {
+        WARN(("no vbva"));
+        pCompleted->u32FenceCompleted = 0;
+        pCompleted->u32FenceSubmitted = 0;
+    }
     return bRc;
 }
 
 
-static uint32_t vboxCmdVbvaCheckCompleted(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, bool fPingHost, HGSMIGUESTCOMMANDCONTEXT *pCtx, bool fBufferOverflow)
+static uint32_t vboxCmdVbvaCheckCompleted(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, bool fPingHost, HGSMIGUESTCOMMANDCONTEXT *pCtx, bool fBufferOverflow, uint32_t *pu32FenceSubmitted)
 {
     if (fPingHost)
@@ -889,5 +901,6 @@
     context.pDevExt = pDevExt;
     context.pVbva = pVbva;
-    context.u32FenceID = 0;
+    context.u32FenceCompleted = 0;
+    context.u32FenceSubmitted = 0;
     BOOLEAN bRet;
     NTSTATUS Status = pDevExt->u.primary.DxgkInterface.DxgkCbSynchronizeExecution(
@@ -899,5 +912,8 @@
     Assert(Status == STATUS_SUCCESS);
 
-    return context.u32FenceID;
+    if (pu32FenceSubmitted)
+        *pu32FenceSubmitted = context.u32FenceSubmitted;
+
+    return context.u32FenceCompleted;
 }
 
@@ -906,5 +922,5 @@
     PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)pvFlush;
 
-    vboxCmdVbvaCheckCompleted(pDevExt, NULL,  true /*fPingHost*/, pHGSMICtx, true /*fBufferOverflow*/);
+    vboxCmdVbvaCheckCompleted(pDevExt, NULL,  true /*fPingHost*/, pHGSMICtx, true /*fBufferOverflow*/, NULL);
 }
 
@@ -1139,7 +1155,7 @@
 }
 
-uint32_t VBoxCmdVbvaCheckCompleted(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, bool fPingHost)
-{
-    return vboxCmdVbvaCheckCompleted(pDevExt, pVbva, fPingHost, &VBoxCommonFromDeviceExt(pDevExt)->guestCtx, false /* fBufferOverflow */);
+uint32_t VBoxCmdVbvaCheckCompleted(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, bool fPingHost, uint32_t *pu32FenceSubmitted)
+{
+    return vboxCmdVbvaCheckCompleted(pDevExt, pVbva, fPingHost, &VBoxCommonFromDeviceExt(pDevExt)->guestCtx, false /* fBufferOverflow */, pu32FenceSubmitted);
 }
 
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVbva.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVbva.h	(revision 51265)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVbva.h	(revision 51266)
@@ -216,5 +216,5 @@
 VBOXCMDVBVA_HDR* VBoxCmdVbvaSubmitLock(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, uint32_t cbCmd);
 bool VBoxCmdVbvaPreempt(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, uint32_t u32FenceID);
-uint32_t VBoxCmdVbvaCheckCompleted(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, bool fPingHost);
+uint32_t VBoxCmdVbvaCheckCompleted(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva, bool fPingHost, uint32_t *pu32FenceSubmitted);
 bool VBoxCmdVbvaCheckCompletedIrq(PVBOXMP_DEVEXT pDevExt, VBOXCMDVBVA *pVbva);
 
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp	(revision 51265)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp	(revision 51266)
@@ -4968,5 +4968,35 @@
 
     PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)hAdapter;
-    pCurrentFence->CurrentFence = VBoxCmdVbvaCheckCompleted(pDevExt, &pDevExt->CmdVbva, false);
+
+    WARN(("=>DxgkDdiQueryCurrentFenceNew"));
+
+    uint32_t u32FenceSubmitted = 0;
+    uint32_t u32FenceCompleted = 0;
+
+    LARGE_INTEGER DelayInterval;
+    DelayInterval.QuadPart = -10LL * 1000LL * 1000LL;
+
+    for (;;)
+    {
+        u32FenceCompleted = VBoxCmdVbvaCheckCompleted(pDevExt, &pDevExt->CmdVbva, false, &u32FenceSubmitted);
+        if (!u32FenceCompleted)
+        {
+            WARN(("VBoxCmdVbvaCheckCompleted failed"));
+            return STATUS_UNSUCCESSFUL;
+        }
+
+        if (u32FenceSubmitted == u32FenceCompleted)
+            break;
+
+        WARN(("uncompleted fences, u32FenceSubmitted(%d), u32FenceCompleted(%d)", u32FenceSubmitted, u32FenceCompleted));
+
+        NTSTATUS Status = KeDelayExecutionThread(KernelMode, FALSE, &DelayInterval);
+        if (Status != STATUS_SUCCESS)
+            WARN(("KeDelayExecutionThread failed %#x", Status));
+    }
+
+    pCurrentFence->CurrentFence = u32FenceCompleted;
+
+    WARN(("<=DxgkDdiQueryCurrentFenceNew"));
 
     LOGF(("LEAVE, hAdapter(0x%x)", hAdapter));
