Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/common/wddm/VBoxMPIf.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/common/wddm/VBoxMPIf.h	(revision 46661)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/common/wddm/VBoxMPIf.h	(revision 46662)
@@ -35,5 +35,5 @@
 
 /* One would increase this whenever definitions in this file are changed */
-#define VBOXVIDEOIF_VERSION 15
+#define VBOXVIDEOIF_VERSION 16
 
 #define VBOXWDDM_NODE_ID_SYSTEM           0
@@ -106,4 +106,6 @@
         {
             D3DDDI_RESOURCEFLAGS fFlags;
+            /* id used to identify the allocation on the host */
+            uint32_t hostID;
             uint64_t hSharedHandle;
             VBOXWDDM_SURFACE_DESC SurfDesc;
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp	(revision 46661)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp	(revision 46662)
@@ -4104,4 +4104,5 @@
     bool bIssueCreateResource = false;
     bool bCreateKMResource = false;
+    bool bSetHostID = false;
 
     pRc->hResource = pResource->hResource;
@@ -4185,4 +4186,5 @@
         {
             bIssueCreateResource = true;
+            bSetHostID = true;
         }
 
@@ -4236,4 +4238,29 @@
                 pAllocInfo->hSharedHandle = (uint64_t)pAllocation->hSharedHandle;
                 pAllocInfo->SurfDesc = pAllocation->SurfDesc;
+                if (bSetHostID)
+                {
+                    IDirect3DSurface9 *pSurfIf = NULL;
+                    hr = VBoxD3DIfSurfGet(pRc, i, &pSurfIf);
+                    if (SUCCEEDED(hr))
+                    {
+                        hr = pAdapter->D3D.D3D.pfnVBoxWineExD3DSurf9GetHostId(pSurfIf, &pAllocInfo->hostID);
+                        if (SUCCEEDED(hr))
+                        {
+                            Assert(pAllocInfo->hostID);
+                        }
+                        else
+                        {
+                            WARN(("pfnVBoxWineExD3DSurf9GetHostId failed, hr 0x%x", hr));
+                            break;
+                        }
+                    }
+                    else
+                    {
+                        WARN(("VBoxD3DIfSurfGet failed, hr 0x%x", hr));
+                        break;
+                    }
+                }
+                else
+                    pAllocInfo->hostID = 0;
             }
 
@@ -4242,84 +4269,87 @@
             Assert(pRc->fFlags.Generic);
 
-            if (bCreateKMResource)
-            {
-                Assert(pRc->fFlags.KmResource);
-
-                hr = pDevice->RtCallbacks.pfnAllocateCb(pDevice->hDevice, pDdiAllocate);
-                Assert(hr == S_OK);
-                Assert(pDdiAllocate->hKMResource
-                        || pResource->Flags.SharedResource /* for some reason shared resources
-                                                            * are created with zero km resource handle on Win7+ */
-                        );
-            }
-            else
-            {
-                Assert(!pRc->fFlags.KmResource);
-
-                pDdiAllocate->hResource = NULL;
-                pDdiAllocate->NumAllocations = 1;
-                pDdiAllocate->PrivateDriverDataSize = 0;
-                pDdiAllocate->pPrivateDriverData = NULL;
-                D3DDDI_ALLOCATIONINFO *pDdiAllocIBase = pDdiAllocate->pAllocationInfo;
-
-                for (UINT i = 0; i < pResource->SurfCount; ++i)
-                {
-                    pDdiAllocate->pAllocationInfo = &pDdiAllocIBase[i];
+            if (SUCCEEDED(hr))
+            {
+                if (bCreateKMResource)
+                {
+                    Assert(pRc->fFlags.KmResource);
+
                     hr = pDevice->RtCallbacks.pfnAllocateCb(pDevice->hDevice, pDdiAllocate);
                     Assert(hr == S_OK);
-                    Assert(!pDdiAllocate->hKMResource);
-                    if (SUCCEEDED(hr))
+                    Assert(pDdiAllocate->hKMResource
+                            || pResource->Flags.SharedResource /* for some reason shared resources
+                                                                * are created with zero km resource handle on Win7+ */
+                            );
+                }
+                else
+                {
+                    Assert(!pRc->fFlags.KmResource);
+
+                    pDdiAllocate->hResource = NULL;
+                    pDdiAllocate->NumAllocations = 1;
+                    pDdiAllocate->PrivateDriverDataSize = 0;
+                    pDdiAllocate->pPrivateDriverData = NULL;
+                    D3DDDI_ALLOCATIONINFO *pDdiAllocIBase = pDdiAllocate->pAllocationInfo;
+
+                    for (UINT i = 0; i < pResource->SurfCount; ++i)
                     {
-                        Assert(pDdiAllocate->pAllocationInfo->hAllocation);
+                        pDdiAllocate->pAllocationInfo = &pDdiAllocIBase[i];
+                        hr = pDevice->RtCallbacks.pfnAllocateCb(pDevice->hDevice, pDdiAllocate);
+                        Assert(hr == S_OK);
+                        Assert(!pDdiAllocate->hKMResource);
+                        if (SUCCEEDED(hr))
+                        {
+                            Assert(pDdiAllocate->pAllocationInfo->hAllocation);
+                        }
+                        else
+                        {
+                            for (UINT j = 0; i < j; ++j)
+                            {
+                                D3DDDI_ALLOCATIONINFO * pCur = &pDdiAllocIBase[i];
+                                D3DDDICB_DEALLOCATE Dealloc;
+                                Dealloc.hResource = 0;
+                                Dealloc.NumAllocations = 1;
+                                Dealloc.HandleList = &pCur->hAllocation;
+                                HRESULT tmpHr = pDevice->RtCallbacks.pfnDeallocateCb(pDevice->hDevice, &Dealloc);
+                                Assert(tmpHr == S_OK);
+                            }
+                            break;
+                        }
                     }
-                    else
+
+                    pDdiAllocate->pAllocationInfo = pDdiAllocIBase;
+                }
+
+                if (SUCCEEDED(hr))
+                {
+                    pRc->hKMResource = pDdiAllocate->hKMResource;
+
+                    for (UINT i = 0; i < pResource->SurfCount; ++i)
                     {
-                        for (UINT j = 0; i < j; ++j)
+                        PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[i];
+                        D3DDDI_ALLOCATIONINFO *pDdiAllocI = &pDdiAllocate->pAllocationInfo[i];
+                        PVBOXWDDM_ALLOCINFO pAllocInfo = (PVBOXWDDM_ALLOCINFO)pDdiAllocI->pPrivateDriverData;
+                        CONST D3DDDI_SURFACEINFO* pSurf = &pResource->pSurfList[i];
+                        pAllocation->hAllocation = pDdiAllocI->hAllocation;
+                        pAllocation->enmType = VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC;
+                        pAllocation->pvMem = (void*)pSurf->pSysMem;
+                        pAllocation->SurfDesc = pAllocInfo->SurfDesc;
+
+                        if (pResource->Flags.SharedResource)
                         {
-                            D3DDDI_ALLOCATIONINFO * pCur = &pDdiAllocIBase[i];
-                            D3DDDICB_DEALLOCATE Dealloc;
-                            Dealloc.hResource = 0;
-                            Dealloc.NumAllocations = 1;
-                            Dealloc.HandleList = &pCur->hAllocation;
-                            HRESULT tmpHr = pDevice->RtCallbacks.pfnDeallocateCb(pDevice->hDevice, &Dealloc);
-                            Assert(tmpHr == S_OK);
+#ifdef VBOXWDDMDISP_DEBUG_PRINT_SHARED_CREATE
+                            Assert(VBOXWDDMDISP_IS_TEXTURE(pResource->Flags));
+                            vboxVDbgPrint(("\n\n********\n(0x%x:0n%d)Shared CREATED pAlloc(0x%p), hRc(0x%p), hAl(0x%p), "
+                                            "Handle(0x%x), (0n%d) \n***********\n\n",
+                                        GetCurrentProcessId(), GetCurrentProcessId(),
+                                        pAllocation, pRc->hKMResource, pAllocation->hAllocation,
+                                        pAllocation->hSharedHandle, pAllocation->hSharedHandle
+                                        ));
+#endif
                         }
-                        break;
                     }
-                }
-
-                pDdiAllocate->pAllocationInfo = pDdiAllocIBase;
-            }
-
-            if (SUCCEEDED(hr))
-            {
-                pRc->hKMResource = pDdiAllocate->hKMResource;
-
-                for (UINT i = 0; i < pResource->SurfCount; ++i)
-                {
-                    PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[i];
-                    D3DDDI_ALLOCATIONINFO *pDdiAllocI = &pDdiAllocate->pAllocationInfo[i];
-                    PVBOXWDDM_ALLOCINFO pAllocInfo = (PVBOXWDDM_ALLOCINFO)pDdiAllocI->pPrivateDriverData;
-                    CONST D3DDDI_SURFACEINFO* pSurf = &pResource->pSurfList[i];
-                    pAllocation->hAllocation = pDdiAllocI->hAllocation;
-                    pAllocation->enmType = VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC;
-                    pAllocation->pvMem = (void*)pSurf->pSysMem;
-                    pAllocation->SurfDesc = pAllocInfo->SurfDesc;
-
-                    if (pResource->Flags.SharedResource)
-                    {
-#ifdef VBOXWDDMDISP_DEBUG_PRINT_SHARED_CREATE
-                        Assert(VBOXWDDMDISP_IS_TEXTURE(pResource->Flags));
-                        vboxVDbgPrint(("\n\n********\n(0x%x:0n%d)Shared CREATED pAlloc(0x%p), hRc(0x%p), hAl(0x%p), "
-                                        "Handle(0x%x), (0n%d) \n***********\n\n",
-                                    GetCurrentProcessId(), GetCurrentProcessId(),
-                                    pAllocation, pRc->hKMResource, pAllocation->hAllocation,
-                                    pAllocation->hSharedHandle, pAllocation->hSharedHandle
-                                    ));
-#endif
-                    }
-                }
-
-                VBOXVDBG_CREATE_CHECK_SWAPCHAIN();
+
+                    VBOXVDBG_CREATE_CHECK_SWAPCHAIN();
+                }
             }
 
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.cpp	(revision 46661)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.cpp	(revision 46662)
@@ -142,4 +142,10 @@
         }
 
+        pD3D->pfnVBoxWineExD3DSurf9GetHostId = (PFNVBOXWINEEXD3DSURF9_GETHOSTID)GetProcAddress(pD3D->hD3DLib, "VBoxWineExD3DSurf9GetHostId");
+        if (!pD3D->pfnVBoxWineExD3DSurf9GetHostId)
+        {
+            WARN(("no VBoxWineExD3DSurf9GetHostId"));
+            break;
+        }
         return S_OK;
 
@@ -954,11 +960,4 @@
     pFormats->cFormstOps = RT_ELEMENTS(gVBoxFormatOps3D);
 }
-
-
-//#define D3DDEVCAPS_FLOATTLVERTEX        0x00000001
-//#define D3DPMISCCAPS_FOGINFVF           0x00002000
-//#define D3DPRASTERCAPS_SUBPIXEL         0x00000020
-//#define D3DPRASTERCAPS_STIPPLE          0x00000200
-//#define D3DPTEXTURECAPS_TRANSPARENCY    0x00000008
 
 static HRESULT vboxWddmGetD3D9Caps(PVBOXWDDMDISP_D3D pD3D, D3DCAPS9 *pCaps)
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.h	(revision 46661)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.h	(revision 46662)
@@ -79,4 +79,6 @@
     PFNVBOXWINEEXD3DDEV9_FINISH pfnVBoxWineExD3DDev9Finish;
 
+    PFNVBOXWINEEXD3DSURF9_GETHOSTID pfnVBoxWineExD3DSurf9GetHostId;
+
     /* module handle */
     HMODULE hD3DLib;
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h	(revision 46661)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h	(revision 46662)
@@ -160,4 +160,5 @@
     KSPIN_LOCK OpenLock;
     LIST_ENTRY OpenList;
+    uint32_t hostID;
     /* helps tracking when to release wine shared resource */
     uint32_t cShRcRefs;
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp	(revision 46661)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp	(revision 46662)
@@ -2273,4 +2273,5 @@
                     pAllocation->fRcFlags = pAllocInfo->fFlags;
                     pAllocation->AllocData.SurfDesc = pAllocInfo->SurfDesc;
+                    pAllocation->hostID = pAllocInfo->hostID;
 
                     pAllocationInfo->Size = pAllocInfo->SurfDesc.cbSize;
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/d3d9/d3d9wddm.def
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/d3d9/d3d9wddm.def	(revision 46661)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/d3d9/d3d9wddm.def	(revision 46662)
@@ -22,2 +22,3 @@
   VBoxWineExD3DDev9VolBlt
   VBoxWineExD3DDev9VolTexBlt
+  VBoxWineExD3DSurf9GetHostId
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/d3d9/surface.c
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/d3d9/surface.c	(revision 46661)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/d3d9/surface.c	(revision 46662)
@@ -458,2 +458,14 @@
     return impl_from_IDirect3DSurface9(iface);
 }
+
+#ifdef VBOX_WITH_WDDM
+VBOXWINEEX_DECL(HRESULT) VBoxWineExD3DSurf9GetHostId(IDirect3DSurface9 *iface, uint32_t *pu32Id)
+{
+    struct d3d9_surface *surface = impl_from_IDirect3DSurface9(iface);
+    HRESULT hr;
+    wined3d_mutex_lock();
+    hr = wined3d_surface_get_host_id(surface->wined3d_surface, pu32Id);
+    wined3d_mutex_unlock();
+    return hr;
+}
+#endif
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/vbox/VBoxWineEx.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/vbox/VBoxWineEx.h	(revision 46661)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/vbox/VBoxWineEx.h	(revision 46662)
@@ -78,4 +78,7 @@
 typedef FNVBOXWINEEXD3DDEV9_TERM *PFNVBOXWINEEXD3DDEV9_TERM;
 
+typedef VBOXWINEEX_DECL(HRESULT) FNVBOXWINEEXD3DSURF9_GETHOSTID(IDirect3DSurface9 *iface, uint32_t *pu32Id);
+typedef FNVBOXWINEEXD3DSURF9_GETHOSTID *PFNVBOXWINEEXD3DSURF9_GETHOSTID;
+
 typedef VBOXWINEEX_DECL(HRESULT) FNVBOXWINEEXD3DSWAPCHAIN9_PRESENT(IDirect3DSwapChain9 *iface, IDirect3DSurface9 *surf);
 typedef FNVBOXWINEEXD3DSWAPCHAIN9_PRESENT *PFNVBOXWINEEXD3DSWAPCHAIN9_PRESENT;
@@ -120,4 +123,6 @@
 VBOXWINEEX_DECL(HRESULT) VBoxWineExD3DDev9Term(IDirect3DDevice9Ex *iface);
 
+VBOXWINEEX_DECL(HRESULT) VBoxWineExD3DSurf9GetHostId(IDirect3DSurface9 *iface, uint32_t *pu32Id);
+
 VBOXWINEEX_DECL(HRESULT) VBoxWineExD3DSwapchain9Present(IDirect3DSwapChain9 *iface,
                                 IDirect3DSurface9 *surf); /* use the given surface as a frontbuffer content source */
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/vbox/libWineStub/include/wine/wined3d.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/vbox/libWineStub/include/wine/wined3d.h	(revision 46661)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/vbox/libWineStub/include/wine/wined3d.h	(revision 46662)
@@ -2479,7 +2479,7 @@
 HRESULT __cdecl wined3d_device_blt_vol(struct wined3d_device *device, struct wined3d_volume *src, struct wined3d_volume *dst, const struct wined3d_box *pSrcBoxArg, const struct VBOXPOINT3D *pDstPoin3D);
 HRESULT __cdecl wined3d_device_blt_voltex(struct wined3d_device *device, struct wined3d_texture *src, struct wined3d_texture *dst, const struct wined3d_box *pSrcBoxArg, const struct VBOXPOINT3D *pDstPoin3D);
+HRESULT __cdecl wined3d_surface_get_host_id(struct wined3d_surface *surface, uint32_t *id);
 
 HRESULT __cdecl wined3d_swapchain_present_rt(struct wined3d_swapchain *swapchain, struct wined3d_surface *rt);
-
 #endif
 
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/wined3d/surface.c
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/wined3d/surface.c	(revision 46661)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/wined3d/surface.c	(revision 46662)
@@ -7767,2 +7767,25 @@
     return hr;
 }
+
+#ifdef VBOX_WITH_WDDM
+HRESULT CDECL wined3d_surface_get_host_id(struct wined3d_surface *surface, uint32_t *id)
+{
+    struct wined3d_texture *texture;
+    surface_internal_preload(surface, SRGB_RGB);
+
+    texture = surface->container;
+    if (texture && texture->level_count != 1 && texture->layer_count != 1)
+    {
+        ERR("unsupported level(%d) or layer(%d) count", texture->level_count, texture->layer_count);
+    }
+
+    if (!surface->texture_name)
+    {
+        ERR("no texture name!");
+        return E_FAIL;
+    }
+
+    *id = surface->texture_name;
+    return S_OK;
+}
+#endif
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/wined3d/wined3dwddm.def
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/wined3d/wined3dwddm.def	(revision 46661)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Wine_new/wined3d/wined3dwddm.def	(revision 46662)
@@ -258,3 +258,3 @@
   wined3d_device_blt_voltex
   wined3d_swapchain_present_rt
-  
+  wined3d_surface_get_host_id
