[llvm] [Docs][DirectX] Add relevant documentation of Root Signature (PR #149608)

Justin Bogner via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 22 09:45:38 PDT 2025


================
@@ -0,0 +1,231 @@
+===============
+Root Signatures
+===============
+
+.. contents::
+   :local:
+
+.. toctree::
+   :hidden:
+
+Overview
+========
+
+A root signature is used to describe what resources a shader needs access to
+and how they're organized and bound in the pipeline. The DirectX Container
+(DXContainer) contains a root signature part (RTS0), which stores this
+information in a binary format. To assist with the construction of, and
+interaction with, a root signature is represented as metadata
+(``dx.rootsignatures`` ) in the LLVM IR. The metadata can then be converted to
+its binary form, as defined in
+`llvm/include/llvm/llvm/Frontend/HLSL/RootSignatureMetadata.h
+<https://github.com/llvm/llvm-project/blob/main/llvm/include/llvm/Frontend/HLSL/RootSignatureMetadata.h>`_.
+This document serves as a reference for the metadata representation of a root
+signature for users to interface with.
+
+Metadata Representation
+=======================
+
+Consider the reference root signature, then the following sections describe the
+metadata representation of this root signature and the corresponding operands.
+
+.. code-block:: C
+
+  #define DemoRootSignature                                                    \
+    "RootFlags(ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT),"                           \
+    "RootConstants(b0, space = 1, num32Constants = 3),"                        \
+    "CBV(b1, flags = 0),"                                                      \
+    "StaticSampler("                                                           \
+    "  filter = FILTER_MIN_MAG_POINT_MIP_LINEAR,"                              \
+    "  addressU = TEXTURE_ADDRESS_BORDER,"                                     \
+    "),"                                                                       \
+    "DescriptorTable("                                                         \
+    "  visibility = VISIBILITY_ALL,"                                           \
+    "  SRV(t0, flags = DATA_STATIC_WHILE_SET_AT_EXECUTE),"                     \
+    "  UAV("                                                                   \
+    "    numDescriptors = 5, u1, space = 10, offset = 5,"                      \
+    "    flags = DATA_VOLATILE"                                                \
+    "  )"                                                                      \
+    ")"
+
+.. note::
+
+  A root signature does not necessarily have a unique metadata representation.
+  Futher, a malformed root signature can be represented in the metadata format,
+  (eg. mixing Sampler and non-Sampler descriptor ranges), and so it is the
+  user's responsibility to verify that it is a well-formed root signature.
+
+Named Root Signature Table
+==========================
+
+.. code-block:: LLVM
+
+  !dx.rootsignatures = !{!0}
+
+A named metadata node, ``dx.rootsignatures``` is used to identify the root
+signature table. The table itself is a list of references to function/root
+signature pairs.
+
+Function/Root Signature Pair
+============================
+
+.. code-block:: LLVM
+
+  !1 = !{ptr @main, !2, i32 2 }
+
+The function/root signature associates a function (the first operand) with a
+reference to a root signature (the second operand). The root signature version
+(the third operand) used for validation logic and binary format follows.
+
+Root Signature
+==============
+
+.. code-block:: LLVM
+
+  !2 = !{ !3, !4, !5, !6, !7 }
+
+The root signature itself simply consists of a list of references to its root
+signature elements.
+
+Root Signature Element
+======================
+
+A root signature element is identified by the first operand, which is a string.
+The following root signature elements are defined:
+
+.. csv-table::
+
+  Identifier String, Root Signature Element
+
+  \"RootFlags\",       Root Flags
+  \"RootConstants\",   Root Constants
+  \"RootCBV\",         Root Descriptor
+  \"RootSRV\",         Root Descriptor
+  \"RootUAV\",         Root Descriptor
+  \"StaticSampler\",   Static Sampler
+  \"DescriptorTable\", Descriptor Table
----------------
bogner wrote:

Probably more readable to just use the simple table format here
```suggestion
================= ======================
Identifier String Root Signature Element
================= ======================
"RootFlags"       Root Flags
"RootConstants"   Root Constants
"RootCBV"         Root Descriptor
"RootSRV"         Root Descriptor
"RootUAV"         Root Descriptor
"StaticSampler"   Static Sampler
"DescriptorTable" Descriptor Table
================= ======================
```

https://github.com/llvm/llvm-project/pull/149608


More information about the llvm-commits mailing list