Index: /trunk/include/VBox/VBoxCrHgsmi.h
===================================================================
--- /trunk/include/VBox/VBoxCrHgsmi.h	(revision 42500)
+++ /trunk/include/VBox/VBoxCrHgsmi.h	(revision 42501)
@@ -39,26 +39,7 @@
 #endif
 
-#ifdef VBOX_CRHGSMI_WITH_D3DDEV
-typedef void * HVBOXCRHGSMI_CLIENT;
-
-typedef DECLCALLBACK(HVBOXCRHGSMI_CLIENT) FNVBOXCRHGSMI_CLIENT_CREATE(PVBOXUHGSMI pHgsmi);
-typedef FNVBOXCRHGSMI_CLIENT_CREATE *PFNVBOXCRHGSMI_CLIENT_CREATE;
-
-typedef DECLCALLBACK(void) FNVBOXCRHGSMI_CLIENT_DESTROY(HVBOXCRHGSMI_CLIENT hClient);
-typedef FNVBOXCRHGSMI_CLIENT_DESTROY *PFNVBOXCRHGSMI_CLIENT_DESTROY;
-
-typedef struct VBOXCRHGSMI_CALLBACKS
-{
-    PFNVBOXCRHGSMI_CLIENT_CREATE pfnClientCreate;
-    PFNVBOXCRHGSMI_CLIENT_DESTROY pfnClientDestroy;
-} VBOXCRHGSMI_CALLBACKS, *PVBOXCRHGSMI_CALLBACKS;
-
-VBOXCRHGSMI_DECL(int) VBoxCrHgsmiInit(PVBOXCRHGSMI_CALLBACKS pCallbacks);
-VBOXCRHGSMI_DECL(HVBOXCRHGSMI_CLIENT) VBoxCrHgsmiQueryClient();
-#else
-VBOXCRHGSMI_DECL(int) VBoxCrHgsmiInit(uint32_t crVersionMajor, uint32_t crVersionMinor);
+VBOXCRHGSMI_DECL(int) VBoxCrHgsmiInit();
 VBOXCRHGSMI_DECL(PVBOXUHGSMI) VBoxCrHgsmiCreate(void);
 VBOXCRHGSMI_DECL(void) VBoxCrHgsmiDestroy(PVBOXUHGSMI pHgsmi);
-#endif
 VBOXCRHGSMI_DECL(int) VBoxCrHgsmiTerm(void);
 
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/Makefile.kmk	(revision 42500)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/Makefile.kmk	(revision 42501)
@@ -107,5 +107,6 @@
 VBoxDispD3D_INCS     = \
 	../../../include \
-	..
+	.. \
+	$(VBOX_PATH_CROGL_INCLUDE)
 VBoxDispD3D_SOURCES  = \
 	wddm/VBoxDispD3D.cpp \
@@ -118,16 +119,14 @@
 	wddm/VBoxDispDbg.cpp \
 	wddm/VBoxDispD3D.rc \
-	wddm/VBoxDispD3D.def \
-#ifdef VBOX_WITH_CRHGSMI
-#VBoxDispD3D_SOURCES += \
-#    wddm/VBoxUhgsmiDisp.cpp \
-#    wddm/VBoxUhgsmiKmt.cpp
-#VBoxDispD3D_DEFS   += VBOX_WITH_CRHGSMI
-#endif
+	wddm/VBoxDispD3D.def
+ifdef VBOX_WITH_CRHGSMI
+VBoxDispD3D_DEFS   += VBOX_WITH_CRHGSMI
+endif
 VBoxDispD3D_LIBS     = \
 	$(VBOX_LIB_IPRT_GUEST_R3) \
 	$(VBOX_LIB_VBGL_R3) \
 	Psapi.lib \
-	$(VBOX_PATH_ADDITIONS_LIB)/VBoxDispMpLogger$(VBOX_SUFF_LIB)
+	$(VBOX_PATH_ADDITIONS_LIB)/VBoxDispMpLogger$(VBOX_SUFF_LIB) \
+	$(VBOX_PATH_ADDITIONS_LIB)/VBoxCrHgsmi$(VBOX_SUFF_LIB)
 
 #
@@ -141,5 +140,6 @@
 	$(VBOX_LIB_VBGL_R3_X86) \
 	Psapi.lib \
-	$(VBOX_PATH_ADDITIONS_LIB)/VBoxDispMpLogger-x86$(VBOX_SUFF_LIB)
+	$(VBOX_PATH_ADDITIONS_LIB)/VBoxDispMpLogger-x86$(VBOX_SUFF_LIB) \
+	$(VBOX_PATH_ADDITIONS_LIB)/VBoxCrHgsmi-x86$(VBOX_SUFF_LIB)
 VBoxDispD3D-x86_DEFS = $(VBoxDispD3D_DEFS) VBOX_WDDM_WOW64
 
@@ -151,11 +151,14 @@
 VBoxCrHgsmi_TEMPLATE    = VBOXGUESTR3LIB
 VBoxCrHgsmi_SDKS        = ReorderCompilerIncs $(VBOX_WINDDK_GST_WLH)
-VBoxCrHgsmi_DEFS        = UNICODE _UNICODE VBOX_WITH_CRHGSMI IN_VBOXCRHGSMI VBOX_WITH_WDDM VBOX_WITH_VDMA VBOX_WITH_HGCM
-VBoxCrHgsmi_INCS        = ../../../include ..
+#use same defines as VBoxDispD3D to ensure structure definitions match
+VBoxCrHgsmi_DEFS        = $(subst VBOXWDDMDISP,IN_VBOXCRHGSMI,$(VBoxDispD3D_DEFS))
+VBoxCrHgsmi_INCS        = ../../../include .. $(VBOX_PATH_CROGL_INCLUDE)
 VBoxCrHgsmi_SOURCES     = \
 	wddm/VBoxCrHgsmi.cpp \
 	wddm/VBoxDispKmt.cpp \
 	wddm/VBoxDispDbg.cpp \
-	wddm/VBoxUhgsmiKmt.cpp
+	wddm/VBoxUhgsmiKmt.cpp \
+	wddm/VBoxUhgsmiBase.cpp \
+	wddm/VBoxUhgsmiDisp.cpp
 
 #
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp	(revision 42500)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp	(revision 42501)
@@ -806,169 +806,7 @@
 
 
-#ifdef VBOX_WITH_CRHGSMI
-/* cr hgsmi */
-static VBOXCRHGSMI_CALLBACKS g_VBoxCrHgsmiCallbacks = {0};
-#define VBOXUHGSMIKMT_PERTHREAD
-#ifdef VBOXUHGSMIKMT_PERTHREAD
-#define VBOXUHGSMIKMT_VAR(_type) __declspec(thread) _type
-#else
-#define VBOXUHGSMIKMT_VAR(_type) _type
-#endif
-static VBOXUHGSMIKMT_VAR(VBOXUHGSMI_PRIVATE_KMT) g_VBoxUhgsmiKmt;
-static VBOXUHGSMIKMT_VAR(uint32_t) g_cVBoxUhgsmiKmtRefs = 0;
-#endif
-
-#ifdef VBOX_WITH_CRHGSMI
-static __declspec(thread) PVBOXUHGSMI_PRIVATE_BASE gt_pHgsmi = NULL;
-
-VBOXWDDMDISP_DECL(int) VBoxDispCrHgsmiInit(PVBOXCRHGSMI_CALLBACKS pCallbacks)
-{
-#ifdef VBOX_WITH_CRHGSMI
-    vboxDispLock(); /* the lock is needed here only to ensure callbacks are not initialized & used concurrently
-                     * @todo: make a separate call used to init the per-thread info and make the VBoxDispCrHgsmiInit be called only once */
-    g_VBoxCrHgsmiCallbacks = *pCallbacks;
-    PVBOXUHGSMI_PRIVATE_BASE pHgsmi = gt_pHgsmi;
-#ifdef DEBUG_misha
-    Assert(pHgsmi);
-#endif
-    if (pHgsmi)
-    {
-        if (!pHgsmi->hClient)
-        {
-            pHgsmi->hClient = g_VBoxCrHgsmiCallbacks.pfnClientCreate(&pHgsmi->Base);
-            Assert(pHgsmi->hClient);
-        }
-    }
-    vboxDispUnlock();
-#endif
-    return VINF_SUCCESS;
-}
-
-VBOXWDDMDISP_DECL(int) VBoxDispCrHgsmiTerm()
-{
-    return VINF_SUCCESS;
-}
-
-VBOXWDDMDISP_DECL(HVBOXCRHGSMI_CLIENT) VBoxDispCrHgsmiQueryClient()
-{
-#ifdef VBOX_WITH_CRHGSMI
-    PVBOXUHGSMI_PRIVATE_BASE pHgsmi = gt_pHgsmi;
-#ifdef DEBUG_misha
-    Assert(pHgsmi);
-#endif
-    if (pHgsmi)
-    {
-        Assert(pHgsmi->hClient);
-        return pHgsmi->hClient;
-    }
-#endif
-    return NULL;
-}
-
-static HRESULT vboxUhgsmiGlobalRetain()
-{
-    HRESULT hr = S_OK;
-    vboxDispLock();
-    if (!g_cVBoxUhgsmiKmtRefs)
-    {
-        hr = vboxUhgsmiKmtCreate(&g_VBoxUhgsmiKmt, TRUE);
-        Assert(hr == S_OK);
-        /* can not do it here because callbacks may not be set yet
-         * @todo: need to call the cr lib from here to get the callbacks
-         * rather than making the cr lib call us */
-//        if (hr == S_OK)
-//        {
-//            g_VBoxUhgsmiKmt.BasePrivate.hClient = g_VBoxCrHgsmiCallbacks.pfnClientCreate(&g_VBoxUhgsmiKmt.BasePrivate.Base);
-//            Assert(g_VBoxUhgsmiKmt.BasePrivate.hClient);
-//        }
-    }
-
-    if (hr == S_OK)
-    {
-        ++g_cVBoxUhgsmiKmtRefs;
-    }
-    vboxDispUnlock();
-
-    return hr;
-}
-
-static HRESULT vboxUhgsmiGlobalRelease()
-{
-    HRESULT hr = S_OK;
-    vboxDispLock();
-    --g_cVBoxUhgsmiKmtRefs;
-    if (!g_cVBoxUhgsmiKmtRefs)
-    {
-        if (g_VBoxUhgsmiKmt.BasePrivate.hClient)
-            g_VBoxCrHgsmiCallbacks.pfnClientDestroy(g_VBoxUhgsmiKmt.BasePrivate.hClient);
-        hr = vboxUhgsmiKmtDestroy(&g_VBoxUhgsmiKmt);
-        Assert(hr == S_OK);
-    }
-    vboxDispUnlock();
-    return hr;
-}
-
-DECLINLINE(void) vboxDispCrHgsmiClientSet(PVBOXUHGSMI_PRIVATE_BASE pHgsmi)
-{
-    gt_pHgsmi = pHgsmi;
-}
-
-DECLINLINE(void) vboxDispCrHgsmiClientClear()
-{
-    gt_pHgsmi = NULL;
-}
-
-HRESULT vboxUhgsmiGlobalSetCurrent()
-{
-    HRESULT hr = vboxUhgsmiGlobalRetain();
-    Assert(hr == S_OK);
-    if (hr == S_OK)
-        vboxDispCrHgsmiClientSet(&g_VBoxUhgsmiKmt.BasePrivate);
-    return hr;
-}
-
-HRESULT vboxUhgsmiGlobalClearCurrent()
-{
-    vboxUhgsmiGlobalRelease();
-    vboxDispCrHgsmiClientClear();
-    return S_OK;
-}
-
-class VBoxDispCrHgsmiScope
-{
-public:
-    VBoxDispCrHgsmiScope(PVBOXUHGSMI_PRIVATE_BASE pHgsmi)
-    {
-        vboxDispCrHgsmiClientSet(pHgsmi);
-    }
-
-    ~VBoxDispCrHgsmiScope()
-    {
-        vboxDispCrHgsmiClientClear();
-    }
-private:
-};
-
-#define VBOXDISPCRHGSMI_SCOPE_SET_DEV(_pDev) VBoxDispCrHgsmiScope __vboxCrHgsmiScope(&(_pDev)->Uhgsmi.BasePrivate)
-#define VBOXDISPCRHGSMI_SCOPE_SET_GLOBAL() VBoxDispCrHgsmiScope __vboxCrHgsmiScope(&g_VBoxUhgsmiKmt.BasePrivate)
-#else
 #define VBOXDISPCRHGSMI_SCOPE_SET_DEV(_pDev) do {} while(0)
 #define VBOXDISPCRHGSMI_SCOPE_SET_GLOBAL() do {} while(0)
 
-VBOXWDDMDISP_DECL(int) VBoxDispCrHgsmiInit(void*)
-{
-    return VERR_NOT_IMPLEMENTED;
-}
-
-VBOXWDDMDISP_DECL(int) VBoxDispCrHgsmiTerm()
-{
-    return VERR_NOT_IMPLEMENTED;
-}
-
-VBOXWDDMDISP_DECL(void*) VBoxDispCrHgsmiQueryClient()
-{
-    return NULL;
-}
-#endif
 
 typedef struct VBOXWDDMDISP_NSCADD
@@ -2638,6 +2476,7 @@
     if (!bReuseSwapchain)
     {
-        D3DPRESENT_PARAMETERS Params;
-        vboxWddmSwapchainFillParams(pSwapchain, &Params);
+        VBOXWINEEX_D3DPRESENT_PARAMETERS Params;
+        vboxWddmSwapchainFillParams(pSwapchain, &Params.Base);
+        Params.pHgsmi = NULL;
 
         if (hr == S_OK)
@@ -2645,8 +2484,8 @@
             DWORD fFlags = D3DCREATE_HARDWARE_VERTEXPROCESSING;
 
-            Params.hDeviceWindow = NULL;
+            Params.Base.hDeviceWindow = NULL;
                         /* @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.Base.Windowed = TRUE;
             //            params.EnableAutoDepthStencil = FALSE;
             //            params.AutoDepthStencilFormat = D3DFMT_UNKNOWN;
@@ -2656,10 +2495,11 @@
             if (!pDevice->pDevice9If)
             {
-                hr = pAdapter->pD3D9If->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, NULL, fFlags, &Params, &pDevice9If);
+                Params.pHgsmi = &pDevice->Uhgsmi.BasePrivate.Base;
+                hr = pAdapter->pD3D9If->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, NULL, fFlags, &Params.Base, &pDevice9If);
                 Assert(hr == S_OK);
                 if (hr == S_OK)
                 {
-                    Assert(Params.hDeviceWindow);
-                    pSwapchain->hWnd = Params.hDeviceWindow;
+                    Assert(Params.Base.hDeviceWindow);
+                    pSwapchain->hWnd = Params.Base.hDeviceWindow;
                     pDevice->pDevice9If = pDevice9If;
                     hr = pDevice9If->GetSwapChain(0, &pNewIf);
@@ -2691,12 +2531,12 @@
                 /* re-use swapchain window
                  * this will invalidate the previusly used swapchain */
-                Params.hDeviceWindow = pSwapchain->hWnd;
-
-                hr = pDevice->pDevice9If->CreateAdditionalSwapChain(&Params, &pNewIf);
+                Params.Base.hDeviceWindow = pSwapchain->hWnd;
+
+                hr = pDevice->pDevice9If->CreateAdditionalSwapChain(&Params.Base, &pNewIf);
                 Assert(hr == S_OK);
                 if (hr == S_OK)
                 {
-                    Assert(Params.hDeviceWindow);
-                    pSwapchain->hWnd = Params.hDeviceWindow;
+                    Assert(Params.Base.hDeviceWindow);
+                    pSwapchain->hWnd = Params.Base.hDeviceWindow;
                     Assert(pNewIf);
                 }
@@ -6789,11 +6629,4 @@
         vboxWddmSwapchainDestroyAll(pDevice);
     }
-
-#ifdef VBOX_WITH_CRHGSMI
-    vboxDispLock();
-    if (pDevice->Uhgsmi.BasePrivate.hClient)
-        g_VBoxCrHgsmiCallbacks.pfnClientDestroy(pDevice->Uhgsmi.BasePrivate.hClient);
-    vboxDispUnlock();
-#endif
 
     HRESULT hr = vboxDispCmCtxDestroy(pDevice, &pDevice->DefaultContext);
@@ -7443,9 +7276,4 @@
                     && !pCreateData->PatchLocationListSize)
             {
-#ifdef VBOX_WITH_CRHGSMI
-                hr = vboxUhgsmiD3DInit(&pDevice->Uhgsmi, pDevice);
-                Assert(hr == S_OK);
-                if (hr == S_OK)
-#endif
                 {
                     VBOXDISPCRHGSMI_SCOPE_SET_DEV(pDevice);
@@ -7537,8 +7365,4 @@
         pAdapter->pD3D9If->Release();
         VBoxDispD3DClose(&pAdapter->D3D);
-
-#ifdef VBOX_WITH_CRHGSMI
-        vboxUhgsmiGlobalRelease();
-#endif
     }
 
@@ -7668,9 +7492,4 @@
             do
             {
-#ifdef VBOX_WITH_CRHGSMI
-                hr = vboxUhgsmiGlobalRetain();
-                Assert(hr == S_OK);
-                if (hr == S_OK)
-#endif
                 {
                     VBOXDISPCRHGSMI_SCOPE_SET_GLOBAL();
@@ -7709,7 +7528,5 @@
                     else
                         vboxVDbgPrintR((__FUNCTION__": VBoxDispD3DOpen failed, hr (%d)\n", hr));
-#ifdef VBOX_WITH_CRHGSMI
-                    vboxUhgsmiGlobalRelease();
-#endif
+
                 }
             } while (0);
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D64.def
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D64.def	(revision 42500)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D64.def	(revision 42501)
@@ -20,5 +20,2 @@
 	OpenAdapter
 	VBoxDispMpGetCallbacks
-    VBoxDispCrHgsmiInit
-    VBoxDispCrHgsmiTerm
-    VBoxDispCrHgsmiQueryClient
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiDisp.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiDisp.h	(revision 42500)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiDisp.h	(revision 42501)
@@ -29,7 +29,9 @@
 } VBOXUHGSMI_PRIVATE_D3D, *PVBOXUHGSMI_PRIVATE_D3D;
 
-HRESULT vboxUhgsmiD3DInit(PVBOXUHGSMI_PRIVATE_D3D pHgsmi, struct VBOXWDDMDISP_DEVICE *pDevice);
+#if 0
+void vboxUhgsmiD3DInit(PVBOXUHGSMI_PRIVATE_D3D pHgsmi, struct VBOXWDDMDISP_DEVICE *pDevice);
+#endif
 
-
+void vboxUhgsmiD3DEscInit(PVBOXUHGSMI_PRIVATE_D3D pHgsmi, struct VBOXWDDMDISP_DEVICE *pDevice);
 
 #endif /* #ifndef ___VBoxUhgsmiDisp_h__ */
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp	(revision 42500)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp	(revision 42501)
@@ -3924,5 +3924,5 @@
             case VBOXESC_UHGSMI_SUBMIT:
             {
-                /* submit UHGSMI command */
+                /* submit VBOXUHGSMI command */
                 PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext;
                 PVBOXDISPIFESCAPE_UHGSMI_SUBMIT pSubmit = (PVBOXDISPIFESCAPE_UHGSMI_SUBMIT)pEscapeHdr;
@@ -3943,5 +3943,5 @@
             case VBOXESC_UHGSMI_ALLOCATE:
             {
-                /* allocate UHGSMI buffer */
+                /* allocate VBOXUHGSMI buffer */
                 PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext;
                 PVBOXDISPIFESCAPE_UHGSMI_ALLOCATE pAlocate = (PVBOXDISPIFESCAPE_UHGSMI_ALLOCATE)pEscapeHdr;
@@ -3960,5 +3960,5 @@
             case VBOXESC_UHGSMI_DEALLOCATE:
             {
-                /* deallocate UHGSMI buffer */
+                /* deallocate VBOXUHGSMI buffer */
                 PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)pEscape->hContext;
                 PVBOXDISPIFESCAPE_UHGSMI_DEALLOCATE pDealocate = (PVBOXDISPIFESCAPE_UHGSMI_DEALLOCATE)pEscapeHdr;
