Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Fallo al hacer un Reset del Device en Direct3d

Iniciado por Loover, 17 de Abril de 2008, 05:58:26 PM

« anterior - próximo »

Loover

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] ....

}

IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

[EX3]

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

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

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Loover

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.
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

Capiflash

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

[EX3]

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.
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Loover

¡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
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

[EX3]

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...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Loover

IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

[EX3]

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...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

[EX3]

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...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Loover

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;
}
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

[EX3]

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...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Loover

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
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

[EX3]

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...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Loover

Pero si estoy en el msn!!!

No me ha salido nada de que me hayas agregado :S
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.