=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: dxgi: Improve d3d11_swapchain_GetContainingOutput() implementation.

Alexandre Julliard julliard at winehq.org
Mon Mar 11 16:29:54 CDT 2019


Module: wine
Branch: master
Commit: 5a676c2ff5b8dd9d47f03fd5a058f3b6579a3dc3
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=5a676c2ff5b8dd9d47f03fd5a058f3b6579a3dc3

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Mon Mar 11 11:28:56 2019 +0100

dxgi: Improve d3d11_swapchain_GetContainingOutput() implementation.

Use MonitorFromWindow() to find the containing IDXGIOutput. This matches
our DXGI tests.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dxgi/swapchain.c | 68 +++++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 55 insertions(+), 13 deletions(-)

diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index 849b94a..5e66a5f 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -110,6 +110,46 @@ BOOL dxgi_validate_swapchain_desc(const DXGI_SWAP_CHAIN_DESC1 *desc)
     return TRUE;
 }
 
+static HRESULT dxgi_get_output_from_window(IDXGIAdapter *adapter, HWND window, IDXGIOutput **dxgi_output)
+{
+    DXGI_OUTPUT_DESC desc;
+    IDXGIOutput *output;
+    unsigned int index;
+    HMONITOR monitor;
+    HRESULT hr;
+
+    if (!(monitor = MonitorFromWindow(window, MONITOR_DEFAULTTONEAREST)))
+    {
+        WARN("Failed to get monitor from window.\n");
+        return DXGI_ERROR_INVALID_CALL;
+    }
+
+    index = 0;
+    while ((hr = IDXGIAdapter_EnumOutputs(adapter, index, &output)) == S_OK)
+    {
+        if (FAILED(hr = IDXGIOutput_GetDesc(output, &desc)))
+        {
+            WARN("Failed to get output desc %u, hr %#x.\n", index, hr);
+            ++index;
+            continue;
+        }
+
+        if (desc.Monitor == monitor)
+        {
+            *dxgi_output = output;
+            return S_OK;
+        }
+
+        IDXGIOutput_Release(output);
+        ++index;
+    }
+    if (hr != DXGI_ERROR_NOT_FOUND)
+        WARN("Failed to enumerate outputs, hr %#x.\n", hr);
+
+    WARN("Output could not be found.\n");
+    return DXGI_ERROR_NOT_FOUND;
+}
+
 static inline struct d3d11_swapchain *d3d11_swapchain_from_IDXGISwapChain1(IDXGISwapChain1 *iface)
 {
     return CONTAINING_RECORD(iface, struct d3d11_swapchain, IDXGISwapChain1_iface);
@@ -450,6 +490,7 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeTarget(IDXGISwapChain1 *i
 static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetContainingOutput(IDXGISwapChain1 *iface, IDXGIOutput **output)
 {
     struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface);
+    struct wined3d_swapchain_desc swapchain_desc;
     IDXGIAdapter *adapter;
     IDXGIDevice *device;
     HRESULT hr;
@@ -462,25 +503,26 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetContainingOutput(IDXGISwapCh
         return S_OK;
     }
 
-    if (FAILED(hr = d3d11_swapchain_GetDevice(iface, &IID_IDXGIDevice, (void **)&device)))
-        return hr;
-
-    hr = IDXGIDevice_GetAdapter(device, &adapter);
-    IDXGIDevice_Release(device);
-    if (FAILED(hr))
+    if (SUCCEEDED(hr = d3d11_swapchain_GetDevice(iface, &IID_IDXGIDevice, (void **)&device)))
     {
-        WARN("GetAdapter failed, hr %#x.\n", hr);
-        return hr;
+        hr = IDXGIDevice_GetAdapter(device, &adapter);
+        IDXGIDevice_Release(device);
     }
 
-    if (SUCCEEDED(IDXGIAdapter_EnumOutputs(adapter, 1, output)))
+    if (SUCCEEDED(hr))
+    {
+        wined3d_mutex_lock();
+        wined3d_swapchain_get_desc(swapchain->wined3d_swapchain, &swapchain_desc);
+        wined3d_mutex_unlock();
+
+        hr = dxgi_get_output_from_window(adapter, swapchain_desc.device_window, output);
+        IDXGIAdapter_Release(adapter);
+    }
+    else
     {
-        FIXME("Adapter has got multiple outputs, returning the first one.\n");
-        IDXGIOutput_Release(*output);
+        WARN("Failed to get adapter, hr %#x.\n", hr);
     }
 
-    hr = IDXGIAdapter_EnumOutputs(adapter, 0, output);
-    IDXGIAdapter_Release(adapter);
     return hr;
 }
 




More information about the wine-cvs mailing list