3 poin oleh GN⁺ 2024-02-11 | 1 komentar | Bagikan ke WhatsApp

Membuat compiler shader DirectX yang lebih baik daripada Microsoft

  • Kisah tentang kondisi kompleks compiler shader DirectX milik Microsoft dan upaya untuk memberikan pengalaman yang lebih baik bagi para pengembang game.
  • Untuk mesin Mach, sedang dikembangkan API grafis eksperimental bernama sysgpu, penerus WebGPU, dengan menggunakan Zig, dan direncanakan akan mendukung backend Metal, Vulkan, Direct3D, dan OpenGL.
  • Perlu mengompilasi program shader yang dapat digunakan di Direct3D 12.

Sejarah singkat DirectX

  • API grafis DirectX menggunakan HLSL sebagai bahasa shading.
  • Di masa lalu, sebelum Direct3D 11, compiler bernama FXC digunakan, tetapi terkenal lambat dan menghasilkan kode yang kurang optimal.

FXC tidak lagi digunakan, dan DXC hadir bersama Direct3D 12

  • Bersamaan dengan peluncuran Direct3D 12 dan Shader Model 6.0 (SM6), Microsoft menghentikan FXC dan memperkenalkan compiler baru bernama DXC.
  • DXC adalah fork resmi Microsoft dari LLVM/Clang v3.7, dan perubahan-perubahannya ditandai dengan jelas melalui komentar.

Sarapan driver DirectX: DXBC atau DXIL

  • Meski HLSL adalah bahasa pilihan untuk pemrograman Direct3D, GPU pada kenyataannya memiliki beragam arsitektur komputasi dan kebutuhan.
  • Microsoft menyediakan API frontend yang ramah pengembang, sementara vendor perangkat keras independen menulis driver yang mengubahnya menjadi bentuk yang paling dekat dengan ISA perangkat keras sebenarnya.
  • Dengan hadirnya DirectX 12 dan Shader Model 6.0, format baru bernama DXIL digunakan sebagai pengganti DXBC.

DXIL

  • DXIL adalah format resmi yang saat ini digunakan oleh produsen driver DirectX 12.
  • Pengembang game menggunakan compiler DXC untuk menghasilkan bytecode DXIL, lalu menyerahkannya ke driver grafis agar diubah menjadi kode mesin nyata yang akan dijalankan pada perangkat keras GPU.

Memodifikasi fork LLVM Microsoft

  • Microsoft menyadari bahwa tidak ideal jika produsen driver independen menggunakan format bitcode LLVM tertentu, dan juga mengakui bahwa memelihara fork LLVM bukan hal yang menyenangkan.
  • Microsoft mulai mengerjakan integrasi dukungan kompilasi HLSL langsung ke LLVM/Clang.

Tantangan untuk pengembang game, WebGPU, dan lainnya

  • Lapisan abstraksi grafis harus menyediakan bahasa shading yang terpadu, dan saat ini sebagian besar implementasi WebGPU menggunakan pendekatan mengompilasi HLSL menjadi DXBC atau DXIL.

Jalan memutar sederhana: SPIR-V

  • Vulkan/SPIR-V juga menggunakan pendekatan serupa, dan apakah SPIR-V dioptimalkan atau tidak ditentukan oleh pabrikan GPU.

Menggunakan dxcompiler.dll atau tidak?

  • Runtime WebGPU harus memutuskan apakah akan menggunakan compiler HLSL DXC yang baru, atau compiler FXC yang secara resmi sudah dihentikan tetapi memiliki performa dan kualitas generasi kode yang lebih buruk.

Mengapa tidak bisa ditautkan secara statis?

  • Fork LLVM Microsoft tidak mendukung penautan statis, dan ini disebabkan oleh kompleksitas sistem build.

Memperkenalkan dxil.dll - blob penandatanganan kode proprietari untuk shader DirectX

  • dxil.dll tidak dibangun dari source, melainkan bergantung pada blob kode proprietari spesifik platform yang ada di repositori 'open source' Microsoft.

Masalah dukungan platform

  • Microsoft hanya mendistribusikan dxil.dll untuk Windows (x86/arm) dan Linux (x86), dan tidak menyediakan biner untuk macOS atau Linux aarch64.

Ringkasan

  • DXC tidak dapat dibangun sebagai pustaka statis, dan memulihkan fungsionalitas LLVM karena adanya blob penandatanganan kode proprietari akan menjadi pekerjaan besar.
  • Kompilasi shader offline untuk game lintas platform tidak dapat dilakukan pada pipeline CI macOS atau arm Linux.

Perbaikan sistem build

  • Sistem build CMake diubah ke build.zig untuk mencari cara membangunnya sebagai satu pustaka statis.

Menyelesaikan dependensi pustaka dinamis

  • Codebase DXC di-fork dan kode C++ dimodifikasi untuk menghapus dependensi pustaka dinamis.

Menyelesaikan penandatanganan kode proprietari

  • Ditemukan cara untuk mengompilasi shader HLSL tanpa bergantung pada dxil.dll.

Hasil

  • Menyediakan pustaka dxcompiler dan CLI dxc dalam bentuk biner statis yang tidak bergantung pada dxil.dll proprietari.
  • Biner untuk macOS, Linux, dan Windows dibangun dalam pipeline CI.

Catatan

  • Beberapa biner masih belum dibangun atau diuji, dan ada rencana untuk menggunakan Zig sendiri sebagai bahasa shading, bukan HLSL.

Catatan pribadi

  • Dengan nama Stephen, ia beraktivitas secara online untuk membangun mesin Mach setelah memiliki pekerjaan teknis penuh waktu.
  • Ia berakar pada FOSS dan percaya bahwa orang harus memiliki alatnya sendiri dan diberdayakan melaluinya.
  • Mimpinya adalah membangun Mach untuk semua orang dan mencari nafkah dengan menjual game berkualitas tinggi.

Terima kasih telah membaca

  • Silakan lihat machengine.org.
  • Pertimbangkan untuk mendukung pengembangan agar lebih banyak pekerjaan bisa dilakukan.
  • Bergabunglah ke server Discord Mach.
  • Dukung di GitHub.
  • machengine.org

Pendapat GN⁺

  • Hal terpenting dalam tulisan ini adalah upaya komunitas pengembang untuk mengatasi kompleksitas dan keterbatasan DXC, compiler shader DirectX milik Microsoft.
  • Dengan menggunakan Zig, pengembang mesin Mach memperbaiki sistem build DXC dan mengajukan pendekatan baru untuk mengompilasi shader HLSL tanpa bergantung pada dxil.dll proprietari, sehingga memberi kontribusi penting bagi pengembangan game lintas platform.
  • Tulisan ini menekankan pentingnya perangkat lunak open source dan bahwa pengembang harus bisa memiliki serta mengendalikan alat mereka sendiri, sekaligus menunjukkan nilai kolaborasi dan inovasi dalam komunitas teknis.

1 komentar

 
GN⁺ 2024-02-11
Komentar Hacker News
  • Ikhtisar yang sangat bagus tentang kompleksitas kompilasi shader API 3D

    • Disajikan gambaran umum tentang masalah rumit dalam kompilasi shader lintas API 3D.
    • Meskipun berfokus pada D3D dan Microsoft, situasinya juga tidak jauh lebih baik di API 3D lainnya.
    • Misalnya, shader Metal tidak bisa di-cross-compile dari host Linux, dan hanya dimungkinkan di macOS serta belakangan ini di Windows.
    • Jika tim Mach berhasil mewujudkan "menggunakan Zig sebagai compiler shader lintas API 3D" dan membuatnya berjalan semulus "menggunakan Zig sebagai toolchain cross-compile", itu akan menjadi peristiwa terbesar dalam grafik komputer sejak 1995.
  • Masalah terkait Godot

    • Dukungan Direct3D 12 saat ini bergantung pada pustaka dxil.dll milik DirectX Shader Compiler yang didistribusikan bersama Godot.
    • Mendistribusikan perangkat lunak proprietari bertentangan dengan misi proyek Godot.
  • Diskusi tentang distribusi .dll tambahan

    • Tidak perlu mempermasalahkan distribusi .dll tambahan, sama seperti banyak video game yang sudah menggunakan middleware proprietari (Bink, SpeedTree, PhysX, dll.).
    • Sebagian besar launcher game (Steam, GOG, Epic, dll.) juga memerlukan .DLL masing-masing.
    • Banyak game menggunakan D3D11On12, dan banyak game yang sudah dirilis menyertakan dxil.dll di file instalasinya.
    • Upaya merekayasa balik dan mengimplementasikan ulang penandatanganan kode ini sungguh luar biasa, terutama karena hasilnya identik bit demi bit dengan output dxil.dll.
    • Namun, orang yang lebih memilih cara mudah mungkin cukup memilih untuk mendistribusikan DLL tersebut.
  • Pertanyaan tentang tanda tangan DXIL.dll

    • Apakah penandatanganan yang dilakukan DXIL.dll hanyalah MD5 yang dimodifikasi?
  • Perubahan DXC terhadap lapisan dan infrastruktur pembuatan kode LLVM

    • Fork LLVM milik DXC menghapus atau merusak lapisan dan infrastruktur pembuatan kode LLVM.
    • Memperbaiki masalah ini dan memulihkan fitur LLVM yang rusak akan menjadi pekerjaan yang sangat besar.
    • Karena keterbatasan sumber daya, tidak ada rencana untuk menyelesaikan masalah ini di compiler DXC yang baru.
    • Di masa depan, Clang mungkin juga akan mendukung pembuatan DXBC, tetapi pekerjaan itu tidak akan dimulai selama beberapa tahun karena fokusnya adalah mendukung pembuatan DXIL dan SPIR-V terlebih dahulu.
    • Ada ungkapan terima kasih kepada pihak Microsoft karena telah menetapkan ekspektasi yang jelas.
  • Saran tentang ekosistem Mach

    • Direkomendasikan untuk menyelidiki mach-sysgpu, yaitu implementasi ulang penuh WebGPU, yang terutama ditulis oleh Ali Chraghi yang berusia 17 tahun.
  • Diskusi tentang SDL_gpu dan SDL3

    • Tim SDL sedang mengembangkan bahasa shader baru bernama SDL_gpu yang akan dirilis di SDL3.
    • Ini akan menyediakan cara untuk bekerja lintas platform terkait grafis 3D dalam game.
  • Pemanfaatan bahasa Zig

    • Menggunakan Zig sendiri sebagai bahasa shading adalah hal yang keren.
    • Zig adalah bahasa sungguhan, sekaligus sistem build dan bahasa shading.
  • Ungkapan terima kasih atas pekerjaan infrastruktur

    • Menyenangkan membaca pekerjaan infrastruktur seperti ini karena membuka banyak kemungkinan.
  • Penyebutan pelafalan DXIL

    • DXIL dilafalkan "dixel", seperti mengganti huruf 'p' pada "pixel" dengan 'd'.