1212// //
1313// /////////////////////////////////////////////////////////////////////////////
1414
15+ #include " dxc/DXIL/DxilConstants.h"
1516#define _USE_MATH_DEFINES
1617#include < array>
1718#include < cmath>
1819#include < functional>
1920#include < unordered_set>
2021
22+ #include " dxc/DXIL/DxilConstants.h"
23+ #include " dxc/DXIL/DxilInstructions.h"
2124#include " dxc/DXIL/DxilModule.h"
2225#include " dxc/DXIL/DxilOperations.h"
2326#include " dxc/DXIL/DxilResourceProperties.h"
@@ -5717,58 +5720,61 @@ Value *TranslateCallShader(CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode,
57175720 return Builder.CreateCall (F, {opArg, ShaderIndex, Parameter});
57185721}
57195722
5720- Value *TranslateTraceRay (CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode,
5721- HLOperationLowerHelper &helper,
5722- HLObjectOperationLowerHelper *pObjHelper,
5723- bool &Translated) {
5724- hlsl::OP *hlslOP = &helper.hlslOP ;
5725-
5726- Value *rayDesc = CI->getArgOperand (HLOperandIndex::kTraceRayRayDescOpIdx );
5727- Value *payLoad = CI->getArgOperand (HLOperandIndex::kTraceRayPayLoadOpIdx );
5728-
5729- Value *opArg = hlslOP->GetU32Const (static_cast <unsigned >(opcode));
5730-
5731- Value *Args[DXIL::OperandIndex::kTraceRayNumOp ];
5732- Args[0 ] = opArg;
5733- for (unsigned i = 1 ; i < HLOperandIndex::kTraceRayRayDescOpIdx ; i++) {
5734- Args[i] = CI->getArgOperand (i);
5735- }
5736- IRBuilder<> Builder (CI);
5723+ static unsigned LoadRayDescElementsIntoArgs (Value **Args, hlsl::OP *OP,
5724+ IRBuilder<> &Builder,
5725+ Value *RayDescPtr, unsigned Index) {
57375726 // struct RayDesc
57385727 // {
57395728 // float3 Origin;
57405729 // float TMin;
57415730 // float3 Direction;
57425731 // float TMax;
57435732 // };
5744- Value *zeroIdx = hlslOP->GetU32Const (0 );
5745- Value *origin = Builder.CreateGEP (rayDesc, {zeroIdx, zeroIdx});
5746- origin = Builder.CreateLoad (origin);
5747- unsigned index = DXIL::OperandIndex::kTraceRayRayDescOpIdx ;
5748- Args[index++] = Builder.CreateExtractElement (origin, (uint64_t )0 );
5749- Args[index++] = Builder.CreateExtractElement (origin, 1 );
5750- Args[index++] = Builder.CreateExtractElement (origin, 2 );
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 );
57515739
5752- Value *tmin = Builder.CreateGEP (rayDesc, {zeroIdx, hlslOP->GetU32Const (1 )});
5753- tmin = Builder.CreateLoad (tmin);
5754- Args[index++] = tmin;
5740+ Value *TMinPtr = Builder.CreateGEP (RayDescPtr, {ZeroIdx, OP->GetU32Const (1 )});
5741+ Args[Index++] = Builder.CreateLoad (TMinPtr);
57555742
5756- Value *direction =
5757- Builder.CreateGEP (rayDesc , {zeroIdx, hlslOP ->GetU32Const (2 )});
5758- direction = Builder.CreateLoad (direction );
5743+ Value *DirectionPtr =
5744+ Builder.CreateGEP (RayDescPtr , {ZeroIdx, OP ->GetU32Const (2 )});
5745+ Value *Direction = Builder.CreateLoad (DirectionPtr );
57595746
5760- Args[index++] = Builder.CreateExtractElement (direction, (uint64_t )0 );
5761- Args[index++] = Builder.CreateExtractElement (direction, 1 );
5762- Args[index++] = Builder.CreateExtractElement (direction, 2 );
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;
5754+ }
5755+
5756+ Value *TranslateTraceRay (CallInst *CI, IntrinsicOp IOP, OP::OpCode OpCode,
5757+ HLOperationLowerHelper &Helper,
5758+ HLObjectOperationLowerHelper *pObjHelper,
5759+ bool &Translated) {
5760+ hlsl::OP *OP = &Helper.hlslOP ;
5761+
5762+ Value *RayDesc = CI->getArgOperand (HLOperandIndex::kTraceRayRayDescOpIdx );
5763+ Value *PayLoad = CI->getArgOperand (HLOperandIndex::kTraceRayPayLoadOpIdx );
5764+
5765+ Value *Args[DXIL::OperandIndex::kTraceRayNumOp ];
5766+ Args[0 ] = OP->GetU32Const (static_cast <unsigned >(OpCode));
5767+ for (unsigned i = 1 ; i < HLOperandIndex::kTraceRayRayDescOpIdx ; i++)
5768+ Args[i] = CI->getArgOperand (i);
57635769
5764- Value *tmax = Builder. CreateGEP (rayDesc, {zeroIdx, hlslOP-> GetU32Const ( 3 )} );
5765- tmax = Builder. CreateLoad (tmax);
5766- Args[index++] = tmax ;
5770+ IRBuilder<> Builder (CI );
5771+ LoadRayDescElementsIntoArgs (Args, OP, Builder, RayDesc,
5772+ DXIL::OperandIndex:: kTraceRayRayDescOpIdx ) ;
57675773
5768- Args[DXIL::OperandIndex::kTraceRayPayloadOpIdx ] = payLoad ;
5774+ Args[DXIL::OperandIndex::kTraceRayPayloadOpIdx ] = PayLoad ;
57695775
5770- Type *Ty = payLoad ->getType ();
5771- Function *F = hlslOP ->GetOpFunc (opcode , Ty);
5776+ Type *Ty = PayLoad ->getType ();
5777+ Function *F = OP ->GetOpFunc (OpCode , Ty);
57725778
57735779 return Builder.CreateCall (F, Args);
57745780}
@@ -6183,19 +6189,114 @@ Value *TranslateUnpack(CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode,
61836189
61846190// Shader Execution Reordering.
61856191namespace {
6186- Value *TranslateHitObjectMake (CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode ,
6187- HLOperationLowerHelper &helper ,
6188- HLObjectOperationLowerHelper *pObjHelper ,
6192+ Value *TranslateHitObjectMake (CallInst *CI, IntrinsicOp IOP, OP::OpCode Opcode ,
6193+ HLOperationLowerHelper &Helper ,
6194+ HLObjectOperationLowerHelper *ObjHelper ,
61896195 bool &Translated) {
6190- return UndefValue::get (CI->getType ()); // TODO: Merge SER DXIL patches
6196+ hlsl::OP *HlslOP = &Helper.hlslOP ;
6197+ IRBuilder<> Builder (CI);
6198+ unsigned SrcIdx = 1 ;
6199+ Value *HitObjectPtr = CI->getArgOperand (SrcIdx++);
6200+ if (Opcode == OP::OpCode::HitObject_MakeNop) {
6201+ Value *HitObject = TrivialDxilOperation (
6202+ Opcode, {nullptr }, Type::getVoidTy (CI->getContext ()), CI, HlslOP);
6203+ Builder.CreateStore (HitObject, HitObjectPtr);
6204+ DXASSERT (
6205+ CI->use_empty (),
6206+ " Default ctor return type is a Clang artifact. Value must not be used" );
6207+ return nullptr ;
6208+ }
6209+
6210+ DXASSERT_NOMSG (CI->getNumArgOperands () ==
6211+ HLOperandIndex::kHitObjectMakeMiss_NumOp );
6212+ Value *RayFlags = CI->getArgOperand (SrcIdx++);
6213+ Value *MissShaderIdx = CI->getArgOperand (SrcIdx++);
6214+ DXASSERT_NOMSG (SrcIdx == HLOperandIndex::kHitObjectMakeMissRayDescOpIdx );
6215+ Value *RayDescOrigin = CI->getArgOperand (SrcIdx++);
6216+ Value *RayDescOriginX =
6217+ Builder.CreateExtractElement (RayDescOrigin, (uint64_t )0 );
6218+ Value *RayDescOriginY =
6219+ Builder.CreateExtractElement (RayDescOrigin, (uint64_t )1 );
6220+ Value *RayDescOriginZ =
6221+ Builder.CreateExtractElement (RayDescOrigin, (uint64_t )2 );
6222+
6223+ Value *RayDescTMin = CI->getArgOperand (SrcIdx++);
6224+ Value *RayDescDirection = CI->getArgOperand (SrcIdx++);
6225+ Value *RayDescDirectionX =
6226+ Builder.CreateExtractElement (RayDescDirection, (uint64_t )0 );
6227+ Value *RayDescDirectionY =
6228+ Builder.CreateExtractElement (RayDescDirection, (uint64_t )1 );
6229+ Value *RayDescDirectionZ =
6230+ Builder.CreateExtractElement (RayDescDirection, (uint64_t )2 );
6231+
6232+ Value *RayDescTMax = CI->getArgOperand (SrcIdx++);
6233+ DXASSERT_NOMSG (SrcIdx == CI->getNumArgOperands ());
6234+
6235+ Value *OutHitObject = TrivialDxilOperation (
6236+ Opcode,
6237+ {nullptr , RayFlags, MissShaderIdx, RayDescOriginX, RayDescOriginY,
6238+ RayDescOriginZ, RayDescTMin, RayDescDirectionX, RayDescDirectionY,
6239+ RayDescDirectionZ, RayDescTMax},
6240+ Helper.voidTy , CI, HlslOP);
6241+ Builder.CreateStore (OutHitObject, HitObjectPtr);
6242+ return nullptr ;
61916243}
61926244
61936245Value *TranslateMaybeReorderThread (CallInst *CI, IntrinsicOp IOP,
6194- OP::OpCode opcode ,
6195- HLOperationLowerHelper &helper ,
6246+ OP::OpCode OpCode ,
6247+ HLOperationLowerHelper &Helper ,
61966248 HLObjectOperationLowerHelper *pObjHelper,
61976249 bool &Translated) {
6198- return nullptr ; // TODO: Merge SER DXIL patches
6250+ hlsl::OP *OP = &Helper.hlslOP ;
6251+
6252+ // clang-format off
6253+ // Match MaybeReorderThread overload variants:
6254+ // void MaybeReorderThread(<Op>,
6255+ // HitObject Hit);
6256+ // void MaybeReorderThread(<Op>,
6257+ // uint CoherenceHint,
6258+ // uint NumCoherenceHintBitsFromLSB );
6259+ // void MaybeReorderThread(<Op>,
6260+ // HitObject Hit,
6261+ // uint CoherenceHint,
6262+ // uint NumCoherenceHintBitsFromLSB);
6263+ // clang-format on
6264+ const unsigned NumHLArgs = CI->getNumArgOperands ();
6265+ DXASSERT_NOMSG (NumHLArgs >= 2 );
6266+
6267+ // Use a NOP HitObject for MaybeReorderThread without HitObject.
6268+ Value *HitObject = nullptr ;
6269+ unsigned HLIndex = 1 ;
6270+ if (3 == NumHLArgs) {
6271+ HitObject = TrivialDxilOperation (DXIL::OpCode::HitObject_MakeNop, {nullptr },
6272+ Type::getVoidTy (CI->getContext ()), CI, OP);
6273+ } else {
6274+ Value *FirstParam = CI->getArgOperand (HLIndex);
6275+ DXASSERT_NOMSG (isa<PointerType>(FirstParam->getType ()));
6276+ IRBuilder<> Builder (CI);
6277+ HitObject = Builder.CreateLoad (FirstParam);
6278+ HLIndex++;
6279+ }
6280+
6281+ // If there are trailing parameters, these have to be the two coherence bit
6282+ // parameters
6283+ Value *CoherenceHint = nullptr ;
6284+ Value *NumCoherenceHintBits = nullptr ;
6285+ if (2 != NumHLArgs) {
6286+ DXASSERT_NOMSG (HLIndex + 2 == NumHLArgs);
6287+ CoherenceHint = CI->getArgOperand (HLIndex++);
6288+ NumCoherenceHintBits = CI->getArgOperand (HLIndex++);
6289+ DXASSERT_NOMSG (Helper.i32Ty == CoherenceHint->getType ());
6290+ DXASSERT_NOMSG (Helper.i32Ty == NumCoherenceHintBits->getType ());
6291+ } else {
6292+ CoherenceHint = UndefValue::get (Helper.i32Ty );
6293+ NumCoherenceHintBits = OP->GetU32Const (0 );
6294+ }
6295+
6296+ TrivialDxilOperation (
6297+ OpCode, {nullptr , HitObject, CoherenceHint, NumCoherenceHintBits},
6298+ Type::getVoidTy (CI->getContext ()), CI, OP);
6299+ return nullptr ;
61996300}
62006301
62016302Value *TranslateHitObjectFromRayQuery (CallInst *CI, IntrinsicOp IOP,
@@ -6211,15 +6312,54 @@ Value *TranslateHitObjectTraceRay(CallInst *CI, IntrinsicOp IOP,
62116312 HLOperationLowerHelper &Helper,
62126313 HLObjectOperationLowerHelper *pObjHelper,
62136314 bool &Translated) {
6214- return UndefValue::get (CI->getType ()); // TODO: Merge SER DXIL patches
6315+ hlsl::OP *OP = &Helper.hlslOP ;
6316+ IRBuilder<> Builder (CI);
6317+
6318+ const unsigned DxilNumArgs = DxilInst_HitObject_TraceRay::arg_payload + 1 ;
6319+ DXASSERT_NOMSG (CI->getNumArgOperands () ==
6320+ HLOperandIndex::kHitObjectTraceRay_NumOp );
6321+ Value *Args[DxilNumArgs];
6322+ Value *OpArg = OP->GetU32Const (static_cast <unsigned >(OpCode));
6323+ Args[0 ] = OpArg;
6324+
6325+ unsigned DestIdx = 1 , SrcIdx = 1 ;
6326+ Value *HitObjectPtr = CI->getArgOperand (SrcIdx++);
6327+ Args[DestIdx++] = CI->getArgOperand (SrcIdx++);
6328+ for (; SrcIdx < HLOperandIndex::kHitObjectTraceRay_RayDescOpIdx ;
6329+ ++SrcIdx, ++DestIdx) {
6330+ Args[DestIdx] = CI->getArgOperand (SrcIdx);
6331+ }
6332+
6333+ Value *RayDescPtr = CI->getArgOperand (SrcIdx++);
6334+ DestIdx = LoadRayDescElementsIntoArgs (Args, OP, Builder, RayDescPtr, DestIdx);
6335+ Value *Payload = CI->getArgOperand (SrcIdx++);
6336+ Args[DestIdx++] = Payload;
6337+
6338+ DXASSERT_NOMSG (SrcIdx == CI->getNumArgOperands ());
6339+ DXASSERT_NOMSG (DestIdx == DxilNumArgs);
6340+
6341+ Function *F = OP->GetOpFunc (OpCode, Payload->getType ());
6342+
6343+ Value *OutHitObject = Builder.CreateCall (F, Args);
6344+ Builder.CreateStore (OutHitObject, HitObjectPtr);
6345+ return nullptr ;
62156346}
62166347
62176348Value *TranslateHitObjectInvoke (CallInst *CI, IntrinsicOp IOP,
62186349 OP::OpCode OpCode,
62196350 HLOperationLowerHelper &Helper,
62206351 HLObjectOperationLowerHelper *pObjHelper,
62216352 bool &Translated) {
6222- return nullptr ; // TODO: Merge SER DXIL patches
6353+ unsigned SrcIdx = 1 ;
6354+ Value *HitObjectPtr = CI->getArgOperand (SrcIdx++);
6355+ Value *Payload = CI->getArgOperand (SrcIdx++);
6356+ DXASSERT_NOMSG (SrcIdx == CI->getNumArgOperands ());
6357+
6358+ IRBuilder<> Builder (CI);
6359+ Value *HitObject = Builder.CreateLoad (HitObjectPtr);
6360+ TrivialDxilOperation (OpCode, {nullptr , HitObject, Payload},
6361+ Payload->getType (), CI, &Helper.hlslOP );
6362+ return nullptr ;
62236363}
62246364
62256365Value *TranslateHitObjectGetAttributes (CallInst *CI, IntrinsicOp IOP,
@@ -7162,11 +7302,9 @@ IntrinsicLower gLowerTable[] = {
71627302 {IntrinsicOp::MOP_InterlockedUMin, TranslateMopAtomicBinaryOperation,
71637303 DXIL::OpCode::NumOpCodes},
71647304 {IntrinsicOp::MOP_DxHitObject_MakeNop, TranslateHitObjectMake,
7165- DXIL::OpCode::NumOpCodes_Dxil_1_8}, // FIXME: Just a placeholder Dxil
7166- // opcode
7305+ DXIL::OpCode::HitObject_MakeNop},
71677306 {IntrinsicOp::IOP_DxMaybeReorderThread, TranslateMaybeReorderThread,
7168- DXIL::OpCode::NumOpCodes_Dxil_1_8}, // FIXME: Just a placeholder Dxil
7169- // opcode
7307+ DXIL::OpCode::MaybeReorderThread},
71707308 {IntrinsicOp::IOP_Vkstatic_pointer_cast, UnsupportedVulkanIntrinsic,
71717309 DXIL::OpCode::NumOpCodes},
71727310 {IntrinsicOp::IOP_Vkreinterpret_pointer_cast, UnsupportedVulkanIntrinsic,
0 commit comments