aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoaosaffran <joao.saffran@microsoft.com>2025-06-12 18:03:24 +0000
committerjoaosaffran <joao.saffran@microsoft.com>2025-06-12 18:03:24 +0000
commite8066df9de55e5d2aabb7c2a4720b9d2ab00d755 (patch)
treed73dd7bdfb6e00328fca84d8529f2a58bb7b88de
parent91346a7b5d739f307cb7aee4c6572238a756fc6f (diff)
downloadllvm-users/joaosaffran/142492.zip
llvm-users/joaosaffran/142492.tar.gz
llvm-users/joaosaffran/142492.tar.bz2
address commentsusers/joaosaffran/142492
-rw-r--r--llvm/include/llvm/BinaryFormat/DXContainerConstants.def3
-rw-r--r--llvm/lib/Target/DirectX/DXILRootSignature.cpp34
-rw-r--r--llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RangeType.ll2
3 files changed, 25 insertions, 14 deletions
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index 4286345..a2b2ea3 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -100,12 +100,11 @@ DESCRIPTOR_RANGE_FLAG(0x10000, DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS)
// DESCRIPTOR_RANGE(value, name).
#ifdef DESCRIPTOR_RANGE
-DESCRIPTOR_RANGE(4, ERROR)
DESCRIPTOR_RANGE(0, SRV)
DESCRIPTOR_RANGE(1, UAV)
DESCRIPTOR_RANGE(2, CBV)
DESCRIPTOR_RANGE(3, Sampler)
-DESCRIPTOR_RANGE(0, NONE)
+DESCRIPTOR_RANGE(4, NONE)
#undef DESCRIPTOR_RANGE
#endif // DESCRIPTOR_RANGE
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 04805ce..e51bd67 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -197,7 +197,10 @@ static bool parseDescriptorRange(LLVMContext *Ctx,
.Case("UAV", llvm::to_underlying(dxbc::DescriptorRangeType::UAV))
.Case("Sampler",
llvm::to_underlying(dxbc::DescriptorRangeType::Sampler))
- .Default(llvm::to_underlying(dxbc::DescriptorRangeType::ERROR));
+ .Default(-1u);
+
+ if (Range.RangeType == -1u)
+ return reportError(Ctx, "Invalid Descriptor Range type: " + *ElementText);
if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 1))
Range.NumDescriptors = *Val;
@@ -349,6 +352,12 @@ static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
const bool IsSampler =
(Type == llvm::to_underlying(dxbc::DescriptorRangeType::Sampler));
+ if (Version == 1) {
+ if (IsSampler)
+ return Flags == FlagT::NONE;
+ return Flags == FlagT::DESCRIPTORS_VOLATILE;
+ }
+
// The data-specific flags are mutually exclusive.
FlagT DataFlags = FlagT::DATA_VOLATILE | FlagT::DATA_STATIC |
FlagT::DATA_STATIC_WHILE_SET_AT_EXECUTE;
@@ -356,9 +365,6 @@ static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
if (popcount(llvm::to_underlying(Flags & DataFlags)) > 1)
return false;
- if (popcount(llvm::to_underlying(Flags & DataFlags)) == 1)
- return true;
-
// For volatile descriptors, DATA_STATIC is never valid.
if ((Flags & FlagT::DESCRIPTORS_VOLATILE) == FlagT::DESCRIPTORS_VOLATILE) {
FlagT Mask = FlagT::DESCRIPTORS_VOLATILE;
@@ -369,15 +375,21 @@ static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
return (Flags & ~Mask) == FlagT::NONE;
}
- // For default (static) or "STATIC_KEEPING_BUFFER_BOUNDS_CHECKS" descriptors,
+ // For "STATIC_KEEPING_BUFFER_BOUNDS_CHECKS" descriptors,
// the other data-specific flags may all be set.
- FlagT Mask = FlagT::DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS;
- if (!IsSampler) {
- Mask |= FlagT::DATA_VOLATILE;
- Mask |= FlagT::DATA_STATIC;
- Mask |= FlagT::DATA_STATIC_WHILE_SET_AT_EXECUTE;
+ if ((Flags & FlagT::DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS) ==
+ FlagT::DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS) {
+ FlagT Mask = FlagT::DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS;
+ if (!IsSampler) {
+ Mask |= FlagT::DATA_VOLATILE;
+ Mask |= FlagT::DATA_STATIC;
+ Mask |= FlagT::DATA_STATIC_WHILE_SET_AT_EXECUTE;
+ }
+ return (Flags & ~Mask) == FlagT::NONE;
}
- return (Flags & ~Mask) == FlagT::NONE;
+
+ // When no descriptor flag is set, any data flag is allowed.
+ return (Flags & ~DataFlags) == FlagT::NONE;
}
static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RangeType.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RangeType.ll
index 1d18c0c..fc861ab 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RangeType.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RangeType.ll
@@ -2,7 +2,7 @@
target triple = "dxil-unknown-shadermodel6.0-compute"
-; CHECK: error: Invalid value for RangeType: 4
+; CHECK: error: Invalid Descriptor Range type: Invalid
; CHECK-NOT: Root Signature Definitions
define void @main() #0 {