@@ -5958,19 +5958,31 @@ Value *TranslateNoArgVectorOperation(CallInst *CI, IntrinsicOp IOP,
5958
5958
return retVal;
5959
5959
}
5960
5960
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
+
5961
5977
Value *TranslateNoArgMatrix3x4Operation (
5962
5978
CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode,
5963
5979
HLOperationLowerHelper &helper, HLObjectOperationLowerHelper *pObjHelper,
5964
5980
bool &Translated) {
5965
5981
hlsl::OP *hlslOP = &helper.hlslOP ;
5966
5982
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);
5974
5986
}
5975
5987
5976
5988
Value *TranslateNoArgTransposedMatrix3x4Operation (
@@ -5979,13 +5991,9 @@ Value *TranslateNoArgTransposedMatrix3x4Operation(
5979
5991
bool &Translated) {
5980
5992
hlsl::OP *hlslOP = &helper.hlslOP ;
5981
5993
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);
5989
5997
}
5990
5998
5991
5999
/*
@@ -6375,37 +6383,89 @@ Value *TranslateHitObjectScalarGetter(CallInst *CI, IntrinsicOp IOP,
6375
6383
HLOperationLowerHelper &Helper,
6376
6384
HLObjectOperationLowerHelper *pObjHelper,
6377
6385
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);
6379
6392
}
6380
6393
6381
6394
Value *TranslateHitObjectVectorGetter (CallInst *CI, IntrinsicOp IOP,
6382
6395
OP::OpCode OpCode,
6383
6396
HLOperationLowerHelper &Helper,
6384
6397
HLObjectOperationLowerHelper *pObjHelper,
6385
6398
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
+ }
6387
6417
}
6388
6418
6389
6419
Value *TranslateHitObjectMatrixGetter (CallInst *CI, IntrinsicOp IOP,
6390
6420
OP::OpCode OpCode,
6391
6421
HLOperationLowerHelper &Helper,
6392
6422
HLObjectOperationLowerHelper *pObjHelper,
6393
6423
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);
6395
6437
}
6396
6438
6397
6439
Value *TranslateHitObjectLoadLocalRootTableConstant (
6398
6440
CallInst *CI, IntrinsicOp IOP, OP::OpCode OpCode,
6399
6441
HLOperationLowerHelper &Helper, HLObjectOperationLowerHelper *pObjHelper,
6400
6442
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);
6402
6452
}
6403
6453
6404
6454
Value *TranslateHitObjectSetShaderTableIndex (
6405
6455
CallInst *CI, IntrinsicOp IOP, OP::OpCode OpCode,
6406
6456
HLOperationLowerHelper &Helper, HLObjectOperationLowerHelper *pObjHelper,
6407
6457
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 ;
6409
6469
}
6410
6470
6411
6471
} // namespace
0 commit comments