API GPU Baru SDL3 Telah Dimerge
(github.com/libsdl-org)- PR #9312 untuk GPU API baru SDL3 dimerge pada 29 Agustus 2024, dan prosesnya berjalan dengan cepat mengajukan pendekatan berbasis Refresh agar mendapat lebih banyak review menjelang SDL 3.0
- Proposalnya menjadikan Refresh, komponen grafis dari MoonWorks, sebagai kandidat API final untuk SDL_gpu; mendukung Vulkan dan API grafis PS5, sementara dukungan D3D11 deferred context sedang dikerjakan
- Desain API memakai model rendering modern yang membagi pekerjaan menjadi render pass, compute pass, dan copy pass, serta operasi penulisan resource disusun agar dapat di-cycle secara internal untuk menghindari dependensi antar-frame
- Di sisi shader, proposal awal yang berfokus pada kompilasi offline disesuaikan ke arah validasi dukungan pembuatan shader saat runtime, dan dibahas struktur yang menerima format IR per backend agar SDL sendiri tidak membungkus shader compiler
- Segera setelah merge, berlanjut penyesuaian seperti nama fungsi API, macro konfigurasi build, UTF-8 BOM, dan batas 60 FPS pada swapchain D3D12; hak commit juga ditambahkan untuk thatcosmonaut
Titik awal PR dan status merge
- PR #9312 dimulai sebagai proposal GPU API baru untuk mempercepat review atas SDL_gpu
- Tujuannya adalah segera mendapatkan “lebih banyak pasang mata” menjelang SDL 3.0
- Dimerge setelah konfirmasi
It's mergedpada 29 Agustus 2024
- Segera setelah merge, ada permintaan untuk sementara menahan perubahan sambil melakukan review dan penyesuaian
- Setelah itu statusnya menjadi
everything is merged, dan ada arahan bahwa perubahan di sisi GPU boleh dimerge lagi - thatcosmonaut ditambahkan ke hak commit karena kemungkinan besar akan mereview incoming changes
- Setelah itu statusnya menjadi
Kandidat API berbasis Refresh
- Inti proposalnya adalah menjadikan Refresh, komponen grafis dari MoonWorks, sebagai kandidat API final untuk SDL_gpu
- MoonWorks diperkenalkan sebagai proyek yang lebih mirip penerus XNA, bukan reimplementasi XNA seperti FNA
- Refresh mirip dengan FNA3D, tetapi menargetkan API modern seperti Vulkan
- Saat itu Refresh mendukung Vulkan dan API grafis PS5
- Dukungan D3D11 deferred context sedang dikerjakan
- Disebut sudah digunakan di produksi untuk Samurai Gunn 2 di PC dan konsol
- Penulis PR menyebut thatcosmonaut sebagai kontak utama, dan FNA core team juga direncanakan terlibat dalam prosesnya
Desain API dan penanganan resource
- API disusun sebagai API rendering modern yang berpusat pada deferred context
- Pekerjaan dibagi menjadi render pass, compute pass, dan copy pass
- Bagian API lainnya dijelaskan sebagai bentuk standar yang mendekati pemanggilan binding, render, dan compute dispatch
- Semua operasi penulisan ke resource dapat menghindari dependensi antar-frame melalui cycle
- Handle resource grafis seperti
GpuBuffersberperan sebagai container untuk melakukan cycle terhadap referensi resource internal - Belakangan, konsep cycle disederhanakan menjadi bool, dan beberapa enum
WriteOptionsdihapus
- Handle resource grafis seperti
- Awalnya ada beberapa enum
WriteOptionskarena masalah perilaku API data terkait driver AMD D3D11- Dijelaskan bahwa perilaku API data D3D11 yang tidak berjalan sesuai harapan di AMD tidak dapat sepenuhnya diakali
- Belakangan bagian ini disederhanakan dan cara kerjanya didokumentasikan di kode
Diskusi sistem shader
- Solusi shader awalnya adalah skrip bernama
shaderbuild.py- Berperan sebagai front-end untuk tool build shader offline di mesin klien
- Strukturnya menggabungkan beberapa format lalu meneruskannya sesuai tiap backend render
- Pendekatan ini dijelaskan sebagai desain yang tidak menghalangi kompilasi shader online
- Ada penjelasan bahwa source SDLSL di masa depan dapat disertakan dalam binary dan langsung dikonversi di
CreateShaderModulemenjadi bytecode backend yang dibutuhkan - Keunggulannya adalah memungkinkan kompilasi online tanpa merusak API publik
- Ada penjelasan bahwa source SDLSL di masa depan dapat disertakan dalam binary dan langsung dikonversi di
- Dalam masukan eksternal, muncul kekhawatiran bahwa kompilasi murni offline tidak cocok untuk engine tertentu
- Ada catatan bahwa kewajiban memasang Python,
glslc, danspirv-crossdi PATH bisa merepotkan developer - Ada juga pendapat bahwa di ekosistem SDL, tool kompilasi shader offline berbentuk satellite library terpisah mungkin lebih alami
- Ada catatan bahwa kewajiban memasang Python,
- Setelah itu, sistem shader disesuaikan ke arah pembedaan shader “raw” dan “portable”
- Port FNA3D digunakan sebagai stress test untuk dukungan pembuatan shader saat runtime
- Disebutkan konfigurasi yang menggunakan MojoShader SPIR-V emitter untuk diteruskan langsung di Vulkan, dan pada backend lain dikonversi lewat SDL_shader, library terpisah opsional
- Targetnya adalah struktur di mana SDL sendiri tidak perlu tahu atau peduli dari mana shader berasal
Backend dan progres pengujian
- Implementasi awal berbasis Refresh dinilai kuat karena backend Vulkan sudah tersedia
- Ada pendapat bahwa backend Vulkan memiliki performa tinggi berdasarkan Refresh 2.0
- Fakta bahwa compute adalah fitur kelas satu juga disebut sebagai perbedaan penting dibanding draf SDL_GPU sebelumnya
- Dari akhir Maret hingga awal April 2024, beberapa contoh game nyata yang berjalan dibagikan
- Dijelaskan bahwa statusnya sudah dapat berjalan tanpa kompilasi shader offline
- Revisi terkini yang dapat mem-boot Streets of Rage 4 dibagikan
- Wizorb berjalan di Metal
- Celeste masuk ke status in-game pada sebagian besar trace database
- Penambahan fitur juga berjalan bersamaan
- Disebutkan bahwa dukungan hardware instancing akan ditambahkan pada push berikutnya
- Setelah itu instancing dan occlusion queries masuk, dan dibagikan status bahwa implementasi sisi Metal masih perlu dilengkapi
Isu build, API, dan platform yang muncul dalam review
- Karena urutan include Vulkan, terjadi error redefinisi typedef
VkInstancedanVkSurfaceKHR- Diusulkan perbaikan untuk mengubah urutan include header Vulkan dan
SDL_vulkan.hdiSDL_gpu_vulkan.c - Juga diusulkan perbaikan untuk meredam peringatan bahwa
suitableQueueFamilyIndexmungkin belum diinisialisasi dengan melakukan inisialisasi ke 0
- Diusulkan perbaikan untuk mengubah urutan include header Vulkan dan
- Kebutuhan pembaruan dynapi juga disampaikan
- Ada arahan bahwa menjalankan
gendynapi.pydi bawahsrc/dynapi/akan memperbaruinya - Ada caveat bahwa saat dijalankan akan muncul banyak peringatan dokumentasi yang hilang
- Ada arahan bahwa menjalankan
- Ada usulan untuk mengganti tipe byte size pada signature fungsi API menjadi
size_t, tetapi kesimpulannya adalah tetap memakaiUint32untuk GPU API- Ada pendapat bahwa ketika ukuran buffer menjadi sangat besar, kompatibilitas serentak 32/64-bit bisa menjadi sulit
- Kemungkinan
Uint64disebut sebagai alternatif, tetapi pada akhirnya disampaikan pendapat untuk tetap mempertahankanUint32
Penyesuaian lanjutan setelah merge
- Setelah merge, beberapa tweak dilakukan di #10622
- Ada arahan bahwa nama fungsi baru akan dimerge terlebih dahulu agar dapat diterima oleh pengguna beta
- Masalah di konfigurasi build yang mengharuskan macro kanan seperti
SDL_GPU_VULKAN SDL_VIDEO_VULKANdanSDL_GPU_METAL SDL_VIDEO_METALsudah terdefinisi diperbaiki di #10622 - Masalah UTF-8 BOM pada file source GPU juga diperbaiki di #10622
- Di sisi D3D12, terkonfirmasi bahwa
D3D12_ClaimWindow()mengatur swapchain ke VSYNC sehinggatestspritedibatasi ke 60 FPS- Dijelaskan bahwa workflow yang dimaksud adalah membuat swapchain dengan parameter yang didukung umum, yaitu SDR dan VSYNC, pada tahap claim window, lalu setelah menanyakan dukungan, memanggil
SetSwapchainParameters - Meski render driver sudah memanggil
SetSwapchainParameterssetelah claim, batas 60 FPS masih tersisa di driver D3D12 sehingga menjadi target investigasi
- Dijelaskan bahwa workflow yang dimaksud adalah membuat swapchain dengan parameter yang didukung umum, yaitu SDR dan VSYNC, pada tahap claim window, lalu setelah menanyakan dukungan, memanggil
1 komentar
Opini Hacker News
SDL3 masih dalam tahap pratinjau, tetapi GPU API baru sudah digabungkan ke branch utama dan para maintainer SDL3 sedang melakukan penyesuaian akhir
Sejauh yang saya pahami, inti dari GPU API baru ini adalah memungkinkan kode grafis dan shader ditulis sekali lalu berjalan di berbagai platform, termasuk konsol, tanpa banyak kerepotan. Sebelumnya, hal seperti ini membutuhkan Unity atau Unreal, atau solusi kustom sendiri
WebGPU/WGSL juga merupakan stack grafis lintas platform yang serupa, tetapi setahu saya belum ada yang membuat backend konsol. Sebaliknya, SDL3 GPU API tampaknya saat ini belum mendukung WebGPU sebagai backend
Saya menantikan SDL3 karena ia memperkenalkan abstraksi konsol sehingga GPU API tidak membutuhkan dependensi tambahan. Selain itu, Godot mendukung Steam Deck secara resmi, dan saya berharap ke depannya lebih banyak konsol juga didukung. Terkait hal ini, Miguel de Icaza sedang mendorong adopsi Swift di Godot, dan juga mengerjakan port editor ke SwiftUI di iPad. Perkembangannya [3] menarik
[1] https://bkaradzic.github.io/bgfx/overview.html
[2] https://github.com/bgbernovici/myndsmith
[3] https://blog.la-terminal.net/xogot-code-editing/
Konteks tambahan ada di sini: https://icculus.org/finger/flibitijibibo?date=2024-06-15&time=13-14-16
Saya penasaran bagaimana arah ini akan berkembang. Pada akhirnya, akan bagus jika ada lebih banyak pilihan untuk membuat game engine dan aplikasi kustom
Belakangan ini saya mendalami Vulkan, dan meski mempelajarinya menyenangkan serta memberi banyak pencerahan, sifat Vulkan membuat progres terasa lambat. Kalau SDL3 sudah ada saat saya mulai, mungkin saya akan dengan senang hati memilihnya, dan hasil yang bisa ditunjukkan dibanding waktu yang diinvestasikan mungkin akan lebih banyak
Apakah API ini benar-benar layak dipakai baru akan terlihat seiring waktu. Terutama sinkronisasi resource dan cara penggantian nama objek akan menjadi kuncinya
Apakah performanya akan lebih baik daripada WebGPU atau abstraksi lain juga masih harus dilihat. Perlu juga diperhatikan apakah ia tetap bisa kecil saat harus mengakali bug driver
Saya juga skeptis terhadap bytecode baru untuk bahasa shading. Di WebGPU, parsing shader saat runtime bukanlah kekhawatiran dan sangat cepat. Pembuatan shader native juga cepat [1]. Yang lambat adalah pembuatan pipeline, dan bytecode ini tidak membantu bagian itu
[1] http://kvark.github.io/naga/shader/2022/02/17/shader-translation-benchmark.html
Saya penasaran bagaimana mereka bisa melakukannya secepat ini. WebGPU native punya masa pengembangan yang panjang dan bahkan masih belum difinalisasi, sementara SDL GPU API mendukung lebih banyak platform, jadi rasanya justru akan memakan waktu lebih lama
Ada proyek saudara [1] untuk bahasa shading lintas platform dan proyek lain [2] untuk mengonversi bahasa-bahasa yang sudah ada satu sama lain, tetapi proyek-proyek itu akan selesai ketika memang selesai, dan bagian API lainnya tidak perlu menunggu itu
WebGPU adalah hasil kerja komite yang terdiri dari vendor dan para ahli bahasa, atau ahli standar, yang dibuat di tengah politik dan birokrasi, dan itu terlihat. SDL_GPU dibuat oleh para pengembang game yang mengutamakan kepraktisan di atas segalanya, sehingga kadang diremehkan dari menara gading
[1]: https://github.com/libsdl-org/SDL_shader_tools
[2]: https://github.com/flibitijibibo/SDL_gpu_shadercross
Senang bisa berkontribusi pada bagian dx12 :)
Mungkin saya akan mencobanya. Selama ini saya merasa SDL adalah perangkat lunak berkualitas. Cepat dikompilasi, mudah dikompilasi di berbagai platform, dan selalu berjalan dengan baik. Jadi saya juga menaruh harapan pada API baru ini
Secara umum saya penggemar berat SDL
Ketika mencari library game lintas platform, SDL dan API-nya terasa punya keseimbangan yang tepat. Yang saya inginkan hanyalah library C/C++ yang bisa dipanggil untuk membuat window dan konteks grafis, serta framework rendering sprite yang cepat. Saya tidak butuh IDE lengkap atau library yang gemuk, dan juga tidak ingin belajar bahasa baru
SDL3 terasa seperti mengalami second-system effect. SDL2 lebih mirip SDL1 dengan handle window eksplisit, jadi SDL3 adalah sistem kedua, bukan ketiga. SDL1/2 adalah lapisan tipis yang membungkus boilerplate spesifik platform untuk membuka window dan menangani event input, sehingga kita bisa cepat masuk ke kode rendering OpenGL yang memang ingin ditulis
Namun jika ingin mendukung sistem operasi Apple juga, Anda terikat pada OpenGL 4.1. Apple sudah menandainya secara resmi sebagai akan ditinggalkan 5 tahun lalu, jadi fitur GPU modern seperti compute shader tidak bisa dipakai
Bisa juga mengambil jalur Vulkan dan memakai MoltenVK di sistem Apple, tetapi kompleksitas Vulkan naik cukup banyak dibanding OpenGL. Seperti yang sering dikatakan orang, levelnya “1000 baris kode untuk satu segitiga”. Tujuan GPU API SDL3 adalah memberi alternatif yang lebih mudah diakses tetapi tetap cukup fleksibel
Konsol mungkin ceritanya mirip
Katanya banyak orang meminta, “Bisakah dibuat sesuatu seperti SDL_render tetapi ditambah dukungan shader yang berjalan di semua platform,” dan itulah titik awalnya
SDL3 juga menambahkan API audio yang lebih tinggi levelnya, tetapi saya kurang tahu kelebihannya
Selain itu SDL2 berkembang cukup jauh setelah 2.0.0, dan SDL3 melanjutkan evolusi itu sambil mengizinkan perubahan yang memutus kompatibilitas API. SDL3 bukan ditulis ulang dari nol, dan dari sudut pandang pengguna SDL, saya rasa pindah dari SDL2 ke SDL3 tidak akan terlalu sulit
Dan SDL1/2 juga tidak pernah “hanya tipis” sampai tidak punya sistem grafis tingkat tinggi sendiri. Berguna jika pengguna baru atau pengguna dasar bisa langsung menampilkan sesuatu di layar dengan fitur bawaan
Seperti yang disorot ahefner, SDL1 memang cukup “tipis” menurut standar modern, tetapi tetap menyediakan cukup fasilitas untuk menggambar hal-hal dasar di layar tanpa menulis matematika piksel sendiri, dan pada tahun 90-an itu cukup membantu
Meski begitu, abstraksi ini mungkin bisa memenuhi kebutuhan di luar game 2D sederhana, sekaligus memungkinkan target ke ekosistem API grafis yang sayangnya makin terfragmentasi. Impian masa depan OpenGL(Next) yang universal sudah hilang. Namun bagian tersulitnya, yaitu konversi shader, tampaknya masih belum ada
Saya belum pernah memakai library ini, tetapi jika pemahaman saya dari thread yang ditautkan benar, sekarang saya ingin melihat contoh fitur GPU compute lintas platform yang disediakan. Saya penasaran apakah ada rekomendasi harus mulai dari mana