[PATCH 5/5] wined3d: Get output from swapchain state.

Zhiyi Zhang zzhang at codeweavers.com
Tue May 12 07:50:12 CDT 2020


Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
 dlls/dxgi/swapchain.c     |  5 +---
 dlls/wined3d/swapchain.c  | 62 ++++++---------------------------------
 dlls/wined3d/wined3d.spec |  2 +-
 include/wine/wined3d.h    |  2 +-
 4 files changed, 12 insertions(+), 59 deletions(-)

diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index 5351c69cdd0..e16eb86a701 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -2924,7 +2924,6 @@ static HRESULT d3d12_swapchain_init(struct d3d12_swapchain *swapchain, IWineDXGI
     struct wined3d_swapchain_desc wined3d_desc;
     VkWin32SurfaceCreateInfoKHR surface_desc;
     VkPhysicalDevice vk_physical_device;
-    struct dxgi_adapter *dxgi_adapter;
     VkFenceCreateInfo fence_desc;
     uint32_t queue_family_index;
     VkSurfaceKHR vk_surface;
@@ -2973,7 +2972,6 @@ static HRESULT d3d12_swapchain_init(struct d3d12_swapchain *swapchain, IWineDXGI
     device_parent = vkd3d_get_device_parent(device);
     if (FAILED(hr = IUnknown_QueryInterface(device_parent, &IID_IDXGIAdapter, (void **)&adapter)))
         return hr;
-    dxgi_adapter = unsafe_impl_from_IDXGIAdapter(adapter);
 
     if (FAILED(hr = dxgi_get_output_from_window((IDXGIFactory *)factory, window, &output)))
     {
@@ -2998,8 +2996,7 @@ static HRESULT d3d12_swapchain_init(struct d3d12_swapchain *swapchain, IWineDXGI
     IDXGIOutput_Release(output);
     if (FAILED(hr))
         return hr;
-    if (FAILED(hr = wined3d_swapchain_state_create(&wined3d_desc, window,
-            dxgi_adapter->factory->wined3d, &swapchain->state)))
+    if (FAILED(hr = wined3d_swapchain_state_create(&wined3d_desc, window, &swapchain->state)))
         return hr;
 
     if (swapchain_desc->BufferUsage && swapchain_desc->BufferUsage != DXGI_USAGE_RENDER_TARGET_OUTPUT)
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 3e303789f6e..dbbfc8e72cd 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -259,49 +259,11 @@ struct wined3d_texture * CDECL wined3d_swapchain_get_back_buffer(const struct wi
     return swapchain->back_buffers[back_buffer_idx];
 }
 
-static struct wined3d_output * get_output_from_window(const struct wined3d *wined3d, HWND hwnd)
-{
-    unsigned int adapter_idx, output_idx;
-    struct wined3d_adapter *adapter;
-    MONITORINFOEXW monitor_info;
-    HMONITOR monitor;
-
-    TRACE("wined3d %p, hwnd %p.\n", wined3d, hwnd);
-
-    monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTOPRIMARY);
-    monitor_info.cbSize = sizeof(monitor_info);
-    if (!GetMonitorInfoW(monitor, (MONITORINFO *)&monitor_info))
-    {
-        ERR("Failed to get monitor information.\n");
-        return NULL;
-    }
-
-    for (adapter_idx = 0; adapter_idx < wined3d->adapter_count; ++adapter_idx)
-    {
-        adapter = wined3d->adapters[adapter_idx];
-        for (output_idx = 0; output_idx < adapter->output_count; ++output_idx)
-        {
-            if (!lstrcmpiW(adapter->outputs[output_idx].device_name, monitor_info.szDevice))
-                return &adapter->outputs[output_idx];
-        }
-    }
-
-    /* Because wined3d only supports one output right now. A window can be on non-primary outputs
-     * and thus fails to get its correct output. In this case, return the primary output for now */
-    return &wined3d->adapters[0]->outputs[0];
-}
-
 struct wined3d_output * wined3d_swapchain_get_output(const struct wined3d_swapchain *swapchain)
 {
-    HWND hwnd;
-
     TRACE("swapchain %p.\n", swapchain);
 
-    hwnd = swapchain->state.device_window;
-    if (!hwnd)
-        hwnd = swapchain->win_handle;
-
-    return get_output_from_window(swapchain->device->wined3d, hwnd);
+    return swapchain->state.desc.output;
 }
 
 HRESULT CDECL wined3d_swapchain_get_raster_status(const struct wined3d_swapchain *swapchain,
@@ -825,20 +787,13 @@ static enum wined3d_format_id adapter_format_from_backbuffer_format(const struct
 }
 
 static HRESULT wined3d_swapchain_state_init(struct wined3d_swapchain_state *state,
-        const struct wined3d_swapchain_desc *desc, HWND window, struct wined3d *wined3d)
+        const struct wined3d_swapchain_desc *desc, HWND window)
 {
-    struct wined3d_output *output;
     HRESULT hr;
 
     state->desc = *desc;
 
-    if (!(output = get_output_from_window(wined3d, window)))
-    {
-        WARN("Failed to get output from window %p.\n", window);
-        return E_FAIL;
-    }
-
-    if (FAILED(hr = wined3d_output_get_display_mode(output, &state->original_mode, NULL)))
+    if (FAILED(hr = wined3d_output_get_display_mode(desc->output, &state->original_mode, NULL)))
     {
         ERR("Failed to get current display mode, hr %#x.\n", hr);
         return hr;
@@ -850,7 +805,7 @@ static HRESULT wined3d_swapchain_state_init(struct wined3d_swapchain_state *stat
         {
             state->d3d_mode.width = desc->backbuffer_width;
             state->d3d_mode.height = desc->backbuffer_height;
-            state->d3d_mode.format_id = adapter_format_from_backbuffer_format(output->adapter,
+            state->d3d_mode.format_id = adapter_format_from_backbuffer_format(desc->output->adapter,
                     desc->backbuffer_format);
             state->d3d_mode.refresh_rate = desc->refresh_rate;
             state->d3d_mode.scanline_ordering = WINED3D_SCANLINE_ORDERING_UNKNOWN;
@@ -894,7 +849,7 @@ static HRESULT wined3d_swapchain_init(struct wined3d_swapchain *swapchain, struc
         FIXME("Unimplemented swap effect %#x.\n", desc->swap_effect);
 
     window = desc->device_window ? desc->device_window : device->create_parms.focus_window;
-    if (FAILED(hr = wined3d_swapchain_state_init(&swapchain->state, desc, window, device->wined3d)))
+    if (FAILED(hr = wined3d_swapchain_state_init(&swapchain->state, desc, window)))
     {
         ERR("Failed to initialise swapchain state, hr %#x.\n", hr);
         goto err;
@@ -1739,6 +1694,7 @@ HRESULT CDECL wined3d_swapchain_state_set_fullscreen(struct wined3d_swapchain_st
         wined3d_swapchain_state_restore_from_fullscreen(state, state->device_window, window_rect);
     }
 
+    state->desc.output = output;
     state->desc.windowed = swapchain_desc->windowed;
 
     return WINED3D_OK;
@@ -1750,17 +1706,17 @@ void CDECL wined3d_swapchain_state_destroy(struct wined3d_swapchain_state *state
 }
 
 HRESULT CDECL wined3d_swapchain_state_create(const struct wined3d_swapchain_desc *desc,
-        HWND window, struct wined3d *wined3d, struct wined3d_swapchain_state **state)
+        HWND window, struct wined3d_swapchain_state **state)
 {
     struct wined3d_swapchain_state *s;
     HRESULT hr;
 
-    TRACE("desc %p, window %p, wined3d %p, state %p.\n", desc, window, wined3d, state);
+    TRACE("desc %p, window %p, state %p.\n", desc, window, state);
 
     if (!(s = heap_alloc_zero(sizeof(*s))))
         return E_OUTOFMEMORY;
 
-    if (FAILED(hr = wined3d_swapchain_state_init(s, desc, window, wined3d)))
+    if (FAILED(hr = wined3d_swapchain_state_init(s, desc, window)))
     {
         heap_free(s);
         return hr;
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index 22a9a9dd740..a240aba555a 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -281,7 +281,7 @@
 @ cdecl wined3d_swapchain_set_palette(ptr ptr)
 @ cdecl wined3d_swapchain_set_window(ptr ptr)
 
-@ cdecl wined3d_swapchain_state_create(ptr ptr ptr ptr)
+@ cdecl wined3d_swapchain_state_create(ptr ptr ptr)
 @ cdecl wined3d_swapchain_state_destroy(ptr)
 @ cdecl wined3d_swapchain_state_resize_target(ptr ptr ptr)
 @ cdecl wined3d_swapchain_state_set_fullscreen(ptr ptr ptr ptr)
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index cfec8f10c8c..381a823cfbf 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2769,7 +2769,7 @@ void __cdecl wined3d_swapchain_set_palette(struct wined3d_swapchain *swapchain,
 void __cdecl wined3d_swapchain_set_window(struct wined3d_swapchain *swapchain, HWND window);
 
 HRESULT __cdecl wined3d_swapchain_state_create(const struct wined3d_swapchain_desc *desc,
-        HWND window, struct wined3d *wined3d, struct wined3d_swapchain_state **state);
+        HWND window, struct wined3d_swapchain_state **state);
 void __cdecl wined3d_swapchain_state_destroy(struct wined3d_swapchain_state *state);
 HRESULT __cdecl wined3d_swapchain_state_resize_target(struct wined3d_swapchain_state *state,
         struct wined3d_output *output, const struct wined3d_display_mode *mode);
-- 
2.25.1



More information about the wine-devel mailing list