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
{