3 पॉइंट द्वारा GN⁺ 2024-02-11 | 1 टिप्पणियां | WhatsApp पर शेयर करें

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 टिप्पणियां

 
GN⁺ 2024-02-11
Hacker News राय
  • 3D API shader compilation की जटिलता का शानदार अवलोकन

    • cross-3D-API shader compilation की जटिल समस्या का एक overview दिया गया है.
    • फोकस D3D और Microsoft पर है, लेकिन दूसरे 3D API में भी स्थिति बहुत बेहतर नहीं है.
    • उदाहरण के लिए, Linux host पर Metal shader को cross-compile नहीं किया जा सकता, और यह सिर्फ macOS तथा हाल में Windows पर ही संभव है.
    • अगर Mach team "Zig को cross-3D-API shader compiler के रूप में उपयोग करना" सफल बना देती है, और उसे "Zig को cross-compile toolchain के रूप में उपयोग करने" जितना seamless बना पाती है, तो यह 1995 के बाद computer graphics में सबसे बड़ी घटना होगी.
  • Godot से जुड़ी समस्या

    • Direct3D 12 support फिलहाल Godot के साथ वितरित होने वाले DirectX Shader Compiler की proprietary dxil.dll library पर निर्भर करता है.
    • proprietary software को distribute करना Godot project के mission के खिलाफ है.
  • अतिरिक्त .dll distribution पर चर्चा

    • कई video games पहले से ही उपयोग किए जाने वाले proprietary middleware (Bink, SpeedTree, PhysX आदि) की तरह अतिरिक्त .dll distribute करना कोई अनिवार्य बात नहीं है.
    • ज़्यादातर game launchers (Steam, GOG, Epic आदि) भी अपनी-अपनी .DLLs की मांग करते हैं.
    • कई games D3D11On12 का उपयोग करते हैं, और कई shipped games अपने installer files में dxil.dll शामिल करते हैं.
    • code signing को reverse engineer करके उसका reimplementation करना, खासकर इसलिए कि यह dxil.dll के output के साथ bit-level पर identical है, वाकई चौंकाने वाला काम है.
    • लेकिन जो लोग आसान रास्ता पसंद करते हैं, वे बस DLL distribute करने का विकल्प चुन सकते हैं.
  • DXIL.dll signature पर सवाल

    • क्या DXIL.dll द्वारा किया जाने वाला signing सिर्फ modified MD5 है?
  • LLVM के codegen layer और infrastructure पर DXC के बदलाव

    • DXC का LLVM fork, LLVM के codegen layer और infrastructure को हटाता है या उसे नुकसान पहुंचाता है.
    • इस समस्या को ठीक करना और टूटी हुई LLVM functionality को restore करना बहुत बड़ा काम होगा.
    • resource constraints के कारण नए DXC compiler में इस समस्या को ठीक करने की कोई योजना नहीं है.
    • भविष्य में Clang में DXBC generation support आ सकता है, लेकिन वह काम पहले DXIL और SPIR-V generation support पर फोकस होने के कारण कई सालों तक शुरू नहीं होगा.
    • Microsoft की ओर से expectations को स्पष्ट रूप से set करने के लिए आभार व्यक्त किया गया है.
  • Mach ecosystem के लिए सलाह

    • खास तौर पर mach-sysgpu को देखने की सिफारिश की गई है, जो WebGPU का एक complete reimplementation है और मुख्य रूप से 17 वर्षीय Ali Chraghi द्वारा लिखा गया है.
  • SDL_gpu और SDL3 पर चर्चा

    • SDL team, SDL3 में जारी होने वाली SDL_gpu नाम की एक नई shader language विकसित कर रही है.
    • यह games में 3D graphics से जुड़े platform-to-platform काम करने का एक तरीका देगी.
  • Zig language का उपयोग

    • Zig को खुद shading language के रूप में उपयोग करना काफ़ी शानदार है.
    • Zig एक असली language है, जो build system भी है और shading language भी.
  • infrastructure work के लिए आभार

    • इस तरह का infrastructure work कई दरवाज़े खोलता है, इसलिए इसे पढ़कर खुशी होती है.
  • DXIL के उच्चारण का उल्लेख

    • DXIL का उच्चारण "dixel" है, यानी "pixel" में 'p' को 'd' से बदलने जैसा.