| ================================= |
| User Guide for the DirectX Target |
| ================================= |
| |
| .. warning:: |
| Disclaimer: The DirectX backend is experimental and under active development. |
| It is not yet feature complete or ready to be used outside of experimental or |
| demonstration contexts. |
| |
| .. contents:: |
| :local: |
| |
| .. toctree:: |
| :hidden: |
| |
| Introduction |
| ============ |
| |
| The DirectX target implements the DirectX programmability interfaces. These |
| interfaces are documented in the `DirectX Specifications. <https://github.com/Microsoft/DirectX-Specs>`_ |
| |
| Initially the backend is aimed at supporting DirectX 12, and support for DirectX |
| 11 is planned at a later date. |
| |
| The DirectX backend is currently experimental and is not shipped with any |
| release builds of LLVM tools. To enable building the DirectX backend locally add |
| ``DirectX`` to the ``LLVM_EXPERIMENTAL_TARGETS_TO_BUILD`` CMake option. For more |
| information on building LLVM see the :doc:`CMake` documentation. |
| |
| .. _dx-target-triples: |
| |
| Target Triples |
| ============== |
| |
| At present the DirectX target only supports the ``dxil`` architecture, which |
| generates code for the |
| `DirectX Intermediate Language. <https://github.com/microsoft/DirectXShaderCompiler/blob/main/docs/DXIL.rst>`_ |
| |
| In addition to target architecture, the DirectX backend also needs to know the |
| target runtime version and pipeline stage. These are expressed using the OS and |
| Environment triple component. |
| |
| Presently the DirectX backend requires targeting the ``shadermodel`` OS, and |
| supports versions 6.0+ (at time of writing the latest announced version is 6.7). |
| |
| .. table:: DirectX Environments |
| |
| ================== ======================================================== |
| Environment Description |
| ================== ======================================================== |
| ``pixel`` Pixel shader |
| ``vertex`` Vertex shader |
| ``geometry`` Geometry shader |
| ``hull`` Hull shader (tesselation) |
| ``domain`` Domain shader (tesselation) |
| ``compute`` Compute kernel |
| ``library`` Linkable ``dxil`` library |
| ``raygeneration`` Ray generation (ray tracing) |
| ``intersection`` Ray intersection (ray tracing) |
| ``anyhit`` Ray any collision (ray tracing) |
| ``closesthit`` Ray closest collision (ray tracing) |
| ``miss`` Ray miss (ray tracing) |
| ``callable`` Callable shader (ray tracing) |
| ``mesh`` Mesh shader |
| ``amplification`` Amplification shader |
| ================== ======================================================== |
| |
| Output Binaries |
| =============== |
| |
| The DirectX runtime APIs read a file format based on the |
| `DirectX Specification. <https://github.com/Microsoft/DirectX-Specs>`_. In |
| different codebases the file format is referred to by different names |
| (specifically ``DXBC`` and ``DXILContainer``). Since the format is used to store |
| both ``DXBC`` and ``DXIL`` outputs, and the ultimate goal is to support both as |
| code generation targets in LLVM, the LLVM codebase uses a more neutral name, |
| ``DXContainer``. |
| |
| The ``DXContainer`` format is sparsely documented in the functional |
| specification, but a reference implementation exists in the |
| `DirectXShaderCompiler. <https://github.com/microsoft/DirectXShaderCompiler>`_. |
| |
| Support for generating ``DXContainer`` files in LLVM, is being added to the LLVM |
| MC layer for object streamers and writers, and to the Object and ObjectYAML |
| libraries for testing and object file tooling. |
| |
| For ``dxil`` targeting, bitcode emission into ``DXContainer`` files follows a |
| similar model to the ``-fembed-bitcode`` flag supported by clang for other |
| targets. |