@@ -110,10 +110,11 @@ static void registerLegalizedValue(
110
110
context->mapValToLegalVal [irValue] = legalVal;
111
111
}
112
112
113
- struct IRGlobalNameInfo
113
+ // / Structure to pass information from the original/old global param to
114
+ // / composite members during tuple flavored global param legalization.
115
+ struct IRGlobalParamInfo
114
116
{
115
- IRInst* globalVar;
116
- UInt counter;
117
+ IRFunc* originatingEntryPoint = nullptr ;
117
118
};
118
119
119
120
static LegalVal declareVars (
@@ -124,7 +125,7 @@ static LegalVal declareVars(
124
125
LegalVarChain const & varChain,
125
126
UnownedStringSlice nameHint,
126
127
IRInst* leafVar,
127
- IRGlobalNameInfo* globalNameInfo ,
128
+ IRGlobalParamInfo* globalParamInfo ,
128
129
bool isSpecial);
129
130
130
131
// / Unwrap a value with flavor `wrappedBuffer`
@@ -2727,10 +2728,8 @@ static LegalVal declareSimpleVar(
2727
2728
LegalVarChain const & varChain,
2728
2729
UnownedStringSlice nameHint,
2729
2730
IRInst* leafVar,
2730
- IRGlobalNameInfo* globalNameInfo )
2731
+ IRGlobalParamInfo* globalParamInfo )
2731
2732
{
2732
- SLANG_UNUSED (globalNameInfo);
2733
-
2734
2733
IRVarLayout* varLayout = createVarLayout (context->builder , varChain, typeLayout);
2735
2734
2736
2735
IRBuilder* builder = context->builder ;
@@ -2757,6 +2756,19 @@ static LegalVal declareSimpleVar(
2757
2756
globalParam->removeFromParent ();
2758
2757
globalParam->insertBefore (context->insertBeforeGlobal );
2759
2758
2759
+ // Add originating entry point decoration if original global param
2760
+ // comes from an entry point parameter. This is required in cases where the global
2761
+ // param has to be linked back to the originating entry point, such as when
2762
+ // emitting Metal where there global params have to be moved back to the
2763
+ // entry point parameter.
2764
+ SLANG_ASSERT (globalParamInfo);
2765
+ if (globalParamInfo->originatingEntryPoint )
2766
+ {
2767
+ builder->addEntryPointParamDecoration (
2768
+ globalParam,
2769
+ globalParamInfo->originatingEntryPoint );
2770
+ }
2771
+
2760
2772
irVar = globalParam;
2761
2773
legalVarVal = LegalVal::simple (globalParam);
2762
2774
}
@@ -3416,7 +3428,7 @@ static LegalVal declareVars(
3416
3428
LegalVarChain const & inVarChain,
3417
3429
UnownedStringSlice nameHint,
3418
3430
IRInst* leafVar,
3419
- IRGlobalNameInfo* globalNameInfo ,
3431
+ IRGlobalParamInfo* globalParamInfo ,
3420
3432
bool isSpecial)
3421
3433
{
3422
3434
LegalVarChain varChain = inVarChain;
@@ -3451,7 +3463,7 @@ static LegalVal declareVars(
3451
3463
varChain,
3452
3464
nameHint,
3453
3465
leafVar,
3454
- globalNameInfo );
3466
+ globalParamInfo );
3455
3467
break ;
3456
3468
3457
3469
case LegalType::Flavor::implicitDeref:
@@ -3466,7 +3478,7 @@ static LegalVal declareVars(
3466
3478
varChain,
3467
3479
nameHint,
3468
3480
leafVar,
3469
- globalNameInfo ,
3481
+ globalParamInfo ,
3470
3482
isSpecial);
3471
3483
return LegalVal::implicitDeref (val);
3472
3484
}
@@ -3483,7 +3495,7 @@ static LegalVal declareVars(
3483
3495
varChain,
3484
3496
nameHint,
3485
3497
leafVar,
3486
- globalNameInfo ,
3498
+ globalParamInfo ,
3487
3499
false );
3488
3500
auto specialVal = declareVars (
3489
3501
context,
@@ -3493,7 +3505,7 @@ static LegalVal declareVars(
3493
3505
varChain,
3494
3506
nameHint,
3495
3507
leafVar,
3496
- globalNameInfo ,
3508
+ globalParamInfo ,
3497
3509
true );
3498
3510
return LegalVal::pair (ordinaryVal, specialVal, pairType->pairInfo );
3499
3511
}
@@ -3545,7 +3557,7 @@ static LegalVal declareVars(
3545
3557
newVarChain,
3546
3558
fieldNameHint,
3547
3559
ee.key ,
3548
- globalNameInfo ,
3560
+ globalParamInfo ,
3549
3561
true );
3550
3562
3551
3563
TuplePseudoVal::Element element;
@@ -3600,7 +3612,7 @@ static LegalVal declareVars(
3600
3612
varChain,
3601
3613
nameHint,
3602
3614
leafVar,
3603
- globalNameInfo );
3615
+ globalParamInfo );
3604
3616
3605
3617
return LegalVal::wrappedBuffer (innerVal, wrappedBuffer->elementInfo );
3606
3618
}
@@ -3634,10 +3646,6 @@ static LegalVal legalizeGlobalVar(IRTypeLegalizationContext* context, IRGlobalVa
3634
3646
{
3635
3647
context->insertBeforeGlobal = irGlobalVar;
3636
3648
3637
- IRGlobalNameInfo globalNameInfo;
3638
- globalNameInfo.globalVar = irGlobalVar;
3639
- globalNameInfo.counter = 0 ;
3640
-
3641
3649
UnownedStringSlice nameHint = findNameHint (irGlobalVar);
3642
3650
context->builder ->setInsertBefore (irGlobalVar);
3643
3651
LegalVal newVal = declareVars (
@@ -3648,7 +3656,7 @@ static LegalVal legalizeGlobalVar(IRTypeLegalizationContext* context, IRGlobalVa
3648
3656
LegalVarChain (),
3649
3657
nameHint,
3650
3658
irGlobalVar,
3651
- &globalNameInfo ,
3659
+ nullptr ,
3652
3660
context->isSpecialType (originalValueType));
3653
3661
3654
3662
// Register the new value as the replacement for the old
@@ -3689,9 +3697,12 @@ static LegalVal legalizeGlobalParam(
3689
3697
3690
3698
LegalVarChainLink varChain (LegalVarChain (), varLayout);
3691
3699
3692
- IRGlobalNameInfo globalNameInfo;
3693
- globalNameInfo.globalVar = irGlobalParam;
3694
- globalNameInfo.counter = 0 ;
3700
+ IRGlobalParamInfo globalParamInfo;
3701
+ if (auto entryPointParamDecoration =
3702
+ irGlobalParam->findDecoration <IREntryPointParamDecoration>())
3703
+ {
3704
+ globalParamInfo.originatingEntryPoint = entryPointParamDecoration->getEntryPoint ();
3705
+ }
3695
3706
3696
3707
// TODO: need to handle initializer here!
3697
3708
@@ -3705,7 +3716,7 @@ static LegalVal legalizeGlobalParam(
3705
3716
varChain,
3706
3717
nameHint,
3707
3718
irGlobalParam,
3708
- &globalNameInfo ,
3719
+ &globalParamInfo ,
3709
3720
context->isSpecialType (irGlobalParam->getDataType ()));
3710
3721
3711
3722
// Register the new value as the replacement for the old
0 commit comments