2010-03-23 2 views
5

Recientemente actualizamos de VS 2005 a (Windows XP). Usamos SlimDx en uno de nuestros proyectos. Todo trabajaba bien después de la actualización, excepto mi Recuperar función, que es llamada el reinicio devicelost/dispositivo que bloquea conSlimDX Device.Restablecer bloqueos con un error "D3DERR_INVALIDCALL: llamada no válida (-2005530516)"

D3DERR_INVALIDCALL: Llamada no válida (-2005530516)

utilizo Ctrl - Alt - Del y luego Escape para simular la pérdida del dispositivo.

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) 
    {} 
} 

¿Es esto algo que ver con VS 2008, ya que solía trabajar muy bien con VS 2005?

+0

¿Hay algo en el flujo de depuración que lo ayude? – Goz

+0

Una búsqueda rápida de "D3DERR_INVALIDCALL Restablecer" conduce a MSDN. "La llamada al método no es válida. Por ejemplo, el parámetro de un método puede tener un valor no válido." Así que mi sugerencia sería verificar m_presentParams; ¿contiene la información que espera? –

+3

resuelto: algunos de los recursos (stateblocks) no fueron eliminados. – ababeel

Respuesta

8

Encontré información útil en this forum post. Tenga en cuenta la pregunta sobre ese foro relacionada con VB, pero esta sigue siendo una buena información. Crédito completo a Simon O'Connor.

Reformateado y editado levemente.

INVALIDCALL generalmente significa que un parámetro que ha pasado a D3D no es válido o no es posible realizar una operación que haya solicitado.

La forma más fácil de averiguar por qué una llamada D3D devuelve un error INVALIDCALL es dejar que te dice:

  1. Asegúrese de que está utilizando la versión de depuración del tiempo de ejecución está instalado D3D (que se les dio la opción cuando instaló el SDK).
  2. Asegúrese de que la versión DEBUG del tiempo de ejecución esté habilitada. Vaya a la aplicación de DirectX en el Panel de control y busque en la pestaña Direct3D.
  3. Mientras está en el subprograma del panel de control de DirectX, aumente al máximo el nivel de salida de depuración para Direct3D. No he usado Visual BASIC durante más de 10 años, así que olvidé qué soporte de depuración está disponible y no lo tengo instalado en esta máquina para comprobar ... Si VB TIENE una ventana de salida de depuración:
  4. Ejecute su programa y deje que falle con el error INVALIDCALL.
  5. Ahora mire todo el texto en su ventana de salida de depuración. D3D registrará información, advertencias y, lo que es más importante, errores. También explicará la razón por la cual una llamada D3D ha fallado.

Esto suele Si VB no tiene un simple ventana de resultados de depuración, descargar y ejecutar DebugView de http://www.sysinternals.com o utilizar el visor de depuración de línea de comandos que viene con el DirectX SDK

+0

amigo, op resolvió el problema hace mucho tiempo. Consulte los comentarios ("algunos de los recursos (stateblocks) no fueron eliminados"). – SigTerm

+4

@SigTerm, sí Tengo un mensaje de error genérico, pero esta publicación de SO tiene una clasificación de google alta para el código de error, así que planteé esta respuesta con la esperanza de que pueda ayudar a alguien más a llegar. en una búsqueda –

1

que sucede cuando no lo hiciste t disponga de todos sus recursos (búfer de vértices, textura, ...)

0
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) {} 
} 
Cuestiones relacionadas