First try for d3d9 lost device fix.
git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1623 dfc29bdd-3216-0410-991c-e03cc46cb475master
parent
b44c2bdadf
commit
3f153d2a2c
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue