Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp	(revision 42556)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp	(revision 42557)
@@ -195,589 +195,4 @@
 
 //#define VBOXWDDMOVERLAY_TEST
-
-static FORMATOP gVBoxFormatOps3D[] = {
-    {D3DDDIFMT_A8R8G8B8,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
-        FORMATOP_SAME_FORMAT_RENDERTARGET|
-        FORMATOP_SAME_FORMAT_UP_TO_ALPHA_RENDERTARGET|
-        FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|FORMATOP_SRGBREAD|
-        FORMATOP_MEMBEROFGROUP_ARGB|
-        FORMATOP_SRGBWRITE|FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_X8R8G8B8,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
-        FORMATOP_SAME_FORMAT_RENDERTARGET|
-        FORMATOP_DISPLAYMODE|FORMATOP_3DACCELERATION|
-        FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|FORMATOP_SRGBREAD|
-        FORMATOP_MEMBEROFGROUP_ARGB|
-        FORMATOP_SRGBWRITE|FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_A2R10G10B10,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
-        FORMATOP_SAME_FORMAT_RENDERTARGET|
-        0|
-        FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|
-        FORMATOP_MEMBEROFGROUP_ARGB|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_X1R5G5B5,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
-        FORMATOP_SAME_FORMAT_RENDERTARGET|
-        0|
-        FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|
-        FORMATOP_MEMBEROFGROUP_ARGB|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_A1R5G5B5,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
-        FORMATOP_SAME_FORMAT_RENDERTARGET|
-        FORMATOP_SAME_FORMAT_UP_TO_ALPHA_RENDERTARGET|
-        FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|
-        FORMATOP_MEMBEROFGROUP_ARGB|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_A4R4G4B4,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
-        FORMATOP_SAME_FORMAT_RENDERTARGET|
-        FORMATOP_SAME_FORMAT_UP_TO_ALPHA_RENDERTARGET|
-        FORMATOP_OFFSCREENPLAIN|
-        0|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_R5G6B5,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
-        FORMATOP_SAME_FORMAT_RENDERTARGET|
-        FORMATOP_DISPLAYMODE|FORMATOP_3DACCELERATION|
-        FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|
-        FORMATOP_MEMBEROFGROUP_ARGB|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_L16,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
-        0|
-        0|
-        FORMATOP_OFFSCREENPLAIN|
-        0|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_A8L8,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
-        0|
-        0|
-        FORMATOP_OFFSCREENPLAIN|
-        0|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_A8,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
-        0|
-        0|
-        FORMATOP_OFFSCREENPLAIN|
-        0|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_L8,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
-        0|
-        0|
-        FORMATOP_OFFSCREENPLAIN|
-        0|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_D16,   FORMATOP_TEXTURE|FORMATOP_ZSTENCIL|FORMATOP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH, 0, 0, 0},
-    {D3DDDIFMT_D24S8, FORMATOP_TEXTURE|FORMATOP_ZSTENCIL|FORMATOP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH, 0, 0, 0},
-    {D3DDDIFMT_D24X8, FORMATOP_TEXTURE|FORMATOP_ZSTENCIL|FORMATOP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH, 0, 0, 0},
-    {D3DDDIFMT_D16_LOCKABLE, FORMATOP_ZSTENCIL|FORMATOP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH, 0, 0, 0},
-    {D3DDDIFMT_X8D24, FORMATOP_TEXTURE|FORMATOP_ZSTENCIL|FORMATOP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH, 0, 0, 0},
-    {D3DDDIFMT_D32F_LOCKABLE, FORMATOP_TEXTURE|FORMATOP_ZSTENCIL|FORMATOP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH, 0, 0, 0},
-    {D3DDDIFMT_S8D24, FORMATOP_TEXTURE|FORMATOP_ZSTENCIL|FORMATOP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH, 0, 0, 0},
-
-    {D3DDDIFMT_DXT1,
-        FORMATOP_TEXTURE|FORMATOP_CUBETEXTURE|
-        0|
-        0|
-        FORMATOP_OFFSCREENPLAIN|FORMATOP_SRGBREAD|
-        0|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_DXT2,
-        FORMATOP_TEXTURE|FORMATOP_CUBETEXTURE|
-        0|
-        0|
-        FORMATOP_OFFSCREENPLAIN|FORMATOP_SRGBREAD|
-        0|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_DXT3,
-        FORMATOP_TEXTURE|FORMATOP_CUBETEXTURE|
-        0|
-        0|
-        FORMATOP_OFFSCREENPLAIN|FORMATOP_SRGBREAD|
-        0|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_DXT4,
-        FORMATOP_TEXTURE|FORMATOP_CUBETEXTURE|
-        0|
-        0|
-        FORMATOP_OFFSCREENPLAIN|FORMATOP_SRGBREAD|
-        0|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_DXT5,
-        FORMATOP_TEXTURE|FORMATOP_CUBETEXTURE|
-        0|
-        0|
-        FORMATOP_OFFSCREENPLAIN|FORMATOP_SRGBREAD|
-        0|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_X8L8V8U8,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
-        0|
-        0|
-        0|
-        FORMATOP_BUMPMAP|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_A2W10V10U10,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
-        0|
-        0|
-        0|
-        FORMATOP_BUMPMAP|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_V8U8,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
-        0|
-        0|
-        0|
-        FORMATOP_BUMPMAP|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_Q8W8V8U8,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
-        0|
-        0|
-        FORMATOP_OFFSCREENPLAIN|
-        FORMATOP_BUMPMAP|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_CxV8U8, FORMATOP_NOFILTER|FORMATOP_NOALPHABLEND|FORMATOP_NOTEXCOORDWRAPNORMIP, 0, 0, 0},
-
-    {D3DDDIFMT_R16F,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
-        FORMATOP_SAME_FORMAT_RENDERTARGET|
-        0|
-        FORMATOP_OFFSCREENPLAIN|
-        0|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_R32F,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
-        FORMATOP_SAME_FORMAT_RENDERTARGET|
-        0|
-        FORMATOP_OFFSCREENPLAIN|
-        0|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_G16R16F,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
-        FORMATOP_SAME_FORMAT_RENDERTARGET|
-        0|
-        FORMATOP_OFFSCREENPLAIN|
-        0|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_G32R32F,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
-        FORMATOP_SAME_FORMAT_RENDERTARGET|
-        0|
-        FORMATOP_OFFSCREENPLAIN|
-        0|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_A16B16G16R16F,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
-        FORMATOP_SAME_FORMAT_RENDERTARGET|
-        0|
-        FORMATOP_OFFSCREENPLAIN|
-        0|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_A32B32G32R32F,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
-        FORMATOP_SAME_FORMAT_RENDERTARGET|
-        0|
-        FORMATOP_OFFSCREENPLAIN|
-        0|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_G16R16,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
-        FORMATOP_SAME_FORMAT_RENDERTARGET|
-        0|
-        FORMATOP_OFFSCREENPLAIN|
-        0|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_A16B16G16R16,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
-        FORMATOP_SAME_FORMAT_RENDERTARGET|
-        0|
-        FORMATOP_OFFSCREENPLAIN|
-        0|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_V16U16,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
-        0|
-        0|
-        0|
-        FORMATOP_BUMPMAP|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_P8, FORMATOP_DISPLAYMODE|FORMATOP_3DACCELERATION|FORMATOP_OFFSCREENPLAIN, 0, 0, 0},
-
-    {D3DDDIFMT_UYVY,
-        0|
-        0|
-        0|
-        FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|
-        FORMATOP_NOFILTER|
-        FORMATOP_NOALPHABLEND|
-        FORMATOP_NOTEXCOORDWRAPNORMIP, 0, 0, 0},
-
-    {D3DDDIFMT_YUY2,
-        0|
-        0|
-        0|
-        FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|
-        FORMATOP_NOFILTER|
-        FORMATOP_NOALPHABLEND|
-        FORMATOP_NOTEXCOORDWRAPNORMIP, 0, 0, 0},
-
-    {D3DDDIFMT_Q16W16V16U16,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
-        FORMATOP_SAME_FORMAT_RENDERTARGET|
-        0|
-        FORMATOP_OFFSCREENPLAIN|
-        FORMATOP_BUMPMAP|FORMATOP_DMAP|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_X8B8G8R8,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
-        FORMATOP_SAME_FORMAT_RENDERTARGET|
-        FORMATOP_SAME_FORMAT_UP_TO_ALPHA_RENDERTARGET|
-        FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|FORMATOP_SRGBREAD|
-        FORMATOP_DMAP|FORMATOP_MEMBEROFGROUP_ARGB|
-        FORMATOP_SRGBWRITE|FORMATOP_AUTOGENMIPMAP|FORMATOP_VERTEXTEXTURE|
-        FORMATOP_OVERLAY, 0, 0, 0},
-
-    {D3DDDIFMT_BINARYBUFFER, FORMATOP_OFFSCREENPLAIN, 0, 0, 0},
-
-    {D3DDDIFMT_A4L4,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
-        0|
-        0|
-        FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|
-        FORMATOP_DMAP|
-        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-
-    {D3DDDIFMT_A2B10G10R10,
-        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
-        FORMATOP_SAME_FORMAT_RENDERTARGET|
-        0|
-        FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|
-        FORMATOP_DMAP|FORMATOP_MEMBEROFGROUP_ARGB|
-        FORMATOP_AUTOGENMIPMAP|FORMATOP_VERTEXTEXTURE, 0, 0, 0},
-};
-
-static FORMATOP gVBoxFormatOpsBase[] = {
-    {D3DDDIFMT_X8R8G8B8, FORMATOP_DISPLAYMODE, 0, 0, 0},
-
-    {D3DDDIFMT_R8G8B8, FORMATOP_DISPLAYMODE, 0, 0, 0},
-
-    {D3DDDIFMT_R5G6B5, FORMATOP_DISPLAYMODE, 0, 0, 0},
-
-    {D3DDDIFMT_P8, FORMATOP_DISPLAYMODE, 0, 0, 0},
-};
-
-static DDSURFACEDESC gVBoxSurfDescsBase[] = {
-        {
-            sizeof (DDSURFACEDESC), /*    DWORD   dwSize;  */
-            DDSD_CAPS | DDSD_PIXELFORMAT,    /* DWORD dwFlags;    */
-            0,    /* DWORD dwHeight;   */
-            0,    /* DWORD dwWidth;    */
-            {
-                0, /* Union             */
-                   /*   LONG lPitch; */
-                   /*   DWORD dwLinearSize; */
-            },
-            0,  /*    DWORD dwBackBufferCount; */
-            {
-                0, /* Union */
-                   /*  DWORD dwMipMapCount; */
-                   /*    DWORD dwZBufferBitDepth; */
-                   /*   DWORD dwRefreshRate; */
-            },
-            0, /*    DWORD dwAlphaBitDepth; */
-            0, /*   DWORD dwReserved; */
-            NULL, /*   LPVOID lpSurface; */
-            {
-                0, /* DWORD dwColorSpaceLowValue; */
-                0, /* DWORD dwColorSpaceHighValue; */
-            }, /* DDCOLORKEY  ddckCKDestOverlay; */
-            {
-                0, /* DWORD dwColorSpaceLowValue; */
-                0, /* DWORD dwColorSpaceHighValue; */
-            }, /* DDCOLORKEY  ddckCKDestBlt; */
-            {
-                0, /* DWORD dwColorSpaceLowValue; */
-                0, /* DWORD dwColorSpaceHighValue; */
-            }, /* DDCOLORKEY  ddckCKSrcOverlay; */
-            {
-                0, /* DWORD dwColorSpaceLowValue; */
-                0, /* DWORD dwColorSpaceHighValue; */
-            }, /* DDCOLORKEY ddckCKSrcBlt; */
-            {
-                sizeof (DDPIXELFORMAT), /* DWORD dwSize; */
-                DDPF_RGB, /* DWORD dwFlags; */
-                0, /* DWORD dwFourCC; */
-                {
-                    32, /* union */
-                       /* DWORD dwRGBBitCount; */
-                       /* DWORD dwYUVBitCount; */
-                       /* DWORD dwZBufferBitDepth; */
-                       /* DWORD dwAlphaBitDepth; */
-                       /* DWORD dwLuminanceBitCount; */
-                       /* DWORD dwBumpBitCount; */
-                },
-                {
-                    0xff0000, /* union */
-                       /* DWORD dwRBitMask; */
-                       /* DWORD dwYBitMask; */
-                        /* DWORD dwStencilBitDepth; */
-                        /* DWORD dwLuminanceBitMask; */
-                        /* DWORD dwBumpDuBitMask; */
-                },
-                {
-                    0xff00,
-                        /* DWORD dwGBitMask; */
-                        /* DWORD dwUBitMask; */
-                        /* DWORD dwZBitMask; */
-                        /* DWORD dwBumpDvBitMask; */
-                },
-                {
-                    0xff,
-                        /* DWORD dwBBitMask; */
-                        /* DWORD dwVBitMask; */
-                        /* DWORD dwStencilBitMask; */
-                        /* DWORD dwBumpLuminanceBitMask; */
-                },
-                {
-                    0,
-                        /* DWORD dwRGBAlphaBitMask; */
-                        /* DWORD dwYUVAlphaBitMask; */
-                        /* DWORD dwLuminanceAlphaBitMask; */
-                        /* DWORD dwRGBZBitMask; */
-                        /* DWORD dwYUVZBitMask; */
-                },
-            }, /* DDPIXELFORMAT ddpfPixelFormat; */
-            {
-                DDSCAPS_BACKBUFFER
-                | DDSCAPS_COMPLEX
-                | DDSCAPS_FLIP
-                | DDSCAPS_FRONTBUFFER
-                | DDSCAPS_LOCALVIDMEM
-                | DDSCAPS_PRIMARYSURFACE
-                | DDSCAPS_VIDEOMEMORY
-                | DDSCAPS_VISIBLE   /* DWORD dwCaps; */
-            } /* DDSCAPS ddsCaps; */
-        },
-        {
-            sizeof (DDSURFACEDESC), /*    DWORD   dwSize;  */
-            DDSD_CAPS | DDSD_PIXELFORMAT,    /* DWORD dwFlags;    */
-            0,    /* DWORD dwHeight;   */
-            0,    /* DWORD dwWidth;    */
-            {
-                0, /* Union             */
-                   /*   LONG lPitch; */
-                   /*   DWORD dwLinearSize; */
-            },
-            0,  /*    DWORD dwBackBufferCount; */
-            {
-                0, /* Union */
-                   /*  DWORD dwMipMapCount; */
-                   /*    DWORD dwZBufferBitDepth; */
-                   /*   DWORD dwRefreshRate; */
-            },
-            0, /*    DWORD dwAlphaBitDepth; */
-            0, /*   DWORD dwReserved; */
-            NULL, /*   LPVOID lpSurface; */
-            {
-                0, /* DWORD dwColorSpaceLowValue; */
-                0, /* DWORD dwColorSpaceHighValue; */
-            }, /* DDCOLORKEY  ddckCKDestOverlay; */
-            {
-                0, /* DWORD dwColorSpaceLowValue; */
-                0, /* DWORD dwColorSpaceHighValue; */
-            }, /* DDCOLORKEY  ddckCKDestBlt; */
-            {
-                0, /* DWORD dwColorSpaceLowValue; */
-                0, /* DWORD dwColorSpaceHighValue; */
-            }, /* DDCOLORKEY  ddckCKSrcOverlay; */
-            {
-                0, /* DWORD dwColorSpaceLowValue; */
-                0, /* DWORD dwColorSpaceHighValue; */
-            }, /* DDCOLORKEY ddckCKSrcBlt; */
-            {
-                sizeof (DDPIXELFORMAT), /* DWORD dwSize; */
-                DDPF_RGB, /* DWORD dwFlags; */
-                0, /* DWORD dwFourCC; */
-                {
-                    24, /* union */
-                       /* DWORD dwRGBBitCount; */
-                       /* DWORD dwYUVBitCount; */
-                       /* DWORD dwZBufferBitDepth; */
-                       /* DWORD dwAlphaBitDepth; */
-                       /* DWORD dwLuminanceBitCount; */
-                       /* DWORD dwBumpBitCount; */
-                },
-                {
-                    0xff0000, /* union */
-                       /* DWORD dwRBitMask; */
-                       /* DWORD dwYBitMask; */
-                        /* DWORD dwStencilBitDepth; */
-                        /* DWORD dwLuminanceBitMask; */
-                        /* DWORD dwBumpDuBitMask; */
-                },
-                {
-                    0xff00,
-                        /* DWORD dwGBitMask; */
-                        /* DWORD dwUBitMask; */
-                        /* DWORD dwZBitMask; */
-                        /* DWORD dwBumpDvBitMask; */
-                },
-                {
-                    0xff,
-                        /* DWORD dwBBitMask; */
-                        /* DWORD dwVBitMask; */
-                        /* DWORD dwStencilBitMask; */
-                        /* DWORD dwBumpLuminanceBitMask; */
-                },
-                {
-                    0,
-                        /* DWORD dwRGBAlphaBitMask; */
-                        /* DWORD dwYUVAlphaBitMask; */
-                        /* DWORD dwLuminanceAlphaBitMask; */
-                        /* DWORD dwRGBZBitMask; */
-                        /* DWORD dwYUVZBitMask; */
-                },
-            }, /* DDPIXELFORMAT ddpfPixelFormat; */
-            {
-                DDSCAPS_BACKBUFFER
-                | DDSCAPS_COMPLEX
-                | DDSCAPS_FLIP
-                | DDSCAPS_FRONTBUFFER
-                | DDSCAPS_LOCALVIDMEM
-                | DDSCAPS_PRIMARYSURFACE
-                | DDSCAPS_VIDEOMEMORY
-                | DDSCAPS_VISIBLE  /* DWORD dwCaps; */
-            } /* DDSCAPS ddsCaps; */
-        },
-        {
-            sizeof (DDSURFACEDESC), /*    DWORD   dwSize;  */
-            DDSD_CAPS | DDSD_PIXELFORMAT,    /* DWORD dwFlags;    */
-            0,    /* DWORD dwHeight;   */
-            0,    /* DWORD dwWidth;    */
-            {
-                0, /* Union             */
-                   /*   LONG lPitch; */
-                   /*   DWORD dwLinearSize; */
-            },
-            0,  /*    DWORD dwBackBufferCount; */
-            {
-                0, /* Union */
-                   /*  DWORD dwMipMapCount; */
-                   /*    DWORD dwZBufferBitDepth; */
-                   /*   DWORD dwRefreshRate; */
-            },
-            0, /*    DWORD dwAlphaBitDepth; */
-            0, /*   DWORD dwReserved; */
-            NULL, /*   LPVOID lpSurface; */
-            {
-                0, /* DWORD dwColorSpaceLowValue; */
-                0, /* DWORD dwColorSpaceHighValue; */
-            }, /* DDCOLORKEY  ddckCKDestOverlay; */
-            {
-                0, /* DWORD dwColorSpaceLowValue; */
-                0, /* DWORD dwColorSpaceHighValue; */
-            }, /* DDCOLORKEY  ddckCKDestBlt; */
-            {
-                0, /* DWORD dwColorSpaceLowValue; */
-                0, /* DWORD dwColorSpaceHighValue; */
-            }, /* DDCOLORKEY  ddckCKSrcOverlay; */
-            {
-                0, /* DWORD dwColorSpaceLowValue; */
-                0, /* DWORD dwColorSpaceHighValue; */
-            }, /* DDCOLORKEY ddckCKSrcBlt; */
-            {
-                sizeof (DDPIXELFORMAT), /* DWORD dwSize; */
-                DDPF_RGB, /* DWORD dwFlags; */
-                0, /* DWORD dwFourCC; */
-                {
-                    16, /* union */
-                       /* DWORD dwRGBBitCount; */
-                       /* DWORD dwYUVBitCount; */
-                       /* DWORD dwZBufferBitDepth; */
-                       /* DWORD dwAlphaBitDepth; */
-                       /* DWORD dwLuminanceBitCount; */
-                       /* DWORD dwBumpBitCount; */
-                },
-                {
-                    0xf800, /* union */
-                       /* DWORD dwRBitMask; */
-                       /* DWORD dwYBitMask; */
-                        /* DWORD dwStencilBitDepth; */
-                        /* DWORD dwLuminanceBitMask; */
-                        /* DWORD dwBumpDuBitMask; */
-                },
-                {
-                    0x7e0,
-                        /* DWORD dwGBitMask; */
-                        /* DWORD dwUBitMask; */
-                        /* DWORD dwZBitMask; */
-                        /* DWORD dwBumpDvBitMask; */
-                },
-                {
-                    0x1f,
-                        /* DWORD dwBBitMask; */
-                        /* DWORD dwVBitMask; */
-                        /* DWORD dwStencilBitMask; */
-                        /* DWORD dwBumpLuminanceBitMask; */
-                },
-                {
-                    0,
-                        /* DWORD dwRGBAlphaBitMask; */
-                        /* DWORD dwYUVAlphaBitMask; */
-                        /* DWORD dwLuminanceAlphaBitMask; */
-                        /* DWORD dwRGBZBitMask; */
-                        /* DWORD dwYUVZBitMask; */
-                },
-            }, /* DDPIXELFORMAT ddpfPixelFormat; */
-            {
-                DDSCAPS_BACKBUFFER
-                | DDSCAPS_COMPLEX
-                | DDSCAPS_FLIP
-                | DDSCAPS_FRONTBUFFER
-                | DDSCAPS_LOCALVIDMEM
-                | DDSCAPS_PRIMARYSURFACE
-                | DDSCAPS_VIDEOMEMORY
-                | DDSCAPS_VISIBLE /* DWORD dwCaps; */
-            } /* DDSCAPS ddsCaps; */
-        },
-};
 
 static D3DDDIQUERYTYPE gVBoxQueryTypes[] = {
@@ -1027,196 +442,5 @@
 }
 
-static void vboxVhwaPopulateOverlayFourccSurfDesc(DDSURFACEDESC *pDesc, uint32_t fourcc)
-{
-    memset(pDesc, 0, sizeof (DDSURFACEDESC));
-
-    pDesc->dwSize = sizeof (DDSURFACEDESC);
-    pDesc->dwFlags = DDSD_CAPS | DDSD_PIXELFORMAT;
-    pDesc->ddpfPixelFormat.dwSize = sizeof (DDPIXELFORMAT);
-    pDesc->ddpfPixelFormat.dwFlags = DDPF_FOURCC;
-    pDesc->ddpfPixelFormat.dwFourCC = fourcc;
-    pDesc->ddsCaps.dwCaps = DDSCAPS_BACKBUFFER
-            | DDSCAPS_COMPLEX
-            | DDSCAPS_FLIP
-            | DDSCAPS_FRONTBUFFER
-            | DDSCAPS_LOCALVIDMEM
-            | DDSCAPS_OVERLAY
-            | DDSCAPS_VIDEOMEMORY
-            | DDSCAPS_VISIBLE;
-}
-
-#endif
-
-static bool vboxPixFormatMatch(DDPIXELFORMAT *pFormat1, DDPIXELFORMAT *pFormat2)
-{
-    return !memcmp(pFormat1, pFormat2, sizeof (DDPIXELFORMAT));
-}
-
-int vboxSurfDescMerge(DDSURFACEDESC *paDescs, uint32_t *pcDescs, uint32_t cMaxDescs, DDSURFACEDESC *pDesc)
-{
-    uint32_t cDescs = *pcDescs;
-
-    Assert(cMaxDescs >= cDescs);
-    Assert(pDesc->dwFlags == (DDSD_CAPS | DDSD_PIXELFORMAT));
-    if (pDesc->dwFlags != (DDSD_CAPS | DDSD_PIXELFORMAT))
-        return VERR_INVALID_PARAMETER;
-
-    for (uint32_t i = 0; i < cDescs; ++i)
-    {
-        DDSURFACEDESC *pCur = &paDescs[i];
-        if (vboxPixFormatMatch(&pCur->ddpfPixelFormat, &pDesc->ddpfPixelFormat))
-        {
-            if (pDesc->dwFlags & DDSD_CAPS)
-            {
-                pCur->dwFlags |= DDSD_CAPS;
-                pCur->ddsCaps.dwCaps |= pDesc->ddsCaps.dwCaps;
-            }
-            return VINF_SUCCESS;
-        }
-    }
-
-    if (cMaxDescs > cDescs)
-    {
-        paDescs[cDescs] = *pDesc;
-        ++cDescs;
-        *pcDescs = cDescs;
-        return VINF_SUCCESS;
-    }
-    return VERR_BUFFER_OVERFLOW;
-}
-
-int vboxFormatOpsMerge(FORMATOP *paOps, uint32_t *pcOps, uint32_t cMaxOps, FORMATOP *pOp)
-{
-    uint32_t cOps = *pcOps;
-
-    Assert(cMaxOps >= cOps);
-
-    for (uint32_t i = 0; i < cOps; ++i)
-    {
-        FORMATOP *pCur = &paOps[i];
-        if (pCur->Format == pOp->Format)
-        {
-            pCur->Operations |= pOp->Operations;
-            Assert(pCur->FlipMsTypes == pOp->FlipMsTypes);
-            Assert(pCur->BltMsTypes == pOp->BltMsTypes);
-            Assert(pCur->PrivateFormatBitCount == pOp->PrivateFormatBitCount);
-            return VINF_SUCCESS;
-        }
-    }
-
-    if (cMaxOps > cOps)
-    {
-        paOps[cOps] = *pOp;
-        ++cOps;
-        *pcOps = cOps;
-        return VINF_SUCCESS;
-    }
-    return VERR_BUFFER_OVERFLOW;
-}
-
-int vboxCapsInit(PVBOXWDDMDISP_ADAPTER pAdapter)
-{
-    pAdapter->cFormstOps = 0;
-    pAdapter->paFormstOps = NULL;
-    pAdapter->cSurfDescs = 0;
-    pAdapter->paSurfDescs = NULL;
-
-    if (VBOXDISPMODE_IS_3D(pAdapter))
-    {
-        pAdapter->paFormstOps = (FORMATOP*)RTMemAllocZ(sizeof (gVBoxFormatOps3D));
-        Assert(pAdapter->paFormstOps);
-        if (pAdapter->paFormstOps)
-        {
-            memcpy (pAdapter->paFormstOps , gVBoxFormatOps3D, sizeof (gVBoxFormatOps3D));
-            pAdapter->cFormstOps = RT_ELEMENTS(gVBoxFormatOps3D);
-        }
-        else
-            return VERR_OUT_OF_RESOURCES;
-    }
-#ifdef VBOX_WITH_VIDEOHWACCEL
-    else
-    {
-        /* just calc the max number of formats */
-        uint32_t cFormats = RT_ELEMENTS(gVBoxFormatOpsBase);
-        uint32_t cSurfDescs = RT_ELEMENTS(gVBoxSurfDescsBase);
-        uint32_t cOverlayFormats = 0;
-        for (uint32_t i = 0; i < pAdapter->cHeads; ++i)
-        {
-            VBOXDISPVHWA_INFO *pVhwa = &pAdapter->aHeads[i].Vhwa;
-            if (pVhwa->Settings.fFlags & VBOXVHWA_F_ENABLED)
-            {
-                cOverlayFormats += pVhwa->Settings.cFormats;
-            }
-        }
-
-        cFormats += cOverlayFormats;
-        cSurfDescs += cOverlayFormats;
-
-        uint32_t cbFormatOps = cFormats * sizeof (FORMATOP);
-        cbFormatOps = (cbFormatOps + 7) & ~3;
-        /* ensure the surf descs are 8 byte aligned */
-        uint32_t offSurfDescs = (cbFormatOps + 7) & ~3;
-        uint32_t cbSurfDescs = cSurfDescs * sizeof (DDSURFACEDESC);
-        uint32_t cbBuf = offSurfDescs + cbSurfDescs;
-        uint8_t* pvBuf = (uint8_t*)RTMemAllocZ(cbBuf);
-        Assert(pvBuf);
-        if (pvBuf)
-        {
-            pAdapter->paFormstOps = (FORMATOP*)pvBuf;
-            memcpy (pAdapter->paFormstOps , gVBoxFormatOpsBase, sizeof (gVBoxFormatOpsBase));
-            pAdapter->cFormstOps = RT_ELEMENTS(gVBoxFormatOpsBase);
-
-            FORMATOP fo = {D3DDDIFMT_UNKNOWN, 0, 0, 0, 0};
-            for (uint32_t i = 0; i < pAdapter->cHeads; ++i)
-            {
-                VBOXDISPVHWA_INFO *pVhwa = &pAdapter->aHeads[i].Vhwa;
-                if (pVhwa->Settings.fFlags & VBOXVHWA_F_ENABLED)
-                {
-                    for (uint32_t j = 0; j < pVhwa->Settings.cFormats; ++j)
-                    {
-                        fo.Format = pVhwa->Settings.aFormats[j];
-                        fo.Operations = FORMATOP_OVERLAY;
-                        int rc = vboxFormatOpsMerge(pAdapter->paFormstOps, &pAdapter->cFormstOps, cFormats, &fo);
-                        AssertRC(rc);
-                    }
-                }
-            }
-
-            pAdapter->paSurfDescs = (DDSURFACEDESC*)(pvBuf + offSurfDescs);
-            memcpy (pAdapter->paSurfDescs , gVBoxSurfDescsBase, sizeof (gVBoxSurfDescsBase));
-            pAdapter->cSurfDescs = RT_ELEMENTS(gVBoxSurfDescsBase);
-
-            DDSURFACEDESC sd;
-            for (uint32_t i = 0; i < pAdapter->cHeads; ++i)
-            {
-                VBOXDISPVHWA_INFO *pVhwa = &pAdapter->aHeads[i].Vhwa;
-                if (pVhwa->Settings.fFlags & VBOXVHWA_F_ENABLED)
-                {
-                    for (uint32_t j = 0; j < pVhwa->Settings.cFormats; ++j)
-                    {
-                        uint32_t fourcc = vboxWddmFormatToFourcc(pVhwa->Settings.aFormats[j]);
-                        if (fourcc)
-                        {
-                            vboxVhwaPopulateOverlayFourccSurfDesc(&sd, fourcc);
-                            int rc = vboxSurfDescMerge(pAdapter->paSurfDescs, &pAdapter->cSurfDescs, cSurfDescs, &sd);
-                            AssertRC(rc);
-                        }
-                    }
-                }
-            }
-        }
-        else
-            return VERR_OUT_OF_RESOURCES;
-    }
-#endif
-
-    return VINF_SUCCESS;
-}
-
-void vboxCapsFree(PVBOXWDDMDISP_ADAPTER pAdapter)
-{
-    if (pAdapter->paFormstOps)
-        RTMemFree(pAdapter->paFormstOps);
-}
+#endif
 
 static void vboxResourceFree(PVBOXWDDMDISP_RESOURCE pRc)
@@ -2496,5 +1720,5 @@
             {
                 Params.pHgsmi = &pDevice->Uhgsmi.BasePrivate.Base;
-                hr = pAdapter->pD3D9If->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, NULL, fFlags, &Params.Base, &pDevice9If);
+                hr = pAdapter->D3D.pD3D9If->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, NULL, fFlags, &Params.Base, &pDevice9If);
                 Assert(hr == S_OK);
                 if (hr == S_OK)
@@ -2790,5 +2014,5 @@
         if (FAILED(hr))
             return hr;
-        hr = pDevice->pAdapter->D3D.pfnVBoxWineExD3DSwapchain9Present(pSwapchain->pSwapChainIf, pSurf);
+        hr = pDevice->pAdapter->D3D.D3D.pfnVBoxWineExD3DSwapchain9Present(pSwapchain->pSwapChainIf, pSurf);
         Assert(hr == S_OK);
         pSurf->Release();
@@ -2816,5 +2040,5 @@
         VBOXVDBG_ASSERT_IS_DWM(FALSE);
 
-        HRESULT hr = pDevice->pAdapter->D3D.pfnVBoxWineExD3DDev9Flush((IDirect3DDevice9Ex*)pDevice->pDevice9If);
+        HRESULT hr = pDevice->pAdapter->D3D.D3D.pfnVBoxWineExD3DDev9Flush((IDirect3DDevice9Ex*)pDevice->pDevice9If);
         Assert(hr == S_OK);
 
@@ -3027,4 +2251,5 @@
                         if (hr == S_OK)
                         {
+                            VBoxDispD3DGlobalInit();
                             vboxVDbgPrint(("VBoxDispD3D: DLL loaded OK\n"));
                             return TRUE;
@@ -3056,4 +2281,5 @@
 //                    VbglR3Term();
                     /// @todo RTR3Term();
+                    VBoxDispD3DGlobalTerm();
                     return TRUE;
                 }
@@ -3067,18 +2293,4 @@
     }
     return FALSE;
-}
-
-static HRESULT vboxWddmGetD3D9Caps(PVBOXWDDMDISP_ADAPTER pAdapter, D3DCAPS9 *pCaps)
-{
-    HRESULT hr = pAdapter->pD3D9If->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, pCaps);
-    if (FAILED(hr))
-    {
-        WARN(("GetDeviceCaps failed hr(0x%x)",hr));
-        return hr;
-    }
-
-    vboxDispDumpD3DCAPS9(pCaps);
-
-    return S_OK;
 }
 
@@ -3179,9 +2391,9 @@
         }
         case D3DDDICAPS_GETFORMATCOUNT:
-            *((uint32_t*)pData->pData) = pAdapter->cFormstOps;
+            *((uint32_t*)pData->pData) = pAdapter->Formats.cFormstOps;
             break;
         case D3DDDICAPS_GETFORMATDATA:
-            Assert(pData->DataSize == pAdapter->cFormstOps * sizeof (FORMATOP));
-            memcpy(pData->pData, pAdapter->paFormstOps, pAdapter->cFormstOps * sizeof (FORMATOP));
+            Assert(pData->DataSize == pAdapter->Formats.cFormstOps * sizeof (FORMATOP));
+            memcpy(pData->pData, pAdapter->Formats.paFormstOps, pAdapter->Formats.cFormstOps * sizeof (FORMATOP));
             break;
         case D3DDDICAPS_GETD3DQUERYCOUNT:
@@ -3290,5 +2502,4 @@
         {
             Assert(pData->DataSize == sizeof (D3DCAPS9));
-//            Assert(0);
             if (pData->DataSize >= sizeof (D3DCAPS9))
             {
@@ -3296,13 +2507,7 @@
                 if (VBOXDISPMODE_IS_3D(pAdapter))
                 {
-                    D3DCAPS9* pCaps = (D3DCAPS9*)pData->pData;
-                    hr = vboxWddmGetD3D9Caps(pAdapter, pCaps);
-                    Assert(hr == S_OK);
-                    if (hr == S_OK)
-                        break;
-
-                    vboxVDbgPrintR((__FUNCTION__": GetDeviceCaps Failed hr(%d)\n", hr));
-                    /* let's fall back to the 3D disabled case */
+                    memcpy(pData->pData, &pAdapter->D3D.Caps, sizeof (D3DCAPS9));
                     hr = S_OK;
+                    break;
                 }
 
@@ -3321,18 +2526,8 @@
                 if (VBOXDISPMODE_IS_3D(pAdapter))
                 {
-                    D3DCAPS9 Caps9;
-                    hr = vboxWddmGetD3D9Caps(pAdapter, &Caps9);
-                    Assert(hr == S_OK);
-                    if (hr == S_OK)
-                    {
-                        memcpy(pData->pData, &Caps9, RT_OFFSETOF(D3DCAPS9, DevCaps2));
-                        break;
-                    }
-
-                    vboxVDbgPrintR((__FUNCTION__": GetDeviceCaps Failed hr(%d)\n", hr));
-                    /* let's fall back to the 3D disabled case */
+                    memcpy(pData->pData, &pAdapter->D3D.Caps, RT_OFFSETOF(D3DCAPS9, DevCaps2));
                     hr = S_OK;
-                }
-
+                    break;
+                }
             }
             else
@@ -5255,5 +4450,5 @@
                 if (hr == S_OK)
                 {
-                    hr = pDevice->pAdapter->D3D.pfnVBoxWineExD3DDev9CreateTexture((IDirect3DDevice9Ex *)pDevice9If,
+                    hr = pDevice->pAdapter->D3D.D3D.pfnVBoxWineExD3DDev9CreateTexture((IDirect3DDevice9Ex *)pDevice9If,
                                                 pAllocation->D3DWidth,
                                                 pSurf->Height,
@@ -5325,5 +4520,5 @@
                     if (hr == S_OK)
                     {
-                        hr = pDevice->pAdapter->D3D.pfnVBoxWineExD3DDev9CreateCubeTexture((IDirect3DDevice9Ex *)pDevice9If,
+                        hr = pDevice->pAdapter->D3D.D3D.pfnVBoxWineExD3DDev9CreateCubeTexture((IDirect3DDevice9Ex *)pDevice9If,
                                                 pAllocation->SurfDesc.width,
                                                 VBOXDISP_CUBEMAP_LEVELS_COUNT(pRc),
@@ -5802,5 +4997,5 @@
     {
 
-        hr = pDevice->pAdapter->D3D.pfnVBoxWineExD3DDev9Flush((IDirect3DDevice9Ex*)pDevice->pDevice9If);
+        hr = pDevice->pAdapter->D3D.D3D.pfnVBoxWineExD3DDev9Flush((IDirect3DDevice9Ex*)pDevice->pDevice9If);
         Assert(hr == S_OK);
 
@@ -6625,5 +5820,5 @@
          * Release may not work in case of some leaking, which will leave the crOgl context refering the destroyed VBOXUHGSMI */
         if (pDevice->pDevice9If)
-            pDevice->pAdapter->D3D.pfnVBoxWineExD3DDev9Term((IDirect3DDevice9Ex *)pDevice->pDevice9If);
+            pDevice->pAdapter->D3D.D3D.pfnVBoxWineExD3DDev9Term((IDirect3DDevice9Ex *)pDevice->pDevice9If);
     }
 
@@ -6996,5 +6191,5 @@
                     {
                         IDirect3DTexture9 *pD3DIfTex;
-                        hr = pDevice->pAdapter->D3D.pfnVBoxWineExD3DDev9CreateTexture((IDirect3DDevice9Ex *)pDevice9If,
+                        hr = pDevice->pAdapter->D3D.D3D.pfnVBoxWineExD3DDev9CreateTexture((IDirect3DDevice9Ex *)pDevice9If,
                                                     pAllocation->SurfDesc.width,
                                                     pAllocation->SurfDesc.height,
@@ -7032,5 +6227,5 @@
                             hr = E_INVALIDARG;
                         }
-                        hr = pDevice->pAdapter->D3D.pfnVBoxWineExD3DDev9CreateCubeTexture((IDirect3DDevice9Ex *)pDevice9If,
+                        hr = pDevice->pAdapter->D3D.D3D.pfnVBoxWineExD3DDev9CreateCubeTexture((IDirect3DDevice9Ex *)pDevice9If,
                                                     pAllocation->SurfDesc.width,
                                                     VBOXDISP_CUBEMAP_LEVELS_COUNT(pRc),
@@ -7129,8 +6324,8 @@
     PVBOXWDDMDISP_ADAPTER pAdapter = (PVBOXWDDMDISP_ADAPTER)hAdapter;
 
-    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)RTMemAllocZ(RT_OFFSETOF(VBOXWDDMDISP_DEVICE, apRTs[pAdapter->cMaxSimRTs]));
+    PVBOXWDDMDISP_DEVICE pDevice = (PVBOXWDDMDISP_DEVICE)RTMemAllocZ(RT_OFFSETOF(VBOXWDDMDISP_DEVICE, apRTs[pAdapter->D3D.cMaxSimRTs]));
     if (pDevice)
     {
-        pDevice->cRTs = pAdapter->cMaxSimRTs;
+        pDevice->cRTs = pAdapter->D3D.cMaxSimRTs;
         pDevice->hDevice = pCreateData->hDevice;
         pDevice->pAdapter = pAdapter;
@@ -7361,9 +6556,12 @@
     {
         VBOXDISPCRHGSMI_SCOPE_SET_GLOBAL();
-        pAdapter->pD3D9If->Release();
-        VBoxDispD3DClose(&pAdapter->D3D);
-    }
-
-    vboxCapsFree(pAdapter);
+        VBoxDispD3DGlobalClose(&pAdapter->D3D, &pAdapter->Formats);
+    }
+#ifdef VBOX_WITH_VIDEOHWACCEL
+    else
+    {
+        VBoxDispD3DGlobal2DFormatsTerm(pAdapter);
+    }
+#endif
 
     VBOXDISPPROFILE_DDI_TERM(pAdapter);
@@ -7493,37 +6691,12 @@
                     VBOXDISPCRHGSMI_SCOPE_SET_GLOBAL();
                     /* try enable the 3D */
-#if 1
-                    hr = VBoxDispD3DOpen(&pAdapter->D3D);
-                    Assert(hr == S_OK);
-#else
-                    hr = E_FAIL;
-#endif
+                    hr = VBoxDispD3DGlobalOpen(&pAdapter->D3D, &pAdapter->Formats);
                     if (hr == S_OK)
                     {
-//                        Assert(0);
-                        hr = pAdapter->D3D.pfnDirect3DCreate9Ex(D3D_SDK_VERSION, &pAdapter->pD3D9If);
-                        Assert(hr == S_OK);
-                        if (hr == S_OK)
-                        {
-                            D3DCAPS9 Caps;
-                            memset(&Caps, 0, sizeof (Caps));
-                            hr = vboxWddmGetD3D9Caps(pAdapter, &Caps);
-                            Assert(hr == S_OK);
-                            if (hr == S_OK)
-                            {
-                                pAdapter->cMaxSimRTs = Caps.NumSimultaneousRTs;
-                                Assert(pAdapter->cMaxSimRTs);
-                                Assert(pAdapter->cMaxSimRTs < UINT32_MAX/2);
-                                vboxVDbgPrint((__FUNCTION__": SUCCESS 3D Enabled, pAdapter (0x%p)\n", pAdapter));
-                                break;
-                            }
-                            pAdapter->pD3D9If->Release();
-                        }
-                        else
-                            vboxVDbgPrintR((__FUNCTION__": pfnDirect3DCreate9Ex failed, hr (%d)\n", hr));
-                        VBoxDispD3DClose(&pAdapter->D3D);
+                        LOG(("SUCCESS 3D Enabled, pAdapter (0x%p)", pAdapter));
+                        break;
                     }
                     else
-                        vboxVDbgPrintR((__FUNCTION__": VBoxDispD3DOpen failed, hr (%d)\n", hr));
+                        WARN(("VBoxDispD3DOpen failed, hr (%d)", hr));
 
                 }
@@ -7537,12 +6710,24 @@
                 pAdapter->aHeads[i].Vhwa.Settings = Query.aInfos[i];
             }
-        }
-#endif
-
-        vboxCapsInit(pAdapter);
-        hr = S_OK;
-//        RTMemFree(pAdapter);
-
-        VBOXDISPPROFILE_DDI_INIT_ADP(pAdapter);
+            hr = VBoxDispD3DGlobal2DFormatsInit(pAdapter);
+            if (!SUCCEEDED(hr))
+            {
+                WARN(("VBoxDispD3DGlobal2DFormatsInit failed hr 0x%x", hr));
+            }
+        }
+#endif
+
+        if (SUCCEEDED(hr))
+        {
+            VBOXDISPPROFILE_DDI_INIT_ADP(pAdapter);
+            hr = S_OK;
+            break;
+        }
+        else
+        {
+            WARN(("OpenAdapter failed hr 0x%x", hr));
+        }
+
+        RTMemFree(pAdapter);
     }
     else
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.h	(revision 42556)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.h	(revision 42557)
@@ -76,12 +76,7 @@
     UINT uIfVersion;
     UINT uRtVersion;
-    VBOXDISPD3D D3D;
-    IDirect3D9Ex * pD3D9If;
     D3DDDI_ADAPTERCALLBACKS RtCallbacks;
-    uint32_t cFormstOps;
-    FORMATOP *paFormstOps;
-    uint32_t cSurfDescs;
-    DDSURFACEDESC *paSurfDescs;
-    UINT cMaxSimRTs;
+    VBOXWDDMDISP_D3D D3D;
+    VBOXWDDMDISP_FORMATS Formats;
 #ifdef VBOX_WDDMDISP_WITH_PROFILE
     VBoxDispProfileFpsCounter ProfileDdiFps;
@@ -404,5 +399,5 @@
 HRESULT vboxWddmUnlockRect(PVBOXWDDMDISP_RESOURCE pRc, UINT iAlloc);
 
-#define VBOXDISPMODE_IS_3D(_p) (!!((_p)->pD3D9If))
+#define VBOXDISPMODE_IS_3D(_p) (!!((_p)->D3D.pD3D9If))
 #ifdef VBOXDISP_EARLYCREATEDEVICE
 #define VBOXDISP_D3DEV(_p) (_p)->pDevice9If
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.cpp
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.cpp	(revision 42556)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.cpp	(revision 42557)
@@ -109,2 +109,896 @@
     return E_FAIL;
 }
+
+
+
+static FORMATOP gVBoxFormatOps3D[] = {
+    {D3DDDIFMT_A8R8G8B8,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
+        FORMATOP_SAME_FORMAT_RENDERTARGET|
+        FORMATOP_SAME_FORMAT_UP_TO_ALPHA_RENDERTARGET|
+        FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|FORMATOP_SRGBREAD|
+        FORMATOP_MEMBEROFGROUP_ARGB|
+        FORMATOP_SRGBWRITE|FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_X8R8G8B8,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
+        FORMATOP_SAME_FORMAT_RENDERTARGET|
+        FORMATOP_DISPLAYMODE|FORMATOP_3DACCELERATION|
+        FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|FORMATOP_SRGBREAD|
+        FORMATOP_MEMBEROFGROUP_ARGB|
+        FORMATOP_SRGBWRITE|FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_A2R10G10B10,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
+        FORMATOP_SAME_FORMAT_RENDERTARGET|
+        0|
+        FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|
+        FORMATOP_MEMBEROFGROUP_ARGB|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_X1R5G5B5,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
+        FORMATOP_SAME_FORMAT_RENDERTARGET|
+        0|
+        FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|
+        FORMATOP_MEMBEROFGROUP_ARGB|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_A1R5G5B5,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
+        FORMATOP_SAME_FORMAT_RENDERTARGET|
+        FORMATOP_SAME_FORMAT_UP_TO_ALPHA_RENDERTARGET|
+        FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|
+        FORMATOP_MEMBEROFGROUP_ARGB|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_A4R4G4B4,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
+        FORMATOP_SAME_FORMAT_RENDERTARGET|
+        FORMATOP_SAME_FORMAT_UP_TO_ALPHA_RENDERTARGET|
+        FORMATOP_OFFSCREENPLAIN|
+        0|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_R5G6B5,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
+        FORMATOP_SAME_FORMAT_RENDERTARGET|
+        FORMATOP_DISPLAYMODE|FORMATOP_3DACCELERATION|
+        FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|
+        FORMATOP_MEMBEROFGROUP_ARGB|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_L16,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
+        0|
+        0|
+        FORMATOP_OFFSCREENPLAIN|
+        0|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_A8L8,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
+        0|
+        0|
+        FORMATOP_OFFSCREENPLAIN|
+        0|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_A8,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
+        0|
+        0|
+        FORMATOP_OFFSCREENPLAIN|
+        0|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_L8,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
+        0|
+        0|
+        FORMATOP_OFFSCREENPLAIN|
+        0|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_D16,   FORMATOP_TEXTURE|FORMATOP_ZSTENCIL|FORMATOP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH, 0, 0, 0},
+    {D3DDDIFMT_D24S8, FORMATOP_TEXTURE|FORMATOP_ZSTENCIL|FORMATOP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH, 0, 0, 0},
+    {D3DDDIFMT_D24X8, FORMATOP_TEXTURE|FORMATOP_ZSTENCIL|FORMATOP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH, 0, 0, 0},
+    {D3DDDIFMT_D16_LOCKABLE, FORMATOP_ZSTENCIL|FORMATOP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH, 0, 0, 0},
+    {D3DDDIFMT_X8D24, FORMATOP_TEXTURE|FORMATOP_ZSTENCIL|FORMATOP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH, 0, 0, 0},
+    {D3DDDIFMT_D32F_LOCKABLE, FORMATOP_TEXTURE|FORMATOP_ZSTENCIL|FORMATOP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH, 0, 0, 0},
+    {D3DDDIFMT_S8D24, FORMATOP_TEXTURE|FORMATOP_ZSTENCIL|FORMATOP_ZSTENCIL_WITH_ARBITRARY_COLOR_DEPTH, 0, 0, 0},
+
+    {D3DDDIFMT_DXT1,
+        FORMATOP_TEXTURE|FORMATOP_CUBETEXTURE|
+        0|
+        0|
+        FORMATOP_OFFSCREENPLAIN|FORMATOP_SRGBREAD|
+        0|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_DXT2,
+        FORMATOP_TEXTURE|FORMATOP_CUBETEXTURE|
+        0|
+        0|
+        FORMATOP_OFFSCREENPLAIN|FORMATOP_SRGBREAD|
+        0|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_DXT3,
+        FORMATOP_TEXTURE|FORMATOP_CUBETEXTURE|
+        0|
+        0|
+        FORMATOP_OFFSCREENPLAIN|FORMATOP_SRGBREAD|
+        0|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_DXT4,
+        FORMATOP_TEXTURE|FORMATOP_CUBETEXTURE|
+        0|
+        0|
+        FORMATOP_OFFSCREENPLAIN|FORMATOP_SRGBREAD|
+        0|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_DXT5,
+        FORMATOP_TEXTURE|FORMATOP_CUBETEXTURE|
+        0|
+        0|
+        FORMATOP_OFFSCREENPLAIN|FORMATOP_SRGBREAD|
+        0|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_X8L8V8U8,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
+        0|
+        0|
+        0|
+        FORMATOP_BUMPMAP|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_A2W10V10U10,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
+        0|
+        0|
+        0|
+        FORMATOP_BUMPMAP|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_V8U8,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
+        0|
+        0|
+        0|
+        FORMATOP_BUMPMAP|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_Q8W8V8U8,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
+        0|
+        0|
+        FORMATOP_OFFSCREENPLAIN|
+        FORMATOP_BUMPMAP|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_CxV8U8, FORMATOP_NOFILTER|FORMATOP_NOALPHABLEND|FORMATOP_NOTEXCOORDWRAPNORMIP, 0, 0, 0},
+
+    {D3DDDIFMT_R16F,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
+        FORMATOP_SAME_FORMAT_RENDERTARGET|
+        0|
+        FORMATOP_OFFSCREENPLAIN|
+        0|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_R32F,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
+        FORMATOP_SAME_FORMAT_RENDERTARGET|
+        0|
+        FORMATOP_OFFSCREENPLAIN|
+        0|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_G16R16F,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
+        FORMATOP_SAME_FORMAT_RENDERTARGET|
+        0|
+        FORMATOP_OFFSCREENPLAIN|
+        0|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_G32R32F,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
+        FORMATOP_SAME_FORMAT_RENDERTARGET|
+        0|
+        FORMATOP_OFFSCREENPLAIN|
+        0|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_A16B16G16R16F,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
+        FORMATOP_SAME_FORMAT_RENDERTARGET|
+        0|
+        FORMATOP_OFFSCREENPLAIN|
+        0|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_A32B32G32R32F,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
+        FORMATOP_SAME_FORMAT_RENDERTARGET|
+        0|
+        FORMATOP_OFFSCREENPLAIN|
+        0|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_G16R16,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
+        FORMATOP_SAME_FORMAT_RENDERTARGET|
+        0|
+        FORMATOP_OFFSCREENPLAIN|
+        0|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_A16B16G16R16,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
+        FORMATOP_SAME_FORMAT_RENDERTARGET|
+        0|
+        FORMATOP_OFFSCREENPLAIN|
+        0|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_V16U16,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
+        0|
+        0|
+        0|
+        FORMATOP_BUMPMAP|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_P8, FORMATOP_DISPLAYMODE|FORMATOP_3DACCELERATION|FORMATOP_OFFSCREENPLAIN, 0, 0, 0},
+
+    {D3DDDIFMT_UYVY,
+        0|
+        0|
+        0|
+        FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|
+        FORMATOP_NOFILTER|
+        FORMATOP_NOALPHABLEND|
+        FORMATOP_NOTEXCOORDWRAPNORMIP, 0, 0, 0},
+
+    {D3DDDIFMT_YUY2,
+        0|
+        0|
+        0|
+        FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|
+        FORMATOP_NOFILTER|
+        FORMATOP_NOALPHABLEND|
+        FORMATOP_NOTEXCOORDWRAPNORMIP, 0, 0, 0},
+
+    {D3DDDIFMT_Q16W16V16U16,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
+        FORMATOP_SAME_FORMAT_RENDERTARGET|
+        0|
+        FORMATOP_OFFSCREENPLAIN|
+        FORMATOP_BUMPMAP|FORMATOP_DMAP|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_X8B8G8R8,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
+        FORMATOP_SAME_FORMAT_RENDERTARGET|
+        FORMATOP_SAME_FORMAT_UP_TO_ALPHA_RENDERTARGET|
+        FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|FORMATOP_SRGBREAD|
+        FORMATOP_DMAP|FORMATOP_MEMBEROFGROUP_ARGB|
+        FORMATOP_SRGBWRITE|FORMATOP_AUTOGENMIPMAP|FORMATOP_VERTEXTEXTURE|
+        FORMATOP_OVERLAY, 0, 0, 0},
+
+    {D3DDDIFMT_BINARYBUFFER, FORMATOP_OFFSCREENPLAIN, 0, 0, 0},
+
+    {D3DDDIFMT_A4L4,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|
+        0|
+        0|
+        FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|
+        FORMATOP_DMAP|
+        FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+
+    {D3DDDIFMT_A2B10G10R10,
+        FORMATOP_TEXTURE|FORMATOP_VOLUMETEXTURE|FORMATOP_CUBETEXTURE|FORMATOP_OFFSCREEN_RENDERTARGET|
+        FORMATOP_SAME_FORMAT_RENDERTARGET|
+        0|
+        FORMATOP_CONVERT_TO_ARGB|FORMATOP_OFFSCREENPLAIN|
+        FORMATOP_DMAP|FORMATOP_MEMBEROFGROUP_ARGB|
+        FORMATOP_AUTOGENMIPMAP|FORMATOP_VERTEXTEXTURE, 0, 0, 0},
+};
+
+static FORMATOP gVBoxFormatOpsBase[] = {
+    {D3DDDIFMT_X8R8G8B8, FORMATOP_DISPLAYMODE, 0, 0, 0},
+
+    {D3DDDIFMT_R8G8B8, FORMATOP_DISPLAYMODE, 0, 0, 0},
+
+    {D3DDDIFMT_R5G6B5, FORMATOP_DISPLAYMODE, 0, 0, 0},
+
+    {D3DDDIFMT_P8, FORMATOP_DISPLAYMODE, 0, 0, 0},
+};
+
+static DDSURFACEDESC gVBoxSurfDescsBase[] = {
+        {
+            sizeof (DDSURFACEDESC), /*    DWORD   dwSize;  */
+            DDSD_CAPS | DDSD_PIXELFORMAT,    /* DWORD dwFlags;    */
+            0,    /* DWORD dwHeight;   */
+            0,    /* DWORD dwWidth;    */
+            {
+                0, /* Union             */
+                   /*   LONG lPitch; */
+                   /*   DWORD dwLinearSize; */
+            },
+            0,  /*    DWORD dwBackBufferCount; */
+            {
+                0, /* Union */
+                   /*  DWORD dwMipMapCount; */
+                   /*    DWORD dwZBufferBitDepth; */
+                   /*   DWORD dwRefreshRate; */
+            },
+            0, /*    DWORD dwAlphaBitDepth; */
+            0, /*   DWORD dwReserved; */
+            NULL, /*   LPVOID lpSurface; */
+            {
+                0, /* DWORD dwColorSpaceLowValue; */
+                0, /* DWORD dwColorSpaceHighValue; */
+            }, /* DDCOLORKEY  ddckCKDestOverlay; */
+            {
+                0, /* DWORD dwColorSpaceLowValue; */
+                0, /* DWORD dwColorSpaceHighValue; */
+            }, /* DDCOLORKEY  ddckCKDestBlt; */
+            {
+                0, /* DWORD dwColorSpaceLowValue; */
+                0, /* DWORD dwColorSpaceHighValue; */
+            }, /* DDCOLORKEY  ddckCKSrcOverlay; */
+            {
+                0, /* DWORD dwColorSpaceLowValue; */
+                0, /* DWORD dwColorSpaceHighValue; */
+            }, /* DDCOLORKEY ddckCKSrcBlt; */
+            {
+                sizeof (DDPIXELFORMAT), /* DWORD dwSize; */
+                DDPF_RGB, /* DWORD dwFlags; */
+                0, /* DWORD dwFourCC; */
+                {
+                    32, /* union */
+                       /* DWORD dwRGBBitCount; */
+                       /* DWORD dwYUVBitCount; */
+                       /* DWORD dwZBufferBitDepth; */
+                       /* DWORD dwAlphaBitDepth; */
+                       /* DWORD dwLuminanceBitCount; */
+                       /* DWORD dwBumpBitCount; */
+                },
+                {
+                    0xff0000, /* union */
+                       /* DWORD dwRBitMask; */
+                       /* DWORD dwYBitMask; */
+                        /* DWORD dwStencilBitDepth; */
+                        /* DWORD dwLuminanceBitMask; */
+                        /* DWORD dwBumpDuBitMask; */
+                },
+                {
+                    0xff00,
+                        /* DWORD dwGBitMask; */
+                        /* DWORD dwUBitMask; */
+                        /* DWORD dwZBitMask; */
+                        /* DWORD dwBumpDvBitMask; */
+                },
+                {
+                    0xff,
+                        /* DWORD dwBBitMask; */
+                        /* DWORD dwVBitMask; */
+                        /* DWORD dwStencilBitMask; */
+                        /* DWORD dwBumpLuminanceBitMask; */
+                },
+                {
+                    0,
+                        /* DWORD dwRGBAlphaBitMask; */
+                        /* DWORD dwYUVAlphaBitMask; */
+                        /* DWORD dwLuminanceAlphaBitMask; */
+                        /* DWORD dwRGBZBitMask; */
+                        /* DWORD dwYUVZBitMask; */
+                },
+            }, /* DDPIXELFORMAT ddpfPixelFormat; */
+            {
+                DDSCAPS_BACKBUFFER
+                | DDSCAPS_COMPLEX
+                | DDSCAPS_FLIP
+                | DDSCAPS_FRONTBUFFER
+                | DDSCAPS_LOCALVIDMEM
+                | DDSCAPS_PRIMARYSURFACE
+                | DDSCAPS_VIDEOMEMORY
+                | DDSCAPS_VISIBLE   /* DWORD dwCaps; */
+            } /* DDSCAPS ddsCaps; */
+        },
+        {
+            sizeof (DDSURFACEDESC), /*    DWORD   dwSize;  */
+            DDSD_CAPS | DDSD_PIXELFORMAT,    /* DWORD dwFlags;    */
+            0,    /* DWORD dwHeight;   */
+            0,    /* DWORD dwWidth;    */
+            {
+                0, /* Union             */
+                   /*   LONG lPitch; */
+                   /*   DWORD dwLinearSize; */
+            },
+            0,  /*    DWORD dwBackBufferCount; */
+            {
+                0, /* Union */
+                   /*  DWORD dwMipMapCount; */
+                   /*    DWORD dwZBufferBitDepth; */
+                   /*   DWORD dwRefreshRate; */
+            },
+            0, /*    DWORD dwAlphaBitDepth; */
+            0, /*   DWORD dwReserved; */
+            NULL, /*   LPVOID lpSurface; */
+            {
+                0, /* DWORD dwColorSpaceLowValue; */
+                0, /* DWORD dwColorSpaceHighValue; */
+            }, /* DDCOLORKEY  ddckCKDestOverlay; */
+            {
+                0, /* DWORD dwColorSpaceLowValue; */
+                0, /* DWORD dwColorSpaceHighValue; */
+            }, /* DDCOLORKEY  ddckCKDestBlt; */
+            {
+                0, /* DWORD dwColorSpaceLowValue; */
+                0, /* DWORD dwColorSpaceHighValue; */
+            }, /* DDCOLORKEY  ddckCKSrcOverlay; */
+            {
+                0, /* DWORD dwColorSpaceLowValue; */
+                0, /* DWORD dwColorSpaceHighValue; */
+            }, /* DDCOLORKEY ddckCKSrcBlt; */
+            {
+                sizeof (DDPIXELFORMAT), /* DWORD dwSize; */
+                DDPF_RGB, /* DWORD dwFlags; */
+                0, /* DWORD dwFourCC; */
+                {
+                    24, /* union */
+                       /* DWORD dwRGBBitCount; */
+                       /* DWORD dwYUVBitCount; */
+                       /* DWORD dwZBufferBitDepth; */
+                       /* DWORD dwAlphaBitDepth; */
+                       /* DWORD dwLuminanceBitCount; */
+                       /* DWORD dwBumpBitCount; */
+                },
+                {
+                    0xff0000, /* union */
+                       /* DWORD dwRBitMask; */
+                       /* DWORD dwYBitMask; */
+                        /* DWORD dwStencilBitDepth; */
+                        /* DWORD dwLuminanceBitMask; */
+                        /* DWORD dwBumpDuBitMask; */
+                },
+                {
+                    0xff00,
+                        /* DWORD dwGBitMask; */
+                        /* DWORD dwUBitMask; */
+                        /* DWORD dwZBitMask; */
+                        /* DWORD dwBumpDvBitMask; */
+                },
+                {
+                    0xff,
+                        /* DWORD dwBBitMask; */
+                        /* DWORD dwVBitMask; */
+                        /* DWORD dwStencilBitMask; */
+                        /* DWORD dwBumpLuminanceBitMask; */
+                },
+                {
+                    0,
+                        /* DWORD dwRGBAlphaBitMask; */
+                        /* DWORD dwYUVAlphaBitMask; */
+                        /* DWORD dwLuminanceAlphaBitMask; */
+                        /* DWORD dwRGBZBitMask; */
+                        /* DWORD dwYUVZBitMask; */
+                },
+            }, /* DDPIXELFORMAT ddpfPixelFormat; */
+            {
+                DDSCAPS_BACKBUFFER
+                | DDSCAPS_COMPLEX
+                | DDSCAPS_FLIP
+                | DDSCAPS_FRONTBUFFER
+                | DDSCAPS_LOCALVIDMEM
+                | DDSCAPS_PRIMARYSURFACE
+                | DDSCAPS_VIDEOMEMORY
+                | DDSCAPS_VISIBLE  /* DWORD dwCaps; */
+            } /* DDSCAPS ddsCaps; */
+        },
+        {
+            sizeof (DDSURFACEDESC), /*    DWORD   dwSize;  */
+            DDSD_CAPS | DDSD_PIXELFORMAT,    /* DWORD dwFlags;    */
+            0,    /* DWORD dwHeight;   */
+            0,    /* DWORD dwWidth;    */
+            {
+                0, /* Union             */
+                   /*   LONG lPitch; */
+                   /*   DWORD dwLinearSize; */
+            },
+            0,  /*    DWORD dwBackBufferCount; */
+            {
+                0, /* Union */
+                   /*  DWORD dwMipMapCount; */
+                   /*    DWORD dwZBufferBitDepth; */
+                   /*   DWORD dwRefreshRate; */
+            },
+            0, /*    DWORD dwAlphaBitDepth; */
+            0, /*   DWORD dwReserved; */
+            NULL, /*   LPVOID lpSurface; */
+            {
+                0, /* DWORD dwColorSpaceLowValue; */
+                0, /* DWORD dwColorSpaceHighValue; */
+            }, /* DDCOLORKEY  ddckCKDestOverlay; */
+            {
+                0, /* DWORD dwColorSpaceLowValue; */
+                0, /* DWORD dwColorSpaceHighValue; */
+            }, /* DDCOLORKEY  ddckCKDestBlt; */
+            {
+                0, /* DWORD dwColorSpaceLowValue; */
+                0, /* DWORD dwColorSpaceHighValue; */
+            }, /* DDCOLORKEY  ddckCKSrcOverlay; */
+            {
+                0, /* DWORD dwColorSpaceLowValue; */
+                0, /* DWORD dwColorSpaceHighValue; */
+            }, /* DDCOLORKEY ddckCKSrcBlt; */
+            {
+                sizeof (DDPIXELFORMAT), /* DWORD dwSize; */
+                DDPF_RGB, /* DWORD dwFlags; */
+                0, /* DWORD dwFourCC; */
+                {
+                    16, /* union */
+                       /* DWORD dwRGBBitCount; */
+                       /* DWORD dwYUVBitCount; */
+                       /* DWORD dwZBufferBitDepth; */
+                       /* DWORD dwAlphaBitDepth; */
+                       /* DWORD dwLuminanceBitCount; */
+                       /* DWORD dwBumpBitCount; */
+                },
+                {
+                    0xf800, /* union */
+                       /* DWORD dwRBitMask; */
+                       /* DWORD dwYBitMask; */
+                        /* DWORD dwStencilBitDepth; */
+                        /* DWORD dwLuminanceBitMask; */
+                        /* DWORD dwBumpDuBitMask; */
+                },
+                {
+                    0x7e0,
+                        /* DWORD dwGBitMask; */
+                        /* DWORD dwUBitMask; */
+                        /* DWORD dwZBitMask; */
+                        /* DWORD dwBumpDvBitMask; */
+                },
+                {
+                    0x1f,
+                        /* DWORD dwBBitMask; */
+                        /* DWORD dwVBitMask; */
+                        /* DWORD dwStencilBitMask; */
+                        /* DWORD dwBumpLuminanceBitMask; */
+                },
+                {
+                    0,
+                        /* DWORD dwRGBAlphaBitMask; */
+                        /* DWORD dwYUVAlphaBitMask; */
+                        /* DWORD dwLuminanceAlphaBitMask; */
+                        /* DWORD dwRGBZBitMask; */
+                        /* DWORD dwYUVZBitMask; */
+                },
+            }, /* DDPIXELFORMAT ddpfPixelFormat; */
+            {
+                DDSCAPS_BACKBUFFER
+                | DDSCAPS_COMPLEX
+                | DDSCAPS_FLIP
+                | DDSCAPS_FRONTBUFFER
+                | DDSCAPS_LOCALVIDMEM
+                | DDSCAPS_PRIMARYSURFACE
+                | DDSCAPS_VIDEOMEMORY
+                | DDSCAPS_VISIBLE /* DWORD dwCaps; */
+            } /* DDSCAPS ddsCaps; */
+        },
+};
+
+#ifdef VBOX_WITH_VIDEOHWACCEL
+
+static void vboxVhwaPopulateOverlayFourccSurfDesc(DDSURFACEDESC *pDesc, uint32_t fourcc)
+{
+    memset(pDesc, 0, sizeof (DDSURFACEDESC));
+
+    pDesc->dwSize = sizeof (DDSURFACEDESC);
+    pDesc->dwFlags = DDSD_CAPS | DDSD_PIXELFORMAT;
+    pDesc->ddpfPixelFormat.dwSize = sizeof (DDPIXELFORMAT);
+    pDesc->ddpfPixelFormat.dwFlags = DDPF_FOURCC;
+    pDesc->ddpfPixelFormat.dwFourCC = fourcc;
+    pDesc->ddsCaps.dwCaps = DDSCAPS_BACKBUFFER
+            | DDSCAPS_COMPLEX
+            | DDSCAPS_FLIP
+            | DDSCAPS_FRONTBUFFER
+            | DDSCAPS_LOCALVIDMEM
+            | DDSCAPS_OVERLAY
+            | DDSCAPS_VIDEOMEMORY
+            | DDSCAPS_VISIBLE;
+}
+
+static bool vboxPixFormatMatch(DDPIXELFORMAT *pFormat1, DDPIXELFORMAT *pFormat2)
+{
+    return !memcmp(pFormat1, pFormat2, sizeof (DDPIXELFORMAT));
+}
+
+HRESULT vboxSurfDescMerge(DDSURFACEDESC *paDescs, uint32_t *pcDescs, uint32_t cMaxDescs, DDSURFACEDESC *pDesc)
+{
+    uint32_t cDescs = *pcDescs;
+
+    Assert(cMaxDescs >= cDescs);
+    Assert(pDesc->dwFlags == (DDSD_CAPS | DDSD_PIXELFORMAT));
+    if (pDesc->dwFlags != (DDSD_CAPS | DDSD_PIXELFORMAT))
+        return E_INVALIDARG;
+
+    for (uint32_t i = 0; i < cDescs; ++i)
+    {
+        DDSURFACEDESC *pCur = &paDescs[i];
+        if (vboxPixFormatMatch(&pCur->ddpfPixelFormat, &pDesc->ddpfPixelFormat))
+        {
+            if (pDesc->dwFlags & DDSD_CAPS)
+            {
+                pCur->dwFlags |= DDSD_CAPS;
+                pCur->ddsCaps.dwCaps |= pDesc->ddsCaps.dwCaps;
+            }
+            return S_OK;
+        }
+    }
+
+    if (cMaxDescs > cDescs)
+    {
+        paDescs[cDescs] = *pDesc;
+        ++cDescs;
+        *pcDescs = cDescs;
+        return VINF_SUCCESS;
+    }
+    return E_FAIL;
+}
+
+HRESULT vboxFormatOpsMerge(FORMATOP *paOps, uint32_t *pcOps, uint32_t cMaxOps, FORMATOP *pOp)
+{
+    uint32_t cOps = *pcOps;
+
+    Assert(cMaxOps >= cOps);
+
+    for (uint32_t i = 0; i < cOps; ++i)
+    {
+        FORMATOP *pCur = &paOps[i];
+        if (pCur->Format == pOp->Format)
+        {
+            pCur->Operations |= pOp->Operations;
+            Assert(pCur->FlipMsTypes == pOp->FlipMsTypes);
+            Assert(pCur->BltMsTypes == pOp->BltMsTypes);
+            Assert(pCur->PrivateFormatBitCount == pOp->PrivateFormatBitCount);
+            return S_OK;
+        }
+    }
+
+    if (cMaxOps > cOps)
+    {
+        paOps[cOps] = *pOp;
+        ++cOps;
+        *pcOps = cOps;
+        return VINF_SUCCESS;
+    }
+    return E_FAIL;
+}
+
+HRESULT VBoxDispD3DGlobal2DFormatsInit(PVBOXWDDMDISP_ADAPTER pAdapter)
+{
+    HRESULT hr = S_OK;
+    memset(&pAdapter->D3D, 0, sizeof (pAdapter->D3D));
+    memset(&pAdapter->Formats, 0, sizeof (pAdapter->Formats));
+
+    /* just calc the max number of formats */
+    uint32_t cFormats = RT_ELEMENTS(gVBoxFormatOpsBase);
+    uint32_t cSurfDescs = RT_ELEMENTS(gVBoxSurfDescsBase);
+    uint32_t cOverlayFormats = 0;
+    for (uint32_t i = 0; i < pAdapter->cHeads; ++i)
+    {
+        VBOXDISPVHWA_INFO *pVhwa = &pAdapter->aHeads[i].Vhwa;
+        if (pVhwa->Settings.fFlags & VBOXVHWA_F_ENABLED)
+        {
+            cOverlayFormats += pVhwa->Settings.cFormats;
+        }
+    }
+
+    cFormats += cOverlayFormats;
+    cSurfDescs += cOverlayFormats;
+
+    uint32_t cbFormatOps = cFormats * sizeof (FORMATOP);
+    cbFormatOps = (cbFormatOps + 7) & ~3;
+    /* ensure the surf descs are 8 byte aligned */
+    uint32_t offSurfDescs = (cbFormatOps + 7) & ~3;
+    uint32_t cbSurfDescs = cSurfDescs * sizeof (DDSURFACEDESC);
+    uint32_t cbBuf = offSurfDescs + cbSurfDescs;
+    uint8_t* pvBuf = (uint8_t*)RTMemAllocZ(cbBuf);
+    if (pvBuf)
+    {
+        pAdapter->Formats.paFormstOps = (FORMATOP*)pvBuf;
+        memcpy ((void*)pAdapter->Formats.paFormstOps , gVBoxFormatOpsBase, sizeof (gVBoxFormatOpsBase));
+        pAdapter->Formats.cFormstOps = RT_ELEMENTS(gVBoxFormatOpsBase);
+
+        FORMATOP fo = {D3DDDIFMT_UNKNOWN, 0, 0, 0, 0};
+        for (uint32_t i = 0; i < pAdapter->cHeads; ++i)
+        {
+            VBOXDISPVHWA_INFO *pVhwa = &pAdapter->aHeads[i].Vhwa;
+            if (pVhwa->Settings.fFlags & VBOXVHWA_F_ENABLED)
+            {
+                for (uint32_t j = 0; j < pVhwa->Settings.cFormats; ++j)
+                {
+                    fo.Format = pVhwa->Settings.aFormats[j];
+                    fo.Operations = FORMATOP_OVERLAY;
+                    hr = vboxFormatOpsMerge((FORMATOP *)pAdapter->Formats.paFormstOps, &pAdapter->Formats.cFormstOps, cFormats, &fo);
+                    if (FAILED(hr))
+                    {
+                        WARN(("vboxFormatOpsMerge failed, hr 0x%x", hr));
+                    }
+                }
+            }
+        }
+
+        pAdapter->Formats.paSurfDescs = (DDSURFACEDESC*)(pvBuf + offSurfDescs);
+        memcpy ((void*)pAdapter->Formats.paSurfDescs , gVBoxSurfDescsBase, sizeof (gVBoxSurfDescsBase));
+        pAdapter->Formats.cSurfDescs = RT_ELEMENTS(gVBoxSurfDescsBase);
+
+        DDSURFACEDESC sd;
+        for (uint32_t i = 0; i < pAdapter->cHeads; ++i)
+        {
+            VBOXDISPVHWA_INFO *pVhwa = &pAdapter->aHeads[i].Vhwa;
+            if (pVhwa->Settings.fFlags & VBOXVHWA_F_ENABLED)
+            {
+                for (uint32_t j = 0; j < pVhwa->Settings.cFormats; ++j)
+                {
+                    uint32_t fourcc = vboxWddmFormatToFourcc(pVhwa->Settings.aFormats[j]);
+                    if (fourcc)
+                    {
+                        vboxVhwaPopulateOverlayFourccSurfDesc(&sd, fourcc);
+                        hr = vboxSurfDescMerge((DDSURFACEDESC *)pAdapter->Formats.paSurfDescs, &pAdapter->Formats.cSurfDescs, cSurfDescs, &sd);
+                        if (FAILED(hr))
+                        {
+                            WARN(("vboxFormatOpsMerge failed, hr 0x%x", hr));
+                        }
+                    }
+                }
+            }
+        }
+    }
+    else
+    {
+        WARN(("RTMemAllocZ failed"));
+        return E_FAIL;
+    }
+    return S_OK;
+}
+
+void VBoxDispD3DGlobal2DFormatsTerm(PVBOXWDDMDISP_ADAPTER pAdapter)
+{
+    if (pAdapter->Formats.paFormstOps)
+        RTMemFree((void *)pAdapter->Formats.paFormstOps);
+}
+
+#endif
+
+static CRITICAL_SECTION g_VBoxDispD3DGlobalCritSect;
+static VBOXWDDMDISP_D3D g_VBoxDispD3DGlobalD3D;
+static VBOXWDDMDISP_FORMATS g_VBoxDispD3DGlobalD3DFormats;
+static uint32_t g_cVBoxDispD3DGlobalOpens;
+
+void vboxDispD3DGlobalLock()
+{
+    EnterCriticalSection(&g_VBoxDispD3DGlobalCritSect);
+}
+
+void vboxDispD3DGlobalUnlock()
+{
+    LeaveCriticalSection(&g_VBoxDispD3DGlobalCritSect);
+}
+
+void VBoxDispD3DGlobalInit()
+{
+    g_cVBoxDispD3DGlobalOpens = 0;
+    InitializeCriticalSection(&g_VBoxDispD3DGlobalCritSect);
+}
+
+void VBoxDispD3DGlobalTerm()
+{
+    DeleteCriticalSection(&g_VBoxDispD3DGlobalCritSect);
+}
+
+static void vboxDispD3DGlobalD3DFormatsInit(PVBOXWDDMDISP_FORMATS pFormats)
+{
+    memset(pFormats, 0, sizeof (pFormats));
+    pFormats->paFormstOps = gVBoxFormatOps3D;
+    pFormats->cFormstOps = RT_ELEMENTS(gVBoxFormatOps3D);
+}
+
+static HRESULT vboxWddmGetD3D9Caps(PVBOXWDDMDISP_D3D pD3D, D3DCAPS9 *pCaps)
+{
+    HRESULT hr = pD3D->pD3D9If->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, pCaps);
+    if (FAILED(hr))
+    {
+        WARN(("GetDeviceCaps failed hr(0x%x)",hr));
+        return hr;
+    }
+
+    vboxDispDumpD3DCAPS9(pCaps);
+
+    return S_OK;
+}
+
+static void vboxDispD3DGlobalDoClose(PVBOXWDDMDISP_D3D pD3D)
+{
+    pD3D->pD3D9If->Release();
+    VBoxDispD3DClose(&pD3D->D3D);
+}
+
+static HRESULT vboxDispD3DGlobalDoOpen(PVBOXWDDMDISP_D3D pD3D)
+{
+    memset(pD3D, 0, sizeof (*pD3D));
+    HRESULT hr = VBoxDispD3DOpen(&pD3D->D3D);
+    if (SUCCEEDED(hr))
+    {
+        hr = pD3D->D3D.pfnDirect3DCreate9Ex(D3D_SDK_VERSION, &pD3D->pD3D9If);
+        if (SUCCEEDED(hr))
+        {
+            hr = vboxWddmGetD3D9Caps(pD3D, &pD3D->Caps);
+            if (SUCCEEDED(hr))
+            {
+                pD3D->cMaxSimRTs = pD3D->Caps.NumSimultaneousRTs;
+                Assert(pD3D->cMaxSimRTs);
+                Assert(pD3D->cMaxSimRTs < UINT32_MAX/2);
+                LOG(("SUCCESS 3D Enabled, pD3D (0x%p)", pD3D));
+                return S_OK;
+            }
+            else
+            {
+                WARN(("vboxWddmGetD3D9Caps failed hr = 0x%x", hr));
+            }
+            pD3D->pD3D9If->Release();
+        }
+        else
+        {
+            WARN(("pfnDirect3DCreate9Ex failed hr = 0x%x", hr));
+        }
+        VBoxDispD3DClose(&pD3D->D3D);
+    }
+    else
+    {
+        WARN(("VBoxDispD3DOpen failed hr = 0x%x", hr));
+    }
+    return hr;
+}
+
+HRESULT VBoxDispD3DGlobalOpen(PVBOXWDDMDISP_D3D pD3D, PVBOXWDDMDISP_FORMATS pFormats)
+{
+    vboxDispD3DGlobalLock();
+    if (!g_cVBoxDispD3DGlobalOpens)
+    {
+        HRESULT hr = vboxDispD3DGlobalDoOpen(&g_VBoxDispD3DGlobalD3D);
+        if (!SUCCEEDED(hr))
+        {
+            WARN(("vboxDispD3DGlobalDoOpen failed hr = 0x%x", hr));
+            return hr;
+        }
+
+        vboxDispD3DGlobalD3DFormatsInit(&g_VBoxDispD3DGlobalD3DFormats);
+    }
+    ++g_cVBoxDispD3DGlobalOpens;
+    vboxDispD3DGlobalUnlock();
+
+    *pD3D = g_VBoxDispD3DGlobalD3D;
+    *pFormats = g_VBoxDispD3DGlobalD3DFormats;
+    return S_OK;
+}
+
+void VBoxDispD3DGlobalClose(PVBOXWDDMDISP_D3D pD3D, PVBOXWDDMDISP_FORMATS pFormats)
+{
+    vboxDispD3DGlobalLock();
+    --g_cVBoxDispD3DGlobalOpens;
+    if (!g_cVBoxDispD3DGlobalOpens)
+    {
+        vboxDispD3DGlobalDoClose(&g_VBoxDispD3DGlobalD3D);
+    }
+    vboxDispD3DGlobalUnlock();
+}
Index: /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.h
===================================================================
--- /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.h	(revision 42556)
+++ /trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3DIf.h	(revision 42557)
@@ -73,6 +73,32 @@
 } VBOXDISPD3D;
 
+typedef struct VBOXWDDMDISP_FORMATS
+{
+    uint32_t cFormstOps;
+    const struct _FORMATOP* paFormstOps;
+    uint32_t cSurfDescs;
+    struct _DDSURFACEDESC *paSurfDescs;
+} VBOXWDDMDISP_FORMATS, *PVBOXWDDMDISP_FORMATS;
+
+typedef struct VBOXWDDMDISP_D3D
+{
+    VBOXDISPD3D D3D;
+    IDirect3D9Ex * pD3D9If;
+    D3DCAPS9 Caps;
+    UINT cMaxSimRTs;
+} VBOXWDDMDISP_D3D, *PVBOXWDDMDISP_D3D;
+
+void VBoxDispD3DGlobalInit();
+void VBoxDispD3DGlobalTerm();
+HRESULT VBoxDispD3DGlobalOpen(PVBOXWDDMDISP_D3D pD3D, PVBOXWDDMDISP_FORMATS pFormats);
+void VBoxDispD3DGlobalClose(PVBOXWDDMDISP_D3D pD3D, PVBOXWDDMDISP_FORMATS pFormats);
+
 HRESULT VBoxDispD3DOpen(VBOXDISPD3D *pD3D);
 void VBoxDispD3DClose(VBOXDISPD3D *pD3D);
 
+#ifdef VBOX_WITH_VIDEOHWACCEL
+HRESULT VBoxDispD3DGlobal2DFormatsInit(struct VBOXWDDMDISP_ADAPTER *pAdapter);
+void VBoxDispD3DGlobal2DFormatsTerm(struct VBOXWDDMDISP_ADAPTER *pAdapter);
+#endif
+
 #endif /* ifndef ___VBoxDispD3DIf_h___ */
