Direct3d девайс не хочет Reset'иться

  • Автор темы -
  • Дата начала
Статус
Закрыто для дальнейших ответов.

Гость
#1
Встретился с такой проблемой - когда TestCooperativeLevel возвращает D3DERR_DEVICENOTRESET, прога пытается восстановить девайс, но метод reset возвращает D3DERR_INVALIDCALL. При этом в debug trace выводится следующий текст
Код:
Direct3D9: (WARN) :Window does not have focus. TestCooperativeLevel fails
Direct3D9: :WM_SIZE hWnd=B04B8 wp=0000, lp=035E0598 dwFlags=00000001
Direct3D9: :WM_SIZE: Window restored, sending WM_ACTIVATEAPP
Direct3D9: :WM_ACTIVATEAPP: BEGIN Activating app pid=00000820, tid=000008a4
Direct3D9: :*** Active state changing
Direct3D9: :WM_ACTIVATEAPP: DONE Activating app pid=00000820, tid=000008a4
Direct3D9: (ERROR) :Invalid value for BackBufferFormat. ValidatePresentParameters fails.
Direct3D9: (ERROR) :Reset failed and Reset/TestCooperativeLevel/Release are the only legal APIs to be called subsequently
Вот код рендера:
C++:
bool Render (void)
{
HRESULT hRes = pdev->TestCooperativeLevel ();
if (hRes == D3DERR_DEVICELOST)
{
return false;
}
if (hRes == D3DERR_DEVICENOTRESET)
{
hRes = pdev->Reset (&d3dpp);
if (hRes == D3D_OK)
{
return true;
}
else
{
switch (hRes)
{
case D3DERR_DEVICELOST:
::FailInform (METHOD_D3DDEVICERESET, D3DERR_DEVICELOST);
break;
case D3DERR_DEVICEREMOVED:
::FailInform (METHOD_D3DDEVICERESET, D3DERR_DEVICEREMOVED);
break;
case D3DERR_DRIVERINTERNALERROR:
::FailInform (METHOD_D3DDEVICERESET, D3DERR_DRIVERINTERNALERROR);
break;
case D3DERR_OUTOFVIDEOMEMORY:
::FailInform (METHOD_D3DDEVICERESET, D3DERR_OUTOFVIDEOMEMORY);
break;
case D3D_OK:
::WriteLog ("Устройство Direct3D благополучно восстановлено.");
break;
case E_FAIL:
::FailInform (METHOD_D3DDEVICERESET, E_FAIL);
break;
case D3DERR_INVALIDCALL:
::FailInform (METHOD_D3DDEVICERESET, D3DERR_INVALIDCALL);
break;
default:
::FailInform (METHOD_D3DDEVICERESET_RETURNED, 1);
}
return false;
}
}
if (hRes == D3D_OK)
{
pdev->Clear (0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xFFFF0000, 1.0f, 0);
pdev->Present (0, 0, 0, 0);
}
return true;
}
Стоит также заметить, что никаких ресурсов я не создаю!
Структура D3DPRESENT_PARAMETERS одинакова и для создания девайса, и для reset'а.
C++:
		ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed				= false;
d3dpp.SwapEffect				= D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat			= D3DFMT_A8R8G8B8;
d3dpp.BackBufferCount			= 1;
d3dpp.EnableAutoDepthStencil		= true;
d3dpp.hDeviceWindow			= hwnd;
d3dpp.AutoDepthStencilFormat		= D3DFMT_D24S8;
d3dpp.MultiSampleType			= D3DMULTISAMPLE_NONE;
d3dpp.FullScreen_RefreshRateInHz	= D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval			= D3DPRESENT_INTERVAL_IMMEDIATE;
d3dpp.BackBufferWidth			= 1440;
d3dpp.BackBufferHeight			= 900;
d3dpp.Flags					= D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
Девайс создаётся и reset'ится в одном потоке. Уже все форумы перелазил, нигде решения не нашёл. За код прошу строго не судить, я только изучаю d3d :)
 

Гость
#3
Да, скорее всего. Я пробовал значения D3DFMT_A8R8G8B8 и D3DFMT_X8R8G8B8. И не получается. Что делать, понятия не имею. Эта проблема меня немало достаёт, особенно с привычкой моих компов периодически сворачивать окна. Может, найдётся пример кода, который будет возвращать девайс в рабочее состояние? Примеры из DirectX SDK мне не нужны.
 
Статус
Закрыто для дальнейших ответов.