1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-13 19:29:14 +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)))
*ppSwapChain = ref(new D3D8SwapChain(this, std::move(pSwapChain9)));
*ppSwapChain = ref(new D3D8SwapChain(this, pPresentationParameters, std::move(pSwapChain9)));
return res;
}

View File

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