Einen DirectX-Shader-Compiler bauen, der besser ist als der von Microsoft
- Eine Geschichte über den komplexen Zustand von Microsofts DirectX-Shader-Compiler und die Bemühungen, Spieleentwicklern eine bessere Erfahrung zu bieten.
- Für die Mach-Engine wird mit Zig an einer experimentellen Grafik-API namens sysgpu gearbeitet, einem Nachfolger von WebGPU, die Metal-, Vulkan-, Direct3D- und OpenGL-Backends unterstützen soll.
- Shader-Programme müssen kompiliert werden, damit sie unter Direct3D 12 verwendet werden können.
Eine kurze Geschichte von DirectX
- Die Grafik-API DirectX verwendet HLSL als Shading-Sprache.
- In der Vergangenheit, vor Direct3D 11, wurde ein Compiler namens
FXC verwendet, der berüchtigt langsam war und für die Erzeugung nur wenig optimierten Codes bekannt war.
FXC wird nicht mehr verwendet, und mit Direct3D 12 kam DXC
- Mit der Veröffentlichung von Direct3D 12 und Shader Model 6.0 (SM6) stellte Microsoft
FXC ein und präsentierte einen neuen Compiler namens DXC.
- DXC ist ein offizieller Microsoft-Fork von LLVM/Clang v3.7, wobei Änderungen durch Kommentare klar gekennzeichnet sind.
Was DirectX-Treiber zum Frühstück essen: DXBC oder DXIL
- HLSL ist zwar die bevorzugte Sprache für die Direct3D-Programmierung, tatsächlich verfügen GPUs jedoch über unterschiedliche Compute-Architekturen und Anforderungen.
- Microsoft stellt eine entwicklerfreundliche Frontend-API bereit, und unabhängige Hardwarehersteller schreiben Treiber, die den Code in etwas umwandeln, das der tatsächlichen Hardware-ISA möglichst nahekommt.
- Mit dem Aufkommen von DirectX 12 und Shader Model 6.0 wird anstelle von DXBC ein neues Format namens DXIL verwendet.
DXIL
- DXIL ist derzeit das offizielle Format, das von Herstellern von DirectX-12-Treibern verwendet wird.
- Spieleentwickler erzeugen mit dem DXC-Compiler DXIL-Bytecode und übergeben ihn an den Grafiktreiber, der ihn in den tatsächlichen Maschinencode umwandelt, der auf der GPU-Hardware ausgeführt wird.
Änderungen am Microsoft-LLVM-Fork
- Microsoft ist sich bewusst, dass es nicht ideal ist, wenn unabhängige Treiberhersteller ein bestimmtes LLVM-Bitcode-Format verwenden müssen, und räumt ein, dass die Pflege des LLVM-Forks keine angenehme Aufgabe ist.
- Microsoft hat damit begonnen, die Unterstützung für die HLSL-Kompilierung direkt in LLVM/Clang zu integrieren.
Herausforderungen für Spieleentwickler, WebGPU und mehr
- Grafik-Abstraktionsschichten müssen eine einheitliche Shading-Sprache bereitstellen, und die meisten aktuellen WebGPU-Implementierungen kompilieren HLSL zu DXBC oder DXIL.
Ein einfacher Umweg: SPIR-V
- Vulkan/SPIR-V verwendet einen ähnlichen Ansatz, und ob SPIR-V optimiert wird, entscheiden die GPU-Hersteller.
dxcompiler.dll verwenden oder nicht?
- Eine WebGPU-Runtime muss entscheiden, ob sie den neuen HLSL-Compiler DXC verwendet oder den offiziell eingestellten FXC-Compiler, dessen Performance und Qualität der Codeerzeugung schlechter sind.
Warum nicht statisch linken?
- Microsofts LLVM-Fork unterstützt kein statisches Linken, was auf die Komplexität des Build-Systems zurückzuführen ist.
Einführung von dxil.dll – ein proprietärer Code-Signing-Blob für DirectX-Shader
dxil.dll wird nicht aus den Quellen gebaut, sondern hängt von einem proprietären plattformspezifischen Code-Blob ab, der in Microsofts „Open-Source“-Repository eingebunden ist.
Probleme bei der Plattformunterstützung
- Microsoft verteilt
dxil.dll nur für Windows (x86/arm) und Linux (x86), bietet aber keine Binärdateien für macOS oder Linux aarch64 an.
Zusammenfassung
- DXC lässt sich nicht als statische Bibliothek bauen, und wegen des proprietären Code-Signing-Blobs wäre es eine große Aufgabe, die LLVM-Funktionalität wiederherzustellen.
- Offline-Shader-Kompilierung für plattformübergreifende Spiele ist in macOS- oder ARM-Linux-CI-Pipelines nicht möglich.
Verbesserung des Build-Systems
- Es wird untersucht, wie das CMake-Build-System auf
build.zig umgestellt werden kann, um auf eine einzelne statische Bibliothek zu bauen.
Lösung der Abhängigkeiten von dynamischen Bibliotheken
- Die DXC-Codebasis wurde geforkt und der C++-Code angepasst, um die Abhängigkeiten von dynamischen Bibliotheken zu entfernen.
Lösung für die proprietäre Code-Signierung
- Es wurde ein Weg gefunden, HLSL-Shader zu kompilieren, ohne von
dxil.dll abhängig zu sein.
Ergebnis
- Es werden eine
dxcompiler-Bibliothek und eine dxc-CLI als statische Binärdateien bereitgestellt, die nicht von der proprietären dxil.dll abhängen.
- Binärdateien für macOS, Linux und Windows werden in CI-Pipelines gebaut.
Hinweise
- Einige Binärdateien sind noch nicht gebaut oder getestet, und langfristig ist geplant, anstelle von HLSL Zig selbst als Shading-Sprache zu verwenden.
Persönliche Notiz
- Unter dem Namen Stephen ist der Autor online aktiv, nachdem er eine technische Vollzeitstelle angenommen hat, um die Mach-Engine aufzubauen.
- Er ist in FOSS verwurzelt und glaubt daran, dass man seine Werkzeuge besitzen und dadurch handlungsfähig werden sollte.
- Sein Traum ist es, Mach für alle zu bauen und den Lebensunterhalt durch den Verkauf hochwertiger Spiele zu verdienen.
Danke fürs Lesen
- Schauen Sie bei machengine.org vorbei.
- Erwägen Sie, die Entwicklung zu unterstützen, damit mehr Arbeit möglich wird.
- Treten Sie dem Mach-Discord-Server bei.
- Unterstützen Sie das Projekt auf GitHub.
- machengine.org
Meinung von GN⁺
- Das Wichtigste an diesem Artikel ist das Bemühen der Entwickler-Community, die Komplexität und Grenzen von Microsofts DirectX-Shader-Compiler DXC zu überwinden.
- Der Entwickler der Mach-Engine leistet mit Zig einen wichtigen Beitrag zur plattformübergreifenden Spieleentwicklung, indem er das Build-System von DXC verbessert und einen neuen Ansatz vorstellt, HLSL-Shader ohne Abhängigkeit von der proprietären
dxil.dll zu kompilieren.
- Der Artikel unterstreicht die Bedeutung von Open-Source-Software und dass Entwickler ihre Werkzeuge besitzen und kontrollieren können sollten, und zeigt den Wert von Zusammenarbeit und Innovation in der technischen Community.
1 Kommentare
Hacker-News-Kommentare
Ein hervorragender Überblick über die Komplexität der Shader-Kompilierung für 3D-APIs
Probleme im Zusammenhang mit Godot
dxil.dlldes DirectX Shader Compiler ab, die zusammen mit Godot ausgeliefert wird.Diskussion über die zusätzliche Verteilung von .dll-Dateien
dxil.dllin ihren Installationsdateien.dxil.dllidentisch ist.Frage zur Signatur von DXIL.dll
DXCs Änderungen an LLVMs Codegen-Schicht und Infrastruktur
Rat zum Mach-Ökosystem
mach-sysgpuzu untersuchen, eine vollständige Neuimplementierung von WebGPU, die hauptsächlich vom 17-jährigen Ali Chraghi geschrieben wurde.Diskussion über SDL_gpu und SDL3
Einsatz der Sprache Zig
Dank für Infrastrukturarbeit
Aussprache von DXIL