PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie arbeitet ein "Software-Shader"


Asmodeus
2004-12-30, 12:22:47
Wenn ich unter OpenGL und GLSL einen Shader schreibe, der für das Feature-Set einer ATI-Karte "zu groß" ist (z.B. zu viele abhängige Texturzugriffe), dann meldet mir der Compiler ja, dass der Fragmentshader nicht in Hardware sondern in Software läuft, und der Vertexshader wird dann auch in Software abgearbeitet, beides dann ja verständlicher Weise extrem langsam (in einer simplen Beispielszene sinkt die Framerate von 600 fps auf 0.52 fps.

Was mich nun interessiert, was bedeutet bei solchen Beispielen eigentlich genau, die Shader laufen im Software-Modus? Und wo werden diese "Software-Shader" abgearbeitet?

Gruss, Carsten

Demirug
2004-12-30, 13:36:07
Von der CPU natürlich.

Asmodeus
2004-12-30, 13:55:28
Von der CPU natürlich.

Ja, nur was läuft dabei genau ab, wie handhabt der Treiber die anfallenden Daten dann anders, als im Hardwaremodus. Wird der Videospeicher der Grafikkarte weiterhin mit benutzt, die Daten werden dann aber aufwendig hin und her kopiert, oder wird alles in den Hauptspeicher übertragen? Und wenn mehrere Shader abgearbeitet werden, einige in Hardware, einige in Software, wo und wie werden die unterschiedlichen Shaderergebnisse dann wieder "zusammengefügt"?

Gruss, Carsten.

Corny
2004-12-30, 13:57:40
genau, in der CPU. Sagt ja der Name eigentlich schon recht schön. Ist im Prinzip nix anderes als Software Rendering bei einem Spiel - das geschiet ja auch in der CPU. Hier wird halt dieser eine Shader nicht von der Grafikkarte gemacht, sondern von der CPU. Das Programm würde dann sogar auf einer Grafikkarte laufen die (bei einem DX9 shader) garkein DX9 unterstüzt.

CPU ist natürlich nicht dafür ausgelegt => das ganze ist verdammt lahm

zeckensack
2004-12-30, 20:21:39
Ja, nur was läuft dabei genau ab, wie handhabt der Treiber die anfallenden Daten dann anders, als im Hardwaremodus. Wird der Videospeicher der Grafikkarte weiterhin mit benutzt, die Daten werden dann aber aufwendig hin und her kopiert, oder wird alles in den Hauptspeicher übertragen? Und wenn mehrere Shader abgearbeitet werden, einige in Hardware, einige in Software, wo und wie werden die unterschiedlichen Shaderergebnisse dann wieder "zusammengefügt"?

Gruss, Carsten.Die Treiber haben schon länger solche Software-Fallbacks, obwohl das kaum notwendig war. Benutze zB mal auf einer Geforce 4Ti glBlendFuncSeparate. NVIDIA verkauft sogar eine pure Software-Implementation als Quadro NVS.

Die Umschaltung kann immer und immer wieder erfolgen, dh die Ergebnisse von Software- und Hardware-Rendering werden von den Treibern sauber zusammengefügt. Das muss IMO bedeuten, dass Software-Rendering ganz regulär in den Framebuffer schreibt.

Coda
2004-12-30, 21:24:33
Und wenn geblendet werden muss? VRAM reads und so...

Asmodeus
2004-12-31, 11:46:51
Ich hätte dann auch noch eine Frage zu den internen Formaten. Wenn es bei ATI im Hardware-Fragmentshader z.B. die Limitierung auf FP24 gibt, läuft der Shader dann im Softwaremodus in FP32 (würde ja eigentlich nix dagegen sprechen)?

Und kann es zu unterschiedlichen visuellen Ergebnissen kommen? Ich hab den Test mal gemacht. Es existieren zwei Fragmentshader, der erste läuft in Hardware, der 2. in Software. Der Unterschied zwischen beiden ist nur ein zusätzliches IF-Statement im 2. Shader, dessen Ergebnis jedoch keine Auswirkung auf das visuelle Ergebnis der Beispielszene hat. Wenn ich nun im Programm in einer feststehenden Beispielszene, zwischen beiden Shadern umschalte, so ist das visuelle Ergebnis auf Pixelebene nicht deckungsgleich. Noch zur Erklärung: Es wird einfach nur ein Quad gerendert auf dem eine Textur mit Alphakanal liegt, über die noch der Alphatest läuft (also kein Blending). Und beim Hardwareshader sind einige Pixel sichtbar, die beim Softwareshader nicht sichtbar sind und umgekehrt. Wie kann es dazu kommen?

Gruss, Carsten.