Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.h	(revision 30952)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.h	(revision 30953)
@@ -306,4 +306,5 @@
    FAST_MUTEX ContextMutex;
    volatile uint32_t cContexts3D;
+   volatile uint32_t cDMACmdsOutstanding;
 
    VBOXSHGSMILIST CtlList;
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoIf.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoIf.h	(revision 30952)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoIf.h	(revision 30953)
@@ -374,4 +374,39 @@
 }
 
+DECLINLINE(bool) vboxWddmRectIsEmpty(RECT * pRect)
+{
+    return pRect->left == pRect->right-1 && pRect->top == pRect->bottom-1;
+}
+
+DECLINLINE(bool) vboxWddmRectIsIntersect(RECT * pRect1, RECT * pRect2)
+{
+    return !((pRect1->left < pRect2->left && pRect1->right < pRect2->left)
+            || (pRect2->left < pRect1->left && pRect2->right < pRect1->left)
+            || (pRect1->top < pRect2->top && pRect1->bottom < pRect2->top)
+            || (pRect2->top < pRect1->top && pRect2->bottom < pRect1->top));
+}
+
+DECLINLINE(bool) vboxWddmRectIsInclude(RECT * pRect1, RECT * pRect2)
+{
+    return ((pRect1->left <= pRect2->left && pRect1->right >= pRect2->right)
+            && (pRect1->top <= pRect2->top && pRect1->bottom >= pRect2->bottom));
+}
+
+DECLINLINE(void) vboxWddmRectUnited(RECT * pDst, const RECT * pRect1, const RECT * pRect2)
+{
+    pDst->left = RT_MIN(pRect1->left, pRect2->left);
+    pDst->top = RT_MIN(pRect1->top, pRect2->top);
+    pDst->right = RT_MAX(pRect1->right, pRect2->right);
+    pDst->bottom = RT_MAX(pRect1->bottom, pRect2->bottom);
+}
+
+DECLINLINE(void) vboxWddmRectTranslate(RECT * pRect, int x, int y)
+{
+    pRect->left   += x;
+    pRect->top    += y;
+    pRect->right  += x;
+    pRect->bottom += y;
+}
+
 DECLINLINE(void) vboxWddmDirtyRegionAddRect(PVBOXWDDM_DIRTYREGION pInfo, const RECT *pRect)
 {
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVbva.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVbva.cpp	(revision 30952)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVbva.cpp	(revision 30953)
@@ -103,4 +103,7 @@
 {
     memset(pVbva, 0, sizeof(VBOXVBVAINFO));
+
+    KeInitializeSpinLock(&pVbva->Lock);
+
     int rc = VBoxMapAdapterMemory (pDevExt,
                                        (void**)&pVbva->pVBVA,
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVbva.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVbva.h	(revision 30952)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVbva.h	(revision 30953)
@@ -21,4 +21,5 @@
     VBVARECORD *pRecord;
     D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId;
+    KSPIN_LOCK Lock;
 } VBOXVBVAINFO;
 
@@ -33,9 +34,27 @@
 
 #define VBOXVBVA_OP(_op, _pdext, _pvbva, _arg) \
-        if (vboxVbvaBufferBeginUpdate(_pdext, _pvbva)) \
-        { \
-            vboxVbva##_op(_pdext, _pvbva, _arg); \
-            vboxVbvaBufferEndUpdate(_pdext, _pvbva); \
-        }
+        do { \
+            if (vboxVbvaBufferBeginUpdate(_pdext, _pvbva)) \
+            { \
+                vboxVbva##_op(_pdext, _pvbva, _arg); \
+                vboxVbvaBufferEndUpdate(_pdext, _pvbva); \
+            } \
+        } while (0)
+
+#define VBOXVBVA_OP_WITHLOCK_ATDPC(_op, _pdext, _pvbva, _arg) \
+        do { \
+            KeAcquireSpinLockAtDpcLevel(&(_pvbva)->Lock);  \
+            VBOXVBVA_OP(_op, _pdext, _pvbva, _arg);        \
+            KeReleaseSpinLockFromDpcLevel(&(_pvbva)->Lock);\
+        } while (0)
+
+#define VBOXVBVA_OP_WITHLOCK(_op, _pdext, _pvbva, _arg) \
+        do { \
+            KIRQL OldIrql; \
+            KeAcquireSpinLock(&(_pvbva)->Lock, &OldIrql);  \
+            VBOXVBVA_OP(_op, _pdext, _pvbva, _arg);        \
+            KeReleaseSpinLock(&(_pvbva)->Lock, OldIrql);   \
+        } while (0)
+
 
 #endif /* #ifndef ___VBoxVideoVbva_h___ */
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.cpp	(revision 30952)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.cpp	(revision 30953)
@@ -19,4 +19,5 @@
 #include "../VBoxVideo.h"
 
+#include <iprt/asm.h>
 
 NTSTATUS vboxVdmaPipeConstruct(PVBOXVDMAPIPE pPipe)
@@ -508,4 +509,5 @@
         if (pAlloc->offVram != VBOXVIDEOOFFSET_VOID)
         {
+            RECT UnionRect = {0};
             uint8_t *pvMem = pDevExt->pvVisibleVram + pAlloc->offVram;
             UINT bpp = pAlloc->SurfDesc.bpp;
@@ -534,4 +536,5 @@
                             }
                         }
+                        vboxWddmRectUnited(&UnionRect, &UnionRect, pRect);
                     }
                     Status = STATUS_SUCCESS;
@@ -544,6 +547,29 @@
                     break;
             }
-        }
-    }
+
+            if (Status == STATUS_SUCCESS)
+            {
+                if (pCF->VidPnSourceId != D3DDDI_ID_UNINITIALIZED
+                        && pAlloc->bAssigned
+#ifdef VBOXWDDM_RENDER_FROM_SHADOW
+                        && pAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE
+#else
+                        && pAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE
+#endif
+                        )
+                {
+                    if (!vboxWddmRectIsEmpty(&UnionRect))
+                    {
+                        PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pCF->VidPnSourceId];
+                        VBOXVBVA_OP_WITHLOCK(ReportDirtyRect, pDevExt, &pSource->Vbva, &UnionRect);
+                    }
+                }
+            }
+        }
+    }
+
+
+    uint32_t cNew = ASMAtomicDecU32(&pDevExt->cDMACmdsOutstanding);
+    Assert(cNew < UINT32_MAX/2);
 
     NTSTATUS cmplStatus = vboxWddmDmaCmdNotifyCompletion(pDevExt, pContext, pCF->SubmissionFenceId);
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.h	(revision 30952)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.h	(revision 30953)
@@ -88,4 +88,5 @@
     struct VBOXWDDM_ALLOCATION *pAllocation;
     UINT SubmissionFenceId;
+    D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId;
     UINT Color;
     VBOXWDDM_RECTS_INFO Rects;
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp	(revision 30952)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp	(revision 30953)
@@ -223,39 +223,4 @@
 
     return true;
-}
-
-bool vboxWddmRectIsEmpty(RECTL * pRect)
-{
-    return pRect->left == pRect->right-1 && pRect->top == pRect->bottom-1;
-}
-
-bool vboxWddmRectIntersect(RECTL * pRect1, RECTL * pRect2)
-{
-    return !((pRect1->left < pRect2->left && pRect1->right < pRect2->left)
-            || (pRect2->left < pRect1->left && pRect2->right < pRect1->left)
-            || (pRect1->top < pRect2->top && pRect1->bottom < pRect2->top)
-            || (pRect2->top < pRect1->top && pRect2->bottom < pRect1->top));
-}
-
-bool vboxWddmRectInclude(RECTL * pRect1, RECTL * pRect2)
-{
-    return ((pRect1->left <= pRect2->left && pRect1->right >= pRect2->right)
-            && (pRect1->top <= pRect2->top && pRect1->bottom >= pRect2->bottom));
-}
-
-void vboxWddmRectUnited(RECT * pDst, const RECT * pRect1, const RECT * pRect2)
-{
-    pDst->left = RT_MIN(pRect1->left, pRect2->left);
-    pDst->top = RT_MIN(pRect1->top, pRect2->top);
-    pDst->right = RT_MAX(pRect1->right, pRect2->right);
-    pDst->bottom = RT_MAX(pRect1->bottom, pRect2->bottom);
-}
-
-void vboxWddmRectTranslate(RECTL * pRect, int x, int y)
-{
-    pRect->left   += x;
-    pRect->top    += y;
-    pRect->right  += x;
-    pRect->bottom += y;
 }
 #endif
@@ -2115,5 +2080,12 @@
             vboxWddmCheckUpdateShadowAddress(pDevExt, pSource, pPrivateData->SrcAllocInfo.segmentIdAlloc, pPrivateData->SrcAllocInfo.offAlloc);
             PVBOXWDDM_DMA_PRESENT_RENDER_FROM_SHADOW pRFS = (PVBOXWDDM_DMA_PRESENT_RENDER_FROM_SHADOW)pPrivateData;
-            VBOXVBVA_OP(ReportDirtyRect, pDevExt, &pSource->Vbva, &pRFS->rect);
+            uint32_t cDMACmdsOutstanding = ASMAtomicReadU32(&pDevExt->cDMACmdsOutstanding);
+            if (!cDMACmdsOutstanding)
+                VBOXVBVA_OP(ReportDirtyRect, pDevExt, &pSource->Vbva, &pRFS->rect);
+            else
+            {
+                Assert(KeGetCurrentIrql() == DISPATCH_LEVEL);
+                VBOXVBVA_OP_WITHLOCK_ATDPC(ReportDirtyRect, pDevExt, &pSource->Vbva, &pRFS->rect);
+            }
             /* get DPC data at IRQL */
 
@@ -2160,5 +2132,12 @@
                                     rect = pBlt->DstRects.ContextRect;
 
-                                VBOXVBVA_OP(ReportDirtyRect, pDevExt, &pSource->Vbva, &rect);
+                                uint32_t cDMACmdsOutstanding = ASMAtomicReadU32(&pDevExt->cDMACmdsOutstanding);
+                                if (!cDMACmdsOutstanding)
+                                    VBOXVBVA_OP(ReportDirtyRect, pDevExt, &pSource->Vbva, &rect);
+                                else
+                                {
+                                    Assert(KeGetCurrentIrql() == DISPATCH_LEVEL);
+                                    VBOXVBVA_OP_WITHLOCK_ATDPC(ReportDirtyRect, pDevExt, &pSource->Vbva, &rect);
+                                }
                                 vboxWddmSubmitBltCmd(pDevExt, pContext, pBlt);
                                 break;
@@ -2241,7 +2220,10 @@
                 PVBOXWDDM_ALLOCATION pDstAlloc = pPrivateData->DstAllocInfo.pAlloc;
                 Assert(pDstAlloc);
+                D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId;
                 if (pDstAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE
                         && pDstAlloc->bAssigned)
                 {
+                    VidPnSourceId = pPrivateData->DstAllocInfo.srcId;
+#ifdef VBOXWDDM_RENDER_FROM_SHADOW
                     VBOXWDDM_SOURCE *pSource = &pDevExt->aSources[pPrivateData->DstAllocInfo.srcId];
                     Assert(pSource->pPrimaryAllocation == pDstAlloc);
@@ -2250,14 +2232,25 @@
                     if (pSource->pShadowAllocation)
                         pDstAlloc = pSource->pShadowAllocation;
+#endif
+                }
+                else
+                {
+                    VidPnSourceId = D3DDDI_ID_UNINITIALIZED;
                 }
                 pCFCmd->pContext = pContext;
                 pCFCmd->pAllocation = pDstAlloc;
                 pCFCmd->SubmissionFenceId = pSubmitCommand->SubmissionFenceId;
+                pCFCmd->VidPnSourceId = VidPnSourceId;
                 pCFCmd->Color = pCF->Color;
                 memcpy(&pCFCmd->Rects, &pCF->Rects, RT_OFFSETOF(VBOXWDDM_RECTS_INFO, aRects[pCF->Rects.cRects]));
+                ASMAtomicIncU32(&pDevExt->cDMACmdsOutstanding);
                 submStatus = vboxVdmaGgCmdSubmit(&pDevExt->u.primary.Vdma.DmaGg, &pCFCmd->Hdr);
                 Assert(submStatus == STATUS_SUCCESS);
                 if (submStatus != STATUS_SUCCESS)
+                {
+                    uint32_t cNew = ASMAtomicDecU32(&pDevExt->cDMACmdsOutstanding);
+                    Assert(cNew < UINT32_MAX/2);
                     vboxVdmaGgCmdDestroy(&pCFCmd->Hdr);
+                }
             }
 
@@ -2291,5 +2284,5 @@
             pDr->Location.phBuf = pSubmitCommand->DmaBufferPhysicalAddress.QuadPart + pSubmitCommand->DmaBufferSubmissionStartOffset;
 
-            vboxVdmaCBufDrSubmit (pDevExt, &pDevExt->u.primary.Vdma, pDr);
+            vboxVdmaCBufDrSubmit(pDevExt, &pDevExt->u.primary.Vdma, pDr);
             break;
         }
@@ -4167,5 +4160,5 @@
         {
             UINT cbCmd = pPresent->DmaBufferPrivateDataSize;
-            pPrivateData->enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_BLT;
+            pPrivateData->enmCmd = VBOXVDMACMD_TYPE_DMA_PRESENT_CLRFILL;
 
             vboxWddmPopulateDmaAllocInfo(&pPrivateData->DstAllocInfo, pDstAlloc, pDst);
