@@ -5720,37 +5720,24 @@ Value *TranslateCallShader(CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode,
57205720 return Builder.CreateCall (F, {opArg, ShaderIndex, Parameter});
57215721}
57225722
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++);
57545741}
57555742
57565743Value *TranslateTraceRay (CallInst *CI, IntrinsicOp IOP, OP::OpCode OpCode,
@@ -5759,21 +5746,24 @@ Value *TranslateTraceRay(CallInst *CI, IntrinsicOp IOP, OP::OpCode OpCode,
57595746 bool &Translated) {
57605747 hlsl::OP *OP = &Helper.hlslOP ;
57615748
5762- Value *RayDesc = CI->getArgOperand (HLOperandIndex::kTraceRayRayDescOpIdx );
5763- Value *PayLoad = CI->getArgOperand (HLOperandIndex::kTraceRayPayloadOpIdx );
5764-
57655749 Value *Args[DXIL::OperandIndex::kTraceRayNumOp ];
57665750 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++);
57695754
57705755 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;
57735762
5774- Args[DXIL::OperandIndex::kTraceRayPayloadOpIdx ] = PayLoad;
5763+ DXASSERT_NOMSG (HLIndex == CI->getNumArgOperands ());
5764+ DXASSERT_NOMSG (Index == DXIL::OperandIndex::kTraceRayNumOp );
57755765
5776- Type *Ty = PayLoad ->getType ();
5766+ Type *Ty = Payload ->getType ();
57775767 Function *F = OP->GetOpFunc (OpCode, Ty);
57785768
57795769 return Builder.CreateCall (F, Args);
@@ -5817,33 +5807,16 @@ Value *TranslateTraceRayInline(CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode,
58175807
58185808 Value *Args[DXIL::OperandIndex::kTraceRayInlineNumOp ];
58195809 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++);
58235813
58245814 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 );
58475820
58485821 Function *F = hlslOP->GetOpFunc (opcode, Builder.getVoidTy ());
58495822
@@ -6197,55 +6170,47 @@ Value *TranslateUnpack(CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode,
61976170
61986171// Shader Execution Reordering.
61996172namespace {
6200- Value *TranslateHitObjectMake (CallInst *CI, IntrinsicOp IOP, OP::OpCode Opcode,
6173+ Value *TranslateHitObjectMakeNop (CallInst *CI, IntrinsicOp IOP, OP::OpCode Opcode,
62016174 HLOperationLowerHelper &Helper,
62026175 HLObjectOperationLowerHelper *ObjHelper,
62036176 bool &Translated) {
62046177 hlsl::OP *HlslOP = &Helper.hlslOP ;
62056178 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- }
6179+ Value *HitObjectPtr = CI->getArgOperand (1 );
6180+ Value *HitObject = TrivialDxilOperation (
6181+ Opcode, {nullptr }, Type::getVoidTy (CI->getContext ()), CI, HlslOP);
6182+ Builder.CreateStore (HitObject, HitObjectPtr);
6183+ DXASSERT (
6184+ CI->use_empty (),
6185+ " Default ctor return type is a Clang artifact. Value must not be used" );
6186+ return nullptr ;
6187+ }
62176188
6189+ Value *TranslateHitObjectMakeMiss (CallInst *CI, IntrinsicOp IOP, OP::OpCode Opcode,
6190+ HLOperationLowerHelper &Helper,
6191+ HLObjectOperationLowerHelper *ObjHelper,
6192+ bool &Translated) {
62186193 DXASSERT_NOMSG (CI->getNumArgOperands () ==
62196194 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++);
6195+ hlsl::OP *OP = &Helper.hlslOP ;
6196+ IRBuilder<> Builder (CI);
6197+ Value *Args[DXIL::OperandIndex::kHitObjectMakeMiss_NumOp ];
6198+ Args[0 ] = nullptr ; // Filled in by TrivialDxilOperation
6199+
6200+ unsigned DestIdx = 1 , SrcIdx = 1 ;
6201+ Value *HitObjectPtr = CI->getArgOperand (SrcIdx++);
6202+ Args[DestIdx++] = CI->getArgOperand (SrcIdx++); // RayFlags
6203+ Args[DestIdx++] = CI->getArgOperand (SrcIdx++); // MissShaderIdx
6204+
6205+ DXASSERT_NOMSG (SrcIdx == HLOperandIndex::kHitObjectMakeMiss_RayDescOpIdx );
6206+ DXASSERT_NOMSG (DestIdx ==
6207+ DXIL::OperandIndex::kHitObjectMakeMiss_RayDescOpIdx );
6208+ TransferRayDescArgs (Args, OP, Builder, CI, DestIdx, SrcIdx);
62416209 DXASSERT_NOMSG (SrcIdx == CI->getNumArgOperands ());
6210+ DXASSERT_NOMSG (DestIdx == DXIL::OperandIndex::kHitObjectMakeMiss_NumOp );
62426211
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);
6212+ Value *OutHitObject =
6213+ TrivialDxilOperation (Opcode, Args, Helper.voidTy , CI, OP);
62496214 Builder.CreateStore (OutHitObject, HitObjectPtr);
62506215 return nullptr ;
62516216}
@@ -6348,10 +6313,9 @@ Value *TranslateHitObjectTraceRay(CallInst *CI, IntrinsicOp IOP,
63486313 hlsl::OP *OP = &Helper.hlslOP ;
63496314 IRBuilder<> Builder (CI);
63506315
6351- const unsigned DxilNumArgs = DxilInst_HitObject_TraceRay::arg_payload + 1 ;
63526316 DXASSERT_NOMSG (CI->getNumArgOperands () ==
63536317 HLOperandIndex::kHitObjectTraceRay_NumOp );
6354- Value *Args[DxilNumArgs ];
6318+ Value *Args[DXIL::OperandIndex:: kHitObjectTraceRay_NumOp ];
63556319 Value *OpArg = OP->GetU32Const (static_cast <unsigned >(OpCode));
63566320 Args[0 ] = OpArg;
63576321
@@ -6363,13 +6327,19 @@ Value *TranslateHitObjectTraceRay(CallInst *CI, IntrinsicOp IOP,
63636327 Args[DestIdx] = CI->getArgOperand (SrcIdx);
63646328 }
63656329
6366- Value *RayDescPtr = CI->getArgOperand (SrcIdx++);
6367- DestIdx = LoadRayDescElementsIntoArgs (Args, OP, Builder, RayDescPtr, DestIdx);
6330+ DXASSERT_NOMSG (SrcIdx == HLOperandIndex::kHitObjectTraceRay_RayDescOpIdx );
6331+ DXASSERT_NOMSG (DestIdx ==
6332+ DXIL::OperandIndex::kHitObjectTraceRay_RayDescOpIdx );
6333+ TransferRayDescArgs (Args, OP, Builder, CI, DestIdx, SrcIdx);
6334+ DXASSERT_NOMSG (SrcIdx == CI->getNumArgOperands () - 1 );
6335+ DXASSERT_NOMSG (DestIdx ==
6336+ DXIL::OperandIndex::kHitObjectTraceRay_PayloadOpIdx );
6337+
63686338 Value *Payload = CI->getArgOperand (SrcIdx++);
63696339 Args[DestIdx++] = Payload;
63706340
63716341 DXASSERT_NOMSG (SrcIdx == CI->getNumArgOperands ());
6372- DXASSERT_NOMSG (DestIdx == DxilNumArgs );
6342+ DXASSERT_NOMSG (DestIdx == DXIL::OperandIndex:: kHitObjectTraceRay_NumOp );
63736343
63746344 Function *F = OP->GetOpFunc (OpCode, Payload->getType ());
63756345
@@ -7402,7 +7372,7 @@ IntrinsicLower gLowerTable[] = {
74027372 DXIL::OpCode::NumOpCodes},
74037373 {IntrinsicOp::MOP_InterlockedUMin, TranslateMopAtomicBinaryOperation,
74047374 DXIL::OpCode::NumOpCodes},
7405- {IntrinsicOp::MOP_DxHitObject_MakeNop, TranslateHitObjectMake ,
7375+ {IntrinsicOp::MOP_DxHitObject_MakeNop, TranslateHitObjectMakeNop ,
74067376 DXIL::OpCode::HitObject_MakeNop},
74077377 {IntrinsicOp::IOP_DxMaybeReorderThread, TranslateMaybeReorderThread,
74087378 DXIL::OpCode::MaybeReorderThread},
@@ -7462,7 +7432,7 @@ IntrinsicLower gLowerTable[] = {
74627432 {IntrinsicOp::MOP_DxHitObject_LoadLocalRootTableConstant,
74637433 TranslateHitObjectLoadLocalRootTableConstant,
74647434 DXIL::OpCode::HitObject_LoadLocalRootTableConstant},
7465- {IntrinsicOp::MOP_DxHitObject_MakeMiss, TranslateHitObjectMake ,
7435+ {IntrinsicOp::MOP_DxHitObject_MakeMiss, TranslateHitObjectMakeMiss ,
74667436 DXIL::OpCode::HitObject_MakeMiss},
74677437 {IntrinsicOp::MOP_DxHitObject_SetShaderTableIndex,
74687438 TranslateHitObjectSetShaderTableIndex,
0 commit comments