Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: Loover en 17 de Abril de 2008, 05:58:26 PM

Título: Fallo al hacer un Reset del Device en Direct3d
Publicado por: Loover en 17 de Abril de 2008, 05:58:26 PM
Una vez más necesito vuestra inestimable ayuda.

Tengo una pequeña demo:
http://www.pixelartgames.com/temporal/PruebaDevice.rar

Dentro de la carpeta vc2008, hay un ejecutable:
- Si pulsas "espacio" debería cambiar a pantalla completa / ventana
- Si pulsas los números "1" o "2", debería cambiar a otras dimensiones de ventanta.

Primero bajarla, por favor, y decidme si os funciona bien al pulsar 1, 2, espacio.

A mi me funciona, y otros ordenadores también. Pero en algunos no es así y no sé bien porqué.

Todas las texturas que utilizo son D3DPOOL_MANAGED y no tengo surface stencils ni nada de eso. Vamos, nada que tenga que destruir / cargar tras recuperar el device. Debería funcionar simplemente con un reset del mismo.

Os pego la función que utilizo para hacer el reset a ver si veis el error. Fijo que estaré cometiendo alguna burrada. Detalle: a los que les falla les ocurre que GetDevice()->Reset (&mPresentParameters) no devuelve D3D_OK.


/*
==================
Reset Direct3D
==================
*/
bool IND_Render::Direct3dReset (int pWidth,
int pHeight,
int pBpp,
bool pVsync,
bool pFullscreen)
{
Debug->Header ("Reseting Direct3D", 5);

// Windowed
if (!pFullscreen)
{
if ((mInfo.mDirect3d->GetAdapterDisplayMode (D3DADAPTER_DEFAULT, &mDisplayMode)) != D3D_OK)
{
Debug->Header ("Error obtaining the adapter", 2);
return 0;
}
else
Debug->Header ("Obtaining the adapter", 1);
}
else
// Full screen
{
mDisplayMode.Width = pWidth;
mDisplayMode.Height = pHeight;
mDisplayMode.RefreshRate = 0;

if (pBpp == 32)
mDisplayMode.Format = D3DFMT_A8R8G8B8;
else
mDisplayMode.Format = D3DFMT_R5G6B5;

Debug->Header ("Obtaining the adapter", 1);
}

ZeroMemory (&mPresentParameters, sizeof(mPresentParameters));

// Windowed
if (!pFullscreen)
{
mPresentParameters.Windowed = 1;
}
// Full screen
else
{
mPresentParameters.Windowed   = 0;
mPresentParameters.BackBufferWidth  = mDisplayMode.Width;
mPresentParameters.BackBufferHeight = mDisplayMode.Height;
}

mPresentParameters.SwapEffect       = D3DSWAPEFFECT_DISCARD;
mPresentParameters.BackBufferFormat = mDisplayMode.Format;


// Depth buffer
mPresentParameters.EnableAutoDepthStencil = true; //own depth and stencil format
mPresentParameters.AutoDepthStencilFormat = D3DFMT_D16; //depth stencil format

// Vsync
if (!pVsync)
mPresentParameters.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;


// Reset Device
bool mExit = 0;
while (!mExit)
{
if (GetDevice()->Reset (&mPresentParameters) != D3D_OK) //  <= AQUI NO LES DEVUELVE D3D_OK A ALGUNOS
{
while (GetDevice()->TestCooperativeLevel () != D3DERR_DEVICENOTRESET)
{
Sleep (50);
}

ResetTimer ();
}
else
{
mExit = 1;
}
}


    .... [resto de código que ni pincha ni corta] ....

}

Título: Fallo al hacer un Reset del Device en Direct3d
Publicado por: [EX3] en 17 de Abril de 2008, 06:40:03 PM
Tienes un privado :) En te he puesto el enlace a un post de Helius donde puso antaño su codigo de reseteo, que es el que implemento en dx_lib32:

Problemas Al Recuperar El Device En Direct3d  (http://www.stratos-ad.com/forums3/viewtopic.php?t=4070&highlight=)

Lo dicho. En cuanto llegue a casa pruebo el test.

Salu2...
Título: Fallo al hacer un Reset del Device en Direct3d
Publicado por: Loover en 17 de Abril de 2008, 06:47:13 PM
Gracias, vengo de leer como lo hizo helius. Así lo hago yo también para los casos de ALT+TAB en los que tan solo hay que resetear el device (eso lo tengo antes del BeginScene(). Que a mi también me funcionan y no sé si te funcionará a ti (en este ejemplo que he colgado me refiero, no en tu lib).

Pero este es un caso un poco distinto, en el que tu pulsas la tecla espacio y pasa a pantalla completa o al reves. Y si pulas 1 y 2 cambia a otras dimensiones. Por lo que hay que cambiar ciertos parámetros como dimensiones de la ventana, pantalla completa / ventana, etc.

Cuando llegues a casa a ver si puedes probar lo que he colgado, que es distinto a lo que ya ejecutaste la primera vez que puse IndieLib.
Título: Fallo al hacer un Reset del Device en Direct3d
Publicado por: Capiflash en 17 de Abril de 2008, 08:54:44 PM
Bueno , arranque el portatil para tener un windows a mano , y ejecute el tu prueba

No se que pasa , pero yo veo completamente la ventana en negro ( ninguna de las imagenes de l a carpeta resources me muestra a mi la prueba ) , quizas es por el equipo q no soporta algo.
En cuanto al reset funciona OK . Con la barra espaciadora lo hago a pantalla completa o modo ventana sin problemas , he hecho el intercambio unas 10 veces y todo bien.

Me temo que el esfuerzo de mi arcaico portatil no sirve de muxo xDD
Título: Fallo al hacer un Reset del Device en Direct3d
Publicado por: [EX3] en 17 de Abril de 2008, 09:23:58 PM
Acabo de probar el test en Vista y nada, se queda en bucle intentando recuperar el dispositivo sin lograrlo. Un detalle, yo controlaria el tema de la recuperacion con un numero maximo de intentos o un tiempo limite (un TimeOutException por ejemplo) por que casi me ha tocado reiniciar la maquina ya que no lograba terminar el proceso del programa.

Cuando reinicie y me meta en Mac Os te lo pruebo en un XP sobre VMware.

Salu2...

P.D.: Como recien he reinstalado el Vista en el Mac, para descartar cualquier falta de librerias o historias similares he probado cambios de modos de video con un tuto de la dx_lib32 y este los ha aplicado sin pestañear.
Título: Fallo al hacer un Reset del Device en Direct3d
Publicado por: Loover en 17 de Abril de 2008, 09:57:13 PM
¡Gracias a ambos por probarla! Lo de la pantalla en negro... parece algo más que ver con los drivers. Sino lograra crear el render o no encontrara las imágenes, se saldría y lo indicaría en el debug.log

Siento EX3 Lo del bucle mortal, jaja. Me temía que no iba a funcionar.

Vamos a ver, he preparado otra prueba para ti. Simplemente replaza la .dll. En esta ocasión cuando intente resetear el device se saldrá. En el debug.log he puesto que salga el valor del HRESULT, que quiero saber cuál te da. Ok? Me pegas lo que te ponga en el debug (con lo último me sobra, el error).

Gracias!

http://www.pixelartgames.com/temporal/dll_01.rar
Título: Fallo al hacer un Reset del Device en Direct3d
Publicado por: [EX3] en 17 de Abril de 2008, 09:59:26 PM
Acabo de probarlo sobre XP en la VMWare y aqui si funciona! A la primera y sin rechistar, tanto pulsando espacio como 1 y 2, funciona a la perfeccion :)

Yo miraria que otra persona que tenga Vista instalado te lo pruebe, no se, me resulta extraño que no funcione en Vista cuando a mi la misma implementacion de Helius si me funciona :?

Salu2...
Título: Fallo al hacer un Reset del Device en Direct3d
Publicado por: Loover en 17 de Abril de 2008, 10:00:09 PM
Mirate el post justo de antes :D
Título: Fallo al hacer un Reset del Device en Direct3d
Publicado por: [EX3] en 17 de Abril de 2008, 10:04:23 PM
Cita de: "Loover"Vamos a ver, he preparado otra prueba para ti. Simplemente replaza la .dll. En esta ocasión cuando intente resetear el device se saldrá. En el debug.log he puesto que salga el valor del HRESULT, que quiero saber cuál te da. Ok? Me pegas lo que te ponga en el debug (con lo último me sobra, el error).
Ya no se si quedarme en Vista o en Mac, que caos con tanto reinicio xDDDD Dame un plis que reinicie y te lo pruebo :P

Salu2...
Título: Fallo al hacer un Reset del Device en Direct3d
Publicado por: [EX3] en 17 de Abril de 2008, 10:14:20 PM
Je, no te lo pierdas, ahora no rechista pero tampoco funciona, se corta y se cierra justo al primer intento de reseteo. El final del log:
---------------------------------------------------------------------
[22:09:52] [ BEGIN ] -- Creating SDL window --
                    {
          [  OK   ]    Window created
          [ INFO  ]    Mode: Full screen
                    }
[22:09:54] [  END  ] Window OK [Elapsed time = 2.465 seg]
---------------------------------------------------------------------
[22:09:54] [ BEGIN ] -- Reseting Direct3D --
                    {
          [  OK   ]    Obtaining the adapter

Cuando me referia a que controlaras el resteo no me referia a que lo cerraras a la primera xDDD

Salu2...
Título: Fallo al hacer un Reset del Device en Direct3d
Publicado por: Loover en 17 de Abril de 2008, 10:23:36 PM
Agregame al msn q te de la brasa por allí! :D

Otra nueva:

http://www.pixelartgames.com/temporal/IndieLib_vc2008.dll

No entiendo nada, hago un casting the todos los valores posibles y no saca el error, jaja. He puesto un "default" que saque "unknown". Pero es que no hay más errores posibles según la msdn :S

Tengo esto ahora mismo:

HRESULT mResult = GetDevice()->Reset (&mPresentParameters);
if (mResult != D3D_OK)
{
switch (mResult)
{
case D3DERR_DEVICELOST: Debug->DataChar ("D3DERR_DEVICELOST", 1); break;
case D3DERR_DRIVERINTERNALERROR: Debug->DataChar ("D3DERR_DRIVERINTERNALERROR", 1); break;
case D3DERR_INVALIDCALL: Debug->DataChar ("D3DERR_INVALIDCALL", 1); break;
case D3DERR_OUTOFVIDEOMEMORY: Debug->DataChar ("D3DERR_OUTOFVIDEOMEMORY", 1); break;
case E_OUTOFMEMORY: Debug->DataChar ("E_OUTOFMEMORY", 1); break;
default: Debug->DataChar ("Unknown", 1); break;
}
Título: Fallo al hacer un Reset del Device en Direct3d
Publicado por: [EX3] en 17 de Abril de 2008, 10:26:56 PM
Cita de: "Loover"Agregame al msn q te de la brasa por allí! :D
Espera que termine de instalarse :P (iba hacerlo desde Mac pero como me requieres por los territorios abruptos de Vista estoy completando instalaciones de ultima hora xD)

Salu2...
Título: Fallo al hacer un Reset del Device en Direct3d
Publicado por: Loover en 17 de Abril de 2008, 10:29:57 PM
Dios te lo pague. Lo malo es que a las 11 o así tendré que irme, cachis en to. Si sé que iba a tener "engine sesión" no habría quedao.  :D
Título: Fallo al hacer un Reset del Device en Direct3d
Publicado por: [EX3] en 17 de Abril de 2008, 10:50:49 PM
Me cago en to, asi podria estar esperando yo con el msn abierto a que asomaras xDD Suerte que pille por banda a SiPoX y al Lex para charlar un rato.

Weno, ya apañaremos para coincidir (previo privado ya que no suelo estar conectado en el msn)

Salu2...
Título: Fallo al hacer un Reset del Device en Direct3d
Publicado por: Loover en 17 de Abril de 2008, 10:52:23 PM
Pero si estoy en el msn!!!

No me ha salido nada de que me hayas agregado :S