@@ -323,7 +323,7 @@ static bool verifyRegisterValue(uint32_t RegisterValue) {
323
323
// This Range is reserverved, therefore invalid, according to the spec
324
324
// https://github.com/llvm/wg-hlsl/blob/main/proposals/0002-root-signature-in-clang.md#all-the-values-should-be-legal
325
325
static bool verifyRegisterSpace (uint32_t RegisterSpace) {
326
- return !(RegisterSpace >= 0xFFFFFFF0 && RegisterSpace < 0xFFFFFFFF );
326
+ return !(RegisterSpace >= 0xFFFFFFF0 && RegisterSpace <= 0xFFFFFFFF );
327
327
}
328
328
329
329
static bool verifyDescriptorFlag (uint32_t Flags) { return (Flags & ~0xE ) == 0 ; }
@@ -340,63 +340,61 @@ static bool verifyRangeType(uint32_t Type) {
340
340
return false ;
341
341
}
342
342
343
+ template <typename ... FlagTypes>
344
+ static bool isFlagSet (uint32_t Flags, FlagTypes... FlagsToCheck) {
345
+ return ((Flags & llvm::to_underlying (FlagsToCheck)) | ...) == Flags;
346
+ }
347
+
343
348
static bool verifyDescriptorRangeFlag (uint32_t Version, uint32_t Type,
344
349
uint32_t Flags) {
345
- if (Version == 1 &&
346
- Type == llvm::to_underlying (dxbc::DescriptorRangeType::Sampler))
347
- return Flags == 0 ;
348
-
349
- if (Version == 2 &&
350
- Type == llvm::to_underlying (dxbc::DescriptorRangeType::Sampler)) {
351
- switch (Flags) {
352
- case 0 :
353
- case llvm::to_underlying (dxbc::DescriptorRangeFlag::DATA_VOLATILE):
354
- case llvm::to_underlying (
355
- dxbc::DescriptorRangeFlag::
356
- DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS):
357
- return true ;
358
- }
359
- return false ;
360
- }
350
+ bool IsSampler =
351
+ (Type == llvm::to_underlying (dxbc::DescriptorRangeType::Sampler));
361
352
362
- if (Version == 1 &&
363
- Type != llvm::to_underlying (dxbc::DescriptorRangeType::Sampler))
353
+ if (Version == 1 ) {
354
+ if (IsSampler) {
355
+ return Flags == 0 ;
356
+ }
364
357
return Flags ==
365
358
llvm::to_underlying (dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE);
359
+ }
366
360
367
- if (Version == 2 &&
368
- Type != llvm::to_underlying (dxbc::DescriptorRangeType::Sampler)) {
369
- switch (Flags) {
370
- case 0 :
371
- case llvm::to_underlying (dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE):
372
- case llvm::to_underlying (dxbc::DescriptorRangeFlag::DATA_VOLATILE):
373
- case llvm::to_underlying (dxbc::DescriptorRangeFlag::DATA_STATIC):
374
- case llvm::to_underlying (
375
- dxbc::DescriptorRangeFlag::DATA_STATIC_WHILE_SET_AT_EXECUTE):
376
- case llvm::to_underlying (
377
- dxbc::DescriptorRangeFlag::
378
- DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS):
379
- case llvm::to_underlying (dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE) |
380
- llvm::to_underlying (dxbc::DescriptorRangeFlag::DATA_VOLATILE):
381
- case llvm::to_underlying (dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE) |
382
- llvm::to_underlying (
383
- dxbc::DescriptorRangeFlag::DATA_STATIC_WHILE_SET_AT_EXECUTE):
384
- case llvm::to_underlying (
385
- dxbc::DescriptorRangeFlag::
386
- DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS) |
387
- llvm::to_underlying (dxbc::DescriptorRangeFlag::DATA_VOLATILE):
388
- case llvm::to_underlying (
389
- dxbc::DescriptorRangeFlag::
390
- DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS) |
391
- llvm::to_underlying (dxbc::DescriptorRangeFlag::DATA_STATIC):
392
- case llvm::to_underlying (
393
- dxbc::DescriptorRangeFlag::
394
- DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS) |
395
- llvm::to_underlying (
396
- dxbc::DescriptorRangeFlag::DATA_STATIC_WHILE_SET_AT_EXECUTE):
397
- return true ;
361
+ if (Version == 2 ) {
362
+ if (IsSampler) {
363
+ return Flags == 0 ||
364
+ isFlagSet (Flags, dxbc::DescriptorRangeFlag::DATA_VOLATILE) ||
365
+ isFlagSet (Flags,
366
+ dxbc::DescriptorRangeFlag::
367
+ DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS);
398
368
}
399
- return false ;
369
+ // Valid flag combinations for non-sampler Version 2
370
+ return Flags == 0 ||
371
+ isFlagSet (Flags, dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE) ||
372
+ isFlagSet (Flags, dxbc::DescriptorRangeFlag::DATA_VOLATILE) ||
373
+ isFlagSet (Flags, dxbc::DescriptorRangeFlag::DATA_STATIC) ||
374
+ isFlagSet (
375
+ Flags,
376
+ dxbc::DescriptorRangeFlag::DATA_STATIC_WHILE_SET_AT_EXECUTE) ||
377
+ isFlagSet (Flags,
378
+ dxbc::DescriptorRangeFlag::
379
+ DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS) ||
380
+ isFlagSet (Flags, dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE,
381
+ dxbc::DescriptorRangeFlag::DATA_VOLATILE) ||
382
+ isFlagSet (
383
+ Flags, dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE,
384
+ dxbc::DescriptorRangeFlag::DATA_STATIC_WHILE_SET_AT_EXECUTE) ||
385
+ isFlagSet (Flags,
386
+ dxbc::DescriptorRangeFlag::
387
+ DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS,
388
+ dxbc::DescriptorRangeFlag::DATA_VOLATILE) ||
389
+ isFlagSet (Flags,
390
+ dxbc::DescriptorRangeFlag::
391
+ DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS,
392
+ dxbc::DescriptorRangeFlag::DATA_STATIC) ||
393
+ isFlagSet (
394
+ Flags,
395
+ dxbc::DescriptorRangeFlag::
396
+ DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS,
397
+ dxbc::DescriptorRangeFlag::DATA_STATIC_WHILE_SET_AT_EXECUTE);
400
398
}
401
399
return false ;
402
400
}
0 commit comments