[llvm-branch-commits] [llvm] [DirectX] Adding missing descriptor table validations (PR #153276)

Finn Plummer via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Mon Aug 25 15:24:25 PDT 2025


================
@@ -513,6 +515,58 @@ Error MetadataParser::parseRootSignatureElement(mcdxbc::RootSignatureDesc &RSD,
   llvm_unreachable("Unhandled RootSignatureElementKind enum.");
 }
 
+Error validateDescriptorTableSamplerMixin(mcdxbc::DescriptorTable Table,
+                                          uint32_t Location) {
+  bool HasSampler = false;
+  bool HasOtherRangeType = false;
+  dxbc::DescriptorRangeType OtherRangeType;
+
+  for (const dxbc::RTS0::v2::DescriptorRange &Range : Table.Ranges) {
+    dxbc::DescriptorRangeType RangeType =
+        static_cast<dxbc::DescriptorRangeType>(Range.RangeType);
+
+    if (RangeType == dxbc::DescriptorRangeType::Sampler) {
+      HasSampler = true;
+    } else {
+      HasOtherRangeType = true;
+      OtherRangeType = RangeType;
+    }
+  }
+
+  // Samplers cannot be mixed with other resources in a descriptor table.
+  if (HasSampler && HasOtherRangeType)
+    return make_error<TableSamplerMixinError>(OtherRangeType, Location);
+  return Error::success();
+}
+
+Error validateDescriptorTableRegisterOverflow(mcdxbc::DescriptorTable Table,
+                                              uint32_t Location) {
+  uint64_t AppendingRegister = 0;
+
+  for (const dxbc::RTS0::v2::DescriptorRange &Range : Table.Ranges) {
+    dxbc::DescriptorRangeType RangeType =
+        static_cast<dxbc::DescriptorRangeType>(Range.RangeType);
+
+    if (verifyOffsetOverflow(Range.OffsetInDescriptorsFromTableStart,
+                             AppendingRegister))
+      return make_error<TableRegisterOverflowError>(
+          RangeType, Range.BaseShaderRegister, Range.RegisterSpace);
+
+    if (verifyRegisterOverflow(Range.BaseShaderRegister, Range.NumDescriptors))
+      return make_error<TableRegisterOverflowError>(
+          RangeType, Range.BaseShaderRegister, Range.RegisterSpace);
+
+    if (verifyRegisterOverflow(AppendingRegister, Range.NumDescriptors))
+      return make_error<TableRegisterOverflowError>(
----------------
inbelic wrote:

These provide the same error message for the different cases. I think we should be at least on par, if not better than DXC here. [DXC for reference](https://github.com/microsoft/DirectXShaderCompiler/blob/dbcbac93c8f33b623b26c930d969d950a00c0ed8/lib/DxilRootSignature/DxilRootSignatureValidator.cpp#L204).

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


More information about the llvm-branch-commits mailing list