Skip to content

Commit f19b5da

Browse files
authored
[SER] TraceRay|Invoke HLSL -> DXIL lowering (#7355)
Lowering for - HitObject::TraceRay - HitObject::Invoke Specification: https://github.com/microsoft/hlsl-specs/blob/main/proposals/0027-shader-execution-reordering.md DXC SER implementation tracker:: #7214
1 parent 8988e47 commit f19b5da

File tree

7 files changed

+367
-41
lines changed

7 files changed

+367
-41
lines changed

include/dxc/DXIL/DxilConstants.h

+5
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

+4
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

+85-41
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+
}
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;
57685761

5769-
Args[DXIL::OperandIndex::kTraceRayPayloadOpIdx] = payLoad;
5762+
Value *RayDesc = CI->getArgOperand(HLOperandIndex::kTraceRayRayDescOpIdx);
5763+
Value *PayLoad = CI->getArgOperand(HLOperandIndex::kTraceRayPayLoadOpIdx);
57705764

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

+2
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);

tools/clang/lib/Sema/SemaHLSL.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -12066,8 +12066,10 @@ void Sema::DiagnoseReachableHLSLCall(CallExpr *CE, const hlsl::ShaderModel *SM,
1206612066
case hlsl::IntrinsicOp::MOP_TraceRayInline:
1206712067
DiagnoseTraceRayInline(*this, CE);
1206812068
break;
12069+
case hlsl::IntrinsicOp::MOP_DxHitObject_Invoke:
1206912070
case hlsl::IntrinsicOp::MOP_DxHitObject_MakeMiss:
1207012071
case hlsl::IntrinsicOp::MOP_DxHitObject_MakeNop:
12072+
case hlsl::IntrinsicOp::MOP_DxHitObject_TraceRay:
1207112073
DiagnoseReachableSERCall(*this, CE, EntrySK, EntryDecl, false);
1207212074
break;
1207312075
case hlsl::IntrinsicOp::IOP_DxMaybeReorderThread:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
// RUN: %dxc -T lib_6_9 -E main %s -ast-dump-implicit | FileCheck %s --check-prefix AST
2+
// RUN: %dxc -T lib_6_9 -E main %s -fcgl | FileCheck %s --check-prefix FCGL
3+
// RUN: %dxc -T lib_6_9 -E main %s | FileCheck %s --check-prefix DXIL
4+
5+
// AST: | | |-FunctionTemplateDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> Invoke
6+
// AST-NEXT: | | | |-TemplateTypeParmDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> class TResult
7+
// AST-NEXT: | | | |-TemplateTypeParmDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> class Tho
8+
// AST-NEXT: | | | |-TemplateTypeParmDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> class TPayload
9+
// AST-NEXT: | | | |-CXXMethodDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> implicit Invoke 'TResult (Tho, TPayload &) const' static
10+
// AST-NEXT: | | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> ho 'Tho'
11+
// AST-NEXT: | | | | `-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> Payload 'TPayload &'
12+
// AST-NEXT: | | | `-CXXMethodDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> used Invoke 'void (dx::HitObject, Payload &)' static
13+
// AST-NEXT: | | | |-TemplateArgument type 'void'
14+
// AST-NEXT: | | | |-TemplateArgument type 'dx::HitObject':'dx::HitObject'
15+
// AST-NEXT: | | | |-TemplateArgument type 'Payload'
16+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> Invoke 'dx::HitObject':'dx::HitObject'
17+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> ho 'Payload &&__restrict'
18+
// AST-NEXT: | | | |-HLSLIntrinsicAttr {{[^ ]+}} <<invalid sloc>> Implicit "op" "" 382
19+
// AST-NEXT: | | | `-AvailabilityAttr {{[^ ]+}} <<invalid sloc>> Implicit 6.9 0 0 ""
20+
21+
// AST: | | |-FunctionTemplateDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> TraceRay
22+
// AST-NEXT: | | | |-TemplateTypeParmDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> class TResult
23+
// AST-NEXT: | | | |-TemplateTypeParmDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> class TAccelerationStructure
24+
// AST-NEXT: | | | |-TemplateTypeParmDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> class TRayFlags
25+
// AST-NEXT: | | | |-TemplateTypeParmDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> class TInstanceInclusionMask
26+
// AST-NEXT: | | | |-TemplateTypeParmDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> class TRayContributionToHitGroupIndex
27+
// AST-NEXT: | | | |-TemplateTypeParmDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> class TMultiplierForGeometryContributionToHitGroupIndex
28+
// AST-NEXT: | | | |-TemplateTypeParmDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> class TMissShaderIndex
29+
// AST-NEXT: | | | |-TemplateTypeParmDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> class TRay
30+
// AST-NEXT: | | | |-TemplateTypeParmDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> class TPayload
31+
// AST-NEXT: | | | |-CXXMethodDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> implicit TraceRay 'TResult (TAccelerationStructure, TRayFlags, TInstanceInclusionMask, TRayContributionToHitGroupIndex, TMultiplierForGeometryContributionToHitGroupIndex, TMissShaderIndex, TRay, TPayload &) const' static
32+
// AST-NEXT: | | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> AccelerationStructure 'TAccelerationStructure'
33+
// AST-NEXT: | | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> RayFlags 'TRayFlags'
34+
// AST-NEXT: | | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> InstanceInclusionMask 'TInstanceInclusionMask'
35+
// AST-NEXT: | | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> RayContributionToHitGroupIndex 'TRayContributionToHitGroupIndex'
36+
// AST-NEXT: | | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> MultiplierForGeometryContributionToHitGroupIndex 'TMultiplierForGeometryContributionToHitGroupIndex'
37+
// AST-NEXT: | | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> MissShaderIndex 'TMissShaderIndex'
38+
// AST-NEXT: | | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> Ray 'TRay'
39+
// AST-NEXT: | | | | `-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> Payload 'TPayload &'
40+
// AST-NEXT: | | | `-CXXMethodDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> used TraceRay 'dx::HitObject (RaytracingAccelerationStructure, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, RayDesc, Payload &)' static
41+
// AST-NEXT: | | | |-TemplateArgument type 'dx::HitObject'
42+
// AST-NEXT: | | | |-TemplateArgument type 'RaytracingAccelerationStructure'
43+
// AST-NEXT: | | | |-TemplateArgument type 'unsigned int'
44+
// AST-NEXT: | | | |-TemplateArgument type 'unsigned int'
45+
// AST-NEXT: | | | |-TemplateArgument type 'unsigned int'
46+
// AST-NEXT: | | | |-TemplateArgument type 'unsigned int'
47+
// AST-NEXT: | | | |-TemplateArgument type 'unsigned int'
48+
// AST-NEXT: | | | |-TemplateArgument type 'RayDesc'
49+
// AST-NEXT: | | | |-TemplateArgument type 'Payload'
50+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> TraceRay 'RaytracingAccelerationStructure'
51+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> AccelerationStructure 'unsigned int'
52+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> RayFlags 'unsigned int'
53+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> InstanceInclusionMask 'unsigned int'
54+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> RayContributionToHitGroupIndex 'unsigned int'
55+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> MultiplierForGeometryContributionToHitGroupIndex 'unsigned int'
56+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> MissShaderIndex 'RayDesc'
57+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> Ray 'Payload &&__restrict'
58+
// AST-NEXT: | | | |-HLSLIntrinsicAttr {{[^ ]+}} <<invalid sloc>> Implicit "op" "" 389
59+
// AST-NEXT: | | | `-AvailabilityAttr {{[^ ]+}} <<invalid sloc>> Implicit 6.9 0 0 ""
60+
61+
// FCGL: %[[HANDLE:[^ ]+]] = call %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %struct.RaytracingAccelerationStructure)"(i32 14, %dx.types.Handle %{{[^ ]+}}, %dx.types.ResourceProperties { i32 16, i32 0 }, %struct.RaytracingAccelerationStructure undef)
62+
// FCGL-NEXT: call void @"dx.hl.op..void (i32, %dx.types.HitObject*, %dx.types.Handle, i32, i32, i32, i32, i32, %struct.RayDesc*, %struct.Payload*)"(i32 389, %dx.types.HitObject* %{{[^ ]+}}, %dx.types.Handle %[[HANDLE]], i32 513, i32 1, i32 2, i32 4, i32 0, %struct.RayDesc* %{{[^ ]+}}, %struct.Payload* %{{[^ ]+}})
63+
// FCGL-NEXT: call void @"dx.hl.op..void (i32, %dx.types.HitObject*, %struct.Payload*)"(i32 382, %dx.types.HitObject* %{{[^ ]+}}, %struct.Payload* %{{[^ ]+}})
64+
65+
// DXIL: %[[RTAS:[^ ]+]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle %{{[^ ]+}}, %dx.types.ResourceProperties { i32 16, i32 0 }) ; AnnotateHandle(res,props) resource: RTAccelerationStructure
66+
// DXIL: %[[HIT:[^ ]+]] = call %dx.types.HitObject @dx.op.hitObject_TraceRay.struct.Payload(i32 262, %dx.types.Handle %[[RTAS]], i32 513, i32 1, i32 2, i32 4, i32 0, float 0.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00, float 5.000000e+00, float 6.000000e+00, float 7.000000e+00, %struct.Payload* nonnull %{{[^ ]+}}) ; HitObject_TraceRay(accelerationStructure,rayFlags,instanceInclusionMask,rayContributionToHitGroupIndex,multiplierForGeometryContributionToHitGroupIndex,missShaderIndex,Origin_X,Origin_Y,Origin_Z,TMin,Direction_X,Direction_Y,Direction_Z,TMax,payload)
67+
// DXIL: call void @dx.op.hitObject_Invoke.struct.Payload(i32 267, %dx.types.HitObject %[[HIT]], %struct.Payload* nonnull %{{[^ ]+}}) ; HitObject_Invoke(hitObject,payload)
68+
69+
// DXIL: !dx.dxrPayloadAnnotations = !{![[MDPLD:[^ ]+]]}
70+
// DXIL: ![[MDPLD]] = !{i32 0, %struct.Payload undef, !{{[^ ]+}}}
71+
72+
RaytracingAccelerationStructure RTAS;
73+
RWStructuredBuffer<float> UAV : register(u0);
74+
75+
struct [raypayload]
76+
Payload {
77+
float3 dummy : read(closesthit) : write(caller, anyhit);
78+
};
79+
80+
[shader("raygeneration")]
81+
void main() {
82+
RayDesc rayDesc;
83+
rayDesc.Origin = float3(0.0, 1.0, 2.0);
84+
rayDesc.TMin = 3.0f;
85+
rayDesc.Direction = float3(4.0, 5.0, 6.0);
86+
rayDesc.TMax = 7.0f;
87+
88+
Payload pld;
89+
pld.dummy = float3(7.0, 8.0, 9.0);
90+
91+
dx::HitObject hit = dx::HitObject::TraceRay(
92+
RTAS,
93+
RAY_FLAG_FORCE_OPAQUE | RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES,
94+
1,
95+
2,
96+
4,
97+
0,
98+
rayDesc,
99+
pld);
100+
101+
dx::HitObject::Invoke(hit, pld);
102+
}

0 commit comments

Comments
 (0)