First try for d3d9 lost device fix.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1623 dfc29bdd-3216-0410-991c-e03cc46cb475
master
hybrid 2008-10-09 09:39:13 +00:00
parent b44c2bdadf
commit 3f153d2a2c
1 changed files with 33 additions and 17 deletions

View File

@ -465,14 +465,18 @@ bool CD3D9Driver::beginScene(bool backBuffer, bool zBuffer, SColor color,
HRESULT hr; HRESULT hr;
if (DeviceLost) if (DeviceLost)
{ {
if(FAILED(hr = pID3DDevice->TestCooperativeLevel())) if (FAILED(hr = pID3DDevice->TestCooperativeLevel()))
{ {
if (hr == D3DERR_DEVICELOST) if (hr == D3DERR_DEVICELOST)
return false; {
Sleep(100);
hr = pID3DDevice->TestCooperativeLevel();
if (hr == D3DERR_DEVICELOST)
return false;
}
if (hr == D3DERR_DEVICENOTRESET) if ((hr == D3DERR_DEVICENOTRESET) && !reset())
reset(); return false;
return false;
} }
} }
@ -505,9 +509,6 @@ bool CD3D9Driver::beginScene(bool backBuffer, bool zBuffer, SColor color,
//! applications must call this method after performing any rendering. returns false if failed. //! applications must call this method after performing any rendering. returns false if failed.
bool CD3D9Driver::endScene() bool CD3D9Driver::endScene()
{ {
if (DeviceLost)
return false;
CNullDriver::endScene(); CNullDriver::endScene();
HRESULT hr = pID3DDevice->EndScene(); HRESULT hr = pID3DDevice->EndScene();
@ -530,19 +531,17 @@ bool CD3D9Driver::endScene()
hr = pID3DDevice->Present(srcRct, NULL, (HWND)WindowId, NULL); hr = pID3DDevice->Present(srcRct, NULL, (HWND)WindowId, NULL);
if (SUCCEEDED(hr))
return true;
if (hr == D3DERR_DEVICELOST) if (hr == D3DERR_DEVICELOST)
{ {
DeviceLost = true; DeviceLost = true;
os::Printer::log("DIRECT3D9 device lost.", ELL_WARNING); os::Printer::log("DIRECT3D9 device lost.", ELL_WARNING);
} }
else else
if (FAILED(hr) && hr != D3DERR_INVALIDCALL)
{
os::Printer::log("DIRECT3D9 present failed.", ELL_WARNING); os::Printer::log("DIRECT3D9 present failed.", ELL_WARNING);
return false; return false;
}
return true;
} }
@ -2248,8 +2247,25 @@ bool CD3D9Driver::reset()
{ {
os::Printer::log("Resetting D3D9 device.", ELL_INFORMATION); os::Printer::log("Resetting D3D9 device.", ELL_INFORMATION);
HRESULT hr; for (u32 i=0; i<Textures.size(); ++i)
if (FAILED(hr = pID3DDevice->Reset(&present))) {
if (Textures[i].Surface->isRenderTarget())
{
IDirect3DTexture9 tex = ((CD3D9Texture*)(Textures[i].Surface))->getDX9Texture();
if (tex)
tex->Release();
}
}
HRESULT hr = pID3DDevice->Reset(&present);
for (u32 i=0; i<Textures.size(); ++i)
{
if (Textures[i].Surface->isRenderTarget())
((CD3D9Texture*)(Textures[i].Surface))->createRenderTarget();
}
if (FAILED(hr))
{ {
if (hr == D3DERR_DEVICELOST) if (hr == D3DERR_DEVICELOST)
{ {
@ -2276,7 +2292,7 @@ bool CD3D9Driver::reset()
} }
else if (hr == D3DERR_INVALIDCALL) else if (hr == D3DERR_INVALIDCALL)
{ {
os::Printer::log("Resetting failed due to invalid call.", ELL_WARNING); os::Printer::log("Resetting failed due to invalid call", "You need to release some more surfaces.", ELL_WARNING);
} }
else else
{ {