@@ -68,6 +68,11 @@ extractShaderVisibility(MDNode *Node, unsigned int OpId) {
68
68
return make_error<InvalidRSMetadataValue>(" ShaderVisibility" );
69
69
}
70
70
71
+ static uint64_t updateOngoingOffset (uint64_t CurOfset, uint64_t NumDescriptors,
72
+ uint64_t Offset) {
73
+ return Offset == ~0U ? CurOfset + NumDescriptors : Offset + NumDescriptors;
74
+ }
75
+
71
76
namespace {
72
77
73
78
// We use the OverloadVisit with std::visit to ensure the compiler catches if a
@@ -549,32 +554,40 @@ Error validateDescriptorTableRegisterOverflow(mcdxbc::DescriptorTable Table,
549
554
uint32_t Location) {
550
555
uint64_t Offset = 0 ;
551
556
552
- for (const llvm::mcdxbc::DescriptorRange &Range : Table.Ranges ) {
557
+ for (const mcdxbc::DescriptorRange &Range : Table.Ranges ) {
558
+ // Errors for this check should be emitted before this point.
559
+ if (Range.NumDescriptors <= 0 )
560
+ continue ;
553
561
dxil::ResourceClass RangeType =
554
562
static_cast <dxil::ResourceClass>(Range.RangeType );
555
563
556
- if (Range.OffsetInDescriptorsFromTableStart != llvm::hlsl::rootsig:: DescriptorTableOffsetAppend)
564
+ if (Range.OffsetInDescriptorsFromTableStart != DescriptorTableOffsetAppend)
557
565
Offset = Range.OffsetInDescriptorsFromTableStart ;
558
566
559
- uint64_t RangeBound = llvm::hlsl::rootsig::computeRangeBound (
560
- Offset, Range.NumDescriptors );
561
- if (verifyBoundOffset (Offset))
562
- return make_error<DescriptorRangeOverflowError>(
563
- RangeType, Range.BaseShaderRegister ,
564
- Range.RegisterSpace );
565
- else if (!verifyNoOverflowedOffset (Offset))
567
+ if (!verifyNoOverflowedOffset (Offset))
566
568
return make_error<OffsetOverflowError>(RangeType,
567
569
Range.BaseShaderRegister ,
568
570
Range.RegisterSpace );
569
571
570
- if (!verifyNoOverflowedOffset (Range.BaseShaderRegister ))
572
+ const uint64_t RangeBound = llvm::hlsl::rootsig::computeRangeBound (
573
+ Range.BaseShaderRegister , Range.NumDescriptors );
574
+
575
+ if (!verifyNoOverflowedOffset (RangeBound))
571
576
return make_error<ShaderRegisterOverflowError>(
572
577
RangeType, Range.BaseShaderRegister ,
573
578
Range.RegisterSpace );
574
579
575
- Offset = RangeBound == llvm::hlsl::rootsig::NumDescriptorsUnbounded
576
- ? uint32_t (RangeBound)
577
- : uint32_t (RangeBound + 1 );
580
+ const uint64_t OffsetBound =
581
+ llvm::hlsl::rootsig::computeRangeBound (Offset, Range.NumDescriptors );
582
+
583
+ if (!verifyNoOverflowedOffset (OffsetBound))
584
+ return make_error<DescriptorRangeOverflowError>(
585
+ RangeType, Range.BaseShaderRegister , Range.RegisterSpace );
586
+
587
+ // Append to the current offset if DescriptorTableOffsetAppend, otherwise
588
+ // calculate the new Offset.
589
+ Offset = updateOngoingOffset (Offset, Range.NumDescriptors ,
590
+ Range.OffsetInDescriptorsFromTableStart );
578
591
}
579
592
580
593
return Error::success ();
0 commit comments