[d3d8] Refactor D3D8SwapChain implementation

This commit is contained in:
WinterSnowfall 2025-01-09 03:28:59 +02:00
parent 4ce90de47a
commit 0d9c13c6c2
No known key found for this signature in database
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_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;
};

View file

@ -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 = []