Index: /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp	(revision 30316)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp	(revision 30317)
@@ -36,4 +36,6 @@
 
 #define VBOXWDDMDISP_WITH_TMPWORKAROUND 1
+
+#define VBOXWDDMOVERLAY_TEST
 
 static FORMATOP gVBoxFormatOps3D[] = {
@@ -3011,5 +3013,8 @@
                     pAllocInfo->SurfDesc.height = pSurf->Height;
                     pAllocInfo->SurfDesc.format = pResource->Format;
-                    pAllocInfo->SurfDesc.bpp = vboxWddmCalcBitsPerPixel(pResource->Format);
+                    if (!vboxWddmFormatToFourcc(pResource->Format))
+                        pAllocInfo->SurfDesc.bpp = vboxWddmCalcBitsPerPixel(pResource->Format);
+                    else
+                        pAllocInfo->SurfDesc.bpp = 0;
 
                     if (pSurf->SysMemPitch)
@@ -3139,15 +3144,43 @@
     PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)hDevice;
     Assert(pDevice);
-    Assert(pDevice->pDevice9If);
+    HRESULT hr = S_OK;
+    if (VBOXDISPMODE_IS_3D(pDevice->pAdapter))
+    {
+        Assert(pDevice->pDevice9If);
 #if 0
-    HRESULT hr = pDevice->pDevice9If->Present(NULL, /* CONST RECT * pSourceRect */
-            NULL, /* CONST RECT * pDestRect */
-            NULL, /* HWND hDestWindowOverride */
-            NULL /*CONST RGNDATA * pDirtyRegion */
-            );
-    Assert(hr == S_OK);
-#else
-    HRESULT hr = S_OK;
+        hr = pDevice->pDevice9If->Present(NULL, /* CONST RECT * pSourceRect */
+                NULL, /* CONST RECT * pDestRect */
+                NULL, /* HWND hDestWindowOverride */
+                NULL /*CONST RGNDATA * pDirtyRegion */
+                );
+        Assert(hr == S_OK);
 #endif
+    }
+    else
+    {
+        D3DDDICB_PRESENT DdiPresent = {0};
+        if (pData->hSrcResource)
+        {
+            PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)pData->hSrcResource;
+            Assert(pRc->cAllocations > pData->SrcSubResourceIndex);
+            PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[pData->SrcSubResourceIndex];
+            Assert(pAlloc->hAllocation);
+            DdiPresent.hSrcAllocation = pAlloc->hAllocation;
+        }
+        if (pData->hDstResource)
+        {
+            PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)pData->hDstResource;
+            Assert(pRc->cAllocations > pData->DstSubResourceIndex);
+            PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[pData->DstSubResourceIndex];
+            Assert(pAlloc->hAllocation);
+            DdiPresent.hDstAllocation = pAlloc->hAllocation;
+        }
+        DdiPresent.hContext = pDevice->DefaultContext.ContextInfo.hContext;
+//        DdiPresent.BroadcastContextCount;
+//        DdiPresent.BroadcastContext[D3DDDI_MAX_BROADCAST_CONTEXT];
+
+        hr = pDevice->RtCallbacks.pfnPresentCb(pDevice->hDevice, &DdiPresent);
+        Assert(hr == S_OK);
+    }
     vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr));
     return hr;
@@ -3655,4 +3688,5 @@
         OverInfo.OverlayInfo.PrivateDriverDataSize = sizeof (OurInfo);
         OverInfo.hKernelOverlay = NULL; /* <-- out */
+#ifndef VBOXWDDMOVERLAY_TEST
         hr = pDevice->RtCallbacks.pfnCreateOverlayCb(pDevice->hDevice, &OverInfo);
         Assert(hr == S_OK);
@@ -3676,4 +3710,7 @@
             RTMemFree(pOverlay);
         }
+#else
+        pData->hOverlay = pOverlay;
+#endif
     }
     else
@@ -3709,7 +3746,9 @@
     OverInfo.OverlayInfo.pPrivateDriverData = &OurInfo;
     OverInfo.OverlayInfo.PrivateDriverDataSize = sizeof (OurInfo);
+#ifndef VBOXWDDMOVERLAY_TEST
     hr = pDevice->RtCallbacks.pfnUpdateOverlayCb(pDevice->hDevice, &OverInfo);
     Assert(hr == S_OK);
     if (hr == S_OK)
+#endif
     {
         Assert(!pAlloc->LockInfo.cLocks);
@@ -3743,7 +3782,9 @@
     OverInfo.pPrivateDriverData = &OurInfo;
     OverInfo.PrivateDriverDataSize = sizeof (OurInfo);
+#ifndef VBOXWDDMOVERLAY_TEST
     hr = pDevice->RtCallbacks.pfnFlipOverlayCb(pDevice->hDevice, &OverInfo);
     Assert(hr == S_OK);
     if (hr == S_OK)
+#endif
     {
         Assert(!pAlloc->LockInfo.cLocks);
@@ -3779,7 +3820,11 @@
     D3DDDICB_DESTROYOVERLAY OverInfo;
     OverInfo.hKernelOverlay = pOverlay->hOverlay;
+#ifndef VBOXWDDMOVERLAY_TEST
     HRESULT hr = pDevice->RtCallbacks.pfnDestroyOverlayCb(pDevice->hDevice, &OverInfo);
     Assert(hr == S_OK);
     if (hr == S_OK)
+#else
+    HRESULT hr = S_OK;
+#endif
     {
         RTMemFree(pOverlay);
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVhwa.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVhwa.cpp	(revision 30316)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVhwa.cpp	(revision 30317)
@@ -201,5 +201,5 @@
 }
 
-void vboxVHWAFreeHostInfo1(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD_QUERYINFO1* pInfo)
+void vboxVhwaFreeHostInfo1(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD_QUERYINFO1* pInfo)
 {
     VBOXVHWACMD* pCmd = VBOXVHWACMD_HEAD(pInfo);
@@ -207,5 +207,5 @@
 }
 
-void vboxVHWAFreeHostInfo2(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD_QUERYINFO2* pInfo)
+void vboxVhwaFreeHostInfo2(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD_QUERYINFO2* pInfo)
 {
     VBOXVHWACMD* pCmd = VBOXVHWACMD_HEAD(pInfo);
@@ -213,5 +213,5 @@
 }
 
-VBOXVHWACMD_QUERYINFO1* vboxVHWAQueryHostInfo1(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
+VBOXVHWACMD_QUERYINFO1* vboxVhwaQueryHostInfo1(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
 {
     VBOXVHWACMD* pCmd = vboxVhwaCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_QUERY_INFO1, sizeof(VBOXVHWACMD_QUERYINFO1));
@@ -221,5 +221,5 @@
     if (!pCmd)
     {
-        drprintf((0, "VBoxDISP::vboxVHWAQueryHostInfo1: vboxVHWACommandCreate failed\n"));
+        drprintf((0, "VBoxDISP::vboxVhwaQueryHostInfo1: vboxVhwaCommandCreate failed\n"));
         return NULL;
     }
@@ -245,5 +245,5 @@
 }
 
-VBOXVHWACMD_QUERYINFO2* vboxVHWAQueryHostInfo2(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, uint32_t numFourCC)
+VBOXVHWACMD_QUERYINFO2* vboxVhwaQueryHostInfo2(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, uint32_t numFourCC)
 {
     VBOXVHWACMD* pCmd = vboxVhwaCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_QUERY_INFO2, VBOXVHWAINFO2_SIZE(numFourCC));
@@ -252,5 +252,5 @@
     if (!pCmd)
     {
-        drprintf((0, "VBoxDISP::vboxVHWAQueryHostInfo2: vboxVHWACommandCreate failed\n"));
+        drprintf((0, "VBoxDISP::vboxVhwaQueryHostInfo2: vboxVhwaCommandCreate failed\n"));
         return NULL;
     }
@@ -277,5 +277,5 @@
 }
 
-int vboxVHWAEnable(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
+int vboxVhwaEnable(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
 {
     int rc = VERR_GENERAL_FAILURE;
@@ -286,5 +286,5 @@
     if (!pCmd)
     {
-        drprintf((0, "VBoxDISP::vboxVHWAEnable: vboxVHWACommandCreate failed\n"));
+        drprintf((0, "VBoxDISP::vboxVhwaEnable: vboxVhwaCommandCreate failed\n"));
         return rc;
     }
@@ -305,5 +305,5 @@
 }
 
-int vboxVHWADisable(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
+int vboxVhwaDisable(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
 {
     int rc = VERR_GENERAL_FAILURE;
@@ -314,5 +314,5 @@
     if (!pCmd)
     {
-        drprintf((0, "VBoxDISP::vboxVHWADisable: vboxVHWACommandCreate failed\n"));
+        drprintf((0, "VBoxDISP::vboxVhwaDisable: vboxVhwaCommandCreate failed\n"));
         return rc;
     }
@@ -333,5 +333,5 @@
 }
 
-static void vboxVHWAInitSrc(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
+static void vboxVhwaInitSrc(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId)
 {
     Assert(srcId < (D3DDDI_VIDEO_PRESENT_SOURCE_ID)pDevExt->u.primary.cDisplays);
@@ -339,5 +339,5 @@
     memset (pSettings, 0, sizeof (VBOXVHWA_INFO));
 
-    VBOXVHWACMD_QUERYINFO1* pInfo1 = vboxVHWAQueryHostInfo1(pDevExt, srcId);
+    VBOXVHWACMD_QUERYINFO1* pInfo1 = vboxVhwaQueryHostInfo1(pDevExt, srcId);
     if (pInfo1)
     {
@@ -379,5 +379,5 @@
                         && (pInfo1->u.out.caps & VBOXVHWA_CAPS_OVERLAYFOURCC))
                 {
-                    VBOXVHWACMD_QUERYINFO2* pInfo2 = vboxVHWAQueryHostInfo2(pDevExt, srcId, pInfo1->u.out.numFourCC);
+                    VBOXVHWACMD_QUERYINFO2* pInfo2 = vboxVhwaQueryHostInfo2(pDevExt, srcId, pInfo1->u.out.numFourCC);
                     if (pInfo2)
                     {
@@ -387,22 +387,22 @@
                             ++pSettings->cFormats;
                         }
-                        vboxVHWAFreeHostInfo2(pDevExt, pInfo2);
+                        vboxVhwaFreeHostInfo2(pDevExt, pInfo2);
                     }
                 }
             }
         }
-        vboxVHWAFreeHostInfo1(pDevExt, pInfo1);
-    }
-}
-
-void vboxVHWAInit(PDEVICE_EXTENSION pDevExt)
+        vboxVhwaFreeHostInfo1(pDevExt, pInfo1);
+    }
+}
+
+void vboxVhwaInit(PDEVICE_EXTENSION pDevExt)
 {
     for (int i = 0; i < pDevExt->u.primary.cDisplays; ++i)
     {
-        vboxVHWAInitSrc(pDevExt, (D3DDDI_VIDEO_PRESENT_SOURCE_ID)i);
-    }
-}
-
-void vboxVHWAFree(PDEVICE_EXTENSION pDevExt)
+        vboxVhwaInitSrc(pDevExt, (D3DDDI_VIDEO_PRESENT_SOURCE_ID)i);
+    }
+}
+
+void vboxVhwaFree(PDEVICE_EXTENSION pDevExt)
 {
     /* we do not allocate/map anything, just issue a Disable command
@@ -410,5 +410,5 @@
     for (int i = 0; i < pDevExt->u.primary.cDisplays; ++i)
     {
-        vboxVHWADisable(pDevExt, i);
+        vboxVhwaDisable(pDevExt, i);
     }
 }
@@ -715,6 +715,16 @@
     if (cNew == 1)
     {
-        rc = vboxVhwaHlpCreatePrimary(pDevExt, pSource, VidPnSourceId);
+        rc = vboxVhwaEnable(pDevExt, VidPnSourceId);
         AssertRC(rc);
+        if (RT_SUCCESS(rc))
+        {
+            rc = vboxVhwaHlpCreatePrimary(pDevExt, pSource, VidPnSourceId);
+            AssertRC(rc);
+            if (RT_FAILURE(rc))
+            {
+                int tmpRc = vboxVhwaDisable(pDevExt, VidPnSourceId);
+                AssertRC(tmpRc);
+            }
+        }
     }
     else
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVhwa.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVhwa.h	(revision 30316)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVhwa.h	(revision 30317)
@@ -45,12 +45,12 @@
 #endif
 
-void vboxVHWAFreeHostInfo1(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD_QUERYINFO1* pInfo);
-void vboxVHWAFreeHostInfo2(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD_QUERYINFO2* pInfo);
-VBOXVHWACMD_QUERYINFO1* vboxVHWAQueryHostInfo1(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId);
-VBOXVHWACMD_QUERYINFO2* vboxVHWAQueryHostInfo2(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, uint32_t numFourCC);
-int vboxVHWAEnable(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId);
-int vboxVHWADisable(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId);
-void vboxVHWAInit(PDEVICE_EXTENSION pDevExt);
-void vboxVHWAFree(PDEVICE_EXTENSION pDevExt);
+void vboxVhwaFreeHostInfo1(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD_QUERYINFO1* pInfo);
+void vboxVhwaFreeHostInfo2(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD_QUERYINFO2* pInfo);
+VBOXVHWACMD_QUERYINFO1* vboxVhwaQueryHostInfo1(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId);
+VBOXVHWACMD_QUERYINFO2* vboxVhwaQueryHostInfo2(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, uint32_t numFourCC);
+int vboxVhwaEnable(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId);
+int vboxVhwaDisable(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId);
+void vboxVhwaInit(PDEVICE_EXTENSION pDevExt);
+void vboxVhwaFree(PDEVICE_EXTENSION pDevExt);
 
 int vboxVhwaHlpOverlayFlip(PVBOXWDDM_OVERLAY pOverlay, const DXGKARG_FLIPOVERLAY *pFlipInfo);
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp	(revision 30316)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp	(revision 30317)
@@ -649,5 +649,5 @@
                     dprintf(("VBoxVideoWddm: sources(%d), children(%d)\n", *NumberOfVideoPresentSources, *NumberOfChildren));
 #ifdef VBOX_WITH_VIDEOHWACCEL
-                    vboxVHWAInit(pContext);
+                    vboxVhwaInit(pContext);
 #endif
                 }
@@ -699,5 +699,5 @@
     /* do everything we did on DxgkDdiStartDevice in the reverse order */
 #ifdef VBOX_WITH_VIDEOHWACCEL
-    vboxVHWAFree(pDevExt);
+    vboxVhwaFree(pDevExt);
 #endif
 
@@ -1511,7 +1511,7 @@
                     pAllocationInfo->SupportedWriteSegmentSet = 2;
 #endif
-//#ifndef VBOXWDDM_RENDER_FROM_SHADOW
+#ifndef VBOXWDDM_RENDER_FROM_SHADOW
                     pAllocationInfo->Flags.CpuVisible = 1;
-//#endif
+#endif
                     break;
                 case VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC:
