Index: /trunk/include/VBox/VBoxUhgsmi.h
===================================================================
--- /trunk/include/VBox/VBoxUhgsmi.h	(revision 41057)
+++ /trunk/include/VBox/VBoxUhgsmi.h	(revision 41058)
@@ -33,12 +33,17 @@
 
 typedef struct VBOXUHGSMI_BUFFER *PVBOXUHGSMI_BUFFER;
-typedef void* HVBOXUHGSMI_SYNCHOBJECT;
 
-typedef enum
+typedef struct VBOXUHGSMI_BUFFER_TYPE_FLAGS
 {
-    VBOXUHGSMI_SYNCHOBJECT_TYPE_NONE = 0,
-    VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT,
-    VBOXUHGSMI_SYNCHOBJECT_TYPE_SEMAPHORE
-} VBOXUHGSMI_SYNCHOBJECT_TYPE;
+    union
+    {
+        struct
+        {
+            uint32_t fCommand    : 1;
+            uint32_t Reserved    : 31;
+        };
+        uint32_t Value;
+    };
+} VBOXUHGSMI_BUFFER_TYPE_FLAGS;
 
 typedef struct VBOXUHGSMI_BUFFER_LOCK_FLAGS
@@ -67,8 +72,7 @@
             uint32_t bHostReadOnly          : 1;
             uint32_t bHostWriteOnly         : 1;
-            uint32_t bDoNotRetire           : 1; /**< the buffer will be uset in a subsequent command */
-            uint32_t bDoNotSignalCompletion : 1; /**< do not signal notification object on completion for this alloc */
+            uint32_t bDoNotRetire           : 1; /**< the buffer will be used in a subsequent command */
             uint32_t bEntireBuffer          : 1;
-            uint32_t Reserved               : 27;
+            uint32_t Reserved               : 28;
         };
         uint32_t Value;
@@ -78,7 +82,5 @@
 /* the caller can specify NULL as a hSynch and specify a valid enmSynchType to make UHGSMI create a proper object itself,
  *  */
-typedef DECLCALLBACK(int) FNVBOXUHGSMI_BUFFER_CREATE(PVBOXUHGSMI pHgsmi, uint32_t cbBuf,
-        VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType, HVBOXUHGSMI_SYNCHOBJECT hSynch,
-        PVBOXUHGSMI_BUFFER* ppBuf);
+typedef DECLCALLBACK(int) FNVBOXUHGSMI_BUFFER_CREATE(PVBOXUHGSMI pHgsmi, uint32_t cbBuf, VBOXUHGSMI_BUFFER_TYPE_FLAGS fType, PVBOXUHGSMI_BUFFER* ppBuf);
 typedef FNVBOXUHGSMI_BUFFER_CREATE *PFNVBOXUHGSMI_BUFFER_CREATE;
 
@@ -91,6 +93,6 @@
 } VBOXUHGSMI_BUFFER_SUBMIT, *PVBOXUHGSMI_BUFFER_SUBMIT;
 
-typedef DECLCALLBACK(int) FNVBOXUHGSMI_BUFFER_SUBMIT_ASYNCH(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers);
-typedef FNVBOXUHGSMI_BUFFER_SUBMIT_ASYNCH *PFNVBOXUHGSMI_BUFFER_SUBMIT_ASYNCH;
+typedef DECLCALLBACK(int) FNVBOXUHGSMI_BUFFER_SUBMIT(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers);
+typedef FNVBOXUHGSMI_BUFFER_SUBMIT *PFNVBOXUHGSMI_BUFFER_SUBMIT;
 
 typedef DECLCALLBACK(int) FNVBOXUHGSMI_BUFFER_DESTROY(PVBOXUHGSMI_BUFFER pBuf);
@@ -106,5 +108,5 @@
 {
     PFNVBOXUHGSMI_BUFFER_CREATE pfnBufferCreate;
-    PFNVBOXUHGSMI_BUFFER_SUBMIT_ASYNCH pfnBufferSubmitAsynch;
+    PFNVBOXUHGSMI_BUFFER_SUBMIT pfnBufferSubmit;
     /** User custom data. */
     void *pvUserData;
@@ -119,12 +121,17 @@
     /* r/o data added for ease of access and simplicity
      * modifying it leads to unpredictable behavior */
-    HVBOXUHGSMI_SYNCHOBJECT hSynch;
-    VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType;
+    VBOXUHGSMI_BUFFER_TYPE_FLAGS fType;
     uint32_t cbBuffer;
-    bool bSynchCreated;
     /** User custom data. */
     void *pvUserData;
 } VBOXUHGSMI_BUFFER;
 
+#define VBoxUhgsmiBufferCreate(_pUhgsmi, _cbBuf, _fType, _ppBuf) ((_pUhgsmi)->pfnBufferCreate(_pUhgsmi, _cbBuf, _fType, _ppBuf))
+#define VBoxUhgsmiBufferSubmit(_pUhgsmi, _aBuffers, _cBuffers) ((_pUhgsmi)->pfnBufferSubmit(_pUhgsmi, _aBuffers, _cBuffers))
+
+#define VBoxUhgsmiBufferLock(_pBuf, _offLock, _cbLock, _fFlags, _pvLock) ((_pBuf)->pfnLock(_pBuf, _offLock, _cbLock, _fFlags, _pvLock))
+#define VBoxUhgsmiBufferUnlock(_pBuf) ((_pBuf)->pfnUnlock(_pBuf))
+#define VBoxUhgsmiBufferDestroy(_pBuf) ((_pBuf)->pfnDestroy(_pBuf))
+
 #endif
 
Index: /trunk/include/VBox/VBoxVideo.h
===================================================================
--- /trunk/include/VBox/VBoxVideo.h	(revision 41057)
+++ /trunk/include/VBox/VBoxVideo.h	(revision 41058)
@@ -1374,6 +1374,6 @@
     VBOXVIDEOOFFSET offBuffer;
     uint32_t cbBuffer;
-    uint32_t u32GuesData;
-    uint64_t u64GuesData;
+    uint32_t u32GuestData;
+    uint64_t u64GuestData;
 } VBOXVDMACMD_CHROMIUM_BUFFER, *PVBOXVDMACMD_CHROMIUM_BUFFER;
 
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/common/wddm/VBoxMPIf.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/common/wddm/VBoxMPIf.h	(revision 41057)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/common/wddm/VBoxMPIf.h	(revision 41058)
@@ -35,5 +35,5 @@
 
 /* One would increase this whenever definitions in this file are changed */
-#define VBOXVIDEOIF_VERSION 12
+#define VBOXVIDEOIF_VERSION 13
 
 #define VBOXWDDM_NODE_ID_SYSTEM           0
@@ -113,5 +113,5 @@
             uint32_t cbBuffer;
             uint64_t hSynch;
-            VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType;
+            VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType;
         };
     };
@@ -180,5 +180,5 @@
 typedef struct VBOXWDDM_UHGSMI_BUFFER_UI_SUBMIT_INFO
 {
-    VBOXUHGSMI_BUFFER_SUBMIT_FLAGS fSubFlags;
+    uint32_t bDoNotSignalCompletion;
     uint32_t offData;
     uint32_t cbData;
@@ -438,5 +438,5 @@
     uint64_t pvData;
     uint64_t hSynch;
-    VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType;
+    VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType;
 } VBOXVIDEOCM_UM_ALLOC, *PVBOXVIDEOCM_UM_ALLOC;
 
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp	(revision 41057)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp	(revision 41058)
@@ -5716,4 +5716,6 @@
         }
     }
+
+    VBOXVDBG_BREAK_SHARED(pRc);
 
     if (hr == S_OK)
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiBase.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiBase.h	(revision 41057)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiBase.h	(revision 41058)
@@ -58,4 +58,5 @@
 {
     VBOXUHGSMI_BUFFER Base;
+    HANDLE hSynch;
     D3DKMT_HANDLE hAllocation;
 } VBOXUHGSMI_BUFFER_PRIVATE_BASE, *PVBOXUHGSMI_BUFFER_PRIVATE_BASE;
@@ -119,58 +120,24 @@
 }
 
-DECLINLINE(int) vboxUhgsmiBaseEventChkCreate(VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType, HVBOXUHGSMI_SYNCHOBJECT *phSynch, bool *pbSynchCreated)
+DECLINLINE(int) vboxUhgsmiBaseEventChkCreate(VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType, HANDLE *phSynch)
 {
-    bool bSynchCreated = false;
+    *phSynch = NULL;
 
-    switch (enmSynchType)
+    if (fUhgsmiType.fCommand)
     {
-        case VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT:
-            if (!*phSynch)
-            {
-                *phSynch = CreateEvent(
+        *phSynch = CreateEvent(
                   NULL, /* LPSECURITY_ATTRIBUTES lpEventAttributes */
                   FALSE, /* BOOL bManualReset */
                   FALSE, /* BOOL bInitialState */
                   NULL /* LPCTSTR lpName */
-                );
-                Assert(*phSynch);
-                if (!*phSynch)
-                {
-                    DWORD winEr = GetLastError();
-                    /* todo: translate winer */
-                    return VERR_GENERAL_FAILURE;
-                }
-                bSynchCreated = true;
-            }
-            break;
-        case VBOXUHGSMI_SYNCHOBJECT_TYPE_SEMAPHORE:
-            if (!*phSynch)
-            {
-                *phSynch = CreateSemaphore(
-                  NULL, /* LPSECURITY_ATTRIBUTES lpSemaphoreAttributes */
-                  0, /* LONG lInitialCount */
-                  (LONG)((~0UL) >> 1), /* LONG lMaximumCount */
-                  NULL /* LPCTSTR lpName */
-                );
-                Assert(*phSynch);
-                if (!*phSynch)
-                {
-                    DWORD winEr = GetLastError();
-                    /* todo: translate winer */
-                    return VERR_GENERAL_FAILURE;
-                }
-                bSynchCreated = true;
-            }
-            break;
-        case VBOXUHGSMI_SYNCHOBJECT_TYPE_NONE:
-            Assert(!*phSynch);
-            if (*phSynch)
-                return VERR_INVALID_PARAMETER;
-            break;
-        default:
-            Assert(0);
-            return VERR_INVALID_PARAMETER;
+            );
+        Assert(*phSynch);
+        if (!*phSynch)
+        {
+            DWORD winEr = GetLastError();
+            /* todo: translate winer */
+            return VERR_GENERAL_FAILURE;
+        }
     }
-    *pbSynchCreated = bSynchCreated;
     return VINF_SUCCESS;
 }
@@ -211,5 +178,5 @@
         pAllocationList->WriteOperation = !pBufInfo->fFlags.bHostReadOnly;
         pAllocationList->DoNotRetireInstance = pBufInfo->fFlags.bDoNotRetire;
-        pBufSubmInfo->fSubFlags = pBufInfo->fFlags;
+        pBufSubmInfo->bDoNotSignalCompletion = 0;
         if (pBufInfo->fFlags.bEntireBuffer)
         {
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiDisp.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiDisp.cpp	(revision 41057)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiDisp.cpp	(revision 41058)
@@ -44,8 +44,6 @@
     if (hr == S_OK)
     {
-        if (pBuffer->BasePrivate.Base.bSynchCreated)
-        {
-            CloseHandle(pBuffer->BasePrivate.Base.hSynch);
-        }
+        if (pBuffer->BasePrivate.hSynch)
+            CloseHandle(pBuffer->BasePrivate.hSynch);
         RTMemFree(pBuffer);
         return VINF_SUCCESS;
@@ -95,13 +93,11 @@
 }
 
-DECLCALLBACK(int) vboxUhgsmiD3DBufferCreate(PVBOXUHGSMI pHgsmi, uint32_t cbBuf,
-        VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType, HVBOXUHGSMI_SYNCHOBJECT hSynch,
-        PVBOXUHGSMI_BUFFER* ppBuf)
-{
-    bool bSynchCreated = false;
+DECLCALLBACK(int) vboxUhgsmiD3DBufferCreate(PVBOXUHGSMI pHgsmi, uint32_t cbBuf, VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType, PVBOXUHGSMI_BUFFER* ppBuf)
+{
+    HANDLE hSynch = NULL;
     if (!cbBuf)
         return VERR_INVALID_PARAMETER;
 
-    int rc = vboxUhgsmiBaseEventChkCreate(enmSynchType, &hSynch, &bSynchCreated);
+    int rc = vboxUhgsmiBaseEventChkCreate(fUhgsmiType, &hSynch);
     AssertRC(rc);
     if (RT_FAILURE(rc))
@@ -134,5 +130,5 @@
         Buf.AllocInfo.cbBuffer = cbBuf;
         Buf.AllocInfo.hSynch = hSynch;
-        Buf.AllocInfo.enmSynchType = enmSynchType;
+        Buf.AllocInfo.fUhgsmiType = fUhgsmiType;
 
         HRESULT hr = pPrivate->pDevice->RtCallbacks.pfnAllocateCb(pPrivate->pDevice->hDevice, &Buf.DdiAlloc);
@@ -146,8 +142,6 @@
             pBuf->BasePrivate.Base.pfnDestroy = vboxUhgsmiD3DBufferDestroy;
 
-            pBuf->BasePrivate.Base.hSynch = hSynch;
-            pBuf->BasePrivate.Base.enmSynchType = enmSynchType;
+            pBuf->BasePrivate.Base.fType = fUhgsmiType;
             pBuf->BasePrivate.Base.cbBuffer = cbBuf;
-            pBuf->BasePrivate.Base.bSynchCreated = bSynchCreated;
 
             pBuf->pDevice = pPrivate->pDevice;
@@ -164,5 +158,5 @@
         rc = VERR_NO_MEMORY;
 
-    if (bSynchCreated)
+    if (hSynch)
         CloseHandle(hSynch);
 
@@ -170,5 +164,5 @@
 }
 
-DECLCALLBACK(int) vboxUhgsmiD3DBufferSubmitAsynch(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers)
+DECLCALLBACK(int) vboxUhgsmiD3DBufferSubmit(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers)
 {
     PVBOXUHGSMI_PRIVATE_D3D pHg = VBOXUHGSMID3D_GET(pHgsmi);
@@ -215,5 +209,5 @@
 {
     pHgsmi->BasePrivate.Base.pfnBufferCreate = vboxUhgsmiD3DBufferCreate;
-    pHgsmi->BasePrivate.Base.pfnBufferSubmitAsynch = vboxUhgsmiD3DBufferSubmitAsynch;
+    pHgsmi->BasePrivate.Base.pfnBufferSubmit = vboxUhgsmiD3DBufferSubmit;
     pHgsmi->BasePrivate.hClient = NULL;
     pHgsmi->pDevice = pDevice;
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiKmt.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiKmt.cpp	(revision 41057)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiKmt.cpp	(revision 41058)
@@ -39,4 +39,5 @@
     PVBOXUHGSMI_PRIVATE_KMT pHgsmi;
     VBOXVIDEOCM_UM_ALLOC Alloc;
+    HANDLE hSynch;
 } VBOXUHGSMI_BUFFER_PRIVATE_KMT_ESC, *PVBOXUHGSMI_BUFFER_PRIVATE_KMT_ESC;
 
@@ -56,8 +57,6 @@
     if (NT_SUCCESS(Status))
     {
-        if (pBuffer->BasePrivate.Base.bSynchCreated)
-        {
-            CloseHandle(pBuffer->BasePrivate.Base.hSynch);
-        }
+        if (pBuffer->BasePrivate.hSynch)
+            CloseHandle(pBuffer->BasePrivate.hSynch);
         RTMemFree(pBuffer);
         return VINF_SUCCESS;
@@ -123,13 +122,11 @@
 }
 
-DECLCALLBACK(int) vboxUhgsmiKmtBufferCreate(PVBOXUHGSMI pHgsmi, uint32_t cbBuf,
-        VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType, HVBOXUHGSMI_SYNCHOBJECT hSynch,
-        PVBOXUHGSMI_BUFFER* ppBuf)
-{
-    bool bSynchCreated = false;
+DECLCALLBACK(int) vboxUhgsmiKmtBufferCreate(PVBOXUHGSMI pHgsmi, uint32_t cbBuf, VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType, PVBOXUHGSMI_BUFFER* ppBuf)
+{
+    HANDLE hSynch = NULL;
     if (!cbBuf)
         return VERR_INVALID_PARAMETER;
 
-    int rc = vboxUhgsmiBaseEventChkCreate(enmSynchType, &hSynch, &bSynchCreated);
+    int rc = vboxUhgsmiBaseEventChkCreate(fUhgsmiType, &hSynch);
     AssertRC(rc);
     if (RT_FAILURE(rc))
@@ -161,5 +158,5 @@
         Buf.AllocInfo.cbBuffer = cbBuf;
         Buf.AllocInfo.hSynch = (uint64_t)hSynch;
-        Buf.AllocInfo.enmSynchType = enmSynchType;
+        Buf.AllocInfo.fUhgsmiType = fUhgsmiType;
 
         NTSTATUS Status = pPrivate->Callbacks.pfnD3DKMTCreateAllocation(&Buf.DdiAlloc);
@@ -174,8 +171,6 @@
             pBuf->BasePrivate.Base.pfnDestroy = vboxUhgsmiKmtBufferDestroy;
 
-            pBuf->BasePrivate.Base.hSynch = hSynch;
-            pBuf->BasePrivate.Base.enmSynchType = enmSynchType;
+            pBuf->BasePrivate.Base.fType = fUhgsmiType;
             pBuf->BasePrivate.Base.cbBuffer = cbBuf;
-            pBuf->BasePrivate.Base.bSynchCreated = bSynchCreated;
 
             pBuf->pHgsmi = pPrivate;
@@ -197,5 +192,5 @@
         rc = VERR_NO_MEMORY;
 
-    if (bSynchCreated)
+    if (hSynch)
         CloseHandle(hSynch);
 
@@ -203,5 +198,5 @@
 }
 
-DECLCALLBACK(int) vboxUhgsmiKmtBufferSubmitAsynch(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers)
+DECLCALLBACK(int) vboxUhgsmiKmtBufferSubmit(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers)
 {
     PVBOXUHGSMI_PRIVATE_KMT pHg = VBOXUHGSMIKMT_GET(pHgsmi);
@@ -275,8 +270,6 @@
     if (NT_SUCCESS(Status))
     {
-        if (pBuffer->Base.bSynchCreated)
-        {
-            CloseHandle(pBuffer->Base.hSynch);
-        }
+        if (pBuffer->hSynch)
+            CloseHandle(pBuffer->hSynch);
         RTMemFree(pBuffer);
         return VINF_SUCCESS;
@@ -290,13 +283,11 @@
 }
 
-DECLCALLBACK(int) vboxUhgsmiKmtEscBufferCreate(PVBOXUHGSMI pHgsmi, uint32_t cbBuf,
-        VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType, HVBOXUHGSMI_SYNCHOBJECT hSynch,
-        PVBOXUHGSMI_BUFFER* ppBuf)
-{
-    bool bSynchCreated = false;
+DECLCALLBACK(int) vboxUhgsmiKmtEscBufferCreate(PVBOXUHGSMI pHgsmi, uint32_t cbBuf, VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType, PVBOXUHGSMI_BUFFER* ppBuf)
+{
+    HANDLE hSynch = NULL;
     if (!cbBuf)
         return VERR_INVALID_PARAMETER;
 
-    int rc = vboxUhgsmiBaseEventChkCreate(enmSynchType, &hSynch, &bSynchCreated);
+    int rc = vboxUhgsmiBaseEventChkCreate(fUhgsmiType, &hSynch);
     AssertRC(rc);
     if (RT_FAILURE(rc))
@@ -330,5 +321,5 @@
         Buf.AllocInfo.Alloc.cbData = cbBuf;
         Buf.AllocInfo.Alloc.hSynch = (uint64_t)hSynch;
-        Buf.AllocInfo.Alloc.enmSynchType = enmSynchType;
+        Buf.AllocInfo.Alloc.fUhgsmiType = fUhgsmiType;
 
         NTSTATUS Status = pPrivate->Callbacks.pfnD3DKMTEscape(&Buf.DdiEscape);
@@ -340,11 +331,10 @@
             pBuf->Base.pfnLock = vboxUhgsmiKmtEscBufferLock;
             pBuf->Base.pfnUnlock = vboxUhgsmiKmtEscBufferUnlock;
-//            pBuf->Base.pfnAdjustValidDataRange = vboxUhgsmiKmtBufferAdjustValidDataRange;
             pBuf->Base.pfnDestroy = vboxUhgsmiKmtEscBufferDestroy;
 
-            pBuf->Base.hSynch = hSynch;
-            pBuf->Base.enmSynchType = enmSynchType;
+            pBuf->Base.fType = fUhgsmiType;
             pBuf->Base.cbBuffer = Buf.AllocInfo.Alloc.cbData;
-            pBuf->Base.bSynchCreated = bSynchCreated;
+
+            pBuf->hSynch = hSynch;
 
             *ppBuf = &pBuf->Base;
@@ -363,5 +353,5 @@
         rc = VERR_NO_MEMORY;
 
-    if (bSynchCreated)
+    if (hSynch)
         CloseHandle(hSynch);
 
@@ -369,5 +359,5 @@
 }
 
-DECLCALLBACK(int) vboxUhgsmiKmtEscBufferSubmitAsynch(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers)
+DECLCALLBACK(int) vboxUhgsmiKmtEscBufferSubmit(PVBOXUHGSMI pHgsmi, PVBOXUHGSMI_BUFFER_SUBMIT aBuffers, uint32_t cBuffers)
 {
     /* we no chromium will not submit more than three buffers actually,
@@ -379,11 +369,16 @@
     } Buf;
 
-    if (cBuffers > RT_ELEMENTS(Buf.aBufInfos) + 1)
-    {
-        Assert(0);
+    if (!cBuffers || cBuffers > RT_ELEMENTS(Buf.aBufInfos) + 1)
+    {
+        WARN(("invalid cBuffers!"));
         return VERR_INVALID_PARAMETER;
     }
 
-
+    HANDLE hSynch = VBOXUHGSMIKMTESC_GET_BUFFER(aBuffers[0].pBuf)->hSynch;
+    if (!hSynch)
+    {
+        WARN(("the fist buffer is not command!"));
+        return VERR_INVALID_PARAMETER;
+    }
     PVBOXUHGSMI_PRIVATE_KMT pPrivate = VBOXUHGSMIKMT_GET(pHgsmi);
     D3DKMT_ESCAPE DdiEscape = {0};
@@ -405,5 +400,5 @@
         PVBOXUHGSMI_BUFFER_PRIVATE_KMT_ESC pBuf = VBOXUHGSMIKMTESC_GET_BUFFER(pBufInfo->pBuf);
         pSubmInfo->hAlloc = pBuf->Alloc.hAlloc;
-        pSubmInfo->Info.fSubFlags = pBufInfo->fFlags;
+        pSubmInfo->Info.bDoNotSignalCompletion = 0;
         if (pBufInfo->fFlags.bEntireBuffer)
         {
@@ -421,5 +416,9 @@
     if (NT_SUCCESS(Status))
     {
-        return VINF_SUCCESS;
+        DWORD dwResult = WaitForSingleObject(hSynch, INFINITE);
+        if (dwResult == WAIT_OBJECT_0)
+            return VINF_SUCCESS;
+        WARN(("wait failed, (0x%x)", dwResult));
+        return VERR_GENERAL_FAILURE;
     }
     else
@@ -570,5 +569,5 @@
 {
     pHgsmi->BasePrivate.Base.pfnBufferCreate = vboxUhgsmiKmtBufferCreate;
-    pHgsmi->BasePrivate.Base.pfnBufferSubmitAsynch = vboxUhgsmiKmtBufferSubmitAsynch;
+    pHgsmi->BasePrivate.Base.pfnBufferSubmit = vboxUhgsmiKmtBufferSubmit;
     pHgsmi->BasePrivate.pfnCtlConCall = vboxCrHhgsmiKmtEscCtlConCall;
     pHgsmi->BasePrivate.pfnCtlConGetClientID = vboxCrHhgsmiKmtEscCtlConGetClientID;
@@ -582,5 +581,5 @@
 {
     pHgsmi->BasePrivate.Base.pfnBufferCreate = vboxUhgsmiKmtEscBufferCreate;
-    pHgsmi->BasePrivate.Base.pfnBufferSubmitAsynch = vboxUhgsmiKmtEscBufferSubmitAsynch;
+    pHgsmi->BasePrivate.Base.pfnBufferSubmit = vboxUhgsmiKmtEscBufferSubmit;
     pHgsmi->BasePrivate.pfnCtlConCall = vboxCrHhgsmiKmtEscCtlConCall;
     pHgsmi->BasePrivate.pfnCtlConGetClientID = vboxCrHhgsmiKmtEscCtlConGetClientID;
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPMisc.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPMisc.cpp	(revision 41057)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPMisc.cpp	(revision 41058)
@@ -949,10 +949,6 @@
     VBOXWDDM_HANDLE hSessionHandle;
     PVBOXVIDEOCM_ALLOC pAlloc;
-    union
-    {
-        PKEVENT pSynchEvent;
-        PRKSEMAPHORE pSynchSemaphore;
-    };
-    VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType;
+    PKEVENT pSynchEvent;
+    VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType;
     volatile uint32_t cRefs;
     MDL Mdl;
@@ -1038,36 +1034,13 @@
     PVBOXVIDEOCM_ALLOC_MGR pMgr = pContext->pMgr;
     NTSTATUS Status = STATUS_SUCCESS;
-
-    union
-    {
-        PKEVENT pSynchEvent;
-        PRKSEMAPHORE pSynchSemaphore;
-    };
-
-    switch (pUmAlloc->enmSynchType)
-    {
-        case VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT:
-            Status = ObReferenceObjectByHandle((HANDLE)pUmAlloc->hSynch, EVENT_MODIFY_STATE, *ExEventObjectType, UserMode,
-                    (PVOID*)&pSynchEvent,
-                    NULL);
-            Assert(Status == STATUS_SUCCESS);
-            Assert(pSynchEvent);
-            break;
-        case VBOXUHGSMI_SYNCHOBJECT_TYPE_SEMAPHORE:
-            Status = ObReferenceObjectByHandle((HANDLE)pUmAlloc->hSynch, EVENT_MODIFY_STATE, *ExSemaphoreObjectType, UserMode,
-                    (PVOID*)&pSynchSemaphore,
-                    NULL);
-            Assert(Status == STATUS_SUCCESS);
-            Assert(pSynchSemaphore);
-            break;
-        case VBOXUHGSMI_SYNCHOBJECT_TYPE_NONE:
-            pSynchEvent = NULL;
-            Status = STATUS_SUCCESS;
-            break;
-        default:
-            LOGREL(("ERROR: invalid synch info type(%d)", pUmAlloc->enmSynchType));
-            AssertBreakpoint();
-            Status = STATUS_INVALID_PARAMETER;
-            break;
+    PKEVENT pSynchEvent = NULL;
+
+    if (pUmAlloc->hSynch)
+    {
+        Status = ObReferenceObjectByHandle((HANDLE)pUmAlloc->hSynch, EVENT_MODIFY_STATE, *ExEventObjectType, UserMode,
+                (PVOID*)&pSynchEvent,
+                NULL);
+        Assert(Status == STATUS_SUCCESS);
+        Assert(pSynchEvent);
     }
 
@@ -1102,5 +1075,5 @@
                     pAllocRef->pContext = pContext;
                     pAllocRef->pAlloc = pAlloc;
-                    pAllocRef->enmSynchType = pUmAlloc->enmSynchType;
+                    pAllocRef->fUhgsmiType = pUmAlloc->fUhgsmiType;
                     pAllocRef->pSynchEvent = pSynchEvent;
                     ExAcquireFastMutex(&pContext->Mutex);
@@ -1133,7 +1106,5 @@
 
         if (pSynchEvent)
-        {
             ObDereferenceObject(pSynchEvent);
-        }
     }
     else
@@ -1160,7 +1131,5 @@
         *ppAlloc = pAllocRef->pAlloc;
         if (pAllocRef->pSynchEvent)
-        {
             ObDereferenceObject(pAllocRef->pSynchEvent);
-        }
         vboxWddmMemFree(pAllocRef);
     }
@@ -1244,24 +1213,10 @@
     {
         VBOXVDMACMD_CHROMIUM_BUFFER *pBufCmd = &pBody->aBuffers[i];
-        PVBOXVIDEOCM_ALLOC_REF pRef = (PVBOXVIDEOCM_ALLOC_REF)pBufCmd->u64GuesData;
-        if (!pBufCmd->u32GuesData)
+        PVBOXVIDEOCM_ALLOC_REF pRef = (PVBOXVIDEOCM_ALLOC_REF)pBufCmd->u64GuestData;
+        if (!pBufCmd->u32GuestData)
         {
             /* signal completion */
-            switch (pRef->enmSynchType)
-            {
-                case VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT:
-                    KeSetEvent(pRef->pSynchEvent, 3, FALSE);
-                    break;
-                case VBOXUHGSMI_SYNCHOBJECT_TYPE_SEMAPHORE:
-                    KeReleaseSemaphore(pRef->pSynchSemaphore,
-                        3,
-                        1,
-                        FALSE);
-                    break;
-                case VBOXUHGSMI_SYNCHOBJECT_TYPE_NONE:
-                    break;
-                default:
-                    Assert(0);
-            }
+            if (pRef->pSynchEvent)
+                KeSetEvent(pRef->pSynchEvent, 3, FALSE);
         }
 
@@ -1310,6 +1265,6 @@
                 pBufCmd->offBuffer = pRef->pAlloc->offData + pBufInfo->Info.offData;
                 pBufCmd->cbBuffer = pBufInfo->Info.cbData;
-                pBufCmd->u32GuesData = pBufInfo->Info.fSubFlags.bDoNotSignalCompletion;
-                pBufCmd->u64GuesData = (uint64_t)pRef;
+                pBufCmd->u32GuestData = pBufInfo->Info.bDoNotSignalCompletion;
+                pBufCmd->u64GuestData = (uint64_t)pRef;
             }
             else
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h	(revision 41057)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h	(revision 41058)
@@ -150,10 +150,6 @@
     AVLPVNODECORE ShRcTreeEntry;
 #endif
-    VBOXUHGSMI_SYNCHOBJECT_TYPE enmSynchType;
-    union
-    {
-        PKEVENT pSynchEvent;
-        PRKSEMAPHORE pSynchSemaphore;
-    };
+    VBOXUHGSMI_BUFFER_TYPE_FLAGS fUhgsmiType;
+    PKEVENT pSynchEvent;
 } VBOXWDDM_ALLOCATION, *PVBOXWDDM_ALLOCATION;
 
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp	(revision 41057)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp	(revision 41058)
@@ -1962,7 +1962,5 @@
         {
             if (pAllocation->pSynchEvent)
-            {
                 ObDereferenceObject(pAllocation->pSynchEvent);
-            }
             break;
         }
@@ -2151,32 +2149,15 @@
                 {
                     pAllocationInfo->Size = pAllocInfo->cbBuffer;
-                    pAllocation->enmSynchType = pAllocInfo->enmSynchType;
+                    pAllocation->fUhgsmiType = pAllocInfo->fUhgsmiType;
                     pAllocation->SurfDesc.cbSize = pAllocInfo->cbBuffer;
                     pAllocationInfo->Flags.CpuVisible = 1;
 //                    pAllocationInfo->Flags.SynchronousPaging = 1;
                     pAllocationInfo->AllocationPriority = D3DDDI_ALLOCATIONPRIORITY_MAXIMUM;
-                    switch (pAllocInfo->enmSynchType)
+                    if (pAllocInfo->hSynch)
                     {
-                        case VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT:
-                            Status = ObReferenceObjectByHandle((HANDLE)pAllocInfo->hSynch, EVENT_MODIFY_STATE, *ExEventObjectType, UserMode,
-                                    (PVOID*)&pAllocation->pSynchEvent,
-                                    NULL);
-                            Assert(Status == STATUS_SUCCESS);
-                            break;
-                        case VBOXUHGSMI_SYNCHOBJECT_TYPE_SEMAPHORE:
-                            Status = ObReferenceObjectByHandle((HANDLE)pAllocInfo->hSynch, EVENT_MODIFY_STATE, *ExSemaphoreObjectType, UserMode,
-                                    (PVOID*)&pAllocation->pSynchSemaphore,
-                                    NULL);
-                            Assert(Status == STATUS_SUCCESS);
-                            break;
-                        case VBOXUHGSMI_SYNCHOBJECT_TYPE_NONE:
-                            pAllocation->pSynchEvent = NULL;
-                            Status = STATUS_SUCCESS;
-                            break;
-                        default:
-                            LOGREL(("ERROR: invalid synch info type(%d)", pAllocInfo->enmSynchType));
-                            AssertBreakpoint();
-                            Status = STATUS_INVALID_PARAMETER;
-                            break;
+                        Status = ObReferenceObjectByHandle((HANDLE)pAllocInfo->hSynch, EVENT_MODIFY_STATE, *ExEventObjectType, UserMode,
+                                (PVOID*)&pAllocation->pSynchEvent,
+                                NULL);
+                        Assert(Status == STATUS_SUCCESS);
                     }
                     break;
@@ -2763,24 +2744,10 @@
     {
         VBOXVDMACMD_CHROMIUM_BUFFER *pBufCmd = &pBody->aBuffers[i];
-        if (!pBufCmd->u32GuesData)
+        if (!pBufCmd->u32GuestData)
         {
             /* signal completion */
-            PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pBufCmd->u64GuesData;
-            switch (pAlloc->enmSynchType)
-            {
-                case VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT:
-                    KeSetEvent(pAlloc->pSynchEvent, 3, FALSE);
-                    break;
-                case VBOXUHGSMI_SYNCHOBJECT_TYPE_SEMAPHORE:
-                    KeReleaseSemaphore(pAlloc->pSynchSemaphore,
-                        3,
-                        1,
-                        FALSE);
-                    break;
-                case VBOXUHGSMI_SYNCHOBJECT_TYPE_NONE:
-                    break;
-                default:
-                    Assert(0);
-            }
+            PVBOXWDDM_ALLOCATION pAlloc = (PVBOXWDDM_ALLOCATION)pBufCmd->u64GuestData;
+            if (pAlloc->pSynchEvent)
+                KeSetEvent(pAlloc->pSynchEvent, 3, FALSE);
         }
     }
@@ -3035,6 +3002,6 @@
                 pBufCmd->offBuffer = pBufInfo->Alloc.offAlloc;
                 pBufCmd->cbBuffer = pBufInfo->cbData;
-                pBufCmd->u32GuesData = pBufInfo->bDoNotSignalCompletion;
-                pBufCmd->u64GuesData = (uint64_t)pBufInfo->Alloc.pAlloc;
+                pBufCmd->u32GuestData = pBufInfo->bDoNotSignalCompletion;
+                pBufCmd->u64GuestData = (uint64_t)pBufInfo->Alloc.pAlloc;
             }
 
@@ -5136,5 +5103,5 @@
 
                 pSubmInfo->cbData = pSubmUmInfo->cbData;
-                pSubmInfo->bDoNotSignalCompletion = pSubmUmInfo->fSubFlags.bDoNotSignalCompletion;
+                pSubmInfo->bDoNotSignalCompletion = pSubmUmInfo->bDoNotSignalCompletion;
 
                 pPLL->AllocationIndex = i;
Index: /trunk/src/VBox/GuestHost/OpenGL/util/vboxhgcm.c
===================================================================
--- /trunk/src/VBox/GuestHost/OpenGL/util/vboxhgcm.c	(revision 41057)
+++ /trunk/src/VBox/GuestHost/OpenGL/util/vboxhgcm.c	(revision 41058)
@@ -247,16 +247,13 @@
 {
     int rc;
+    VBOXUHGSMI_BUFFER_TYPE_FLAGS Flags = {0};
     pClient->pHgsmi = pHgsmi;
-    rc = pHgsmi->pfnBufferCreate(pHgsmi, CRVBOXHGSMI_PAGE_ALIGN(1),
-                            VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT,
-                            NULL,
-                            &pClient->pCmdBuffer);
+    Flags.fCommand = 1;
+    rc = pHgsmi->pfnBufferCreate(pHgsmi, CRVBOXHGSMI_PAGE_ALIGN(1), Flags, &pClient->pCmdBuffer);
     AssertRC(rc);
     if (RT_SUCCESS(rc))
     {
-        rc = pHgsmi->pfnBufferCreate(pHgsmi, CRVBOXHGSMI_PAGE_ALIGN(1),
-                                        VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT,
-                                        NULL,
-                                        &pClient->pHGBuffer);
+        Flags.Value = 0;
+        rc = pHgsmi->pfnBufferCreate(pHgsmi, CRVBOXHGSMI_PAGE_ALIGN(1), Flags, &pClient->pHGBuffer);
         AssertRC(rc);
         if (RT_SUCCESS(rc))
@@ -373,10 +370,9 @@
     if (!buf)
     {
+        VBOXUHGSMI_BUFFER_TYPE_FLAGS Flags = {0};
         crDebug("Buffer pool %p was empty; allocating new %d byte buffer.",
                         (void *) pClient->bufpool,
                         cbSize);
-        rc = pClient->pHgsmi->pfnBufferCreate(pClient->pHgsmi, cbSize,
-                                VBOXUHGSMI_SYNCHOBJECT_TYPE_NONE, NULL,
-                                &buf);
+        rc = pClient->pHgsmi->pfnBufferCreate(pClient->pHgsmi, cbSize, Flags, &buf);
         AssertRC(rc);
         if (RT_FAILURE(rc))
@@ -529,16 +525,4 @@
 //                                                       * which is needed for getting the result */
 }
-
-#ifdef RT_OS_WINDOWS
-#define CRVBOXHGSMI_BUF_WAIT(_pBub) WaitForSingleObject((_pBub)->hSynch, INFINITE);
-#else
-# error "Port Me!!"
-#endif
-
-DECLINLINE(void) _crVBoxHGSMIWaitCmd(PCRVBOXHGSMI_CLIENT pClient)
-{
-    int rc = CRVBOXHGSMI_BUF_WAIT(pClient->pCmdBuffer);
-    CRASSERT(rc == 0);
-}
 #endif
 
@@ -1845,13 +1829,11 @@
     aSubmit[1].fFlags.bHostWriteOnly = 1;
 
-    rc = pClient->pHgsmi->pfnBufferSubmitAsynch(pClient->pHgsmi, aSubmit, 2);
+    rc = pClient->pHgsmi->pfnBufferSubmit(pClient->pHgsmi, aSubmit, 2);
     AssertRC(rc);
     if (RT_FAILURE(rc))
     {
-        crError("pfnBufferSubmitAsynch failed with %d \n", rc);
+        crError("pfnBufferSubmit failed with %d \n", rc);
         return;
     }
-
-    _crVBoxHGSMIWaitCmd(pClient);
 
     parms = (CRVBOXHGSMIREAD *)_crVBoxHGSMICmdBufferLockRo(pClient, sizeof (*parms));
@@ -1979,13 +1961,11 @@
         aSubmit[2].fFlags.Value = 0;
 
-        rc = pClient->pHgsmi->pfnBufferSubmitAsynch(pClient->pHgsmi, aSubmit, 3);
+        rc = pClient->pHgsmi->pfnBufferSubmit(pClient->pHgsmi, aSubmit, 3);
         AssertRC(rc);
         if (RT_FAILURE(rc))
         {
-            crError("pfnBufferSubmitAsynch failed with %d \n", rc);
+            crError("pfnBufferSubmit failed with %d \n", rc);
             break;
         }
-
-        _crVBoxHGSMIWaitCmd(pClient);
 
         parms = (CRVBOXHGSMIWRITEREAD *)_crVBoxHGSMICmdBufferLockRo(pClient, sizeof (*parms));
@@ -2015,4 +1995,5 @@
             else if (VERR_BUFFER_OVERFLOW == rc)
             {
+                VBOXUHGSMI_BUFFER_TYPE_FLAGS Flags = {0};
                 PVBOXUHGSMI_BUFFER pOldBuf = pClient->pHGBuffer;
                 CRASSERT(!pClient->pvHGBuffer);
@@ -2020,6 +2001,5 @@
                 crDebug("Reallocating host buffer from %d to %d bytes", conn->cbHostBufferAllocated, cbWriteback);
 
-                rc = pClient->pHgsmi->pfnBufferCreate(pClient->pHgsmi, CRVBOXHGSMI_PAGE_ALIGN(cbWriteback),
-                                VBOXUHGSMI_SYNCHOBJECT_TYPE_NONE, NULL, &pClient->pHGBuffer);
+                rc = pClient->pHgsmi->pfnBufferCreate(pClient->pHgsmi, CRVBOXHGSMI_PAGE_ALIGN(cbWriteback), Flags, &pClient->pHGBuffer);
                 AssertRC(rc);
                 if (RT_SUCCESS(rc))
@@ -2090,14 +2070,8 @@
         aSubmit[1].fFlags.bHostReadOnly = 1;
 
-        rc = pClient->pHgsmi->pfnBufferSubmitAsynch(pClient->pHgsmi, aSubmit, 2);
+        rc = pClient->pHgsmi->pfnBufferSubmit(pClient->pHgsmi, aSubmit, 2);
         AssertRC(rc);
         if (RT_SUCCESS(rc))
         {
-            _crVBoxHGSMIWaitCmd(pClient);
-                /* @todo: do we need to wait for completion actually?
-                 * NOTE: in case we do not need completion,
-                 * we MUST specify bDoNotSignalCompletion flag for the command buffer */
-//                CRVBOXHGSMI_BUF_WAIT(pClient->pCmdBuffer);
-
             callRes = _crVBoxHGSMICmdBufferGetRc(pClient);
         }
@@ -2105,5 +2079,5 @@
         {
             /* we can not recover at this point, report error & exit */
-            crError("pfnBufferSubmitAsynch failed with %d \n", rc);
+            crError("pfnBufferSubmit failed with %d \n", rc);
         }
     }
@@ -2129,14 +2103,8 @@
         aSubmit[1].fFlags.bHostReadOnly = 1;
 
-        rc = pClient->pHgsmi->pfnBufferSubmitAsynch(pClient->pHgsmi, aSubmit, 2);
+        rc = pClient->pHgsmi->pfnBufferSubmit(pClient->pHgsmi, aSubmit, 2);
         AssertRC(rc);
         if (RT_SUCCESS(rc))
         {
-            _crVBoxHGSMIWaitCmd(pClient);
-                /* @todo: do we need to wait for completion actually?
-                 * NOTE: in case we do not need completion,
-                 * we MUST specify bDoNotSignalCompletion flag for the command buffer */
-//                CRVBOXHGSMI_BUF_WAIT(pClient->pCmdBuffer);
-
             callRes = _crVBoxHGSMICmdBufferGetRc(pClient);
         }
