Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxD3DIf.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxD3DIf.h	(revision 57632)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxD3DIf.h	(revision 57633)
@@ -80,8 +80,7 @@
         case VBOXDISP_D3DIFTYPE_TEXTURE:
         {
-            Assert(pRc->cAllocations == 1); /* <- VBoxD3DIfSurfGet is typically used in Blt & ColorFill functions
-                                             * in this case, if texture is used as a destination,
-                                             * we should update sub-layers as well which is not done currently
-                                             * so for now check VBoxD3DIfSurfGet is used for one-level textures */
+            /* @todo VBoxD3DIfSurfGet is typically used in Blt & ColorFill functions
+             * in this case, if texture is used as a destination,
+             * we should update sub-layers as well which is not done currently. */
             IDirect3DTexture9 *pD3DIfTex = (IDirect3DTexture9*)pD3DIf;
             IDirect3DSurface9 *pSurfaceLevel;
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp	(revision 57632)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp	(revision 57633)
@@ -686,4 +686,9 @@
 static VOID vboxWddmDbgRcSynchMemCheck(PVBOXWDDMDISP_RESOURCE pRc)
 {
+    if (!pRc)
+    {
+        return;
+    }
+
     if (pRc->RcDesc.enmPool != D3DDDIPOOL_SYSTEMMEM)
     {
@@ -1378,4 +1383,5 @@
     {
         PVBOXWDDMDISP_ALLOCATION pRtAlloc = pDevice->apRTs[i];
+        if (!pRtAlloc) continue;
         for (UINT j = 0; j < pSwapchain->cRTs; ++j)
         {
@@ -1894,30 +1900,32 @@
 {
     IDirect3DDevice9 * pDevice9If = VBOXDISP_D3DEV(pDevice);
-    PVBOXWDDMDISP_SWAPCHAIN pSwapchain = vboxWddmSwapchainForAlloc(pAlloc);
     HRESULT hr = S_OK;
-    IDirect3DSurface9 *pD3D9Surf;
-    if (pSwapchain)
-    {
-        hr = vboxWddmSwapchainRtSurfGet(pDevice, pSwapchain, iRt, pAlloc, bOnSwapchainSynch, &pD3D9Surf);
-        if (FAILED(hr))
-        {
-            WARN(("vboxWddmSwapchainRtSurfGet failed, hr(0x%x)",hr));
-            return hr;
-        }
-    }
-    else
-    {
-        hr = VBoxD3DIfSurfGet(pAlloc->pRc, pAlloc->iAlloc, &pD3D9Surf);
-        if (FAILED(hr))
-        {
-            WARN(("VBoxD3DIfSurfGet failed, hr(0x%x)",hr));
-            return hr;
-        }
-    }
-
-    Assert(pD3D9Surf);
+    IDirect3DSurface9 *pD3D9Surf = NULL;
+    if (pAlloc)
+    {
+        PVBOXWDDMDISP_SWAPCHAIN pSwapchain = vboxWddmSwapchainForAlloc(pAlloc);
+        if (pSwapchain)
+        {
+            hr = vboxWddmSwapchainRtSurfGet(pDevice, pSwapchain, iRt, pAlloc, bOnSwapchainSynch, &pD3D9Surf);
+            if (FAILED(hr))
+            {
+                WARN(("vboxWddmSwapchainRtSurfGet failed, hr(0x%x)",hr));
+                return hr;
+            }
+        }
+        else
+        {
+            hr = VBoxD3DIfSurfGet(pAlloc->pRc, pAlloc->iAlloc, &pD3D9Surf);
+            if (FAILED(hr))
+            {
+                WARN(("VBoxD3DIfSurfGet failed, hr(0x%x)",hr));
+                return hr;
+            }
+        }
+
+        Assert(pD3D9Surf);
+    }
 
     hr = pDevice9If->SetRenderTarget(iRt, pD3D9Surf);
-    Assert(hr == S_OK);
     if (hr == S_OK)
     {
@@ -1925,5 +1933,22 @@
         pDevice->apRTs[iRt] = pAlloc;
     }
-    pD3D9Surf->Release();
+    else
+    {
+        /* @todo This is workaround for wine 1 render target. */
+        if (!pAlloc)
+        {
+            pDevice->apRTs[iRt] = NULL;
+            hr = S_OK;
+        }
+        else
+        {
+            AssertFailed();
+        }
+    }
+
+    if (pD3D9Surf)
+    {
+        pD3D9Surf->Release();
+    }
 
     return hr;
@@ -5287,8 +5312,12 @@
     IDirect3DDevice9 * pDevice9If = VBOXDISP_D3DEV(pDevice);
     PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)pData->hRenderTarget;
-    VBOXVDBG_CHECK_SMSYNC(pRc);
-    Assert(pRc);
-    Assert(pData->SubResourceIndex < pRc->cAllocations);
-    PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[pData->SubResourceIndex];
+    PVBOXWDDMDISP_ALLOCATION pAlloc = NULL;
+    if (pRc)
+    {
+        VBOXVDBG_CHECK_SMSYNC(pRc);
+        Assert(pRc);
+        Assert(pData->SubResourceIndex < pRc->cAllocations);
+        pAlloc = &pRc->aAllocations[pData->SubResourceIndex];
+    }
     HRESULT hr = vboxWddmRenderTargetSet(pDevice, pData->RenderTargetIndex, pAlloc, FALSE);
     Assert(hr == S_OK);
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispDbg.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispDbg.cpp	(revision 57632)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispDbg.cpp	(revision 57633)
@@ -391,4 +391,5 @@
         IDirect3DSurface9 *pRt;
         PVBOXWDDMDISP_ALLOCATION pAlloc = pDevice->apRTs[i];
+        if (!pAlloc) continue;
         IDirect3DDevice9 *pDeviceIf = pDevice->pDevice9If;
         HRESULT hr = pDeviceIf->GetRenderTarget(i, &pRt);
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispDbg.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispDbg.h	(revision 57632)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispDbg.h	(revision 57633)
@@ -339,5 +339,5 @@
         for (UINT i = 0; i < (_pDevice)->cRTs; ++i) { \
             PVBOXWDDMDISP_ALLOCATION pRtVar = (_pDevice)->apRTs[i]; \
-            if (pRtVar->pRc->RcDesc.fFlags.SharedResource) { *(_pIsShared) = TRUE; break; } \
+            if (pRtVar && pRtVar->pRc->RcDesc.fFlags.SharedResource) { *(_pIsShared) = TRUE; break; } \
         } \
         if (!*(_pIsShared)) { \
