Появилась интересная ошибка, с которой мне не повезло. В оконной программе Direct3D9, использующей собственный код, я обрабатываю потерянное устройство, используя что-то похожее на следующее:
void MyClass::RecoverFromDeviceLost(LPDIRECT3DDEVICE9 deviceToRecover, D3DPRESENT_PARAMETERS devicePresentParams )
{
HRESULT hr = deviceToRecover->TestCooperativeLevel();
if(hr == D3DERR_DEVICELOST ) {
//Code to shutdown all D3DPOOL_DEFAULT allocated objects
}else if(hr == D3DERR_DEVICENOTRESET){
hr = deviceToRecover->Reset(&devicePresentParams);
if(SUCCEEDED(hr))
{
//Code to rebuild all D3DPOOL_DEFAULT objects
}
}
}
Это нормально работает в Vista, но, похоже, имеет серьезные проблемы в XP. Если монитор отключен или отключен от ПК через KVM, я никогда не получу D3DERR_DEVICELOST
. Единственное возвращаемое значение из TestCooperativeLevel, которое я когда-либо получаю, это D3DERR_DEVICENOTRESET
. И каждый вызов Reset дает D3DERR_INVALIDCALL. Я попытался заставить программу использовать код завершения, выполнив следующее:
...
else if(hr == D3DERR_DEVICENOTRESET){
hr = deviceToRecover->Reset(&devicePresentParams);
if(SUCCEEDED(hr))
{
//Code to rebuild all D3DPOOL_DEFAULT objects
}else {
//Duplicate of code to shutdown all D3DPOOL_DEFAULT objects
}
}
...
Но не было никаких изменений. Эта проблема, похоже, касается только Windows XP (до сих пор тестировалась на SP2, SP3). Я использую DXSDK августа 2007 года и не могу обновить в это время. Кто-нибудь видел эту проблему раньше, или есть идеи, почему я не могу перезагрузить свое устройство?
ОБНОВЛЕНИЕ: Я считаю, что нашел решение , но все еще озадачен сбоем второго сегмента кода, указанного выше. После того, как среда выполнения DirectX Debug стала работать поверх удаленной отладки, я понял, что причина сбоя функции сброса заключалась в том, что имелись невыпущенные ресурсы. Однако точно такой же код выпуска, когда он применялся, как показано в ответе, решил проблему. Я проверил, что программа не создает объекты D3DPOOL_DEFAULT между вызовами функции восстановления. Есть ли в структуре Direct3D что-то, что могло бы вызвать проблемы при выполнении сброса, как показано в сегментах кода этого вопроса?