[PATCH 4/5] dxgi: Implement dxgi_output_GetDisplayModeList1().

Józef Kucia jkucia at codeweavers.com
Thu Mar 7 04:21:23 CST 2019


Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 dlls/dxgi/output.c | 149 +++++++++++++++++++++++++++------------------
 1 file changed, 90 insertions(+), 59 deletions(-)

diff --git a/dlls/dxgi/output.c b/dlls/dxgi/output.c
index b1f20b92ebf5..4a4b0fc987b1 100644
--- a/dlls/dxgi/output.c
+++ b/dlls/dxgi/output.c
@@ -75,6 +75,85 @@ static HRESULT dxgi_output_find_closest_matching_mode(struct dxgi_output *output
     return hr;
 }
 
+enum dxgi_mode_struct_version
+{
+    DXGI_MODE_STRUCT_VERSION_0,
+    DXGI_MODE_STRUCT_VERSION_1,
+};
+
+static HRESULT dxgi_output_get_display_mode_list(struct dxgi_output *output,
+        DXGI_FORMAT format, unsigned int *mode_count, void *modes,
+        enum dxgi_mode_struct_version struct_version)
+{
+    enum wined3d_format_id wined3d_format;
+    struct wined3d_display_mode mode;
+    unsigned int i, max_count;
+    struct wined3d *wined3d;
+    HRESULT hr;
+
+    if (!mode_count)
+        return DXGI_ERROR_INVALID_CALL;
+
+    if (format == DXGI_FORMAT_UNKNOWN)
+    {
+        *mode_count = 0;
+        return S_OK;
+    }
+
+    wined3d_format = wined3dformat_from_dxgi_format(format);
+
+    wined3d_mutex_lock();
+    wined3d = output->adapter->factory->wined3d;
+    max_count = wined3d_get_adapter_mode_count(wined3d, output->adapter->ordinal,
+            wined3d_format, WINED3D_SCANLINE_ORDERING_UNKNOWN);
+
+    if (!modes)
+    {
+        wined3d_mutex_unlock();
+        *mode_count = max_count;
+        return S_OK;
+    }
+
+    if (max_count > *mode_count)
+    {
+        wined3d_mutex_unlock();
+        return DXGI_ERROR_MORE_DATA;
+    }
+
+    *mode_count = max_count;
+
+    for (i = 0; i < *mode_count; ++i)
+    {
+        if (FAILED(hr = wined3d_enum_adapter_modes(wined3d, output->adapter->ordinal,
+                wined3d_format, WINED3D_SCANLINE_ORDERING_UNKNOWN, i, &mode)))
+        {
+            WARN("Failed to enum adapter mode %u, hr %#x.\n", i, hr);
+            wined3d_mutex_unlock();
+            return hr;
+        }
+
+        switch (struct_version)
+        {
+            case DXGI_MODE_STRUCT_VERSION_0:
+            {
+                DXGI_MODE_DESC *desc = modes;
+                dxgi_mode_from_wined3d(&desc[i], &mode);
+                break;
+            }
+
+            case DXGI_MODE_STRUCT_VERSION_1:
+            {
+                DXGI_MODE_DESC1 *desc = modes;
+                dxgi_mode1_from_wined3d(&desc[i], &mode);
+                break;
+            }
+        }
+    }
+    wined3d_mutex_unlock();
+
+    return S_OK;
+}
+
 static inline struct dxgi_output *impl_from_IDXGIOutput4(IDXGIOutput4 *iface)
 {
     return CONTAINING_RECORD(iface, struct dxgi_output, IDXGIOutput4_iface);
@@ -208,66 +287,15 @@ static HRESULT STDMETHODCALLTYPE dxgi_output_GetDesc(IDXGIOutput4 *iface, DXGI_O
 }
 
 static HRESULT STDMETHODCALLTYPE dxgi_output_GetDisplayModeList(IDXGIOutput4 *iface,
-        DXGI_FORMAT format, UINT flags, UINT *mode_count, DXGI_MODE_DESC *desc)
+        DXGI_FORMAT format, UINT flags, UINT *mode_count, DXGI_MODE_DESC *modes)
 {
     struct dxgi_output *output = impl_from_IDXGIOutput4(iface);
-    enum wined3d_format_id wined3d_format;
-    unsigned int i, max_count;
-    struct wined3d *wined3d;
-
-    FIXME("iface %p, format %s, flags %#x, mode_count %p, desc %p partial stub!\n",
-            iface, debug_dxgi_format(format), flags, mode_count, desc);
-
-    if (!mode_count)
-        return DXGI_ERROR_INVALID_CALL;
-
-    if (format == DXGI_FORMAT_UNKNOWN)
-    {
-        *mode_count = 0;
-        return S_OK;
-    }
 
-    wined3d = output->adapter->factory->wined3d;
-    wined3d_format = wined3dformat_from_dxgi_format(format);
+    FIXME("iface %p, format %s, flags %#x, mode_count %p, modes %p partial stub!\n",
+            iface, debug_dxgi_format(format), flags, mode_count, modes);
 
-    wined3d_mutex_lock();
-    max_count = wined3d_get_adapter_mode_count(wined3d, output->adapter->ordinal,
-            wined3d_format, WINED3D_SCANLINE_ORDERING_UNKNOWN);
-
-    if (!desc)
-    {
-        wined3d_mutex_unlock();
-        *mode_count = max_count;
-        return S_OK;
-    }
-
-    if (max_count > *mode_count)
-    {
-        wined3d_mutex_unlock();
-        return DXGI_ERROR_MORE_DATA;
-    }
-
-    *mode_count = max_count;
-
-    for (i = 0; i < *mode_count; ++i)
-    {
-        struct wined3d_display_mode mode;
-        HRESULT hr;
-
-        hr = wined3d_enum_adapter_modes(wined3d, output->adapter->ordinal, wined3d_format,
-                WINED3D_SCANLINE_ORDERING_UNKNOWN, i, &mode);
-        if (FAILED(hr))
-        {
-            WARN("EnumAdapterModes failed, hr %#x.\n", hr);
-            wined3d_mutex_unlock();
-            return hr;
-        }
-
-        dxgi_mode_from_wined3d(&desc[i], &mode);
-    }
-    wined3d_mutex_unlock();
-
-    return S_OK;
+    return dxgi_output_get_display_mode_list(output,
+            format, mode_count, modes, DXGI_MODE_STRUCT_VERSION_0);
 }
 
 static HRESULT STDMETHODCALLTYPE dxgi_output_FindClosestMatchingMode(IDXGIOutput4 *iface,
@@ -378,10 +406,13 @@ static HRESULT STDMETHODCALLTYPE dxgi_output_GetFrameStatistics(IDXGIOutput4 *if
 static HRESULT STDMETHODCALLTYPE dxgi_output_GetDisplayModeList1(IDXGIOutput4 *iface,
         DXGI_FORMAT format, UINT flags, UINT *mode_count, DXGI_MODE_DESC1 *modes)
 {
-    FIXME("iface %p, format %#x, flags %#x, mode_count %p, modes %p stub!\n",
-            iface, format, flags, mode_count, modes);
+    struct dxgi_output *output = impl_from_IDXGIOutput4(iface);
 
-    return E_NOTIMPL;
+    FIXME("iface %p, format %s, flags %#x, mode_count %p, modes %p partial stub!\n",
+            iface, debug_dxgi_format(format), flags, mode_count, modes);
+
+    return dxgi_output_get_display_mode_list(output,
+            format, mode_count, modes, DXGI_MODE_STRUCT_VERSION_1);
 }
 
 static HRESULT STDMETHODCALLTYPE dxgi_output_FindClosestMatchingMode1(IDXGIOutput4 *iface,
-- 
2.19.2




More information about the wine-devel mailing list