diff --git a/src/d3d8/d3d8_swapchain.cpp b/src/d3d8/d3d8_swapchain.cpp
new file mode 100644
index 000000000..95ebaf47a
--- /dev/null
+++ b/src/d3d8/d3d8_swapchain.cpp
@@ -0,0 +1,41 @@
+#include "d3d8_swapchain.h"
+
+namespace dxvk {
+
+  D3D8SwapChain::D3D8SwapChain(
+          D3D8Device*                      pDevice,
+          D3DPRESENT_PARAMETERS*           pPresentationParameters,
+          Com<d3d9::IDirect3DSwapChain9>&& pSwapChain)
+    : D3D8SwapChainBase(pDevice, std::move(pSwapChain)) {
+    m_backBuffers.resize(pPresentationParameters->BackBufferCount);
+  }
+
+  HRESULT STDMETHODCALLTYPE D3D8SwapChain::Present(const RECT *src, const RECT *dst, HWND hWnd, const RGNDATA *dirtyRegion) {
+    return GetD3D9()->Present(src, dst, hWnd, dirtyRegion, 0);
+  }
+
+  HRESULT STDMETHODCALLTYPE D3D8SwapChain::GetBackBuffer(
+      UINT                BackBuffer,
+      D3DBACKBUFFER_TYPE  Type,
+      IDirect3DSurface8** ppBackBuffer) {
+    if (unlikely(ppBackBuffer == nullptr))
+      return D3DERR_INVALIDCALL;
+
+    // Same logic as in D3D8Device::GetBackBuffer
+    if (BackBuffer >= m_backBuffers.size() || m_backBuffers[BackBuffer] == nullptr) {
+      Com<d3d9::IDirect3DSurface9> pSurface9;
+      HRESULT res = GetD3D9()->GetBackBuffer(BackBuffer, (d3d9::D3DBACKBUFFER_TYPE)Type, &pSurface9);
+
+      if (likely(SUCCEEDED(res))) {
+        m_backBuffers[BackBuffer] = new D3D8Surface(GetParent(), std::move(pSurface9));
+        *ppBackBuffer = m_backBuffers[BackBuffer].ref();
+      }
+
+      return res;
+    }
+
+    *ppBackBuffer = m_backBuffers[BackBuffer].ref();
+    return D3D_OK;
+  }
+
+}
\ No newline at end of file
diff --git a/src/d3d8/d3d8_swapchain.h b/src/d3d8/d3d8_swapchain.h
index ef2b41f64..b13f6d36a 100644
--- a/src/d3d8/d3d8_swapchain.h
+++ b/src/d3d8/d3d8_swapchain.h
@@ -2,7 +2,6 @@
 
 #include "d3d8_device_child.h"
 #include "d3d8_surface.h"
-#include "d3d8_d3d9_util.h"
 
 namespace dxvk {
   
@@ -12,39 +11,19 @@ namespace dxvk {
   public:
 
     D3D8SwapChain(
-      D3D8Device*                      pDevice,
-      D3DPRESENT_PARAMETERS*           pPresentationParameters,
-      Com<d3d9::IDirect3DSwapChain9>&& pSwapChain)
-      : D3D8SwapChainBase(pDevice, std::move(pSwapChain)) {
-        m_backBuffers.resize(pPresentationParameters->BackBufferCount);
-    }
+            D3D8Device*                      pDevice,
+            D3DPRESENT_PARAMETERS*           pPresentationParameters,
+            Com<d3d9::IDirect3DSwapChain9>&& pSwapChain);
 
-    HRESULT STDMETHODCALLTYPE Present(const RECT *src, const RECT *dst, HWND hWnd, const RGNDATA *dirtyRegion) final {
-        return GetD3D9()->Present(src, dst, hWnd, dirtyRegion, 0);
-    }
-    
-    HRESULT STDMETHODCALLTYPE GetBackBuffer(UINT BackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface8** ppBackBuffer) final {
-      if (unlikely(ppBackBuffer == nullptr))
-        return D3DERR_INVALIDCALL;
+    HRESULT STDMETHODCALLTYPE Present(const RECT *src, const RECT *dst, HWND hWnd, const RGNDATA *dirtyRegion) final;
 
-      // Same logic as in D3D8Device::GetBackBuffer
-      if (BackBuffer >= m_backBuffers.size() || m_backBuffers[BackBuffer] == nullptr) {
-        Com<d3d9::IDirect3DSurface9> pSurface9;
-        HRESULT res = GetD3D9()->GetBackBuffer(BackBuffer, (d3d9::D3DBACKBUFFER_TYPE)Type, &pSurface9);
-
-        if (likely(SUCCEEDED(res))) {
-          m_backBuffers[BackBuffer] = new D3D8Surface(GetParent(), std::move(pSurface9));
-          *ppBackBuffer = m_backBuffers[BackBuffer].ref();
-        }
-
-        return res;
-      }
-
-      *ppBackBuffer = m_backBuffers[BackBuffer].ref();
-      return D3D_OK;
-    }
+    HRESULT STDMETHODCALLTYPE GetBackBuffer(
+        UINT                BackBuffer,
+        D3DBACKBUFFER_TYPE  Type,
+        IDirect3DSurface8** ppBackBuffer) final;
 
   private:
+
     std::vector<Com<D3D8Surface, false>> m_backBuffers;
 
   };
diff --git a/src/d3d8/meson.build b/src/d3d8/meson.build
index c97bd5b86..c638c2ede 100644
--- a/src/d3d8/meson.build
+++ b/src/d3d8/meson.build
@@ -1,14 +1,15 @@
 d3d8_res = wrc_generator.process('version.rc')
 
 d3d8_src = [
-  'd3d8_main.cpp',
-  'd3d8_interface.cpp',
   'd3d8_device.cpp',
+  'd3d8_interface.cpp',
+  'd3d8_main.cpp',
   'd3d8_multithread.cpp',
   'd3d8_options.cpp',
-  'd3d8_surface.cpp',
+  'd3d8_shader.cpp',
   'd3d8_state_block.cpp',
-  'd3d8_shader.cpp'
+  'd3d8_surface.cpp',
+  'd3d8_swapchain.cpp'
 ]
 
 d3d8_ld_args      = []