Wie werden Direct3D- und OpenGL-Anweisungen in einer Grafikkarte gehandhabt?

8

Ich versuche besser zu verstehen, wie GPUs funktionieren, und ich bin verwirrt darüber, wie sie High-Level-APIs wie Direct3D oder OpenGL gehandhabt haben. Es ist sehr üblich Grafikkarten zu sehen, die Werbung für Direct3D und OpenGL Hardwarebeschleunigung machen. Bedeutet das, dass sie Direct3D- und OpenGL-Anweisungen direkt in Hardware behandeln? Ich konnte keine eindeutigen Beweise dafür finden oder zu einer Assembly-Darstellung kompiliert werden, mit der die GPU umgehen kann. Wenn es eine solche Bekehrung gibt, wer macht das? Die Softwarebibliothek (Direct3D / OpenGL), der Treiber oder die GPU selbst? In welcher Zeile ist die Grafikpipeline definiert? in der GPU-Hardware, dem Treiber oder der Softwarebibliothek? Das verwirrt mich besonders mit der Idee programmierbarer Pipelines.

Gibt es eine gute Quelle, wo ich Informationen über diese Details finden kann?

    
cloudraven 15.06.2011, 01:55
quelle

3 Antworten

9

Sie haben eine sehr breite und komplizierte Frage gestellt. Tatsächlich haben Sie mehrere umfassende, komplizierte Fragen gestellt.

Die Software, die den Betrieb einer beliebigen Hardware regelt, wird als "Treiber" der Hardware bezeichnet. Für Grafikhardware wird dies natürlich als "Grafiktreiber" bezeichnet. Wie alle Treiber ist der Grafiktreiber tatsächlich ein installierbarer Teil des Betriebssystems. Das Betriebssystem ermöglicht dem Grafiktreiber, seine Arbeit zu erledigen und mit der Hardware zu kommunizieren. Die beiden arbeiten Hand in Hand.

Es gibt effektiv zwei Arten von D3D- oder OpenGL-Aufrufen (die bisher als "API" bezeichnet wurden): diejenigen, die mit dem Treiber sprechen und solche, die dies nicht tun. Jeder Aufruf, der tatsächlich etwas zeichnet, muss (eventuell) mit dem Treiber sprechen, aber Aufrufe, die später Zeichenaufrufe einrichten, können Daten nur lokal speichern.

Wenn Sie einen Zeichenaufruf ausführen, führt die API einige Überprüfungen durch, um sicherzustellen, dass Sie als Benutzer einen gültigen Rendering-Aufruf ausgeführt haben. Wenn dies der Fall ist, hat die API einige Optionen, was zu tun ist. Es stellt sich heraus, dass das direkte Gespräch mit dem Fahrer sehr lange dauert, unabhängig davon, wie viele Befehle Sie ihm geben, wenn Sie zu sprechen beginnen. Daher passiert es oft, dass die API Ihren Rendering-Aufruf speichert und sofort zurückkehrt. Dann, möglicherweise in einem anderen Thread, kann es aussehen, um zu sehen, wie viele Rendering-Aufrufe gespeichert wurden. Wenn es "genug" gibt, wird es an den Fahrer weitergeleitet. Dies wird als "Marshalling" bezeichnet.

Die Aufgabe des Treibers besteht darin, diese weitergeleiteten Anrufe zu übernehmen und sie in Dinge umzuwandeln, die die GPU tun wird.

  

In derselben Zeile, wo ist die Grafikpipeline definiert? in der GPU-Hardware, dem Treiber oder der Softwarebibliothek?

Das ist heutzutage wirklich eine ziemlich knifflige Frage und wird jede Hardware-Generation kniffliger.

Früher wurde die Konstruktion der Grafik-Pipeline streng von der GPU-Hardware gesteuert. Heutzutage ist das weniger zutreffend, obwohl es eine gewisse Hardware-Kontrolle gibt. Auf moderner Hardware (fähig zu OpenGL 3.0 oder Direct3D10 oder besser) wäre es theoretisch möglich, wenn Sie direkten Zugriff auf den Grafiktreiber hätten, eine API zu entwickeln, die eine etwas veränderte Version der Grafikpipeline verwendet. Daher schreiben die APIs vieles vor, wie die Grafikpipeline aussieht.

Jede Stufe in der Rendering-Pipeline nimmt bestimmte Werte von den wertvollen Stufen als Eingabe und erzeugt eine Anzahl von Werten als Ausgabe. Eine Stufe ist "programmierbar", wenn der Mechanismus zum Erzeugen der Ausgaben von den Eingaben das Ausführen eines vom Benutzer gelieferten Programms, das als "Shader" bezeichnet wird, beinhaltet. Also gibt es (noch) keine programmierbare Pipeline; nur programmierbare Stufen einer festen Pipeline.

    
Nicol Bolas 15.06.2011, 02:53
quelle
7

Es gibt keine D3D- oder OGL-Anweisungen. Direct3D oder OpenGL rufen den Grafiktreiber auf und sie werden alles tun, was sie tun müssen, um dies zu ermöglichen. Dies ist nicht vollständig true von Shadern, die einen einheitlichen Bytecode auf der API (D3D / OGL) Ebene haben, und in diesem Fall stellt die API einen Compiler zur Verfügung, aber das sind, soweit ich wissen, noch vor der Ausführung hardwareseitig transformiert werden. Natürlich enthalten Direct3D und OpenGL auch Komponenten im Benutzermodus, um die Leistung zu verbessern oder eine bessere Oberfläche zu bieten - zum Beispiel werden Aufrufe an den Kernel stapelweise ausgeführt, um Kontextwechsel zu reduzieren.

Die Realität der GPU-Erstellung ist, dass Microsoft und nVidia / ATi zusammenkommen und darüber nachdenken, was sie wollen und was machbar ist, und eine Gruppenspezifikation erstellen, da dies in Wirklichkeit nicht funktionieren würde Hardware- und Softwareanbieter haben nicht kooperiert. Niemand wird eine GPU kaufen, die DirectX nicht unterstützt - und niemand wird Windows kaufen, wo keine GPU DirectX implementiert. Natürlich ist "niemand" relativ - aber es wäre ein großer Verlust für alle Beteiligten. Und wenn Sie ein Spiel haben, das nur auf der D3D10 API basiert, dann ist der Treiber, der D3D10 unterstützt, ein Muss, um das Spiel zu starten - den Wert des Produkts effektiv zu erhöhen, indem die Palette der Software, die es ausführen kann, erhöht wird, was ein Verkaufsargument ist. Dies bedeutet, dass der semantische Unterschied zwischen der Definition durch den Hardwarehersteller oder Softwarehersteller minimal ist, insbesondere, da die einzigen zwei realen 3D-Rendering-APIs auf dem PC, OpenGL und Direct3D, sehr ähnlichen Modellen für die grafische Pipeline folgen Ich weiß.

Mit den neuen programmierbaren Grafikprozessoren könnten Sie jedoch argumentieren, dass die grafische Pipeline nicht wirklich existiert - ein DX11-Gerät kann für jede Grafik-Pipeline verwendet werden, die Sie sich vorstellen können, wenn Sie die Geduld haben, es zu programmieren. p>

Letztendlich ist die GPU durch eine starke Abstraktion auf Treiberebene geschützt. Es implementiert eine Schnittstelle im C-Stil und alles, was in dieser Implementierung erlaubt oder notwendig ist, geht. Alles danach ist vollständig implementiert.

Sie können die MSDN-Dokumentation zum Schreiben eines Grafiktreibers lesen. Ich habe es gesehen, aber keinen Link zur Hand, und es beschreibt die Schnittstellen, die Sie einhalten müssen und andere Dinge.

    
Puppy 15.06.2011 02:25
quelle
3

Sie haben bereits zwei sehr gute Antworten. Aber vielleicht ist das Beste, die eigentliche Programmierdokumentation für AMD / ATI GPUs zu lesen: Ссылка

Leider wird NVidia ihre nicht veröffentlichen.

    
datenwolf 15.06.2011 06:47
quelle