@@ -1369,7 +1369,8 @@ bool SemaHLSL::handleRootSignatureElements(
1369
1369
" Number of unbound elements must match the number of clauses" );
1370
1370
bool HasAnySampler = false ;
1371
1371
bool HasAnyNonSampler = false ;
1372
- uint32_t Offset = 0 ;
1372
+ uint64_t Offset = 0 ;
1373
+ bool IsPrevUnbound = false ;
1373
1374
for (const auto &[Clause, ClauseElem] : UnboundClauses) {
1374
1375
SourceLocation Loc = ClauseElem->getLocation ();
1375
1376
if (Clause->Type == llvm::dxil::ResourceClass::Sampler)
@@ -1386,32 +1387,28 @@ bool SemaHLSL::handleRootSignatureElements(
1386
1387
if (Clause->NumDescriptors == 0 )
1387
1388
return true ;
1388
1389
1389
- if (Clause-> Offset ! =
1390
- llvm::hlsl::rootsig::DescriptorTableOffsetAppend) {
1391
- // Manually specified the offset
1390
+ bool IsAppending =
1391
+ Clause-> Offset == llvm::hlsl::rootsig::DescriptorTableOffsetAppend;
1392
+ if (!IsAppending)
1392
1393
Offset = Clause->Offset ;
1393
- }
1394
1394
1395
1395
uint64_t RangeBound = llvm::hlsl::rootsig::computeRangeBound (
1396
1396
Offset, Clause->NumDescriptors );
1397
1397
1398
- if (!llvm::hlsl::rootsig::verifyBoundOffset (Offset)) {
1399
- // Trying to append onto unbound offset
1398
+ if (IsPrevUnbound && IsAppending)
1400
1399
Diag (Loc, diag::err_hlsl_appending_onto_unbound);
1401
- } else if (!llvm::hlsl::rootsig::verifyNoOverflowedOffset (RangeBound)) {
1402
- // Upper bound overflows maximum offset
1400
+ else if (!llvm::hlsl::rootsig::verifyNoOverflowedOffset (RangeBound))
1403
1401
Diag (Loc, diag::err_hlsl_offset_overflow) << Offset << RangeBound;
1404
- }
1405
1402
1406
- Offset = RangeBound == llvm::hlsl::rootsig::NumDescriptorsUnbounded
1407
- ? uint32_t (RangeBound)
1408
- : uint32_t (RangeBound + 1 );
1403
+ // Update offset to be 1 past this range's bound
1404
+ Offset = RangeBound + 1 ;
1405
+ IsPrevUnbound = Clause->NumDescriptors ==
1406
+ llvm::hlsl::rootsig::NumDescriptorsUnbounded;
1409
1407
1410
1408
// Compute the register bounds and track resource binding
1411
1409
uint32_t LowerBound (Clause->Reg .Number );
1412
- uint32_t UpperBound = Clause->NumDescriptors == ~0u
1413
- ? ~0u
1414
- : LowerBound + Clause->NumDescriptors - 1 ;
1410
+ uint32_t UpperBound = llvm::hlsl::rootsig::computeRangeBound (
1411
+ LowerBound, Clause->NumDescriptors );
1415
1412
1416
1413
BindingChecker.trackBinding (
1417
1414
Table->Visibility ,
0 commit comments