Index: /trunk/include/VBox/VBoxVideo.h
===================================================================
--- /trunk/include/VBox/VBoxVideo.h	(revision 32888)
+++ /trunk/include/VBox/VBoxVideo.h	(revision 32889)
@@ -1233,6 +1233,6 @@
 typedef struct VBOXVDMACBUF_DR
 {
-    uint32_t fFlags : 16;
-    uint32_t cbBuf  : 16;
+    uint16_t fFlags;
+    uint16_t cbBuf;
     /* RT_SUCCESS()     - on success
      * VERR_INTERRUPTED - on preemption
@@ -1244,5 +1244,5 @@
         VBOXVIDEOOFFSET offVramBuf;
     } Location;
-    uint64_t aGuestData[6];
+    uint64_t aGuestData[7];
 } VBOXVDMACBUF_DR, *PVBOXVDMACBUF_DR;
 
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Display/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Display/Makefile.kmk	(revision 32888)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Display/Makefile.kmk	(revision 32889)
@@ -88,4 +88,7 @@
  VBoxDispD3D_DEFS   += VBOX_WDDMDISP_WITH_PROFILE
 endif
+ifdef VBOXWDDM_TEST_UHGSMI
+ VBoxDispD3D_DEFS   += VBOXWDDM_TEST_UHGSMI
+endif
 VBoxDispD3D_SOURCES  = \
 	wddm/VBoxDispD3D.cpp \
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp	(revision 32888)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp	(revision 32889)
@@ -5364,4 +5364,9 @@
     return hr;
 }
+
+#ifdef VBOXWDDM_TEST_UHGSMI
+int vboxUhgsmiTst(PVBOXUHGSMI pUhgsmi, uint32_t cbBuf, uint32_t cNumCals, uint64_t * pTimeMs);
+#endif
+
 static HRESULT APIENTRY vboxWddmDDevPresent(HANDLE hDevice, CONST D3DDDIARG_PRESENT* pData)
 {
@@ -5374,4 +5379,16 @@
     if (VBOXDISPMODE_IS_3D(pDevice->pAdapter))
     {
+#ifdef VBOXWDDM_TEST_UHGSMI
+        {
+            Assert(0);
+            static uint32_t cCals = 10000;
+            static uint32_t cbData = 8 * 1024 * 1024;
+            uint64_t TimeMs;
+            int rc = vboxUhgsmiTst(&pDevice->Uhgsmi.Base, cbData, cCals, &TimeMs);
+            uint32_t cCPS = (((uint64_t)cCals) * 1000ULL)/TimeMs;
+            Assert(0);
+            vboxVDbgDoMpPrintF(pDevice, "Time : %I64u ms, calls: %d, cps: %d\n", TimeMs, cCals, cCPS);
+        }
+#endif
 #if 1
         PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)pData->hSrcResource;
@@ -7122,54 +7139,59 @@
                     && !pCreateData->PatchLocationListSize)
             {
-                hr = vboxDispCmCtxCreate(pDevice, &pDevice->DefaultContext);
+                hr = vboxUhgsmiD3DInit(&pDevice->Uhgsmi, pDevice);
                 Assert(hr == S_OK);
                 if (hr == S_OK)
                 {
-#ifdef VBOXDISP_EARLYCREATEDEVICE
-                    PVBOXWDDMDISP_RESOURCE pRc = vboxResourceAlloc(2);
-                    Assert(pRc);
-                    if (pRc)
+                    hr = vboxDispCmCtxCreate(pDevice, &pDevice->DefaultContext);
+                    Assert(hr == S_OK);
+                    if (hr == S_OK)
                     {
-                        D3DPRESENT_PARAMETERS params;
-                        memset(&params, 0, sizeof (params));
-//                        params.BackBufferWidth = 640;
-//                        params.BackBufferHeight = 480;
-                        params.BackBufferWidth = 0x400;
-                        params.BackBufferHeight = 0x300;
-                        params.BackBufferFormat = D3DFMT_A8R8G8B8;
-//                        params.BackBufferCount = 0;
-                        params.BackBufferCount = 1;
-                        params.MultiSampleType = D3DMULTISAMPLE_NONE;
-                        params.SwapEffect = D3DSWAPEFFECT_DISCARD;
-    //                    params.hDeviceWindow = hWnd;
-                                    /* @todo: it seems there should be a way to detect this correctly since
-                                     * our vboxWddmDDevSetDisplayMode will be called in case we are using full-screen */
-                        params.Windowed = TRUE;
-                        //            params.EnableAutoDepthStencil = FALSE;
-                        //            params.AutoDepthStencilFormat = D3DFMT_UNKNOWN;
-                        //            params.Flags;
-                        //            params.FullScreen_RefreshRateInHz;
-                        //            params.FullScreen_PresentationInterval;
-
-                        hr = vboxWddmD3DDeviceCreate(pDevice, 0, pRc, &params, TRUE /*BOOL bLockable*/);
-                        Assert(hr == S_OK);
-                        if (hr == S_OK)
-                            break;
-                        vboxResourceFree(pRc);
+    #ifdef VBOXDISP_EARLYCREATEDEVICE
+                        PVBOXWDDMDISP_RESOURCE pRc = vboxResourceAlloc(2);
+                        Assert(pRc);
+                        if (pRc)
+                        {
+                            D3DPRESENT_PARAMETERS params;
+                            memset(&params, 0, sizeof (params));
+    //                        params.BackBufferWidth = 640;
+    //                        params.BackBufferHeight = 480;
+                            params.BackBufferWidth = 0x400;
+                            params.BackBufferHeight = 0x300;
+                            params.BackBufferFormat = D3DFMT_A8R8G8B8;
+    //                        params.BackBufferCount = 0;
+                            params.BackBufferCount = 1;
+                            params.MultiSampleType = D3DMULTISAMPLE_NONE;
+                            params.SwapEffect = D3DSWAPEFFECT_DISCARD;
+        //                    params.hDeviceWindow = hWnd;
+                                        /* @todo: it seems there should be a way to detect this correctly since
+                                         * our vboxWddmDDevSetDisplayMode will be called in case we are using full-screen */
+                            params.Windowed = TRUE;
+                            //            params.EnableAutoDepthStencil = FALSE;
+                            //            params.AutoDepthStencilFormat = D3DFMT_UNKNOWN;
+                            //            params.Flags;
+                            //            params.FullScreen_RefreshRateInHz;
+                            //            params.FullScreen_PresentationInterval;
+
+                            hr = vboxWddmD3DDeviceCreate(pDevice, 0, pRc, &params, TRUE /*BOOL bLockable*/);
+                            Assert(hr == S_OK);
+                            if (hr == S_OK)
+                                break;
+                            vboxResourceFree(pRc);
+                        }
+                        else
+                        {
+                            hr = E_OUTOFMEMORY;
+                        }
+    #else
+    //# define VBOXDISP_TEST_SWAPCHAIN
+    # ifdef VBOXDISP_TEST_SWAPCHAIN
+                        VBOXDISP_D3DEV(pDevice);
+    # endif
+                        break;
+    #endif
+
+                        HRESULT tmpHr = vboxDispCmCtxDestroy(pDevice, &pDevice->DefaultContext);
+                        Assert(tmpHr == S_OK);
                     }
-                    else
-                    {
-                        hr = E_OUTOFMEMORY;
-                    }
-#else
-//# define VBOXDISP_TEST_SWAPCHAIN
-# ifdef VBOXDISP_TEST_SWAPCHAIN
-                    VBOXDISP_D3DEV(pDevice);
-# endif
-                    break;
-#endif
-
-                    HRESULT tmpHr = vboxDispCmCtxDestroy(pDevice, &pDevice->DefaultContext);
-                    Assert(tmpHr == S_OK);
                 }
             }
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.h	(revision 32888)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.h	(revision 32889)
@@ -18,4 +18,5 @@
 #include "VBoxDispD3DIf.h"
 #include "../../Miniport/wddm/VBoxVideoIf.h"
+#include "VBoxUhgsmiDisp.h"
 
 #include <iprt/cdefs.h>
@@ -177,4 +178,5 @@
     D3DVIEWPORT9 ViewPort;
     VBOXWDDMDISP_CONTEXT DefaultContext;
+    VBOXUHGSMI_PRIVATE_D3D Uhgsmi;
 
     CRITICAL_SECTION DirtyAllocListLock;
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3DCmn.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3DCmn.h	(revision 32888)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3DCmn.h	(revision 32889)
@@ -33,4 +33,5 @@
 #include "../../Miniport/wddm/VBoxVideoIf.h"
 #include "VBoxDispCm.h"
+#include "VBoxUhgsmiDisp.h"
 #include "VBoxDispD3D.h"
 
@@ -41,5 +42,5 @@
 #endif
 
-#if defined(VBOXWDDMDISP_DEBUG) || defined(VBOX_WDDMDISP_WITH_PROFILE)
+#if defined(VBOXWDDMDISP_DEBUG) || defined(VBOX_WDDMDISP_WITH_PROFILE) || defined(VBOXWDDM_TEST_UHGSMI)
 # define VBOXWDDMDISP_DEBUG_PRINT
 #endif
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispMpTst.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispMpTst.cpp	(revision 32888)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispMpTst.cpp	(revision 32889)
@@ -16,6 +16,9 @@
 
 #include <iprt/thread.h>
+#include <iprt/err.h>
 
 #include "VBoxDispD3DCmn.h"
+
+#include "VBoxDispProfile.h"
 
 static RTTHREAD g_VBoxDispMpTstThread;
@@ -143,2 +146,52 @@
 }
 
+int vboxUhgsmiTst(PVBOXUHGSMI pUhgsmi, uint32_t cbBuf, uint32_t cNumCals, uint64_t * pTimeMs)
+{
+    PVBOXUHGSMI_BUFFER pBuf;
+    int rc = pUhgsmi->pfnBufferCreate(pUhgsmi, cbBuf, VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT, NULL, &pBuf);
+    AssertRC(rc);
+    if (RT_SUCCESS(rc))
+    {
+        uint64_t TimeMs = VBOXDISPPROFILE_GET_TIME_MILLI();
+        do
+        {
+            VBOXUHGSMI_BUFFER_LOCK_FLAGS fFlags;
+            fFlags.Value = 0;
+            fFlags.bLockEntire = 1;
+            fFlags.bDiscard = 1;
+
+            void *pvLock;
+            rc = pBuf->pfnLock(pBuf, 0, cbBuf, fFlags, &pvLock);
+            AssertRC(rc);
+            if (!RT_SUCCESS(rc))
+                break;
+
+            rc = pBuf->pfnUnlock(pBuf);
+            AssertRC(rc);
+            if (!RT_SUCCESS(rc))
+                break;
+
+            VBOXUHGSMI_BUFFER_SUBMIT SubmitData;
+            SubmitData.pBuf = pBuf;
+            SubmitData.fFlags.Value = 0;
+            SubmitData.fFlags.bDoNotRetire = 1;
+            SubmitData.fFlags.bEntireBuffer = 1;
+
+            rc = pUhgsmi->pfnBufferSubmitAsynch(pUhgsmi, &SubmitData, 1);
+            AssertRC(rc);
+            if (!RT_SUCCESS(rc))
+                break;
+
+            DWORD dw = WaitForSingleObject(pBuf->hSynch, INFINITE);
+            Assert(dw == WAIT_OBJECT_0);
+            if (dw)
+                break;
+        } while (--cNumCals);
+
+        TimeMs = VBOXDISPPROFILE_GET_TIME_MILLI() - TimeMs;
+        *pTimeMs = TimeMs;
+
+        pBuf->pfnDestroy(pBuf);
+    }
+    return rc;
+}
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxUhgsmiDisp.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxUhgsmiDisp.cpp	(revision 32888)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxUhgsmiDisp.cpp	(revision 32889)
@@ -13,5 +13,5 @@
  * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
  */
-#include "VBoxUhgsmiDisp.h"
+#include "VBoxDispD3DCmn.h"
 
 #include <iprt/mem.h>
@@ -54,26 +54,11 @@
 {
     PVBOXUHGSMI_BUFFER_PRIVATE_D3D pBuffer = VBOXUHGSMID3D_GET_BUFFER(pBuf);
-    if (!cbLock)
-    {
-        Assert(0);
-        return VERR_INVALID_PARAMETER;
-    }
-    if (offLock + cbLock > pBuf->cbBuffer)
-    {
-        Assert(0);
-        return VERR_INVALID_PARAMETER;
-    }
-    uint32_t iFirstPage = offLock >> 0x1000;
-    uint32_t iAfterLastPage = (cbLock + 0xfff) >> 0x1000;
-    uint32_t cPages = iAfterLastPage - iFirstPage;
-    uint32_t cBufPages = pBuf->cbBuffer >> 0x1000;
-    Assert(cPages <= (cBufPages));
     D3DDDICB_LOCK DdiLock;
     DdiLock.hAllocation = pBuffer->hAllocation;
     DdiLock.PrivateDriverData = 0;
-    if (cPages == cBufPages)
-    {
-        DdiLock.NumPages = 0;
-        DdiLock.pPages = NULL;
+
+    if (fFlags.bLockEntire)
+    {
+        offLock = 0;
         DdiLock.Flags.Value = 0;
         DdiLock.Flags.LockEntire = 1;
@@ -81,11 +66,39 @@
     else
     {
-        DdiLock.NumPages = cPages;
-        DdiLock.pPages = pBuffer->aLockPageIndices;
-        DdiLock.Flags.Value = 0;
-        for (UINT i = 0, j = iFirstPage; i < cPages; ++i, ++j)
-        {
-            pBuffer->aLockPageIndices[i] = j;
-        }
+        if (!cbLock)
+        {
+            Assert(0);
+            return VERR_INVALID_PARAMETER;
+        }
+        if (offLock + cbLock > pBuf->cbBuffer)
+        {
+            Assert(0);
+            return VERR_INVALID_PARAMETER;
+        }
+
+        uint32_t iFirstPage = offLock >> 0x1000;
+        uint32_t iAfterLastPage = (cbLock + 0xfff) >> 0x1000;
+        uint32_t cPages = iAfterLastPage - iFirstPage;
+        uint32_t cBufPages = pBuf->cbBuffer >> 0x1000;
+        Assert(cPages <= (cBufPages));
+
+        if (cPages == cBufPages)
+        {
+            DdiLock.NumPages = 0;
+            DdiLock.pPages = NULL;
+            DdiLock.Flags.Value = 0;
+            DdiLock.Flags.LockEntire = 1;
+        }
+        else
+        {
+            DdiLock.NumPages = cPages;
+            DdiLock.pPages = pBuffer->aLockPageIndices;
+            DdiLock.Flags.Value = 0;
+            for (UINT i = 0, j = iFirstPage; i < cPages; ++i, ++j)
+            {
+                pBuffer->aLockPageIndices[i] = j;
+            }
+        }
+
     }
     DdiLock.pData = NULL;
@@ -93,5 +106,5 @@
     DdiLock.Flags.WriteOnly = fFlags.bWriteOnly;
     DdiLock.Flags.DonotWait = fFlags.bDonotWait;
-    DdiLock.Flags.Discard = fFlags.bDiscard;
+//    DdiLock.Flags.Discard = fFlags.bDiscard;
 
     HRESULT hr = pBuffer->pDevice->RtCallbacks.pfnLockCb(pBuffer->pDevice->hDevice, &DdiLock);
@@ -99,5 +112,5 @@
     if (hr == S_OK)
     {
-        *pvLock = (void*)(((uint8_t*)DdiLock.pPages) + (offLock & 0xfff));
+        *pvLock = (void*)(((uint8_t*)DdiLock.pData) + (offLock & 0xfff));
         return VINF_SUCCESS;
     }
@@ -217,4 +230,7 @@
             pBuf->pDevice = pPrivate->pDevice;
             pBuf->hAllocation = Buf.DdiAllocInfo.hAllocation;
+
+            *ppBuf = &pBuf->Base;
+
             return VINF_SUCCESS;
         }
@@ -264,6 +280,14 @@
         pAllocationList->DoNotRetireInstance = pBufInfo->fFlags.bDoNotRetire;
         pBufSubmInfo->fSubFlags = pBufInfo->fFlags;
-        pBufSubmInfo->offData = pBufInfo->offData;
-        pBufSubmInfo->cbData = pBufInfo->cbData;
+        if (pBufInfo->fFlags.bEntireBuffer)
+        {
+            pBufSubmInfo->offData = 0;
+            pBufSubmInfo->cbData = pBuffer->Base.cbBuffer;
+        }
+        else
+        {
+            pBufSubmInfo->offData = pBufInfo->offData;
+            pBufSubmInfo->cbData = pBufInfo->cbData;
+        }
 
         ++pAllocationList;
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxUhgsmiDisp.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxUhgsmiDisp.h	(revision 32888)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxUhgsmiDisp.h	(revision 32889)
@@ -22,7 +22,7 @@
 {
     VBOXUHGSMI Base;
-    PVBOXWDDMDISP_DEVICE pDevice;
+    struct VBOXWDDMDISP_DEVICE *pDevice;
 } VBOXUHGSMI_PRIVATE_D3D, *PVBOXUHGSMI_PRIVATE_D3D;
 
-HRESULT vboxUhgsmiD3DInit(PVBOXUHGSMI_PRIVATE_D3D pHgsmi, PVBOXWDDMDISP_DEVICE pDevice);
+HRESULT vboxUhgsmiD3DInit(PVBOXUHGSMI_PRIVATE_D3D pHgsmi, struct VBOXWDDMDISP_DEVICE *pDevice);
 #endif /* #ifndef ___VBoxUhgsmiDisp_h__ */
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/Makefile.kmk	(revision 32888)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/Makefile.kmk	(revision 32889)
@@ -90,6 +90,6 @@
   endif
  endif
- ifdef VBOXVDMA_WITH_VDMA
-  VBoxVideoWddm_DEFS     += VBOXVDMA_WITH_VDMA 
+ ifdef VBOX_WITH_VDMA
+  VBoxVideoWddm_DEFS     += VBOX_WITH_VDMA 
  endif
  ifdef DEBUG_misha
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.h	(revision 32888)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.h	(revision 32889)
@@ -336,5 +336,5 @@
    VBOXSHGSMILIST VhwaCmdList;
 #endif
-   BOOL bSetNotifyDxDpc;
+//   BOOL bSetNotifyDxDpc;
    BOOL bNotifyDxDpc;
 
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxUhgsmi.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxUhgsmi.h	(revision 32888)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxUhgsmi.h	(revision 32889)
@@ -34,9 +34,10 @@
         struct
         {
-            uint32_t bReadOnly  : 1;
-            uint32_t bWriteOnly : 1;
-            uint32_t bDonotWait : 1;
-            uint32_t bDiscard   : 1;
-            uint32_t Reserved   : 28;
+            uint32_t bReadOnly   : 1;
+            uint32_t bWriteOnly  : 1;
+            uint32_t bDonotWait  : 1;
+            uint32_t bDiscard    : 1;
+            uint32_t bLockEntire : 1;
+            uint32_t Reserved    : 27;
         };
         uint32_t Value;
@@ -54,5 +55,6 @@
             uint32_t bDoNotRetire           : 1; /* <- the buffer will be used in a subsequent command */
             uint32_t bDoNotSignalCompletion : 1; /* <- do not signal notification object on completion for this alloc */
-            uint32_t Reserved               : 28;
+            uint32_t bEntireBuffer          : 1; /* <- do not signal notification object on completion for this alloc */
+            uint32_t Reserved               : 27;
         };
         uint32_t Value;
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoMisc.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoMisc.cpp	(revision 32888)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoMisc.cpp	(revision 32889)
@@ -693,4 +693,5 @@
 NTSTATUS vboxWddmDisplaySettingsQueryPos(IN PDEVICE_EXTENSION pDeviceExtension, D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, POINT * pPos)
 {
+    Assert(KeGetCurrentIrql() == PASSIVE_LEVEL);
     HANDLE hKey;
     NTSTATUS Status = vboxWddmRegOpenDisplaySettingsKey(pDeviceExtension, VidPnSourceId, &hKey);
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.cpp	(revision 32888)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.cpp	(revision 32889)
@@ -1002,5 +1002,5 @@
 static int vboxWddmVdmaSubmitHgsmi(struct _DEVICE_EXTENSION* pDevExt, PVBOXVDMAINFO pInfo, HGSMIOFFSET offDr)
 {
-    VBoxHGSMIGuestWrite(pDevExt, offDr);
+    VBoxHGSMIGuestWrite(hgsmiFromDeviceExt(pDevExt), offDr);
     return VINF_SUCCESS;
 }
@@ -1012,5 +1012,5 @@
     int rc = VINF_SUCCESS;
 
-    PVBOXVDMA_CTL pCmd = (PVBOXVDMA_CTL)VBoxSHGSMICommandAlloc(&pDevExt->u.primary.hgsmiAdapterHeap, sizeof (VBOXVDMA_CTL), HGSMI_CH_VBVA, VBVA_VDMA_CTL);
+    PVBOXVDMA_CTL pCmd = (PVBOXVDMA_CTL)VBoxSHGSMICommandAlloc(&hgsmiFromDeviceExt(pDevExt)->hgsmiAdapterHeap, sizeof (VBOXVDMA_CTL), HGSMI_CH_VBVA, VBVA_VDMA_CTL);
     if (pCmd)
     {
@@ -1019,5 +1019,5 @@
         pCmd->i32Result = VERR_NOT_SUPPORTED;
 
-        const VBOXSHGSMIHEADER* pHdr = VBoxSHGSMICommandPrepSynch(&pDevExt->u.primary.hgsmiAdapterHeap, pCmd);
+        const VBOXSHGSMIHEADER* pHdr = VBoxSHGSMICommandPrepSynch(&hgsmiFromDeviceExt(pDevExt)->hgsmiAdapterHeap, pCmd);
         Assert(pHdr);
         if (pHdr)
@@ -1025,5 +1025,5 @@
             do
             {
-                HGSMIOFFSET offCmd = VBoxSHGSMICommandOffset(&pDevExt->u.primary.hgsmiAdapterHeap, pHdr);
+                HGSMIOFFSET offCmd = VBoxSHGSMICommandOffset(&hgsmiFromDeviceExt(pDevExt)->hgsmiAdapterHeap, pHdr);
                 Assert(offCmd != HGSMIOFFSET_VOID);
                 if (offCmd != HGSMIOFFSET_VOID)
@@ -1033,5 +1033,5 @@
                     if (RT_SUCCESS(rc))
                     {
-                        rc = VBoxSHGSMICommandDoneSynch(&pDevExt->u.primary.hgsmiAdapterHeap, pHdr);
+                        rc = VBoxSHGSMICommandDoneSynch(&hgsmiFromDeviceExt(pDevExt)->hgsmiAdapterHeap, pHdr);
                         AssertRC(rc);
                         if (RT_SUCCESS(rc))
@@ -1046,9 +1046,9 @@
                     rc = VERR_INVALID_PARAMETER;
                 /* fail to submit, cancel it */
-                VBoxSHGSMICommandCancelSynch(&pDevExt->u.primary.hgsmiAdapterHeap, pHdr);
+                VBoxSHGSMICommandCancelSynch(&hgsmiFromDeviceExt(pDevExt)->hgsmiAdapterHeap, pHdr);
             } while (0);
         }
 
-        VBoxSHGSMICommandFree (&pDevExt->u.primary.hgsmiAdapterHeap, pCmd);
+        VBoxSHGSMICommandFree (&hgsmiFromDeviceExt(pDevExt)->hgsmiAdapterHeap, pCmd);
     }
     else
@@ -1247,5 +1247,8 @@
     }
 
-    vboxVdmaDdiCmdCompletedIrq(pDevExt, &pDevExt->DdiCmdQueue, VBOXVDMADDI_CMD_FROM_BUF_DR(pDr), enmComplType);
+    if (vboxVdmaDdiCmdCompletedIrq(pDevExt, &pDevExt->DdiCmdQueue, VBOXVDMADDI_CMD_FROM_BUF_DR(pDr), enmComplType))
+    {
+        pDevExt->bNotifyDxDpc = TRUE;
+    }
 
     /* inform SHGSMI we DO NOT want to be called at DPC later */
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.h	(revision 32888)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVdma.h	(revision 32889)
@@ -79,4 +79,9 @@
 }
 
+DECLINLINE(BOOLEAN) vboxVdmaDdiCmdIsCompletedListEmptyIsr(PVBOXVDMADDI_CMD_QUEUE pQueue)
+{
+    return IsListEmpty(&pQueue->DpcCmdQueue);
+}
+
 #define VBOXVDMADDI_CMD_FROM_ENTRY(_pEntry) ((PVBOXVDMADDI_CMD)(((uint8_t*)(_pEntry)) - RT_OFFSETOF(VBOXVDMADDI_CMD, QueueEntry)))
 
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp	(revision 32888)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp	(revision 32889)
@@ -214,7 +214,7 @@
      * Set the current mode into the hardware.
      */
-    NTSTATUS Status= vboxWddmDisplaySettingsQueryPos(pDevExt, VidPnSourceId, &pSource->VScreenPos);
-    Assert(Status == STATUS_SUCCESS);
-    Status = vboxWddmGhDisplaySetMode(pDevExt, pAllocation);
+//    NTSTATUS Status= vboxWddmDisplaySettingsQueryPos(pDevExt, VidPnSourceId, &pSource->VScreenPos);
+//    Assert(Status == STATUS_SUCCESS);
+    NTSTATUS Status = vboxWddmGhDisplaySetMode(pDevExt, pAllocation);
     Assert(Status == STATUS_SUCCESS);
     if (Status == STATUS_SUCCESS)
@@ -886,9 +886,9 @@
         }
 
-        if (pDevExt->bSetNotifyDxDpc)
-        {
-            Assert(bNeedDpc == TRUE);
-            pDevExt->bNotifyDxDpc = TRUE;
-            pDevExt->bSetNotifyDxDpc = FALSE;
+        if (pDevExt->bNotifyDxDpc)
+        {
+//            Assert(bNeedDpc == TRUE);
+//            pDevExt->bNotifyDxDpc = TRUE;
+//            pDevExt->bSetNotifyDxDpc = FALSE;
             bNeedDpc = TRUE;
         }
@@ -1442,4 +1442,9 @@
 //        }
 //#endif
+        case VBOXWDDM_ALLOC_TYPE_UMD_HGSMI_BUFFER:
+        {
+            ObDereferenceObject(pAllocation->pSynchEvent);
+            break;
+        }
         default:
             break;
@@ -1472,15 +1477,7 @@
         if (pAllocation)
         {
-            pAllocation->enmType = pAllocInfo->enmType;
-            pAllocation->fRcFlags = pAllocInfo->fFlags;
-            pAllocation->offVram = VBOXVIDEOOFFSET_VOID;
-            pAllocation->SurfDesc = pAllocInfo->SurfDesc;
-            pAllocation->bVisible = FALSE;
-            pAllocation->bAssigned = FALSE;
-
             pAllocationInfo->pPrivateDriverData = NULL;
             pAllocationInfo->PrivateDriverDataSize = 0;
             pAllocationInfo->Alignment = 0;
-            pAllocationInfo->Size = pAllocInfo->SurfDesc.cbSize;
             pAllocationInfo->PitchAlignedSize = 0;
             pAllocationInfo->HintedBank.Value = 0;
@@ -1495,22 +1492,33 @@
             pAllocationInfo->AllocationPriority = D3DDDI_ALLOCATIONPRIORITY_NORMAL;
 
+            pAllocation->enmType = pAllocInfo->enmType;
+            pAllocation->offVram = VBOXVIDEOOFFSET_VOID;
+            pAllocation->bVisible = FALSE;
+            pAllocation->bAssigned = FALSE;
+
             switch (pAllocInfo->enmType)
             {
                 case VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE:
+                case VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC:
+                case VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE:
+                case VBOXWDDM_ALLOC_TYPE_STD_STAGINGSURFACE:
+                {
+                    pAllocation->fRcFlags = pAllocInfo->fFlags;
+                    pAllocation->SurfDesc = pAllocInfo->SurfDesc;
+
+                    pAllocationInfo->Size = pAllocInfo->SurfDesc.cbSize;
+
+                    switch (pAllocInfo->enmType)
+                    {
+                        case VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE:
 #if 0 //defined(VBOXWDDM_RENDER_FROM_SHADOW)
-                    pAllocationInfo->SupportedReadSegmentSet = 2;
-                    pAllocationInfo->SupportedWriteSegmentSet = 2;
+                            pAllocationInfo->SupportedReadSegmentSet = 2;
+                            pAllocationInfo->SupportedWriteSegmentSet = 2;
 #endif
 #ifndef VBOXWDDM_RENDER_FROM_SHADOW
-                    pAllocationInfo->Flags.CpuVisible = 1;
+                            pAllocationInfo->Flags.CpuVisible = 1;
 #endif
-                    break;
-                case VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC:
-//                    Assert(pResource);
-//                    if (pResource)
-                    {
-//                        Assert(pResource->cAllocations);
-//                        if (pResource->cAllocations)
-                        {
+                            break;
+                        case VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC:
 #ifdef VBOX_WITH_VIDEOHWACCEL
                             if (pAllocInfo->fFlags.Overlay)
@@ -1544,13 +1552,61 @@
                                 }
                             }
-                        }
-//                        else
-//                            Status = STATUS_INVALID_PARAMETER;
+                            break;
+                        case VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE:
+                        case VBOXWDDM_ALLOC_TYPE_STD_STAGINGSURFACE:
+                            pAllocationInfo->Flags.CpuVisible = 1;
+                            break;
+                    }
+
+                    if (Status == STATUS_SUCCESS)
+                    {
+                        pAllocation->UsageHint.Version = 0;
+                        pAllocation->UsageHint.v1.Flags.Value = 0;
+                        pAllocation->UsageHint.v1.Format = pAllocInfo->SurfDesc.format;
+                        pAllocation->UsageHint.v1.SwizzledFormat = 0;
+                        pAllocation->UsageHint.v1.ByteOffset = 0;
+                        pAllocation->UsageHint.v1.Width = pAllocation->SurfDesc.width;
+                        pAllocation->UsageHint.v1.Height = pAllocation->SurfDesc.height;
+                        pAllocation->UsageHint.v1.Pitch = pAllocation->SurfDesc.pitch;
+                        pAllocation->UsageHint.v1.Depth = 0;
+                        pAllocation->UsageHint.v1.SlicePitch = 0;
+
+                        Assert(!pAllocationInfo->pAllocationUsageHint);
+                        pAllocationInfo->pAllocationUsageHint = &pAllocation->UsageHint;
+                    }
+
+                    break;
+                }
+                case VBOXWDDM_ALLOC_TYPE_UMD_HGSMI_BUFFER:
+                {
+                    pAllocationInfo->Size = pAllocInfo->cbBuffer;
+                    pAllocation->enmSynchType = pAllocInfo->enmSynchType;
+                    pAllocation->SurfDesc.cbSize = pAllocInfo->cbBuffer;
+                    pAllocationInfo->Flags.CpuVisible = 1;
+                    pAllocationInfo->Flags.SynchronousPaging = 1;
+                    pAllocationInfo->AllocationPriority = D3DDDI_ALLOCATIONPRIORITY_MAXIMUM;
+                    switch (pAllocInfo->enmSynchType)
+                    {
+                        case VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT:
+                            Status = ObReferenceObjectByHandle(pAllocInfo->hSynch, EVENT_MODIFY_STATE, *ExEventObjectType, UserMode,
+                                    (PVOID*)&pAllocation->pSynchEvent,
+                                    NULL);
+                            Assert(Status == STATUS_SUCCESS);
+                            break;
+                        case VBOXUHGSMI_SYNCHOBJECT_TYPE_SEMAPHORE:
+                            Status = ObReferenceObjectByHandle(pAllocInfo->hSynch, EVENT_MODIFY_STATE, *ExSemaphoreObjectType, UserMode,
+                                    (PVOID*)&pAllocation->pSynchSemaphore,
+                                    NULL);
+                            Assert(Status == STATUS_SUCCESS);
+                            break;
+                        default:
+                            drprintf((__FUNCTION__ ": ERROR: invalid synch info type(%d)\n", pAllocInfo->enmSynchType));
+                            AssertBreakpoint();
+                            Status = STATUS_INVALID_PARAMETER;
+                            break;
                     }
                     break;
-                case VBOXWDDM_ALLOC_TYPE_STD_SHADOWSURFACE:
-                case VBOXWDDM_ALLOC_TYPE_STD_STAGINGSURFACE:
-                    pAllocationInfo->Flags.CpuVisible = 1;
-                    break;
+                }
+
                 default:
                     drprintf((__FUNCTION__ ": ERROR: invalid alloc info type(%d)\n", pAllocInfo->enmType));
@@ -1558,23 +1614,8 @@
                     Status = STATUS_INVALID_PARAMETER;
                     break;
-            }
-
-            if (Status == STATUS_SUCCESS)
-            {
-                pAllocation->UsageHint.Version = 0;
-                pAllocation->UsageHint.v1.Flags.Value = 0;
-                pAllocation->UsageHint.v1.Format = pAllocInfo->SurfDesc.format;
-                pAllocation->UsageHint.v1.SwizzledFormat = 0;
-                pAllocation->UsageHint.v1.ByteOffset = 0;
-                pAllocation->UsageHint.v1.Width = pAllocation->SurfDesc.width;
-                pAllocation->UsageHint.v1.Height = pAllocation->SurfDesc.height;
-                pAllocation->UsageHint.v1.Pitch = pAllocation->SurfDesc.pitch;
-                pAllocation->UsageHint.v1.Depth = 0;
-                pAllocation->UsageHint.v1.SlicePitch = 0;
-
-                Assert(!pAllocationInfo->pAllocationUsageHint);
-                pAllocationInfo->pAllocationUsageHint = &pAllocation->UsageHint;
-            }
-            else
+
+            }
+
+            if (Status != STATUS_SUCCESS)
                 vboxWddmAllocationDeleteFromResource(pResource, pAllocation);
         }
@@ -1993,5 +2034,5 @@
                     if (pAllocationList->SegmentId)
                     {
-                        DXGK_ALLOCATIONLIST *pAllocation2Patch = (DXGK_ALLOCATIONLIST*)pPrivateBuf + pPatchList->PatchOffset;
+                        DXGK_ALLOCATIONLIST *pAllocation2Patch = (DXGK_ALLOCATIONLIST*)(pPrivateBuf + pPatchList->PatchOffset);
                         pAllocation2Patch->SegmentId = pAllocationList->SegmentId;
                         pAllocation2Patch->PhysicalAddress = pAllocationList->PhysicalAddress;
@@ -2124,5 +2165,5 @@
 DECLCALLBACK(VOID) vboxWddmDmaCompleteChromiumCmd(PDEVICE_EXTENSION pDevExt, PVBOXVDMADDI_CMD pCmd, PVOID pvContext)
 {
-    PVBOXVDMACBUF_DR pDr = (pDr)pvContext;
+    PVBOXVDMACBUF_DR pDr = (PVBOXVDMACBUF_DR)pvContext;
     PVBOXVDMACMD pHdr = VBOXVDMACBUF_DR_TAIL(pDr, VBOXVDMACMD);
     UINT cBufs = pHdr->u32CmdSpecific;
@@ -2342,7 +2383,5 @@
             pDr->fFlags = VBOXVDMACBUF_FLAG_BUF_FOLLOWS_DR;
             pDr->cbBuf = cbCmd;
-            pDr->u32FenceId = pSubmitCommand->SubmissionFenceId;
             pDr->rc = VERR_NOT_IMPLEMENTED;
-            pDr->u64GuestContext = (uint64_t)pContext;
 
             PVBOXVDMACMD pHdr = VBOXVDMACBUF_DR_TAIL(pDr, VBOXVDMACMD);
@@ -2363,5 +2402,5 @@
             PVBOXVDMADDI_CMD pDdiCmd = VBOXVDMADDI_CMD_FROM_BUF_DR(pDr);
             vboxVdmaDdiCmdInit(pDdiCmd, pSubmitCommand->SubmissionFenceId, pContext, vboxWddmDmaCompleteChromiumCmd, pDr);
-            NTSTATUS Status = vboxVdmaDdiCmdSubmitted(pDevExt, &pDevExt->DdiCmdQueue, &pCmd->DdiCmd);
+            NTSTATUS Status = vboxVdmaDdiCmdSubmitted(pDevExt, &pDevExt->DdiCmdQueue, pDdiCmd);
             Assert(Status == STATUS_SUCCESS);
             if (Status == STATUS_SUCCESS)
@@ -2378,4 +2417,5 @@
             Assert(Status == STATUS_SUCCESS);
 #endif
+            break;
         }
         case VBOXVDMACMD_TYPE_DMA_PRESENT_FLIP:
@@ -2442,5 +2482,5 @@
         {
             AssertBreakpoint();
-#ifdef VBOX_WITH_VDMA
+#if 0 //def VBOX_WITH_VDMA
             VBOXWDDM_DMA_PRIVATEDATA_PRESENTHDR *pPrivateData = (VBOXWDDM_DMA_PRIVATEDATA_PRESENTHDR*)pPrivateDataBase;
             PVBOXVDMACBUF_DR pDr = vboxVdmaCBufDrCreate (&pDevExt->u.primary.Vdma, 0);
@@ -3434,4 +3474,6 @@
                 pSource->offVram = VBOXVIDEOOFFSET_VOID;
 #endif
+                Status= vboxWddmDisplaySettingsQueryPos(pDevExt, pSetVidPnSourceAddress->VidPnSourceId, &pSource->VScreenPos);
+                Assert(Status == STATUS_SUCCESS);
                 /* should not generally happen, but still inform host*/
                 Status = vboxWddmGhDisplaySetInfo(pDevExt, pSource, pSetVidPnSourceAddress->VidPnSourceId);
@@ -3500,10 +3542,10 @@
                         pSource->offVram = VBOXVIDEOOFFSET_VOID;
 #endif
-#if 0 /* tmp */
+                        Status= vboxWddmDisplaySettingsQueryPos(pDevExt, pSetVidPnSourceVisibility->VidPnSourceId, &pSource->VScreenPos);
+                        Assert(Status == STATUS_SUCCESS);
                         Status = vboxWddmGhDisplaySetInfo(pDevExt, pSource, pSetVidPnSourceVisibility->VidPnSourceId);
                         Assert(Status == STATUS_SUCCESS);
                         if (Status != STATUS_SUCCESS)
                             drprintf((__FUNCTION__": vboxWddmGhDisplaySetInfo failed, Status (0x%x)\n", Status));
-#endif
                     }
                 }
@@ -4579,5 +4621,12 @@
     int rc = vboxVhwaHlpOverlayUpdate(pOverlay, &pUpdateOverlay->OverlayInfo);
     AssertRC(rc);
-    if (RT_FAILURE(rc))
+    if (RT_SUCCESS(rc))
+    {
+        RECT DstRect;
+        vboxVhwaHlpOverlayDstRectGet(pOverlay->pDevExt, pOverlay, &DstRect);
+        Status = vboxVdmaHlpUpdatePrimary(pOverlay->pDevExt, pOverlay->VidPnSourceId, &DstRect);
+        Assert(Status == STATUS_SUCCESS);
+    }
+    else
         Status = STATUS_UNSUCCESSFUL;
 
@@ -4668,4 +4717,6 @@
             {
                 pDevExt->aSources[i].offVram = VBOXVIDEOOFFSET_VOID;
+                Status= vboxWddmDisplaySettingsQueryPos(pDevExt, i, &pDevExt->aSources[i].VScreenPos);
+                Assert(Status == STATUS_SUCCESS);
             }
         }
