D3DERR_DEVICELOST-woran kanns liegen?
-
Hi,
Device_Lost deutet an, dass das Device verloren gegangen ist. Das passiert i.d.R. wenn man in einem Fullscreen-Programm ALT+TAB drückt und eine andere Anwendung die Grafikkarte übernimmt.Danach schlagen alle Methoden fehl, melden aber ein Okay zurück.
Schau Dir mal die IDirect3DDevice9::Reset Methode an.
Ciao,
Stefan
-
ok, hab das jetzt mal gemacht, aber das problem ist, dass ich ja in keinem meiner vielen versuche alt+tab gedrückt hab, dementsprechend glaub ich nich, dass es daran liegt
der neue code
if(FAILED(hresult=g_pD3DDevice->Present(NULL,NULL,NULL,NULL))){ writetolog(DXGetErrorString9(hresult)); hresult=g_pD3DDevice->Reset(DirectXParameter.parameter); writetolog("versuch die device wiederherzustellen"); writetolog(DXGetErrorString9(hresult)); if(FAILED(hresult=g_pD3DDevice->Present(NULL,NULL,NULL,NULL))){ writetolog(DXGetErrorString9(hresult)); } }
der log dazu
D3DERR_DEVICELOST
versuch die device wiederherzustellen
D3DERR_DEVICELOST
D3DERR_INVALIDCALL
-
also läuft dein programm von anfang bis ende in fullscreen durch ohne dass du nen breakpoint im code hast oder sonst etwas, was den fullscreen deines programms unterbricht?
rapso->greets();
-
jep, direct x wird gestartet, vollbild wird erzeugt, ab dann startet sofort die logic und dann die renderfunktion^^
btw: kanns vielleicht an falschen daten für die createdevice methode liegen? das war nämlich schon immer der knackpunkt *g*
oder kanns vielleicht an falschen berechnungen/matritzen(also falsches format) liegen? ich hab nämlich auch alle berechnungsfunktionen selber geschrieben, und matritzen waren da das problem^^
-
Für Matrizenberechnungen gibts doch wunderschöne D3DX-Funktionen...
-
*schulterzuck* kenn ich net^^ und ich bin mir doch schon sehr sehr sicher, dass meine matrix klasse astrein gecodet ist,operatoren, drehungen, translationen,skalierungen, projektionsmatrix, alles drin
-
Hi,
ALT+TAB war nur *ein* Beispiel
Wenn der Reset fehlschlägt prüfe den Rückgabewert bzw. den Status des Devices. Wenn es immer noch lost oder unresettet ist dann gehst Du einfach in der Schleife weiter bis sich das Device wiederherstellen lässt. Nach einem Lost geht das i.d.R. nicht sofort wieder. Beachte auch, dass Du unmanaged Ressourcen neu erstellen musst.
Ciao,
Stefan
-
Es gibt einen Device State, der nennt sich irgendwo DEVICE_NOTRESET oder so. Der sagt, dass du das Device jetzt wiederherstellen kannst.
-
so, hab das mal auf ne schleife umgestellt:
if(FAILED(hresult=g_pD3DDevice->Present(NULL,NULL,NULL,NULL))){ writetolog(DXGetErrorString9(hresult)); while(FAILED(hresult=g_pD3DDevice->Reset(DirectXParameter.parameter))){ writetolog("versuch die device wiederherzustellen"); writetolog(DXGetErrorString9(hresult)); } if(FAILED(hresult=g_pD3DDevice->Present(NULL,NULL,NULL,NULL))){ writetolog(DXGetErrorString9(hresult)); } }
und hier mal das complette logbuch
parameterliste erfolgreich erstellt
S_OK
S_OK
S_OK
D3DERR_DEVICELOST//ab hier wirds wichig
versuch die device wiederherzustellen
D3DERR_DEVICELOSTnoch irgendwelche tipps?^^
-
hmm, würde er die device verlieren, wenn ich mir bei der adapter/caps auswahl einen groben patzer geleistet hätte?
-
kann durchaus sein
-
IMO erstellt er das Device gar nicht erst, wenn das nicht passt.
-
würde er dann trotzdem sein ok geben?
ich meine, is doch ein leichtes mal nen falschen bildbuffer anzugeben
-
wie nen falschen Bildbuffer? Es geht doch jetzt um das Device.
-
jep, bei createdevice muss man etliche parameter angeben, zb auch den bildbuffer,vielleicht verliert er ja die device, wenn man die grafikkarte vergewaltigt
-
nein, ich denke, dann kriegst du es erst gar nicht. Aber du kannst ja auch einfach mal den InitCode von nem Tutorial kopieren und schauen...
-
eigentlich würds ja reichen die device auf ref zu stellen^^
-
Also ich nehm immer HAL. Funktioniert wunderbar.
-
aber mit ref is man absolut graka unabhängig
so, da ref irgendwie nich klappen wollte(D3DERR_NOTAVAIBLE)
hab ichs nochmal mit hal probiert
folgende einstellungen kamen zum einsatz:D3DPARAM->BackBufferWidth=800; D3DPARAM->BackBufferHeight=600; D3DPARAM->FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT; D3DPARAM->BackBufferFormat=D3DFMT_R5G6B5; D3DPARAM->BackBufferCount=1; D3DPARAM->MultiSampleType=D3DMULTISAMPLE_NONE; D3DPARAM->SwapEffect=D3DSWAPEFFECT_DISCARD; D3DPARAM->hDeviceWindow=NULL; D3DPARAM->Windowed=false; D3DPARAM->EnableAutoDepthStencil=false; D3DPARAM->PresentationInterval=D3DPRESENT_INTERVAL_DEFAULT;
ich glaub, das waren die wichtigsten, und auch die niedrigsten einstellungen die überhaupt gingen
die createdevice methode:hresult=g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,D3DCREATE_MIXED_VERTEXPROCESSING,DirectXParameter.parameter,&g_pD3DDevice);
nunja, klappt immernochnet^^
hab ich vielleicht was vergessen?
-
Und was sagen die debug runtimes dazu?
Bye, TGGC (Der Held ist zurück)