From a1fd1d425c27cb06e6a379f113687c53691417c2 Mon Sep 17 00:00:00 2001
From: twinaphex <libretro@gmail.com>
Date: Tue, 15 Dec 2020 08:19:04 +0100
Subject: [PATCH] (D3D11) Split init swapchain code up into own function

---
 gfx/drivers/d3d11.c | 204 +++++++++++++++++++++++---------------------
 1 file changed, 105 insertions(+), 99 deletions(-)

diff --git a/gfx/drivers/d3d11.c b/gfx/drivers/d3d11.c
index 78512d0914..fbc5771018 100644
--- a/gfx/drivers/d3d11.c
+++ b/gfx/drivers/d3d11.c
@@ -622,6 +622,109 @@ static void d3d11_gfx_free(void* data)
    free(d3d11);
 }
 
+static bool d3d11_gfx_init_swapchain(d3d11_video_t* d3d11)
+{
+   IDXGIDevice* dxgiDevice                 = NULL;
+   IDXGIAdapter* adapter                   = NULL;
+   UINT                 flags              = 0;
+   D3D_FEATURE_LEVEL
+      requested_feature_levels[]           =
+      {
+         D3D_FEATURE_LEVEL_11_0,
+         D3D_FEATURE_LEVEL_10_1,
+         D3D_FEATURE_LEVEL_10_0
+      };
+#ifdef __WINRT__
+   /* UWP requires the use of newer version of the factory which requires newer version of this struct */
+   DXGI_SWAP_CHAIN_DESC1 desc              = {{0}};
+#else
+   DXGI_SWAP_CHAIN_DESC desc               = {{0}};
+#endif
+   UINT number_feature_levels              = ARRAY_SIZE(requested_feature_levels);
+
+#ifdef __WINRT__
+   /* UWP forces us to do double-buffering */
+   desc.BufferCount = 2;
+   desc.Width                              = d3d11->vp.full_width;
+   desc.Height                             = d3d11->vp.full_height;
+   desc.Format                             = DXGI_FORMAT_R8G8B8A8_UNORM;
+#else
+   desc.BufferCount = 1;
+   desc.BufferDesc.Width                   = d3d11->vp.full_width;
+   desc.BufferDesc.Height                  = d3d11->vp.full_height;
+   desc.BufferDesc.Format                  = DXGI_FORMAT_R8G8B8A8_UNORM;
+   desc.BufferDesc.RefreshRate.Numerator   = 60;
+   desc.BufferDesc.RefreshRate.Denominator = 1;
+#endif
+   desc.BufferUsage                        = DXGI_USAGE_RENDER_TARGET_OUTPUT;
+#ifdef HAVE_WINDOW
+   desc.OutputWindow                       = main_window.hwnd;
+#endif
+   desc.SampleDesc.Count                   = 1;
+   desc.SampleDesc.Quality                 = 0;
+#if 0
+   desc.Scaling                            = DXGI_SCALING_STRETCH;
+#endif
+#ifdef HAVE_WINDOW
+   desc.Windowed                           = TRUE;
+#endif
+#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP)
+   /* On phone, no swap effects are supported. */
+   desc.SwapEffect                         = DXGI_SWAP_EFFECT_DISCARD;
+#elif defined(__WINRT__)
+   desc.SwapEffect                         = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
+#else
+   desc.SwapEffect                         = DXGI_SWAP_EFFECT_SEQUENTIAL;
+#endif
+
+#ifdef DEBUG
+   flags                                  |= D3D11_CREATE_DEVICE_DEBUG;
+#endif
+
+   if(cached_device_d3d11 && cached_context)
+   {
+      d3d11->device                = cached_device_d3d11;
+      d3d11->context               = cached_context;
+      d3d11->supportedFeatureLevel = cached_supportedFeatureLevel;
+   }
+   else
+   {
+      if (FAILED(D3D11CreateDevice(
+                  (IDXGIAdapter*)d3d11->adapter, D3D_DRIVER_TYPE_HARDWARE, NULL, flags,
+                  requested_feature_levels, number_feature_levels,
+                  D3D11_SDK_VERSION, &d3d11->device,
+                  &d3d11->supportedFeatureLevel, &d3d11->context)))
+         return false;
+   }
+
+   d3d11->device->lpVtbl->QueryInterface(
+         d3d11->device, uuidof(IDXGIDevice), (void**)&dxgiDevice);
+   dxgiDevice->lpVtbl->GetAdapter(dxgiDevice, &adapter);
+#ifdef __WINRT__
+   IDXGIFactory2* dxgiFactory = NULL;
+   adapter->lpVtbl->GetParent(
+         adapter, uuidof(IDXGIFactory2), (void**)&dxgiFactory);
+   if (FAILED(dxgiFactory->lpVtbl->CreateSwapChainForCoreWindow(
+               dxgiFactory, (IUnknown*)d3d11->device, uwp_get_corewindow(),
+               &desc, NULL, (IDXGISwapChain1**)&d3d11->swapChain)))
+      return false;
+#else
+   IDXGIFactory* dxgiFactory = NULL;
+   adapter->lpVtbl->GetParent(
+         adapter, uuidof(IDXGIFactory1), (void**)&dxgiFactory);
+   if (FAILED(dxgiFactory->lpVtbl->CreateSwapChain(
+               dxgiFactory, (IUnknown*)d3d11->device,
+               &desc, (IDXGISwapChain**)&d3d11->swapChain)))
+      return false;
+#endif
+
+   dxgiFactory->lpVtbl->Release(dxgiFactory);
+   adapter->lpVtbl->Release(adapter);
+   dxgiDevice->lpVtbl->Release(dxgiDevice);
+
+   return true;
+}
+
 static void *d3d11_gfx_init(const video_info_t* video,
       input_driver_t** input, void** input_data)
 {
@@ -672,105 +775,8 @@ static void *d3d11_gfx_init(const video_info_t* video,
 
    d3d_input_driver(settings->arrays.input_driver, settings->arrays.input_joypad_driver, input, input_data);
 
-   {
-      UINT                 flags              = 0;
-      D3D_FEATURE_LEVEL
-         requested_feature_levels[]           =
-         {
-            D3D_FEATURE_LEVEL_11_0,
-            D3D_FEATURE_LEVEL_10_1,
-            D3D_FEATURE_LEVEL_10_0
-         };
-#ifdef __WINRT__
-      /* UWP requires the use of newer version of the factory which requires newer version of this struct */
-      DXGI_SWAP_CHAIN_DESC1 desc              = {{0}};
-#else
-      DXGI_SWAP_CHAIN_DESC desc               = {{0}};
-#endif
-      UINT number_feature_levels              = ARRAY_SIZE(requested_feature_levels);
-
-#ifdef __WINRT__
-      /* UWP forces us to do double-buffering */
-      desc.BufferCount = 2;
-      desc.Width                              = d3d11->vp.full_width;
-      desc.Height                             = d3d11->vp.full_height;
-      desc.Format                             = DXGI_FORMAT_R8G8B8A8_UNORM;
-#else
-      desc.BufferCount = 1;
-      desc.BufferDesc.Width                   = d3d11->vp.full_width;
-      desc.BufferDesc.Height                  = d3d11->vp.full_height;
-      desc.BufferDesc.Format                  = DXGI_FORMAT_R8G8B8A8_UNORM;
-      desc.BufferDesc.RefreshRate.Numerator   = 60;
-      desc.BufferDesc.RefreshRate.Denominator = 1;
-#endif
-      desc.BufferUsage                        = DXGI_USAGE_RENDER_TARGET_OUTPUT;
-#ifdef HAVE_WINDOW
-      desc.OutputWindow                       = main_window.hwnd;
-#endif
-      desc.SampleDesc.Count                   = 1;
-      desc.SampleDesc.Quality                 = 0;
-#if 0
-      desc.Scaling                            = DXGI_SCALING_STRETCH;
-#endif
-#ifdef HAVE_WINDOW
-      desc.Windowed                           = TRUE;
-#endif
-#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP)
-      /* On phone, no swap effects are supported. */
-      desc.SwapEffect                         = DXGI_SWAP_EFFECT_DISCARD;
-#elif defined(__WINRT__)
-      desc.SwapEffect                         = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
-#else
-      desc.SwapEffect                         = DXGI_SWAP_EFFECT_SEQUENTIAL;
-#endif
-
-#ifdef DEBUG
-      flags                                  |= D3D11_CREATE_DEVICE_DEBUG;
-#endif
-      if(cached_device_d3d11 && cached_context)
-      {
-         d3d11->device                = cached_device_d3d11;
-         d3d11->context               = cached_context;
-         d3d11->supportedFeatureLevel = cached_supportedFeatureLevel;
-      }
-      else
-      {
-         if (FAILED(D3D11CreateDevice(
-                     (IDXGIAdapter*)d3d11->adapter, D3D_DRIVER_TYPE_HARDWARE, NULL, flags,
-                     requested_feature_levels, number_feature_levels,
-                     D3D11_SDK_VERSION, &d3d11->device,
-                     &d3d11->supportedFeatureLevel, &d3d11->context)))
-            goto error;
-      }
-
-      IDXGIDevice* dxgiDevice      = NULL;
-      IDXGIAdapter* adapter        = NULL;
-
-      d3d11->device->lpVtbl->QueryInterface(
-            d3d11->device, uuidof(IDXGIDevice), (void**)&dxgiDevice);
-      dxgiDevice->lpVtbl->GetAdapter(dxgiDevice, &adapter);
-#ifndef __WINRT__
-      IDXGIFactory* dxgiFactory = NULL;
-      adapter->lpVtbl->GetParent(
-         adapter, uuidof(IDXGIFactory1), (void**)&dxgiFactory);
-      if (FAILED(dxgiFactory->lpVtbl->CreateSwapChain(
-             dxgiFactory, (IUnknown*)d3d11->device,
-             &desc, (IDXGISwapChain**)&d3d11->swapChain)))
-         goto error;
-#else
-      IDXGIFactory2* dxgiFactory = NULL;
-      adapter->lpVtbl->GetParent(
-         adapter, uuidof(IDXGIFactory2), (void**)&dxgiFactory);
-      if (FAILED(dxgiFactory->lpVtbl->CreateSwapChainForCoreWindow(
-             dxgiFactory, (IUnknown*)d3d11->device, uwp_get_corewindow(),
-             &desc, NULL, (IDXGISwapChain1**)&d3d11->swapChain)))
-         goto error;
-#endif
-
-      dxgiFactory->lpVtbl->Release(dxgiFactory);
-      adapter->lpVtbl->Release(adapter);
-      dxgiDevice->lpVtbl->Release(dxgiDevice);
-   }
+   if (!d3d11_gfx_init_swapchain(d3d11))
+      goto error;
 
    {
       D3D11Texture2D backBuffer;