Grafiktreiber “Hello World” Beispiel? [closed]

Lesezeit: 7 Minuten

Benutzer-Avatar
Lanze

Welche Schritte sind erforderlich, um einen GPU-Treiber zu erstellen, der Pixel auf einem Display rendert? Im Grunde nur das einfachste „Hallo Welt“-Beispiel zum Erstellen eines GPU-Treibers, z. B. den Bildschirm rot färben oder nur ein einzelnes Pixel anzeigen. Wo fängst du an?

Ich würde gerne direkt auf die GPU hacken, ohne C- oder OpenGL-Abstraktion oder dergleichen. Ich verwende Mac OSX, und ich glaube, ich habe die Intel HD i7-Grafikkarte, also diese Dokumente schien gut zu passen:

Das Mesa3D-Projekt sagt, dass es eine Reihe von Open-Source-Grafiktreibern gibt, und Wikipedia sagt, dass Intel diese Dokumente erstellt, damit Sie einen Open-Source-Treiber schreiben können, wenn Sie möchten, aber erklären Sie nicht, wie.

Ich bin auch darauf gestoßen Michael Abrashs Schwarzbuch zur Grafikprogrammierungwas einiges erklärt.

Allerdings ist das ein bisschen viel auf einmal abzubeißen. Und es scheint keine Informationen darüber zu geben, wie man mit dem Hacken eines GPU-Treibers, einem „Hello World“-Projekt, beginnen kann.

Zum Beispiel:

  • Um Montage zu lernen, können Sie einfach brew install nasmschreiben Sie eine Assembly, kompilieren Sie sie und führen Sie sie aus, um “Hallo Welt” zu drucken.
  • Um Arduino zu lernen, können Sie ein Arduino-Board über ein USB-Kabel an Ihren Computer anschließen, die Software installieren und C-Code direkt auf das Board hochladen und ausführen, um ein blinkendes LED-Licht anzuzeigen.

Wie macht man sowas bei der Grafikkarte?

Das Hallo-Welt-Beispiel muss nicht unbedingt funktionieren (obwohl es cool wäre, wenn es funktionieren würde!); Es wäre hilfreich, nur zu skizzieren, was in einem höheren/praktischen Sinne erforderlich wäre. Wenn es auf einem Mac oder sogar unter Linux nicht möglich ist, wäre das gut zu wissen. Aber selbst dann bleibt die Frage, wo fängt man an, einen Grafiktreiber zu schreiben?

  • Es hängt davon ab, auf welche Plattform Sie abzielen. Sind Sie froh, nur eine Grafikausgabe in einen Puffer zu haben, die Sie dann in eine Datei ausgeben können, aber keine tatsächliche Anzeigeausgabe? (Anzeige und Grafik sind getrennte Dinge). Für keine Anzeigeausgabe können Sie einfach einen primitiven ioctl-Treiber schreiben, der die GPU-Register angreift und zunächst die grundlegenden Operationen ausführt. Sie können wahrscheinlich einfach einen riesigen Speicherblock statisch zuweisen, um damit zu spielen, sodass Sie keine Zeit für die Speicherverwaltung aufwenden müssen. Es gibt nicht wirklich einen Hallo-Welt-Treiber, imo, ein Treiber hat viele Anforderungen, nur um ein Pixel zu machen oder zu löschen.

    – djgandy

    8. Januar 2015 um 11:47 Uhr

  • Haben Sie das „Hallo Welt“-Beispiel gefunden? Ich wäre sehr interessiert. Vielen Dank.

    – Yakumo Fujii

    21. April 2017 um 14:12 Uhr

  • Vielleicht Dies nützt etwas.

    – Lanze

    8. Dezember 2019 um 23:57 Uhr

  • Schritt 1: Verstehen Sie die bestimmte GPU, auf die Sie abzielen (Architektur, Registrierung und Stream-Details). Ich befürchte, dass diese Details für viele der GPUs proprietär sein könnten und Sie sie möglicherweise nicht erhalten. (Aber wie Sie bereits erwähnt haben, sind in Ihrem Fall Spezifikationen verfügbar)
  • Schritt 2: Fügen Sie Ihrem Treiber einige Aufrufe hinzu, die Register / Details vom Treiber abfragen können.
  • Schritt 3: Fügen Sie Ihrem Treiber einige Aufrufe hinzu, um Register zu ändern. (Modus ändern usw.)
  • Schritt 4: Sie können überprüfen, wie Sie ein Dreieck / Quad auf Ihrer GPU mit einer konstanten Farbe zeichnen. Versuchen Sie, den Bildschirm zu löschen (Funktionalität ähnlich wie glKlar), indem Sie ein großes Viereck oder 2 Dreiecke oder 1 Dreieck mit der doppelten Größe des Bildschirms zeichnen oder einen eindeutigen Befehl senden. (je nachdem, welche Methode von der GPU unterstützt wird) Wenn Sie ein Dreieck oder Quad zeichnen, verwenden Sie das NDC-System (normalisierte Gerätekoordinaten) und arbeiten Sie lieber im Raw-Fenstersystem oder NWS (Null-Fenstersystem). Das Windowing-System ist für die Anzeige Ihres Ausgabe-Framebuffers nach dem Compositing oder einer gewissen Nachbearbeitung verantwortlich. Mit Raw oder NWS meine ich die Anzeige des Framebuffers direkt auf dem Bildschirm.
  • Schritt 5 (die meisten Dinge sind optional): Implementieren Sie eine komplexe Zeichnung. Dies kann die Unterstützung anderer Zeichenmodi wie Pixel, Linie, dreieckiger Streifen, dreieckiger Fächer usw. und die Unterstützung von Textur, Beleuchtung, Transformation und Interaktion mit anderen Fenstersystemen beinhalten. Für diesen Schritt müssen Sie die Montage lernen. Beachten Sie jedoch, dass dies keine x86- oder ARM- (CPU-) Baugruppe ist, sondern eine GPU-Baugruppe, die auf die Handhabung spezialisiert ist SIMD.
  • Schritt 6: Schablonenfunktionalität implementieren. Bereiten Sie eine Schablone von Hello World in Ihrem Programm vor. Löschen Sie den Bildschirm mit Farbe 1. Wenden Sie die Schablone an und löschen Sie den Bildschirm erneut mit Farbe 2. Jetzt haben Sie Hallo Welt in Farbe 2 mit Farbe 1 als Hintergrund geschrieben.

Die Motivation, dies alles zu tun, ist: Sie wollen dies tun. Und das wird cool.

Demotivation dazu ist: Mögliche Nichtverfügbarkeit von GPU-Spezifikationen, Lernkurve für GPU-Montage, Komplexität der Grafik.

Meine Empfehlung: Wenn Ihnen GPU-Spezifikationen (zusammen mit Assembly) zur Verfügung stehen, würde ich vorschlagen, beispielsweise eine Teilmenge eines verfügbaren API-Sets (open vg und open GLES 1.1) zu implementieren. Um mehr über diese API-Sets zu erfahren, besuchen Sie bitte Chronos Webseite.

  • Vielen Dank! Können Sie auf die Schritte 2-4 näher eingehen? Wenn Sie sagen “Fügen Sie Ihrem Treiber einige Aufrufe hinzu, die Register abfragen können”, bis zu “Dreieck / Viereck zeichnen”, wie würde das aussehen? Ist es nur eine Montage (z Dies), die ich auf der Kommandozeile kompilieren kann? Wenn ja, scheinen die spezifischen GPU-Assembly-Befehle wahrscheinlich in den obigen Intel-Dokumenten zu sein, oder? Oder wenn es nicht Assemblierung ist, was ist es genau – muss ich Hardware manuell verkabeln oder kann ich das alles von der Befehlszeile aus machen?

    – Lanze

    7. Januar 2015 um 5:30 Uhr


  • Das Abfragen vieler Register erfordert keine Assemblerkenntnisse. Nur um interne (als bezeichnete) Register (von Registerbanken) abzufragen, sind Assemblerkenntnisse erforderlich, die Sie jedoch kaum benötigen. Dieser Schritt dient nur dazu, sicherzustellen, dass wir das (GPU-)Gerät lesen können. Dadurch wird sichergestellt, dass Sie verstehen, wie die GPU an den Bus usw. angeschlossen ist. Sie müssen das Gerät nicht manuell verkabeln, aber ja, wenn ein Simulator für den Treiber verfügbar ist, kann es hilfreich sein (um alle Risiken zu beseitigen), um das zu verstehen Gerät besser verstehen.

    – Mohit Jain

    7. Januar 2015 um 5:46 Uhr

  • Sobald Sie in der Lage sind, Register zu lesen/schreiben, müssen Sie aus der Dokumentation lernen, wie Sie den Bildschirm löschen (Output FBO). Abhängig von der GPU kann diese Methode das Zeichnen eines Quads der Bildschirmgröße, das Senden eines klaren Befehls, das Zeichnen von zwei Dreiecken auf dem Bildschirm oder das Zeichnen eines großen Dreiecks sein, das den gesamten Bildschirm einnehmen kann. (base = screen_width * 2 und height = screen_height) ist das kleinste solche Dreieck. Sobald Sie in der Lage sind, den Bildschirm zu löschen oder ein Dreieck mit der gewünschten Farbe auf den Bildschirm zu zeichnen, können Sie jede gewünschte 3D-Zeichnung erstellen.

    – Mohit Jain

    7. Januar 2015 um 5:50 Uhr

  • Oh Mann, das ist so aufregend, ich fühle mich wie ich bin fast Verständnis. Ein Schlüsselstück fehlt mir allerdings noch. Was muss ich als allererstes taktil tun, um Register zu lesen/schreiben? Muss ich eine Art Code schreiben, diesen Code dann mit einem bestimmten Programm kompilieren und über die Befehlszeile ausführen? Wenn ja, um was für einen Code handelt es sich? Das ist das fehlende Stück für mich nach allem anderen, was Sie geschrieben haben, was sehr hilfreich war. In der Hoffnung, dies auf einem niedrigeren Niveau als C zu tun.

    – Lanze

    8. Januar 2015 um 3:25 Uhr


  • Es hängt davon ab, wie Ihre GPU auf dem Bus platziert ist. Ihre GPU-Register würden entsprechend in Ihrem CPU-Adressraum abgebildet. Ich habe noch nie Treiber für MAC geschrieben, aber unter Linux, wenn das Gerät eine logische Adresse hat, können Sie die Adresse auf einen flüchtigen Zeiger in Ihrem Treiber dereferenzieren und direkt schreiben. Ansonsten eine richtige Wahl outp oder write oder Geräteadresse auf virtuelle Adresse abbilden und dann in den erforderlichen Register-Offset von der GPU-Basis schreiben, funktioniert unter Linux. Mac mit der ähnlichen Kernel-Architektur sollte auf diese Weise funktionieren, aber Sie müssten mehr darüber erfahren, wie grundlegende Treiber in MAC geschrieben werden.

    – Mohit Jain

    8. Januar 2015 um 5:03 Uhr

1370320cookie-checkGrafiktreiber “Hello World” Beispiel? [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy