Direct3D Adapter- und Output-Informationen per DXGI laden

Device-OverviewEine einfache Aufgabe, die man gerne vergisst, wenn man mit Direct3D arbeitet. Für gewöhnlich arbeitet man mit dem Adapter (=Grafikkarte), welcher als Standard am Rechner eingestellt ist. Dies ist nämlich der Fall, wenn bei allen Initialisierungs-Methoden nicht explizit angegeben wird, welcher Adapter verwendet werden soll bzw. der Standard-Adapter mit Index 0. Aber was ist, wenn mehrere Grafikkarten im Rechner stecken, über die mehrere Monitore (>2) angebunden sind? Was ist, wenn der Software-Renderer (WARP) verwendet werden soll? In diesem Beitrag beschreibe ich ein Beispielprogramm, welches per DXGI (DirectX Graphics Infrastructure) alle verfügbaren Adapter ermittelt und in einer WPF-Oberfläche einige Informationen dazu anzeigt.

Was ist DXGI?
Zunächst ein paar allgemeine Worte zu DXGI: Es handelt sich um eine API, die vom Ansatz her als Bindeglied zwischen verschiedenen Grafik-APIs wirkt (z. B. Direct3D11, Direct3D10, Direct2D, …). Über DXGI ist es etwa möglich, Texturen oder andere Ressourcen gemeinsam über verschiedene APIs oder Device-Objekte hinweg zu verwenden. Auch Thread- oder Prozess-Grenzen können per DXGI überwunden werden. Für dieses Beispiel wird aber etwas anderes genutzt: Über DXGI können allgemeine Infos zur verfügbaren Hardware abgegriffen werden.

Wie ermittelt man alle verfügbaren Adapter?
Die Ermittlung aller Adapter ist grundsätzlich relativ einfach. Über DXGI ist es möglich, einfach über alle Adapter zu schleifen. Aber Achtung: Auf manchen Rechnern taucht so der Software Renderer (WARP) nicht auf. Aus diesem Grund ist es eine bessere Methode, den WARP-Adapter explizit über die Direct3D11-Schnittstelle anzulegen und sich daraus die Adapter-Informationen zu ziehen. Nachfolgend ein Code-Beispiel.

Die Klasse EngineDevice ist eine Hilfsklasse von mir, welche sich schließlich alle Informationen aus dem Adapter-Objekt zieht und zusätzlich die Device-Instanzen für die verschiedenen DirectX-Schnittstellen anlegt. Aus dem Adapter-Objekt bekommt man nun Informationen wie Hersteller-ID, Name des Adapters, Speicherausstattung usw. heraus.

Wie ermittelt man alle verfügbaren Outputs?
Weiterhin eine sinnvolle Information ist auch, welche Outputs (=Monitore) an welchen Adaptern angeschlossen sind. Diese Info bekommt man, wenn man wie folgt an einem Adapter über alle Outputs schleift.

Von einem Output bekommt man z. B. den Namen, die verwendete Auflösung, ob auf ihm ein Desktop angezeigt wird, …. Nachfolgend ein paar Eigenschaften, die ich im Beispielprogramm auslese.

Das war es eigentlich schon, mehr steckt nicht dahinter. Auf Grundlage dieser Informationen kann man nun besser steuern, auf welchem Adapter das Rendering läuft. Sinnvoll kann auch sein, den zu verwendenden Adapter durch den Benutzer auswählen zu lassen.

Quellcode
https://www.rolandk.de/files/Testing.GraphicsAdapterOverview.zip

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.