Обработка кодов возврата TestCooperativeLevel (тема закрыта)

Как обрабатывать коды возврата TestCooperativeLevel:1 - D3DERR_DEVICELOST2 - D3DERR_DEVICENOTRESET

?

У меня программа на основе d3dapp.cpp из DirectX SDK.

В частности меня интерисует ситуация с нажатием Control Alternative Delete.

После нажатия на эти кнопки и выбора варианта отображение останавливается.

Переключение из оконного в полноэкранный режим или наоборот (в зависимости от текущего режима) решает проблему.

Я проверял:в оконном режиме возникает много раз D3DERR_DEVICELOST, потом 1 раз D3DERR_DEVICENOTRESET;

в полноэкранном режиме возникает много раз D3DERR_DEVICELOST.

В оконном режиме после D3DERR_DEVICENOTRESET функция Reset сейчас возвращает код ошибки.

Я дополнил код программы в этой ситуации:

удаляю LPDIRECT3DDEVICE9 и LPDIRECT3D9 и создаю заново (другие ресурсы у меня используются только в процессе рисования).

Тогда воспроизведение видео восстанавливается, но следующее переключение в полноэкранный режим останавливает рисование совсем и ничего больше не помогает.

Последняя правка: пн, 29/08/2011 - 22:06
Submitted by Kozlov_Sergey on

Комментарии

Quote:
discouraged_one писал(а):
http://msdn.microsoft.com/en-us/library/bb174472%28v=vs.85%29.aspx
Это я уже читал.

Может у кого-нибудь есть свой опыт?

Я дополнил код программы в этой ситуации: удаляю LPDIRECT3DDEVICE9 и LPDIRECT3D9 и создаю заново (другие ресурсы у меня используются только в процессе рисования). Тогда воспроизведение видео восстанавливается, но следующее переключение в полноэкранный режим останавливает рисование совсем и ничего больше не помогает.

Ты сума сошел )))

D3DERR_DEVICELOST - говорит о том, что устройство в данный момент потеряно и не может быть использовано (соответственно ресет не поможет!!!), твоя программа должна ждать, пока Тест не вернет D3DERR_DEVICENOTRESET - вот это уже значит, что устройство найдено, но его следует перезагрузить(естественно вызвать ->Reset(&d3dpp))

если ты менял таргеты на свои в устройстве, то тебе обязательно нужно их освободить перед ресетом (то бишь ->Release()), а родной вернуть наместо

вот приблезительный код востановления устройства:

LPDIRECT3DDEVICE9 g_lpDevice;...HRESULT hRes = g_lpDevice->TestCooperativeLevel();if (FAILED(hRes)){ if (hRes == D3DERR_DEVICELOST) { ::Sleep(100); hRes = g_lpDevice->TestCooperativeLevel(); } if (hRes == D3DERR_DEVICENOTRESET) { OnDeviceLost(); // освобождение всех ресурсов пула DEFAULT if (Reset()) // ресет самого устройства OnDeviceReset() // ресет прошел нормально - востанавливаем все ресурсы else return false; } else return false;}...начало сцены и еже с ними

И думать забудь об удалении главных объектов.

Submitted by MaxImuS on

OMFG.

Не нужно шаманства -- оно всё равно почти никогда не работает.

Просто прочитать документацию и сделать, как написано -- т.е. дождаться, пока девайс можно будет отресетить и отресетить его (как правильно ресетить тоде описано в том же MSDN).

Submitted by BLK Dragon on
Я же написал, что не доходит в полноэкранном режиме до того, что можно делать ресет устройства.

Я пробовал: то, что вы оба предлагаете не работает.

Я же написал, что не доходит в полноэкранном режиме до того, что можно делать ресет устройства. Я пробовал: то, что вы оба предлагаете не работает. Чукча не читатель, чукча писатель? :) Мы (в том числе и MicroSoft) предлагаем _дождаться_ того момента, когда можно сделать ресет девайса. Ну там sleep или ещё что... Понятно, что в том же самом кадре сделать ресет не получится, так на глаз на моём компе это миллисекунд 200 пройти может пока девайс "отомрёт".
Submitted by BLK Dragon on
Quote:
Kozlov_Sergey писал(а):
Я пробовал: то, что вы оба предлагаете не работает.

Я это утверждение представил себе так -> *comando*

В предыдущем посте своем выделил ключевое слово.

Submitted by MaxImuS on
Quote:
BLK Dragon писал(а):

Я же написал, что не доходит в полноэкранном режиме до того, что можно делать ресет устройства.

Я пробовал: то, что вы оба предлагаете не работает.

Чукча не читатель, чукча писатель? Smile

Мы (в том числе и MicroSoft) предлагаем _дождаться_ того момента, когда можно сделать ресет девайса. Ну там sleep или ещё что...

Понятно, что в том же самом кадре сделать ресет не получится, так на глаз на моём компе это миллисекунд 200 пройти может пока девайс "отомрёт".
в полноэкранном режиме приходит только D3DERR_DEVICELOST

Ждать бесконечно?

Что нужно сделать, чтобы произошло D3DERR_DEVICENOTRESET как код возврата из TestCooperativeLevel в полноэкранном режиме с nvidia 3d video driver в directshow render фильтре?

Удаляю и создаю заново объекты интерфейсов IDirect3D9 и IDirect3DDevice9.В оконном режиме всё работает.А в полноэкранном после Ctrl Alt Del при пересоздании// Create the device hr = m_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hWndFocus, D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE , &m_d3dpp,

&m_pd3dDevice );

HRESULT: 0x88760868 (2289436776) Name: D3DERR_DEVICELOST Description: Device lost Severity code: Failed Facility Code: Unknown (2166) Error Code: 0x0868 (2152)

Тебе сколько повторять, что при потере устройства НЕ НАДО удалять и создавать заново устройство?! Или ты решил всему мелкософту показать средний палец?

Submitted by MaxImuS on

-

Quote:
MaxImuS писал(а):
Тебе сколько повторять, что при потере устройства НЕ НАДО удалять и создавать заново устройство?! Или ты решил всему мелкософту показать средний палец?
А тебя я не спрашивал. Ты умеешь только оскорблять.

Чувак, ты невменяем. Прекрати шаманить, почитай доки и сделай _ровно_то_что_написано_. А то так ещё полгода будешь с этим ресетом долбаться...

Submitted by BLK Dragon on
Quote:
BLK Dragon писал(а):
Чувак, ты невменяем. Прекрати шаманить, почитай доки и сделай _ровно_то_что_написано_. А то так ещё полгода будешь с этим ресетом долбаться...
Ты сам невменяемы, точнее вы оба.Вы что делали когда-нибудь directshow render filter?Мне сказали, что Reset в directshow render filter не работает. Я проверил. Действительно не работает.

И не тебе решать, сколько я буду свою задачу делать.

Quote:
Kozlov_Sergey писал(а):
А тебя я не спрашивал. Ты умеешь только оскорблять.
И где же это я тебя оскорбил? =)

Мы тебе на протяжении всей этой темы нормально объясняем что сделать, а ты плевал и гнешь свою линию. Как с тобой тогда общаться?

Submitted by MaxImuS on

MaxImuS, Не пиши мне.

Парень, учись слушать людей и не обижаться с каждого замечания. Пока ты претендуешь на звание "Неадекват №2" данного форума.

Submitted by Rebel on

GameDev.by