|
19 | 19 | #include <functional>
|
20 | 20 | #include <unordered_set>
|
21 | 21 |
|
| 22 | +#include "dxc/DXIL/DxilConstants.h" |
| 23 | +#include "dxc/DXIL/DxilInstructions.h" |
22 | 24 | #include "dxc/DXIL/DxilModule.h"
|
23 | 25 | #include "dxc/DXIL/DxilOperations.h"
|
24 | 26 | #include "dxc/DXIL/DxilResourceProperties.h"
|
@@ -5718,58 +5720,61 @@ Value *TranslateCallShader(CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode,
|
5718 | 5720 | return Builder.CreateCall(F, {opArg, ShaderIndex, Parameter});
|
5719 | 5721 | }
|
5720 | 5722 |
|
5721 |
| -Value *TranslateTraceRay(CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode, |
5722 |
| - HLOperationLowerHelper &helper, |
5723 |
| - HLObjectOperationLowerHelper *pObjHelper, |
5724 |
| - bool &Translated) { |
5725 |
| - hlsl::OP *hlslOP = &helper.hlslOP; |
5726 |
| - |
5727 |
| - Value *rayDesc = CI->getArgOperand(HLOperandIndex::kTraceRayRayDescOpIdx); |
5728 |
| - Value *payLoad = CI->getArgOperand(HLOperandIndex::kTraceRayPayLoadOpIdx); |
5729 |
| - |
5730 |
| - Value *opArg = hlslOP->GetU32Const(static_cast<unsigned>(opcode)); |
5731 |
| - |
5732 |
| - Value *Args[DXIL::OperandIndex::kTraceRayNumOp]; |
5733 |
| - Args[0] = opArg; |
5734 |
| - for (unsigned i = 1; i < HLOperandIndex::kTraceRayRayDescOpIdx; i++) { |
5735 |
| - Args[i] = CI->getArgOperand(i); |
5736 |
| - } |
5737 |
| - IRBuilder<> Builder(CI); |
| 5723 | +static unsigned LoadRayDescElementsIntoArgs(Value **Args, hlsl::OP *OP, |
| 5724 | + IRBuilder<> &Builder, |
| 5725 | + Value *RayDescPtr, unsigned Index) { |
5738 | 5726 | // struct RayDesc
|
5739 | 5727 | //{
|
5740 | 5728 | // float3 Origin;
|
5741 | 5729 | // float TMin;
|
5742 | 5730 | // float3 Direction;
|
5743 | 5731 | // float TMax;
|
5744 | 5732 | //};
|
5745 |
| - Value *zeroIdx = hlslOP->GetU32Const(0); |
5746 |
| - Value *origin = Builder.CreateGEP(rayDesc, {zeroIdx, zeroIdx}); |
5747 |
| - origin = Builder.CreateLoad(origin); |
5748 |
| - unsigned index = DXIL::OperandIndex::kTraceRayRayDescOpIdx; |
5749 |
| - Args[index++] = Builder.CreateExtractElement(origin, (uint64_t)0); |
5750 |
| - Args[index++] = Builder.CreateExtractElement(origin, 1); |
5751 |
| - Args[index++] = Builder.CreateExtractElement(origin, 2); |
| 5733 | + Value *ZeroIdx = OP->GetU32Const(0); |
| 5734 | + Value *Origin = Builder.CreateGEP(RayDescPtr, {ZeroIdx, ZeroIdx}); |
| 5735 | + Origin = Builder.CreateLoad(Origin); |
| 5736 | + Args[Index++] = Builder.CreateExtractElement(Origin, (uint64_t)0); |
| 5737 | + Args[Index++] = Builder.CreateExtractElement(Origin, 1); |
| 5738 | + Args[Index++] = Builder.CreateExtractElement(Origin, 2); |
5752 | 5739 |
|
5753 |
| - Value *tmin = Builder.CreateGEP(rayDesc, {zeroIdx, hlslOP->GetU32Const(1)}); |
5754 |
| - tmin = Builder.CreateLoad(tmin); |
5755 |
| - Args[index++] = tmin; |
| 5740 | + Value *TMinPtr = Builder.CreateGEP(RayDescPtr, {ZeroIdx, OP->GetU32Const(1)}); |
| 5741 | + Args[Index++] = Builder.CreateLoad(TMinPtr); |
5756 | 5742 |
|
5757 |
| - Value *direction = |
5758 |
| - Builder.CreateGEP(rayDesc, {zeroIdx, hlslOP->GetU32Const(2)}); |
5759 |
| - direction = Builder.CreateLoad(direction); |
| 5743 | + Value *DirectionPtr = |
| 5744 | + Builder.CreateGEP(RayDescPtr, {ZeroIdx, OP->GetU32Const(2)}); |
| 5745 | + Value *Direction = Builder.CreateLoad(DirectionPtr); |
5760 | 5746 |
|
5761 |
| - Args[index++] = Builder.CreateExtractElement(direction, (uint64_t)0); |
5762 |
| - Args[index++] = Builder.CreateExtractElement(direction, 1); |
5763 |
| - Args[index++] = Builder.CreateExtractElement(direction, 2); |
| 5747 | + Args[Index++] = Builder.CreateExtractElement(Direction, (uint64_t)0); |
| 5748 | + Args[Index++] = Builder.CreateExtractElement(Direction, 1); |
| 5749 | + Args[Index++] = Builder.CreateExtractElement(Direction, 2); |
5764 | 5750 |
|
5765 |
| - Value *tmax = Builder.CreateGEP(rayDesc, {zeroIdx, hlslOP->GetU32Const(3)}); |
5766 |
| - tmax = Builder.CreateLoad(tmax); |
5767 |
| - Args[index++] = tmax; |
| 5751 | + Value *TMaxPtr = Builder.CreateGEP(RayDescPtr, {ZeroIdx, OP->GetU32Const(3)}); |
| 5752 | + Args[Index++] = Builder.CreateLoad(TMaxPtr); |
| 5753 | + return Index; |
| 5754 | +} |
| 5755 | + |
| 5756 | +Value *TranslateTraceRay(CallInst *CI, IntrinsicOp IOP, OP::OpCode OpCode, |
| 5757 | + HLOperationLowerHelper &Helper, |
| 5758 | + HLObjectOperationLowerHelper *pObjHelper, |
| 5759 | + bool &Translated) { |
| 5760 | + hlsl::OP *OP = &Helper.hlslOP; |
5768 | 5761 |
|
5769 |
| - Args[DXIL::OperandIndex::kTraceRayPayloadOpIdx] = payLoad; |
| 5762 | + Value *RayDesc = CI->getArgOperand(HLOperandIndex::kTraceRayRayDescOpIdx); |
| 5763 | + Value *PayLoad = CI->getArgOperand(HLOperandIndex::kTraceRayPayLoadOpIdx); |
5770 | 5764 |
|
5771 |
| - Type *Ty = payLoad->getType(); |
5772 |
| - Function *F = hlslOP->GetOpFunc(opcode, Ty); |
| 5765 | + Value *Args[DXIL::OperandIndex::kTraceRayNumOp]; |
| 5766 | + Args[0] = OP->GetU32Const(static_cast<unsigned>(OpCode)); |
| 5767 | + for (unsigned i = 1; i < HLOperandIndex::kTraceRayRayDescOpIdx; i++) |
| 5768 | + Args[i] = CI->getArgOperand(i); |
| 5769 | + |
| 5770 | + IRBuilder<> Builder(CI); |
| 5771 | + LoadRayDescElementsIntoArgs(Args, OP, Builder, RayDesc, |
| 5772 | + DXIL::OperandIndex::kTraceRayRayDescOpIdx); |
| 5773 | + |
| 5774 | + Args[DXIL::OperandIndex::kTraceRayPayloadOpIdx] = PayLoad; |
| 5775 | + |
| 5776 | + Type *Ty = PayLoad->getType(); |
| 5777 | + Function *F = OP->GetOpFunc(OpCode, Ty); |
5773 | 5778 |
|
5774 | 5779 | return Builder.CreateCall(F, Args);
|
5775 | 5780 | }
|
@@ -6307,15 +6312,54 @@ Value *TranslateHitObjectTraceRay(CallInst *CI, IntrinsicOp IOP,
|
6307 | 6312 | HLOperationLowerHelper &Helper,
|
6308 | 6313 | HLObjectOperationLowerHelper *pObjHelper,
|
6309 | 6314 | bool &Translated) {
|
6310 |
| - return UndefValue::get(CI->getType()); // TODO: Merge SER DXIL patches |
| 6315 | + hlsl::OP *OP = &Helper.hlslOP; |
| 6316 | + IRBuilder<> Builder(CI); |
| 6317 | + |
| 6318 | + const unsigned DxilNumArgs = DxilInst_HitObject_TraceRay::arg_payload + 1; |
| 6319 | + DXASSERT_NOMSG(CI->getNumArgOperands() == |
| 6320 | + HLOperandIndex::kHitObjectTraceRay_NumOp); |
| 6321 | + Value *Args[DxilNumArgs]; |
| 6322 | + Value *OpArg = OP->GetU32Const(static_cast<unsigned>(OpCode)); |
| 6323 | + Args[0] = OpArg; |
| 6324 | + |
| 6325 | + unsigned DestIdx = 1, SrcIdx = 1; |
| 6326 | + Value *HitObjectPtr = CI->getArgOperand(SrcIdx++); |
| 6327 | + Args[DestIdx++] = CI->getArgOperand(SrcIdx++); |
| 6328 | + for (; SrcIdx < HLOperandIndex::kHitObjectTraceRay_RayDescOpIdx; |
| 6329 | + ++SrcIdx, ++DestIdx) { |
| 6330 | + Args[DestIdx] = CI->getArgOperand(SrcIdx); |
| 6331 | + } |
| 6332 | + |
| 6333 | + Value *RayDescPtr = CI->getArgOperand(SrcIdx++); |
| 6334 | + DestIdx = LoadRayDescElementsIntoArgs(Args, OP, Builder, RayDescPtr, DestIdx); |
| 6335 | + Value *Payload = CI->getArgOperand(SrcIdx++); |
| 6336 | + Args[DestIdx++] = Payload; |
| 6337 | + |
| 6338 | + DXASSERT_NOMSG(SrcIdx == CI->getNumArgOperands()); |
| 6339 | + DXASSERT_NOMSG(DestIdx == DxilNumArgs); |
| 6340 | + |
| 6341 | + Function *F = OP->GetOpFunc(OpCode, Payload->getType()); |
| 6342 | + |
| 6343 | + Value *OutHitObject = Builder.CreateCall(F, Args); |
| 6344 | + Builder.CreateStore(OutHitObject, HitObjectPtr); |
| 6345 | + return nullptr; |
6311 | 6346 | }
|
6312 | 6347 |
|
6313 | 6348 | Value *TranslateHitObjectInvoke(CallInst *CI, IntrinsicOp IOP,
|
6314 | 6349 | OP::OpCode OpCode,
|
6315 | 6350 | HLOperationLowerHelper &Helper,
|
6316 | 6351 | HLObjectOperationLowerHelper *pObjHelper,
|
6317 | 6352 | bool &Translated) {
|
6318 |
| - return nullptr; // TODO: Merge SER DXIL patches |
| 6353 | + unsigned SrcIdx = 1; |
| 6354 | + Value *HitObjectPtr = CI->getArgOperand(SrcIdx++); |
| 6355 | + Value *Payload = CI->getArgOperand(SrcIdx++); |
| 6356 | + DXASSERT_NOMSG(SrcIdx == CI->getNumArgOperands()); |
| 6357 | + |
| 6358 | + IRBuilder<> Builder(CI); |
| 6359 | + Value *HitObject = Builder.CreateLoad(HitObjectPtr); |
| 6360 | + TrivialDxilOperation(OpCode, {nullptr, HitObject, Payload}, |
| 6361 | + Payload->getType(), CI, &Helper.hlslOP); |
| 6362 | + return nullptr; |
6319 | 6363 | }
|
6320 | 6364 |
|
6321 | 6365 | Value *TranslateHitObjectGetAttributes(CallInst *CI, IntrinsicOp IOP,
|
|
0 commit comments