
This patch hyphenates words that are used as adjecives, such as: - architecture specific - human readable - implementation defined - language independent - language specific - machine readable - machine specific - target independent - target specific
584 lines
22 KiB
ReStructuredText
584 lines
22 KiB
ReStructuredText
=================
|
|
DirectX Container
|
|
=================
|
|
|
|
.. contents::
|
|
:local:
|
|
|
|
.. toctree::
|
|
:hidden:
|
|
|
|
Overview
|
|
========
|
|
|
|
The DirectX Container (DXContainer) file format is the binary file format for
|
|
compiled shaders targeting the DirectX runtime. The file format is also called
|
|
the DXIL Container or DXBC file format. Because the file format can be used to
|
|
include either DXIL or DXBC compiled shaders, the nomenclature in LLVM is simply
|
|
DirectX Container.
|
|
|
|
DirectX Container files are read by the compiler and associated tools as well as
|
|
the DirectX runtime, profiling tools and other users. This document serves as a
|
|
companion to the implementation in LLVM to more completely document the file
|
|
format for its many users.
|
|
|
|
Basic Structure
|
|
===============
|
|
|
|
A DXContainer file begins with a header, and is then followed by a sequence of
|
|
"parts", which are analogous to object file sections. Each part contains a part
|
|
header, and some number of bytes of data after the header in a defined format.
|
|
|
|
DX Container data structures are encoded little-endian in the binary file.
|
|
|
|
The LLVM versions of all data structures described and/or referenced in this
|
|
file are defined in
|
|
`llvm/include/llvm/BinaryFormat/DXContainer.h
|
|
<https://github.com/llvm/llvm-project/blob/main/llvm/include/llvm/BinaryFormat/DXContainer.h>`_.
|
|
Some pseudo code is provided in blocks below to ease understanding of this
|
|
document, but reading it with the header available will provide the most
|
|
clarity.
|
|
|
|
File Header
|
|
-----------
|
|
|
|
.. code-block:: c
|
|
|
|
struct Header {
|
|
uint8_t Magic[4];
|
|
uint8_t Digest[16];
|
|
uint16_t MajorVersion;
|
|
uint16_t MinorVersion;
|
|
uint32_t FileSize;
|
|
uint32_t PartCount;
|
|
};
|
|
|
|
The DXContainer header matches the pseudo-definition above. It begins with a
|
|
four character code (magic number) with the value ``DXBC`` to denote the file
|
|
format.
|
|
|
|
The ``Digest`` is a 128bit hash digest computed with a proprietary algorithm and
|
|
encoded in the binary by the bytecode validator.
|
|
|
|
The ``MajorVersion`` and ``MinorVersion`` encode the file format version
|
|
``1.0``.
|
|
|
|
The remaining fields encode 32-bit unsigned integers for the file size and
|
|
number of parts.
|
|
|
|
Following the part header is an array of ``PartCount`` 32-bit unsigned integers
|
|
specifying the offsets of each part header.
|
|
|
|
Part Data
|
|
---------
|
|
|
|
.. code-block:: c
|
|
|
|
struct PartHeader {
|
|
uint8_t Name[4];
|
|
uint32_t Size;
|
|
}
|
|
|
|
Each part begins with a part header. A part header includes the 4-character part
|
|
name, and a 32-bit unsigned integer specifying the size of the part data. The
|
|
part header is followed by ``Size`` bytes of data comprising the part. The
|
|
format does not explicitly require 32-bit alignment of parts, although LLVM does
|
|
implement this restriction in the writer code (because it's a good idea). The
|
|
LLVM object reader code does not assume inputs are correctly aligned to avoid
|
|
undefined behavior caused by misaligned inputs generated by other compilers.
|
|
|
|
Part Formats
|
|
============
|
|
|
|
The part name indicates the format of the part data. There are 24 part headers
|
|
used by DXC and FXC. Not all compiled shaders contain all parts. In the list
|
|
below parts generated only by DXC are marked with †, and parts generated only by
|
|
FXC are marked with \*.
|
|
|
|
#. `DXIL`_† - Stores the DXIL bytecode.
|
|
#. `HASH`_† - Stores the shader MD5 hash.
|
|
#. ILDB† - Stores the DXIL bytecode with LLVM Debug Information embedded in the module.
|
|
#. ILDN† - Stores shader debug name for external debug information.
|
|
#. `ISG1`_ - Stores the input signature for Shader Model 5.1+.
|
|
#. ISGN\* - Stores the input signature for Shader Model 4 and earlier.
|
|
#. `OSG1`_ - Stores the output signature for Shader Model 5.1+.
|
|
#. OSG5\* - Stores the output signature for Shader Model 5.
|
|
#. OSGN\* - Stores the output signature for Shader Model 4 and earlier.
|
|
#. PCSG\* - Stores the patch constant signature for Shader Model 5.1 and earlier.
|
|
#. PDBI† - Stores PDB information.
|
|
#. PRIV - Stores arbitrary private data (Not encoded by either FXC or DXC).
|
|
#. `PSG1`_ - Stores the patch constant signature for Shader Model 6+.
|
|
#. `PSV0`_ - Stores Pipeline State Validation data.
|
|
#. RDAT† - Stores Runtime Data.
|
|
#. RDEF\* - Stores resource definitions.
|
|
#. `RTS0`_ - Stores compiled root signature.
|
|
#. `SFI0`_ - Stores shader feature flags.
|
|
#. SHDR\* - Stores compiled DXBC bytecode.
|
|
#. SHEX\* - Stores compiled DXBC bytecode.
|
|
#. DXBC\* - Stores compiled DXBC bytecode.
|
|
#. SRCI† - Stores shader source information.
|
|
#. STAT† - Stores shader statistics.
|
|
#. VERS† - Stores shader compiler version information.
|
|
|
|
DXIL Part
|
|
---------
|
|
.. _DXIL:
|
|
|
|
The DXIL part is comprised of three data structures: the ``ProgramHeader``, the
|
|
``BitcodeHeader`` and the bitcode serialized LLVM 3.7 IR Module.
|
|
|
|
The ``ProgramHeader`` contains the shader model version and pipeline stage
|
|
enumeration value. This identifies the target profile of the contained shader
|
|
bitcode.
|
|
|
|
The ``BitcodeHeader`` contains the DXIL version information and refers to the
|
|
start of the bitcode data.
|
|
|
|
HASH Part
|
|
---------
|
|
.. _HASH:
|
|
|
|
The HASH part contains a 32-bit unsigned integer with the shader hash flags, and
|
|
a 128-bit MD5 hash digest. The flags field can either have the value ``0`` to
|
|
indicate no flags, or ``1`` to indicate that the file hash was computed
|
|
including the source code that produced the binary.
|
|
|
|
Program Signature (SG1) Parts
|
|
-----------------------------
|
|
.. _ISG1:
|
|
.. _OSG1:
|
|
.. _PSG1:
|
|
|
|
.. code-block:: c
|
|
|
|
struct ProgramSignatureHeader {
|
|
uint32_t ParamCount;
|
|
uint32_t FirstParamOffset;
|
|
}
|
|
|
|
The program signature parts (ISG1, OSG1, & PSG1) all use the same data
|
|
structures to encode inputs, outputs and patch information. The
|
|
``ProgramSignatureHeader`` includes two 32-bit unsigned integers to specify the
|
|
number of signature parameters and the offset of the first parameter.
|
|
|
|
Beginning at ``FirstParamOffset`` bytes from the start of the
|
|
``ProgramSignatureHeader``, ``ParamCount`` ``ProgramSignatureElement``
|
|
structures are written. Following the ``ProgramSignatureElements`` is a string
|
|
table of null terminated strings padded to 32-byte alignment. This string table
|
|
matches the DWARF string table format as implemented by LLVM.
|
|
|
|
Each ``ProgramSignatureElement`` encodes a ``NameOffset`` value which specifies
|
|
the offset into the string table. A value of ``0`` denotes no name. The offsets
|
|
encoded here are from the beginning of the ``ProgramSignatureHeader`` not the
|
|
beginning of the string table.
|
|
|
|
The ``ProgramSignatureElement`` contains several enumeration fields which are
|
|
defined in `llvm/include/llvm/BinaryFormat/DXContainerConstants.def <https://github.com/llvm/llvm-project/blob/main/llvm/include/llvm/BinaryFormat/DXContainerConstants.def>`_.
|
|
These fields encode the D3D system value, the type of data and its precision
|
|
requirements.
|
|
|
|
PSV0 Part
|
|
---------
|
|
.. _PSV0:
|
|
|
|
The Pipeline State Validation data encodes versioned runtime information
|
|
structures. These structures use a scheme where in lieu of encoding a version
|
|
number, they encode the size of the structure and each new version of the
|
|
structure is additive. This allows readers to infer the version of the structure
|
|
by comparing the encoded size with the size of known structures. If the encoded
|
|
size is larger than any known structure, the largest known structure can validly
|
|
parse the data represented in the known structure.
|
|
|
|
In LLVM we represent the versions of the associated data structures with
|
|
versioned namespaces under the ``llvm::dxbc::PSV`` namespace (e.g. ``v0``,
|
|
``v1``). Each structure in the ``v0`` namespace is the base version, the
|
|
structures in the ``v1`` namespace inherit from the ``v0`` namespace, and the
|
|
``v2`` structures inherit from the ``v1`` structures, and so on.
|
|
|
|
The high-level structure of the PSV data is:
|
|
|
|
#. ``RuntimeInfo`` structure
|
|
#. Resource bindings
|
|
#. Signature elements
|
|
#. Mask Vectors (Output, Input, InputPatch, PatchOutput)
|
|
|
|
Immediately following the part header for the PSV0 part is a 32-bit unsigned
|
|
integer specifying the size of the ``RuntimeInfo`` structure that follows.
|
|
|
|
Immediately following the ``RuntimeInfo`` structure is a 32-bit unsigned integer
|
|
specifying the number of resource bindings. If the number of resources is
|
|
greater than zero, another unsigned 32-bit integer follows to specify the size
|
|
of the ``ResourceBindInfo`` structure. This is followed by the specified number
|
|
of structures of the specified size (which infers the version of the structure).
|
|
|
|
For version 0 of the data this ends the part data.
|
|
|
|
PSV0 Signature Elements
|
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
The signature elements are conceptually a single concept but the data is encoded
|
|
in three different blocks. The first block is a string table, the second block
|
|
is an index table, and the third block is the elements themselves, which in turn
|
|
are separeated by input, output and patch constant or primitive elements.
|
|
|
|
Signature elements capture much of the same data captured in the :ref:`SG1
|
|
<ISG1>` parts. The use of an index table allows de-duplication of data for a more
|
|
compact final representation.
|
|
|
|
The string table begins with a 32-bit unsigned integer specifying the table
|
|
size. This string table uses the DXContainer format as implemented in LLVM. This
|
|
format prefixes the string table with a null byte so that offset ``0`` is a null
|
|
string, and pads to 32-byte alignment.
|
|
|
|
The index table begins with a 32-bit unsigned integer specifying the size of the
|
|
table, and is followed by that many 32-bit unsigned integers representing the
|
|
table. The index table may or may not deduplicate repeated sequences (both DXC
|
|
and Clang do). The indices signify the indices in the flattened aggregate
|
|
representation which the signature element describes. A single semantic may have
|
|
more than one entry in this table to denote the different attributes of its
|
|
members.
|
|
|
|
For example given the following code:
|
|
|
|
.. code-block:: c
|
|
|
|
struct VSOut_1
|
|
{
|
|
float4 f3 : VOUT2;
|
|
float3 f4 : VOUT3;
|
|
};
|
|
|
|
|
|
struct VSOut
|
|
{
|
|
float4 f1 : VOUT0;
|
|
float2 f2[4] : VOUT1;
|
|
VSOut_1 s;
|
|
int4 f5 : VOUT4;
|
|
};
|
|
|
|
void main(out VSOut o1 : A) {
|
|
}
|
|
|
|
The semantic ``A`` gets expanded into 5 output signature elements. Those
|
|
elements are:
|
|
|
|
.. note::
|
|
|
|
In the example below, it is a coincidence that the rows match the indices, in
|
|
more complicated examples with multiple semantics this is not the case.
|
|
|
|
#. Index 0 starts at row 0, contains 4 columns, and is float32. This represents
|
|
``f1`` in the source.
|
|
#. Index 1, 2, 3, and 4 starts at row 1, contains two columns and is float32.
|
|
This represents ``f2`` in the source, and it spreads across rows 1 - 4.
|
|
#. Index 5 starts at row 5, contains 4 columns, and is float32. This represents
|
|
``f3`` in the source.
|
|
#. Index 6 starts at row 6, contains 3 columns, and is float32. This represents
|
|
``f4``.
|
|
#. Index 7 starts at row 7, contains 4 columns, and is signed 32-bit integer.
|
|
This represents ``f5`` in the source.
|
|
|
|
The LLVM ``obj2yaml`` tool can parse this data out of the PSV and present it in
|
|
human-readable YAML. For the example above it produces the output:
|
|
|
|
.. code-block:: YAML
|
|
|
|
SigOutputElements:
|
|
- Name: A
|
|
Indices: [ 0 ]
|
|
StartRow: 0
|
|
Cols: 4
|
|
StartCol: 0
|
|
Allocated: true
|
|
Kind: Arbitrary
|
|
ComponentType: Float32
|
|
Interpolation: Linear
|
|
DynamicMask: 0x0
|
|
Stream: 0
|
|
- Name: A
|
|
Indices: [ 1, 2, 3, 4 ]
|
|
StartRow: 1
|
|
Cols: 2
|
|
StartCol: 0
|
|
Allocated: true
|
|
Kind: Arbitrary
|
|
ComponentType: Float32
|
|
Interpolation: Linear
|
|
DynamicMask: 0x0
|
|
Stream: 0
|
|
- Name: A
|
|
Indices: [ 5 ]
|
|
StartRow: 5
|
|
Cols: 4
|
|
StartCol: 0
|
|
Allocated: true
|
|
Kind: Arbitrary
|
|
ComponentType: Float32
|
|
Interpolation: Linear
|
|
DynamicMask: 0x0
|
|
Stream: 0
|
|
- Name: A
|
|
Indices: [ 6 ]
|
|
StartRow: 6
|
|
Cols: 3
|
|
StartCol: 0
|
|
Allocated: true
|
|
Kind: Arbitrary
|
|
ComponentType: Float32
|
|
Interpolation: Linear
|
|
DynamicMask: 0x0
|
|
Stream: 0
|
|
- Name: A
|
|
Indices: [ 7 ]
|
|
StartRow: 7
|
|
Cols: 4
|
|
StartCol: 0
|
|
Allocated: true
|
|
Kind: Arbitrary
|
|
ComponentType: SInt32
|
|
Interpolation: Constant
|
|
DynamicMask: 0x0
|
|
Stream: 0
|
|
|
|
The number of signature elements of each type is encoded in the
|
|
``llvm::dxbc::PSV::v1::RuntimeInfo`` structure. If any of the element count
|
|
values are non-zero, the size of the ``ProgramSignatureElement`` structure is
|
|
encoded next to allow versioning of that structure. Today there is only one
|
|
version. Following the size field is the specified number of signature elements
|
|
in the order input, output, then patch constant or primitive.
|
|
|
|
Following the signature elements is a sequence of mask vectors encoded as a
|
|
series of 32-bit integers. Each 32-bit integer in the mask encodes values for 8
|
|
input/output/patch or primitive elements. The mask vector is filled from least
|
|
significant bit to most significant bit with each added element shifting the
|
|
previous elements left. A reader needs to consult the total number of vectors
|
|
encoded in the ``RuntimeInfo`` structure to know how to read the mask vector.
|
|
|
|
If the shader has ``UsesViewID`` enabled in the ``RuntimeInfo`` an output mask
|
|
vector will be included. The output mask vector is four arrays of 32-bit
|
|
unsigned integers. Each of the four arrays corresponds to an output stream.
|
|
Geometry shaders have a maximum of four output streams, all other shader stages
|
|
only support one output stream. Each bit in the mask vector identifies one
|
|
column of an output from the output signature depends on the ViewID.
|
|
|
|
If the shader has ``UsesViewID`` enabled, it is a hull shader, and it has patch
|
|
constant or primitive vector elements, a patch constant or primitive vector mask
|
|
will be included. It is identical in structure to the output mask vector. Each
|
|
bit in the mask vector identifies one column of a patch constant output which
|
|
depends on the ViewID.
|
|
|
|
The next series of mask vectors are similar in structure to the output mask
|
|
vector, but they contain an extra dimension.
|
|
|
|
The output/input map is encoded next if the shader has inputs and outputs. The
|
|
output/input mask encodes which outputs are impacted by each column of each
|
|
input. The size for each mask vector is the size of the output max vector * the
|
|
number of inputs * 4 (for each component). Each bit in the mask vector
|
|
identifies one column of an output and a column of an input. A value of 1 means
|
|
the output is impacted by the input.
|
|
|
|
If the shader is a hull shader, and it has inputs and patch outputs, an input to
|
|
patch map will be included next. This is identical in structure to the
|
|
output/input map. The dimensions are defined by the size of the patch constant
|
|
or primitive vector mask * the number of inputs * 4 (for each component). Each
|
|
bit in the mask vector identifies one column of a patch constant output and a
|
|
column of an input. A value of 1 means the output is impacted by the input.
|
|
|
|
If the shader is a domain shader, and it has outputs and patch outputs, an
|
|
output patch map will be included next. This is identical in structure to the
|
|
output/input map. The dimensions are defined by the size of the patch constant
|
|
or primitive vector mask * the number of outputs * 4 (for each component). Each
|
|
bit in the mask vector identifies one column of a patch constant input and a
|
|
column of an output. A value of 1 means the output is impacted by the primitive
|
|
input.
|
|
|
|
Root Signature (RTS0) Part
|
|
--------------------------
|
|
.. _RTS0:
|
|
|
|
The Root Signature data defines the shader's resource interface with Direct3D
|
|
12, specifying what resources the shader needs to access and how they're
|
|
organized and bound to the pipeline.
|
|
|
|
The RTS0 part comprises three data structures: ``RootSignatureHeader``,
|
|
``RootParameters`` and ``StaticSamplers``. The details of each will be described
|
|
in the following sections. All ``RootParameters`` will be serialized following
|
|
the order they were defined in the metadata representation.
|
|
|
|
The table below summarizes the data being serialized as well as it's size. The
|
|
details of it part will be discussed in further details on the next sections
|
|
of this document.
|
|
|
|
======================== =========================================== =============================
|
|
Part Name Size In Bytes Maximum number of Instances
|
|
======================== =========================================== =============================
|
|
Root Signature Header 24 1
|
|
Root Parameter Headers 12 Many
|
|
Root Parameter ================================ === Many
|
|
Root Constants 12
|
|
Root Descriptor Version 1.0 8
|
|
Root Descriptor Version 1.1 12
|
|
Descriptors Tables Version 1.0 20
|
|
Descriptors Tables Version 1.1 24
|
|
================================ ===
|
|
|
|
Static Samplers 52 Many
|
|
======================== =========================================== =============================
|
|
|
|
|
|
Root Signature Header
|
|
~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
The root signature header is 24 bytes long, consisting of six 32-bit values
|
|
representing the version, number and offset of parameters, number and offset
|
|
of static samplers, and a flags field for global behaviours:
|
|
|
|
.. code-block:: c
|
|
|
|
struct RootSignatureHeader {
|
|
uint32_t Version;
|
|
uint32_t NumParameters;
|
|
uint32_t ParametersOffset;
|
|
uint32_t NumStaticSamplers;
|
|
uint32_t StaticSamplerOffset;
|
|
uint32_t Flags;
|
|
}
|
|
|
|
|
|
Root Parameters
|
|
~~~~~~~~~~~~~~~
|
|
|
|
Root parameters define how resources are bound to the shader pipeline, each
|
|
type having different size and fields.
|
|
|
|
The slot of root parameters is preceded by a variable size section containing
|
|
the header information for such parameters. Such structure is 12 bytes long,
|
|
composed of three 32-bit values, representing the parameter type, a flag
|
|
encoding the pipeline stages where the data is visible, and an offset
|
|
calculated from the start of RTS0 section.
|
|
|
|
.. code-block:: c
|
|
|
|
struct RootParameterHeader {
|
|
uint32_t ParameterType;
|
|
uint32_t ShaderVisibility;
|
|
uint32_t ParameterOffset;
|
|
};
|
|
|
|
After the header information has been serialized, the actual data for each of the
|
|
root parameters is layout in a single continuous blob. The parameters can be fetch
|
|
from such using the offset information, present in the header.
|
|
|
|
The following sections will describe each of the root parameters types and their
|
|
encodings.
|
|
|
|
Root Constants
|
|
''''''''''''''
|
|
|
|
The root constants are inline 32-bit values that show up in the shader
|
|
as a constant buffer. It is a 12 bytes long structure, two 32-bit values
|
|
encoding the register and space the constant is assigned to, and
|
|
the last 32 bits encode the number of constants being defined in the buffer.
|
|
|
|
.. code-block:: c
|
|
|
|
struct RootConstants {
|
|
uint32_t Register;
|
|
uint32_t Space;
|
|
uint32_t NumOfConstants;
|
|
};
|
|
|
|
Root Descriptor
|
|
'''''''''''''''
|
|
|
|
Root descriptors provide direct GPU memory addresses to resources.
|
|
|
|
In version 1.0, the root descriptor is 8 bytes. It encodes the register and
|
|
space as 2 32-bit values.
|
|
|
|
In version 1.1, the root descriptor is 12 bytes. It matches the 1.0 descriptor
|
|
but adds a 32-bit access flag.
|
|
|
|
.. code-block:: c
|
|
|
|
struct RootDescriptor_V1_0 {
|
|
uint32_t ShaderRegister;
|
|
uint32_t RegisterSpace;
|
|
};
|
|
|
|
struct RootDescriptor_V1_1 {
|
|
uint32_t ShaderRegister;
|
|
uint32_t RegisterSpace;
|
|
uint32_t Flags;
|
|
};
|
|
|
|
Root Descriptor Table
|
|
'''''''''''''''''''''
|
|
|
|
Descriptor tables let shaders access multiple resources through a single pointer
|
|
to a descriptor heap.
|
|
|
|
The tables are made of a collection of descriptor ranges. In Version 1.0, the
|
|
descriptor range is 20 bytes, containing five 32-bit values. It encodes a range
|
|
of registers, including the register type, range length, register numbers and
|
|
space within range and the offset locating each range inside the table.
|
|
|
|
In version 1.1, the descriptor range is 24 bytes. It matches the 1.0 descriptor
|
|
but adds a 32-bit access flag.
|
|
|
|
.. code-block:: c
|
|
|
|
struct DescriptorRange_V1_0 {
|
|
uint32_t RangeType;
|
|
uint32_t NumDescriptors;
|
|
uint32_t BaseShaderRegister;
|
|
uint32_t RegisterSpace;
|
|
uint32_t OffsetInDescriptorsFromTableStart;
|
|
};
|
|
|
|
struct DescriptorRange_V1_1 {
|
|
dxbc::DescriptorRangeType RangeType;
|
|
uint32_t NumDescriptors;
|
|
uint32_t BaseShaderRegister;
|
|
uint32_t RegisterSpace;
|
|
uint32_t OffsetInDescriptorsFromTableStart;
|
|
uint32_t Flags;
|
|
};
|
|
|
|
Static Samplers
|
|
~~~~~~~~~~~~~~~
|
|
|
|
Static samplers are predefined filtering settings built into the root signature,
|
|
avoiding descriptor heap lookups.
|
|
|
|
This section also has a variable size, since it can contain multiple static
|
|
samplers definitions. However, the definition is a fixed sized struct,
|
|
containing 13 32-byte fields of various enum, float, and integer values.
|
|
|
|
.. code-block:: c
|
|
|
|
struct StaticSamplerDesc {
|
|
FilterMode Filter;
|
|
TextureAddressMode AddressU;
|
|
TextureAddressMode AddressV;
|
|
TextureAddressMode AddressW;
|
|
float MipLODBias;
|
|
uint32_t MaxAnisotropy;
|
|
ComparisonFunc ComparisonFunc;
|
|
StaticBorderColor BorderColor;
|
|
float MinLOD;
|
|
float MaxLOD;
|
|
uint32_t ShaderRegister;
|
|
uint32_t RegisterSpace;
|
|
ShaderVisibility ShaderVisibility;
|
|
};
|
|
|
|
SFI0 Part
|
|
---------
|
|
.. _SFI0:
|
|
|
|
The SFI0 part encodes a 64-bit unsigned integer bitmask of the feature flags.
|
|
This denotes which optional features the shader requires. The flag values are
|
|
defined in `llvm/include/llvm/BinaryFormat/DXContainerConstants.def <https://github.com/llvm/llvm-project/blob/main/llvm/include/llvm/BinaryFormat/DXContainerConstants.def>`_.
|