Skip to content

Commit 816dcd9

Browse files
committed
[SER] HitObject_TraceRay|Invoke HLSL -> DXIL lowering
1 parent 10bff13 commit 816dcd9

6 files changed

Lines changed: 363 additions & 41 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
@@ -433,6 +433,10 @@ const unsigned kNodeHandleToResCastOpIdx = 1;
433433
const unsigned kAnnotateNodeHandleNodePropIdx = 2;
434434
const unsigned kAnnotateNodeRecordHandleNodeRecordPropIdx = 2;
435435

436+
// HitObject::TraceRay
437+
const unsigned kHitObjectTraceRay_RayDescOpIdx = 8;
438+
const unsigned kHitObjectTraceRay_NumOp = 10;
439+
436440
} // namespace HLOperandIndex
437441

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

lib/HLSL/HLOperationLower.cpp

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

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

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

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

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

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

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

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

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

57735778
return Builder.CreateCall(F, Args);
57745779
}
@@ -6211,15 +6216,54 @@ Value *TranslateHitObjectTraceRay(CallInst *CI, IntrinsicOp IOP,
62116216
HLOperationLowerHelper &Helper,
62126217
HLObjectOperationLowerHelper *pObjHelper,
62136218
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;
62156250
}
62166251

62176252
Value *TranslateHitObjectInvoke(CallInst *CI, IntrinsicOp IOP,
62186253
OP::OpCode OpCode,
62196254
HLOperationLowerHelper &Helper,
62206255
HLObjectOperationLowerHelper *pObjHelper,
62216256
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;
62236267
}
62246268

62256269
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);
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
// REQUIRES: dxil-1-9
2+
// RUN: %dxc -T lib_6_9 -E main %s -ast-dump-implicit | FileCheck %s --check-prefix AST
3+
// RUN: %dxc -T lib_6_9 -E main %s -fcgl | FileCheck %s --check-prefix FCGL
4+
// RUN: %dxc -T lib_6_9 -E main %s | FileCheck %s --check-prefix DXIL
5+
6+
// AST: | | |-FunctionTemplateDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> Invoke
7+
// AST-NEXT: | | | |-TemplateTypeParmDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> class TResult
8+
// AST-NEXT: | | | |-TemplateTypeParmDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> class Tho
9+
// AST-NEXT: | | | |-TemplateTypeParmDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> class TPayload
10+
// AST-NEXT: | | | |-CXXMethodDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> implicit Invoke 'TResult (Tho, TPayload &) const' static
11+
// AST-NEXT: | | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> ho 'Tho'
12+
// AST-NEXT: | | | | `-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> Payload 'TPayload &'
13+
// AST-NEXT: | | | `-CXXMethodDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> used Invoke 'void (dx::HitObject, Payload &)' static
14+
// AST-NEXT: | | | |-TemplateArgument type 'void'
15+
// AST-NEXT: | | | |-TemplateArgument type 'dx::HitObject':'dx::HitObject'
16+
// AST-NEXT: | | | |-TemplateArgument type 'Payload'
17+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> Invoke 'dx::HitObject':'dx::HitObject'
18+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> ho 'Payload &&__restrict'
19+
// AST-NEXT: | | | |-HLSLIntrinsicAttr {{[^ ]+}} <<invalid sloc>> Implicit "op" "" 382
20+
// AST-NEXT: | | | `-AvailabilityAttr {{[^ ]+}} <<invalid sloc>> Implicit 6.9 0 0 ""
21+
22+
// AST: | | |-FunctionTemplateDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> TraceRay
23+
// AST-NEXT: | | | |-TemplateTypeParmDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> class TResult
24+
// AST-NEXT: | | | |-TemplateTypeParmDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> class TAccelerationStructure
25+
// AST-NEXT: | | | |-TemplateTypeParmDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> class TRayFlags
26+
// AST-NEXT: | | | |-TemplateTypeParmDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> class TInstanceInclusionMask
27+
// AST-NEXT: | | | |-TemplateTypeParmDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> class TRayContributionToHitGroupIndex
28+
// AST-NEXT: | | | |-TemplateTypeParmDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> class TMultiplierForGeometryContributionToHitGroupIndex
29+
// AST-NEXT: | | | |-TemplateTypeParmDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> class TMissShaderIndex
30+
// AST-NEXT: | | | |-TemplateTypeParmDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> class TRay
31+
// AST-NEXT: | | | |-TemplateTypeParmDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> class TPayload
32+
// AST-NEXT: | | | |-CXXMethodDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> implicit TraceRay 'TResult (TAccelerationStructure, TRayFlags, TInstanceInclusionMask, TRayContributionToHitGroupIndex, TMultiplierForGeometryContributionToHitGroupIndex, TMissShaderIndex, TRay, TPayload &) const' static
33+
// AST-NEXT: | | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> AccelerationStructure 'TAccelerationStructure'
34+
// AST-NEXT: | | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> RayFlags 'TRayFlags'
35+
// AST-NEXT: | | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> InstanceInclusionMask 'TInstanceInclusionMask'
36+
// AST-NEXT: | | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> RayContributionToHitGroupIndex 'TRayContributionToHitGroupIndex'
37+
// AST-NEXT: | | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> MultiplierForGeometryContributionToHitGroupIndex 'TMultiplierForGeometryContributionToHitGroupIndex'
38+
// AST-NEXT: | | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> MissShaderIndex 'TMissShaderIndex'
39+
// AST-NEXT: | | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> Ray 'TRay'
40+
// AST-NEXT: | | | | `-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> Payload 'TPayload &'
41+
// 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
42+
// AST-NEXT: | | | |-TemplateArgument type 'dx::HitObject'
43+
// AST-NEXT: | | | |-TemplateArgument type 'RaytracingAccelerationStructure'
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 'unsigned int'
49+
// AST-NEXT: | | | |-TemplateArgument type 'RayDesc'
50+
// AST-NEXT: | | | |-TemplateArgument type 'Payload'
51+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> TraceRay 'RaytracingAccelerationStructure'
52+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> AccelerationStructure 'unsigned int'
53+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> RayFlags 'unsigned int'
54+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> InstanceInclusionMask 'unsigned int'
55+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> RayContributionToHitGroupIndex 'unsigned int'
56+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> MultiplierForGeometryContributionToHitGroupIndex 'unsigned int'
57+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> MissShaderIndex 'RayDesc'
58+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> Ray 'Payload &&__restrict'
59+
// AST-NEXT: | | | |-HLSLIntrinsicAttr {{[^ ]+}} <<invalid sloc>> Implicit "op" "" 389
60+
// AST-NEXT: | | | `-AvailabilityAttr {{[^ ]+}} <<invalid sloc>> Implicit 6.9 0 0 ""
61+
62+
// 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)
63+
// 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* %{{[^ ]+}})
64+
// FCGL-NEXT: call void @"dx.hl.op..void (i32, %dx.types.HitObject*, %struct.Payload*)"(i32 382, %dx.types.HitObject* %{{[^ ]+}}, %struct.Payload* %{{[^ ]+}})
65+
66+
// 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
67+
// 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)
68+
// DXIL: call void @dx.op.hitObject_Invoke.struct.Payload(i32 267, %dx.types.HitObject %[[HIT]], %struct.Payload* nonnull %{{[^ ]+}}) ; HitObject_Invoke(hitObject,payload)
69+
70+
RaytracingAccelerationStructure RTAS;
71+
RWStructuredBuffer<float> UAV : register(u0);
72+
73+
struct [raypayload]
74+
Payload {
75+
float3 dummy : read(closesthit) : write(caller, anyhit);
76+
};
77+
78+
[shader("raygeneration")]
79+
void main() {
80+
RayDesc rayDesc;
81+
rayDesc.Origin = float3(0.0, 1.0, 2.0);
82+
rayDesc.TMin = 3.0f;
83+
rayDesc.Direction = float3(4.0, 5.0, 6.0);
84+
rayDesc.TMax = 7.0f;
85+
86+
Payload pld;
87+
pld.dummy = float3(7.0, 8.0, 9.0);
88+
89+
dx::HitObject hit = dx::HitObject::TraceRay(
90+
RTAS,
91+
RAY_FLAG_FORCE_OPAQUE | RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES,
92+
1,
93+
2,
94+
4,
95+
0,
96+
rayDesc,
97+
pld);
98+
99+
dx::HitObject::Invoke(hit, pld);
100+
}

0 commit comments

Comments
 (0)