PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Noob-Frage zur Funktionsweise


grakaman
2004-11-08, 14:49:52
Hallo ihr Grafik-Gurus

Ich habe da mal eine Frage zur Funktionsweise von Hardwarebeschleunigungen. Eigentlich trifft das dann wohl auch für andere Dinge zu (Soundkarte etc.). Wie genau teilt denn die CPU der Grafikkarte mit, dass sie jetzt Daten (Shader etc.) berechnen soll. Ich habe dazu wenig Infos gefunden, kann mir aber schon vorstellen, dass dazu die CPU mittels des Steuerbus Daten vom Codesegment in den Grafikkarten-RAM kopiert und durch irgend einen HW Interrupt + Funktionsnummer dann die Anweisung der GPU gibt, die Verarbeitung zu starten. Wie gesagt, ich bin auf dem Bereich leider Noob und suche ein paar Infos, um das zu ändern. Sind dann heutige Grafikkarten auch so ähnlich aufgebaut, wie eine CPU? D.h. die GPU liest dann Daten aus dem Codesegment vom Grafikkartenspeicher und führt die Operationen aus?
Danke im voraus.

Xmas
2004-11-08, 22:00:34
Also vom Codesegment werden sicher keine Daten in den Grafikspeicher kopiert. Das Codesegment sollte einzig und allein ausführbaren Code für die CPU beinhalten. ;)

Mir scheint du interessierst dich eher für die Low-Level-Arbeitsweise. Leider sind präzise Angaben dazu den Chipherstellern vorbehalten, und da sowieso über API und Treiber mehrere Abstraktionslayer durchschritten werden, braucht man als Anwendungsprogrammierer davon nichts zu wissen. Aus Datenblättern zu Chips der ersten und zweiten Generation kann man leider auch nicht viel entnehmen, da sich die Abstraktionsstruktur geändert hat.

Generell kann man aber sagen, dass die API aus einzelnen Funktionsaufrufen Kommandopakete schnürt, die der Treiber zu hardwarespezifischen Kommandos umsetzt. Außerdem sorgt der Treiber für das Grafikspeichermanagement, also auch dafür, dass die notwendigen Ressourcen (Texturen, Vertex Buffer, usw.) im Grafikspeicher liegen. Im Bedarfsfall werden diese aus dem Hauptspeicher per DMA transferiert. Die passenden Adressen werden in den Kommandopaketen verwendet, so enthielte ein Befehl "Rendere Dreiecke" auch die Adresse des Vertexbuffers im VRAM, einen Offset sowie Anzahl der zu verarbeitenden Eckpunkte. Diese Kommandos werden in einen reservierten Command Buffer im Grafik-RAM geschrieben, welcher als Ringpuffer angelegt sein könnte. Das könnte man etwa als Codesegment bezeichnen. Startadresse, aktuelle Adresse und Größe werden in Registern gespeichert, die über I/O-Ports zu erreichen sind.

Interrupts dienen zur Unterbrechung der CPU-Verarbeitung, und werden z.B. gebraucht, wenn der Command Buffer leer läuft, oder durch einen bestimmten Befehl im Command Buffer ausgelöst, womit der Treiber ermitteln kann wie weit die GPU mit den Berechnungen schon ist.

Botcruscher
2004-11-08, 22:10:48
Such doch mal nach Assembler. Aber ich warne dich schon jetzt, Maschienensprache (Assemblerprogrammierung) ist sehr schwierig.

grakaman
2004-11-09, 00:31:13
Hallo Xmas


Interrupts dienen zur Unterbrechung der CPU-Verarbeitung, und werden z.B. gebraucht, wenn der Command Buffer leer läuft, oder durch einen bestimmten Befehl im Command Buffer ausgelöst, womit der Treiber ermitteln kann wie weit die GPU mit den Berechnungen schon ist.

Mmmhm, in Assembler gibt es doch aber auch Software Interrupts, wo das Programm angehalten wird und ein entsprechendes Unterprogramm ausgeführt wird. Zur Textausgabe wird doch iirc auch int21h + Funktionsname benutzt???! So in der Art stelle ich mir das halt vor. Ich weiß auch nicht warum ichs mit meinen Interrupts habe, aber das ist mir halt so auf Anhieb eine logische Erklärung. Dann könnte ja D3D oder OGL die Interrupts, ja für die verschiedenen Grakatreiber abstrahieren?!
Ansonsten bin ich auch für Links zu Quellen froh, wo das vielleicht ansatzweise erklärt wird.

MfG

aths
2004-11-09, 12:13:14
Ich weiß auch nicht warum ichs mit meinen Interrupts habe, aber das ist mir halt so auf Anhieb eine logische Erklärung. Dann könnte ja D3D oder OGL die Interrupts, ja für die verschiedenen Grakatreiber abstrahieren?!
Ansonsten bin ich auch für Links zu Quellen froh, wo das vielleicht ansatzweise erklärt wird.Warum sollte die Arbeit der Grafikkarte unterbrochen werden, um Dinge zu tun? Textausgabe via MS-DOS-Interrupt nutzt das Betriebssystem, welches auf der CPU läuft, der Grafiktreiber läuft allerdings auch auf der CPU (und nicht GPU.) Grafikkarten sind (oder verhalten sich wie) immediate render, also tun alles sofort.

grakaman
2004-11-09, 14:47:08
Warum sollte die Arbeit der Grafikkarte unterbrochen werden, um Dinge zu tun? Textausgabe via MS-DOS-Interrupt nutzt das Betriebssystem, welches auf der CPU läuft, der Grafiktreiber läuft allerdings auch auf der CPU (und nicht GPU.) Grafikkarten sind (oder verhalten sich wie) immediate render, also tun alles sofort.

Na ich weiß nicht, aber irgendwie muss doch der Programmlauf und die 3D Berechnungen synchronisiert werden bzw. geordnet ablaufen?!

aths
2004-11-09, 15:07:32
Na ich weiß nicht, aber irgendwie muss doch der Programmlauf und die 3D Berechnungen synchronisiert werden bzw. geordnet ablaufen?!Ja. Die Anwendung befielt der Graka, was sie machen soll (der Treiber setzt das dann um.)

Also erst mal ein paar Dinge einstellen um den Framebuffer zu definieren (Auflösung, Farbtiefe, Löschfarbe) gleiches für den Z-Buffer, dann wird gerendert (er bekommt die notwendigen Daten oder legt Vertexdaten in einem Vertexbuffer ab und sagt dann nur noch rendere Buffer Nr. so und so.) Am Ende vertauscht er die Back- mit der Framebufferadresse und das nächste Frame wird gerendert.

Du kannst mal googeln, wie (sehr simple!) OpenGL-Programme aussehen.

Xmas
2004-11-09, 15:51:38
Hallo Xmas



Mmmhm, in Assembler gibt es doch aber auch Software Interrupts, wo das Programm angehalten wird und ein entsprechendes Unterprogramm ausgeführt wird. Zur Textausgabe wird doch iirc auch int21h + Funktionsname benutzt???! So in der Art stelle ich mir das halt vor. Ich weiß auch nicht warum ichs mit meinen Interrupts habe, aber das ist mir halt so auf Anhieb eine logische Erklärung. Dann könnte ja D3D oder OGL die Interrupts, ja für die verschiedenen Grakatreiber abstrahieren?!
Ansonsten bin ich auch für Links zu Quellen froh, wo das vielleicht ansatzweise erklärt wird.

MfG
Solche Software-Interrupts sind lediglich eine Möglichkeit, Anwendungen eine API zur Verfügung zu stellen. Heute lädt ein Programm üblicherweise eine DLL und bekommt Funktionspointer, um über die API kommunizieren zu können.
BIOS und DOS kennen DLLs nicht, und statt Funktionspointern hat man nur eine Interrupt- und evtl. eine Funktionsnummer, die man in ein bestimmtes Register schreiben muss. Mit der Hardware hat dies aber eigentlich nichts zu tun.