DirectX shader derleyicisini Microsoft’tan daha iyi hale getirmek
- Microsoft’un DirectX shader derleyicisinin karmaşık durumu ve oyun geliştiricilere daha iyi bir deneyim sunma çabaları anlatılıyor.
- Mach motoru için Zig kullanılarak WebGPU’nun halefi olan
sysgpu adlı deneysel bir grafik API’si geliştiriliyor; Metal, Vulkan, Direct3D ve OpenGL arka uçlarını desteklemesi planlanıyor.
- Direct3D 12’de kullanılabilecek shader programlarının derlenmesi gerekiyor.
DirectX’in kısa tarihi
- DirectX grafik API’si, gölgelendirme dili olarak HLSL kullanır.
- Geçmişte Direct3D 11 öncesinde
FXC adlı bir derleyici kullanılıyordu, ancak bunun yavaş olduğu ve yeterince optimize edilmemiş kod ürettiğiyle ün salmıştı.
FXC artık kullanılmıyor; Direct3D 12 ile birlikte DXC geldi
- Direct3D 12 ve Shader Model 6.0 (SM6) ile birlikte Microsoft, FXC’yi bırakıp
DXC adlı yeni bir derleyici sundu.
- DXC, LLVM/Clang v3.7’nin Microsoft tarafından hazırlanan resmî bir fork’udur ve yapılan değişiklikler yorumlarla açıkça işaretlenmiştir.
DirectX sürücülerinin kahvaltıda yediği şey: DXBC veya DXIL
- HLSL, Direct3D programlamasında tercih edilen dil olsa da GPU’lar gerçekte farklı hesaplama mimarilerine ve gereksinimlere sahiptir.
- Microsoft, geliştirici dostu bir frontend API sunar; bağımsız donanım üreticileri ise sürücüler yazarak bunu gerçek donanım ISA’sına en yakın biçime dönüştürür.
- DirectX 12 ve Shader Model 6.0 ile birlikte DXBC yerine DXIL adlı yeni bir format kullanılmaya başlandı.
DXIL
- DXIL, bugün DirectX 12 sürücü üreticilerinin kullandığı resmî formattır.
- Oyun geliştiricileri DXC derleyicisini kullanarak DXIL bytecode üretir, ardından bunu grafik sürücüsüne verir; sürücü de bunu GPU donanımında çalışacak gerçek makine koduna dönüştürür.
Microsoft’un LLVM fork’unda yapılan değişiklikler
- Microsoft, bağımsız sürücü üreticilerinin belirli bir LLVM bitcode formatını kullanmasının ideal olmadığının farkında ve LLVM fork’unu sürdürmenin keyifli olmadığını kabul ediyor.
- Bu nedenle Microsoft, HLSL derleme desteğini doğrudan LLVM/Clang içine entegre etmeye yönelik çalışmalara başladı.
Oyun geliştiriciler, WebGPU ve diğerleri için zorluklar
- Grafik soyutlama katmanlarının birleşik bir shader dili sunması gerekir ve bugün çoğu WebGPU uygulaması HLSL’yi DXBC veya DXIL’e derleme yaklaşımını kullanır.
Basit bir dolambaçlı yol: SPIR-V
- Vulkan/SPIR-V de benzer bir yaklaşım kullanır ve SPIR-V’nin ne kadar optimize edileceğine GPU üreticisi karar verir.
dxcompiler.dll kullanılsın mı, kullanılmasın mı?
- WebGPU çalışma zamanı, yeni DXC HLSL derleyicisini mi yoksa performansı ve üretilen kod kalitesi daha düşük olan, resmen kullanımdan kaldırılmış FXC derleyicisini mi kullanacağına karar vermek zorundadır.
Neden statik olarak linklenemiyor?
- Microsoft’un LLVM fork’u statik linklemeyi desteklemiyor; bunun nedeni derleme sisteminin karmaşıklığı.
dxil.dll ile tanışın: DirectX shader’ları için özel kod imzalama blob’u
dxil.dll, kaynaktan derlenmiyor ve Microsoft’un “açık kaynak” deposundaki bağımlı, özel ve platforma özgü kod blob’larına dayanıyor.
Platform desteği sorunu
- Microsoft yalnızca Windows (x86/arm) ve Linux (x86) için
dxil.dll dağıtıyor; macOS veya Linux aarch64 ikilileri sunulmuyor.
Özet
- DXC statik kütüphane olarak derlenemiyor ve özel kod imzalama blob’u nedeniyle LLVM işlevselliğini geri kazandırmak büyük çaplı bir iş olacak.
- macOS veya arm Linux CI boru hatlarında, çapraz platform oyunlar için çevrimdışı shader derlemesi yapılamıyor.
Derleme sistemi iyileştirmeleri
- CMake derleme sistemi
build.zig’e taşınarak bunun tek bir statik kütüphane olarak nasıl derlenebileceği araştırıldı.
Dinamik kütüphane bağımlılığını çözmek
- DXC kod tabanı fork’landı ve C++ kodu değiştirilerek dinamik kütüphane bağımlılıkları kaldırıldı.
Özel kod imzalama sorununu çözmek
dxil.dll’e bağımlı olmadan HLSL shader’larını derlemenin bir yolu bulundu.
Sonuç
- Özel
dxil.dll’e bağlı olmayan statik ikili dxcompiler kütüphanesi ve dxc CLI sağlandı.
- macOS, Linux ve Windows için ikililer CI boru hattında derleniyor.
Dikkat edilmesi gerekenler
- Bazı ikililer henüz derlenmiş veya test edilmiş değil; ayrıca HLSL yerine gölgelendirme dili olarak doğrudan Zig’in kullanılması planlanıyor.
Kişisel not
- Yazar, Stephen adıyla tam zamanlı bir teknik işte çalıştıktan sonra Mach motorunu inşa etmek için çevrimiçi faaliyet göstermeye başladı.
- FOSS köklerinden geliyor ve insanların kendi araçlarına sahip olması ve bu araçlar sayesinde güç kazanması gerektiğine inanıyor.
- Hayali, Mach’i herkes için geliştirmek ve yüksek kaliteli oyunlar satarak geçimini sağlamak.
Okuduğunuz için teşekkürler
machengine.org sitesine göz atın.
- Daha fazla çalışma yapabilmek için geliştirmeyi desteklemeyi değerlendirin.
- Mach Discord sunucusuna katılın.
- GitHub üzerinden sponsor olun.
machengine.org
GN⁺ görüşü
- Bu yazının en önemli noktası, Microsoft’un DirectX shader derleyicisi DXC’nin karmaşıklığını ve sınırlamalarını aşmaya çalışan geliştirici topluluğunun çabası.
- Mach motoru geliştiricisi, Zig kullanarak DXC’nin derleme sistemini iyileştirip özel
dxil.dll’e bağımlı olmadan HLSL shader’larını derlemeye yönelik yeni bir yaklaşım sunarak çapraz platform oyun geliştirmeye önemli bir katkı sağlıyor.
- Yazı, açık kaynak yazılımın önemini ve geliştiricilerin kendi araçlarına sahip olup onları kontrol edebilmesi gerektiğini vurgularken, teknik topluluk içindeki işbirliği ve yeniliğin değerini de gösteriyor.
1 yorum
Hacker News yorumu
3D API shader derlemesinin karmaşıklığına dair harika bir genel bakış
Godot ile ilgili sorun
dxil.dllkütüphanesine dayanıyor.Ek
.dlldağıtımı üzerine tartışma.dlldağıtmak olağan dışı bir gereklilik değil..DLLdosyalarını gerektiriyor.dxil.dllbulunuyor.dxil.dllçıktısıyla bit düzeyinde aynı sonucu verdiği için, gerçekten etkileyici.DXIL.dll imzası hakkında soru
DXIL.dll'in yaptığı imzalama sadece değiştirilmiş bir MD5 mi?LLVM'nin kod üretim katmanı ve altyapısı üzerindeki DXC değişiklikleri
Mach ekosistemi için tavsiye
SDL_gpu ve SDL3 üzerine tartışma
SDL_gpuadlı yeni bir shader dili geliştiriyor.Zig dilinin kullanımı
Altyapı çalışmalarına teşekkür
DXIL telaffuzu hakkında not