Zhiyi Zhang : dxgi: Support creating a fullscreen swapchain on d3d12.

Alexandre Julliard julliard at winehq.org
Mon Oct 5 15:54:59 CDT 2020


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

Author: Zhiyi Zhang <zzhang at codeweavers.com>
Date:   Mon Oct  5 17:24:06 2020 +0800

dxgi: Support creating a fullscreen swapchain on d3d12.

Signed-off-by: Zhiyi Zhang <zzhang 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  | 27 ++++++++++++++++++++++++---
 dlls/dxgi/tests/dxgi.c |  3 +--
 2 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index c8f1502a13..d778ab9e03 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -2981,11 +2981,34 @@ static HRESULT d3d12_swapchain_init(struct d3d12_swapchain *swapchain, IWineDXGI
 
     hr = wined3d_swapchain_desc_from_dxgi(&wined3d_desc, output, window, swapchain_desc,
             fullscreen_desc);
-    IDXGIOutput_Release(output);
     if (FAILED(hr))
+    {
+        IDXGIOutput_Release(output);
         return hr;
+    }
+
     if (FAILED(hr = wined3d_swapchain_state_create(&wined3d_desc, window, &swapchain->state)))
+    {
+        IDXGIOutput_Release(output);
         return hr;
+    }
+
+    if (!fullscreen_desc->Windowed)
+    {
+        hr = wined3d_swapchain_state_set_fullscreen(swapchain->state, &wined3d_desc, NULL);
+        if (FAILED(hr))
+        {
+            wined3d_swapchain_state_destroy(swapchain->state);
+            IDXGIOutput_Release(output);
+            return hr;
+        }
+
+        swapchain->target = output;
+    }
+    else
+    {
+        IDXGIOutput_Release(output);
+    }
 
     if (swapchain_desc->BufferUsage && swapchain_desc->BufferUsage != DXGI_USAGE_RENDER_TARGET_OUTPUT)
         FIXME("Ignoring buffer usage %#x.\n", swapchain_desc->BufferUsage);
@@ -3002,8 +3025,6 @@ static HRESULT d3d12_swapchain_init(struct d3d12_swapchain *swapchain, IWineDXGI
         FIXME("Unhandled scanline ordering %#x.\n", fullscreen_desc->ScanlineOrdering);
     if (fullscreen_desc->Scaling)
         FIXME("Unhandled mode scaling %#x.\n", fullscreen_desc->Scaling);
-    if (!fullscreen_desc->Windowed)
-        FIXME("Fullscreen not supported yet.\n");
 
     vk_instance = vkd3d_instance_get_vk_instance(vkd3d_instance_from_device(device));
     vk_physical_device = vkd3d_get_vk_physical_device(device);
diff --git a/dlls/dxgi/tests/dxgi.c b/dlls/dxgi/tests/dxgi.c
index e6b5a4e66b..f747e236f3 100644
--- a/dlls/dxgi/tests/dxgi.c
+++ b/dlls/dxgi/tests/dxgi.c
@@ -2953,7 +2953,6 @@ static void test_default_fullscreen_target_output(IUnknown *device, BOOL is_d3d1
             ok(SUCCEEDED(hr), "Adapter %u output %u: GetFullscreenState failed, hr %#x.\n",
                     adapter_idx, output_idx, hr);
             ok(fullscreen, "Adapter %u output %u: Expected fullscreen.\n", adapter_idx, output_idx);
-            todo_wine_if(is_d3d12)
             ok(!!containing_output, "Adapter %u output %u: Expected a valid output.\n", adapter_idx,
                     output_idx);
             if (containing_output)
@@ -2962,7 +2961,7 @@ static void test_default_fullscreen_target_output(IUnknown *device, BOOL is_d3d1
             ret = GetWindowRect(swapchain_desc.OutputWindow, &window_rect);
             ok(ret, "Adapter %u output %u: GetWindowRect failed, error %#x.\n", adapter_idx,
                     output_idx, GetLastError());
-            todo_wine_if(is_d3d12) ok(EqualRect(&window_rect, &output_desc.DesktopCoordinates),
+            ok(EqualRect(&window_rect, &output_desc.DesktopCoordinates),
                     "Adapter %u output %u: Expect window rect %s, got %s.\n", adapter_idx,
                     output_idx, wine_dbgstr_rect(&output_desc.DesktopCoordinates),
                     wine_dbgstr_rect(&window_rect));




More information about the wine-cvs mailing list