|
18 | 18 | #include <functional> |
19 | 19 | #include <unordered_set> |
20 | 20 |
|
| 21 | +#include "dxc/DXIL/DxilConstants.h" |
| 22 | +#include "dxc/DXIL/DxilInstructions.h" |
21 | 23 | #include "dxc/DXIL/DxilModule.h" |
22 | 24 | #include "dxc/DXIL/DxilOperations.h" |
23 | 25 | #include "dxc/DXIL/DxilResourceProperties.h" |
@@ -5717,58 +5719,61 @@ Value *TranslateCallShader(CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode, |
5717 | 5719 | return Builder.CreateCall(F, {opArg, ShaderIndex, Parameter}); |
5718 | 5720 | } |
5719 | 5721 |
|
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); |
| 5722 | +static unsigned LoadRayDescElementsIntoArgs(Value **Args, hlsl::OP *OP, |
| 5723 | + IRBuilder<> &Builder, |
| 5724 | + Value *RayDescPtr, unsigned Index) { |
5737 | 5725 | // struct RayDesc |
5738 | 5726 | //{ |
5739 | 5727 | // float3 Origin; |
5740 | 5728 | // float TMin; |
5741 | 5729 | // float3 Direction; |
5742 | 5730 | // float TMax; |
5743 | 5731 | //}; |
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); |
| 5732 | + Value *ZeroIdx = OP->GetU32Const(0); |
| 5733 | + Value *Origin = Builder.CreateGEP(RayDescPtr, {ZeroIdx, ZeroIdx}); |
| 5734 | + Origin = Builder.CreateLoad(Origin); |
| 5735 | + Args[Index++] = Builder.CreateExtractElement(Origin, (uint64_t)0); |
| 5736 | + Args[Index++] = Builder.CreateExtractElement(Origin, 1); |
| 5737 | + Args[Index++] = Builder.CreateExtractElement(Origin, 2); |
5751 | 5738 |
|
5752 | | - Value *tmin = Builder.CreateGEP(rayDesc, {zeroIdx, hlslOP->GetU32Const(1)}); |
5753 | | - tmin = Builder.CreateLoad(tmin); |
5754 | | - Args[index++] = tmin; |
| 5739 | + Value *TMinPtr = Builder.CreateGEP(RayDescPtr, {ZeroIdx, OP->GetU32Const(1)}); |
| 5740 | + Args[Index++] = Builder.CreateLoad(TMinPtr); |
5755 | 5741 |
|
5756 | | - Value *direction = |
5757 | | - Builder.CreateGEP(rayDesc, {zeroIdx, hlslOP->GetU32Const(2)}); |
5758 | | - direction = Builder.CreateLoad(direction); |
| 5742 | + Value *DirectionPtr = |
| 5743 | + Builder.CreateGEP(RayDescPtr, {ZeroIdx, OP->GetU32Const(2)}); |
| 5744 | + Value *Direction = Builder.CreateLoad(DirectionPtr); |
5759 | 5745 |
|
5760 | | - Args[index++] = Builder.CreateExtractElement(direction, (uint64_t)0); |
5761 | | - Args[index++] = Builder.CreateExtractElement(direction, 1); |
5762 | | - Args[index++] = Builder.CreateExtractElement(direction, 2); |
| 5746 | + Args[Index++] = Builder.CreateExtractElement(Direction, (uint64_t)0); |
| 5747 | + Args[Index++] = Builder.CreateExtractElement(Direction, 1); |
| 5748 | + Args[Index++] = Builder.CreateExtractElement(Direction, 2); |
5763 | 5749 |
|
5764 | | - Value *tmax = Builder.CreateGEP(rayDesc, {zeroIdx, hlslOP->GetU32Const(3)}); |
5765 | | - tmax = Builder.CreateLoad(tmax); |
5766 | | - Args[index++] = tmax; |
| 5750 | + Value *TMaxPtr = Builder.CreateGEP(RayDescPtr, {ZeroIdx, OP->GetU32Const(3)}); |
| 5751 | + Args[Index++] = Builder.CreateLoad(TMaxPtr); |
| 5752 | + return Index; |
| 5753 | +} |
5767 | 5754 |
|
5768 | | - Args[DXIL::OperandIndex::kTraceRayPayloadOpIdx] = payLoad; |
| 5755 | +Value *TranslateTraceRay(CallInst *CI, IntrinsicOp IOP, OP::OpCode OpCode, |
| 5756 | + HLOperationLowerHelper &Helper, |
| 5757 | + HLObjectOperationLowerHelper *pObjHelper, |
| 5758 | + bool &Translated) { |
| 5759 | + hlsl::OP *OP = &Helper.hlslOP; |
5769 | 5760 |
|
5770 | | - Type *Ty = payLoad->getType(); |
5771 | | - Function *F = hlslOP->GetOpFunc(opcode, Ty); |
| 5761 | + Value *RayDesc = CI->getArgOperand(HLOperandIndex::kTraceRayRayDescOpIdx); |
| 5762 | + Value *PayLoad = CI->getArgOperand(HLOperandIndex::kTraceRayPayLoadOpIdx); |
| 5763 | + |
| 5764 | + Value *Args[DXIL::OperandIndex::kTraceRayNumOp]; |
| 5765 | + Args[0] = OP->GetU32Const(static_cast<unsigned>(OpCode)); |
| 5766 | + for (unsigned i = 1; i < HLOperandIndex::kTraceRayRayDescOpIdx; i++) |
| 5767 | + Args[i] = CI->getArgOperand(i); |
| 5768 | + |
| 5769 | + IRBuilder<> Builder(CI); |
| 5770 | + LoadRayDescElementsIntoArgs(Args, OP, Builder, RayDesc, |
| 5771 | + DXIL::OperandIndex::kTraceRayRayDescOpIdx); |
| 5772 | + |
| 5773 | + Args[DXIL::OperandIndex::kTraceRayPayloadOpIdx] = PayLoad; |
| 5774 | + |
| 5775 | + Type *Ty = PayLoad->getType(); |
| 5776 | + Function *F = OP->GetOpFunc(OpCode, Ty); |
5772 | 5777 |
|
5773 | 5778 | return Builder.CreateCall(F, Args); |
5774 | 5779 | } |
@@ -6211,15 +6216,54 @@ Value *TranslateHitObjectTraceRay(CallInst *CI, IntrinsicOp IOP, |
6211 | 6216 | HLOperationLowerHelper &Helper, |
6212 | 6217 | HLObjectOperationLowerHelper *pObjHelper, |
6213 | 6218 | bool &Translated) { |
6214 | | - return UndefValue::get(CI->getType()); // TODO: Merge SER DXIL patches |
| 6219 | + hlsl::OP *OP = &Helper.hlslOP; |
| 6220 | + IRBuilder<> Builder(CI); |
| 6221 | + |
| 6222 | + const unsigned DxilNumArgs = DxilInst_HitObject_TraceRay::arg_payload + 1; |
| 6223 | + DXASSERT_NOMSG(CI->getNumArgOperands() == |
| 6224 | + HLOperandIndex::kHitObjectTraceRay_NumOp); |
| 6225 | + Value *Args[DxilNumArgs]; |
| 6226 | + Value *OpArg = OP->GetU32Const(static_cast<unsigned>(OpCode)); |
| 6227 | + Args[0] = OpArg; |
| 6228 | + |
| 6229 | + unsigned DestIdx = 1, SrcIdx = 1; |
| 6230 | + Value *HitObjectPtr = CI->getArgOperand(SrcIdx++); |
| 6231 | + Args[DestIdx++] = CI->getArgOperand(SrcIdx++); |
| 6232 | + for (; SrcIdx < HLOperandIndex::kHitObjectTraceRay_RayDescOpIdx; |
| 6233 | + ++SrcIdx, ++DestIdx) { |
| 6234 | + Args[DestIdx] = CI->getArgOperand(SrcIdx); |
| 6235 | + } |
| 6236 | + |
| 6237 | + Value *RayDescPtr = CI->getArgOperand(SrcIdx++); |
| 6238 | + DestIdx = LoadRayDescElementsIntoArgs(Args, OP, Builder, RayDescPtr, DestIdx); |
| 6239 | + Value *Payload = CI->getArgOperand(SrcIdx++); |
| 6240 | + Args[DestIdx++] = Payload; |
| 6241 | + |
| 6242 | + DXASSERT_NOMSG(SrcIdx == CI->getNumArgOperands()); |
| 6243 | + DXASSERT_NOMSG(DestIdx == DxilNumArgs); |
| 6244 | + |
| 6245 | + Function *F = OP->GetOpFunc(OpCode, Payload->getType()); |
| 6246 | + |
| 6247 | + Value *OutHitObject = Builder.CreateCall(F, Args); |
| 6248 | + Builder.CreateStore(OutHitObject, HitObjectPtr); |
| 6249 | + return nullptr; |
6215 | 6250 | } |
6216 | 6251 |
|
6217 | 6252 | Value *TranslateHitObjectInvoke(CallInst *CI, IntrinsicOp IOP, |
6218 | 6253 | OP::OpCode OpCode, |
6219 | 6254 | HLOperationLowerHelper &Helper, |
6220 | 6255 | HLObjectOperationLowerHelper *pObjHelper, |
6221 | 6256 | bool &Translated) { |
6222 | | - return nullptr; // TODO: Merge SER DXIL patches |
| 6257 | + unsigned SrcIdx = 1; |
| 6258 | + Value *HitObjectPtr = CI->getArgOperand(SrcIdx++); |
| 6259 | + Value *Payload = CI->getArgOperand(SrcIdx++); |
| 6260 | + DXASSERT_NOMSG(SrcIdx == CI->getNumArgOperands()); |
| 6261 | + |
| 6262 | + IRBuilder<> Builder(CI); |
| 6263 | + Value *HitObject = Builder.CreateLoad(HitObjectPtr); |
| 6264 | + TrivialDxilOperation(OpCode, {nullptr, HitObject, Payload}, |
| 6265 | + Payload->getType(), CI, &Helper.hlslOP); |
| 6266 | + return nullptr; |
6223 | 6267 | } |
6224 | 6268 |
|
6225 | 6269 | Value *TranslateHitObjectGetAttributes(CallInst *CI, IntrinsicOp IOP, |
|
0 commit comments