Skip to content

Commit 32de786

Browse files
jaladreipsigcbot
authored andcommitted
Unify RayInfo between sync and async raytracing
Unify RayInfo between sync and async raytracing
1 parent f625438 commit 32de786

File tree

4 files changed

+73
-139
lines changed

4 files changed

+73
-139
lines changed

IGC/AdaptorCommon/RayTracing/TraceRayInlineLoweringPass.cpp

+30-99
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,7 @@ void TraceRayInlineLoweringPass::LowerRayInfo(Function& F)
653653
builder.SetInsertPoint(I);
654654

655655
unsigned int infoKind = I->getInfoKind();
656+
auto shaderTy = I->isCommitted() ? CallableShaderTypeMD::ClosestHit : CallableShaderTypeMD::AnyHit;
656657
auto* const ShadowMemStackPointer = getShMemRayQueryRTStack(builder, I->getQueryObjIndex());
657658

658659
switch (infoKind)
@@ -684,25 +685,14 @@ void TraceRayInlineLoweringPass::LowerRayInfo(Function& F)
684685
}
685686
case RAY_T_CURRENT:
686687
{
687-
Value* rayT = builder.getRayTCurrent(ShadowMemStackPointer, CallableShaderTypeMD::ClosestHit);
688+
Value* rayT = builder.getRayTCurrent(ShadowMemStackPointer, shaderTy);
688689
I->replaceAllUsesWith(rayT);
689690
break;
690691
}
691-
case CANDIDATE_TRIANGLE_T_CURRENT:
692-
{
693-
Value* rayT = builder.getRayTCurrent(ShadowMemStackPointer, CallableShaderTypeMD::AnyHit);
694-
I->replaceAllUsesWith(rayT);
695-
break;
696-
}
697-
case COMMITTED_TRIANGLE_FRONT_FACE:
698-
case CANDIDATE_TRIANGLE_FRONT_FACE:
692+
case TRIANGLE_FRONT_FACE:
699693
case CANDIDATE_PROCEDURAL_PRIM_NON_OPAQUE: // Procedural Primitive Opaque Info is stored in Front Face bit
700694
{
701-
IGC::CallableShaderTypeMD ShaderTy =
702-
infoKind == COMMITTED_TRIANGLE_FRONT_FACE ?
703-
CallableShaderTypeMD::ClosestHit :
704-
CallableShaderTypeMD::AnyHit;
705-
Value* frontFaceBit = builder.getIsFrontFace(ShadowMemStackPointer, ShaderTy);
695+
Value* frontFaceBit = builder.getIsFrontFace(ShadowMemStackPointer, shaderTy);
706696
if (infoKind == CANDIDATE_PROCEDURAL_PRIM_NON_OPAQUE)
707697
{
708698
frontFaceBit = builder.CreateICmpEQ(
@@ -711,132 +701,73 @@ void TraceRayInlineLoweringPass::LowerRayInfo(Function& F)
711701
I->replaceAllUsesWith(frontFaceBit);
712702
break;
713703
}
714-
case COMMITTED_GEOMETRY_INDEX:
715-
case CANDIDATE_GEOMETRY_INDEX:
704+
case GEOMETRY_INDEX:
716705
{
717706
bool specialPattern = false;
718-
if (infoKind == COMMITTED_GEOMETRY_INDEX && IGC_GET_FLAG_VALUE(ForceRTShortCircuitingOR))
707+
if (I->isCommitted() && IGC_GET_FLAG_VALUE(ForceRTShortCircuitingOR))
719708
{
720709
specialPattern = forceShortCurcuitingOR_CommittedGeomIdx(builder, I);
721710
}
722711

723-
IGC::CallableShaderTypeMD ShaderTy =
724-
infoKind == COMMITTED_GEOMETRY_INDEX ?
725-
CallableShaderTypeMD::ClosestHit :
726-
CallableShaderTypeMD::AnyHit;
727-
Value* leafType = builder.getLeafType(ShadowMemStackPointer, ShaderTy == CallableShaderTypeMD::ClosestHit);
728-
Value* geoIndex = builder.getGeometryIndex(ShadowMemStackPointer, I, leafType, ShaderTy, !specialPattern);
712+
Value* leafType = builder.getLeafType(ShadowMemStackPointer, I->isCommitted());
713+
Value* geoIndex = builder.getGeometryIndex(ShadowMemStackPointer, I, leafType, shaderTy, !specialPattern);
729714
IGC_ASSERT_MESSAGE(I->getType()->isIntegerTy(), "Invalid geometryIndex type!");
730715
I->replaceAllUsesWith(geoIndex);
731716
break;
732717
}
733-
case COMMITTED_INSTANCE_INDEX:
734-
case CANDIDATE_INSTANCE_INDEX:
735-
case COMMITTED_INSTANCE_ID:
736-
case CANDIDATE_INSTANCE_ID:
737-
{
738-
IGC::CallableShaderTypeMD ShaderTy =
739-
(infoKind == COMMITTED_INSTANCE_INDEX || infoKind == COMMITTED_INSTANCE_ID) ?
740-
CallableShaderTypeMD::ClosestHit :
741-
CallableShaderTypeMD::AnyHit;
742-
DISPATCH_SHADER_RAY_INFO_TYPE infoType =
743-
(infoKind == COMMITTED_INSTANCE_ID || infoKind == CANDIDATE_INSTANCE_ID) ?
744-
INSTANCE_ID :
745-
INSTANCE_INDEX;
746-
Value* inst = (infoType == INSTANCE_ID) ?
747-
builder.getInstanceID(ShadowMemStackPointer, ShaderTy, I, true) :
748-
builder.getInstanceIndex(ShadowMemStackPointer, ShaderTy, I, true);
749-
I->replaceAllUsesWith(inst);
718+
case INSTANCE_INDEX:
719+
I->replaceAllUsesWith(builder.getInstanceIndex(ShadowMemStackPointer, shaderTy, I, true));
750720
break;
751-
}
752-
case COMMITTED_PRIMITIVE_INDEX:
753-
case CANDIDATE_PRIMITIVE_INDEX:
721+
case INSTANCE_ID:
722+
I->replaceAllUsesWith(builder.getInstanceID(ShadowMemStackPointer, shaderTy, I, true));
723+
break;
724+
case PRIMITIVE_INDEX:
754725
{
755-
IGC::CallableShaderTypeMD ShaderTy =
756-
infoKind == COMMITTED_PRIMITIVE_INDEX ?
757-
CallableShaderTypeMD::ClosestHit :
758-
CallableShaderTypeMD::AnyHit;
759-
Value* leafType = builder.getLeafType(ShadowMemStackPointer, ShaderTy == CallableShaderTypeMD::ClosestHit);
760-
Value* primIndex = builder.getPrimitiveIndex(ShadowMemStackPointer, I, leafType, ShaderTy, true);
726+
Value* leafType = builder.getLeafType(ShadowMemStackPointer, I->isCommitted());
727+
Value* primIndex = builder.getPrimitiveIndex(ShadowMemStackPointer, I, leafType, shaderTy, true);
761728
IGC_ASSERT_MESSAGE(I->getType()->isIntegerTy(), "Invalid primIndex type!");
762729
I->replaceAllUsesWith(primIndex);
763730

764731
break;
765732
}
766-
case COMMITTED_BARYCENTRICS:
767-
{
768-
uint32_t idx = (uint32_t)cast<ConstantInt>(I->getDim())->getZExtValue();
769-
Value* bary = builder.getHitBaryCentric(ShadowMemStackPointer, idx, true);
770-
I->replaceAllUsesWith(bary);
771-
break;
772-
}
773-
case CANDIDATE_BARYCENTRICS:
733+
case BARYCENTRICS:
774734
{
775735
uint32_t idx = (uint32_t)cast<ConstantInt>(I->getDim())->getZExtValue();
776-
Value* bary = builder.getHitBaryCentric(ShadowMemStackPointer, idx, false);
736+
Value* bary = builder.getHitBaryCentric(ShadowMemStackPointer, idx, I->isCommitted());
777737
I->replaceAllUsesWith(bary);
778738
break;
779739
}
780-
case COMMITTED_OBJECT_TO_WORLD:
781-
case CANDIDATE_OBJECT_TO_WORLD:
740+
case OBJECT_TO_WORLD:
782741
{
783-
IGC::CallableShaderTypeMD ShaderTy =
784-
infoKind == COMMITTED_OBJECT_TO_WORLD ?
785-
CallableShaderTypeMD::ClosestHit :
786-
CallableShaderTypeMD::AnyHit;
787742
uint32_t dim = (uint32_t)cast<ConstantInt>(I->getDim())->getZExtValue();
788-
Value* matrixComp = builder.getObjToWorld(ShadowMemStackPointer, dim, ShaderTy, I, true);
743+
Value* matrixComp = builder.getObjToWorld(ShadowMemStackPointer, dim, shaderTy, I, true);
789744
I->replaceAllUsesWith(matrixComp);
790745
break;
791746
}
792-
case COMMITTED_WORLD_TO_OBJECT:
793-
case CANDIDATE_WORLD_TO_OBJECT:
747+
case WORLD_TO_OBJECT:
794748
{
795-
IGC::CallableShaderTypeMD ShaderTy =
796-
infoKind == COMMITTED_WORLD_TO_OBJECT ?
797-
CallableShaderTypeMD::ClosestHit :
798-
CallableShaderTypeMD::AnyHit;
799749
uint32_t dim = (uint32_t)cast<ConstantInt>(I->getDim())->getZExtValue();
800-
Value* matrixComp = builder.getWorldToObj(ShadowMemStackPointer, dim, ShaderTy, I, true);
750+
Value* matrixComp = builder.getWorldToObj(ShadowMemStackPointer, dim, shaderTy, I, true);
801751
I->replaceAllUsesWith(matrixComp);
802752
break;
803-
804-
break;
805753
}
806-
case COMMITTED_OBJECT_RAY_ORG:
754+
case OBJ_RAY_ORG:
807755
{
808-
Value* rayInfo = builder.getObjRayOrig(ShadowMemStackPointer, (uint32_t)cast<ConstantInt>(I->getDim())->getZExtValue(), CallableShaderTypeMD::ClosestHit, I, true);
756+
Value* rayInfo = builder.getObjRayOrig(ShadowMemStackPointer, (uint32_t)cast<ConstantInt>(I->getDim())->getZExtValue(), shaderTy, I, true);
809757
I->replaceAllUsesWith(rayInfo);
810758
break;
811759
}
812-
case COMMITTED_OBJECT_RAY_DIR:
760+
case OBJ_RAY_DIR:
813761
{
814-
Value* rayInfo = builder.getObjRayDir(ShadowMemStackPointer, (uint32_t)cast<ConstantInt>(I->getDim())->getZExtValue(), CallableShaderTypeMD::ClosestHit, I, true);
762+
Value* rayInfo = builder.getObjRayDir(ShadowMemStackPointer, (uint32_t)cast<ConstantInt>(I->getDim())->getZExtValue(), shaderTy, I, true);
815763
I->replaceAllUsesWith(rayInfo);
816764
break;
817765
}
818-
case CANDIDATE_OBJECT_RAY_ORG:
819-
{
820-
Value* valueAtDim = builder.getObjRayOrig(ShadowMemStackPointer, (uint32_t)cast<ConstantInt>(I->getDim())->getZExtValue(), CallableShaderTypeMD::AnyHit, I, true);
821-
I->replaceAllUsesWith(valueAtDim);
822-
break;
823-
}
824-
case CANDIDATE_OBJECT_RAY_DIR:
766+
case INST_CONTRIBUTION_TO_HITGROUP_INDEX:
825767
{
826-
Value* valueAtDim = builder.getObjRayDir(ShadowMemStackPointer, (uint32_t)cast<ConstantInt>(I->getDim())->getZExtValue(), CallableShaderTypeMD::AnyHit, I, true);
827-
I->replaceAllUsesWith(valueAtDim);
828-
break;
829-
}
830-
case COMMITTED_INST_CONTRIBUTION_TO_HITGROUP_INDEX:
831-
case CANDIDATE_INST_CONTRIBUTION_TO_HITGROUP_INDEX:
832-
{
833-
IGC::CallableShaderTypeMD ShaderTy =
834-
infoKind == COMMITTED_INST_CONTRIBUTION_TO_HITGROUP_INDEX ?
835-
CallableShaderTypeMD::ClosestHit :
836-
CallableShaderTypeMD::AnyHit;
837-
Value* info = builder.getInstanceContributionToHitGroupIndex(
838-
ShadowMemStackPointer, ShaderTy);
839-
I->replaceAllUsesWith(info);
768+
I->replaceAllUsesWith(
769+
builder.getInstanceContributionToHitGroupIndex(ShadowMemStackPointer, shaderTy)
770+
);
840771
break;
841772
}
842773
default:

IGC/Compiler/CodeGenPublicEnums.h

+18-40
Original file line numberDiff line numberDiff line change
@@ -282,46 +282,24 @@ namespace IGC
282282

283283
enum DISPATCH_SHADER_RAY_INFO_TYPE : unsigned int
284284
{
285-
WORLD_RAY_ORG = 0,
286-
WORLD_RAY_DIR = 1,
287-
OBJ_RAY_ORG = 2,
288-
OBJ_RAY_DIR = 3,
289-
RAY_T_MIN = 4,
290-
RAY_T_CURRENT = 5,
291-
PRIMITIVE_INDEX_TRIANGLE = 6,
292-
PRIMITIVE_INDEX_PROCEDURAL = 7,
293-
INSTANCE_ID = 8,
294-
INSTANCE_INDEX = 9,
295-
RAY_FLAGS = 10,
296-
OBJECT_TO_WORLD = 11,
297-
WORLD_TO_OBJECT = 12,
298-
COMMITTED_TRIANGLE_FRONT_FACE = 13,
299-
COMMITTED_GEOMETRY_INDEX = 14,
300-
COMMITTED_INSTANCE_INDEX = 15,
301-
COMMITTED_PRIMITIVE_INDEX = 16,
302-
COMMITTED_INSTANCE_ID = 17,
303-
COMMITTED_BARYCENTRICS = 18,
304-
COMMITTED_OBJECT_TO_WORLD = 19,
305-
COMMITTED_WORLD_TO_OBJECT = 20,
306-
COMMITTED_OBJECT_RAY_ORG = 21,
307-
COMMITTED_OBJECT_RAY_DIR = 22,
308-
COMMITTED_INST_CONTRIBUTION_TO_HITGROUP_INDEX = 23,
309-
CANDIDATE_TRIANGLE_FRONT_FACE = 25,
310-
CANDIDATE_TRIANGLE_T_CURRENT = 26,
311-
CANDIDATE_GEOMETRY_INDEX = 27,
312-
CANDIDATE_INSTANCE_INDEX = 28,
313-
CANDIDATE_PRIMITIVE_INDEX = 29,
314-
CANDIDATE_INSTANCE_ID = 30,
315-
CANDIDATE_BARYCENTRICS = 31,
316-
CANDIDATE_OBJECT_TO_WORLD = 32,
317-
CANDIDATE_WORLD_TO_OBJECT = 33,
318-
CANDIDATE_OBJECT_RAY_ORG = 34,
319-
CANDIDATE_OBJECT_RAY_DIR = 35,
320-
CANDIDATE_PROCEDURAL_PRIM_NON_OPAQUE = 36,
321-
CANDIDATE_INST_CONTRIBUTION_TO_HITGROUP_INDEX = 37,
322-
GEOMETRY_INDEX_TRIANGLE = 39,
323-
GEOMETRY_INDEX_PROCEDURAL = 40,
324-
RAY_MASK = 43,
285+
WORLD_RAY_ORG,
286+
WORLD_RAY_DIR,
287+
OBJ_RAY_ORG,
288+
OBJ_RAY_DIR,
289+
RAY_T_MIN,
290+
RAY_T_CURRENT,
291+
PRIMITIVE_INDEX,
292+
INSTANCE_ID,
293+
INSTANCE_INDEX,
294+
RAY_FLAGS,
295+
OBJECT_TO_WORLD,
296+
WORLD_TO_OBJECT,
297+
BARYCENTRICS,
298+
TRIANGLE_FRONT_FACE,
299+
CANDIDATE_PROCEDURAL_PRIM_NON_OPAQUE,
300+
GEOMETRY_INDEX,
301+
INST_CONTRIBUTION_TO_HITGROUP_INDEX,
302+
RAY_MASK,
325303
RAY_INFO_UNKNOWN = 0xFF
326304
};
327305

IGC/GenISAIntrinsics/GenIntrinsicInst.h

+13
Original file line numberDiff line numberDiff line change
@@ -1571,6 +1571,15 @@ class RayInfoIntrinsic : public GenIntrinsicInst {
15711571
uint32_t getDim() const {
15721572
return (uint32_t)cast<ConstantInt>(getOperand(1))->getZExtValue();
15731573
}
1574+
1575+
std::optional<bool> isProcedural() const {
1576+
if (auto* C = dyn_cast<ConstantInt>(getOperand(2)))
1577+
return C->getZExtValue() > 0;
1578+
1579+
IGC_ASSERT(isa<UndefValue>(getOperand(2)));
1580+
1581+
return std::nullopt;
1582+
}
15741583
};
15751584

15761585
class FillValueIntrinsic : public GenIntrinsicInst {
@@ -1917,6 +1926,10 @@ class RayQueryInfoIntrinsic : public RayQueryInstrisicBase {
19171926
}
19181927

19191928
Value* getDim() const {return getOperand(2);}
1929+
1930+
bool isCommitted() const {
1931+
return static_cast<bool>(cast<ConstantInt>(getOperand(3))->getZExtValue());
1932+
}
19201933
};
19211934

19221935
class RayQueryShadowMemoryToSyncStack : public RayQueryInstrisicBase {

IGC/GenISAIntrinsics/generator/input/Intrinsic_definitions.yml

+12
Original file line numberDiff line numberDiff line change
@@ -11033,6 +11033,10 @@ intrinsics:
1103311033
name: Arg1
1103411034
type_definition: *i32
1103511035
comment: ""
11036+
- !<ArgumentDefinition>
11037+
name: isProcedural
11038+
type_definition: *i1
11039+
comment: "If true, selected ray info queries will return data for a procedural primitive"
1103611040
attributes:
1103711041
- !AttributeID "NoUnwind"
1103811042
memory_effects:
@@ -11054,6 +11058,10 @@ intrinsics:
1105411058
name: Arg1
1105511059
type_definition: *i32
1105611060
comment: ""
11061+
- !<ArgumentDefinition>
11062+
name: isProcedural
11063+
type_definition: *i1
11064+
comment: "Unused, added for parity with GenISA_RayInfo"
1105711065
attributes:
1105811066
- !AttributeID "NoUnwind"
1105911067
memory_effects:
@@ -11512,6 +11520,10 @@ intrinsics:
1151211520
name: Arg2
1151311521
type_definition: *i32
1151411522
comment: "Dimension used for certain types"
11523+
- !<ArgumentDefinition>
11524+
name: isCommitted
11525+
type_definition: *i1
11526+
comment: "Is the ray info query for a committed hit?"
1151511527
attributes:
1151611528
- !AttributeID "NoUnwind"
1151711529
- !<IntrinsicDefinition>

0 commit comments

Comments
 (0)