@@ -5958,19 +5958,31 @@ Value *TranslateNoArgVectorOperation(CallInst *CI, IntrinsicOp IOP,
59585958 return retVal;
59595959}
59605960
5961+ template <typename ColElemTy>
5962+ static void GetMatrixIndices (Constant *&Rows, Constant *&Cols, bool Is3x4,
5963+ LLVMContext &Ctx) {
5964+ if (Is3x4) {
5965+ uint32_t RVals[] = {0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 };
5966+ Rows = ConstantDataVector::get (Ctx, RVals);
5967+ ColElemTy CVals[] = {0 , 1 , 2 , 3 , 0 , 1 , 2 , 3 , 0 , 1 , 2 , 3 };
5968+ Cols = ConstantDataVector::get (Ctx, CVals);
5969+ return ;
5970+ }
5971+ uint32_t RVals[] = {0 , 1 , 2 , 0 , 1 , 2 , 0 , 1 , 2 , 0 , 1 , 2 };
5972+ Rows = ConstantDataVector::get (Ctx, RVals);
5973+ ColElemTy CVals[] = {0 , 0 , 0 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 3 , 3 };
5974+ Cols = ConstantDataVector::get (Ctx, CVals);
5975+ }
5976+
59615977Value *TranslateNoArgMatrix3x4Operation (
59625978 CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode,
59635979 HLOperationLowerHelper &helper, HLObjectOperationLowerHelper *pObjHelper,
59645980 bool &Translated) {
59655981 hlsl::OP *hlslOP = &helper.hlslOP ;
59665982 VectorType *Ty = cast<VectorType>(CI->getType ());
5967- uint32_t rVals[] = {0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 };
5968- Constant *rows = ConstantDataVector::get (CI->getContext (), rVals);
5969- uint8_t cVals[] = {0 , 1 , 2 , 3 , 0 , 1 , 2 , 3 , 0 , 1 , 2 , 3 };
5970- Constant *cols = ConstantDataVector::get (CI->getContext (), cVals);
5971- Value *retVal =
5972- TrivialDxilOperation (opcode, {nullptr , rows, cols}, Ty, CI, hlslOP);
5973- return retVal;
5983+ Constant *Rows, *Cols;
5984+ GetMatrixIndices<uint8_t >(Rows, Cols, true , CI->getContext ());
5985+ return TrivialDxilOperation (opcode, {nullptr , Rows, Cols}, Ty, CI, hlslOP);
59745986}
59755987
59765988Value *TranslateNoArgTransposedMatrix3x4Operation (
@@ -5979,13 +5991,9 @@ Value *TranslateNoArgTransposedMatrix3x4Operation(
59795991 bool &Translated) {
59805992 hlsl::OP *hlslOP = &helper.hlslOP ;
59815993 VectorType *Ty = cast<VectorType>(CI->getType ());
5982- uint32_t rVals[] = {0 , 1 , 2 , 0 , 1 , 2 , 0 , 1 , 2 , 0 , 1 , 2 };
5983- Constant *rows = ConstantDataVector::get (CI->getContext (), rVals);
5984- uint8_t cVals[] = {0 , 0 , 0 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 3 , 3 };
5985- Constant *cols = ConstantDataVector::get (CI->getContext (), cVals);
5986- Value *retVal =
5987- TrivialDxilOperation (opcode, {nullptr , rows, cols}, Ty, CI, hlslOP);
5988- return retVal;
5994+ Constant *Rows, *Cols;
5995+ GetMatrixIndices<uint8_t >(Rows, Cols, false , CI->getContext ());
5996+ return TrivialDxilOperation (opcode, {nullptr , Rows, Cols}, Ty, CI, hlslOP);
59895997}
59905998
59915999/*
@@ -6304,7 +6312,32 @@ Value *TranslateHitObjectFromRayQuery(CallInst *CI, IntrinsicOp IOP,
63046312 HLOperationLowerHelper &Helper,
63056313 HLObjectOperationLowerHelper *pObjHelper,
63066314 bool &Translated) {
6307- return UndefValue::get (CI->getType ()); // TODO: Merge SER DXIL patches
6315+ hlsl::OP *OP = &Helper.hlslOP ;
6316+ IRBuilder<> Builder (CI);
6317+
6318+ unsigned SrcIdx = 1 ;
6319+ Value *HitObjectPtr = CI->getArgOperand (SrcIdx++);
6320+ Value *RayQuery = CI->getArgOperand (SrcIdx++);
6321+
6322+ if (CI->getNumArgOperands () ==
6323+ HLOperandIndex::kHitObjectFromRayQuery_WithAttrs_NumOp ) {
6324+ Value *HitKind = CI->getArgOperand (SrcIdx++);
6325+ Value *AttribSrc = CI->getArgOperand (SrcIdx++);
6326+ DXASSERT_NOMSG (SrcIdx == CI->getNumArgOperands ());
6327+ OpCode = DXIL::OpCode::HitObject_FromRayQueryWithAttrs;
6328+ Type *AttrTy = AttribSrc->getType ();
6329+ Value *OutHitObject = TrivialDxilOperation (
6330+ OpCode, {nullptr , RayQuery, HitKind, AttribSrc}, AttrTy, CI, OP);
6331+ Builder.CreateStore (OutHitObject, HitObjectPtr);
6332+ return nullptr ;
6333+ }
6334+
6335+ DXASSERT_NOMSG (SrcIdx == CI->getNumArgOperands ());
6336+ OpCode = DXIL::OpCode::HitObject_FromRayQuery;
6337+ Value *OutHitObject =
6338+ TrivialDxilOperation (OpCode, {nullptr , RayQuery}, Helper.voidTy , CI, OP);
6339+ Builder.CreateStore (OutHitObject, HitObjectPtr);
6340+ return nullptr ;
63086341}
63096342
63106343Value *TranslateHitObjectTraceRay (CallInst *CI, IntrinsicOp IOP,
@@ -6367,45 +6400,113 @@ Value *TranslateHitObjectGetAttributes(CallInst *CI, IntrinsicOp IOP,
63676400 HLOperationLowerHelper &Helper,
63686401 HLObjectOperationLowerHelper *pObjHelper,
63696402 bool &Translated) {
6370- return UndefValue::get (CI->getType ()); // TODO: Merge SER DXIL patches
6403+ hlsl::OP *OP = &Helper.hlslOP ;
6404+ IRBuilder<> Builder (CI);
6405+
6406+ Value *HitObjectPtr = CI->getArgOperand (1 );
6407+ Value *HitObject = Builder.CreateLoad (HitObjectPtr);
6408+
6409+ Type *AttrTy = cast<PointerType>(CI->getType ())->getPointerElementType ();
6410+
6411+ IRBuilder<> EntryBuilder (
6412+ dxilutil::FindAllocaInsertionPt (CI->getParent ()->getParent ()));
6413+ unsigned AttrAlign = Helper.dataLayout .getABITypeAlignment (AttrTy);
6414+ AllocaInst *AttrMem = EntryBuilder.CreateAlloca (AttrTy);
6415+ AttrMem->setAlignment (AttrAlign);
6416+ Constant *opArg = OP->GetU32Const ((unsigned )OpCode);
6417+ TrivialDxilOperation (OpCode, {opArg, HitObject, AttrMem}, CI->getType (),
6418+ Helper.voidTy , OP, Builder);
6419+ return AttrMem;
63716420}
63726421
63736422Value *TranslateHitObjectScalarGetter (CallInst *CI, IntrinsicOp IOP,
63746423 OP::OpCode OpCode,
63756424 HLOperationLowerHelper &Helper,
63766425 HLObjectOperationLowerHelper *pObjHelper,
63776426 bool &Translated) {
6378- return UndefValue::get (CI->getType ()); // TODO: Merge SER DXIL patches
6427+ hlsl::OP *OP = &Helper.hlslOP ;
6428+ Value *HitObjectPtr = CI->getArgOperand (1 );
6429+ IRBuilder<> Builder (CI);
6430+ Value *HitObject = Builder.CreateLoad (HitObjectPtr);
6431+ return TrivialDxilOperation (OpCode, {nullptr , HitObject}, CI->getType (), CI,
6432+ OP);
63796433}
63806434
63816435Value *TranslateHitObjectVectorGetter (CallInst *CI, IntrinsicOp IOP,
63826436 OP::OpCode OpCode,
63836437 HLOperationLowerHelper &Helper,
63846438 HLObjectOperationLowerHelper *pObjHelper,
63856439 bool &Translated) {
6386- return UndefValue::get (CI->getType ()); // TODO: Merge SER DXIL patches
6440+ hlsl::OP *OP = &Helper.hlslOP ;
6441+ Value *HitObjectPtr = CI->getArgOperand (1 );
6442+ IRBuilder<> Builder (CI);
6443+ Value *HitObject = Builder.CreateLoad (HitObjectPtr);
6444+ VectorType *Ty = cast<VectorType>(CI->getType ());
6445+ uint32_t Vals[] = {0 , 1 , 2 , 3 };
6446+ Constant *Src = ConstantDataVector::get (CI->getContext (), Vals);
6447+ return TrivialDxilOperation (OpCode, {nullptr , HitObject, Src}, Ty, CI, OP);
6448+ }
6449+
6450+ static bool IsHitObject3x4Getter (IntrinsicOp IOP) {
6451+ switch (IOP) {
6452+ default :
6453+ return false ;
6454+ case IntrinsicOp::MOP_DxHitObject_GetObjectToWorld3x4:
6455+ case IntrinsicOp::MOP_DxHitObject_GetWorldToObject3x4:
6456+ return true ;
6457+ }
63876458}
63886459
63896460Value *TranslateHitObjectMatrixGetter (CallInst *CI, IntrinsicOp IOP,
63906461 OP::OpCode OpCode,
63916462 HLOperationLowerHelper &Helper,
63926463 HLObjectOperationLowerHelper *pObjHelper,
63936464 bool &Translated) {
6394- return UndefValue::get (CI->getType ()); // TODO: Merge SER DXIL patches
6465+ hlsl::OP *OP = &Helper.hlslOP ;
6466+ Value *HitObjectPtr = CI->getArgOperand (1 );
6467+ IRBuilder<> Builder (CI);
6468+ Value *HitObject = Builder.CreateLoad (HitObjectPtr);
6469+
6470+ // Create 3x4 matrix indices
6471+ bool Is3x4 = IsHitObject3x4Getter (IOP);
6472+ Constant *Rows, *Cols;
6473+ GetMatrixIndices<uint32_t >(Rows, Cols, Is3x4, CI->getContext ());
6474+
6475+ VectorType *Ty = cast<VectorType>(CI->getType ());
6476+ return TrivialDxilOperation (OpCode, {nullptr , HitObject, Rows, Cols}, Ty, CI,
6477+ OP);
63956478}
63966479
63976480Value *TranslateHitObjectLoadLocalRootTableConstant (
63986481 CallInst *CI, IntrinsicOp IOP, OP::OpCode OpCode,
63996482 HLOperationLowerHelper &Helper, HLObjectOperationLowerHelper *pObjHelper,
64006483 bool &Translated) {
6401- return UndefValue::get (CI->getType ()); // TODO: Merge SER DXIL patches
6484+ hlsl::OP *OP = &Helper.hlslOP ;
6485+ IRBuilder<> Builder (CI);
6486+
6487+ Value *HitObjectPtr = CI->getArgOperand (1 );
6488+ Value *Offset = CI->getArgOperand (2 );
6489+
6490+ Value *HitObject = Builder.CreateLoad (HitObjectPtr);
6491+ return TrivialDxilOperation (OpCode, {nullptr , HitObject, Offset},
6492+ Helper.voidTy , CI, OP);
64026493}
64036494
64046495Value *TranslateHitObjectSetShaderTableIndex (
64056496 CallInst *CI, IntrinsicOp IOP, OP::OpCode OpCode,
64066497 HLOperationLowerHelper &Helper, HLObjectOperationLowerHelper *pObjHelper,
64076498 bool &Translated) {
6408- return UndefValue::get (CI->getType ()); // TODO: Merge SER DXIL patches
6499+ hlsl::OP *OP = &Helper.hlslOP ;
6500+ IRBuilder<> Builder (CI);
6501+
6502+ Value *HitObjectPtr = CI->getArgOperand (1 );
6503+ Value *ShaderTableIndex = CI->getArgOperand (2 );
6504+
6505+ Value *InHitObject = Builder.CreateLoad (HitObjectPtr);
6506+ Value *OutHitObject = TrivialDxilOperation (
6507+ OpCode, {nullptr , InHitObject, ShaderTableIndex}, Helper.voidTy , CI, OP);
6508+ Builder.CreateStore (OutHitObject, HitObjectPtr);
6509+ return nullptr ;
64096510}
64106511
64116512} // namespace
0 commit comments