SDL3'ün yeni GPU API'si birleştirildi
(github.com/libsdl-org)- SDL3'ün yeni GPU API PR'ı #9312, 29 Ağustos 2024'te birleştirildi; SDL 3.0 yaklaşırken daha fazla inceleme alabilmek için Refresh tabanlı yaklaşımın hızlıca öne çıkarıldığı bir süreç izlendi
- Öneri, MoonWorks'ün grafik bileşeni Refresh'i SDL_gpu için nihai API adayı olarak benimseyen bir yapıdaydı; Vulkan ve PS5 grafik API'sini destekliyordu, D3D11 deferred context desteği de sürüyordu
- API tasarımı, işleri render pass, compute pass ve copy pass olarak ayıran modern bir render modeli kullanıyor; kaynak yazma işlemleri ise kareler arası bağımlılıkları önlemek için dahili olarak cycle edilebilecek şekilde kurgulanmış
- Shader tarafında, ilk çevrimdışı derleme odaklı öneri, çalışma zamanında shader üretimini desteklemeyi doğrulayan bir yöne kaydırıldı; SDL'in kendi içinde bir shader derleyicisini sarmalaması yerine, backend'e özgü IR formatlarını alan bir yapı tartışıldı
- Birleştirmenin hemen ardından API fonksiyon adları, derleme yapılandırma makroları, UTF-8 BOM ve D3D12 swapchain'deki 60 FPS sınırı gibi konularda ek düzenlemeler yapıldı; thatcosmonaut'a commit yetkisi de eklendi
PR'ın başlangıç noktası ve birleştirilme durumu
- PR #9312, SDL_gpu'nun hızlıca incelenmesini sağlamak için sunulan yeni GPU API önerisi olarak başladı
- SDL 3.0 yaklaşırken amaç, hızlıca “daha fazla göz” toplamak oldu
- 29 Ağustos 2024'te
It's mergeddoğrulamasının ardından birleştirildi
- Birleştirmenin hemen sonrasında, kısa süreliğine değişiklikleri durdurup inceleme ve ayarlamaların yapılması yönünde bir talep geldi
- Sonrasında durum
everything is mergedhaline geldi ve GPU tarafındaki değişikliklerin yeniden birleştirilebileceği belirtildi - thatcosmonaut, gelecek değişiklikleri büyük olasılıkla inceleyecek kişi olduğu için commit yetkisi verilenler arasına eklendi
- Sonrasında durum
Refresh tabanlı API adayı
- Önerinin merkezinde, MoonWorks'ün grafik bileşeni Refresh'i SDL_gpu için nihai API adayı yapmak vardı
- MoonWorks, FNA gibi XNA'yı yeniden uygulamaktan ziyade, XNA'nın devamı niteliğinde bir proje olarak tanıtıldı
- Refresh, FNA3D'ye benziyor ancak Vulkan gibi modern API'leri hedefliyor
- O sırada Refresh, Vulkan ve PS5 grafik API'sini destekliyordu
- D3D11 deferred context desteği üzerinde çalışılıyordu
- PC ve konsollarda Samurai Gunn 2'de üretimde kullanıldığı belirtildi
- PR yazarı, başlıca iletişim kişisi olarak thatcosmonaut'u gösterdi; FNA core team'in de sürece dahil olacağı ifade edildi
API tasarımı ve kaynak yönetimi
- API, deferred context merkezli modern bir render API olarak tasarlandı
- İşler render pass, compute pass ve copy pass olarak ayrılıyor
- Geri kalan API'nin, binding, render ve compute dispatch çağrılarına yakın standart bir yapıda olduğu açıklandı
- Kaynaklara yazan tüm işlemler, kareler arası bağımlılıkları önlemek için cycle üzerinden çalışabiliyor
GpuBuffersgibi grafik kaynak handle'ları, dahili kaynak başvurularını cycle etmek için konteyner görevi görüyor- Daha sonra cycle kavramı bool ile sadeleştirildi ve çeşitli
WriteOptionsenum'ları kaldırıldı
- Başlangıçta AMD D3D11 sürücüsüyle ilişkili veri API davranış sorunları nedeniyle birden çok
WriteOptionsenum'u vardı- D3D11 veri API'sinin AMD'de beklendiği gibi çalışmaması tam olarak dolanılamayan bir sorun olarak açıklandı
- Sonrasında bu bölüm sadeleştirildi ve çalışma biçimi kod içinde belgelendi
Shader sistemi tartışmaları
- İlk shader çözümü
shaderbuild.pyadlı bir betikti- İstemci makinedeki çevrimdışı shader derleme aracının ön yüzü görevini görüyordu
- Birden çok formatı paketleyip her render backend'ine uygun şekilde ileten bir yapıdaydı
- Bu yaklaşımın çevrimiçi shader derlemeyi engellemeyen bir tasarım olduğu belirtildi
- Gelecekte SDLSL kaynaklarının ikili dosyaya gömülüp
CreateShaderModuleiçinde ihtiyaç duyulan backend bytecode'una anında dönüştürülebileceği açıklandı - Açık API'yi bozmadan çevrimiçi derlemeye izin verebilmesi avantaj olarak sunuldu
- Gelecekte SDLSL kaynaklarının ikili dosyaya gömülüp
- Dış geri bildirimlerde, tamamen çevrimdışı derlemenin bazı motorlarla uyuşmayabileceği yönünde kaygılar dile getirildi
- Python,
glslc,spirv-crossaraçlarının PATH'e kurulması gerekliliğinin geliştiriciler için zahmetli olabileceği belirtildi - SDL ekosisteminde, ayrı bir satellite library biçimindeki çevrimdışı shader derleme aracının daha doğal olabileceği görüşü de paylaşıldı
- Python,
- Sonrasında shader sistemi, “raw” shader'lar ile “portable” shader'ları ayıran bir yöne evrildi
- FNA3D portu, çalışma zamanında shader üretimi desteği için bir stres testi olarak kullanıldı
- MojoShader SPIR-V emitter ile Vulkan'da doğrudan iletim, diğer backend'lerde ise isteğe bağlı ayrı bir kütüphane olan SDL_shader üzerinden dönüşüm yapılması gündeme geldi
- Hedef, SDL'in shader'ın nereden geldiğini bilmek ya da umursamak zorunda olmadığı bir yapıydı
Backend'ler ve test süreci
- İlk Refresh tabanlı uygulamanın en güçlü yanlarından biri, Vulkan backend'inin zaten mevcut olmasıydı
- Vulkan backend'inin Refresh 2.0 temelinde yüksek performans gösterdiği yönünde değerlendirmeler yapıldı
- Compute'un birinci sınıf özellik olması da önceki SDL_GPU taslağına göre önemli bir fark olarak öne çıktı
- Mart 2024 sonu ile Nisan başı arasında çeşitli gerçek oyun çalıştırma örnekleri paylaşıldı
- Çevrimdışı shader derlemesi olmadan çalışan bir duruma ulaşıldığı açıklandı
- Streets of Rage 4'ün açıldığı mevcut revision paylaşıldı
- Wizorb'un Metal üzerinde çalıştığı belirtildi
- Celeste'in trace database'in önemli bir bölümünde oyun içi duruma geçtiği aktarıldı
- Özellik eklemeleri de eş zamanlı sürdü
- Donanımsal instancing desteğinin bir sonraki push'a ekleneceği belirtildi
- Sonrasında instancing ve occlusion queries eklendi; Metal tarafındaki uygulamanın tamamlanması gerektiği paylaşıldı
İncelemelerde öne çıkan derleme, API ve platform sorunları
- Vulkan include sırası nedeniyle
VkInstance,VkSurfaceKHRtypedef yeniden tanımlama hataları oluştuSDL_gpu_vulkan.ciçinde Vulkan header'ları ileSDL_vulkan.hinclude sırasını değiştiren bir düzeltme önerildisuitableQueueFamilyIndexdeğişkeninin başlatılmamış olabileceğine dair uyarıyı 0 ile başlatma yoluyla susturan bir düzeltme de sunuldu
- dynapi güncelleme gereksinimi de gündeme geldi
src/dynapi/altındagendynapi.pyçalıştırıldığında güncellendiği bilgisi verildi- Çalıştırma sırasında çok sayıda belge eksikliği uyarısı çıktığı da bir not olarak eklendi
- API fonksiyon imzalarındaki byte size türünün
size_tyapılması önerildi, ancak GPU API'deUint32'nin korunmasına karar verildi- Buffer boyutları çok büyüdüğünde 32/64 bit eşzamanlı uyumluluğun zorlaşabileceği görüşü paylaşıldı
- Alternatif olarak
Uint64olasılığı anılsa da, sonundaUint32'yi koruma görüşü benimsendi
Birleştirme sonrası ek düzenlemeler
- Birleştirmenin ardından #10622 altında çeşitli tweak'ler yapıldı
- Yeni fonksiyon adlarının beta kullanıcılarına ulaştırılması için önce bunların birleştirileceği belirtildi
- Derleme yapılandırmasında
SDL_GPU_VULKAN SDL_VIDEO_VULKAN,SDL_GPU_METAL SDL_VIDEO_METALgibi sağ taraftaki makroların tanımlı olması gerekliliği #10622 ile düzeltildi - GPU kaynak dosyalarındaki UTF-8 BOM sorunu da #10622 ile giderildi
- D3D12 tarafında
D3D12_ClaimWindow()'un swapchain'i VSYNC ile ayarladığı ve bu nedenletestsprite'ın 60 FPS ile sınırlı kaldığı görüldü- Swapchain'in claim window aşamasında SDR ve VSYNC gibi evrensel destekli parametrelerle oluşturulup, ardından destek durumu sorgulandıktan sonra
SetSwapchainParametersçağrılması iş akışının amaçlanan davranış olduğu açıklandı - Render driver, claim sonrasında
SetSwapchainParametersçağırmasına rağmen D3D12 driver'da 60 FPS sınırının sürmesi araştırılması gereken bir konu olarak kaldı
- Swapchain'in claim window aşamasında SDR ve VSYNC gibi evrensel destekli parametrelerle oluşturulup, ardından destek durumu sorgulandıktan sonra
1 yorum
Hacker News yorumları
SDL3 hâlâ önizleme aşamasında, ancak yeni GPU API ana dala birleştirildi ve SDL3 bakımcıları son ayarlamaları yapıyor
Anladığım kadarıyla bu yeni GPU API’nin özü, grafik kodunu ve shader’ları bir kez yazıp konsollar dâhil birçok platformda büyük zahmete girmeden çalıştırmayı sağlaması. Eskiden Unity ya da Unreal ya da kendi özel çözümünüz gerekiyordu
WebGPU/WGSL de benzer bir çapraz platform grafik yığını, ancak bildiğim kadarıyla konsol backend’i yapan kimse yok. Buna karşılık SDL3 GPU API şu anda WebGPU’yu backend olarak desteklemiyor gibi görünüyor
SDL3 konsol soyutlaması getirdiği için GPU API’ye ek bağımlılık gerekmeyecek; bu yüzden heyecan verici. Üstelik Godot, Steam Deck’i resmen destekliyor ve ileride daha fazla konsolun da desteklenmesini umuyorum. Bununla bağlantılı olarak Miguel de Icaza, Godot’ta Swift’in benimsenmesini zorluyor ve iPad’de editörü SwiftUI’a portlama üzerinde de çalışıyor. İlerleme durumu [3] ilginç
[1] https://bkaradzic.github.io/bgfx/overview.html
[2] https://github.com/bgbernovici/myndsmith
[3] https://blog.la-terminal.net/xogot-code-editing/
Ek bağlam burada: https://icculus.org/finger/flibitijibibo?date=2024-06-15&time=13-14-16
Bu akışın nasıl oturacağını merakla bekliyorum. Sonuçta özel oyun motorları ve uygulamalar geliştirmek için daha fazla seçeneğin olması iyi olur
Son zamanlarda Vulkan’a derinlemesine dalıyorum; öğrenmesi eğlenceli ve aydınlatıcı, ama Vulkan’ın doğası gereği ilerleme yavaş hissediliyor. Başladığımda SDL3 olsaydı muhtemelen memnuniyetle onu seçerdim ve harcadığım zamana kıyasla gösterecek daha fazla sonucum olurdu
Bu API’nin pratikte gerçekten kullanışlı olup olmayacağını zaman gösterecek. Özellikle kaynak senkronizasyonu ve nesne adını değiştirme yöntemi belirleyici olacak
WebGPU’dan veya diğer soyutlamalardan daha iyi performans verip vermeyeceğini de görmek gerek. Sürücü hatalarını dolanmak gereken durumlarda da küçük kalmaya devam edip etmeyeceğini izlemek gerekecek
Shader dili için yeni bytecode konusunda da şüpheliyim. WebGPU’da çalışma zamanı shader ayrıştırması bir endişe kaynağı değildi ve çok hızlıydı. Yerel shader üretimi de hızlı [1]. Yavaş olan pipeline oluşturma ve bu bytecode buna yardımcı olmuyor
[1] http://kvark.github.io/naga/shader/2022/02/17/shader-translation-benchmark.html
Bunu nasıl bu kadar hızlı başardıklarını merak ediyorum. WebGPU native’in geliştirme süresi uzun ve hâlâ nihai olarak kesinleşmiş değil; SDL GPU API ise daha fazla platformu desteklediği için tersine daha uzun sürer gibi görünüyordu
Çapraz platform shading dili için bir kardeş proje [1] ve mevcut dilleri birbirine dönüştüren başka bir proje [2] var; ama onlar hazır olunca hazır olur, API’nin geri kalanının bunu beklemesine gerek yok
WebGPU, satıcılar ve dil hukukçuları ya da standart hukukçularından oluşan bir komitenin siyaset ve bürokrasi içinde ürettiği bir sonuç; bu da belli oluyor. SDL_GPU ise her şeyden önce pratikliği önemseyen oyun geliştiricileri tarafından yapıldı; bu yüzden de zaman zaman fildişi kulelerden küçümseniyor
[1]: https://github.com/libsdl-org/SDL_shader_tools
[2]: https://github.com/flibitijibibo/SDL_gpu_shadercross
dx12 kısmına katkıda bulunduğum için mutluyum :)
Bir ara deneyebilirim. SDL bana hep kaliteli bir yazılım gibi geldi. Hızlı derleniyor, çeşitli platformlarda kolayca derleniyor ve her zaman düzgün çalışıyor. Bu yüzden bu yeni API’den de beklentim var
Genel olarak SDL’in büyük hayranıyım
Çapraz platform bir oyun kütüphanesi ararken SDL ve API’si tam doğru denge gibi gelmişti. Bir pencere ve grafik bağlamı oluşturmak için çağırabileceğim bir C/C++ kütüphanesi, hızlı bir sprite render etme çatısı istiyordum. Tam bir IDE’ye ya da şişkin bir kütüphaneye ihtiyacım yoktu; yeni bir dil öğrenmek de istemiyordum
SDL3, ikinci sistem etkisi yaşıyor gibi geliyor. SDL2, açık pencere handle’ları eklenmiş SDL1’e daha yakındı; dolayısıyla SDL3 üçüncü değil, ikinci sistem. SDL1/2, pencere açma ve giriş olaylarını işleme gibi platforma özgü boilerplate’i saran ince bir katmandı; gerçekten yazmak istediğin OpenGL render koduna hızlıca geçmeni sağlıyordu
Ama Apple işletim sistemlerini de desteklemek istiyorsan OpenGL 4.1’e bağlı kalıyorsun. Apple bunu 5 yıl önce resmen kullanımdan kaldırılacak olarak işaretlediği için compute shader gibi modern GPU özelliklerini kullanamıyorsun
Vulkan yoluna gidip Apple sistemlerinde MoltenVK kullanmak da mümkün, ama Vulkan karmaşıklığı OpenGL’e göre epey artırıyor. İnsanların sık dediği gibi “tek bir üçgen için 1000 satır kod” düzeyinde. SDL3’ün GPU API hedefi, daha erişilebilir ama yeterince esnek bir alternatif sunmak
Konsollar için de muhtemelen benzer bir durum vardır
Pek çok kişi “SDL_render gibi olup tüm platformlarda çalışan shader desteği ekleyebilir misiniz?” diye talep etmiş; çıkış noktasının da bu olduğu söyleniyor
SDL3 daha yüksek seviyeli bir ses API’si de ekliyor, ama onun avantajını pek bilmiyorum
Ayrıca SDL2, 2.0.0’dan sonra epey gelişti; SDL3 de API uyumluluğunu bozan değişikliklere izin vererek bu evrimi sürdürüyor. SDL3 baştan yeniden yazılmış değil ve SDL kullanıcıları açısından SDL2’den SDL3’e geçmenin o kadar zor olmayacağını düşünüyorum
Üstelik SDL1/2 de kendi yüksek seviyeli grafik sistemi olmayacak kadar “sadece ince” olmamıştı. Yeni kullanıcıların ya da temel kullanıcıların ekranda hemen bir şey gösterebilmesi için yerleşik bir şey sunulması faydalı
ahefner’ın belirttiği gibi SDL1 modern ölçütlere göre epey “inceydi”, ama doğrudan piksel matematiği yazmadan ekrana temel şeyler çizecek kadarını sağlıyordu; 90’larda bu oldukça yardımcıydı
Yine de bu soyutlama, basit 2D oyunların ötesindeki ihtiyaçları karşılarken, ne yazık ki giderek parçalanan grafik API ekosistemini hedeflemeye olanak tanıyabilir. Evrensel bir OpenGL(Next) geleceği hayali yok oldu. Ancak en zor kısım olan shader dönüştürme hâlâ yok gibi görünüyor
Bu kütüphaneyi hiç kullanmadım ama bağlantı verilen başlıktan doğru anladıysam artık sağlanan çapraz platform GPU compute özelliğine dair örnekler görmek isterim. Nereden başlamak gerektiğine dair önerisi olan var mı?