@@ -197,7 +197,10 @@ static bool parseDescriptorRange(LLVMContext *Ctx,
197197 .Case (" UAV" , llvm::to_underlying (dxbc::DescriptorRangeType::UAV))
198198 .Case (" Sampler" ,
199199 llvm::to_underlying (dxbc::DescriptorRangeType::Sampler))
200- .Default (llvm::to_underlying (dxbc::DescriptorRangeType::ERROR));
200+ .Default (-1u );
201+
202+ if (Range.RangeType == -1u )
203+ return reportError (Ctx, " Invalid Descriptor Range type: " + *ElementText);
201204
202205 if (std::optional<uint32_t > Val = extractMdIntValue (RangeDescriptorNode, 1 ))
203206 Range.NumDescriptors = *Val;
@@ -349,16 +352,19 @@ static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
349352 const bool IsSampler =
350353 (Type == llvm::to_underlying (dxbc::DescriptorRangeType::Sampler));
351354
355+ if (Version == 1 ) {
356+ if (IsSampler)
357+ return Flags == FlagT::NONE;
358+ return Flags == FlagT::DESCRIPTORS_VOLATILE;
359+ }
360+
352361 // The data-specific flags are mutually exclusive.
353362 FlagT DataFlags = FlagT::DATA_VOLATILE | FlagT::DATA_STATIC |
354363 FlagT::DATA_STATIC_WHILE_SET_AT_EXECUTE;
355364
356365 if (popcount (llvm::to_underlying (Flags & DataFlags)) > 1 )
357366 return false ;
358367
359- if (popcount (llvm::to_underlying (Flags & DataFlags)) == 1 )
360- return true ;
361-
362368 // For volatile descriptors, DATA_STATIC is never valid.
363369 if ((Flags & FlagT::DESCRIPTORS_VOLATILE) == FlagT::DESCRIPTORS_VOLATILE) {
364370 FlagT Mask = FlagT::DESCRIPTORS_VOLATILE;
@@ -369,15 +375,21 @@ static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
369375 return (Flags & ~Mask) == FlagT::NONE;
370376 }
371377
372- // For default (static) or "STATIC_KEEPING_BUFFER_BOUNDS_CHECKS" descriptors,
378+ // For "STATIC_KEEPING_BUFFER_BOUNDS_CHECKS" descriptors,
373379 // the other data-specific flags may all be set.
374- FlagT Mask = FlagT::DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS;
375- if (!IsSampler) {
376- Mask |= FlagT::DATA_VOLATILE;
377- Mask |= FlagT::DATA_STATIC;
378- Mask |= FlagT::DATA_STATIC_WHILE_SET_AT_EXECUTE;
380+ if ((Flags & FlagT::DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS) ==
381+ FlagT::DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS) {
382+ FlagT Mask = FlagT::DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS;
383+ if (!IsSampler) {
384+ Mask |= FlagT::DATA_VOLATILE;
385+ Mask |= FlagT::DATA_STATIC;
386+ Mask |= FlagT::DATA_STATIC_WHILE_SET_AT_EXECUTE;
387+ }
388+ return (Flags & ~Mask) == FlagT::NONE;
379389 }
380- return (Flags & ~Mask) == FlagT::NONE;
390+
391+ // When no descriptor flag is set, any data flag is allowed.
392+ return (Flags & ~DataFlags) == FlagT::NONE;
381393}
382394
383395static bool validate (LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
0 commit comments