สร้างคอมไพเลอร์ DirectX Shader ให้ดีกว่า Microsoft
- เรื่องราวเกี่ยวกับความซับซ้อนของคอมไพเลอร์ DirectX Shader ของ Microsoft และความพยายามในการมอบประสบการณ์ที่ดีกว่าให้กับนักพัฒนาเกม
- กำลังพัฒนา API กราฟิกเชิงทดลองชื่อ sysgpu ซึ่งเป็นผู้สืบทอดของ WebGPU สำหรับเอนจิน Mach โดยใช้ Zig และมีแผนรองรับแบ็กเอนด์ Metal, Vulkan, Direct3D และ OpenGL
- จำเป็นต้องคอมไพล์โปรแกรมเชดเดอร์ที่ใช้งานได้บน Direct3D 12
ประวัติย่อของ DirectX
- กราฟิก API ของ DirectX ใช้ HLSL เป็นภาษาเชดดิง
- ในอดีตก่อน Direct3D 11 ใช้คอมไพเลอร์ชื่อ
FXC ซึ่งขึ้นชื่อว่าช้าและสร้างโค้ดที่ปรับแต่งได้ไม่ดีนัก
FXC ไม่ได้ถูกใช้อีกต่อไป และ DXC มาพร้อมกับ Direct3D 12
- เมื่อ Direct3D 12 และ Shader Model 6.0 (SM6) เปิดตัว Microsoft ได้เลิกใช้ FXC และเปิดตัวคอมไพเลอร์ใหม่ชื่อ
DXC
- DXC เป็นฟอร์กอย่างเป็นทางการของ LLVM/Clang v3.7 โดย Microsoft และมีการระบุการเปลี่ยนแปลงไว้อย่างชัดเจนผ่านคอมเมนต์
สิ่งที่ไดรเวอร์ DirectX กินเป็นอาหารเช้า: DXBC หรือ DXIL
- แม้ HLSL จะเป็นภาษาหลักสำหรับการเขียนโปรแกรมบน Direct3D แต่ในความเป็นจริง GPU มีสถาปัตยกรรมการประมวลผลและข้อกำหนดที่หลากหลาย
- Microsoft จัดเตรียมฟรอนต์เอนด์ API ที่เป็นมิตรกับนักพัฒนา และผู้ผลิตฮาร์ดแวร์อิสระจะเขียนไดรเวอร์เพื่อแปลงไปเป็นสิ่งที่ใกล้เคียงกับ ISA ของฮาร์ดแวร์จริงมากที่สุด
- หลังการมาของ DirectX 12 และ Shader Model 6.0 ก็มีการใช้ฟอร์แมตใหม่ชื่อ DXIL แทน DXBC
DXIL
- DXIL คือฟอร์แมตทางการที่ผู้ผลิตไดรเวอร์ DirectX 12 ใช้อยู่ในปัจจุบัน
- นักพัฒนาเกมใช้คอมไพเลอร์ DXC เพื่อสร้างไบต์โค้ด DXIL แล้วส่งต่อให้ไดรเวอร์กราฟิกแปลงเป็นแมชชีนโค้ดจริงสำหรับรันบนฮาร์ดแวร์ GPU
การปรับแก้ Microsoft LLVM fork
- Microsoft ตระหนักว่าการให้ผู้ผลิตไดรเวอร์อิสระต้องใช้ฟอร์แมต LLVM bitcode แบบเฉพาะนั้นไม่ใช่เรื่องที่เหมาะนัก และยอมรับว่าการดูแลรักษา LLVM fork ก็ไม่ใช่เรื่องสนุก
- Microsoft จึงเริ่มงานเพื่อรวมการรองรับการคอมไพล์ HLSL เข้าไปใน LLVM/Clang โดยตรง
ความท้าทายสำหรับนักพัฒนาเกม, WebGPU และอื่น ๆ
- ชั้น abstraction ด้านกราฟิกจำเป็นต้องมีภาษาเชดดิงแบบรวมศูนย์ และปัจจุบันการติดตั้งใช้งาน WebGPU ส่วนใหญ่ใช้แนวทางคอมไพล์ HLSL ไปเป็น DXBC หรือ DXIL
ทางอ้อมแบบง่าย ๆ: SPIR-V
- Vulkan/SPIR-V ก็ใช้แนวทางคล้ายกัน และการที่ SPIR-V จะถูกปรับแต่งดีแค่ไหนนั้นขึ้นอยู่กับผู้ผลิต GPU
จะใช้ dxcompiler.dll หรือไม่?
- รันไทม์ของ WebGPU ต้องตัดสินใจว่าจะใช้คอมไพเลอร์ HLSL รุ่นใหม่ DXC หรือจะใช้คอมไพเลอร์ FXC ที่ถูกเลิกใช้อย่างเป็นทางการแล้วและมีประสิทธิภาพกับคุณภาพโค้ดที่แย่กว่า
ทำไมถึงลิงก์แบบสแตติกไม่ได้?
- LLVM fork ของ Microsoft ไม่รองรับการลิงก์แบบสแตติก และสาเหตุคือความซับซ้อนของระบบบิลด์
แนะนำ dxil.dll - บล็อบเซ็นโค้ดแบบปิดสำหรับ DirectX Shader
dxil.dll ไม่ได้ถูกบิลด์จากซอร์ส และพึ่งพา code blob แบบปิดเฉพาะแพลตฟอร์มที่เป็นส่วนพึ่งพาในรีโพซิทอรี 'โอเพนซอร์ส' ของ Microsoft
ปัญหาการรองรับแพลตฟอร์ม
- Microsoft แจกจ่าย
dxil.dll เฉพาะสำหรับ Windows (x86/arm) และ Linux (x86) เท่านั้น โดยไม่มีไบนารีสำหรับ macOS หรือ Linux aarch64
สรุป
- ไม่สามารถบิลด์ DXC เป็นไลบรารีแบบสแตติกได้ และการกู้คืนฟังก์ชันของ LLVM กลับมาเพราะติดปัญหา code blob แบบปิดนั้นจะเป็นงานขนาดใหญ่
- ไม่สามารถทำการคอมไพล์เชดเดอร์แบบออฟไลน์สำหรับเกมข้ามแพลตฟอร์มบน CI pipeline ของ macOS หรือ arm Linux ได้
ปรับปรุงระบบบิลด์
- สำรวจวิธีเปลี่ยนระบบบิลด์ CMake ไปเป็น
build.zig เพื่อให้บิลด์เป็นไลบรารีสแตติกเดี่ยวได้
แก้ปัญหาการพึ่งพาไลบรารีแบบไดนามิก
- ฟอร์กโค้ดเบสของ DXC และแก้โค้ด C++ เพื่อลบการพึ่งพาไลบรารีแบบไดนามิกออก
แก้ปัญหาการเซ็นโค้ดแบบปิด
- ค้นพบวิธีคอมไพล์ HLSL shader ได้โดยไม่ต้องพึ่งพา
dxil.dll
ผลลัพธ์
- จัดเตรียมไลบรารี
dxcompiler และ CLI dxc ในรูปแบบไบนารีสแตติกที่ไม่ต้องพึ่งพา dxil.dll แบบปิด
- บิลด์ไบนารีสำหรับ macOS, Linux และ Windows ใน CI pipeline
ข้อควรระวัง
- ไบนารีบางส่วนยังไม่ได้บิลด์หรือทดสอบ และมีแผนจะใช้ Zig เองเป็นภาษาเชดดิงแทน HLSL
บันทึกส่วนตัว
- หลังจากมีงานสายเทคนิคประจำเต็มเวลาในชื่อ Stephen ก็ได้ทำงานออนไลน์เพื่อสร้างเอนจิน Mach
- มีรากฐานมาจาก FOSS และเชื่อว่าผู้พัฒนาควรเป็นเจ้าของเครื่องมือของตนและได้รับพลังจากมัน
- ความฝันคือสร้าง Mach เพื่อทุกคน และหาเลี้ยงชีพด้วยการขายเกมคุณภาพสูง
ขอบคุณที่อ่าน
- ลองเข้าไปดูที่ machengine.org
- โปรดพิจารณาสนับสนุนการพัฒนาเพื่อให้ทำงานต่อได้มากขึ้น
- เข้าร่วมเซิร์ฟเวอร์ Mach Discord
- สนับสนุนบน GitHub
- machengine.org
ความเห็นของ GN⁺
- ประเด็นสำคัญที่สุดของบทความนี้คือความพยายามของชุมชนนักพัฒนาในการก้าวข้ามความซับซ้อนและข้อจำกัดของคอมไพเลอร์ DirectX Shader DXC ของ Microsoft
- นักพัฒนา Mach engine ใช้ Zig เพื่อปรับปรุงระบบบิลด์ของ DXC และนำเสนอแนวทางใหม่ในการคอมไพล์ HLSL shader โดยไม่ต้องพึ่งพา
dxil.dll แบบปิด ซึ่งเป็นการมีส่วนสำคัญต่อการพัฒนาเกมข้ามแพลตฟอร์ม
- บทความนี้เน้นย้ำถึงความสำคัญของซอฟต์แวร์โอเพนซอร์ส และแนวคิดที่ว่านักพัฒนาควรเป็นเจ้าของและควบคุมเครื่องมือของตนเองได้ พร้อมแสดงให้เห็นคุณค่าของความร่วมมือและนวัตกรรมในชุมชนเทคโนโลยี
1 ความคิดเห็น
ความเห็นจาก Hacker News
ภาพรวมที่ยอดเยี่ยมเกี่ยวกับความซับซ้อนของการคอมไพล์เชดเดอร์สำหรับ 3D API
ปัญหาที่เกี่ยวข้องกับ Godot
dxil.dllของ DirectX Shader Compiler ที่ถูกแจกจ่ายมาพร้อมกับ Godotการถกเถียงเรื่องการแจกจ่าย .dll เพิ่มเติม
dxil.dllรวมอยู่ในไฟล์ติดตั้งdxil.dllเหมือนกันทุกบิตคำถามเกี่ยวกับลายเซ็นของ DXIL.dll
การเปลี่ยนแปลงของ DXC ต่อชั้น code generation และโครงสร้างพื้นฐานของ LLVM
คำแนะนำเกี่ยวกับระบบนิเวศของ Mach
mach-sysgpuโดยเฉพาะ ซึ่งเป็นการ reimplement WebGPU แบบสมบูรณ์ และเขียนขึ้นเป็นหลักโดย Ali Chraghi วัย 17 ปีการพูดคุยเกี่ยวกับ SDL_gpu และ SDL3
การใช้งานภาษา Zig
การแสดงความขอบคุณต่องานด้านโครงสร้างพื้นฐาน
การกล่าวถึงการออกเสียง DXIL