Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp	(revision 39818)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp	(revision 39819)
@@ -108,5 +108,6 @@
 #define VBOXDISP_DDI_PROLOGUE() \
     VBOXVDBG_BREAK_DDI(); \
-    VBOXDISPPROFILE_FUNCTION_DDI_PROLOGUE();
+    VBOXDISPPROFILE_FUNCTION_DDI_PROLOGUE(); \
+    VBOXVDBG_CREATE_CHECK_SWAPCHAIN();
 
 #ifdef VBOXDISPMP_TEST
@@ -2197,6 +2198,6 @@
                     Assert(iBb != (~0));
 #endif
-                    hr = pDevice->pDevice9If->StretchRect(pD3D9OldSurf, NULL, pD3D9Surf, NULL, D3DTEXF_NONE);
-                    Assert(hr == S_OK);
+                    VBOXVDBG_CHECK_SWAPCHAIN_SYNC(hr = pDevice->pDevice9If->StretchRect(pD3D9OldSurf, NULL, pD3D9Surf, NULL, D3DTEXF_NONE); Assert(hr == S_OK),
+                            pAlloc, pD3D9OldSurf, NULL, pAlloc, pD3D9Surf, NULL);
                 }
             }
@@ -2256,5 +2257,7 @@
             pSwapchain->bRTFbCopyUpToDate = TRUE;
 # ifndef VBOX_WINE_WITH_FAST_INTERSWAPCHAIN_BLT
-            tmpHr = pDevice->pDevice9If->StretchRect(pD3D9Bb, NULL, (IDirect3DSurface9*)vboxWddmSwapchainGetBb(pSwapchain)->pAlloc->pD3DIf, NULL, D3DTEXF_NONE);
+            VBOXVDBG_CHECK_SWAPCHAIN_SYNC(tmpHr = pDevice->pDevice9If->StretchRect(pD3D9Bb, NULL, (IDirect3DSurface9*)vboxWddmSwapchainGetBb(pSwapchain)->pAlloc->pD3DIf, NULL, D3DTEXF_NONE); Assert(tmpHr == S_OK),
+                    pAlloc, pD3D9Bb, NULL, pAlloc, (IDirect3DSurface9*)vboxWddmSwapchainGetBb(pSwapchain)->pAlloc->pD3DIf, NULL);
+
             if (FAILED(tmpHr))
             {
@@ -2341,5 +2344,8 @@
         if (pRT->pAlloc->enmD3DIfType != VBOXDISP_D3DIFTYPE_SURFACE)
             continue;
-        BOOL fHasSurf = !!pRT->pAlloc->pRc->aAllocations[0].pD3DIf;
+        BOOL fHasSurf = pRT->pAlloc->enmD3DIfType == VBOXDISP_D3DIFTYPE_SURFACE ?
+                !!pRT->pAlloc->pRc->aAllocations[i].pD3DIf
+                :
+                !!pRT->pAlloc->pRc->aAllocations[0].pD3DIf;
         if (!fForceCreate && !fHasSurf)
             continue;
@@ -2395,6 +2401,6 @@
             if (pD3D9OldSurf != pD3D9OldFb)
             {
-                hr = pDevice9If->StretchRect(pD3D9OldSurf, NULL, pD3D9NewSurf, NULL, D3DTEXF_NONE);
-                Assert(hr == S_OK);
+                VBOXVDBG_CHECK_SWAPCHAIN_SYNC(hr = pDevice9If->StretchRect(pD3D9OldSurf, NULL, pD3D9NewSurf, NULL, D3DTEXF_NONE); Assert(hr == S_OK),
+                        pRT->pAlloc, pD3D9OldSurf, NULL, pRT->pAlloc, pD3D9NewSurf, NULL);
             }
             else
@@ -2410,4 +2416,6 @@
             break;
         }
+
+        Assert(pRT->pAlloc->enmD3DIfType == VBOXDISP_D3DIFTYPE_SURFACE);
 
         if (pRT->pAlloc->pD3DIf)
@@ -2887,4 +2895,7 @@
 {
     HRESULT hr;
+
+    VBOXVDBG_DUMP_PRESENT_ENTER(pDevice, pSwapchain);
+
     if (!pSwapchain->fFlags.bRtReportingPresent)
     {
@@ -2909,4 +2920,6 @@
     }
 
+    VBOXVDBG_DUMP_PRESENT_LEAVE(pDevice, pSwapchain);
+
     pSwapchain->bRTFbCopyUpToDate = FALSE;
     vboxWddmSwapchainFlip(pSwapchain);
@@ -3044,4 +3057,9 @@
     if (pDevice->pDevice9If)
         return pDevice->pDevice9If;
+
+#ifdef VBOXWDDMDISP_DEBUG
+    g_VBoxVDbgInternalDevice = pDevice;
+#endif
+
     HRESULT hr = vboxWddmD3DDeviceCreateDummy(pDevice);
     Assert(hr == S_OK);
@@ -3174,4 +3192,14 @@
         return hr;
     }
+
+#if 0
+    pCaps->RasterCaps |= D3DPRASTERCAPS_FOGRANGE;
+    pCaps->MaxTextureWidth = 8192; // 4096
+    pCaps->MaxTextureHeight = 8192; // 4096
+    pCaps->MaxVolumeExtent = 2048; // 512
+    pCaps->MaxTextureAspectRatio = 8192; // 4096
+    pCaps->MaxUserClipPlanes = 8; // 6
+    pCaps->MaxPointSize = 63.000000; // 64.000000
+#endif
 
     vboxDispDumpD3DCAPS9(pCaps);
@@ -5338,4 +5366,14 @@
             bIssueCreateResource = true;
             Assert(pResource->SurfCount);
+
+#ifdef VBOXWDDMDISP_DEBUG
+            if (g_VBoxVDbgCfgForceDummyDevCreate)
+            {
+                VBOXDISP_D3DEV(pDevice);
+                Assert(!RTListIsEmpty(&pDevice->SwapchainList));
+                g_VBoxVDbgInternalRc = pRc;
+            }
+#endif
+
             if (RTListIsEmpty(&pDevice->SwapchainList))
             {
@@ -5546,4 +5584,8 @@
                     hr = vboxWddmSwapchainCreateIfForRc(pDevice, pRc, &pSwapchain);
                     Assert(hr == S_OK);
+                }
+                else
+                {
+                    VBOXVDBG_CREATE_CHECK_SWAPCHAIN();
                 }
             }
@@ -7324,4 +7366,19 @@
     vboxVDbgPrint(("==> "__FUNCTION__"\n"));
 
+#ifdef DEBUG_misha
+    DWORD dwVersion = 0;
+    DWORD dwMajorVersion = 0;
+    DWORD dwMinorVersion = 0;
+    dwVersion = GetVersion();
+    dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
+    dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));
+
+    if (dwMajorVersion == 6 && dwMinorVersion <= 1 && VBOXVDBG_IS_DWM())
+    {
+        exit(0);
+        return E_FAIL;
+    }
+#endif
+
 //    vboxDispLock();
 
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.h	(revision 39818)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.h	(revision 39819)
@@ -33,8 +33,8 @@
 /* maximum number of direct render targets to be used before
  * switching to offscreen rendering */
-#ifdef DEBUG_misha
-#define VBOXWDDMDISP_MAX_DIRECT_RTS      0
+#ifdef VBOXWDDMDISP_DEBUG
+# define VBOXWDDMDISP_MAX_DIRECT_RTS      g_VBoxVDbgCfgMaxDirectRts
 #else
-#define VBOXWDDMDISP_MAX_DIRECT_RTS      3
+# define VBOXWDDMDISP_MAX_DIRECT_RTS      3
 #endif
 
@@ -139,5 +139,5 @@
             UINT bRtReportingPresent     : 1; /* use VBox extension method for performing present */
             UINT bSwitchReportingPresent : 1; /* switch to use VBox extension method for performing present on next present */
-            UINT Reserved                : 30;
+            UINT Reserved                : 29;
         };
         uint32_t Value;
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispDbg.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispDbg.cpp	(revision 39818)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispDbg.cpp	(revision 39819)
@@ -60,4 +60,7 @@
 DWORD g_VBoxVDbgFDumpLock = VBOXWDDMDISP_DEBUG_DUMP_DEFAULT;
 DWORD g_VBoxVDbgFDumpUnlock = VBOXWDDMDISP_DEBUG_DUMP_DEFAULT;
+DWORD g_VBoxVDbgFDumpPresentEnter = VBOXWDDMDISP_DEBUG_DUMP_DEFAULT;
+DWORD g_VBoxVDbgFDumpPresentLeave = VBOXWDDMDISP_DEBUG_DUMP_DEFAULT;
+DWORD g_VBoxVDbgFDumpScSync = VBOXWDDMDISP_DEBUG_DUMP_DEFAULT;
 
 DWORD g_VBoxVDbgFBreakShared = VBOXWDDMDISP_DEBUG_DUMP_DEFAULT;
@@ -67,4 +70,5 @@
 DWORD g_VBoxVDbgFCheckBlt = 0;
 DWORD g_VBoxVDbgFCheckTexBlt = 0;
+DWORD g_VBoxVDbgFCheckScSync = 0;
 
 DWORD g_VBoxVDbgFSkipCheckTexBltDwmWndUpdate = 1;
@@ -80,4 +84,12 @@
 
 DWORD g_VBoxVDbgPid = 0;
+
+DWORD g_VBoxVDbgCfgMaxDirectRts = 0;
+DWORD g_VBoxVDbgCfgForceDummyDevCreate = 0;
+
+PVBOXWDDMDISP_DEVICE g_VBoxVDbgInternalDevice = NULL;
+PVBOXWDDMDISP_RESOURCE g_VBoxVDbgInternalRc = NULL;
+
+DWORD g_VBoxVDbgCfgCreateSwapchainOnDdiOnce = 0;
 
 void vboxDispLogDbgPrintF(char * szString, ...)
@@ -232,4 +244,35 @@
     vboxVDbgDoDumpSurfRect(pPrefix, pSurf, NULL, pSuffix, true);
 }
+
+VOID vboxVDbgDoDumpBb(const char * pPrefix, IDirect3DSwapChain9 *pSwapchainIf, const char * pSuffix)
+{
+    IDirect3DSurface9 *pBb = NULL;
+    HRESULT hr = pSwapchainIf->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &pBb);
+    Assert(hr == S_OK);
+    if (FAILED(hr))
+    {
+        return;
+    }
+
+    Assert(pBb);
+    vboxVDbgDoDumpSurf(pPrefix, pBb, pSuffix);
+    pBb->Release();
+}
+
+VOID vboxVDbgDoDumpFb(const char * pPrefix, IDirect3DSwapChain9 *pSwapchainIf, const char * pSuffix)
+{
+    IDirect3DSurface9 *pBb = NULL;
+    HRESULT hr = pSwapchainIf->GetBackBuffer(-1, D3DBACKBUFFER_TYPE_MONO, &pBb);
+    Assert(hr == S_OK);
+    if (FAILED(hr))
+    {
+        return;
+    }
+
+    Assert(pBb);
+    vboxVDbgDoDumpSurf(pPrefix, pBb, pSuffix);
+    pBb->Release();
+}
+
 
 #define VBOXVDBG_STRCASE(_t) \
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispDbg.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispDbg.h	(revision 39818)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispDbg.h	(revision 39819)
@@ -56,4 +56,7 @@
 extern DWORD g_VBoxVDbgFDumpLock;
 extern DWORD g_VBoxVDbgFDumpUnlock;
+extern DWORD g_VBoxVDbgFDumpPresentEnter;
+extern DWORD g_VBoxVDbgFDumpPresentLeave;
+extern DWORD g_VBoxVDbgFDumpScSync;
 
 extern DWORD g_VBoxVDbgFBreakShared;
@@ -63,4 +66,5 @@
 extern DWORD g_VBoxVDbgFCheckBlt;
 extern DWORD g_VBoxVDbgFCheckTexBlt;
+extern DWORD g_VBoxVDbgFCheckScSync;
 
 extern DWORD g_VBoxVDbgFSkipCheckTexBltDwmWndUpdate;
@@ -75,4 +79,12 @@
 
 extern LONG g_VBoxVDbgFIsDwm;
+
+extern DWORD g_VBoxVDbgCfgMaxDirectRts;
+extern DWORD g_VBoxVDbgCfgForceDummyDevCreate;
+
+extern struct VBOXWDDMDISP_DEVICE *g_VBoxVDbgInternalDevice;
+extern struct VBOXWDDMDISP_RESOURCE *g_VBoxVDbgInternalRc;
+
+extern DWORD g_VBoxVDbgCfgCreateSwapchainOnDdiOnce;
 
 #endif
@@ -185,4 +197,6 @@
 VOID vboxVDbgDoDumpTex(const char * pPrefix, IDirect3DBaseTexture9 *pTexBase, const char * pSuffix);
 VOID vboxVDbgDoDumpRt(const char * pPrefix, struct VBOXWDDMDISP_DEVICE *pDevice, const char * pSuffix);
+VOID vboxVDbgDoDumpBb(const char * pPrefix, IDirect3DSwapChain9 *pSwapchainIf, const char * pSuffix);
+VOID vboxVDbgDoDumpFb(const char * pPrefix, IDirect3DSwapChain9 *pSwapchainIf, const char * pSuffix);
 
 void vboxVDbgDoPrintRect(const char * pPrefix, const RECT *pRect, const char * pSuffix);
@@ -366,40 +380,36 @@
     } while (0)
 
-#define VBOXVDBG_DUMP_BLT_ENTER(_pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect) do { \
-        if (VBOXVDBG_IS_DUMP_ALLOWED(Blt) \
+#define VBOXVDBG_DUMP_STRETCH_RECT(_type, _str, _pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect) do { \
+        if (VBOXVDBG_IS_DUMP_ALLOWED(_type) \
                 || VBOXVDBG_IS_DUMP_SHARED_ALLOWED((_pSrcAlloc)->pRc) \
                 || VBOXVDBG_IS_DUMP_SHARED_ALLOWED((_pDstAlloc)->pRc) \
                 ) \
         { \
-            if ((_pSrcAlloc) == (_pDstAlloc) && !memcmp((_pSrcRect), (_pDstRect), sizeof (_pDstRect))) \
+            if ((_pSrcSurf) == (_pDstSurf) \
+                    && ( ((_pSrcRect) && (_pDstRect) && !memcmp((_pSrcRect), (_pDstRect), sizeof (_pDstRect))) \
+                            || ((_pSrcRect) == (_pDstRect)) \
+                            ) ) \
             { \
-                vboxVDbgPrint(("BLT_ENTER: skipping dump of the same rect for one surfcace\n")); \
+                vboxVDbgPrint((_str #_type ": skipping dump of the same rect for one surfcace\n")); \
             } \
             else \
             { \
-                vboxVDbgDoDumpRcRectByAlloc("==>"__FUNCTION__" Src: ", (_pSrcAlloc), (_pSrcSurf), (_pSrcRect), "\n"); \
-                vboxVDbgDoDumpRcRectByAlloc("==>"__FUNCTION__" Dst: ", (_pDstAlloc), (_pDstSurf), (_pDstRect), "\n"); \
-            } \
-        } \
-    } while (0)
-
-#define VBOXVDBG_DUMP_BLT_LEAVE(_pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect) do { \
-        if (VBOXVDBG_DUMP_RECTS_FORCED() \
-                || VBOXVDBG_IS_DUMP_ALLOWED(Blt) \
-                || VBOXVDBG_IS_DUMP_SHARED_ALLOWED((_pSrcAlloc)->pRc) \
-                || VBOXVDBG_IS_DUMP_SHARED_ALLOWED((_pDstAlloc)->pRc) \
-                ) \
-        { \
-            if ((_pSrcAlloc) == (_pDstAlloc) && !memcmp((_pSrcRect), (_pDstRect), sizeof (_pDstRect))) \
-            { \
-                vboxVDbgPrint(("BLT_LEAVE: skipping dump of the same rect for one surfcace\n")); \
-            } \
-            else \
-            { \
-                vboxVDbgDoDumpRcRectByAlloc("<=="__FUNCTION__" Src: ", (_pSrcAlloc), (_pSrcSurf), (_pSrcRect), "\n"); \
-                vboxVDbgDoDumpRcRectByAlloc("<=="__FUNCTION__" Dst: ", (_pDstAlloc), (_pDstSurf), (_pDstRect), "\n"); \
-            } \
-        } \
-    } while (0)
+                vboxVDbgDoDumpRcRectByAlloc(_str __FUNCTION__" Src: ", (_pSrcAlloc), (_pSrcSurf), (_pSrcRect), "\n"); \
+                vboxVDbgDoDumpRcRectByAlloc(_str __FUNCTION__" Dst: ", (_pDstAlloc), (_pDstSurf), (_pDstRect), "\n"); \
+            } \
+        } \
+    } while (0)
+
+#define VBOXVDBG_DUMP_BLT_ENTER(_pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect) \
+    VBOXVDBG_DUMP_STRETCH_RECT(Blt, "==>", _pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect)
+
+#define VBOXVDBG_DUMP_BLT_LEAVE(_pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect) \
+        VBOXVDBG_DUMP_STRETCH_RECT(Blt, "<==", _pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect)
+
+#define VBOXVDBG_DUMP_SWAPCHAIN_SYNC_ENTER(_pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect) \
+        VBOXVDBG_DUMP_STRETCH_RECT(ScSync, "==>", _pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect)
+
+#define VBOXVDBG_DUMP_SWAPCHAIN_SYNC_LEAVE(_pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect) \
+        VBOXVDBG_DUMP_STRETCH_RECT(ScSync, "<==", _pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect)
 
 #define VBOXVDBG_IS_SKIP_DWM_WND_UPDATE(_pSrcRc, _pSrcRect, _pDstRc, _pDstPoint) ( \
@@ -448,11 +458,11 @@
     } while (0)
 
-#define VBOXVDBG_CHECK_BLT(_opBlt, _pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect) do { \
-        if (VBOXVDBG_IS_CHECK_ALLOWED(Blt)) { \
+#define VBOXVDBG_CHECK_STRETCH_RECT(_type, _op, _pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect) do { \
+        if (VBOXVDBG_IS_CHECK_ALLOWED(_type)) { \
             VBOXVDBG_CHECK_RECTS(\
-                    VBOXVDBG_DUMP_BLT_ENTER(_pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect); \
-                    _opBlt ,\
-                    VBOXVDBG_DUMP_BLT_LEAVE(_pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect), \
-                    "Blt", \
+                    VBOXVDBG_DUMP_STRETCH_RECT(_type, "==>", _pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect); \
+                    _op ,\
+                    VBOXVDBG_DUMP_STRETCH_RECT(_type, "<==", _pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect), \
+                    #_type , \
                     _pDstAlloc->pRc, _pDstAlloc->iAlloc, _pSrcAlloc->pRc, _pSrcAlloc->iAlloc, _pDstRect, _pSrcRect); \
         } \
@@ -460,9 +470,15 @@
         { \
             VBOXVDBG_DUMP_RECTS_INIT(0); \
-            VBOXVDBG_DUMP_BLT_ENTER(_pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect); \
-            _opBlt;\
-            VBOXVDBG_DUMP_BLT_LEAVE(_pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect); \
-        } \
-    } while (0)
+            VBOXVDBG_DUMP_STRETCH_RECT(_type, "==>", _pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect); \
+            _op;\
+            VBOXVDBG_DUMP_STRETCH_RECT(_type, "<==", _pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect); \
+        } \
+    } while (0)
+
+#define VBOXVDBG_CHECK_BLT(_opBlt, _pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect) \
+        VBOXVDBG_CHECK_STRETCH_RECT(Blt, _opBlt, _pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect)
+
+#define VBOXVDBG_CHECK_SWAPCHAIN_SYNC(_op, _pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect) \
+        VBOXVDBG_CHECK_STRETCH_RECT(ScSync, _op, _pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect)
 
 #define VBOXVDBG_DUMP_SYNC_RT(_pBbSurf) do { \
@@ -472,4 +488,32 @@
         } \
     } while (0)
+
+#define VBOXVDBG_DUMP_PRESENT_ENTER(_pDevice, _pSwapchain) do { \
+        if (VBOXVDBG_IS_DUMP_ALLOWED(PresentEnter)) { \
+            if (!(_pSwapchain)->fFlags.bRtReportingPresent) { \
+                vboxVDbgDoDumpBb("==>"__FUNCTION__" Bb:\n", (_pSwapchain)->pSwapChainIf, "\n"); \
+            } \
+            else  { \
+                PVBOXWDDMDISP_ALLOCATION pCurBb = vboxWddmSwapchainGetBb((_pSwapchain))->pAlloc; \
+                IDirect3DSurface9 *pSurf; \
+                HRESULT hr = vboxWddmSwapchainSurfGet(_pDevice, _pSwapchain, pCurBb, &pSurf); \
+                Assert(hr == S_OK); \
+                vboxVDbgDoDumpSurf("== "__FUNCTION__" Bb:\n", pSurf, "\n"); \
+                pSurf->Release(); \
+            } \
+        } \
+    } while (0)
+
+#define VBOXVDBG_DUMP_PRESENT_LEAVE(_pDevice, _pSwapchain) do { \
+        if (VBOXVDBG_IS_DUMP_ALLOWED(PresentLeave)) { \
+            if (!(_pSwapchain)->fFlags.bRtReportingPresent) { \
+                vboxVDbgDoDumpFb("<=="__FUNCTION__" Fb:\n", (_pSwapchain)->pSwapChainIf, "\n"); \
+            } \
+            else  { \
+                vboxVDbgPrint(("PRESENT_LEAVE: unsupported for Rt Reporting mode\n")); \
+            } \
+        } \
+    } while (0)
+
 
 #define VBOXVDBG_DUMP_FLUSH(_pDevice) do { \
@@ -496,4 +540,15 @@
         } \
     } while (0)
+
+
+#define VBOXVDBG_CREATE_CHECK_SWAPCHAIN() do { \
+            if (g_VBoxVDbgCfgCreateSwapchainOnDdiOnce && g_VBoxVDbgInternalRc) { \
+                PVBOXWDDMDISP_SWAPCHAIN pSwapchain; \
+                HRESULT hr = vboxWddmSwapchainCreateIfForRc(g_VBoxVDbgInternalDevice, g_VBoxVDbgInternalRc, &pSwapchain); \
+                Assert(hr == S_OK); \
+                g_VBoxVDbgInternalRc = NULL; \
+                g_VBoxVDbgCfgCreateSwapchainOnDdiOnce = 0; \
+            } \
+        } while (0)
 
 #else
@@ -509,4 +564,6 @@
 #define VBOXVDBG_DUMP_LOCK_ST(_pData) do { } while (0)
 #define VBOXVDBG_DUMP_UNLOCK_ST(_pData) do { } while (0)
+#define VBOXVDBG_DUMP_PRESENT_ENTER(_pDevice, _pSwapchain) do { } while (0)
+#define VBOXVDBG_DUMP_PRESENT_LEAVE(_pDevice, _pSwapchain) do { } while (0)
 #define VBOXVDBG_BREAK_SHARED(_pRc) do { } while (0)
 #define VBOXVDBG_BREAK_DDI() do { } while (0)
@@ -515,4 +572,6 @@
 #define VBOXVDBG_CHECK_TEXBLT(_opTexBlt, _pSrcRc, _pSrcRect, _pDstRc, _pDstPoint) do { _opTexBlt; } while (0)
 #define VBOXVDBG_ASSERT_IS_DWM(_bDwm) do { } while (0)
+#define VBOXVDBG_CHECK_SWAPCHAIN_SYNC(_op, _pSrcAlloc, _pSrcSurf, _pSrcRect, _pDstAlloc, _pDstSurf, _pDstRect) do { _op; } while (0)
+#define VBOXVDBG_CREATE_CHECK_SWAPCHAIN() do { } while (0)
 #endif
 
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/directx.c
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/directx.c	(revision 39818)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/directx.c	(revision 39819)
@@ -885,4 +885,24 @@
 }
 
+#ifdef VBOX_WITH_WDDM
+static BOOL match_mesa_nvidia(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+        enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
+{
+    if (card_vendor != HW_VENDOR_NVIDIA) return FALSE;
+    if (gl_vendor != GL_VENDOR_MESA) return FALSE;
+    return TRUE;
+}
+
+static void quirk_no_shader_3(struct wined3d_gl_info *gl_info)
+{
+    int vs_selected_mode, ps_selected_mode;
+    select_shader_mode(gl_info, &ps_selected_mode, &vs_selected_mode);
+    if (vs_selected_mode != SHADER_GLSL && ps_selected_mode != SHADER_GLSL)
+        return;
+
+    gl_info->limits.arb_ps_instructions = 512;
+}
+#endif
+
 struct driver_quirk
 {
@@ -974,4 +994,11 @@
         "Fullsize blit"
     },
+#ifdef VBOX_WITH_WDDM
+    {
+            match_mesa_nvidia,
+            quirk_no_shader_3,
+            "disable shader 3 support"
+    },
+#endif
 };
 
@@ -1943,5 +1970,10 @@
 {
     FIXME_(d3d_caps)("Card selection not handled for Mesa Nouveau driver\n");
+#ifndef VBOX_WITH_WDDM
     if (WINE_D3D9_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCEFX_5600;
+#else
+    /* tmp work around to disable quirk_no_np2 quirk for mesa drivers */
+    if (WINE_D3D9_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE_6200;
+#endif
     if (WINE_D3D8_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE3;
     if (WINE_D3D7_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE;
@@ -2056,5 +2088,11 @@
      * them a good generic choice. */
     *card_vendor = HW_VENDOR_NVIDIA;
+#ifndef VBOX_WITH_WDDM
     if (WINE_D3D9_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCEFX_5600;
+#else
+    /* tmp work around to disable quirk_no_np2 quirk for not-recognized drivers */
+    if (WINE_D3D9_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE_6200;
+#endif
+
     if (WINE_D3D8_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE3;
     if (WINE_D3D7_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE;
