Skip to content

[SER] HitObject accessors HLSL -> DXIL lowering #7360

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 27 commits into from
Apr 23, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
f79d0ca
[SER] DxHitObject::MakeNop|Miss lowering and tests
simoll Mar 26, 2025
e7e8781
[ser][nfc] Use 'unsigned' for argument idx to resolve compile warnings
simoll Mar 26, 2025
46e3623
[ser][nfc] Upper-case variable names in TranslateHitObjectMake
simoll Apr 7, 2025
afebf8d
Merge remote-tracking branch 'msft/main' into ser_hlslmake_patch
simoll Apr 7, 2025
834f9d6
Update tools/clang/test/DXC/Passes/DxilGen/maybereorder_dxilgen.ll
simoll Apr 14, 2025
920745c
nfc. Remove REQUIRES lines from test that doesn't need it
simoll Apr 14, 2025
a79d324
Fuse fcgl and ast tests into one CodeGenDXIL test
simoll Apr 14, 2025
1acd442
Merge remote-tracking branch 'msft/main' into staging/ser_hlslmake_patch
simoll Apr 14, 2025
e879edb
nfc: removed unneede REQUIRES line
simoll Apr 14, 2025
0cea5c8
nfc: dont match specific outvarname
simoll Apr 14, 2025
6834013
Merge remote-tracking branch 'msft/main' into ser_hlslmake_patch
simoll Apr 15, 2025
9be6abf
Add MaybeReorderThread HLSL -> DXIL lowering and add tests
simoll Apr 15, 2025
47056ff
nfc: match var
simoll Apr 15, 2025
350735b
Merge remote-tracking branch 'ms/main' into ser_hlslmake_patch
tex3d Apr 16, 2025
c541236
Fix tests with updated hl opcodes
tex3d Apr 16, 2025
1087cd2
Check value flow in scalarrepl test
simoll Apr 16, 2025
9a977c3
explicitly check for scalarization of RayDesc
simoll Apr 16, 2025
57b5fdd
Add back REQUIRES: dxil-1-9 now that we are testing the dxil
simoll Apr 16, 2025
601a8af
Revert "Add back REQUIRES: dxil-1-9 now that we are testing the dxil"
simoll Apr 16, 2025
93f9f2a
Assert that return value of HitObject default ctor is unused ('this' …
simoll Apr 16, 2025
c32d06f
Add lit.local.cfg to CodeGenDXIL HitObject/ dir
simoll Apr 17, 2025
afb6794
nfc: assert RayDescOpIdx == SrcIdx
simoll Apr 17, 2025
c5e0ec0
Merge remote-tracking branch 'msft/main' into ser_hlslmake_patch
simoll Apr 17, 2025
5086a92
[SER] HitObject accessors HLSL -> DXIL lowering
simoll Apr 16, 2025
37e9243
nfc: clang format
simoll Apr 17, 2025
e3a7834
Merge remote-tracking branch 'ms/main' into ser_hlslaccessors_patch
tex3d Apr 21, 2025
865bcd3
hitobject_accessors dxilgen test
simoll Apr 22, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 79 additions & 19 deletions lib/HLSL/HLOperationLower.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5953,19 +5953,31 @@ Value *TranslateNoArgVectorOperation(CallInst *CI, IntrinsicOp IOP,
return retVal;
}

template <typename ColElemTy>
static void GetMatrixIndices(Constant *&Rows, Constant *&Cols, bool Is3x4,
LLVMContext &Ctx) {
if (Is3x4) {
uint32_t RVals[] = {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2};
Rows = ConstantDataVector::get(Ctx, RVals);
ColElemTy CVals[] = {0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3};
Cols = ConstantDataVector::get(Ctx, CVals);
return;
}
uint32_t RVals[] = {0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2};
Rows = ConstantDataVector::get(Ctx, RVals);
ColElemTy CVals[] = {0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3};
Cols = ConstantDataVector::get(Ctx, CVals);
}

Value *TranslateNoArgMatrix3x4Operation(
CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode,
HLOperationLowerHelper &helper, HLObjectOperationLowerHelper *pObjHelper,
bool &Translated) {
hlsl::OP *hlslOP = &helper.hlslOP;
VectorType *Ty = cast<VectorType>(CI->getType());
uint32_t rVals[] = {0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2};
Constant *rows = ConstantDataVector::get(CI->getContext(), rVals);
uint8_t cVals[] = {0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3};
Constant *cols = ConstantDataVector::get(CI->getContext(), cVals);
Value *retVal =
TrivialDxilOperation(opcode, {nullptr, rows, cols}, Ty, CI, hlslOP);
return retVal;
Constant *Rows, *Cols;
GetMatrixIndices<uint8_t>(Rows, Cols, true, CI->getContext());
return TrivialDxilOperation(opcode, {nullptr, Rows, Cols}, Ty, CI, hlslOP);
}

Value *TranslateNoArgTransposedMatrix3x4Operation(
Expand All @@ -5974,13 +5986,9 @@ Value *TranslateNoArgTransposedMatrix3x4Operation(
bool &Translated) {
hlsl::OP *hlslOP = &helper.hlslOP;
VectorType *Ty = cast<VectorType>(CI->getType());
uint32_t rVals[] = {0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2};
Constant *rows = ConstantDataVector::get(CI->getContext(), rVals);
uint8_t cVals[] = {0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3};
Constant *cols = ConstantDataVector::get(CI->getContext(), cVals);
Value *retVal =
TrivialDxilOperation(opcode, {nullptr, rows, cols}, Ty, CI, hlslOP);
return retVal;
Constant *Rows, *Cols;
GetMatrixIndices<uint8_t>(Rows, Cols, false, CI->getContext());
return TrivialDxilOperation(opcode, {nullptr, Rows, Cols}, Ty, CI, hlslOP);
}

/*
Expand Down Expand Up @@ -6331,37 +6339,89 @@ Value *TranslateHitObjectScalarGetter(CallInst *CI, IntrinsicOp IOP,
HLOperationLowerHelper &Helper,
HLObjectOperationLowerHelper *pObjHelper,
bool &Translated) {
return UndefValue::get(CI->getType()); // TODO: Merge SER DXIL patches
hlsl::OP *OP = &Helper.hlslOP;
Value *HitObjectPtr = CI->getArgOperand(1);
IRBuilder<> Builder(CI);
Value *HitObject = Builder.CreateLoad(HitObjectPtr);
return TrivialDxilOperation(OpCode, {nullptr, HitObject}, CI->getType(), CI,
OP);
}

Value *TranslateHitObjectVectorGetter(CallInst *CI, IntrinsicOp IOP,
OP::OpCode OpCode,
HLOperationLowerHelper &Helper,
HLObjectOperationLowerHelper *pObjHelper,
bool &Translated) {
return UndefValue::get(CI->getType()); // TODO: Merge SER DXIL patches
hlsl::OP *OP = &Helper.hlslOP;
Value *HitObjectPtr = CI->getArgOperand(1);
IRBuilder<> Builder(CI);
Value *HitObject = Builder.CreateLoad(HitObjectPtr);
VectorType *Ty = cast<VectorType>(CI->getType());
uint32_t Vals[] = {0, 1, 2, 3};
Constant *Src = ConstantDataVector::get(CI->getContext(), Vals);
return TrivialDxilOperation(OpCode, {nullptr, HitObject, Src}, Ty, CI, OP);
}

static bool IsHitObject3x4Getter(IntrinsicOp IOP) {
switch (IOP) {
default:
return false;
case IntrinsicOp::MOP_DxHitObject_GetObjectToWorld3x4:
case IntrinsicOp::MOP_DxHitObject_GetWorldToObject3x4:
return true;
}
}

Value *TranslateHitObjectMatrixGetter(CallInst *CI, IntrinsicOp IOP,
OP::OpCode OpCode,
HLOperationLowerHelper &Helper,
HLObjectOperationLowerHelper *pObjHelper,
bool &Translated) {
return UndefValue::get(CI->getType()); // TODO: Merge SER DXIL patches
hlsl::OP *OP = &Helper.hlslOP;
Value *HitObjectPtr = CI->getArgOperand(1);
IRBuilder<> Builder(CI);
Value *HitObject = Builder.CreateLoad(HitObjectPtr);

// Create 3x4 matrix indices
bool Is3x4 = IsHitObject3x4Getter(IOP);
Constant *Rows, *Cols;
GetMatrixIndices<uint32_t>(Rows, Cols, Is3x4, CI->getContext());

VectorType *Ty = cast<VectorType>(CI->getType());
return TrivialDxilOperation(OpCode, {nullptr, HitObject, Rows, Cols}, Ty, CI,
OP);
}

Value *TranslateHitObjectLoadLocalRootTableConstant(
CallInst *CI, IntrinsicOp IOP, OP::OpCode OpCode,
HLOperationLowerHelper &Helper, HLObjectOperationLowerHelper *pObjHelper,
bool &Translated) {
return UndefValue::get(CI->getType()); // TODO: Merge SER DXIL patches
hlsl::OP *OP = &Helper.hlslOP;
IRBuilder<> Builder(CI);

Value *HitObjectPtr = CI->getArgOperand(1);
Value *Offset = CI->getArgOperand(2);

Value *HitObject = Builder.CreateLoad(HitObjectPtr);
return TrivialDxilOperation(OpCode, {nullptr, HitObject, Offset},
Helper.voidTy, CI, OP);
}

Value *TranslateHitObjectSetShaderTableIndex(
CallInst *CI, IntrinsicOp IOP, OP::OpCode OpCode,
HLOperationLowerHelper &Helper, HLObjectOperationLowerHelper *pObjHelper,
bool &Translated) {
return UndefValue::get(CI->getType()); // TODO: Merge SER DXIL patches
hlsl::OP *OP = &Helper.hlslOP;
IRBuilder<> Builder(CI);

Value *HitObjectPtr = CI->getArgOperand(1);
Value *ShaderTableIndex = CI->getArgOperand(2);

Value *InHitObject = Builder.CreateLoad(HitObjectPtr);
Value *OutHitObject = TrivialDxilOperation(
OpCode, {nullptr, InHitObject, ShaderTableIndex}, Helper.voidTy, CI, OP);
Builder.CreateStore(OutHitObject, HitObjectPtr);
return nullptr;
}

} // namespace
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
// REQUIRES: dxil-1-9
// RUN: %dxc -T lib_6_9 -E main %s | FileCheck %s --check-prefix DXIL

// DXIL: %dx.types.HitObject = type { i8* }

// DXIL: %[[NOP:[^ ]+]] = call %dx.types.HitObject @dx.op.hitObject_MakeNop(i32 266) ; HitObject_MakeNop()
// DXIL: %[[HIT:[^ ]+]] = call %dx.types.HitObject @dx.op.hitObject_SetShaderTableIndex(i32 287, %dx.types.HitObject %[[NOP]], i32 1) ; HitObject_SetShaderTableIndex(hitObject,shaderTableIndex)
// DXIL-DAG: %{{[^ ]+}} = call i1 @dx.op.hitObject_StateScalar.i1(i32 270, %dx.types.HitObject %[[HIT]]) ; HitObject_IsHit(hitObject)
// DXIL-DAG: %{{[^ ]+}} = call i1 @dx.op.hitObject_StateScalar.i1(i32 269, %dx.types.HitObject %[[HIT]]) ; HitObject_IsMiss(hitObject)
// DXIL-DAG: %{{[^ ]+}} = call i1 @dx.op.hitObject_StateScalar.i1(i32 271, %dx.types.HitObject %[[HIT]]) ; HitObject_IsNop(hitObject)
// DXIL-DAG: %{{[^ ]+}} = call i32 @dx.op.hitObject_StateScalar.i32(i32 281, %dx.types.HitObject %[[HIT]]) ; HitObject_GeometryIndex(hitObject)
// DXIL-DAG: %{{[^ ]+}} = call i32 @dx.op.hitObject_StateScalar.i32(i32 285, %dx.types.HitObject %[[HIT]]) ; HitObject_HitKind(hitObject)
// DXIL-DAG: %{{[^ ]+}} = call i32 @dx.op.hitObject_StateScalar.i32(i32 282, %dx.types.HitObject %[[HIT]]) ; HitObject_InstanceIndex(hitObject)
// DXIL-DAG: %{{[^ ]+}} = call i32 @dx.op.hitObject_StateScalar.i32(i32 283, %dx.types.HitObject %[[HIT]]) ; HitObject_InstanceID(hitObject)
// DXIL-DAG: %{{[^ ]+}} = call i32 @dx.op.hitObject_StateScalar.i32(i32 284, %dx.types.HitObject %[[HIT]]) ; HitObject_PrimitiveIndex(hitObject)
// DXIL-DAG: %{{[^ ]+}} = call i32 @dx.op.hitObject_StateScalar.i32(i32 286, %dx.types.HitObject %[[HIT]]) ; HitObject_ShaderTableIndex(hitObject)
// DXIL-DAG: %{{[^ ]+}} = call i32 @dx.op.hitObject_LoadLocalRootTableConstant(i32 288, %dx.types.HitObject %[[HIT]], i32 42) ; HitObject_LoadLocalRootTableConstant(hitObject,offset)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateVector.f32(i32 277, %dx.types.HitObject %[[HIT]], i32 0) ; HitObject_ObjectRayOrigin(hitObject,component)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateVector.f32(i32 277, %dx.types.HitObject %[[HIT]], i32 1) ; HitObject_ObjectRayOrigin(hitObject,component)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateVector.f32(i32 277, %dx.types.HitObject %[[HIT]], i32 2) ; HitObject_ObjectRayOrigin(hitObject,component)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateVector.f32(i32 278, %dx.types.HitObject %[[HIT]], i32 0) ; HitObject_ObjectRayDirection(hitObject,component)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateVector.f32(i32 278, %dx.types.HitObject %[[HIT]], i32 1) ; HitObject_ObjectRayDirection(hitObject,component)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateVector.f32(i32 278, %dx.types.HitObject %[[HIT]], i32 2) ; HitObject_ObjectRayDirection(hitObject,component)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateVector.f32(i32 275, %dx.types.HitObject %[[HIT]], i32 0) ; HitObject_WorldRayOrigin(hitObject,component)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateVector.f32(i32 275, %dx.types.HitObject %[[HIT]], i32 1) ; HitObject_WorldRayOrigin(hitObject,component)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateVector.f32(i32 275, %dx.types.HitObject %[[HIT]], i32 2) ; HitObject_WorldRayOrigin(hitObject,component)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateVector.f32(i32 276, %dx.types.HitObject %[[HIT]], i32 0) ; HitObject_WorldRayDirection(hitObject,component)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateVector.f32(i32 276, %dx.types.HitObject %[[HIT]], i32 1) ; HitObject_WorldRayDirection(hitObject,component)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateVector.f32(i32 276, %dx.types.HitObject %[[HIT]], i32 2) ; HitObject_WorldRayDirection(hitObject,component)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateMatrix.f32(i32 279, %dx.types.HitObject %[[HIT]], i32 0, i32 0) ; HitObject_ObjectToWorld3x4(hitObject,row,col)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateMatrix.f32(i32 279, %dx.types.HitObject %[[HIT]], i32 0, i32 1) ; HitObject_ObjectToWorld3x4(hitObject,row,col)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateMatrix.f32(i32 279, %dx.types.HitObject %[[HIT]], i32 0, i32 2) ; HitObject_ObjectToWorld3x4(hitObject,row,col)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateMatrix.f32(i32 279, %dx.types.HitObject %[[HIT]], i32 0, i32 3) ; HitObject_ObjectToWorld3x4(hitObject,row,col)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateMatrix.f32(i32 279, %dx.types.HitObject %[[HIT]], i32 1, i32 0) ; HitObject_ObjectToWorld3x4(hitObject,row,col)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateMatrix.f32(i32 279, %dx.types.HitObject %[[HIT]], i32 1, i32 1) ; HitObject_ObjectToWorld3x4(hitObject,row,col)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateMatrix.f32(i32 279, %dx.types.HitObject %[[HIT]], i32 1, i32 2) ; HitObject_ObjectToWorld3x4(hitObject,row,col)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateMatrix.f32(i32 279, %dx.types.HitObject %[[HIT]], i32 1, i32 3) ; HitObject_ObjectToWorld3x4(hitObject,row,col)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateMatrix.f32(i32 279, %dx.types.HitObject %[[HIT]], i32 2, i32 0) ; HitObject_ObjectToWorld3x4(hitObject,row,col)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateMatrix.f32(i32 279, %dx.types.HitObject %[[HIT]], i32 2, i32 1) ; HitObject_ObjectToWorld3x4(hitObject,row,col)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateMatrix.f32(i32 279, %dx.types.HitObject %[[HIT]], i32 2, i32 2) ; HitObject_ObjectToWorld3x4(hitObject,row,col)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateMatrix.f32(i32 279, %dx.types.HitObject %[[HIT]], i32 2, i32 3) ; HitObject_ObjectToWorld3x4(hitObject,row,col)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateMatrix.f32(i32 280, %dx.types.HitObject %[[HIT]], i32 0, i32 0) ; HitObject_WorldToObject3x4(hitObject,row,col)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateMatrix.f32(i32 280, %dx.types.HitObject %[[HIT]], i32 0, i32 1) ; HitObject_WorldToObject3x4(hitObject,row,col)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateMatrix.f32(i32 280, %dx.types.HitObject %[[HIT]], i32 0, i32 2) ; HitObject_WorldToObject3x4(hitObject,row,col)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateMatrix.f32(i32 280, %dx.types.HitObject %[[HIT]], i32 0, i32 3) ; HitObject_WorldToObject3x4(hitObject,row,col)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateMatrix.f32(i32 280, %dx.types.HitObject %[[HIT]], i32 1, i32 0) ; HitObject_WorldToObject3x4(hitObject,row,col)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateMatrix.f32(i32 280, %dx.types.HitObject %[[HIT]], i32 1, i32 1) ; HitObject_WorldToObject3x4(hitObject,row,col)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateMatrix.f32(i32 280, %dx.types.HitObject %[[HIT]], i32 1, i32 2) ; HitObject_WorldToObject3x4(hitObject,row,col)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateMatrix.f32(i32 280, %dx.types.HitObject %[[HIT]], i32 1, i32 3) ; HitObject_WorldToObject3x4(hitObject,row,col)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateMatrix.f32(i32 280, %dx.types.HitObject %[[HIT]], i32 2, i32 0) ; HitObject_WorldToObject3x4(hitObject,row,col)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateMatrix.f32(i32 280, %dx.types.HitObject %[[HIT]], i32 2, i32 1) ; HitObject_WorldToObject3x4(hitObject,row,col)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateMatrix.f32(i32 280, %dx.types.HitObject %[[HIT]], i32 2, i32 2) ; HitObject_WorldToObject3x4(hitObject,row,col)
// DXIL-DAG: %{{[^ ]+}} = call float @dx.op.hitObject_StateMatrix.f32(i32 280, %dx.types.HitObject %[[HIT]], i32 2, i32 3) ; HitObject_WorldToObject3x4(hitObject,row,col)
// DXIL: ret void

RWByteAddressBuffer outbuf;

template <int M, int N>
float hashM(in matrix<float, M, N> mat) {
float h = 0.f;
for (int i = 0; i < M; ++i)
for (int j = 0; j < N; ++j)
h += mat[i][j];
return h;
}

[shader("raygeneration")]
void main() {
dx::HitObject hit;
int isum = 0;
float fsum = 0.0f;
vector<float, 3> vsum = 0;

///// Setters
hit.SetShaderTableIndex(1);

///// Getters

// i1 accessors
isum += hit.IsHit();
isum += hit.IsMiss();
isum += hit.IsNop();

// i32 accessors
isum += hit.GetGeometryIndex();
isum += hit.GetHitKind();
isum += hit.GetInstanceIndex();
isum += hit.GetInstanceID();
isum += hit.GetPrimitiveIndex();
isum += hit.GetShaderTableIndex();
isum += hit.LoadLocalRootTableConstant(42);

// float3 accessors
vsum += hit.GetWorldRayOrigin();
vsum += hit.GetWorldRayDirection();
vsum += hit.GetObjectRayOrigin();
vsum += hit.GetObjectRayDirection();
fsum += vsum[0] + vsum[1] + vsum[2];

// matrix accessors
fsum += hashM<3, 4>(hit.GetObjectToWorld3x4());
fsum += hashM<4, 3>(hit.GetObjectToWorld4x3());
fsum += hashM<3, 4>(hit.GetWorldToObject3x4());
fsum += hashM<4, 3>(hit.GetWorldToObject4x3());

// f32 accessors
isum += hit.GetRayFlags();
fsum += hit.GetRayTMin();
fsum += hit.GetRayTCurrent();

outbuf.Store(0, fsum);
outbuf.Store(4, isum);
}
Loading