Seite 1 von 1

Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Verfasst: 19.08.2015, 01:46
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

Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Verfasst: 19.08.2015, 02:05
von dot
Was hast du für eine Grafikkarte?

Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Verfasst: 19.08.2015, 08:01
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?

Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Verfasst: 19.08.2015, 09:22
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.

Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Verfasst: 19.08.2015, 13:01
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.

Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Verfasst: 19.08.2015, 15:39
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?

Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Verfasst: 25.08.2015, 14:21
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.

Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Verfasst: 25.08.2015, 16:26
von Schrompf
Gute Idee. Check außerdem mal den MEMPOOL - der muss für Hardware-Vertexprocessing auf DEFAULT stehen

Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Verfasst: 26.08.2015, 07:47
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.

Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Verfasst: 26.08.2015, 08:28
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.

Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Verfasst: 26.08.2015, 14:03
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.

Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Verfasst: 26.08.2015, 16:45
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.

Re: Spiel-Mod: Crash mit D3DCREATE_HARDWARE_VERTEXPROCESSING

Verfasst: 27.08.2015, 16:11
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.