From eae12e6f2321f2f91c35463a808e335312fbc4e1 Mon Sep 17 00:00:00 2001 From: WinterSnowfall Date: Fri, 4 Oct 2024 16:50:43 +0300 Subject: [PATCH] [d3d8] Cache all back buffers for additional swapchains --- src/d3d8/d3d8_device.cpp | 2 +- src/d3d8/d3d8_swapchain.h | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/d3d8/d3d8_device.cpp b/src/d3d8/d3d8_device.cpp index 154c4f075..a41a71af2 100644 --- a/src/d3d8/d3d8_device.cpp +++ b/src/d3d8/d3d8_device.cpp @@ -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; } diff --git a/src/d3d8/d3d8_swapchain.h b/src/d3d8/d3d8_swapchain.h index b356873e0..ef2b41f64 100644 --- a/src/d3d8/d3d8_swapchain.h +++ b/src/d3d8/d3d8_swapchain.h @@ -13,38 +13,39 @@ namespace dxvk { D3D8SwapChain( D3D8Device* pDevice, + D3DPRESENT_PARAMETERS* pPresentationParameters, Com&& 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 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 m_backBuffer = nullptr; + std::vector> m_backBuffers; };