From c25483e856fddd3599c08804991242fcbcb9b7d7 Mon Sep 17 00:00:00 2001
From: Philip Rebohle <philip.rebohle@tu-dortmund.de>
Date: Mon, 12 Nov 2018 12:51:43 +0100
Subject: [PATCH] [dxgi] Implement IDXGISwapChain3

- Stub IDXGISwapChain3::ResizeBuffers1
---
 src/dxgi/dxgi_swapchain.cpp | 42 ++++++++++++++++++++++++++++++++++++-
 src/dxgi/dxgi_swapchain.h   | 20 +++++++++++++++++-
 2 files changed, 60 insertions(+), 2 deletions(-)

diff --git a/src/dxgi/dxgi_swapchain.cpp b/src/dxgi/dxgi_swapchain.cpp
index 8bcdc8b5..f1e9902c 100644
--- a/src/dxgi/dxgi_swapchain.cpp
+++ b/src/dxgi/dxgi_swapchain.cpp
@@ -59,7 +59,8 @@ namespace dxvk {
      || riid == __uuidof(IDXGIDeviceSubObject)
      || riid == __uuidof(IDXGISwapChain)
      || riid == __uuidof(IDXGISwapChain1)
-     || riid == __uuidof(IDXGISwapChain2)) {
+     || riid == __uuidof(IDXGISwapChain2)
+     || riid == __uuidof(IDXGISwapChain3)) {
       *ppvObject = ref(this);
       return S_OK;
     }
@@ -83,6 +84,11 @@ namespace dxvk {
   HRESULT STDMETHODCALLTYPE DxgiSwapChain::GetBuffer(UINT Buffer, REFIID riid, void** ppSurface) {
     return m_presenter->GetImage(Buffer, riid, ppSurface);
   }
+
+
+  UINT STDMETHODCALLTYPE DxgiSwapChain::GetCurrentBackBufferIndex() {
+    return m_presenter->GetImageIndex();
+  }
   
   
   HRESULT STDMETHODCALLTYPE DxgiSwapChain::GetContainingOutput(IDXGIOutput** ppOutput) {
@@ -302,6 +308,24 @@ namespace dxvk {
   }
   
   
+  HRESULT STDMETHODCALLTYPE DxgiSwapChain::ResizeBuffers1(
+          UINT                      BufferCount,
+          UINT                      Width,
+          UINT                      Height,
+          DXGI_FORMAT               Format,
+          UINT                      SwapChainFlags,
+    const UINT*                     pCreationNodeMask,
+          IUnknown* const*          ppPresentQueue) {
+    static bool s_errorShown = false;
+
+    if (!std::exchange(s_errorShown, true))
+      Logger::warn("DxgiSwapChain::ResizeBuffers1: Stub");
+
+    return ResizeBuffers(BufferCount,
+      Width, Height, Format, SwapChainFlags);
+  }
+
+
   HRESULT STDMETHODCALLTYPE DxgiSwapChain::ResizeTarget(const DXGI_MODE_DESC* pNewTargetParameters) {
     std::lock_guard<std::mutex> lock(m_lockWindow);
 
@@ -448,6 +472,22 @@ namespace dxvk {
   }
   
 
+  HRESULT STDMETHODCALLTYPE DxgiSwapChain::CheckColorSpaceSupport(
+    DXGI_COLOR_SPACE_TYPE           ColorSpace,
+    UINT*                           pColorSpaceSupport) {
+    Logger::err("DxgiSwapChain::CheckColorSpaceSupport: Not implemented");
+
+    *pColorSpaceSupport = 0;
+    return E_NOTIMPL;
+  }
+
+
+  HRESULT DxgiSwapChain::SetColorSpace1(DXGI_COLOR_SPACE_TYPE ColorSpace) {
+    Logger::err("DxgiSwapChain::SetColorSpace1: Not implemented");
+    return E_NOTIMPL;
+  }
+
+
   HRESULT DxgiSwapChain::SetGammaControl(const DXGI_GAMMA_CONTROL* pGammaControl) {
     return m_presenter->SetGammaControl(DXGI_VK_GAMMA_CP_COUNT, pGammaControl->GammaCurve);
   }
diff --git a/src/dxgi/dxgi_swapchain.h b/src/dxgi/dxgi_swapchain.h
index ffd1218e..02c53725 100644
--- a/src/dxgi/dxgi_swapchain.h
+++ b/src/dxgi/dxgi_swapchain.h
@@ -19,7 +19,7 @@ namespace dxvk {
   class DxgiFactory;
   class DxgiOutput;
   
-  class DxgiSwapChain : public DxgiObject<IDXGISwapChain2> {
+  class DxgiSwapChain : public DxgiObject<IDXGISwapChain3> {
     
   public:
     
@@ -49,6 +49,8 @@ namespace dxvk {
             REFIID                    riid,
             void**                    ppSurface) final;
     
+    UINT STDMETHODCALLTYPE GetCurrentBackBufferIndex() final;
+
     HRESULT STDMETHODCALLTYPE GetContainingOutput(
             IDXGIOutput**             ppOutput) final;
     
@@ -105,6 +107,15 @@ namespace dxvk {
             DXGI_FORMAT               NewFormat,
             UINT                      SwapChainFlags) final;
     
+    HRESULT STDMETHODCALLTYPE ResizeBuffers1(
+            UINT                      BufferCount,
+            UINT                      Width,
+            UINT                      Height,
+            DXGI_FORMAT               Format,
+            UINT                      SwapChainFlags,
+      const UINT*                     pCreationNodeMask,
+            IUnknown* const*          ppPresentQueue) final;
+
     HRESULT STDMETHODCALLTYPE ResizeTarget(
       const DXGI_MODE_DESC*           pNewTargetParameters) final;
     
@@ -139,6 +150,13 @@ namespace dxvk {
     HRESULT STDMETHODCALLTYPE SetSourceSize(
             UINT                      Width,
             UINT                      Height) final;
+    
+    HRESULT STDMETHODCALLTYPE CheckColorSpaceSupport(
+            DXGI_COLOR_SPACE_TYPE     ColorSpace,
+            UINT*                     pColorSpaceSupport) final;
+
+    HRESULT STDMETHODCALLTYPE SetColorSpace1(
+            DXGI_COLOR_SPACE_TYPE     ColorSpace) final;
 
     HRESULT SetGammaControl(
       const DXGI_GAMMA_CONTROL*       pGammaControl);