[PATCH 1/2] dxgi: Remove wined3d_swapchain dependency from d3d11_swapchain_ResizeTarget().

Conor McCarthy cmccarthy at codeweavers.com
Fri Jun 21 02:03:56 CDT 2019


Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
---
 dlls/dxgi/dxgi_private.h |  2 ++
 dlls/dxgi/output.c       | 61 +++++++++++++++++++++++++++++++++++++++
 dlls/dxgi/swapchain.c    | 62 +++++++++++++++++++++++++++++++++++++---
 3 files changed, 121 insertions(+), 4 deletions(-)

diff --git a/dlls/dxgi/dxgi_private.h b/dlls/dxgi/dxgi_private.h
index 553eace..9cb43b8 100644
--- a/dlls/dxgi/dxgi_private.h
+++ b/dlls/dxgi/dxgi_private.h
@@ -148,6 +148,8 @@ struct dxgi_output
 };
 
 HRESULT dxgi_output_create(struct dxgi_adapter *adapter, struct dxgi_output **output) DECLSPEC_HIDDEN;
+HRESULT dxgi_output_set_display_mode(IDXGIOutput *iface, DXGI_MODE_DESC *target_mode_desc) DECLSPEC_HIDDEN;
+HRESULT dxgi_output_get_display_mode(IDXGIOutput *iface, DXGI_MODE_DESC *mode_desc) DECLSPEC_HIDDEN;
 
 /* IDXGIAdapter */
 struct dxgi_adapter
diff --git a/dlls/dxgi/output.c b/dlls/dxgi/output.c
index 123dee8..0b4d1b6 100644
--- a/dlls/dxgi/output.c
+++ b/dlls/dxgi/output.c
@@ -539,3 +539,64 @@ HRESULT dxgi_output_create(struct dxgi_adapter *adapter, struct dxgi_output **ou
     dxgi_output_init(*output, adapter);
     return S_OK;
 }
+
+HRESULT dxgi_output_set_display_mode(IDXGIOutput *iface, DXGI_MODE_DESC *target_mode_desc)
+{
+    struct wined3d_display_mode wined3d_mode;
+    struct dxgi_output *target;
+    struct dxgi_adapter *adapter;
+    struct wined3d *wined3d;
+    HRESULT hr;
+
+    target = impl_from_IDXGIOutput4((IDXGIOutput4 *)iface);
+    adapter = target->adapter;
+    wined3d = adapter->factory->wined3d;
+
+    wined3d_display_mode_from_dxgi(&wined3d_mode, target_mode_desc);
+
+    if (FAILED(hr = dxgi_output_find_closest_matching_mode(target, &wined3d_mode, NULL)))
+        WARN("Failed to find closest matching mode, hr %#x.\n", hr);
+    else /* Copy the actual mode back to the caller */
+        dxgi_mode_from_wined3d(target_mode_desc, &wined3d_mode);
+
+    wined3d_mutex_lock();
+    hr = wined3d_set_adapter_display_mode(wined3d, adapter->ordinal, &wined3d_mode);
+    wined3d_mutex_unlock();
+
+    if (FAILED(hr))
+    {
+        WARN("Failed to set display mode, hr %#x.\n", hr);
+        return DXGI_ERROR_INVALID_CALL;
+    }
+
+    return S_OK;
+}
+
+HRESULT dxgi_output_get_display_mode(IDXGIOutput *iface, DXGI_MODE_DESC *mode_desc)
+{
+    struct wined3d_display_mode wined3d_mode;
+    struct dxgi_output *target;
+    struct dxgi_adapter *adapter;
+    struct wined3d *wined3d;
+    HRESULT hr;
+
+    target = impl_from_IDXGIOutput4((IDXGIOutput4 *)iface);
+    adapter = target->adapter;
+    wined3d = adapter->factory->wined3d;
+
+    wined3d_mutex_lock();
+    hr = wined3d_get_adapter_display_mode(wined3d, adapter->ordinal, &wined3d_mode, NULL);
+    wined3d_mutex_unlock();
+
+    if (FAILED(hr))
+    {
+        ERR("Failed to get display mode, hr %#x.\n", hr);
+        return hr;
+    }
+
+    dxgi_mode_from_wined3d(mode_desc, &wined3d_mode);
+
+    TRACE("Returning %s.\n", debug_dxgi_mode(mode_desc));
+
+    return S_OK;
+}
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index 4f01d9c..b060a30 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -501,11 +501,65 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeBuffers(IDXGISwapChain1 *
     return hr;
 }
 
+static HRESULT dxgi_resize_target(IDXGISwapChain1 *iface,
+        const DXGI_SWAP_CHAIN_DESC *desc, const DXGI_MODE_DESC *mode)
+{
+    RECT original_window_rect, window_rect;
+    HWND window = desc->OutputWindow;
+    HRESULT hr;
+
+    TRACE("iface %p, desc %p, mode %p.\n", iface, desc, mode);
+
+    if (desc->Windowed)
+    {
+        SetRect(&window_rect, 0, 0, mode->Width, mode->Height);
+        AdjustWindowRectEx(&window_rect,
+                GetWindowLongW(window, GWL_STYLE), FALSE,
+                GetWindowLongW(window, GWL_EXSTYLE));
+        SetRect(&window_rect, 0, 0,
+                window_rect.right - window_rect.left, window_rect.bottom - window_rect.top);
+        GetWindowRect(window, &original_window_rect);
+        OffsetRect(&window_rect, original_window_rect.left, original_window_rect.top);
+    }
+    else
+    {
+        DXGI_MODE_DESC actual_mode;
+        IDXGIOutput *target;
+
+        if (FAILED(hr = IDXGISwapChain1_GetContainingOutput(iface, &target)))
+        {
+            WARN("Failed to get output, hr %#x.\n", hr);
+            return hr;
+        }
+
+        if (desc->Flags & DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH)
+        {
+            actual_mode = *mode;
+            hr = dxgi_output_set_display_mode(target, &actual_mode);
+        }
+        else
+        {
+            hr = dxgi_output_get_display_mode(target, &actual_mode);
+        }
+
+        IDXGIOutput_Release(target);
+
+        if(FAILED(hr))
+            return hr;
+
+        SetRect(&window_rect, 0, 0, actual_mode.Width, actual_mode.Height);
+    }
+
+    MoveWindow(window, window_rect.left, window_rect.top,
+            window_rect.right - window_rect.left, window_rect.bottom - window_rect.top, TRUE);
+
+    return S_OK;
+}
+
 static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeTarget(IDXGISwapChain1 *iface,
         const DXGI_MODE_DESC *target_mode_desc)
 {
-    struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain1(iface);
-    struct wined3d_display_mode mode;
+    struct DXGI_SWAP_CHAIN_DESC swap_chain_desc;
 
     TRACE("iface %p, target_mode_desc %p.\n", iface, target_mode_desc);
 
@@ -520,9 +574,9 @@ static HRESULT STDMETHODCALLTYPE d3d11_swapchain_ResizeTarget(IDXGISwapChain1 *i
     if (target_mode_desc->Scaling)
         FIXME("Ignoring scaling %#x.\n", target_mode_desc->Scaling);
 
-    wined3d_display_mode_from_dxgi(&mode, target_mode_desc);
+    d3d11_swapchain_GetDesc(iface, &swap_chain_desc);
 
-    return wined3d_swapchain_resize_target(swapchain->wined3d_swapchain, &mode);
+    return dxgi_resize_target(iface, &swap_chain_desc, target_mode_desc);
 }
 
 static HRESULT STDMETHODCALLTYPE d3d11_swapchain_GetContainingOutput(IDXGISwapChain1 *iface, IDXGIOutput **output)
-- 
2.21.0




More information about the wine-devel mailing list