Membuat compiler shader DirectX yang lebih baik daripada Microsoft
- Kisah tentang kondisi kompleks compiler shader DirectX milik Microsoft dan upaya untuk memberikan pengalaman yang lebih baik bagi para pengembang game.
- Untuk mesin Mach, sedang dikembangkan API grafis eksperimental bernama sysgpu, penerus WebGPU, dengan menggunakan Zig, dan direncanakan akan mendukung backend Metal, Vulkan, Direct3D, dan OpenGL.
- Perlu mengompilasi program shader yang dapat digunakan di Direct3D 12.
Sejarah singkat DirectX
- API grafis DirectX menggunakan HLSL sebagai bahasa shading.
- Di masa lalu, sebelum Direct3D 11, compiler bernama
FXC digunakan, tetapi terkenal lambat dan menghasilkan kode yang kurang optimal.
FXC tidak lagi digunakan, dan DXC hadir bersama Direct3D 12
- Bersamaan dengan peluncuran Direct3D 12 dan Shader Model 6.0 (SM6), Microsoft menghentikan FXC dan memperkenalkan compiler baru bernama
DXC.
- DXC adalah fork resmi Microsoft dari LLVM/Clang v3.7, dan perubahan-perubahannya ditandai dengan jelas melalui komentar.
Sarapan driver DirectX: DXBC atau DXIL
- Meski HLSL adalah bahasa pilihan untuk pemrograman Direct3D, GPU pada kenyataannya memiliki beragam arsitektur komputasi dan kebutuhan.
- Microsoft menyediakan API frontend yang ramah pengembang, sementara vendor perangkat keras independen menulis driver yang mengubahnya menjadi bentuk yang paling dekat dengan ISA perangkat keras sebenarnya.
- Dengan hadirnya DirectX 12 dan Shader Model 6.0, format baru bernama DXIL digunakan sebagai pengganti DXBC.
DXIL
- DXIL adalah format resmi yang saat ini digunakan oleh produsen driver DirectX 12.
- Pengembang game menggunakan compiler DXC untuk menghasilkan bytecode DXIL, lalu menyerahkannya ke driver grafis agar diubah menjadi kode mesin nyata yang akan dijalankan pada perangkat keras GPU.
Memodifikasi fork LLVM Microsoft
- Microsoft menyadari bahwa tidak ideal jika produsen driver independen menggunakan format bitcode LLVM tertentu, dan juga mengakui bahwa memelihara fork LLVM bukan hal yang menyenangkan.
- Microsoft mulai mengerjakan integrasi dukungan kompilasi HLSL langsung ke LLVM/Clang.
Tantangan untuk pengembang game, WebGPU, dan lainnya
- Lapisan abstraksi grafis harus menyediakan bahasa shading yang terpadu, dan saat ini sebagian besar implementasi WebGPU menggunakan pendekatan mengompilasi HLSL menjadi DXBC atau DXIL.
Jalan memutar sederhana: SPIR-V
- Vulkan/SPIR-V juga menggunakan pendekatan serupa, dan apakah SPIR-V dioptimalkan atau tidak ditentukan oleh pabrikan GPU.
Menggunakan dxcompiler.dll atau tidak?
- Runtime WebGPU harus memutuskan apakah akan menggunakan compiler HLSL DXC yang baru, atau compiler FXC yang secara resmi sudah dihentikan tetapi memiliki performa dan kualitas generasi kode yang lebih buruk.
Mengapa tidak bisa ditautkan secara statis?
- Fork LLVM Microsoft tidak mendukung penautan statis, dan ini disebabkan oleh kompleksitas sistem build.
Memperkenalkan dxil.dll - blob penandatanganan kode proprietari untuk shader DirectX
dxil.dll tidak dibangun dari source, melainkan bergantung pada blob kode proprietari spesifik platform yang ada di repositori 'open source' Microsoft.
Masalah dukungan platform
- Microsoft hanya mendistribusikan
dxil.dll untuk Windows (x86/arm) dan Linux (x86), dan tidak menyediakan biner untuk macOS atau Linux aarch64.
Ringkasan
- DXC tidak dapat dibangun sebagai pustaka statis, dan memulihkan fungsionalitas LLVM karena adanya blob penandatanganan kode proprietari akan menjadi pekerjaan besar.
- Kompilasi shader offline untuk game lintas platform tidak dapat dilakukan pada pipeline CI macOS atau arm Linux.
Perbaikan sistem build
- Sistem build CMake diubah ke
build.zig untuk mencari cara membangunnya sebagai satu pustaka statis.
Menyelesaikan dependensi pustaka dinamis
- Codebase DXC di-fork dan kode C++ dimodifikasi untuk menghapus dependensi pustaka dinamis.
Menyelesaikan penandatanganan kode proprietari
- Ditemukan cara untuk mengompilasi shader HLSL tanpa bergantung pada
dxil.dll.
Hasil
- Menyediakan pustaka
dxcompiler dan CLI dxc dalam bentuk biner statis yang tidak bergantung pada dxil.dll proprietari.
- Biner untuk macOS, Linux, dan Windows dibangun dalam pipeline CI.
Catatan
- Beberapa biner masih belum dibangun atau diuji, dan ada rencana untuk menggunakan Zig sendiri sebagai bahasa shading, bukan HLSL.
Catatan pribadi
- Dengan nama Stephen, ia beraktivitas secara online untuk membangun mesin Mach setelah memiliki pekerjaan teknis penuh waktu.
- Ia berakar pada FOSS dan percaya bahwa orang harus memiliki alatnya sendiri dan diberdayakan melaluinya.
- Mimpinya adalah membangun Mach untuk semua orang dan mencari nafkah dengan menjual game berkualitas tinggi.
Terima kasih telah membaca
- Silakan lihat machengine.org.
- Pertimbangkan untuk mendukung pengembangan agar lebih banyak pekerjaan bisa dilakukan.
- Bergabunglah ke server Discord Mach.
- Dukung di GitHub.
- machengine.org
Pendapat GN⁺
- Hal terpenting dalam tulisan ini adalah upaya komunitas pengembang untuk mengatasi kompleksitas dan keterbatasan DXC, compiler shader DirectX milik Microsoft.
- Dengan menggunakan Zig, pengembang mesin Mach memperbaiki sistem build DXC dan mengajukan pendekatan baru untuk mengompilasi shader HLSL tanpa bergantung pada
dxil.dll proprietari, sehingga memberi kontribusi penting bagi pengembangan game lintas platform.
- Tulisan ini menekankan pentingnya perangkat lunak open source dan bahwa pengembang harus bisa memiliki serta mengendalikan alat mereka sendiri, sekaligus menunjukkan nilai kolaborasi dan inovasi dalam komunitas teknis.
1 komentar
Komentar Hacker News
Ikhtisar yang sangat bagus tentang kompleksitas kompilasi shader API 3D
Masalah terkait Godot
dxil.dllmilik DirectX Shader Compiler yang didistribusikan bersama Godot.Diskusi tentang distribusi .dll tambahan
dxil.dlldi file instalasinya.dxil.dll.Pertanyaan tentang tanda tangan DXIL.dll
Perubahan DXC terhadap lapisan dan infrastruktur pembuatan kode LLVM
Saran tentang ekosistem Mach
Diskusi tentang SDL_gpu dan SDL3
Pemanfaatan bahasa Zig
Ungkapan terima kasih atas pekerjaan infrastruktur
Penyebutan pelafalan DXIL