wined3d: Test and fix ddraw and d3d9 GetDC differences.

The MSDN is not totally correct: A8R8G8B8 and A1R5G5B5 also allow GetDC. The
main differences that have to be filtered out in d3d9.dll are GetDC on
A8B8G8R8, X8B8G8R8 and P8.
diff --git a/dlls/d3d9/d3d9_private.h b/dlls/d3d9/d3d9_private.h
index b6ef7cf..381e3af 100644
--- a/dlls/d3d9/d3d9_private.h
+++ b/dlls/d3d9/d3d9_private.h
@@ -308,6 +308,8 @@
 
     /* Flags an implicit surface */
     BOOL                        isImplicit;
+
+    BOOL                        getdc_supported;
 } IDirect3DSurface9Impl;
 
 /* ---------------------- */
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
index 5a87a8f..9995823 100644
--- a/dlls/d3d9/device.c
+++ b/dlls/d3d9/device.c
@@ -671,6 +671,22 @@
     object->lpVtbl = &Direct3DSurface9_Vtbl;
     object->ref = 1;
 
+    switch(Format)
+    {
+        case D3DFMT_A8R8G8B8:
+        case D3DFMT_X8R8G8B8:
+        case D3DFMT_R5G6B5:
+        case D3DFMT_X1R5G5B5:
+        case D3DFMT_A1R5G5B5:
+        case D3DFMT_R8G8B8:
+            object->getdc_supported = TRUE;
+            break;
+
+        default:
+            object->getdc_supported = FALSE;
+            break;
+    }
+
     TRACE("(%p) : w(%d) h(%d) fmt(%d) surf@%p\n", This, Width, Height, Format, *ppSurface);
 
     wined3d_mutex_lock();
diff --git a/dlls/d3d9/surface.c b/dlls/d3d9/surface.c
index b4defaf..4079ea3 100644
--- a/dlls/d3d9/surface.c
+++ b/dlls/d3d9/surface.c
@@ -269,6 +269,13 @@
     HRESULT hr;
     TRACE("(%p) Relay\n", This);
 
+    if(!This->getdc_supported)
+    {
+        WARN("Surface does not support GetDC, returning D3DERR_INVALIDCALL\n");
+        /* Don't touch the DC */
+        return D3DERR_INVALIDCALL;
+    }
+
     wined3d_mutex_lock();
     hr = IWineD3DSurface_GetDC(This->wineD3DSurface, phdc);
     wined3d_mutex_unlock();
diff --git a/dlls/d3d9/tests/surface.c b/dlls/d3d9/tests/surface.c
index 3d2243f..638442e 100644
--- a/dlls/d3d9/tests/surface.c
+++ b/dlls/d3d9/tests/surface.c
@@ -378,6 +378,86 @@
     ok(ref2 == (ref - 1), "Object reference is %d, expected %d\n", ref2, (ref - 1));
 }
 
+static void test_getdc(IDirect3DDevice9 *device)
+{
+    IDirect3DSurface9 *surface;
+    IDirect3DTexture9 *texture;
+    HRESULT hr;
+    unsigned int i;
+    HDC dc;
+
+    struct
+    {
+        const char *name;
+        D3DFORMAT fmt;
+        BOOL getdc_supported;
+    } testdata[] = {
+        { "D3DFMT_A8R8G8B8",    D3DFMT_A8R8G8B8,    TRUE    },
+        { "D3DFMT_X8R8G8B8",    D3DFMT_X8R8G8B8,    TRUE    },
+        { "D3DFMT_R5G6B5",      D3DFMT_R5G6B5,      TRUE    },
+        { "D3DFMT_X1R5G5B5",    D3DFMT_X1R5G5B5,    TRUE    },
+        { "D3DFMT_A1R5G5B5",    D3DFMT_A1R5G5B5,    TRUE    },
+        { "D3DFMT_R8G8B8",      D3DFMT_R8G8B8,      TRUE    },
+        { "D3DFMT_A2R10G10B10", D3DFMT_A2R10G10B10, FALSE   }, /* Untested, card on windows didn't support it */
+        { "D3DFMT_V8U8",        D3DFMT_V8U8,        FALSE   },
+        { "D3DFMT_Q8W8V8U8",    D3DFMT_Q8W8V8U8,    FALSE   },
+        { "D3DFMT_A8B8G8R8",    D3DFMT_A8B8G8R8,    FALSE   },
+        { "D3DFMT_X8B8G8R8",    D3DFMT_A8B8G8R8,    FALSE   },
+        { "D3DFMT_R3G3B2",      D3DFMT_R3G3B2,      FALSE   },
+        { "D3DFMT_P8",          D3DFMT_P8,          FALSE   },
+        { "D3DFMT_L8",          D3DFMT_L8,          FALSE   },
+        { "D3DFMT_A8L8",        D3DFMT_A8L8,        FALSE   },
+        { "D3DFMT_DXT1",        D3DFMT_DXT1,        FALSE   },
+        { "D3DFMT_DXT2",        D3DFMT_DXT2,        FALSE   },
+        { "D3DFMT_DXT3",        D3DFMT_DXT3,        FALSE   },
+        { "D3DFMT_DXT4",        D3DFMT_DXT4,        FALSE   },
+        { "D3DFMT_DXT5",        D3DFMT_DXT5,        FALSE   },
+    };
+
+    for(i = 0; i < (sizeof(testdata) / sizeof(testdata[0])); i++)
+    {
+        texture = NULL;
+        hr = IDirect3DDevice9_CreateOffscreenPlainSurface(device, 64, 64, testdata[i].fmt, D3DPOOL_SYSTEMMEM, &surface, NULL);
+        if(FAILED(hr))
+        {
+            hr = IDirect3DDevice9_CreateTexture(device, 64, 64, 1, 0, testdata[i].fmt, D3DPOOL_MANAGED, &texture, NULL);
+            if(FAILED(hr))
+            {
+                skip("IDirect3DDevice9_CreateOffscreenPlainSurface failed, hr = 0x%08x, fmt %s\n", hr, testdata[i].name);
+                continue;
+            }
+            IDirect3DTexture9_GetSurfaceLevel(texture, 0, &surface);
+        }
+
+        dc = (void *) 0x1234;
+        hr = IDirect3DSurface9_GetDC(surface, &dc);
+
+        if(testdata[i].getdc_supported)
+        {
+            ok(SUCCEEDED(hr), "GetDC on format %s failed(hr=0x%08x), but was expected to work\n",
+               testdata[i].name, hr);
+        }
+        else
+        {
+            ok(FAILED(hr), "GetDC on format %s worked(hr=0x%08x), but was expected to fail\n",
+               testdata[i].name, hr);
+        }
+
+        if(SUCCEEDED(hr))
+        {
+            hr = IDirect3DSurface9_ReleaseDC(surface, dc);
+            ok(hr == D3D_OK, "IDirect3DSurface9_ReleaseDC failed, hr = 0x%08x\n", hr);
+        }
+        else
+        {
+            ok(dc == (void *) 0x1234, "After failed getDC dc is %p\n", dc);
+        }
+
+        IDirect3DSurface9_Release(surface);
+        if(texture) IDirect3DTexture9_Release(texture);
+    }
+}
+
 START_TEST(surface)
 {
     HMODULE d3d9_handle;
@@ -399,6 +479,7 @@
     test_lockrect_offset(device_ptr);
     test_lockrect_invalid(device_ptr);
     test_private_data(device_ptr);
+    test_getdc(device_ptr);
 
     refcount = IDirect3DDevice9_Release(device_ptr);
     ok(!refcount, "Device has %u references left\n", refcount);
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index 25ee1df..b59d01a 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -1069,7 +1069,17 @@
     hr = IWineD3DSurface_GetDC(This->WineD3DSurface,
                                hdc);
     LeaveCriticalSection(&ddraw_cs);
-    return hr;
+    switch(hr)
+    {
+        /* Some, but not all errors set *hdc to NULL. E.g. DCALREADYCREATED does not
+         * touch *hdc
+         */
+        case WINED3DERR_INVALIDCALL:
+            if(hdc) *hdc = NULL;
+            return DDERR_INVALIDPARAMS;
+
+        default: return hr;
+    }
 }
 
 /*****************************************************************************
diff --git a/dlls/ddraw/tests/dsurface.c b/dlls/ddraw/tests/dsurface.c
index 28fc0f5..8e0857e 100644
--- a/dlls/ddraw/tests/dsurface.c
+++ b/dlls/ddraw/tests/dsurface.c
@@ -2994,6 +2994,239 @@
     IDirectDraw7_Release(dd7);
 }
 
+static void GetDCFormatTest(void)
+{
+    DDSURFACEDESC2 ddsd;
+    unsigned int i;
+    IDirectDrawSurface7 *surface;
+    IDirectDraw7 *dd7;
+    HRESULT hr;
+    HDC dc;
+
+    struct
+    {
+        const char *name;
+        DDPIXELFORMAT fmt;
+        BOOL getdc_capable;
+    } testdata[] = {
+        {
+            "D3DFMT_A8R8G8B8",
+            {
+                sizeof(DDPIXELFORMAT), DDPF_RGB | DDPF_ALPHAPIXELS, 0,
+                {32}, {0x00ff0000}, {0x0000ff00}, {0x000000ff}, {0xff000000}
+            },
+            TRUE
+        },
+        {
+            "D3DFMT_X8R8G8B8",
+            {
+                sizeof(DDPIXELFORMAT), DDPF_RGB, 0,
+                {32}, {0x00ff0000}, {0x0000ff00}, {0x000000ff}, {0x00000000}
+            },
+            TRUE
+        },
+        {
+            "D3DFMT_X8B8G8R8",
+            {
+                sizeof(DDPIXELFORMAT), DDPF_RGB, 0,
+                {32}, {0x000000ff}, {0x0000ff00}, {0x00ff0000}, {0x00000000}
+            },
+            TRUE
+        },
+        {
+            "D3DFMT_X8B8G8R8",
+            {
+                sizeof(DDPIXELFORMAT), DDPF_RGB | DDPF_ALPHAPIXELS, 0,
+                       {32}, {0x000000ff}, {0x0000ff00}, {0x00ff0000}, {0xff000000}
+            },
+            TRUE
+        },
+        {
+            "D3DFMT_A4R4G4B4",
+            {
+                sizeof(DDPIXELFORMAT), DDPF_RGB | DDPF_ALPHAPIXELS, 0,
+                       {16}, {0x00000f00}, {0x000000f0}, {0x0000000f}, {0x0000f000}
+            },
+            TRUE
+        },
+        {
+            "D3DFMT_X4R4G4B4",
+            {
+                sizeof(DDPIXELFORMAT), DDPF_RGB, 0,
+                       {16}, {0x00000f00}, {0x000000f0}, {0x0000000f}, {0x00000000}
+            },
+            TRUE
+        },
+        {
+            "D3DFMT_R5G6B5",
+            {
+                sizeof(DDPIXELFORMAT), DDPF_RGB, 0,
+                       {16}, {0x0000F800}, {0x000007E0}, {0x0000001F}, {0x00000000}
+            },
+            TRUE
+        },
+        {
+            "D3DFMT_A1R5G5B5",
+            {
+                sizeof(DDPIXELFORMAT), DDPF_RGB | DDPF_ALPHAPIXELS, 0,
+                       {16}, {0x00007C00}, {0x000003E0}, {0x0000001F}, {0x00008000}
+            },
+            TRUE
+        },
+        {
+            "D3DFMT_X1R5G5B5",
+            {
+                sizeof(DDPIXELFORMAT), DDPF_RGB, 0,
+                       {16}, {0x00007C00}, {0x000003E0}, {0x0000001F}, {0x00000000}
+            },
+            TRUE
+        },
+        {
+            "D3DFMT_R3G3B2",
+            {
+                sizeof(DDPIXELFORMAT), DDPF_RGB, 0,
+                       { 8}, {0x000000E0}, {0x0000001C}, {0x00000003}, {0x00000000}
+            },
+            FALSE
+        },
+        {
+            /* Untested, windows test machine didn't support this format */
+            "D3DFMT_A2R10G10B10",
+            {
+                sizeof(DDPIXELFORMAT), DDPF_RGB | DDPF_ALPHAPIXELS, 0,
+                       {32}, {0xC0000000}, {0x3FF00000}, {0x000FFC00}, {0x000003FF}
+            },
+            FALSE
+        },
+        /*
+         * GetDC on a P8 surface fails unless the display mode is 8 bpp. This is not
+         * implemented in wine yet, so disable the test for now. Succeeding P8 getDC
+         * calls are tested in the ddraw.visual test.
+         *
+        {
+            "D3DFMT_P8",
+            {
+                sizeof(DDPIXELFORMAT), DDPF_PALETTEINDEXED8 | DDPF_RGB, 0,
+                {8 }, {0x00000000}, {0x00000000}, {0x00000000}, {0x00000000}
+            },
+            FALSE
+        },
+         */
+        {
+            "D3DFMT_L8",
+            {
+                sizeof(DDPIXELFORMAT), DDPF_LUMINANCE, 0,
+                {8 }, {0x000000ff}, {0x00000000}, {0x00000000}, {0x00000000}
+            },
+            FALSE
+        },
+        {
+            "D3DFMT_A8L8",
+            {
+                sizeof(DDPIXELFORMAT), DDPF_ALPHAPIXELS | DDPF_LUMINANCE, 0,
+                {16}, {0x000000ff}, {0x00000000}, {0x00000000}, {0x0000ff00}
+            },
+            FALSE
+        },
+        {
+            "D3DFMT_DXT1",
+            {
+                sizeof(DDPIXELFORMAT), DDPF_FOURCC, MAKEFOURCC('D','X','T','1'),
+                {0 }, {0x00000000}, {0x00000000}, {0x00000000}, {0x00000000}
+            },
+            FALSE
+        },
+        {
+            "D3DFMT_DXT2",
+            {
+                sizeof(DDPIXELFORMAT), DDPF_FOURCC, MAKEFOURCC('D','X','T','2'),
+                {0 }, {0x00000000}, {0x00000000}, {0x00000000}, {0x00000000}
+            },
+            FALSE
+        },
+        {
+            "D3DFMT_DXT3",
+            {
+                sizeof(DDPIXELFORMAT), DDPF_FOURCC, MAKEFOURCC('D','X','T','3'),
+                {0 }, {0x00000000}, {0x00000000}, {0x00000000}, {0x00000000}
+            },
+            FALSE
+        },
+        {
+            "D3DFMT_DXT4",
+            {
+                sizeof(DDPIXELFORMAT), DDPF_FOURCC, MAKEFOURCC('D','X','T','4'),
+                {0 }, {0x00000000}, {0x00000000}, {0x00000000}, {0x00000000}
+            },
+            FALSE
+        },
+        {
+            "D3DFMT_DXT5",
+            {
+                sizeof(DDPIXELFORMAT), DDPF_FOURCC, MAKEFOURCC('D','X','T','5'),
+                {0 }, {0x00000000}, {0x00000000}, {0x00000000}, {0x00000000}
+            },
+            FALSE
+        },
+    };
+
+    hr = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw7, (void **) &dd7);
+    ok(hr == DD_OK, "IDirectDraw_QueryInterface failed, hr = 0x%08x\n", hr);
+
+    for(i = 0; i < (sizeof(testdata) / sizeof(testdata[0])); i++)
+    {
+        memset(&ddsd, 0, sizeof(ddsd));
+        ddsd.dwSize = sizeof(ddsd);
+        ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
+        ddsd.dwWidth = 64;
+        ddsd.dwHeight = 64;
+        ddsd.ddpfPixelFormat = testdata[i].fmt;
+        ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
+
+        hr = IDirectDraw7_CreateSurface(dd7, &ddsd, &surface, NULL);
+        hr = E_FAIL;
+        if(FAILED(hr))
+        {
+            ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE;
+            ddsd.ddsCaps.dwCaps2 = DDSCAPS2_TEXTUREMANAGE;
+            hr = IDirectDraw7_CreateSurface(dd7, &ddsd, &surface, NULL);
+            if(FAILED(hr))
+            {
+                skip("IDirectDraw7_CreateSurface failed, hr = 0x%08x, format %s\n", hr, testdata[i].name);
+                continue;
+            }
+        }
+
+        dc = (void *) 0x1234;
+        hr = IDirectDrawSurface7_GetDC(surface, &dc);
+        if(testdata[i].getdc_capable)
+        {
+            ok(SUCCEEDED(hr), "GetDC on a %s surface failed(0x%08x), expected it to work\n",
+               testdata[i].name, hr);
+        }
+        else
+        {
+            ok(FAILED(hr), "GetDC on a %s surface succeeded(0x%08x), expected it to fail\n",
+               testdata[i].name, hr);
+        }
+
+        if(SUCCEEDED(hr))
+        {
+            IDirectDrawSurface7_ReleaseDC(surface, dc);
+            ok(hr == DD_OK, "IDirectDrawSurface7_ReleaseDC failed, hr = 0x%08x\n", hr);
+            dc = 0;
+        }
+        else
+        {
+            ok(dc == NULL, "After failed GetDC dc is %p\n", dc);
+        }
+
+        IDirectDrawSurface7_Release(surface);
+    }
+
+    IDirectDraw7_Release(dd7);
+}
+
 START_TEST(dsurface)
 {
     HRESULT ret;
@@ -3038,5 +3271,6 @@
     PaletteTest();
     SurfaceCapsTest();
     GetDCTest();
+    GetDCFormatTest();
     ReleaseDirectDraw();
 }
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index cce613c..a8f6c4b 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -1589,20 +1589,12 @@
     if (This->Flags & SFLAG_LOCKED)
         return WINED3DERR_INVALIDCALL;
 
-    /* According to Direct3D9 docs, only these formats are supported */
-    if (((IWineD3DImpl *)This->resource.wineD3DDevice->wineD3D)->dxVersion > 7) {
-        if (This->resource.format_desc->format != WINED3DFMT_R5G6B5
-                && This->resource.format_desc->format != WINED3DFMT_X1R5G5B5
-                && This->resource.format_desc->format != WINED3DFMT_R8G8B8
-                && This->resource.format_desc->format != WINED3DFMT_X8R8G8B8)
-            return WINED3DERR_INVALIDCALL;
-    }
-
     memset(&lock, 0, sizeof(lock)); /* To be sure */
 
     /* Create a DIB section if there isn't a hdc yet */
     if(!This->hDC) {
-        IWineD3DBaseSurfaceImpl_CreateDIBSection(iface);
+        hr = IWineD3DBaseSurfaceImpl_CreateDIBSection(iface);
+        if(FAILED(hr)) return WINED3DERR_INVALIDCALL;
         if(This->Flags & SFLAG_CLIENT) {
             surface_internal_preload(iface, SRGB_RGB);
         }
diff --git a/dlls/wined3d/surface_base.c b/dlls/wined3d/surface_base.c
index 5c00b2b..c45533b 100644
--- a/dlls/wined3d/surface_base.c
+++ b/dlls/wined3d/surface_base.c
@@ -542,6 +542,12 @@
     DWORD *masks;
     UINT usage;
 
+    if(!(format_desc->Flags & WINED3DFMT_FLAG_GETDC))
+    {
+        WARN("Cannot use GetDC on a %s surface\n", debug_d3dformat(format_desc->format));
+        return WINED3DERR_INVALIDCALL;
+    }
+
     switch (format_desc->byte_count)
     {
         case 2:
diff --git a/dlls/wined3d/surface_gdi.c b/dlls/wined3d/surface_gdi.c
index 0246782..d36f9da 100644
--- a/dlls/wined3d/surface_gdi.c
+++ b/dlls/wined3d/surface_gdi.c
@@ -384,6 +384,12 @@
 
     TRACE("(%p)->(%p)\n",This,pHDC);
 
+    if(!(This->Flags & SFLAG_DIBSECTION))
+    {
+        WARN("DC not supported on this surface\n");
+        return WINED3DERR_INVALIDCALL;
+    }
+
     if(This->Flags & SFLAG_USERPTR) {
         ERR("Not supported on surfaces with an application-provided surfaces\n");
         return WINEDDERR_NODC;
@@ -525,26 +531,29 @@
 IWineGDISurfaceImpl_PrivateSetup(IWineD3DSurface *iface)
 {
     IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
+    HRESULT hr;
 
     if(This->resource.usage & WINED3DUSAGE_OVERLAY)
     {
         ERR("(%p) Overlays not yet supported by GDI surfaces\n", This);
         return WINED3DERR_INVALIDCALL;
     }
+
     /* Sysmem textures have memory already allocated -
      * release it, this avoids an unnecessary memcpy
      */
-    HeapFree(GetProcessHeap(), 0, This->resource.heapMemory);
-    This->resource.allocatedMemory = NULL;
-    This->resource.heapMemory = NULL;
+    hr = IWineD3DBaseSurfaceImpl_CreateDIBSection(iface);
+    if(SUCCEEDED(hr))
+    {
+        HeapFree(GetProcessHeap(), 0, This->resource.heapMemory);
+        This->resource.heapMemory = NULL;
+        This->resource.allocatedMemory = This->dib.bitmap_data;
+    }
 
     /* We don't mind the nonpow2 stuff in GDI */
     This->pow2Width = This->currentDesc.Width;
     This->pow2Height = This->currentDesc.Height;
 
-    IWineD3DBaseSurfaceImpl_CreateDIBSection(iface);
-    This->resource.allocatedMemory = This->dib.bitmap_data;
-
     return WINED3D_OK;
 }
 
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index ff81078..2d7a6b9 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -294,40 +294,47 @@
     /* Palettized formats */
     {WINED3DFMT_P8,                 GL_RGBA,                          GL_RGBA,                                0,
             GL_RGBA,                GL_UNSIGNED_BYTE,
-            0,
+            WINED3DFMT_FLAG_GETDC,
             ARB_FRAGMENT_PROGRAM},
     {WINED3DFMT_P8,                 GL_COLOR_INDEX8_EXT,              GL_COLOR_INDEX8_EXT,                    0,
             GL_COLOR_INDEX,         GL_UNSIGNED_BYTE,
-            0,
+            WINED3DFMT_FLAG_GETDC,
             EXT_PALETTED_TEXTURE},
     /* Standard ARGB formats */
     {WINED3DFMT_R8G8B8,             GL_RGB8,                          GL_RGB8,                                0,
             GL_BGR,                 GL_UNSIGNED_BYTE,
-            WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET,
+            WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET |
+            WINED3DFMT_FLAG_GETDC,
             WINED3D_GL_EXT_NONE},
     {WINED3DFMT_A8R8G8B8,           GL_RGBA8,                         GL_SRGB8_ALPHA8_EXT,                    0,
             GL_BGRA,                GL_UNSIGNED_INT_8_8_8_8_REV,
-            WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET,
+            WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET |
+            WINED3DFMT_FLAG_GETDC,
             WINED3D_GL_EXT_NONE},
     {WINED3DFMT_X8R8G8B8,           GL_RGB8,                          GL_SRGB8_EXT,                           0,
             GL_BGRA,                GL_UNSIGNED_INT_8_8_8_8_REV,
-            WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET,
+            WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET |
+            WINED3DFMT_FLAG_GETDC,
             WINED3D_GL_EXT_NONE},
     {WINED3DFMT_R5G6B5,             GL_RGB5,                          GL_RGB5,                                GL_RGB8,
             GL_RGB,                 GL_UNSIGNED_SHORT_5_6_5,
-            WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET,
+            WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET |
+            WINED3DFMT_FLAG_GETDC,
             WINED3D_GL_EXT_NONE},
     {WINED3DFMT_X1R5G5B5,           GL_RGB5,                          GL_RGB5_A1,                             0,
             GL_BGRA,                GL_UNSIGNED_SHORT_1_5_5_5_REV,
-            WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+            WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING |
+            WINED3DFMT_FLAG_GETDC,
             WINED3D_GL_EXT_NONE},
     {WINED3DFMT_A1R5G5B5,           GL_RGB5_A1,                       GL_RGB5_A1,                             0,
             GL_BGRA,                GL_UNSIGNED_SHORT_1_5_5_5_REV,
-            WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+            WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING |
+            WINED3DFMT_FLAG_GETDC,
             WINED3D_GL_EXT_NONE},
     {WINED3DFMT_A4R4G4B4,           GL_RGBA4,                         GL_SRGB8_ALPHA8_EXT,                    0,
             GL_BGRA,                GL_UNSIGNED_SHORT_4_4_4_4_REV,
-            WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+            WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING |
+            WINED3DFMT_FLAG_GETDC,
             WINED3D_GL_EXT_NONE},
     {WINED3DFMT_R3G3B2,             GL_R3_G3_B2,                      GL_R3_G3_B2,                            0,
             GL_RGB,                 GL_UNSIGNED_BYTE_3_3_2,
@@ -339,7 +346,7 @@
             WINED3D_GL_EXT_NONE},
     {WINED3DFMT_X4R4G4B4,           GL_RGB4,                          GL_RGB4,                                0,
             GL_BGRA,                GL_UNSIGNED_SHORT_4_4_4_4_REV,
-            WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+            WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_GETDC,
             WINED3D_GL_EXT_NONE},
     {WINED3DFMT_R10G10B10A2_UNORM,  GL_RGB10_A2,                      GL_RGB10_A2,                            0,
             GL_RGBA,                GL_UNSIGNED_INT_2_10_10_10_REV,
@@ -347,11 +354,11 @@
             WINED3D_GL_EXT_NONE},
     {WINED3DFMT_R8G8B8A8_UNORM,     GL_RGBA8,                         GL_RGBA8,                               0,
             GL_RGBA,                GL_UNSIGNED_INT_8_8_8_8_REV,
-            WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+            WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_GETDC,
             WINED3D_GL_EXT_NONE},
     {WINED3DFMT_X8B8G8R8,           GL_RGB8,                          GL_RGB8,                                0,
             GL_RGBA,                GL_UNSIGNED_INT_8_8_8_8_REV,
-            WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
+            WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_GETDC,
             WINED3D_GL_EXT_NONE},
     {WINED3DFMT_R16G16_UNORM,       GL_RGB16_EXT,                     GL_RGB16_EXT,                           GL_RGBA16_EXT,
             GL_RGB,                 GL_UNSIGNED_SHORT,
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index fefc540..8d202ca 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2850,6 +2850,7 @@
 #define WINED3DFMT_FLAG_FOURCC                   0x20
 #define WINED3DFMT_FLAG_FBO_ATTACHABLE           0x40
 #define WINED3DFMT_FLAG_COMPRESSED               0x80
+#define WINED3DFMT_FLAG_GETDC                    0x100
 
 struct GlPixelFormatDesc
 {