@@ -539,53 +539,19 @@ Error validateDescriptorTableSamplerMixin(mcdxbc::DescriptorTable Table,
539
539
return Error::success ();
540
540
}
541
541
542
- /* * This validation logic was extracted from the DXC codebase
543
- * https://github.com/microsoft/DirectXShaderCompiler/blob/7a1b1df9b50a8350a63756720e85196e0285e664/lib/DxilRootSignature/DxilRootSignatureValidator.cpp#L205
544
- *
545
- * It checks if the registers in a descriptor table are overflowing, meaning,
546
- * they are trying to bind a register larger than MAX_UINT.
547
- * This will usually happen when the descriptor table appends a resource
548
- * after an unbounded range.
549
- **/
550
542
Error validateDescriptorTableRegisterOverflow (mcdxbc::DescriptorTable Table,
551
543
uint32_t Location) {
552
544
uint64_t AppendingRegister = 0 ;
553
545
554
546
for (const dxbc::RTS0::v2::DescriptorRange &Range : Table.Ranges ) {
555
-
556
547
dxbc::DescriptorRangeType RangeType =
557
548
static_cast <dxbc::DescriptorRangeType>(Range.RangeType );
558
-
559
- uint64_t Register = AppendingRegister;
560
-
561
- // Checks if the current register should be appended to the previous range.
562
- if (Range.OffsetInDescriptorsFromTableStart != ~0U )
563
- Register = Range.OffsetInDescriptorsFromTableStart ;
564
-
565
- // Check for overflow in the register value.
566
- if (Register > ~0U )
549
+ if (verifyOffsetOverflowing (AppendingRegister,
550
+ Range.OffsetInDescriptorsFromTableStart ,
551
+ Range.BaseShaderRegister , Range.RegisterSpace ,
552
+ Range.NumDescriptors ))
567
553
return make_error<TableRegisterOverflowError>(
568
554
RangeType, Range.BaseShaderRegister , Range.RegisterSpace );
569
- // Is the current range unbounded?
570
- if (Range.NumDescriptors == ~0U ) {
571
- // No ranges should be appended to an unbounded range.
572
- AppendingRegister = (uint64_t )~0U + (uint64_t )1ULL ;
573
- } else {
574
- // Is the defined range, overflowing?
575
- uint64_t UpperBound = (uint64_t )Range.BaseShaderRegister +
576
- (uint64_t )Range.NumDescriptors - (uint64_t )1U ;
577
- if (UpperBound > ~0U )
578
- return make_error<TableRegisterOverflowError>(
579
- RangeType, Range.BaseShaderRegister , Range.RegisterSpace );
580
-
581
- // If we append this range, will it overflow?
582
- uint64_t AppendingUpperBound =
583
- (uint64_t )Register + (uint64_t )Range.NumDescriptors - (uint64_t )1U ;
584
- if (AppendingUpperBound > ~0U )
585
- return make_error<TableRegisterOverflowError>(
586
- RangeType, Range.BaseShaderRegister , Range.RegisterSpace );
587
- AppendingRegister = Register + Range.NumDescriptors ;
588
- }
589
555
}
590
556
591
557
return Error::success ();
0 commit comments