Henri Verbeet : d3d9: Implement d3d9_GetAdapterModeCountEx().

Alexandre Julliard julliard at winehq.org
Fri Jun 29 14:24:27 CDT 2012


Module: wine
Branch: master
Commit: 8d4e3d0d5810d7a8b08cce4b0a6ac3e6ebb9d7e1
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=8d4e3d0d5810d7a8b08cce4b0a6ac3e6ebb9d7e1

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Fri Jun 29 07:37:57 2012 +0200

d3d9: Implement d3d9_GetAdapterModeCountEx().

---

 dlls/d3d8/directx.c    |    3 ++-
 dlls/d3d9/directx.c    |   18 +++++++++++++++---
 dlls/dxgi/output.c     |    3 ++-
 dlls/wined3d/directx.c |   19 ++++++++++++++++---
 include/wine/wined3d.h |    4 ++--
 5 files changed, 37 insertions(+), 10 deletions(-)

diff --git a/dlls/d3d8/directx.c b/dlls/d3d8/directx.c
index 893340e..19575b1 100644
--- a/dlls/d3d8/directx.c
+++ b/dlls/d3d8/directx.c
@@ -157,7 +157,8 @@ static UINT WINAPI d3d8_GetAdapterModeCount(IDirect3D8 *iface, UINT adapter)
     TRACE("iface %p, adapter %u.\n", iface, adapter);
 
     wined3d_mutex_lock();
-    hr = wined3d_get_adapter_mode_count(d3d8->wined3d, adapter, 0);
+    hr = wined3d_get_adapter_mode_count(d3d8->wined3d, adapter,
+            WINED3DFMT_UNKNOWN, WINED3D_SCANLINE_ORDERING_UNKNOWN);
     wined3d_mutex_unlock();
 
     return hr;
diff --git a/dlls/d3d9/directx.c b/dlls/d3d9/directx.c
index 97a5bcb..02b2360 100644
--- a/dlls/d3d9/directx.c
+++ b/dlls/d3d9/directx.c
@@ -164,7 +164,8 @@ static UINT WINAPI d3d9_GetAdapterModeCount(IDirect3D9Ex *iface, UINT adapter, D
         return 0;
 
     wined3d_mutex_lock();
-    ret = wined3d_get_adapter_mode_count(d3d9->wined3d, adapter, wined3dformat_from_d3dformat(format));
+    ret = wined3d_get_adapter_mode_count(d3d9->wined3d, adapter,
+            wined3dformat_from_d3dformat(format), WINED3D_SCANLINE_ORDERING_UNKNOWN);
     wined3d_mutex_unlock();
 
     return ret;
@@ -477,9 +478,20 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH d3d9_CreateDevice(IDirect3D9Ex *iface, U
 static UINT WINAPI d3d9_GetAdapterModeCountEx(IDirect3D9Ex *iface,
         UINT adapter, const D3DDISPLAYMODEFILTER *filter)
 {
-    FIXME("iface %p, adapter %u, filter %p stub!\n", iface, adapter, filter);
+    struct d3d9 *d3d9 = impl_from_IDirect3D9Ex(iface);
+    UINT ret;
+
+    TRACE("iface %p, adapter %u, filter %p.\n", iface, adapter, filter);
+
+    if (filter->Format != D3DFMT_X8R8G8B8 && filter->Format != D3DFMT_R5G6B5)
+        return 0;
 
-    return 0;
+    wined3d_mutex_lock();
+    ret = wined3d_get_adapter_mode_count(d3d9->wined3d, adapter,
+            wined3dformat_from_d3dformat(filter->Format), filter->ScanLineOrdering);
+    wined3d_mutex_unlock();
+
+    return ret;
 }
 
 static HRESULT WINAPI d3d9_EnumAdapterModesEx(IDirect3D9Ex *iface,
diff --git a/dlls/dxgi/output.c b/dlls/dxgi/output.c
index ecc9a10..4876507 100644
--- a/dlls/dxgi/output.c
+++ b/dlls/dxgi/output.c
@@ -146,7 +146,8 @@ static HRESULT STDMETHODCALLTYPE dxgi_output_GetDisplayModeList(IDXGIOutput *ifa
     wined3d_format = wined3dformat_from_dxgi_format(format);
 
     EnterCriticalSection(&dxgi_cs);
-    max_count = wined3d_get_adapter_mode_count(wined3d, This->adapter->ordinal, wined3d_format);
+    max_count = wined3d_get_adapter_mode_count(wined3d, This->adapter->ordinal,
+            wined3d_format, WINED3D_SCANLINE_ORDERING_UNKNOWN);
 
     if (!desc)
     {
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index a9e41ce..aef06af 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -2892,7 +2892,7 @@ HMONITOR CDECL wined3d_get_adapter_monitor(const struct wined3d *wined3d, UINT a
 
 /* Note: dx9 supplies a format. Calls from d3d8 supply WINED3DFMT_UNKNOWN */
 UINT CDECL wined3d_get_adapter_mode_count(const struct wined3d *wined3d, UINT adapter_idx,
-        enum wined3d_format_id format_id)
+        enum wined3d_format_id format_id, enum wined3d_scanline_ordering scanline_ordering)
 {
     const struct wined3d_adapter *adapter;
     const struct wined3d_format *format;
@@ -2901,7 +2901,8 @@ UINT CDECL wined3d_get_adapter_mode_count(const struct wined3d *wined3d, UINT ad
     UINT format_bits;
     DEVMODEW mode;
 
-    TRACE("wined3d %p, adapter_idx %u, format %s.\n", wined3d, adapter_idx, debug_d3dformat(format_id));
+    TRACE("wined3d %p, adapter_idx %u, format %s, scanline_ordering %#x.\n",
+            wined3d, adapter_idx, debug_d3dformat(format_id), scanline_ordering);
 
     if (adapter_idx >= wined3d->adapter_count)
         return 0;
@@ -2915,6 +2916,17 @@ UINT CDECL wined3d_get_adapter_mode_count(const struct wined3d *wined3d, UINT ad
 
     while (EnumDisplaySettingsExW(adapter->DeviceName, j++, &mode, 0))
     {
+        if (mode.dmFields & DM_DISPLAYFLAGS)
+        {
+            if (scanline_ordering == WINED3D_SCANLINE_ORDERING_PROGRESSIVE
+                    && (mode.u2.dmDisplayFlags & DM_INTERLACED))
+                continue;
+
+            if (scanline_ordering == WINED3D_SCANLINE_ORDERING_INTERLACED
+                    && !(mode.u2.dmDisplayFlags & DM_INTERLACED))
+                continue;
+        }
+
         if (format_id == WINED3DFMT_UNKNOWN)
         {
             /* This is for d3d8, do not enumerate P8 here. */
@@ -4406,7 +4418,8 @@ HRESULT CDECL wined3d_check_device_type(const struct wined3d *wined3d, UINT adap
     }
 
     /* If the requested display format is not available, don't continue. */
-    mode_count = wined3d_get_adapter_mode_count(wined3d, adapter_idx, display_format);
+    mode_count = wined3d_get_adapter_mode_count(wined3d, adapter_idx,
+            display_format, WINED3D_SCANLINE_ORDERING_UNKNOWN);
     if (!mode_count)
     {
         TRACE("No available modes for display format %s.\n", debug_d3dformat(display_format));
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 5e95917..f346455 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2043,8 +2043,8 @@ HRESULT __cdecl wined3d_get_adapter_display_mode(const struct wined3d *wined3d,
         struct wined3d_display_mode *mode, enum wined3d_display_rotation *rotation);
 HRESULT __cdecl wined3d_get_adapter_identifier(const struct wined3d *wined3d, UINT adapter_idx,
         DWORD flags, struct wined3d_adapter_identifier *identifier);
-UINT __cdecl wined3d_get_adapter_mode_count(const struct wined3d *wined3d,
-        UINT adapter_idx, enum wined3d_format_id format_id);
+UINT __cdecl wined3d_get_adapter_mode_count(const struct wined3d *wined3d, UINT adapter_idx,
+        enum wined3d_format_id format_id, enum wined3d_scanline_ordering scanline_ordering);
 HMONITOR __cdecl wined3d_get_adapter_monitor(const struct wined3d *wined3d, UINT adapter_idx);
 HRESULT __cdecl wined3d_get_device_caps(const struct wined3d *wined3d, UINT adapter_idx,
         enum wined3d_device_type device_type, WINED3DCAPS *caps);




More information about the wine-cvs mailing list