3 puan yazan GN⁺ 2024-02-11 | 1 yorum | WhatsApp'ta paylaş

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

 
GN⁺ 2024-02-11
Hacker News yorumu
  • 3D API shader derlemesinin karmaşıklığına dair harika bir genel bakış

    • API'ler arası 3D shader derlemesinin karmaşık sorunlarına dair bir özet sunuluyor.
    • Odak D3D ve Microsoft üzerinde olsa da, diğer 3D API'lerde de durum pek daha iyi değil.
    • Örneğin Linux ana sisteminde Metal shader'larını cross-compile etmek mümkün değil; bu yalnızca macOS'ta ve yakın zamandan beri Windows'ta yapılabiliyor.
    • Eğer Mach ekibi, "Zig'i API'ler arası 3D shader derleyicisi olarak kullanma" işini başarıp bunu "Zig'i çapraz derleme araç zinciri olarak kullanmak" kadar sorunsuz hale getirebilirse, bu 1995'ten beri bilgisayar grafiklerindeki en büyük olay olur.
  • Godot ile ilgili sorun

    • Direct3D 12 desteği şu anda Godot ile birlikte dağıtılan DirectX Shader Compiler'ın proprieter dxil.dll kütüphanesine dayanıyor.
    • Proprieter yazılım dağıtmak, Godot projesinin misyonuna ters düşüyor.
  • Ek .dll dağıtımı üzerine tartışma

    • Birçok video oyununun zaten kullandığı proprieter middleware'lerde olduğu gibi (Bink, SpeedTree, PhysX vb.), ek .dll dağıtmak olağan dışı bir gereklilik değil.
    • Çoğu oyun başlatıcısı da (Steam, GOG, Epic vb.) kendi .DLL dosyalarını gerektiriyor.
    • Pek çok oyun D3D11On12 kullanıyor ve piyasaya çıkmış birçok oyunun kurulum dosyalarında dxil.dll bulunuyor.
    • Kod imzalamayı tersine mühendislikle çözüp yeniden uygulamış olmaları, özellikle de dxil.dll çıktısıyla bit düzeyinde aynı sonucu verdiği için, gerçekten etkileyici.
    • Ancak daha kolay yolu tercih edenler, basitçe DLL dağıtmayı da seçebilir.
  • 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

    • DXC'nin LLVM fork'u, LLVM'nin kod üretim katmanını ve altyapısını kaldırıyor ya da bozuyor.
    • Bu sorunu düzeltmek ve zarar görmüş LLVM işlevlerini geri kazandırmak muazzam bir iş olur.
    • Kaynak kısıtları nedeniyle yeni DXC derleyicisinde bu sorunu çözme planı yok.
    • Gelecekte Clang'de DXBC üretimi desteklenebilir, ancak çalışma önce DXIL ve SPIR-V üretimini desteklemeye odaklandığından buna birkaç yıl başlanmayacak.
    • Microsoft tarafının beklentileri net biçimde ortaya koyması takdir ediliyor.
  • Mach ekosistemi için tavsiye

    • Özellikle WebGPU'nun tam bir yeniden uygulaması olan ve büyük ölçüde 17 yaşındaki Ali Chraghi tarafından yazılan mach-sysgpu'nun incelenmesi tavsiye ediliyor.
  • SDL_gpu ve SDL3 üzerine tartışma

    • SDL ekibi, SDL3 ile çıkacak SDL_gpu adlı yeni bir shader dili geliştiriyor.
    • Bu, oyunlarda 3D grafiklerle ilgili platformlar arası çalışma yapmanın bir yolunu sunacak.
  • Zig dilinin kullanımı

    • Zig'in doğrudan bir shading dili olarak kullanılması harika olur.
    • Zig gerçek bir dil; aynı zamanda bir build system ve bir shading dili.
  • Altyapı çalışmalarına teşekkür

    • Bu tür altyapı çalışmaları pek çok kapı açtığı için okumak keyif veriyor.
  • DXIL telaffuzu hakkında not

    • DXIL, "dixel" diye telaffuz ediliyor; yani "pixel" kelimesindeki 'p' harfini 'd' ile değiştirmek gibi.