Stefan Dösinger : d3d: Enumerate palettized formats for ddraw.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Apr 16 07:08:41 CDT 2007
Module: wine
Branch: master
Commit: 8a5b6df483fcd02734df77046b757957bbcbbbfc
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8a5b6df483fcd02734df77046b757957bbcbbbfc
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Fri Apr 13 16:38:10 2007 +0200
d3d: Enumerate palettized formats for ddraw.
---
dlls/d3d9/directx.c | 10 +++++-
dlls/ddraw/ddraw.c | 83 +++++++++++++++++++++++++++++++++---------------
dlls/wined3d/directx.c | 11 ++++++
3 files changed, 76 insertions(+), 28 deletions(-)
diff --git a/dlls/d3d9/directx.c b/dlls/d3d9/directx.c
index f15aa4d..ec4f7aa 100644
--- a/dlls/d3d9/directx.c
+++ b/dlls/d3d9/directx.c
@@ -98,14 +98,20 @@ static HRESULT WINAPI IDirect3D9Impl_GetAdapterIdentifier(LPDIRECT3D9 iface, UIN
static UINT WINAPI IDirect3D9Impl_GetAdapterModeCount(LPDIRECT3D9 iface, UINT Adapter, D3DFORMAT Format) {
IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
+
+ /* Others than that not supported by d3d9, but reported by wined3d for ddraw. Filter them out */
+ if(Format != D3DFMT_X8R8G8B8 && Format != D3DFMT_R5G6B5 && Format != D3DFMT_UNKNOWN) {
+ return 0;
+ }
+
return IWineD3D_GetAdapterModeCount(This->WineD3D, Adapter, Format);
}
static HRESULT WINAPI IDirect3D9Impl_EnumAdapterModes(LPDIRECT3D9 iface, UINT Adapter, D3DFORMAT Format, UINT Mode, D3DDISPLAYMODE* pMode) {
IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
- /* We can't pass this to WineD3D, otherwise it'll think it came from D3D8.
+ /* We can't pass this to WineD3D, otherwise it'll think it came from D3D8 or DDraw.
It's supposed to fail anyway, so no harm returning failure. */
- if(Format == D3DFMT_UNKNOWN)
+ if(Format != WINED3DFMT_X8R8G8B8 && Format != WINED3DFMT_R5G6B5)
return D3DERR_INVALIDCALL;
return IWineD3D_EnumAdapterModes(This->WineD3D, Adapter, Format, Mode, (WINED3DDISPLAYMODE *) pMode);
}
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index ac95ddf..4255adb 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -1166,11 +1166,31 @@ IDirectDrawImpl_EnumDisplayModes(IDirectDraw7 *iface,
LPDDENUMMODESCALLBACK2 cb)
{
ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
- unsigned int modenum = 0;
+ unsigned int modenum, fmt;
WINED3DFORMAT pixelformat = WINED3DFMT_UNKNOWN;
WINED3DDISPLAYMODE mode;
DDSURFACEDESC2 callback_sd;
+ WINED3DFORMAT checkFormatList[] =
+ {
+ WINED3DFMT_R8G8B8,
+ WINED3DFMT_A8R8G8B8,
+ WINED3DFMT_X8R8G8B8,
+ WINED3DFMT_R5G6B5,
+ WINED3DFMT_X1R5G5B5,
+ WINED3DFMT_A1R5G5B5,
+ WINED3DFMT_A4R4G4B4,
+ WINED3DFMT_R3G3B2,
+ WINED3DFMT_A8R3G3B2,
+ WINED3DFMT_X4R4G4B4,
+ WINED3DFMT_A2B10G10R10,
+ WINED3DFMT_A8B8G8R8,
+ WINED3DFMT_X8B8G8R8,
+ WINED3DFMT_A2R10G10B10,
+ WINED3DFMT_A8P8,
+ WINED3DFMT_P8
+ };
+
TRACE("(%p)->(%p,%p,%p): Relay\n", This, DDSD, Context, cb);
/* This looks sane */
@@ -1182,41 +1202,52 @@ IDirectDrawImpl_EnumDisplayModes(IDirectDraw7 *iface,
pixelformat = PixelFormat_DD2WineD3D(&DDSD->u4.ddpfPixelFormat);
}
- while(IWineD3D_EnumAdapterModes(This->wineD3D,
- WINED3DADAPTER_DEFAULT,
- pixelformat,
- modenum++,
- &mode) == WINED3D_OK) {
- if(DDSD)
+ for(fmt = 0; fmt < (sizeof(checkFormatList) / sizeof(checkFormatList[0])); fmt++)
+ {
+ if(pixelformat != WINED3DFMT_UNKNOWN && checkFormatList[fmt] != pixelformat)
{
- if(DDSD->dwFlags & DDSD_WIDTH && mode.Width != DDSD->dwWidth) continue;
- if(DDSD->dwFlags & DDSD_HEIGHT && mode.Height != DDSD->dwHeight) continue;
+ continue;
}
- memset(&callback_sd, 0, sizeof(callback_sd));
- callback_sd.dwSize = sizeof(callback_sd);
- callback_sd.u4.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
-
- callback_sd.dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT|DDSD_PITCH;
- if(Flags & DDEDM_REFRESHRATES)
+ modenum = 0;
+ while(IWineD3D_EnumAdapterModes(This->wineD3D,
+ WINED3DADAPTER_DEFAULT,
+ checkFormatList[fmt],
+ modenum++,
+ &mode) == WINED3D_OK)
{
- callback_sd.dwFlags |= DDSD_REFRESHRATE;
- callback_sd.u2.dwRefreshRate = mode.RefreshRate;
- }
+ if(DDSD)
+ {
+ if(DDSD->dwFlags & DDSD_WIDTH && mode.Width != DDSD->dwWidth) continue;
+ if(DDSD->dwFlags & DDSD_HEIGHT && mode.Height != DDSD->dwHeight) continue;
+ }
- callback_sd.dwWidth = mode.Width;
- callback_sd.dwHeight = mode.Height;
+ memset(&callback_sd, 0, sizeof(callback_sd));
+ callback_sd.dwSize = sizeof(callback_sd);
+ callback_sd.u4.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
- PixelFormat_WineD3DtoDD(&callback_sd.u4.ddpfPixelFormat, mode.Format);
+ callback_sd.dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT|DDSD_PITCH;
+ if(Flags & DDEDM_REFRESHRATES)
+ {
+ callback_sd.dwFlags |= DDSD_REFRESHRATE;
+ callback_sd.u2.dwRefreshRate = mode.RefreshRate;
+ }
- TRACE("Enumerating %dx%d@%d\n", callback_sd.dwWidth, callback_sd.dwHeight, callback_sd.u4.ddpfPixelFormat.u1.dwRGBBitCount);
+ callback_sd.dwWidth = mode.Width;
+ callback_sd.dwHeight = mode.Height;
- if(cb(&callback_sd, Context) == DDENUMRET_CANCEL)
- {
- TRACE("Application asked to terminate the enumeration\n");
- return DD_OK;
+ PixelFormat_WineD3DtoDD(&callback_sd.u4.ddpfPixelFormat, mode.Format);
+
+ TRACE("Enumerating %dx%d@%d\n", callback_sd.dwWidth, callback_sd.dwHeight, callback_sd.u4.ddpfPixelFormat.u1.dwRGBBitCount);
+
+ if(cb(&callback_sd, Context) == DDENUMRET_CANCEL)
+ {
+ TRACE("Application asked to terminate the enumeration\n");
+ return DD_OK;
+ }
}
}
+
TRACE("End of enumeration\n");
return DD_OK;
}
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index e90e2ce..8f9998c 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -1117,6 +1117,7 @@ static UINT WINAPI IWineD3DImpl_GetAdapterModeCount(IWineD3D *iface, UINT Ad
switch (Format)
{
case WINED3DFMT_UNKNOWN:
+ /* This is for D3D8, do not enumerate P8 here */
if (DevModeW.dmBitsPerPel == 32 ||
DevModeW.dmBitsPerPel == 16) i++;
break;
@@ -1126,6 +1127,9 @@ static UINT WINAPI IWineD3DImpl_GetAdapterModeCount(IWineD3D *iface, UINT Ad
case WINED3DFMT_R5G6B5:
if (DevModeW.dmBitsPerPel == 16) i++;
break;
+ case WINED3DFMT_P8:
+ if (DevModeW.dmBitsPerPel == 8) i++;
+ break;
default:
/* Skip other modes as they do not match the requested format */
break;
@@ -1169,6 +1173,7 @@ static HRESULT WINAPI IWineD3DImpl_EnumAdapterModes(IWineD3D *iface, UINT Adapte
switch (Format)
{
case WINED3DFMT_UNKNOWN:
+ /* This is D3D8. Do not enumerate P8 here */
if (DevModeW.dmBitsPerPel == 32 ||
DevModeW.dmBitsPerPel == 16) i++;
break;
@@ -1178,6 +1183,9 @@ static HRESULT WINAPI IWineD3DImpl_EnumAdapterModes(IWineD3D *iface, UINT Adapte
case WINED3DFMT_R5G6B5:
if (DevModeW.dmBitsPerPel == 16) i++;
break;
+ case WINED3DFMT_P8:
+ if (DevModeW.dmBitsPerPel == 8) i++;
+ break;
default:
/* Modes that don't match what we support can get an early-out */
TRACE_(d3d_caps)("Searching for %s, returning D3DERR_INVALIDCALL\n", debug_d3dformat(Format));
@@ -1203,6 +1211,9 @@ static HRESULT WINAPI IWineD3DImpl_EnumAdapterModes(IWineD3D *iface, UINT Adapte
{
switch (DevModeW.dmBitsPerPel)
{
+ case 8:
+ pMode->Format = WINED3DFMT_P8;
+ break;
case 16:
pMode->Format = WINED3DFMT_R5G6B5;
break;
More information about the wine-cvs
mailing list