[llvm] [DX] Support pipeline state masks (PR #66425)

via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 14 12:44:31 PDT 2023


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-directx
            
<details>
<summary>Changes</summary>
The DXContainer pipeline state information encodes a bunch of mask vectors that are used to track things about the inputs and outputs from each shader.

This adds support for reading and writing them throught he YAML test interfaces. The writing logic in MC is extremely primitive and we'll want to revisit the API for that, but since I'm not sure how we'll want to generate the mask bits from DXIL during code generation I didn't want to spend too much time on the API.

Fixes #59479
--

Patch is 61.27 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/66425.diff

29 Files Affected:

- (modified) llvm/include/llvm/MC/DXContainerPSVInfo.h (+12) 
- (modified) llvm/include/llvm/Object/DXContainer.h (+75-2) 
- (modified) llvm/include/llvm/ObjectYAML/DXContainerYAML.h (+8) 
- (modified) llvm/include/llvm/Support/EndianStream.h (+9) 
- (modified) llvm/lib/MC/DXContainerPSVInfo.cpp (+13) 
- (modified) llvm/lib/Object/DXContainer.cpp (+62) 
- (modified) llvm/lib/ObjectYAML/DXContainerEmitter.cpp (+19) 
- (modified) llvm/lib/ObjectYAML/DXContainerYAML.cpp (+18) 
- (added) llvm/test/ObjectYAML/DXContainer/DomainMaskVectors.yaml (+200) 
- (added) llvm/test/ObjectYAML/DXContainer/GeometryMaskVectors.yaml (+174) 
- (added) llvm/test/ObjectYAML/DXContainer/HullMaskVectors.yaml (+181) 
- (modified) llvm/test/ObjectYAML/DXContainer/PSVv1-amplification.yaml (+14-4) 
- (modified) llvm/test/ObjectYAML/DXContainer/PSVv1-compute.yaml (+14-4) 
- (modified) llvm/test/ObjectYAML/DXContainer/PSVv1-domain.yaml (+20-8) 
- (modified) llvm/test/ObjectYAML/DXContainer/PSVv1-geometry.yaml (+14-4) 
- (modified) llvm/test/ObjectYAML/DXContainer/PSVv1-hull.yaml (+20-8) 
- (modified) llvm/test/ObjectYAML/DXContainer/PSVv1-mesh.yaml (+14-4) 
- (modified) llvm/test/ObjectYAML/DXContainer/PSVv1-pixel.yaml (+14-4) 
- (modified) llvm/test/ObjectYAML/DXContainer/PSVv1-vertex.yaml (+14-4) 
- (modified) llvm/test/ObjectYAML/DXContainer/PSVv2-amplification.yaml (+14-4) 
- (modified) llvm/test/ObjectYAML/DXContainer/PSVv2-compute.yaml (+14-4) 
- (modified) llvm/test/ObjectYAML/DXContainer/PSVv2-domain.yaml (+20-8) 
- (modified) llvm/test/ObjectYAML/DXContainer/PSVv2-geometry.yaml (+14-4) 
- (modified) llvm/test/ObjectYAML/DXContainer/PSVv2-hull.yaml (+20-8) 
- (modified) llvm/test/ObjectYAML/DXContainer/PSVv2-mesh.yaml (+14-4) 
- (modified) llvm/test/ObjectYAML/DXContainer/PSVv2-pixel.yaml (+14-4) 
- (modified) llvm/test/ObjectYAML/DXContainer/PSVv2-vertex.yaml (+14-4) 
- (modified) llvm/test/ObjectYAML/DXContainer/SigElements.yaml (+7-2) 
- (modified) llvm/tools/obj2yaml/dxcontainer2yaml.cpp (+19) 


<pre>
diff --git a/llvm/include/llvm/MC/DXContainerPSVInfo.h b/llvm/include/llvm/MC/DXContainerPSVInfo.h
index dc6bf2fa40d065a..76e3e498029c4a1 100644
--- a/llvm/include/llvm/MC/DXContainerPSVInfo.h
+++ b/llvm/include/llvm/MC/DXContainerPSVInfo.h
@@ -51,6 +51,18 @@ struct PSVRuntimeInfo {
   SmallVector&lt;PSVSignatureElement&gt; OutputElements;
   SmallVector&lt;PSVSignatureElement&gt; PatchOrPrimElements;
 
+  // The interface here is bad, and we&#x27;ll want to change this in the future. We
+  // probably will want to build out these mask vectors as vectors of bools and
+  // have this utility object convert them to the bit masks. I don&#x27;t want to
+  // over-engineer this API now since we don&#x27;t know what the data coming in to
+  // feed it will look like, so I kept it extremely simple for the immediate use
+  // case.
+  SmallVector&lt;uint32_t&gt; OutputVectorMasks[4];
+  SmallVector&lt;uint32_t&gt; PatchOrPrimMasks;
+  SmallVector&lt;uint32_t&gt; InputOutputMap[4];
+  SmallVector&lt;uint32_t&gt; InputPatchMap;
+  SmallVector&lt;uint32_t&gt; PatchOutputMap;
+
   // Serialize PSVInfo into the provided raw_ostream. The version field
   // specifies the data version to encode, the default value specifies encoding
   // the highest supported version.
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index 2aae0a199f8c1c0..9ea8a48f9430d74 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -27,6 +27,18 @@ namespace llvm {
 namespace object {
 
 namespace DirectX {
+
+namespace detail {
+template &lt;typename T&gt;
+std::enable_if_t&lt;std::is_arithmetic&lt;T&gt;::value, void&gt; swapBytes(T &amp;value) {
+  sys::swapByteOrder(value);
+}
+
+template &lt;typename T&gt;
+std::enable_if_t&lt;std::is_class&lt;T&gt;::value, void&gt; swapBytes(T &amp;value) {
+  value.swapBytes();
+}
+} // namespace detail
 class PSVRuntimeInfo {
 
   // This class provides a view into the underlying resource array. The Resource
@@ -35,7 +47,7 @@ class PSVRuntimeInfo {
   // swaps it as appropriate.
   template &lt;typename T&gt; struct ViewArray {
     StringRef Data;
-    uint32_t Stride; // size of each element in the list.
+    uint32_t Stride = sizeof(T); // size of each element in the list.
 
     ViewArray() = default;
     ViewArray(StringRef D, size_t S) : Data(D), Stride(S) {}
@@ -65,7 +77,7 @@ class PSVRuntimeInfo {
         memcpy(static_cast&lt;void *&gt;(&amp;Val), Current,
                std::min(Stride, MaxStride()));
         if (sys::IsBigEndianHost)
-          Val.swapBytes();
+          detail::swapBytes(Val);
         return Val;
       }
 
@@ -120,6 +132,12 @@ class PSVRuntimeInfo {
   SigElementArray SigOutputElements;
   SigElementArray SigPatchOrPrimElements;
 
+  ViewArray&lt;uint32_t&gt; OutputVectorMasks[4];
+  ViewArray&lt;uint32_t&gt; PatchOrPrimMasks;
+  ViewArray&lt;uint32_t&gt; InputOutputMap[4];
+  ViewArray&lt;uint32_t&gt; InputPatchMap;
+  ViewArray&lt;uint32_t&gt; PatchOutputMap;
+
 public:
   PSVRuntimeInfo(StringRef D) : Data(D), Size(0) {}
 
@@ -140,6 +158,22 @@ class PSVRuntimeInfo {
 
   const InfoStruct &amp;getInfo() const { return BasicInfo; }
 
+  template &lt;typename T&gt; const T *getInfoAs() const {
+    if (const auto *P = std::get_if&lt;dxbc::PSV::v2::RuntimeInfo&gt;(&amp;BasicInfo))
+      return static_cast&lt;const T *&gt;(P);
+    if (std::is_same&lt;T, dxbc::PSV::v2::RuntimeInfo&gt;::value)
+      return nullptr;
+
+    if (const auto *P = std::get_if&lt;dxbc::PSV::v1::RuntimeInfo&gt;(&amp;BasicInfo))
+      return static_cast&lt;const T *&gt;(P);
+    if (std::is_same&lt;T, dxbc::PSV::v1::RuntimeInfo&gt;::value)
+      return nullptr;
+
+    if (const auto *P = std::get_if&lt;dxbc::PSV::v0::RuntimeInfo&gt;(&amp;BasicInfo))
+      return static_cast&lt;const T *&gt;(P);
+    return nullptr;
+  }
+
   StringRef getStringTable() const { return StringTable; }
   ArrayRef&lt;uint32_t&gt; getSemanticIndexTable() const {
     return SemanticIndexTable;
@@ -155,7 +189,46 @@ class PSVRuntimeInfo {
     return SigPatchOrPrimElements;
   }
 
+  ViewArray&lt;uint32_t&gt; getOutputVectorMasks(size_t Idx) const {
+    assert(Idx &lt; 4);
+    return OutputVectorMasks[Idx];
+  }
+
+  ViewArray&lt;uint32_t&gt; getPatchOrPrimMasks() const { return PatchOrPrimMasks; }
+
+  ViewArray&lt;uint32_t&gt; getInputOutputMap(size_t Idx) const {
+    assert(Idx &lt; 4);
+    return InputOutputMap[Idx];
+  }
+
+  ViewArray&lt;uint32_t&gt; getInputPatchMap() const { return InputPatchMap; }
+  ViewArray&lt;uint32_t&gt; getPatchOutputMap() const { return PatchOutputMap; }
+
   uint32_t getSigElementStride() const { return SigInputElements.Stride; }
+
+  bool usesViewID() const {
+    if (const auto *P = getInfoAs&lt;dxbc::PSV::v1::RuntimeInfo&gt;())
+      return P-&gt;UsesViewID != 0;
+    return false;
+  }
+
+  uint8_t getInputVectorCount() const {
+    if (const auto *P = getInfoAs&lt;dxbc::PSV::v1::RuntimeInfo&gt;())
+      return P-&gt;SigInputVectors;
+    return 0;
+  }
+
+  ArrayRef&lt;uint8_t&gt; getOutputVectorCounts() const {
+    if (const auto *P = getInfoAs&lt;dxbc::PSV::v1::RuntimeInfo&gt;())
+      return ArrayRef&lt;uint8_t&gt;(P-&gt;SigOutputVectors);
+    return ArrayRef&lt;uint8_t&gt;();
+  }
+
+  uint8_t getPatchConstOrPrimVectorCount() const {
+    if (const auto *P = getInfoAs&lt;dxbc::PSV::v1::RuntimeInfo&gt;())
+      return P-&gt;GeomData.SigPatchConstOrPrimVectors;
+    return 0;
+  }
 };
 
 } // namespace DirectX
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index 1ab979fd0dfeaca..bce6fa8475bdd48 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -113,6 +113,13 @@ struct PSVInfo {
   SmallVector&lt;SignatureElement&gt; SigOutputElements;
   SmallVector&lt;SignatureElement&gt; SigPatchOrPrimElements;
 
+  using MaskVector = SmallVector&lt;llvm::yaml::Hex32&gt;;
+  MaskVector OutputVectorMasks[4];
+  MaskVector PatchOrPrimMasks;
+  MaskVector InputOutputMap[4];
+  MaskVector InputPatchMap;
+  MaskVector PatchOutputMap;
+
   void mapInfoForVersion(yaml::IO &amp;IO);
 
   PSVInfo();
@@ -143,6 +150,7 @@ struct Object {
 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::Part)
 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::ResourceBindInfo)
 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::SignatureElement)
+LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::PSVInfo::MaskVector)
 LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::SemanticKind)
 LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::ComponentType)
 LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::InterpolationMode)
diff --git a/llvm/include/llvm/Support/EndianStream.h b/llvm/include/llvm/Support/EndianStream.h
index 8ff87d23e83b145..a1dac5ad9f42a74 100644
--- a/llvm/include/llvm/Support/EndianStream.h
+++ b/llvm/include/llvm/Support/EndianStream.h
@@ -25,6 +25,15 @@ namespace support {
 
 namespace endian {
 
+template &lt;typename value_type&gt;
+inline void write_array(raw_ostream &amp;os, ArrayRef&lt;value_type&gt; values,
+                        endianness endian) {
+  for (const auto orig : values) {
+    value_type value = byte_swap&lt;value_type&gt;(orig, endian);
+    os.write((const char *)&amp;value, sizeof(value_type));
+  }
+}
+
 template &lt;typename value_type&gt;
 inline void write(raw_ostream &amp;os, value_type value, endianness endian) {
   value = byte_swap&lt;value_type&gt;(value, endian);
diff --git a/llvm/lib/MC/DXContainerPSVInfo.cpp b/llvm/lib/MC/DXContainerPSVInfo.cpp
index 03df6be41a21c21..533659053c36f3d 100644
--- a/llvm/lib/MC/DXContainerPSVInfo.cpp
+++ b/llvm/lib/MC/DXContainerPSVInfo.cpp
@@ -147,4 +147,17 @@ void PSVRuntimeInfo::write(raw_ostream &amp;OS, uint32_t Version) const {
     OS.write(reinterpret_cast&lt;const char *&gt;(&amp;SignatureElements[0]),
              SignatureElements.size() * sizeof(v0::SignatureElement));
   }
+
+  for (const auto &amp;MaskVector : OutputVectorMasks)
+    support::endian::write_array(OS, ArrayRef&lt;uint32_t&gt;(MaskVector),
+                                 support::little);
+  support::endian::write_array(OS, ArrayRef&lt;uint32_t&gt;(PatchOrPrimMasks),
+                               support::little);
+  for (const auto &amp;MaskVector : InputOutputMap)
+    support::endian::write_array(OS, ArrayRef&lt;uint32_t&gt;(MaskVector),
+                                 support::little);
+  support::endian::write_array(OS, ArrayRef&lt;uint32_t&gt;(InputPatchMap),
+                               support::little);
+  support::endian::write_array(OS, ArrayRef&lt;uint32_t&gt;(PatchOutputMap),
+                               support::little);
 }
diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp
index df1f98213a9951f..16433f11eef625f 100644
--- a/llvm/lib/Object/DXContainer.cpp
+++ b/llvm/lib/Object/DXContainer.cpp
@@ -321,6 +321,68 @@ Error DirectX::PSVRuntimeInfo::parse(uint16_t ShaderKind) {
     Current += PSize;
   }
 
+  ArrayRef&lt;uint8_t&gt; OutputVectorCounts = getOutputVectorCounts();
+  uint8_t PatchConstOrPrimVectorCount = getPatchConstOrPrimVectorCount();
+  uint8_t InputVectorCount = getInputVectorCount();
+
+  auto maskDwordSize = [](uint8_t Vector) {
+    return (static_cast&lt;uint32_t&gt;(Vector) + 7) &gt;&gt; 3;
+  };
+
+  auto mapTableSize = [maskDwordSize](uint8_t X, uint8_t Y) {
+    return maskDwordSize(Y) * X * 4;
+  };
+
+  if (usesViewID()) {
+    for (uint32_t I = 0; I &lt; 4; ++I) {
+      // The vector mask is one bit per component and 4 components per vector.
+      // We can compute the number of dwords required by rounding up to the next
+      // multiple of 8.
+      uint32_t NumDwords =
+          maskDwordSize(static_cast&lt;uint32_t&gt;(OutputVectorCounts[I]));
+      size_t NumBytes = NumDwords * sizeof(uint32_t);
+      OutputVectorMasks[I].Data = Data.substr(Current - Data.begin(), NumBytes);
+      Current += NumBytes;
+    }
+
+    if (ShaderStage == Triple::Hull &amp;&amp; PatchConstOrPrimVectorCount &gt; 0) {
+      uint32_t NumDwords = maskDwordSize(PatchConstOrPrimVectorCount);
+      size_t NumBytes = NumDwords * sizeof(uint32_t);
+      PatchOrPrimMasks.Data = Data.substr(Current - Data.begin(), NumBytes);
+      Current += NumBytes;
+    }
+  }
+
+  // Input/Output mapping table
+  for (uint32_t I = 0; I &lt; 4; ++I) {
+    if (InputVectorCount == 0 || OutputVectorCounts[I] == 0)
+      continue;
+    uint32_t NumDwords = mapTableSize(InputVectorCount, OutputVectorCounts[I]);
+    size_t NumBytes = NumDwords * sizeof(uint32_t);
+    InputOutputMap[I].Data = Data.substr(Current - Data.begin(), NumBytes);
+    Current += NumBytes;
+  }
+
+  // Hull shader: Input/Patch mapping table
+  if (ShaderStage == Triple::Hull &amp;&amp; PatchConstOrPrimVectorCount &gt; 0 &amp;&amp;
+      InputVectorCount &gt; 0) {
+    uint32_t NumDwords =
+        mapTableSize(InputVectorCount, PatchConstOrPrimVectorCount);
+    size_t NumBytes = NumDwords * sizeof(uint32_t);
+    InputPatchMap.Data = Data.substr(Current - Data.begin(), NumBytes);
+    Current += NumBytes;
+  }
+
+  // Domain Shader: Patch/Output mapping table
+  if (ShaderStage == Triple::Domain &amp;&amp; PatchConstOrPrimVectorCount &gt; 0 &amp;&amp;
+      OutputVectorCounts[0] &gt; 0) {
+    uint32_t NumDwords =
+        mapTableSize(PatchConstOrPrimVectorCount, OutputVectorCounts[0]);
+    size_t NumBytes = NumDwords * sizeof(uint32_t);
+    PatchOutputMap.Data = Data.substr(Current - Data.begin(), NumBytes);
+    Current += NumBytes;
+  }
+
   return Error::success();
 }
 
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index c5d5d6551d401c5..de8b0f59844bfff 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -219,6 +219,25 @@ void DXContainerWriter::writeParts(raw_ostream &amp;OS) {
             El.Allocated, El.Kind, El.Type, El.Mode, El.DynamicMask,
             El.Stream});
 
+      for (int I = 0; I &lt; 4; ++I) {
+        PSV.OutputVectorMasks[I].insert(PSV.OutputVectorMasks[I].begin(),
+                                        P.Info-&gt;OutputVectorMasks[I].begin(),
+                                        P.Info-&gt;OutputVectorMasks[I].end());
+        PSV.InputOutputMap[I].insert(PSV.InputOutputMap[I].begin(),
+                                     P.Info-&gt;InputOutputMap[I].begin(),
+                                     P.Info-&gt;InputOutputMap[I].end());
+      }
+
+      PSV.PatchOrPrimMasks.insert(PSV.PatchOrPrimMasks.begin(),
+                                  P.Info-&gt;PatchOrPrimMasks.begin(),
+                                  P.Info-&gt;PatchOrPrimMasks.end());
+      PSV.InputPatchMap.insert(PSV.InputPatchMap.begin(),
+                               P.Info-&gt;InputPatchMap.begin(),
+                               P.Info-&gt;InputPatchMap.end());
+      PSV.PatchOutputMap.insert(PSV.PatchOutputMap.begin(),
+                                P.Info-&gt;PatchOutputMap.begin(),
+                                P.Info-&gt;PatchOutputMap.end());
+
       PSV.finalize(static_cast&lt;Triple::EnvironmentType&gt;(
           Triple::Pixel + P.Info-&gt;Info.ShaderStage));
       PSV.write(OS, P.Info-&gt;Version);
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 2b03098d7a5d08b..c7cf1ec9afc1f66 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -139,6 +139,24 @@ void MappingTraits&lt;DXContainerYAML::PSVInfo&gt;::mapping(
   IO.mapRequired(&quot;SigInputElements&quot;, PSV.SigInputElements);
   IO.mapRequired(&quot;SigOutputElements&quot;, PSV.SigOutputElements);
   IO.mapRequired(&quot;SigPatchOrPrimElements&quot;, PSV.SigPatchOrPrimElements);
+
+  Triple::EnvironmentType Stage = dxbc::getShaderStage(PSV.Info.ShaderStage);
+  if (PSV.Info.UsesViewID) {
+    MutableArrayRef&lt;SmallVector&lt;llvm::yaml::Hex32&gt;&gt; MutableOutMasks(
+        PSV.OutputVectorMasks);
+    IO.mapRequired(&quot;OutputVectorMasks&quot;, MutableOutMasks);
+    if (Stage == Triple::EnvironmentType::Hull)
+      IO.mapRequired(&quot;PatchOrPrimMasks&quot;, PSV.PatchOrPrimMasks);
+  }
+  MutableArrayRef&lt;SmallVector&lt;llvm::yaml::Hex32&gt;&gt; MutableIOMap(
+      PSV.InputOutputMap);
+  IO.mapRequired(&quot;InputOutputMap&quot;, MutableIOMap);
+
+  if (Stage == Triple::EnvironmentType::Hull)
+    IO.mapRequired(&quot;InputPatchMap&quot;, PSV.InputPatchMap);
+
+  if (Stage == Triple::EnvironmentType::Domain)
+    IO.mapRequired(&quot;PatchOutputMap&quot;, PSV.PatchOutputMap);
 }
 
 void MappingTraits&lt;DXContainerYAML::Part&gt;::mapping(IO &amp;IO,
diff --git a/llvm/test/ObjectYAML/DXContainer/DomainMaskVectors.yaml b/llvm/test/ObjectYAML/DXContainer/DomainMaskVectors.yaml
new file mode 100644
index 000000000000000..713fbc61e094b5a
--- /dev/null
+++ b/llvm/test/ObjectYAML/DXContainer/DomainMaskVectors.yaml
@@ -0,0 +1,200 @@
+# RUN: yaml2obj %s | obj2yaml | FileCheck %s
+--- !dxcontainer
+Header:
+  Hash:            [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
+                     0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
+  Version:
+    Major:           1
+    Minor:           0
+  FileSize:        4616
+  PartCount:       8
+  PartOffsets:     [ 64, 80, 140, 200, 580, 952, 2756, 2784 ]
+Parts:
+  - Name:            SFI0
+    Size:            8
+    Flags:
+      Doubles:         false
+      ComputeShadersPlusRawAndStructuredBuffers: false
+      UAVsAtEveryStage: false
+      Max64UAVs:       false
+      MinimumPrecision: false
+      DX11_1_DoubleExtensions: false
+      DX11_1_ShaderExtensions: false
+      LEVEL9ComparisonFiltering: false
+      TiledResources:  false
+      StencilRef:      false
+      InnerCoverage:   false
+      TypedUAVLoadAdditionalFormats: false
+      ROVs:            false
+      ViewportAndRTArrayIndexFromAnyShaderFeedingRasterizer: false
+      WaveOps:         false
+      Int64Ops:        false
+      ViewID:          true
+      Barycentrics:    false
+      NativeLowPrecision: false
+      ShadingRate:     false
+      Raytracing_Tier_1_1: false
+      SamplerFeedback: false
+      AtomicInt64OnTypedResource: false
+      AtomicInt64OnGroupShared: false
+      DerivativesInMeshAndAmpShaders: false
+      ResourceDescriptorHeapIndexing: false
+      SamplerDescriptorHeapIndexing: false
+      RESERVED:        false
+      AtomicInt64OnHeapResource: false
+      AdvancedTextureOps: false
+      WriteableMSAATextures: false
+      NextUnusedBit:   false
+  - Name:            ISG1
+    Size:            52
+  - Name:            OSG1
+    Size:            52
+  - Name:            PSG1
+    Size:            372
+  - Name:            PSV0
+    Size:            364
+    PSVInfo:
+      Version:         2
+      ShaderStage:     4
+      InputControlPointCount: 16
+      OutputPositionPresent: 1
+      TessellatorDomain: 3
+      MinimumWaveLaneCount: 0
+      MaximumWaveLaneCount: 4294967295
+      UsesViewID:      1
+      SigPatchConstOrPrimVectors: 7
+      SigInputVectors: 1
+      SigOutputVectors: [ 1, 0, 0, 0 ]
+      NumThreadsX:     0
+      NumThreadsY:     0
+      NumThreadsZ:     0
+      ResourceStride:  24
+      Resources:
+        - Type:            2
+          Space:           0
+          LowerBound:      0
+          UpperBound:      0
+          Kind:            13
+          Flags:           0
+      SigInputElements:
+        - Name:       ...
<truncated>
</pre>
</details>


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


More information about the llvm-commits mailing list