Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
zfxacc32
Beiträge: 27
Registriert: 05.03.2013, 15:24

Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Beitrag von zfxacc32 »

Hallo,

ich versuche gerade, die Grafik eines älteren Spiels zu verbessern (Direct3D 9).
Da bin ich über D3DCREATE_..._VERTEXPROCESSING gestolpert und dachte mir, gleich die Performance zu verbessern, denn das Spiel nutzt D3DCREATE_SOFTWARE_VERTEXPROCESSING.
Setze ich jedoch D3DCREATE_HARDWARE_VERTEXPROCESSING oder auch D3DCREATE_MIXED_VERTEXPROCESSING, crasht das Spiel, sobald ein Level geladen wird.

Mit dem Debugger konnte ich ein bisschen etwas erkennen, scheinbar geht es um Skeletons und Matrizenrechnerei.

Meine Frage nun: Welche Restriktionen hat das hardware vertexprocessing? Auf irgendetwas von Direct3D kann wohl nicht zugegriffen werden, ich kann mir nur nicht vorstellen, was es sein könnte..

Danke jedenfalls!
MfG
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Beitrag von dot »

Was hast du für eine Grafikkarte?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4852
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Beitrag von Schrompf »

Eigentlich sollte alles stressfrei auf heutigen GPUs laufen, was in alten Spielen in Software gemacht wurde. Du hast nicht zufällig den Code davon da, oder?
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
zfxacc32
Beiträge: 27
Registriert: 05.03.2013, 15:24

Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Beitrag von zfxacc32 »

Grafikkarte: AMD HD6970

Den Code vom Spiel habe ich nicht. Ich habe bloß ein bisschen von den damaligen Entwicklern erfahren.
Es wurde scheinbar sehr viel manuell gemacht (verschiedenste 3D-Berechnungen), aber was genau, ist schwer zu sagen.

Im Endeffekt muss es aber doch am Direct3D API liegen?! Ich frage mich, inwiefern es sich bei hardware vertexprocessing anders verhält, weil das Spiel damit scheinbar nicht klarkommt.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4852
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Beitrag von Schrompf »

Sicher nicht. Speziell DX9 ist so ausgereift und so oft benutzt, dass sicher nicht das eine Spiel plötzlich einen neuen Bug aufdeckt. Da ist es wesentlich wahrscheinlicher, wenn das Spiel irgendeinen Grenzfall absichtlich oder unabsichtlich ausgenutzt hat. Es wird in jedem Fall aber schwer, das Problem zu beheben, wenn Du keinen Sourcecode dafür hast.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Krishty
Establishment
Beiträge: 8236
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Beitrag von Krishty »

Ist es nicht so, dass man mit Software Vertex Shader die Vertex Buffer öfter/anders locken kann weil sie nicht im VRAM liegen?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
zfxacc32
Beiträge: 27
Registriert: 05.03.2013, 15:24

Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Beitrag von zfxacc32 »

Habe dazu nur gefunden, dass VBs/IBs dann nicht mit D3DUSAGE_SOFTWAREPROCESSING erstellt werden dürfen.
Das entfernen des Flags hat aber leider nichts gebracht. Weder das Erstellen noch das Locken von VBs/IBs schlägt nun fehl, trotzdem crasht es an gleicher Stelle.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4852
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Beitrag von Schrompf »

Gute Idee. Check außerdem mal den MEMPOOL - der muss für Hardware-Vertexprocessing auf DEFAULT stehen
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
zfxacc32
Beiträge: 27
Registriert: 05.03.2013, 15:24

Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Beitrag von zfxacc32 »

Tja, ich habe wohl den Übeltäter gefunden: D3DCAPS9::MaxVertexBlendMatrixIndex.
Mit software vertexprocessing ist der Wert 255, mit hardware VP nur 8.
Das Spiel führt eine andere Logik aus, wenn der Wert ((Index + 1) / 2) >= 64 ist.

Ich denke wohl nicht, dass man da was machen kann (also hardware vertexprocessing trotzdem zum Laufen zu bekommen), aber vielleicht fällt euch ja etwas ein.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4852
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Beitrag von Schrompf »

Hm. 8 Matrizen wäre verdammt wenig, selbst jede 10 Jahre alte GPU kann 64. Kannst Du das evtl. einfach faken? Ich habe keine Ahnung, wie genau Du mit DirectX interagierst, wenn Du eigentlich ein Spiel-Mod schreibst. Aber falls Du Dich irgendwie in die D3D-Calls reingehookt hast, könntest Du ja auch einfach diese Anzahl anpassen, wenn das Spiel nach den Caps fragt. Wie gesagt: die Hardware kann *wesentlich* mehr als 8 Matrizen.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
zfxacc32
Beiträge: 27
Registriert: 05.03.2013, 15:24

Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Beitrag von zfxacc32 »

Ja, ich verwende hooks.
Faken habe ich schon versucht, auch wenn es wenig Sinn ergibt, weil es die Grafikkarte dadurch ja trotzdem nicht kann. Ergebnis war fehlende und teils total verzerrte Polygone.

Meine Grafikkarte ist eine HD6970, doch erstelle ich das device mit D3DCREATE_HARDWARE_VERTEXPROCESSING, habe ich danach in MaxVertexBlendMatrixIndex tatsächlich nur 8 stehen.
Benutzeravatar
Krishty
Establishment
Beiträge: 8236
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Beitrag von Krishty »

Hmmm. Also die zehn Jahre alten Karten hier sind von 64 weit entfernt: http://zp.amsnet.pl/cdragan/query.php?d ... er_version

Oh; ich sehe gerade dass es sowohl MaxVertexBlendMatrices als auch MaxVertexBlendMatrixIndex gibt: http://zp.amsnet.pl/cdragan/query.php?d ... escription

Was ist denn da der Unterschied? Wenn eine GPU nur vier Matrizen unterstützt, aber bis Index 57, bedeutet das, dass man nur vier Matrizen setzen darf, aber ruhig beginnend bei Slot 54?

Jedenfalls: Du kannst das Device mit D3DCREATE_MIXED_VERTEXPROCESSING erzeugen, und dann via IDirect3DDevice9::SetSoftwareVertexProcessing Software-Processing für den einen Draw-Call aktivieren, in dem sie 256 Matrizen verwenden.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
zfxacc32
Beiträge: 27
Registriert: 05.03.2013, 15:24

Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Beitrag von zfxacc32 »

Ah, das ist eine gute Idee. Leider funktioniert sie nicht. Selbst wenn ich SetSoftwareVertexProcessing() dauerhaft auf true lasse, die Objekte werden jetzt gar nicht mehr gezeichnet..
Naja, ich werd mich vielleicht irgendwann noch intensiver damit beschäftigen.
Antworten