@@ -5720,37 +5720,24 @@ Value *TranslateCallShader(CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode,
5720
5720
return Builder.CreateCall (F, {opArg, ShaderIndex, Parameter});
5721
5721
}
5722
5722
5723
- static unsigned LoadRayDescElementsIntoArgs (Value **Args, hlsl::OP *OP,
5724
- IRBuilder<> &Builder,
5725
- Value *RayDescPtr, unsigned Index) {
5726
- // struct RayDesc
5727
- // {
5728
- // float3 Origin;
5729
- // float TMin;
5730
- // float3 Direction;
5731
- // float TMax;
5732
- // };
5733
- Value *ZeroIdx = OP->GetU32Const (0 );
5734
- Value *Origin = Builder.CreateGEP (RayDescPtr, {ZeroIdx, ZeroIdx});
5735
- Origin = Builder.CreateLoad (Origin);
5736
- Args[Index++] = Builder.CreateExtractElement (Origin, (uint64_t )0 );
5737
- Args[Index++] = Builder.CreateExtractElement (Origin, 1 );
5738
- Args[Index++] = Builder.CreateExtractElement (Origin, 2 );
5739
-
5740
- Value *TMinPtr = Builder.CreateGEP (RayDescPtr, {ZeroIdx, OP->GetU32Const (1 )});
5741
- Args[Index++] = Builder.CreateLoad (TMinPtr);
5742
-
5743
- Value *DirectionPtr =
5744
- Builder.CreateGEP (RayDescPtr, {ZeroIdx, OP->GetU32Const (2 )});
5745
- Value *Direction = Builder.CreateLoad (DirectionPtr);
5746
-
5747
- Args[Index++] = Builder.CreateExtractElement (Direction, (uint64_t )0 );
5748
- Args[Index++] = Builder.CreateExtractElement (Direction, 1 );
5749
- Args[Index++] = Builder.CreateExtractElement (Direction, 2 );
5750
-
5751
- Value *TMaxPtr = Builder.CreateGEP (RayDescPtr, {ZeroIdx, OP->GetU32Const (3 )});
5752
- Args[Index++] = Builder.CreateLoad (TMaxPtr);
5753
- return Index;
5723
+ static void TransferRayDescArgs (Value **Args, hlsl::OP *OP,
5724
+ IRBuilder<> &Builder, CallInst *CI,
5725
+ unsigned &Index, unsigned &HLIndex) {
5726
+ // Extract elements from flattened ray desc arguments in HL op.
5727
+ // float3 Origin;
5728
+ Value *origin = CI->getArgOperand (HLIndex++);
5729
+ Args[Index++] = Builder.CreateExtractElement (origin, (uint64_t )0 );
5730
+ Args[Index++] = Builder.CreateExtractElement (origin, 1 );
5731
+ Args[Index++] = Builder.CreateExtractElement (origin, 2 );
5732
+ // float TMin;
5733
+ Args[Index++] = CI->getArgOperand (HLIndex++);
5734
+ // float3 Direction;
5735
+ Value *direction = CI->getArgOperand (HLIndex++);
5736
+ Args[Index++] = Builder.CreateExtractElement (direction, (uint64_t )0 );
5737
+ Args[Index++] = Builder.CreateExtractElement (direction, 1 );
5738
+ Args[Index++] = Builder.CreateExtractElement (direction, 2 );
5739
+ // float TMax;
5740
+ Args[Index++] = CI->getArgOperand (HLIndex++);
5754
5741
}
5755
5742
5756
5743
Value *TranslateTraceRay (CallInst *CI, IntrinsicOp IOP, OP::OpCode OpCode,
@@ -5759,21 +5746,24 @@ Value *TranslateTraceRay(CallInst *CI, IntrinsicOp IOP, OP::OpCode OpCode,
5759
5746
bool &Translated) {
5760
5747
hlsl::OP *OP = &Helper.hlslOP ;
5761
5748
5762
- Value *RayDesc = CI->getArgOperand (HLOperandIndex::kTraceRayRayDescOpIdx );
5763
- Value *PayLoad = CI->getArgOperand (HLOperandIndex::kTraceRayPayLoadOpIdx );
5764
-
5765
5749
Value *Args[DXIL::OperandIndex::kTraceRayNumOp ];
5766
5750
Args[0 ] = OP->GetU32Const (static_cast <unsigned >(OpCode));
5767
- for (unsigned i = 1 ; i < HLOperandIndex::kTraceRayRayDescOpIdx ; i++)
5768
- Args[i] = CI->getArgOperand (i);
5751
+ unsigned Index = 1 , HLIndex = 1 ;
5752
+ while (HLIndex < HLOperandIndex::kTraceRayRayDescOpIdx )
5753
+ Args[Index++] = CI->getArgOperand (HLIndex++);
5769
5754
5770
5755
IRBuilder<> Builder (CI);
5771
- LoadRayDescElementsIntoArgs (Args, OP, Builder, RayDesc,
5772
- DXIL::OperandIndex::kTraceRayRayDescOpIdx );
5756
+ TransferRayDescArgs (Args, OP, Builder, CI, Index, HLIndex);
5757
+ DXASSERT_NOMSG (HLIndex == CI->getNumArgOperands () - 1 );
5758
+ DXASSERT_NOMSG (Index == DXIL::OperandIndex::kTraceRayPayloadOpIdx );
5759
+
5760
+ Value *Payload = CI->getArgOperand (HLIndex++);
5761
+ Args[Index++] = Payload;
5773
5762
5774
- Args[DXIL::OperandIndex::kTraceRayPayloadOpIdx ] = PayLoad;
5763
+ DXASSERT_NOMSG (HLIndex == CI->getNumArgOperands ());
5764
+ DXASSERT_NOMSG (Index == DXIL::OperandIndex::kTraceRayNumOp );
5775
5765
5776
- Type *Ty = PayLoad ->getType ();
5766
+ Type *Ty = Payload ->getType ();
5777
5767
Function *F = OP->GetOpFunc (OpCode, Ty);
5778
5768
5779
5769
return Builder.CreateCall (F, Args);
@@ -5817,33 +5807,16 @@ Value *TranslateTraceRayInline(CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode,
5817
5807
5818
5808
Value *Args[DXIL::OperandIndex::kTraceRayInlineNumOp ];
5819
5809
Args[0 ] = opArg;
5820
- for ( unsigned i = 1 ; i < HLOperandIndex:: kTraceRayInlineRayDescOpIdx ; i++) {
5821
- Args[i] = CI-> getArgOperand (i);
5822
- }
5810
+ unsigned Index = 1 , HLIndex = 1 ;
5811
+ while (HLIndex < HLOperandIndex:: kTraceRayInlineRayDescOpIdx )
5812
+ Args[Index++] = CI-> getArgOperand (HLIndex++);
5823
5813
5824
5814
IRBuilder<> Builder (CI);
5825
- unsigned hlIndex = HLOperandIndex::kTraceRayInlineRayDescOpIdx ;
5826
- unsigned index = DXIL::OperandIndex::kTraceRayInlineRayDescOpIdx ;
5827
-
5828
- // struct RayDesc
5829
- // {
5830
- // float3 Origin;
5831
- Value *origin = CI->getArgOperand (hlIndex++);
5832
- Args[index++] = Builder.CreateExtractElement (origin, (uint64_t )0 );
5833
- Args[index++] = Builder.CreateExtractElement (origin, 1 );
5834
- Args[index++] = Builder.CreateExtractElement (origin, 2 );
5835
- // float TMin;
5836
- Args[index++] = CI->getArgOperand (hlIndex++);
5837
- // float3 Direction;
5838
- Value *direction = CI->getArgOperand (hlIndex++);
5839
- Args[index++] = Builder.CreateExtractElement (direction, (uint64_t )0 );
5840
- Args[index++] = Builder.CreateExtractElement (direction, 1 );
5841
- Args[index++] = Builder.CreateExtractElement (direction, 2 );
5842
- // float TMax;
5843
- Args[index++] = CI->getArgOperand (hlIndex++);
5844
- // };
5845
-
5846
- DXASSERT_NOMSG (index == DXIL::OperandIndex::kTraceRayInlineNumOp );
5815
+ DXASSERT_NOMSG (HLIndex == HLOperandIndex::kTraceRayInlineRayDescOpIdx );
5816
+ DXASSERT_NOMSG (Index == DXIL::OperandIndex::kTraceRayInlineRayDescOpIdx );
5817
+ TransferRayDescArgs (Args, hlslOP, Builder, CI, Index, HLIndex);
5818
+ DXASSERT_NOMSG (HLIndex == CI->getNumArgOperands ());
5819
+ DXASSERT_NOMSG (Index == DXIL::OperandIndex::kTraceRayInlineNumOp );
5847
5820
5848
5821
Function *F = hlslOP->GetOpFunc (opcode, Builder.getVoidTy ());
5849
5822
@@ -6197,55 +6170,49 @@ Value *TranslateUnpack(CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode,
6197
6170
6198
6171
// Shader Execution Reordering.
6199
6172
namespace {
6200
- Value *TranslateHitObjectMake (CallInst *CI, IntrinsicOp IOP, OP::OpCode Opcode,
6201
- HLOperationLowerHelper &Helper,
6202
- HLObjectOperationLowerHelper *ObjHelper,
6203
- bool &Translated) {
6173
+ Value *TranslateHitObjectMakeNop (CallInst *CI, IntrinsicOp IOP,
6174
+ OP::OpCode Opcode,
6175
+ HLOperationLowerHelper &Helper,
6176
+ HLObjectOperationLowerHelper *ObjHelper,
6177
+ bool &Translated) {
6204
6178
hlsl::OP *HlslOP = &Helper.hlslOP ;
6205
6179
IRBuilder<> Builder (CI);
6206
- unsigned SrcIdx = 1 ;
6207
- Value *HitObjectPtr = CI->getArgOperand (SrcIdx++);
6208
- if (Opcode == OP::OpCode::HitObject_MakeNop) {
6209
- Value *HitObject = TrivialDxilOperation (
6210
- Opcode, {nullptr }, Type::getVoidTy (CI->getContext ()), CI, HlslOP);
6211
- Builder.CreateStore (HitObject, HitObjectPtr);
6212
- DXASSERT (
6213
- CI->use_empty (),
6214
- " Default ctor return type is a Clang artifact. Value must not be used" );
6215
- return nullptr ;
6216
- }
6180
+ Value *HitObjectPtr = CI->getArgOperand (1 );
6181
+ Value *HitObject = TrivialDxilOperation (
6182
+ Opcode, {nullptr }, Type::getVoidTy (CI->getContext ()), CI, HlslOP);
6183
+ Builder.CreateStore (HitObject, HitObjectPtr);
6184
+ DXASSERT (
6185
+ CI->use_empty (),
6186
+ " Default ctor return type is a Clang artifact. Value must not be used" );
6187
+ return nullptr ;
6188
+ }
6217
6189
6190
+ Value *TranslateHitObjectMakeMiss (CallInst *CI, IntrinsicOp IOP,
6191
+ OP::OpCode Opcode,
6192
+ HLOperationLowerHelper &Helper,
6193
+ HLObjectOperationLowerHelper *ObjHelper,
6194
+ bool &Translated) {
6218
6195
DXASSERT_NOMSG (CI->getNumArgOperands () ==
6219
6196
HLOperandIndex::kHitObjectMakeMiss_NumOp );
6220
- Value *RayFlags = CI->getArgOperand (SrcIdx++);
6221
- Value *MissShaderIdx = CI->getArgOperand (SrcIdx++);
6222
- DXASSERT_NOMSG (SrcIdx == HLOperandIndex::kHitObjectMakeMissRayDescOpIdx );
6223
- Value *RayDescOrigin = CI->getArgOperand (SrcIdx++);
6224
- Value *RayDescOriginX =
6225
- Builder.CreateExtractElement (RayDescOrigin, (uint64_t )0 );
6226
- Value *RayDescOriginY =
6227
- Builder.CreateExtractElement (RayDescOrigin, (uint64_t )1 );
6228
- Value *RayDescOriginZ =
6229
- Builder.CreateExtractElement (RayDescOrigin, (uint64_t )2 );
6230
-
6231
- Value *RayDescTMin = CI->getArgOperand (SrcIdx++);
6232
- Value *RayDescDirection = CI->getArgOperand (SrcIdx++);
6233
- Value *RayDescDirectionX =
6234
- Builder.CreateExtractElement (RayDescDirection, (uint64_t )0 );
6235
- Value *RayDescDirectionY =
6236
- Builder.CreateExtractElement (RayDescDirection, (uint64_t )1 );
6237
- Value *RayDescDirectionZ =
6238
- Builder.CreateExtractElement (RayDescDirection, (uint64_t )2 );
6239
-
6240
- Value *RayDescTMax = CI->getArgOperand (SrcIdx++);
6197
+ hlsl::OP *OP = &Helper.hlslOP ;
6198
+ IRBuilder<> Builder (CI);
6199
+ Value *Args[DXIL::OperandIndex::kHitObjectMakeMiss_NumOp ];
6200
+ Args[0 ] = nullptr ; // Filled in by TrivialDxilOperation
6201
+
6202
+ unsigned DestIdx = 1 , SrcIdx = 1 ;
6203
+ Value *HitObjectPtr = CI->getArgOperand (SrcIdx++);
6204
+ Args[DestIdx++] = CI->getArgOperand (SrcIdx++); // RayFlags
6205
+ Args[DestIdx++] = CI->getArgOperand (SrcIdx++); // MissShaderIdx
6206
+
6207
+ DXASSERT_NOMSG (SrcIdx == HLOperandIndex::kHitObjectMakeMiss_RayDescOpIdx );
6208
+ DXASSERT_NOMSG (DestIdx ==
6209
+ DXIL::OperandIndex::kHitObjectMakeMiss_RayDescOpIdx );
6210
+ TransferRayDescArgs (Args, OP, Builder, CI, DestIdx, SrcIdx);
6241
6211
DXASSERT_NOMSG (SrcIdx == CI->getNumArgOperands ());
6212
+ DXASSERT_NOMSG (DestIdx == DXIL::OperandIndex::kHitObjectMakeMiss_NumOp );
6242
6213
6243
- Value *OutHitObject = TrivialDxilOperation (
6244
- Opcode,
6245
- {nullptr , RayFlags, MissShaderIdx, RayDescOriginX, RayDescOriginY,
6246
- RayDescOriginZ, RayDescTMin, RayDescDirectionX, RayDescDirectionY,
6247
- RayDescDirectionZ, RayDescTMax},
6248
- Helper.voidTy , CI, HlslOP);
6214
+ Value *OutHitObject =
6215
+ TrivialDxilOperation (Opcode, Args, Helper.voidTy , CI, OP);
6249
6216
Builder.CreateStore (OutHitObject, HitObjectPtr);
6250
6217
return nullptr ;
6251
6218
}
@@ -6348,10 +6315,9 @@ Value *TranslateHitObjectTraceRay(CallInst *CI, IntrinsicOp IOP,
6348
6315
hlsl::OP *OP = &Helper.hlslOP ;
6349
6316
IRBuilder<> Builder (CI);
6350
6317
6351
- const unsigned DxilNumArgs = DxilInst_HitObject_TraceRay::arg_payload + 1 ;
6352
6318
DXASSERT_NOMSG (CI->getNumArgOperands () ==
6353
6319
HLOperandIndex::kHitObjectTraceRay_NumOp );
6354
- Value *Args[DxilNumArgs ];
6320
+ Value *Args[DXIL::OperandIndex:: kHitObjectTraceRay_NumOp ];
6355
6321
Value *OpArg = OP->GetU32Const (static_cast <unsigned >(OpCode));
6356
6322
Args[0 ] = OpArg;
6357
6323
@@ -6363,13 +6329,19 @@ Value *TranslateHitObjectTraceRay(CallInst *CI, IntrinsicOp IOP,
6363
6329
Args[DestIdx] = CI->getArgOperand (SrcIdx);
6364
6330
}
6365
6331
6366
- Value *RayDescPtr = CI->getArgOperand (SrcIdx++);
6367
- DestIdx = LoadRayDescElementsIntoArgs (Args, OP, Builder, RayDescPtr, DestIdx);
6332
+ DXASSERT_NOMSG (SrcIdx == HLOperandIndex::kHitObjectTraceRay_RayDescOpIdx );
6333
+ DXASSERT_NOMSG (DestIdx ==
6334
+ DXIL::OperandIndex::kHitObjectTraceRay_RayDescOpIdx );
6335
+ TransferRayDescArgs (Args, OP, Builder, CI, DestIdx, SrcIdx);
6336
+ DXASSERT_NOMSG (SrcIdx == CI->getNumArgOperands () - 1 );
6337
+ DXASSERT_NOMSG (DestIdx ==
6338
+ DXIL::OperandIndex::kHitObjectTraceRay_PayloadOpIdx );
6339
+
6368
6340
Value *Payload = CI->getArgOperand (SrcIdx++);
6369
6341
Args[DestIdx++] = Payload;
6370
6342
6371
6343
DXASSERT_NOMSG (SrcIdx == CI->getNumArgOperands ());
6372
- DXASSERT_NOMSG (DestIdx == DxilNumArgs );
6344
+ DXASSERT_NOMSG (DestIdx == DXIL::OperandIndex:: kHitObjectTraceRay_NumOp );
6373
6345
6374
6346
Function *F = OP->GetOpFunc (OpCode, Payload->getType ());
6375
6347
@@ -7402,7 +7374,7 @@ IntrinsicLower gLowerTable[] = {
7402
7374
DXIL::OpCode::NumOpCodes},
7403
7375
{IntrinsicOp::MOP_InterlockedUMin, TranslateMopAtomicBinaryOperation,
7404
7376
DXIL::OpCode::NumOpCodes},
7405
- {IntrinsicOp::MOP_DxHitObject_MakeNop, TranslateHitObjectMake ,
7377
+ {IntrinsicOp::MOP_DxHitObject_MakeNop, TranslateHitObjectMakeNop ,
7406
7378
DXIL::OpCode::HitObject_MakeNop},
7407
7379
{IntrinsicOp::IOP_DxMaybeReorderThread, TranslateMaybeReorderThread,
7408
7380
DXIL::OpCode::MaybeReorderThread},
@@ -7462,7 +7434,7 @@ IntrinsicLower gLowerTable[] = {
7462
7434
{IntrinsicOp::MOP_DxHitObject_LoadLocalRootTableConstant,
7463
7435
TranslateHitObjectLoadLocalRootTableConstant,
7464
7436
DXIL::OpCode::HitObject_LoadLocalRootTableConstant},
7465
- {IntrinsicOp::MOP_DxHitObject_MakeMiss, TranslateHitObjectMake ,
7437
+ {IntrinsicOp::MOP_DxHitObject_MakeMiss, TranslateHitObjectMakeMiss ,
7466
7438
DXIL::OpCode::HitObject_MakeMiss},
7467
7439
{IntrinsicOp::MOP_DxHitObject_SetShaderTableIndex,
7468
7440
TranslateHitObjectSetShaderTableIndex,
0 commit comments