[d3d8] Refactor D3D8SwapChain implementation

This commit is contained in:
WinterSnowfall 2025-01-09 03:28:59 +02:00 committed by Philip Rebohle
parent 84ad2ea261
commit 8017607fe7
3 changed files with 55 additions and 34 deletions

View file

@ -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;
}
}

View file

@ -2,7 +2,6 @@
#include "d3d8_device_child.h" #include "d3d8_device_child.h"
#include "d3d8_surface.h" #include "d3d8_surface.h"
#include "d3d8_d3d9_util.h"
namespace dxvk { namespace dxvk {
@ -12,39 +11,19 @@ namespace dxvk {
public: public:
D3D8SwapChain( D3D8SwapChain(
D3D8Device* pDevice, D3D8Device* pDevice,
D3DPRESENT_PARAMETERS* pPresentationParameters, D3DPRESENT_PARAMETERS* pPresentationParameters,
Com<d3d9::IDirect3DSwapChain9>&& pSwapChain) Com<d3d9::IDirect3DSwapChain9>&& pSwapChain);
: D3D8SwapChainBase(pDevice, std::move(pSwapChain)) {
m_backBuffers.resize(pPresentationParameters->BackBufferCount);
}
HRESULT STDMETHODCALLTYPE Present(const RECT *src, const RECT *dst, HWND hWnd, const RGNDATA *dirtyRegion) final { 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;
// Same logic as in D3D8Device::GetBackBuffer HRESULT STDMETHODCALLTYPE GetBackBuffer(
if (BackBuffer >= m_backBuffers.size() || m_backBuffers[BackBuffer] == nullptr) { UINT BackBuffer,
Com<d3d9::IDirect3DSurface9> pSurface9; D3DBACKBUFFER_TYPE Type,
HRESULT res = GetD3D9()->GetBackBuffer(BackBuffer, (d3d9::D3DBACKBUFFER_TYPE)Type, &pSurface9); IDirect3DSurface8** ppBackBuffer) final;
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;
}
private: private:
std::vector<Com<D3D8Surface, false>> m_backBuffers; std::vector<Com<D3D8Surface, false>> m_backBuffers;
}; };

View file

@ -1,14 +1,15 @@
d3d8_res = wrc_generator.process('version.rc') d3d8_res = wrc_generator.process('version.rc')
d3d8_src = [ d3d8_src = [
'd3d8_main.cpp',
'd3d8_interface.cpp',
'd3d8_device.cpp', 'd3d8_device.cpp',
'd3d8_interface.cpp',
'd3d8_main.cpp',
'd3d8_multithread.cpp', 'd3d8_multithread.cpp',
'd3d8_options.cpp', 'd3d8_options.cpp',
'd3d8_surface.cpp', 'd3d8_shader.cpp',
'd3d8_state_block.cpp', 'd3d8_state_block.cpp',
'd3d8_shader.cpp' 'd3d8_surface.cpp',
'd3d8_swapchain.cpp'
] ]
d3d8_ld_args = [] d3d8_ld_args = []