Skip to content

Commit f65095e

Browse files
committed
Merge remote-tracking branch 'msft/main' into staging/ser_hlslattributes_patch
2 parents 1554e56 + f19b5da commit f65095e

10 files changed

Lines changed: 500 additions & 98 deletions

File tree

include/dxc/DXIL/DxilConstants.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1556,6 +1556,11 @@ const unsigned kMSStoreOutputColOpIdx = 3;
15561556
const unsigned kMSStoreOutputVIdxOpIdx = 4;
15571557
const unsigned kMSStoreOutputValOpIdx = 5;
15581558

1559+
// HitObject::TraceRay
1560+
const unsigned kHitObjectTraceRay_RayDescOpIdx = 7;
1561+
const unsigned kHitObjectTraceRay_PayloadOpIdx = 15;
1562+
const unsigned kHitObjectTraceRay_NumOp = 16;
1563+
15591564
// TODO: add operand index for all the OpCodeClass.
15601565
} // namespace OperandIndex
15611566

include/dxc/HLSL/HLOperations.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,10 @@ const unsigned kAnnotateNodeRecordHandleNodeRecordPropIdx = 2;
437437
const unsigned kHitObjectMakeMiss_NumOp = 8;
438438
const unsigned kHitObjectMakeMissRayDescOpIdx = 4;
439439

440+
// HitObject::TraceRay
441+
const unsigned kHitObjectTraceRay_RayDescOpIdx = 8;
442+
const unsigned kHitObjectTraceRay_NumOp = 10;
443+
440444
} // namespace HLOperandIndex
441445

442446
llvm::Function *GetOrCreateHLFunction(llvm::Module &M,

lib/HLSL/HLOperationLower.cpp

Lines changed: 85 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
#include <functional>
2020
#include <unordered_set>
2121

22+
#include "dxc/DXIL/DxilConstants.h"
23+
#include "dxc/DXIL/DxilInstructions.h"
2224
#include "dxc/DXIL/DxilModule.h"
2325
#include "dxc/DXIL/DxilOperations.h"
2426
#include "dxc/DXIL/DxilResourceProperties.h"
@@ -5718,58 +5720,61 @@ Value *TranslateCallShader(CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode,
57185720
return Builder.CreateCall(F, {opArg, ShaderIndex, Parameter});
57195721
}
57205722

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) {
57385726
// struct RayDesc
57395727
//{
57405728
// float3 Origin;
57415729
// float TMin;
57425730
// float3 Direction;
57435731
// float TMax;
57445732
//};
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);
57525739

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);
57565742

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);
57605746

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);
57645750

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+
}
57685755

5769-
Args[DXIL::OperandIndex::kTraceRayPayloadOpIdx] = payLoad;
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;
57705761

5771-
Type *Ty = payLoad->getType();
5772-
Function *F = hlslOP->GetOpFunc(opcode, Ty);
5762+
Value *RayDesc = CI->getArgOperand(HLOperandIndex::kTraceRayRayDescOpIdx);
5763+
Value *PayLoad = CI->getArgOperand(HLOperandIndex::kTraceRayPayLoadOpIdx);
5764+
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);
57735778

57745779
return Builder.CreateCall(F, Args);
57755780
}
@@ -6307,15 +6312,54 @@ Value *TranslateHitObjectTraceRay(CallInst *CI, IntrinsicOp IOP,
63076312
HLOperationLowerHelper &Helper,
63086313
HLObjectOperationLowerHelper *pObjHelper,
63096314
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;
63116346
}
63126347

63136348
Value *TranslateHitObjectInvoke(CallInst *CI, IntrinsicOp IOP,
63146349
OP::OpCode OpCode,
63156350
HLOperationLowerHelper &Helper,
63166351
HLObjectOperationLowerHelper *pObjHelper,
63176352
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;
63196363
}
63206364

63216365
Value *TranslateHitObjectGetAttributes(CallInst *CI, IntrinsicOp IOP,

lib/Transforms/Scalar/ScalarReplAggregatesHLSL.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1540,6 +1540,8 @@ void isSafeForScalarRepl(Instruction *I, uint64_t Offset, AllocaInfo &Info) {
15401540
// basing on IOP?
15411541
IntrinsicOp opcode = static_cast<IntrinsicOp>(GetHLOpcode(CI));
15421542
if (IntrinsicOp::IOP_TraceRay == opcode ||
1543+
IntrinsicOp::MOP_DxHitObject_TraceRay == opcode ||
1544+
IntrinsicOp::MOP_DxHitObject_Invoke == opcode ||
15431545
IntrinsicOp::IOP_ReportHit == opcode ||
15441546
IntrinsicOp::IOP_CallShader == opcode) {
15451547
return MarkUnsafe(Info, User);

0 commit comments

Comments
 (0)