diff --git a/dlls/d3d8/directx.c b/dlls/d3d8/directx.c index 19575b19d27..89c2fcc8eaa 100644 --- a/dlls/d3d8/directx.c +++ b/dlls/d3d8/directx.c @@ -174,7 +174,8 @@ static HRESULT WINAPI d3d8_EnumAdapterModes(IDirect3D8 *iface, UINT adapter, UIN iface, adapter, mode_idx, mode); wined3d_mutex_lock(); - hr = wined3d_enum_adapter_modes(d3d8->wined3d, adapter, WINED3DFMT_UNKNOWN, mode_idx, &wined3d_mode); + hr = wined3d_enum_adapter_modes(d3d8->wined3d, adapter, WINED3DFMT_UNKNOWN, + WINED3D_SCANLINE_ORDERING_UNKNOWN, mode_idx, &wined3d_mode); wined3d_mutex_unlock(); if (SUCCEEDED(hr)) diff --git a/dlls/d3d9/directx.c b/dlls/d3d9/directx.c index 02b2360eca9..3cb979f4f35 100644 --- a/dlls/d3d9/directx.c +++ b/dlls/d3d9/directx.c @@ -186,7 +186,7 @@ static HRESULT WINAPI d3d9_EnumAdapterModes(IDirect3D9Ex *iface, UINT adapter, wined3d_mutex_lock(); hr = wined3d_enum_adapter_modes(d3d9->wined3d, adapter, wined3dformat_from_d3dformat(format), - mode_idx, &wined3d_mode); + WINED3D_SCANLINE_ORDERING_UNKNOWN, mode_idx, &wined3d_mode); wined3d_mutex_unlock(); if (SUCCEEDED(hr)) @@ -497,10 +497,31 @@ static UINT WINAPI d3d9_GetAdapterModeCountEx(IDirect3D9Ex *iface, static HRESULT WINAPI d3d9_EnumAdapterModesEx(IDirect3D9Ex *iface, UINT adapter, const D3DDISPLAYMODEFILTER *filter, UINT mode_idx, D3DDISPLAYMODEEX *mode) { - FIXME("iface %p, adapter %u, filter %p, mode_idx %u, mode %p stub!\n", + struct d3d9 *d3d9 = impl_from_IDirect3D9Ex(iface); + struct wined3d_display_mode wined3d_mode; + HRESULT hr; + + TRACE("iface %p, adapter %u, filter %p, mode_idx %u, mode %p.\n", iface, adapter, filter, mode_idx, mode); - return E_NOTIMPL; + if (filter->Format != D3DFMT_X8R8G8B8 && filter->Format != D3DFMT_R5G6B5) + return D3DERR_INVALIDCALL; + + wined3d_mutex_lock(); + hr = wined3d_enum_adapter_modes(d3d9->wined3d, adapter, wined3dformat_from_d3dformat(filter->Format), + filter->ScanLineOrdering, mode_idx, &wined3d_mode); + wined3d_mutex_unlock(); + + if (SUCCEEDED(hr)) + { + mode->Width = wined3d_mode.width; + mode->Height = wined3d_mode.height; + mode->RefreshRate = wined3d_mode.refresh_rate; + mode->Format = d3dformat_from_wined3dformat(wined3d_mode.format_id); + mode->ScanLineOrdering = wined3d_mode.scanline_ordering; + } + + return hr; } static HRESULT WINAPI d3d9_GetAdapterDisplayModeEx(IDirect3D9Ex *iface, diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c index 1628e20b57c..356d726ab04 100644 --- a/dlls/ddraw/ddraw.c +++ b/dlls/ddraw/ddraw.c @@ -2221,8 +2221,8 @@ static HRESULT WINAPI ddraw7_EnumDisplayModes(IDirectDraw7 *iface, DWORD Flags, for(fmt = 0; fmt < (sizeof(checkFormatList) / sizeof(checkFormatList[0])); fmt++) { modenum = 0; - while (wined3d_enum_adapter_modes(ddraw->wined3d, WINED3DADAPTER_DEFAULT, - checkFormatList[fmt], modenum++, &mode) == WINED3D_OK) + while (wined3d_enum_adapter_modes(ddraw->wined3d, WINED3DADAPTER_DEFAULT, checkFormatList[fmt], + WINED3D_SCANLINE_ORDERING_UNKNOWN, modenum++, &mode) == WINED3D_OK) { PixelFormat_WineD3DtoDD(&pixelformat, mode.format_id); if (DDSD) diff --git a/dlls/dxgi/output.c b/dlls/dxgi/output.c index 4876507193d..4cdd06b2480 100644 --- a/dlls/dxgi/output.c +++ b/dlls/dxgi/output.c @@ -164,7 +164,8 @@ static HRESULT STDMETHODCALLTYPE dxgi_output_GetDisplayModeList(IDXGIOutput *ifa struct wined3d_display_mode mode; HRESULT hr; - hr = wined3d_enum_adapter_modes(wined3d, This->adapter->ordinal, wined3d_format, i, &mode); + hr = wined3d_enum_adapter_modes(wined3d, This->adapter->ordinal, wined3d_format, + WINED3D_SCANLINE_ORDERING_UNKNOWN, i, &mode); if (FAILED(hr)) { WARN("EnumAdapterModes failed, hr %#x.\n", hr); diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index aef06af8512..381eae7d432 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -2945,7 +2945,8 @@ UINT CDECL wined3d_get_adapter_mode_count(const struct wined3d *wined3d, UINT ad /* Note: dx9 supplies a format. Calls from d3d8 supply WINED3DFMT_UNKNOWN */ HRESULT CDECL wined3d_enum_adapter_modes(const struct wined3d *wined3d, UINT adapter_idx, - enum wined3d_format_id format_id, UINT mode_idx, struct wined3d_display_mode *mode) + enum wined3d_format_id format_id, enum wined3d_scanline_ordering scanline_ordering, + UINT mode_idx, struct wined3d_display_mode *mode) { const struct wined3d_adapter *adapter; const struct wined3d_format *format; @@ -2954,8 +2955,8 @@ HRESULT CDECL wined3d_enum_adapter_modes(const struct wined3d *wined3d, UINT ada UINT i = 0; int j = 0; - TRACE("wined3d %p, adapter_idx %u, format %s, mode_idx %u, mode %p.\n", - wined3d, adapter_idx, debug_d3dformat(format_id), mode_idx, mode); + TRACE("wined3d %p, adapter_idx %u, format %s, scanline_ordering %#x, mode_idx %u, mode %p.\n", + wined3d, adapter_idx, debug_d3dformat(format_id), scanline_ordering, mode_idx, mode); if (!mode || adapter_idx >= wined3d->adapter_count) return WINED3DERR_INVALIDCALL; @@ -2975,6 +2976,17 @@ HRESULT CDECL wined3d_enum_adapter_modes(const struct wined3d *wined3d, UINT ada return WINED3DERR_INVALIDCALL; } + if (m.dmFields & DM_DISPLAYFLAGS) + { + if (scanline_ordering == WINED3D_SCANLINE_ORDERING_PROGRESSIVE + && (m.u2.dmDisplayFlags & DM_INTERLACED)) + continue; + + if (scanline_ordering == WINED3D_SCANLINE_ORDERING_INTERLACED + && !(m.u2.dmDisplayFlags & DM_INTERLACED)) + continue; + } + if (format_id == WINED3DFMT_UNKNOWN) { /* This is for d3d8, do not enumerate P8 here. */ diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index f34645578d8..b85b25785e3 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2037,7 +2037,8 @@ HRESULT __cdecl wined3d_check_device_type(const struct wined3d *wined3d, UINT ad struct wined3d * __cdecl wined3d_create(UINT version, DWORD flags); ULONG __cdecl wined3d_decref(struct wined3d *wined3d); HRESULT __cdecl wined3d_enum_adapter_modes(const struct wined3d *wined3d, UINT adapter_idx, - enum wined3d_format_id format_id, UINT mode_idx, struct wined3d_display_mode *mode); + enum wined3d_format_id format_id, enum wined3d_scanline_ordering scanline_ordering, + UINT mode_idx, struct wined3d_display_mode *mode); UINT __cdecl wined3d_get_adapter_count(const struct wined3d *wined3d); HRESULT __cdecl wined3d_get_adapter_display_mode(const struct wined3d *wined3d, UINT adapter_idx, struct wined3d_display_mode *mode, enum wined3d_display_rotation *rotation);