Ich schreibe ein kleines Dienstprogramm, das Systemfunktionen meldet. Eines ist das höchste Shader-Modell, das von der installierten Grafikkarte unterstützt wird, und ich erkenne dies derzeit mithilfe der Gerätefunktionen von Direct3D 9.0c und überprüfe die Felder VertexShaderVersion
und PixelShaderVersion
der Struktur D3DCAPS9
.
HRESULT hrDCaps = poD3D9->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &oCaps); if (!FAILED(hrDCaps)) { // Pixel and vertex shader model versions. Use the minimum number of each for "the" shader model version const int iVertexShaderModel = D3DSHADER_VERSION_MAJOR(oCaps.VertexShaderVersion); const int iPixelShaderModel = D3DSHADER_VERSION_MAJOR(oCaps.PixelShaderVersion);
Beide Werte geben jedoch Shader Model 3 auch für Karten zurück, die höhere Modelle unterstützen. Hier ist, was GPU-Z zum Beispiel für dieselbe Karte zurückgibt:
Diese Frage zeigt an, dass DX9 selbst auf Karten, die ein höheres Modell unterstützen, niemals mehr als SM3 meldet, aber nicht erwähnt, wie es zu lösen ist.
Wie erhalte ich genau das Shader-Modell, das von der installierten Karte unterstützt wird? Das heißt, die Kartenfunktionen, nicht die installierten DirectX-Treiberfunktionen.
Das Dienstprogramm muss unter Windows 2000 und höher ausgeführt werden und auf Systemen funktionieren, auf denen keine Grafikkarte und nicht einmal DirectX installiert sind. Ich lade derzeit dynamisch DX9, daher schlägt die Überprüfung auf diesen Systemen ordnungsgemäß fehl (was in Ordnung ist.), aber ich suche eine ähnliche Lösung: Etwas, das immer noch auf allen Systemen läuft und auf den meisten Systemen korrekt funktioniert (die SM-Version erkennt).
Bearbeitungszweck: Ich verwende diesen Code nicht, um Funktionen eines Programms dynamisch zu ändern, dh Shader auszuwählen. Ich verwende es, um Hardwarefunktionen als ‚Ping‘ an einen Server zu melden, Mit dem wir eine gute Vorstellung von typischer Hardware haben, die unsere Kunden verwenden, was zukünftige Produktentscheidungen beeinflussen kann. (Beispielsweise: wie viele kunden haben SM4 oder höher? Wie viele verwenden ein 64-Bit-Betriebssystem? Etc.) Aus diesem Grund sind entweder (a) ein fehlerhafter Fehler, sodass wir wissen, dass er fehlgeschlagen ist, oder (b) das Erhalten einer genauen Shader-Modellnummer die beiden bevorzugten Modi.
Bearbeiten – bisherige Antworten: Die folgende Antwort von SigTerm schlägt vor, DirectX 11, 10.1, 10 und 9.0c der Reihe nach zu instanziieren und das gemeldete Shader-Modell darauf zu stützen, welche Version ohne Fehler instanziiert wurde (Shader-Modell 5, 4.1, 4 und DXC) in dieser Reihenfolge.) Wenn möglich, würde ich mich über ein Codebeispiel für DX11 und 10 Möglichkeiten freuen.
Dies ist möglicherweise keine zuverlässige Lösung. Zum Beispiel verwende ich Windows auf einer virtuellen VMware Fusion-Maschine unter OSX. Die Fusion-Treiber melden DX11 in DxDiag, aber ich weiß aus den Fusion-technischen Daten, dass es nur DX9.0c und Shader Model 3 unterstützt. Mit dieser Ausnahme scheint diese Methode bisher der beste Weg zu sein.