[llvm] [HLSL] Add descriptor table metadata parsing (PR #142492)
Justin Bogner via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 18 13:33:27 PDT 2025
================
@@ -241,6 +332,73 @@ static bool verifyRegisterSpace(uint32_t RegisterSpace) {
static bool verifyDescriptorFlag(uint32_t Flags) { return (Flags & ~0xE) == 0; }
+static bool verifyRangeType(uint32_t Type) {
+ switch (Type) {
+ case llvm::to_underlying(dxbc::DescriptorRangeType::CBV):
+ case llvm::to_underlying(dxbc::DescriptorRangeType::SRV):
+ case llvm::to_underlying(dxbc::DescriptorRangeType::UAV):
+ case llvm::to_underlying(dxbc::DescriptorRangeType::Sampler):
+ return true;
+ };
+
+ return false;
+}
+
+static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
+ uint32_t FlagsVal) {
+ using FlagT = dxbc::DescriptorRangeFlag;
+ FlagT Flags = FlagT(FlagsVal);
+
+ 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;
+
+ if (popcount(llvm::to_underlying(Flags & DataFlags)) > 1)
+ return false;
+
+ // The descriptor-specific flags are mutually exclusive.
+ FlagT DescriptorFlags =
+ FlagT::DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS |
+ FlagT::DESCRIPTORS_VOLATILE;
+ if (popcount(llvm::to_underlying(Flags & DescriptorFlags)) > 1)
+ return false;
+
+ // For volatile descriptors, DATA_STATIC is never valid.
+ if ((Flags & FlagT::DESCRIPTORS_VOLATILE) == FlagT::DESCRIPTORS_VOLATILE) {
+ FlagT Mask = FlagT::DESCRIPTORS_VOLATILE;
+ if (!IsSampler) {
+ Mask |= FlagT::DATA_VOLATILE;
+ Mask |= FlagT::DATA_STATIC_WHILE_SET_AT_EXECUTE;
+ }
+ return (Flags & ~Mask) == FlagT::NONE;
+ }
+
+ // For "STATIC_KEEPING_BUFFER_BOUNDS_CHECKS" descriptors,
+ // the other data-specific flags may all be set.
+ 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;
+ }
+
+ // When no descriptor flag is set, any data flag is allowed.
+ return (Flags & ~DataFlags) == FlagT::NONE;
----------------
bogner wrote:
This is not correct. Samplers can never have the `DATA_*` flags set.
https://github.com/llvm/llvm-project/pull/142492
More information about the llvm-commits
mailing list