[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