Сбой SlimDX Device.Reset с ошибкой «D3DERR_INVALIDCALL: Invalid call (-2005530516)» - PullRequest
5 голосов
/ 23 марта 2010

Мы недавно обновились с VS 2005 до VS 2008 (Windows XP). Мы используем SlimDx в одном из наших проектов. После обновления все работало нормально, кроме моей функции Recover , которая вызывается при сбросе устройства / сбросе устройства, который завершается с

D3DERR_INVALIDCALL: Неверный вызов (-2005530516)

Я использую Ctrl - Alt - Del , а затем Escape для имитации потери устройства.

void Recover()
{
  try
     {
         if (res.Code == D3DERR_DEVICENOTRESET)
         { 
           res = m_device.Reset(m_presentParams); //Crashes on this.
           if (res.IsSuccess)
           {
             m_deviceLost = false; 
            }
          }
     }
   catch(Exception e)
   {}
 }

Это как-то связано с VS 2008, так как раньше он хорошо работал с VS 2005?

Ответы [ 3 ]

8 голосов
/ 29 июня 2010

Я нашел некоторую полезную информацию в этом сообщении на форуме . Обратите внимание на вопрос на этом форуме, связанный с VB, но это все еще хорошая информация. Полный кредит Саймону О'Коннору .

Переформатировано и немного отредактировано.

INVALIDCALL обычно означает, что либо параметр, переданный вами в D3D, недействителен, либо запрошенная вами операция невозможна.

Самый простой способ выяснить, почему вызов D3D возвратил ошибку INVALIDCALL, это сообщить ему:

  1. Убедитесь, что вы используете версию DEBUG среды выполнения D3D (вы получили опцию при установке SDK).
  2. Убедитесь, что версия среды выполнения DEBUG включена. Перейдите к апплету DirectX на панели управления и найдите вкладку Direct3D.
  3. Находясь в апплете панели управления DirectX, увеличьте уровень вывода отладки для Direct3D до максимума. Я не использовал Visual BASIC более 10 лет, поэтому я забыл, какая поддержка отладки доступна, и у меня не установлено на этом компьютере, чтобы проверить ... Если VB DOES имеет окно вывода отладки:
  4. Запустите вашу программу и дайте ей сбой с ошибкой INVALIDCALL.
  5. Теперь посмотрите на весь текст в окне вывода отладки. D3D будет регистрировать информацию, предупреждения и, что важно, ошибки, связанные с этим. Также будет объяснена причина, по которой произошел сбой вызова D3D.

Если у VB нет простого окна вывода отладки, загрузите и запустите DebugView из http://www.sysinternals.com или используйте средство просмотра отладки командной строки, которое поставляется с DirectX SDK

1 голос
/ 15 октября 2012

Обычно это происходит, когда вы не распорядились всеми своими ресурсами (буфер вершин, текстура, ...)

0 голосов
/ 12 июля 2013
void Recover() 
{ 
   try { 
            if (res.Code == D3DERR_DEVICENOTRESET) 
            { 
                 res = m_device.Reset(m_presentParams); //Crashes on this. 
                 if (res.IsSuccess) 
                 { 
                      m_deviceLost = false; 
                 } 
            } 
   } catch(Exception e) {} 
}
...