[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