From 0d9c13c6c2fe9e79f21f1effb578587c83156611 Mon Sep 17 00:00:00 2001 From: WinterSnowfall Date: Thu, 9 Jan 2025 03:28:59 +0200 Subject: [PATCH] [d3d8] Refactor D3D8SwapChain implementation --- src/d3d8/d3d8_swapchain.cpp | 41 +++++++++++++++++++++++++++++++++++++ src/d3d8/d3d8_swapchain.h | 39 ++++++++--------------------------- src/d3d8/meson.build | 9 ++++---- 3 files changed, 55 insertions(+), 34 deletions(-) create mode 100644 src/d3d8/d3d8_swapchain.cpp 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&& 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 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&& pSwapChain) - : D3D8SwapChainBase(pDevice, std::move(pSwapChain)) { - m_backBuffers.resize(pPresentationParameters->BackBufferCount); - } + D3D8Device* pDevice, + D3DPRESENT_PARAMETERS* pPresentationParameters, + Com&& 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 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> 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 = []