DirectX shader compiler को Microsoft से बेहतर बनाना
- Microsoft के DirectX shader compiler की जटिल स्थिति और game developers को बेहतर अनुभव देने के प्रयास की कहानी।
- Mach engine के लिए Zig का उपयोग करके WebGPU के उत्तराधिकारी के रूप में
sysgpu नाम का एक experimental graphics API विकसित किया जा रहा है, जो Metal, Vulkan, Direct3D और OpenGL backends को सपोर्ट करेगा।
- Direct3D 12 में उपयोग किए जा सकने वाले shader programs को compile करना आवश्यक है।
DirectX का संक्षिप्त इतिहास
- DirectX graphics API, HLSL को shading language के रूप में उपयोग करता है।
- पहले, Direct3D 11 से पहले,
FXC नाम का compiler उपयोग किया जाता था, लेकिन यह कुख्यात रूप से धीमा था और कम optimized code generate करने के लिए जाना जाता था।
FXC अब उपयोग में नहीं है, और Direct3D 12 के साथ DXC आया
- Direct3D 12 और Shader Model 6.0 (SM6) के लॉन्च के साथ Microsoft ने FXC को हटाकर
DXC नाम का नया compiler पेश किया।
- DXC, LLVM/Clang v3.7 का Microsoft का आधिकारिक fork है, और बदलावों को comments के जरिए स्पष्ट रूप से चिह्नित किया गया है।
DirectX drivers का असली भोजन: DXBC या DXIL
- HLSL, Direct3D programming की पसंदीदा भाषा है, लेकिन वास्तव में GPU के पास अलग-अलग compute architectures और requirements होती हैं।
- Microsoft एक developer-friendly frontend API देता है, और स्वतंत्र hardware vendors drivers लिखते हैं जो इसे वास्तविक hardware ISA के सबसे नज़दीकी रूप में बदलते हैं।
- DirectX 12 और Shader Model 6.0 के आने के बाद DXBC की जगह DXIL नाम का नया format उपयोग होने लगा।
DXIL
- DXIL वह आधिकारिक format है जिसका उपयोग आज DirectX 12 driver निर्माता करते हैं।
- Game developers, DXC compiler का उपयोग करके DXIL bytecode बनाते हैं, और इसे graphics driver को देते हैं ताकि इसे GPU hardware पर चलने वाले वास्तविक machine code में बदला जा सके।
Microsoft LLVM fork में बदलाव
- Microsoft मानता है कि स्वतंत्र driver निर्माताओं के लिए किसी खास LLVM bitcode format का उपयोग करना आदर्श नहीं है, और यह भी स्वीकार करता है कि LLVM fork का maintenance सुखद काम नहीं है।
- Microsoft ने HLSL compile support को सीधे LLVM/Clang में integrate करने का काम शुरू किया।
Game developers, WebGPU आदि के लिए चुनौतियाँ
- Graphics abstraction layer को एक unified shading language देनी चाहिए, और वर्तमान में अधिकतर WebGPU implementations, HLSL को DXBC या DXIL में compile करने का तरीका अपनाती हैं।
एक सरल workaround: SPIR-V
- Vulkan/SPIR-V भी इसी तरह का तरीका उपयोग करता है, और SPIR-V optimized है या नहीं, यह GPU निर्माता तय करते हैं।
dxcompiler.dll का उपयोग करें या नहीं?
- WebGPU runtime को तय करना होता है कि वह नया DXC HLSL compiler उपयोग करे या आधिकारिक रूप से deprecated, लेकिन performance और code generation quality में कमजोर, FXC compiler का उपयोग करे।
इसे statically link क्यों नहीं किया जा सकता?
- Microsoft का LLVM fork static linking को support नहीं करता, और इसका कारण build system की जटिलता है।
dxil.dll का परिचय - DirectX shaders के लिए proprietary code-signing blob
dxil.dll source से build नहीं किया जाता, बल्कि यह Microsoft के 'open source' repository पर निर्भर platform-specific proprietary code blobs पर आधारित है।
Platform support की समस्या
- Microsoft केवल Windows (x86/arm) और Linux (x86) के लिए
dxil.dll वितरित करता है, लेकिन macOS या Linux aarch64 binaries उपलब्ध नहीं कराता।
सारांश
- DXC को static library के रूप में build नहीं किया जा सकता, और proprietary code-signing blob की वजह से LLVM functionality को restore करना बहुत बड़ा काम होगा।
- macOS या arm Linux CI pipelines में cross-platform games के लिए offline shader compilation नहीं किया जा सकता।
Build system में सुधार
- CMake build system को
build.zig में बदलकर इसे एक single static library के रूप में build करने का तरीका खोजा गया।
Dynamic library dependency का समाधान
- DXC codebase को fork किया गया और C++ code को modify करके dynamic library dependencies हटाई गईं।
Proprietary code signing का समाधान
dxil.dll पर निर्भर हुए बिना HLSL shaders को compile करने का तरीका खोजा गया।
परिणाम
- proprietary
dxil.dll पर निर्भर न रहने वाली static binary dxcompiler library और dxc CLI उपलब्ध कराए गए।
- macOS, Linux और Windows के लिए binaries को CI pipeline में build किया गया।
सावधानियाँ
- कुछ binaries अभी भी build नहीं हुई हैं या test नहीं की गई हैं, और HLSL के बजाय Zig को ही shading language के रूप में उपयोग करने की योजना है।
व्यक्तिगत नोट
- Stephen नाम के तहत full-time tech job रखने के बाद, Mach engine बनाने के लिए ऑनलाइन सक्रिय रहे।
- FOSS में गहरी जड़ें हैं, और यह विश्वास है कि लोगों को अपने tools का मालिक होना चाहिए और उन्हीं के ज़रिए सशक्त होना चाहिए।
- सपना है कि Mach को सबके लिए बनाया जाए और high-quality games बेचकर जीवनयापन किया जाए।
पढ़ने के लिए धन्यवाद
machengine.org देखें।
- development को support करने पर विचार करें ताकि और काम किया जा सके।
- Mach Discord server से जुड़ें।
- GitHub पर sponsor करें।
machengine.org
GN⁺ की राय
- इस लेख की सबसे महत्वपूर्ण बात यह है कि developers community, Microsoft के DirectX shader compiler DXC की जटिलताओं और सीमाओं को पार करने की कोशिश कर रही है।
- Mach engine developer ने Zig का उपयोग करके DXC के build system को बेहतर बनाया और proprietary
dxil.dll पर निर्भर हुए बिना HLSL shaders को compile करने का नया तरीका प्रस्तुत किया, जिससे cross-platform game development में महत्वपूर्ण योगदान मिला।
- यह लेख open source software के महत्व और इस बात पर ज़ोर देता है कि developers को अपने tools पर स्वामित्व और नियंत्रण होना चाहिए, और यह technical community में collaboration और innovation की अहमियत दिखाता है।
1 टिप्पणियां
Hacker News राय
3D API shader compilation की जटिलता का शानदार अवलोकन
Godot से जुड़ी समस्या
dxil.dlllibrary पर निर्भर करता है.अतिरिक्त .dll distribution पर चर्चा
D3D11On12का उपयोग करते हैं, और कई shipped games अपने installer files मेंdxil.dllशामिल करते हैं.dxil.dllके output के साथ bit-level पर identical है, वाकई चौंकाने वाला काम है.DXIL.dll signature पर सवाल
DXIL.dllद्वारा किया जाने वाला signing सिर्फ modified MD5 है?LLVM के codegen layer और infrastructure पर DXC के बदलाव
Mach ecosystem के लिए सलाह
mach-sysgpuको देखने की सिफारिश की गई है, जो WebGPU का एक complete reimplementation है और मुख्य रूप से 17 वर्षीय Ali Chraghi द्वारा लिखा गया है.SDL_gpu और SDL3 पर चर्चा
SDL_gpuनाम की एक नई shader language विकसित कर रही है.Zig language का उपयोग
infrastructure work के लिए आभार
DXIL के उच्चारण का उल्लेख