Simplified D3DDevice_GetBackBuffer and D3DDevice_SetRenderTarget

This seems to prevent exceptions for some titles
This commit is contained in:
PatrickvL 2017-05-14 02:20:36 +01:00
parent 690451dfae
commit da9a919a89
1 changed files with 18 additions and 26 deletions

View File

@ -1937,6 +1937,7 @@ static void EmuUnswizzleTextureStages()
HRESULT hRet; HRESULT hRet;
XTL::IDirect3DTexture8 *pHostTexture = GetHostTexture(pPixelContainer); XTL::IDirect3DTexture8 *pHostTexture = GetHostTexture(pPixelContainer);
if (pHostTexture != nullptr) if (pHostTexture != nullptr)
{ {
hRet = pHostTexture->UnlockRect(0); // remove old lock hRet = pHostTexture->UnlockRect(0); // remove old lock
@ -2809,7 +2810,13 @@ XTL::X_D3DSurface* WINAPI XTL::EMUPATCH(D3DDevice_GetBackBuffer2)
} }
//*/ //*/
static X_D3DSurface *pBackBuffer = EmuNewD3DSurface();
static X_D3DSurface *pBackBuffer;
#if 1
pBackBuffer = g_pCachedRenderTarget;
pBackBuffer->Common++;
#else
pBackBuffer = EmuNewD3DSurface();
XTL::IDirect3DSurface8 *pNewHostSurface = nullptr; XTL::IDirect3DSurface8 *pNewHostSurface = nullptr;
if(BackBuffer == -1) if(BackBuffer == -1)
@ -2824,7 +2831,7 @@ XTL::X_D3DSurface* WINAPI XTL::EMUPATCH(D3DDevice_GetBackBuffer2)
SetHostSurface(pBackBuffer, pNewHostSurface); SetHostSurface(pBackBuffer, pNewHostSurface);
// update data pointer // update data pointer
pBackBuffer->Data = X_D3DRESOURCE_DATA_BACK_BUFFER; pBackBuffer->Data = X_D3DRESOURCE_DATA_BACK_BUFFER;
#endif
return pBackBuffer; return pBackBuffer;
} }
@ -8176,34 +8183,19 @@ HRESULT WINAPI XTL::EMUPATCH(D3DDevice_SetRenderTarget)
LOG_FUNC_ARG(pNewZStencil) LOG_FUNC_ARG(pNewZStencil)
LOG_FUNC_END; LOG_FUNC_END;
IDirect3DSurface8 *pPCRenderTarget = nullptr;
IDirect3DSurface8 *pPCNewZStencil = nullptr;
if(pRenderTarget != NULL) if (pRenderTarget == NULL)
{ pRenderTarget = g_pCachedRenderTarget;
if(GetHostSurface(pRenderTarget) != nullptr)
{
EmuVerifyResourceIsRegistered(pRenderTarget); EmuVerifyResourceIsRegistered(pRenderTarget);
pPCRenderTarget = GetHostSurface(pRenderTarget); IDirect3DSurface8 *pPCRenderTarget = GetHostSurface(pRenderTarget);
}
else
{
pPCRenderTarget = GetHostSurface(g_pCachedRenderTarget);
}
}
IDirect3DSurface8 *pPCNewZStencil = nullptr;
if(pNewZStencil != NULL) if(pNewZStencil != NULL)
{
if(GetHostSurface(pNewZStencil) != nullptr)
{ {
EmuVerifyResourceIsRegistered(pNewZStencil); EmuVerifyResourceIsRegistered(pNewZStencil);
pPCNewZStencil = GetHostSurface(pNewZStencil); pPCNewZStencil = GetHostSurface(pNewZStencil);
} }
else
{
pPCNewZStencil = GetHostSurface(g_pCachedDepthStencil);
}
}
// TODO: Follow that stencil! // TODO: Follow that stencil!
HRESULT hRet = g_pD3DDevice8->SetRenderTarget(pPCRenderTarget, pPCNewZStencil); HRESULT hRet = g_pD3DDevice8->SetRenderTarget(pPCRenderTarget, pPCNewZStencil);