@@ -197,7 +197,10 @@ static bool parseDescriptorRange(LLVMContext *Ctx,
197
197
.Case (" UAV" , llvm::to_underlying (dxbc::DescriptorRangeType::UAV))
198
198
.Case (" Sampler" ,
199
199
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);
201
204
202
205
if (std::optional<uint32_t > Val = extractMdIntValue (RangeDescriptorNode, 1 ))
203
206
Range.NumDescriptors = *Val;
@@ -349,16 +352,19 @@ static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
349
352
const bool IsSampler =
350
353
(Type == llvm::to_underlying (dxbc::DescriptorRangeType::Sampler));
351
354
355
+ if (Version == 1 ) {
356
+ if (IsSampler)
357
+ return Flags == FlagT::NONE;
358
+ return Flags == FlagT::DESCRIPTORS_VOLATILE;
359
+ }
360
+
352
361
// The data-specific flags are mutually exclusive.
353
362
FlagT DataFlags = FlagT::DATA_VOLATILE | FlagT::DATA_STATIC |
354
363
FlagT::DATA_STATIC_WHILE_SET_AT_EXECUTE;
355
364
356
365
if (popcount (llvm::to_underlying (Flags & DataFlags)) > 1 )
357
366
return false ;
358
367
359
- if (popcount (llvm::to_underlying (Flags & DataFlags)) == 1 )
360
- return true ;
361
-
362
368
// For volatile descriptors, DATA_STATIC is never valid.
363
369
if ((Flags & FlagT::DESCRIPTORS_VOLATILE) == FlagT::DESCRIPTORS_VOLATILE) {
364
370
FlagT Mask = FlagT::DESCRIPTORS_VOLATILE;
@@ -369,15 +375,21 @@ static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
369
375
return (Flags & ~Mask) == FlagT::NONE;
370
376
}
371
377
372
- // For default (static) or "STATIC_KEEPING_BUFFER_BOUNDS_CHECKS" descriptors,
378
+ // For "STATIC_KEEPING_BUFFER_BOUNDS_CHECKS" descriptors,
373
379
// 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;
379
389
}
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;
381
393
}
382
394
383
395
static bool validate (LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
0 commit comments