@@ -561,34 +561,39 @@ static Error
561
561
validateDescriptorTableRegisterOverflow (const mcdxbc::DescriptorTable &Table,
562
562
uint32_t Location) {
563
563
uint64_t Offset = 0 ;
564
-
564
+ bool IsPrevUnbound = false ;
565
+
565
566
for (const mcdxbc::DescriptorRange &Range : Table.Ranges ) {
566
567
// Validation of NumDescriptors should have happened by this point.
567
568
if (Range.NumDescriptors == 0 )
568
569
continue ;
569
570
570
- if (Range.OffsetInDescriptorsFromTableStart != DescriptorTableOffsetAppend)
571
- Offset = Range.OffsetInDescriptorsFromTableStart ;
572
-
573
- if (!verifyNoOverflowedOffset (Offset))
574
- return make_error<OffsetOverflowError>(
575
- Range.RangeType , Range.BaseShaderRegister , Range.RegisterSpace );
576
-
577
571
const uint64_t RangeBound = llvm::hlsl::rootsig::computeRangeBound (
578
572
Range.BaseShaderRegister , Range.NumDescriptors );
579
573
580
574
if (!verifyNoOverflowedOffset (RangeBound))
581
575
return make_error<ShaderRegisterOverflowError>(
582
576
Range.RangeType , Range.BaseShaderRegister , Range.RegisterSpace );
583
577
578
+ bool IsAppending =
579
+ Range.OffsetInDescriptorsFromTableStart == DescriptorTableOffsetAppend;
580
+ if (!IsAppending)
581
+ Offset = Range.OffsetInDescriptorsFromTableStart ;
582
+
583
+ if (IsPrevUnbound && IsAppending)
584
+ return make_error<ShaderRegisterOverflowError>(
585
+ Range.RangeType , Range.BaseShaderRegister , Range.RegisterSpace );
586
+
584
587
const uint64_t OffsetBound =
585
588
llvm::hlsl::rootsig::computeRangeBound (Offset, Range.NumDescriptors );
586
589
587
590
if (!verifyNoOverflowedOffset (OffsetBound))
588
591
return make_error<DescriptorRangeOverflowError>(
589
592
Range.RangeType , Range.BaseShaderRegister , Range.RegisterSpace );
590
- Offset = updateOngoingOffset (Offset, Range.NumDescriptors ,
591
- Range.OffsetInDescriptorsFromTableStart );
593
+
594
+ Offset = OffsetBound + 1 ;
595
+ IsPrevUnbound =
596
+ Range.NumDescriptors == llvm::hlsl::rootsig::NumDescriptorsUnbounded;
592
597
}
593
598
594
599
return Error::success ();
0 commit comments