@@ -232,7 +232,8 @@ static bool parseDescriptorRange(LLVMContext *Ctx,
232
232
static bool parseDescriptorTable (LLVMContext *Ctx,
233
233
mcdxbc::RootSignatureDesc &RSD,
234
234
MDNode *DescriptorTableNode) {
235
- if (DescriptorTableNode->getNumOperands () < 2 )
235
+ const unsigned int NumOperands = DescriptorTableNode->getNumOperands ();
236
+ if (NumOperands < 2 )
236
237
return reportError (Ctx, " Invalid format for Descriptor Table" );
237
238
238
239
dxbc::RTS0::v1::RootParameterHeader Header;
@@ -245,7 +246,7 @@ static bool parseDescriptorTable(LLVMContext *Ctx,
245
246
Header.ParameterType =
246
247
llvm::to_underlying (dxbc::RootParameterType::DescriptorTable);
247
248
248
- for (unsigned int I = 2 ; I < DescriptorTableNode-> getNumOperands () ; I++) {
249
+ for (unsigned int I = 2 ; I < NumOperands ; I++) {
249
250
MDNode *Element = dyn_cast<MDNode>(DescriptorTableNode->getOperand (I));
250
251
if (Element == nullptr )
251
252
return reportError (Ctx, " Missing Root Element Metadata Node." );
@@ -340,63 +341,40 @@ static bool verifyRangeType(uint32_t Type) {
340
341
return false ;
341
342
}
342
343
343
- template <typename ... FlagTypes>
344
- static bool isFlagSet (uint32_t Flags, FlagTypes... FlagsToCheck) {
345
- return ((Flags & llvm::to_underlying (FlagsToCheck)) | ...) == Flags;
346
- }
347
-
348
344
static bool verifyDescriptorRangeFlag (uint32_t Version, uint32_t Type,
349
- uint32_t Flags) {
345
+ uint32_t FlagsVal) {
346
+ using FlagT = dxbc::DescriptorRangeFlag;
347
+ FlagT Flags = FlagT (FlagsVal);
348
+
350
349
const bool IsSampler =
351
350
(Type == llvm::to_underlying (dxbc::DescriptorRangeType::Sampler));
352
351
353
- if (Version == 1 ) {
354
- if (IsSampler) {
355
- return Flags == 0 ;
352
+ // The data-specific flags are mutually exclusive.
353
+ FlagT DataFlags = FlagT::DATA_VOLATILE | FlagT::DATA_STATIC |
354
+ FlagT::DATA_STATIC_WHILE_SET_AT_EXECUTE;
355
+
356
+ if (popcount (llvm::to_underlying (Flags & DataFlags)) > 1 )
357
+ return false ;
358
+
359
+ // For volatile descriptors, DATA_STATIC is never valid.
360
+ if ((Flags & FlagT::DESCRIPTORS_VOLATILE) == FlagT::DESCRIPTORS_VOLATILE) {
361
+ FlagT Mask = FlagT::DESCRIPTORS_VOLATILE;
362
+ if (!IsSampler) {
363
+ Mask |= FlagT::DATA_VOLATILE;
364
+ Mask |= FlagT::DATA_STATIC_WHILE_SET_AT_EXECUTE;
356
365
}
357
- return Flags ==
358
- llvm::to_underlying (dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE);
366
+ return (Flags & ~Mask) == FlagT::NONE;
359
367
}
360
368
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);
368
- }
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);
369
+ // For default (static) or "STATIC_KEEPING_BUFFER_BOUNDS_CHECKS" descriptors,
370
+ // the other data-specific flags may all be set.
371
+ FlagT Mask = FlagT::DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS;
372
+ if (!IsSampler) {
373
+ Mask |= FlagT::DATA_VOLATILE;
374
+ Mask |= FlagT::DATA_STATIC;
375
+ Mask |= FlagT::DATA_STATIC_WHILE_SET_AT_EXECUTE;
398
376
}
399
- return false ;
377
+ return (Flags & ~Mask) == FlagT::NONE ;
400
378
}
401
379
402
380
static bool validate (LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
@@ -556,7 +534,6 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
556
534
557
535
OS << " Root Signature Definitions"
558
536
<< " \n " ;
559
- uint8_t Space = 0 ;
560
537
for (const Function &F : M) {
561
538
auto It = RSDMap.find (&F);
562
539
if (It == RSDMap.end ())
@@ -565,76 +542,68 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
565
542
OS << " Definition for '" << F.getName () << " ':\n " ;
566
543
567
544
// start root signature header
568
- OS << indent (Space) << " Flags: " << format_hex (RS.Flags , 8 ) << " \n " ;
569
- OS << indent (Space) << " Version: " << RS.Version << " \n " ;
570
- OS << indent (Space) << " RootParametersOffset: " << RS.RootParameterOffset
571
- << " \n " ;
572
- OS << indent (Space) << " NumParameters: " << RS.ParametersContainer .size ()
573
- << " \n " ;
545
+ OS << " Flags: " << format_hex (RS.Flags , 8 ) << " \n " ;
546
+ OS << " Version: " << RS.Version << " \n " ;
547
+ OS << " RootParametersOffset: " << RS.RootParameterOffset << " \n " ;
548
+ OS << " NumParameters: " << RS.ParametersContainer .size () << " \n " ;
574
549
for (size_t I = 0 ; I < RS.ParametersContainer .size (); I++) {
575
550
const auto &[Type, Loc] =
576
551
RS.ParametersContainer .getTypeAndLocForParameter (I);
577
552
const dxbc::RTS0::v1::RootParameterHeader Header =
578
553
RS.ParametersContainer .getHeader (I);
579
554
580
- OS << indent (Space) << " - Parameter Type: " << Type << " \n " ;
581
- OS << indent (Space + 2 )
582
- << " Shader Visibility: " << Header. ShaderVisibility << " \n " ;
555
+ OS << " - Parameter Type: " << Type << " \n " ;
556
+ OS << indent (2 ) << " Shader Visibility: " << Header. ShaderVisibility
557
+ << " \n " ;
583
558
584
559
switch (Type) {
585
560
case llvm::to_underlying (dxbc::RootParameterType::Constants32Bit): {
586
561
const dxbc::RTS0::v1::RootConstants &Constants =
587
562
RS.ParametersContainer .getConstant (Loc);
588
- OS << indent (Space + 2 ) << " Register Space: " << Constants.RegisterSpace
563
+ OS << indent (2 ) << " Register Space: " << Constants.RegisterSpace
564
+ << " \n " ;
565
+ OS << indent (2 ) << " Shader Register: " << Constants.ShaderRegister
566
+ << " \n " ;
567
+ OS << indent (2 ) << " Num 32 Bit Values: " << Constants.Num32BitValues
589
568
<< " \n " ;
590
- OS << indent (Space + 2 )
591
- << " Shader Register: " << Constants.ShaderRegister << " \n " ;
592
- OS << indent (Space + 2 )
593
- << " Num 32 Bit Values: " << Constants.Num32BitValues << " \n " ;
594
569
break ;
595
570
}
596
571
case llvm::to_underlying (dxbc::RootParameterType::CBV):
597
572
case llvm::to_underlying (dxbc::RootParameterType::UAV):
598
573
case llvm::to_underlying (dxbc::RootParameterType::SRV): {
599
574
const dxbc::RTS0::v2::RootDescriptor &Descriptor =
600
575
RS.ParametersContainer .getRootDescriptor (Loc);
601
- OS << indent (Space + 2 )
602
- << " Register Space: " << Descriptor. RegisterSpace << " \n " ;
603
- OS << indent (Space + 2 )
604
- << " Shader Register: " << Descriptor. ShaderRegister << " \n " ;
576
+ OS << indent (2 ) << " Register Space: " << Descriptor. RegisterSpace
577
+ << " \n " ;
578
+ OS << indent (2 ) << " Shader Register: " << Descriptor. ShaderRegister
579
+ << " \n " ;
605
580
if (RS.Version > 1 )
606
- OS << indent (Space + 2 ) << " Flags: " << Descriptor.Flags << " \n " ;
581
+ OS << indent (2 ) << " Flags: " << Descriptor.Flags << " \n " ;
607
582
break ;
608
583
}
609
584
case llvm::to_underlying (dxbc::RootParameterType::DescriptorTable): {
610
585
const mcdxbc::DescriptorTable &Table =
611
586
RS.ParametersContainer .getDescriptorTable (Loc);
612
- OS << indent (Space + 2 ) << " NumRanges: " << Table.Ranges .size () << " \n " ;
587
+ OS << indent (2 ) << " NumRanges: " << Table.Ranges .size () << " \n " ;
613
588
614
589
for (const dxbc::RTS0::v2::DescriptorRange Range : Table) {
615
- OS << indent (Space + 2 ) << " - Range Type: " << Range.RangeType
616
- << " \n " ;
617
- OS << indent (Space + 4 ) << " Register Space: " << Range.RegisterSpace
618
- << " \n " ;
619
- OS << indent (Space + 4 )
590
+ OS << indent (2 ) << " - Range Type: " << Range.RangeType << " \n " ;
591
+ OS << indent (4 ) << " Register Space: " << Range.RegisterSpace << " \n " ;
592
+ OS << indent (4 )
620
593
<< " Base Shader Register: " << Range.BaseShaderRegister << " \n " ;
621
- OS << indent (Space + 4 ) << " Num Descriptors: " << Range.NumDescriptors
594
+ OS << indent (4 ) << " Num Descriptors: " << Range.NumDescriptors
622
595
<< " \n " ;
623
- OS << indent (Space + 4 ) << " Offset In Descriptors From Table Start: "
596
+ OS << indent (4 ) << " Offset In Descriptors From Table Start: "
624
597
<< Range.OffsetInDescriptorsFromTableStart << " \n " ;
625
598
if (RS.Version > 1 )
626
- OS << indent (Space + 4 ) << " Flags: " << Range.Flags << " \n " ;
599
+ OS << indent (4 ) << " Flags: " << Range.Flags << " \n " ;
627
600
}
628
601
break ;
629
602
}
630
603
}
631
604
}
632
- OS << indent (Space) << " NumStaticSamplers: " << 0 << " \n " ;
633
- OS << indent (Space) << " StaticSamplersOffset: " << RS.StaticSamplersOffset
634
- << " \n " ;
635
-
636
- Space--;
637
- // end root signature header
605
+ OS << " NumStaticSamplers: " << 0 << " \n " ;
606
+ OS << " StaticSamplersOffset: " << RS.StaticSamplersOffset << " \n " ;
638
607
}
639
608
return PreservedAnalyses::all ();
640
609
}
0 commit comments