1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-14 22:29:15 +01:00

[d3d8] Cache all back buffers for additional swapchains

This commit is contained in:
WinterSnowfall 2024-10-04 16:50:43 +03:00 committed by Philip Rebohle
parent bc78fc6ed0
commit eae12e6f23
2 changed files with 10 additions and 9 deletions

View File

@ -219,7 +219,7 @@ namespace dxvk {
); );
if (likely(SUCCEEDED(res))) if (likely(SUCCEEDED(res)))
*ppSwapChain = ref(new D3D8SwapChain(this, std::move(pSwapChain9))); *ppSwapChain = ref(new D3D8SwapChain(this, pPresentationParameters, std::move(pSwapChain9)));
return res; return res;
} }

View File

@ -13,38 +13,39 @@ namespace dxvk {
D3D8SwapChain( D3D8SwapChain(
D3D8Device* pDevice, D3D8Device* pDevice,
D3DPRESENT_PARAMETERS* pPresentationParameters,
Com<d3d9::IDirect3DSwapChain9>&& pSwapChain) Com<d3d9::IDirect3DSwapChain9>&& pSwapChain)
: D3D8SwapChainBase(pDevice, std::move(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); return GetD3D9()->Present(src, dst, hWnd, dirtyRegion, 0);
} }
HRESULT STDMETHODCALLTYPE GetBackBuffer(UINT BackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface8** ppBackBuffer) final { HRESULT STDMETHODCALLTYPE GetBackBuffer(UINT BackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface8** ppBackBuffer) final {
InitReturnPtr(ppBackBuffer);
if (unlikely(ppBackBuffer == nullptr)) if (unlikely(ppBackBuffer == nullptr))
return D3DERR_INVALIDCALL; return D3DERR_INVALIDCALL;
// Same logic as in D3D8Device::GetBackBuffer // Same logic as in D3D8Device::GetBackBuffer
if (unlikely(m_backBuffer == nullptr)) { if (BackBuffer >= m_backBuffers.size() || m_backBuffers[BackBuffer] == nullptr) {
Com<d3d9::IDirect3DSurface9> pSurface9; Com<d3d9::IDirect3DSurface9> pSurface9;
HRESULT res = GetD3D9()->GetBackBuffer(BackBuffer, (d3d9::D3DBACKBUFFER_TYPE)Type, &pSurface9); HRESULT res = GetD3D9()->GetBackBuffer(BackBuffer, (d3d9::D3DBACKBUFFER_TYPE)Type, &pSurface9);
if (likely(SUCCEEDED(res))) { if (likely(SUCCEEDED(res))) {
m_backBuffer = new D3D8Surface(GetParent(), std::move(pSurface9)); m_backBuffers[BackBuffer] = new D3D8Surface(GetParent(), std::move(pSurface9));
*ppBackBuffer = m_backBuffer.ref(); *ppBackBuffer = m_backBuffers[BackBuffer].ref();
} }
return res; return res;
} }
*ppBackBuffer = m_backBuffer.ref(); *ppBackBuffer = m_backBuffers[BackBuffer].ref();
return D3D_OK; return D3D_OK;
} }
private: private:
Com<D3D8Surface> m_backBuffer = nullptr; std::vector<Com<D3D8Surface, false>> m_backBuffers;
}; };