Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp	(revision 38883)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp	(revision 38884)
@@ -2014,5 +2014,5 @@
 }
 #endif
-static PVBOXWDDMDISP_SWAPCHAIN vboxWddmSwapchainFindCreate(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_ALLOCATION pBbAlloc)
+static PVBOXWDDMDISP_SWAPCHAIN vboxWddmSwapchainFindCreate(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_ALLOCATION pBbAlloc, BOOL *pbNeedPresent)
 {
     PVBOXWDDMDISP_SWAPCHAIN pSwapchain = pBbAlloc->pSwapchain;
@@ -2023,4 +2023,10 @@
         if (pRt->pAlloc != pBbAlloc)
         {
+            if (pBbAlloc == vboxWddmSwapchainGetFb(pSwapchain)->pAlloc)
+            {
+                /* the current front-buffer present is requested, don't do anything */
+                *pbNeedPresent = FALSE;
+                return pSwapchain;
+            }
             /* bad, @todo: correct the swapchain by either removing the Rt and adding it to another swapchain
              * or by removing the pBbAlloc out of it */
@@ -2028,4 +2034,7 @@
         }
     }
+
+    *pbNeedPresent = TRUE;
+
     if (!pSwapchain)
     {
@@ -2121,10 +2130,23 @@
     PVBOXWDDMDISP_ALLOCATION pAlloc = pRt->pAlloc;
     Assert(pD3D9Surf);
-    Assert(pAlloc->enmD3DIfType == VBOXDISP_D3DIFTYPE_SURFACE);
+    Assert(pAlloc->enmD3DIfType == VBOXDISP_D3DIFTYPE_SURFACE
+            || pAlloc->enmD3DIfType == VBOXDISP_D3DIFTYPE_TEXTURE);
     if (pAlloc->pD3DIf)
     {
         if (pSwapchain->fFlags.bChanged)
         {
-            IDirect3DSurface9 *pD3D9OldSurf = (IDirect3DSurface9*)pAlloc->pD3DIf;
+            IDirect3DSurface9 *pD3D9OldSurf = NULL;
+            if (pAlloc->pD3DIf)
+            {
+                /* since this can be texture, need to do the vboxWddmSurfGet magic */
+                hr = vboxWddmSurfGet(pAlloc->pRc, pAlloc->iAlloc, &pD3D9OldSurf);
+                if (FAILED(hr))
+                {
+                    WARN(("vboxWddmSurfGet failed, hr (0x%x)",hr));
+                    pD3D9Surf->Release();
+                    return hr;
+                }
+            }
+
             if (pD3D9OldSurf && pD3D9OldSurf != pD3D9Surf)
             {
@@ -2153,8 +2175,18 @@
                 }
             }
+
+            if (pD3D9OldSurf)
+            {
+                pD3D9OldSurf->Release();
+            }
+        }
+        else
+        {
+            Assert(pAlloc->enmD3DIfType == VBOXDISP_D3DIFTYPE_SURFACE);
         }
         pAlloc->pD3DIf->Release();
     }
 
+    pAlloc->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE;
     pAlloc->pD3DIf = pD3D9Surf;
     pRt->fFlags.Value = 0;
@@ -2351,6 +2383,9 @@
                         if (!pRT->pAlloc->pD3DIf)
                             continue;
-                        IDirect3DSurface9* pD3D9OldSurf = (IDirect3DSurface9*)pRT->pAlloc->pD3DIf;
+                        IDirect3DSurface9* pD3D9OldSurf = NULL;
                         VOID *pvSwapchain = NULL;
+                        /* since this can be texture, need to do the vboxWddmSurfGet magic */
+                        hr = vboxWddmSurfGet(pRT->pAlloc->pRc, pRT->pAlloc->iAlloc, &pD3D9OldSurf);
+                        Assert(hr == S_OK);
                         tmpHr = pD3D9OldSurf->GetContainer(IID_IDirect3DSwapChain9, &pvSwapchain);
                         if (tmpHr == S_OK)
@@ -2394,4 +2429,5 @@
                             continue;
 
+                        pRT->pAlloc->pD3DIf->Release();
                         pRT->pAlloc->pD3DIf = pD3D9NewSurf;
                         pD3D9OldSurf->Release();
@@ -2466,10 +2502,12 @@
         if (hr == S_OK)
         {
+#ifdef DEBUG
             for (UINT i = 0; i < cSurfs; ++i)
             {
                 PVBOXWDDMDISP_RENDERTGT pRt = &pSwapchain->aRTs[i];
-                pRt->pAlloc->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE;
-            }
-
+                Assert(pRt->pAlloc->enmD3DIfType == VBOXDISP_D3DIFTYPE_SURFACE
+                        || pRt->pAlloc->enmD3DIfType == VBOXDISP_D3DIFTYPE_TEXTURE);
+            }
+#endif
             hr = vboxWddmSwapchainSynch(pDevice, pSwapchain);
             Assert(hr == S_OK);
@@ -2655,7 +2693,9 @@
 static HRESULT vboxWddmSwapchainPresent(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_ALLOCATION pBbAlloc)
 {
-    BOOL bChanged = FALSE;
-    PVBOXWDDMDISP_SWAPCHAIN pSwapchain = vboxWddmSwapchainFindCreate(pDevice, pBbAlloc);
+    BOOL bNeedPresent;
+    PVBOXWDDMDISP_SWAPCHAIN pSwapchain = vboxWddmSwapchainFindCreate(pDevice, pBbAlloc, &bNeedPresent);
     Assert(pSwapchain);
+    if (!bNeedPresent)
+        return S_OK;
     if (pSwapchain)
     {
@@ -2744,4 +2784,5 @@
         {
             PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[i];
+            pAlloc->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE;
             pAlloc->SurfDesc.width = 0x4;
             pAlloc->SurfDesc.height = 0x4;
@@ -3731,4 +3772,6 @@
     PVBOXWDDMDISP_RESOURCE pSrcRc = (PVBOXWDDMDISP_RESOURCE)pData->hSrcResource;
     /* requirements for D3DDevice9::UpdateTexture */
+    Assert(pDstRc->aAllocations[0].enmD3DIfType == VBOXDISP_D3DIFTYPE_TEXTURE);
+    Assert(pSrcRc->aAllocations[0].enmD3DIfType == VBOXDISP_D3DIFTYPE_TEXTURE);
     Assert(pSrcRc->RcDesc.enmPool == D3DDDIPOOL_SYSTEMMEM);
     Assert(pDstRc->RcDesc.enmPool != D3DDDIPOOL_SYSTEMMEM);
@@ -5090,4 +5133,9 @@
                     bCreateSwapchain = true;
                     Assert(bIssueCreateResource);
+                    for (UINT i = 0; i < pRc->cAllocations; ++i)
+                    {
+                        PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[i];
+                        pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE;
+                    }
                 }
                 else
