mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-15 07:29:17 +01:00
[d3d8] Cache all back buffers for additional swapchains
This commit is contained in:
parent
bc78fc6ed0
commit
eae12e6f23
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user