- Selama 10 tahun terakhir, graphics API tingkat rendah seperti DirectX 12, Vulkan, Metal memang meningkatkan performa GPU, tetapi kompleksitas dan biaya pemeliharaannya juga melonjak tajam
- GPU modern mendukung hierarki cache penuh, pointer 64-bit, resource bindless, sehingga objek status dan model binding kompleks lama menjadi tidak lagi diperlukan
- Desain yang diusulkan sangat menyederhanakan pipeline rendering dengan menggunakan akses memori berbasis pointer C/C++ dan satu root pointer 64-bit
- Pendekatan ini menghapus ledakan PSO, resource barrier, binding API yang kompleks, dan menawarkan struktur yang menghubungkan memori GPU serta bahasa shader secara langsung
- Pendekatan ini adalah API generasi berikutnya yang dioptimalkan untuk arsitektur GPU modern, dan menunjukkan arah yang seharusnya dituju oleh DirectX 13 atau Vulkan 2.0
Perubahan pada graphics API tingkat rendah
- Pada 2013, arsitektur AMD GCN di Xbox One dan PS4 menjadi standar pengembangan game AAA, lalu muncullah API tingkat rendah seperti Mantle, DirectX 12, Vulkan, dan Metal
- Artinya, API-API tersebut dirancang dengan acuan arsitektur GPU sekitar tahun 2013
- DirectX 11/OpenGL sebelumnya memiliki keterbatasan karena rendering single-thread dan overhead driver yang tinggi
- API-API ini mengurangi biaya draw call dengan pipeline object (PSO) yang telah dikompilasi sebelumnya, tetapi karena tidak cocok dengan struktur engine, kompleksitas justru meningkat
- Akibatnya, di dalam engine muncul lagi semacam “lapisan driver low-level” tersendiri, sehingga peran graphics programmer menjadi semakin terfragmentasi
Latar belakang historis: mengapa jadi serumit ini
- GPU awal dibangun dengan memori yang terpisah dan arsitektur yang berpusat pada fixed-function pipeline
- OpenGL dan DirectX mengadopsi desain berbasis state dan objek untuk mengabstraksikan keragaman hardware
- Bahkan hingga DirectX 11, texture dan buffer masih dikelola sebagai descriptor opak
- Pola desain ini kemudian terbawa terus secara inersia ke API-API berikutnya
Ketidaksesuaian antara GPU modern dan API saat ini
- GPU saat ini mendukung hierarki cache yang konsisten, PCIe ReBAR, pointer 64-bit, texture bindless
- Kini dimungkinkan adanya struktur di mana CPU menulis langsung ke memori GPU dan GPU langsung membacanya
- Dalam lingkungan seperti ini, struktur seperti PSO, descriptor set, binding table menjadi tidak diperlukan
- Masalah ledakan cache PSO membuat cache ratusan GB dibutuhkan, dan ini menjadi penyebab loading lambat dan stuttering
- API baru dapat menghapus struktur usang seperti ini dan beralih ke pendekatan sederhana berbasis pointer
Penyederhanaan manajemen memori GPU
- Vulkan/DirectX 12 lama tidak efisien karena setelah resource dibuat, kompatibilitas heap masih perlu dicek
- Pendekatan yang diusulkan memakai API sederhana berbentuk gpuMalloc/gpuFree untuk mengalokasikan memori GPU secara langsung
- CPU dapat memetakan memori GPU secara langsung untuk inisialisasi
- Data berukuran besar dikirim lewat perintah copy untuk menjalankan kompresi DCC dan pemrosesan swizzle
- Alamat mapping CPU dan alamat GPU dibedakan, lalu dikonversi dengan gpuHostToDevicePointer
Modernisasi data dan bahasa shader
- Menggunakan bahasa shader berbasis pointer C/C++ seperti CUDA, Metal, dan OpenCL
- Akses memori yang efisien dimungkinkan lewat wide load pada level struct (128-bit atau lebih)
- ByteAddressBuffer atau texel buffer milik DirectX tidak lagi menjadi pilihan optimal
- Karena GLSL/HLSL tidak mendukung pointer, tidak ada ekosistem pustaka shader reusable, sementara CUDA berkembang dengan pustaka yang kaya
Root argument dan struktur data
- Kernel GPU menerima satu pointer 64-bit sebagai input lalu melakukan cast ke struct
- CPU dan GPU berbagi header C/C++ yang sama untuk menjaga konsistensi struktur data
- Kata kunci const/restrict digunakan untuk mendorong optimisasi compiler, sekaligus menghapus pemisahan UBO/SSBO yang tidak perlu
- Memanfaatkan preloading scalar register dan optimisasi dynamic uniform pada GPU modern
Penyederhanaan texture binding
- Semua texture dikelola sebagai array descriptor 256-bit (heap) yang bisa ditulis langsung oleh CPU maupun GPU
- Mendukung sampling texture non-uniform melalui akses berbasis indeks 32-bit
- Lebih sederhana daripada descriptor heap di DirectX 12 SM 6.6, dan mirip dengan Vulkan VK_EXT_descriptor_buffer
- Pembuatan, upload, dan sampling texture semuanya disatukan dalam model berbasis pointer memori GPU
Pipeline shader dan konstanta
- Pembuatan pipeline cukup dengan memuat shader IR lalu memanggil gpuCreatePipeline
- Tidak perlu root signature, descriptor set, atau definisi binding
- Konstanta statis (berbasis struct) menggantikan shader specialization constant, sehingga mengurangi masalah ledakan kombinasi PSO
- Struct konstanta dapat memuat pointer GPU, sehingga alamat runtime bisa di-hardcode secara langsung
Penyederhanaan barrier dan sinkronisasi
- Daftar barrier per resource pada API lama tidak selaras dengan struktur GPU modern
- Model yang diusulkan hanya memakai flag bitfield pada level queue/stage
- Disederhanakan menjadi bentuk gpuBarrier(before, after, hazard), tanpa perlu pelacakan resource
- Perintah gpuSignalAfter / gpuWaitBefore memungkinkan sinkronisasi GPU→GPU yang mirip timeline semaphore
Command buffer dan rendering
- Hanya memakai command buffer sekali pakai (transient), menghapus model reuse kompleks ala Vulkan
- gpuBeginRenderPass / gpuEndRenderPass digunakan untuk menetapkan render target dan melakukan clear
- Tidak ada barrier otomatis antar render pass, sehingga rendering paralel dan optimisasi depth pre-pass dimungkinkan
Penyederhanaan pipeline raster
- Vertex/pixel shader mengakses data berbasis pointer sehingga binding API dihapus
- GpuDepthStencilState dan GpuBlendState dipisahkan dari PSO untuk mengurangi jumlah kombinasi
- GPU mobile mendukung programmable blending lewat framebuffer fetch intrinsic
- PSO hanya memuat status minimum seperti topologi, format, jumlah sampel, dan sebagainya
Indirect draw dan rendering berbasis GPU
- Semua argumen (data, arguments) dikirim sebagai pointer GPU
- Mendukung multi-draw melalui gpuDrawIndexedInstancedIndirectMulti
- GPU dapat langsung membuat root data dan draw argument, sehingga rendering yang sepenuhnya GPU-driven dapat diwujudkan
Tooling dan kompatibilitas
- Struktur berbasis pointer dapat ditelusuri lewat informasi simbol seperti pada debugger CUDA/Metal
- Dilindungi oleh memori virtual sehingga tidak ada masalah keamanan; akses yang salah akan memicu page fault
- Seperti kasus MoltenVK dan Proton, API DirectX/Vulkan/Metal lama tetap dapat didukung melalui lapisan translasi
Spesifikasi minimum dan kesimpulan
- Nvidia Turing (2018), AMD RDNA1 (2019), Intel Xe1 (2022), Apple M1 (2020) semuanya mendukung kemampuan yang diusulkan
- GPU masa kini sudah beralih ke struktur bindless, pointer 64-bit, cache yang konsisten
- Yang masih tertahan pada abstraksi masa lalu hanyalah API-nya
- API baru ini lebih sederhana daripada DirectX 11, lebih cepat daripada Vulkan, dan lebih fleksibel daripada Metal
- Vulkan 2.0 / DirectX 13 generasi berikutnya perlu beralih ke desain yang sepenuhnya bindless dan mendorong perluasan ekosistem lewat bahasa shader berbasis pointer C/C++ alih-alih HLSL/GLSL
Belum ada komentar.