@@ -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/*
@@ -6375,37 +6383,89 @@ Value *TranslateHitObjectScalarGetter(CallInst *CI, IntrinsicOp IOP,
63756383 HLOperationLowerHelper &Helper,
63766384 HLObjectOperationLowerHelper *pObjHelper,
63776385 bool &Translated) {
6378- return UndefValue::get (CI->getType ()); // TODO: Merge SER DXIL patches
6386+ hlsl::OP *OP = &Helper.hlslOP ;
6387+ Value *HitObjectPtr = CI->getArgOperand (1 );
6388+ IRBuilder<> Builder (CI);
6389+ Value *HitObject = Builder.CreateLoad (HitObjectPtr);
6390+ return TrivialDxilOperation (OpCode, {nullptr , HitObject}, CI->getType (), CI,
6391+ OP);
63796392}
63806393
63816394Value *TranslateHitObjectVectorGetter (CallInst *CI, IntrinsicOp IOP,
63826395 OP::OpCode OpCode,
63836396 HLOperationLowerHelper &Helper,
63846397 HLObjectOperationLowerHelper *pObjHelper,
63856398 bool &Translated) {
6386- return UndefValue::get (CI->getType ()); // TODO: Merge SER DXIL patches
6399+ hlsl::OP *OP = &Helper.hlslOP ;
6400+ Value *HitObjectPtr = CI->getArgOperand (1 );
6401+ IRBuilder<> Builder (CI);
6402+ Value *HitObject = Builder.CreateLoad (HitObjectPtr);
6403+ VectorType *Ty = cast<VectorType>(CI->getType ());
6404+ uint32_t Vals[] = {0 , 1 , 2 , 3 };
6405+ Constant *Src = ConstantDataVector::get (CI->getContext (), Vals);
6406+ return TrivialDxilOperation (OpCode, {nullptr , HitObject, Src}, Ty, CI, OP);
6407+ }
6408+
6409+ static bool IsHitObject3x4Getter (IntrinsicOp IOP) {
6410+ switch (IOP) {
6411+ default :
6412+ return false ;
6413+ case IntrinsicOp::MOP_DxHitObject_GetObjectToWorld3x4:
6414+ case IntrinsicOp::MOP_DxHitObject_GetWorldToObject3x4:
6415+ return true ;
6416+ }
63876417}
63886418
63896419Value *TranslateHitObjectMatrixGetter (CallInst *CI, IntrinsicOp IOP,
63906420 OP::OpCode OpCode,
63916421 HLOperationLowerHelper &Helper,
63926422 HLObjectOperationLowerHelper *pObjHelper,
63936423 bool &Translated) {
6394- return UndefValue::get (CI->getType ()); // TODO: Merge SER DXIL patches
6424+ hlsl::OP *OP = &Helper.hlslOP ;
6425+ Value *HitObjectPtr = CI->getArgOperand (1 );
6426+ IRBuilder<> Builder (CI);
6427+ Value *HitObject = Builder.CreateLoad (HitObjectPtr);
6428+
6429+ // Create 3x4 matrix indices
6430+ bool Is3x4 = IsHitObject3x4Getter (IOP);
6431+ Constant *Rows, *Cols;
6432+ GetMatrixIndices<uint32_t >(Rows, Cols, Is3x4, CI->getContext ());
6433+
6434+ VectorType *Ty = cast<VectorType>(CI->getType ());
6435+ return TrivialDxilOperation (OpCode, {nullptr , HitObject, Rows, Cols}, Ty, CI,
6436+ OP);
63956437}
63966438
63976439Value *TranslateHitObjectLoadLocalRootTableConstant (
63986440 CallInst *CI, IntrinsicOp IOP, OP::OpCode OpCode,
63996441 HLOperationLowerHelper &Helper, HLObjectOperationLowerHelper *pObjHelper,
64006442 bool &Translated) {
6401- return UndefValue::get (CI->getType ()); // TODO: Merge SER DXIL patches
6443+ hlsl::OP *OP = &Helper.hlslOP ;
6444+ IRBuilder<> Builder (CI);
6445+
6446+ Value *HitObjectPtr = CI->getArgOperand (1 );
6447+ Value *Offset = CI->getArgOperand (2 );
6448+
6449+ Value *HitObject = Builder.CreateLoad (HitObjectPtr);
6450+ return TrivialDxilOperation (OpCode, {nullptr , HitObject, Offset},
6451+ Helper.voidTy , CI, OP);
64026452}
64036453
64046454Value *TranslateHitObjectSetShaderTableIndex (
64056455 CallInst *CI, IntrinsicOp IOP, OP::OpCode OpCode,
64066456 HLOperationLowerHelper &Helper, HLObjectOperationLowerHelper *pObjHelper,
64076457 bool &Translated) {
6408- return UndefValue::get (CI->getType ()); // TODO: Merge SER DXIL patches
6458+ hlsl::OP *OP = &Helper.hlslOP ;
6459+ IRBuilder<> Builder (CI);
6460+
6461+ Value *HitObjectPtr = CI->getArgOperand (1 );
6462+ Value *ShaderTableIndex = CI->getArgOperand (2 );
6463+
6464+ Value *InHitObject = Builder.CreateLoad (HitObjectPtr);
6465+ Value *OutHitObject = TrivialDxilOperation (
6466+ OpCode, {nullptr , InHitObject, ShaderTableIndex}, Helper.voidTy , CI, OP);
6467+ Builder.CreateStore (OutHitObject, HitObjectPtr);
6468+ return nullptr ;
64096469}
64106470
64116471} // namespace
0 commit comments