@@ -5953,19 +5953,31 @@ Value *TranslateNoArgVectorOperation(CallInst *CI, IntrinsicOp IOP,
59535953 return retVal;
59545954}
59555955
5956+ template <typename ColElemTy>
5957+ static void GetMatrixIndices (Constant *&Rows, Constant *&Cols, bool Is3x4,
5958+ LLVMContext &Ctx) {
5959+ if (Is3x4) {
5960+ uint32_t RVals[] = {0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 };
5961+ Rows = ConstantDataVector::get (Ctx, RVals);
5962+ ColElemTy CVals[] = {0 , 1 , 2 , 3 , 0 , 1 , 2 , 3 , 0 , 1 , 2 , 3 };
5963+ Cols = ConstantDataVector::get (Ctx, CVals);
5964+ return ;
5965+ }
5966+ uint32_t RVals[] = {0 , 1 , 2 , 0 , 1 , 2 , 0 , 1 , 2 , 0 , 1 , 2 };
5967+ Rows = ConstantDataVector::get (Ctx, RVals);
5968+ ColElemTy CVals[] = {0 , 0 , 0 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 3 , 3 };
5969+ Cols = ConstantDataVector::get (Ctx, CVals);
5970+ }
5971+
59565972Value *TranslateNoArgMatrix3x4Operation (
59575973 CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode,
59585974 HLOperationLowerHelper &helper, HLObjectOperationLowerHelper *pObjHelper,
59595975 bool &Translated) {
59605976 hlsl::OP *hlslOP = &helper.hlslOP ;
59615977 VectorType *Ty = cast<VectorType>(CI->getType ());
5962- uint32_t rVals[] = {0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 };
5963- Constant *rows = ConstantDataVector::get (CI->getContext (), rVals);
5964- uint8_t cVals[] = {0 , 1 , 2 , 3 , 0 , 1 , 2 , 3 , 0 , 1 , 2 , 3 };
5965- Constant *cols = ConstantDataVector::get (CI->getContext (), cVals);
5966- Value *retVal =
5967- TrivialDxilOperation (opcode, {nullptr , rows, cols}, Ty, CI, hlslOP);
5968- return retVal;
5978+ Constant *Rows, *Cols;
5979+ GetMatrixIndices<uint8_t >(Rows, Cols, true , CI->getContext ());
5980+ return TrivialDxilOperation (opcode, {nullptr , Rows, Cols}, Ty, CI, hlslOP);
59695981}
59705982
59715983Value *TranslateNoArgTransposedMatrix3x4Operation (
@@ -5974,13 +5986,9 @@ Value *TranslateNoArgTransposedMatrix3x4Operation(
59745986 bool &Translated) {
59755987 hlsl::OP *hlslOP = &helper.hlslOP ;
59765988 VectorType *Ty = cast<VectorType>(CI->getType ());
5977- uint32_t rVals[] = {0 , 1 , 2 , 0 , 1 , 2 , 0 , 1 , 2 , 0 , 1 , 2 };
5978- Constant *rows = ConstantDataVector::get (CI->getContext (), rVals);
5979- uint8_t cVals[] = {0 , 0 , 0 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 3 , 3 };
5980- Constant *cols = ConstantDataVector::get (CI->getContext (), cVals);
5981- Value *retVal =
5982- TrivialDxilOperation (opcode, {nullptr , rows, cols}, Ty, CI, hlslOP);
5983- return retVal;
5989+ Constant *Rows, *Cols;
5990+ GetMatrixIndices<uint8_t >(Rows, Cols, false , CI->getContext ());
5991+ return TrivialDxilOperation (opcode, {nullptr , Rows, Cols}, Ty, CI, hlslOP);
59845992}
59855993
59865994/*
@@ -6331,37 +6339,89 @@ Value *TranslateHitObjectScalarGetter(CallInst *CI, IntrinsicOp IOP,
63316339 HLOperationLowerHelper &Helper,
63326340 HLObjectOperationLowerHelper *pObjHelper,
63336341 bool &Translated) {
6334- return UndefValue::get (CI->getType ()); // TODO: Merge SER DXIL patches
6342+ hlsl::OP *OP = &Helper.hlslOP ;
6343+ Value *HitObjectPtr = CI->getArgOperand (1 );
6344+ IRBuilder<> Builder (CI);
6345+ Value *HitObject = Builder.CreateLoad (HitObjectPtr);
6346+ return TrivialDxilOperation (OpCode, {nullptr , HitObject}, CI->getType (), CI,
6347+ OP);
63356348}
63366349
63376350Value *TranslateHitObjectVectorGetter (CallInst *CI, IntrinsicOp IOP,
63386351 OP::OpCode OpCode,
63396352 HLOperationLowerHelper &Helper,
63406353 HLObjectOperationLowerHelper *pObjHelper,
63416354 bool &Translated) {
6342- return UndefValue::get (CI->getType ()); // TODO: Merge SER DXIL patches
6355+ hlsl::OP *OP = &Helper.hlslOP ;
6356+ Value *HitObjectPtr = CI->getArgOperand (1 );
6357+ IRBuilder<> Builder (CI);
6358+ Value *HitObject = Builder.CreateLoad (HitObjectPtr);
6359+ VectorType *Ty = cast<VectorType>(CI->getType ());
6360+ uint32_t Vals[] = {0 , 1 , 2 , 3 };
6361+ Constant *Src = ConstantDataVector::get (CI->getContext (), Vals);
6362+ return TrivialDxilOperation (OpCode, {nullptr , HitObject, Src}, Ty, CI, OP);
6363+ }
6364+
6365+ static bool IsHitObject3x4Getter (IntrinsicOp IOP) {
6366+ switch (IOP) {
6367+ default :
6368+ return false ;
6369+ case IntrinsicOp::MOP_DxHitObject_GetObjectToWorld3x4:
6370+ case IntrinsicOp::MOP_DxHitObject_GetWorldToObject3x4:
6371+ return true ;
6372+ }
63436373}
63446374
63456375Value *TranslateHitObjectMatrixGetter (CallInst *CI, IntrinsicOp IOP,
63466376 OP::OpCode OpCode,
63476377 HLOperationLowerHelper &Helper,
63486378 HLObjectOperationLowerHelper *pObjHelper,
63496379 bool &Translated) {
6350- return UndefValue::get (CI->getType ()); // TODO: Merge SER DXIL patches
6380+ hlsl::OP *OP = &Helper.hlslOP ;
6381+ Value *HitObjectPtr = CI->getArgOperand (1 );
6382+ IRBuilder<> Builder (CI);
6383+ Value *HitObject = Builder.CreateLoad (HitObjectPtr);
6384+
6385+ // Create 3x4 matrix indices
6386+ bool Is3x4 = IsHitObject3x4Getter (IOP);
6387+ Constant *Rows, *Cols;
6388+ GetMatrixIndices<uint32_t >(Rows, Cols, Is3x4, CI->getContext ());
6389+
6390+ VectorType *Ty = cast<VectorType>(CI->getType ());
6391+ return TrivialDxilOperation (OpCode, {nullptr , HitObject, Rows, Cols}, Ty, CI,
6392+ OP);
63516393}
63526394
63536395Value *TranslateHitObjectLoadLocalRootTableConstant (
63546396 CallInst *CI, IntrinsicOp IOP, OP::OpCode OpCode,
63556397 HLOperationLowerHelper &Helper, HLObjectOperationLowerHelper *pObjHelper,
63566398 bool &Translated) {
6357- return UndefValue::get (CI->getType ()); // TODO: Merge SER DXIL patches
6399+ hlsl::OP *OP = &Helper.hlslOP ;
6400+ IRBuilder<> Builder (CI);
6401+
6402+ Value *HitObjectPtr = CI->getArgOperand (1 );
6403+ Value *Offset = CI->getArgOperand (2 );
6404+
6405+ Value *HitObject = Builder.CreateLoad (HitObjectPtr);
6406+ return TrivialDxilOperation (OpCode, {nullptr , HitObject, Offset},
6407+ Helper.voidTy , CI, OP);
63586408}
63596409
63606410Value *TranslateHitObjectSetShaderTableIndex (
63616411 CallInst *CI, IntrinsicOp IOP, OP::OpCode OpCode,
63626412 HLOperationLowerHelper &Helper, HLObjectOperationLowerHelper *pObjHelper,
63636413 bool &Translated) {
6364- return UndefValue::get (CI->getType ()); // TODO: Merge SER DXIL patches
6414+ hlsl::OP *OP = &Helper.hlslOP ;
6415+ IRBuilder<> Builder (CI);
6416+
6417+ Value *HitObjectPtr = CI->getArgOperand (1 );
6418+ Value *ShaderTableIndex = CI->getArgOperand (2 );
6419+
6420+ Value *InHitObject = Builder.CreateLoad (HitObjectPtr);
6421+ Value *OutHitObject = TrivialDxilOperation (
6422+ OpCode, {nullptr , InHitObject, ShaderTableIndex}, Helper.voidTy , CI, OP);
6423+ Builder.CreateStore (OutHitObject, HitObjectPtr);
6424+ return nullptr ;
63656425}
63666426
63676427} // namespace
0 commit comments