Skip to content

Commit f7ffdda

Browse files
jaladreipsigcbot
authored andcommitted
Move lowering RayInfo to the RTBuilder
Move lowering RayInfo to the RTBuilder
1 parent 6acafd6 commit f7ffdda

File tree

4 files changed

+117
-112
lines changed

4 files changed

+117
-112
lines changed

IGC/AdaptorCommon/RayTracing/RTBuilder.cpp

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2090,3 +2090,101 @@ Value* RTBuilder::getHitAddress(StackPointerVal* StackPtr, bool Committed)
20902090
IGC_ASSERT(0);
20912091
return {};
20922092
}
2093+
2094+
template<typename StackPointerValT, typename RayInfoIntrinsicT>
2095+
Value* RTBuilder::lowerRayInfo(StackPointerValT* perLaneStackPtr, RayInfoIntrinsicT* I, bool isCommitted, std::optional<bool> isProcedural)
2096+
{
2097+
Value* info = nullptr;
2098+
auto shaderType = isCommitted ? CallableShaderTypeMD::ClosestHit : CallableShaderTypeMD::AnyHit;
2099+
uint32_t dim = I->getDim();
2100+
auto infoKind = I->getInfoKind();
2101+
2102+
switch (infoKind)
2103+
{
2104+
case WORLD_RAY_ORG:
2105+
info = getWorldRayOrig(perLaneStackPtr, dim);
2106+
break;
2107+
case WORLD_RAY_DIR:
2108+
info = getWorldRayDir(perLaneStackPtr, dim);
2109+
break;
2110+
case OBJ_RAY_ORG:
2111+
info = getObjRayOrig(perLaneStackPtr, dim, shaderType);
2112+
break;
2113+
case OBJ_RAY_DIR:
2114+
info = getObjRayDir(perLaneStackPtr, dim, shaderType);
2115+
break;
2116+
case RAY_T_MIN:
2117+
info = getRayTMin(perLaneStackPtr);
2118+
break;
2119+
case RAY_T_CURRENT:
2120+
info = getRayTCurrent(perLaneStackPtr, shaderType);
2121+
break;
2122+
case INSTANCE_ID:
2123+
info = getInstanceID(perLaneStackPtr, shaderType, nullptr, false);
2124+
break;
2125+
case INSTANCE_INDEX:
2126+
info = getInstanceIndex(perLaneStackPtr, shaderType, nullptr, false);
2127+
break;
2128+
case PRIMITIVE_INDEX:
2129+
{
2130+
auto* nodeType = isProcedural.has_value() ?
2131+
getInt32(*isProcedural ? NODE_TYPE_PROCEDURAL : NODE_TYPE_QUAD) :
2132+
getLeafType(perLaneStackPtr, isCommitted);
2133+
info = getPrimitiveIndex(perLaneStackPtr, I, nodeType, shaderType, false);
2134+
break;
2135+
}
2136+
case RAY_FLAGS:
2137+
info = CreateZExt(
2138+
getRayFlags(perLaneStackPtr),
2139+
I->getType());
2140+
break;
2141+
case OBJECT_TO_WORLD:
2142+
info = getObjToWorld(perLaneStackPtr, dim, shaderType);
2143+
break;
2144+
case WORLD_TO_OBJECT:
2145+
info = getWorldToObj(perLaneStackPtr, dim, shaderType);
2146+
break;
2147+
case GEOMETRY_INDEX:
2148+
{
2149+
auto* nodeType = isProcedural.has_value() ?
2150+
getInt32(*isProcedural ? NODE_TYPE_PROCEDURAL : NODE_TYPE_QUAD) :
2151+
getLeafType(perLaneStackPtr, isCommitted);
2152+
info = getGeometryIndex(perLaneStackPtr, I, nodeType, shaderType, false);
2153+
break;
2154+
}
2155+
case INST_CONTRIBUTION_TO_HITGROUP_INDEX:
2156+
info = getInstanceContributionToHitGroupIndex(perLaneStackPtr, shaderType);
2157+
break;
2158+
case RAY_MASK:
2159+
info = getRayMask(perLaneStackPtr);
2160+
break;
2161+
case TRIANGLE_FRONT_FACE:
2162+
case CANDIDATE_PROCEDURAL_PRIM_NON_OPAQUE: // Procedural Primitive Opaque Info is stored in Front Face bit
2163+
{
2164+
info = getIsFrontFace(perLaneStackPtr, shaderType);
2165+
2166+
if (infoKind == CANDIDATE_PROCEDURAL_PRIM_NON_OPAQUE)
2167+
info = CreateICmpEQ(info, getInt1(0), VALUE_NAME("is_nonopaque"));
2168+
2169+
break;
2170+
}
2171+
case BARYCENTRICS:
2172+
{
2173+
info = getHitBaryCentric(perLaneStackPtr, I->getDim(), shaderType);
2174+
break;
2175+
}
2176+
default:
2177+
IGC_ASSERT_MESSAGE(0, "Unsupported Ray Info");
2178+
break;
2179+
}
2180+
2181+
return info;
2182+
}
2183+
2184+
2185+
template Value* RTBuilder::lowerRayInfo<RTBuilder::SyncStackPointerVal, RayQueryInfoIntrinsic>(
2186+
RTBuilder::SyncStackPointerVal*,
2187+
RayQueryInfoIntrinsic*,
2188+
bool,
2189+
std::optional<bool>
2190+
);

IGC/AdaptorCommon/RayTracing/RTBuilder.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,12 @@ class RTBuilder : public IGCIRBuilder<>
500500
void commitProceduralPrimitiveHit(SyncStackPointerVal* SMStackPtr, Value* THit);
501501

502502
Value* getHitAddress(StackPointerVal* StackPtr, bool Committed);
503+
template<typename StackPointerValT, typename RayInfoIntrinsicT>
504+
Value* lowerRayInfo(
505+
StackPointerValT* perLaneStackPtr,
506+
RayInfoIntrinsicT* I,
507+
bool isCommitted,
508+
std::optional<bool> isProcedural);
503509
};
504510

505511
} // namespace llvm

IGC/AdaptorCommon/RayTracing/TraceRayInlineLoweringPass.cpp

Lines changed: 8 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -652,55 +652,15 @@ void TraceRayInlineLoweringPass::LowerRayInfo(Function& F)
652652
{
653653
builder.SetInsertPoint(I);
654654

655-
unsigned int infoKind = I->getInfoKind();
656-
auto shaderTy = I->isCommitted() ? CallableShaderTypeMD::ClosestHit : CallableShaderTypeMD::AnyHit;
657655
auto* const ShadowMemStackPointer = getShMemRayQueryRTStack(builder, I->getQueryObjIndex());
658656

659-
switch (infoKind)
657+
switch (I->getInfoKind())
660658
{
661-
case RAY_FLAGS:
662-
{
663-
Value* rayFlags = builder.getRayFlags(ShadowMemStackPointer);
664-
rayFlags = builder.CreateZExt(rayFlags, I->getType());
665-
I->replaceAllUsesWith(rayFlags);
666-
break;
667-
}
668-
case WORLD_RAY_ORG:
669-
{
670-
Value* rayOrg = builder.getWorldRayOrig(ShadowMemStackPointer, (uint32_t)cast<ConstantInt>(I->getDim())->getZExtValue());
671-
I->replaceAllUsesWith(rayOrg);
672-
break;
673-
}
674-
case WORLD_RAY_DIR:
675-
{
676-
Value* valueAtDim = builder.getWorldRayDir(ShadowMemStackPointer, (uint32_t)cast<ConstantInt>(I->getDim())->getZExtValue());
677-
I->replaceAllUsesWith(valueAtDim);
678-
break;
679-
}
680-
case RAY_T_MIN:
681-
{
682-
Value* TMin = builder.getRayTMin(ShadowMemStackPointer);
683-
I->replaceAllUsesWith(TMin);
684-
break;
685-
}
686-
case RAY_T_CURRENT:
687-
{
688-
Value* rayT = builder.getRayTCurrent(ShadowMemStackPointer, shaderTy);
689-
I->replaceAllUsesWith(rayT);
690-
break;
691-
}
692-
case TRIANGLE_FRONT_FACE:
693-
case CANDIDATE_PROCEDURAL_PRIM_NON_OPAQUE: // Procedural Primitive Opaque Info is stored in Front Face bit
694-
{
695-
Value* frontFaceBit = builder.getIsFrontFace(ShadowMemStackPointer, shaderTy);
696-
if (infoKind == CANDIDATE_PROCEDURAL_PRIM_NON_OPAQUE)
697-
{
698-
frontFaceBit = builder.CreateICmpEQ(
699-
frontFaceBit, builder.getInt1(0), VALUE_NAME("is_nonopaque"));
700-
}
701-
I->replaceAllUsesWith(frontFaceBit);
659+
default:
660+
I->replaceAllUsesWith(builder.lowerRayInfo(ShadowMemStackPointer, I, I->isCommitted(), std::nullopt));
661+
I->eraseFromParent();
702662
break;
703-
}
663+
// leave this in for now, until we prove we don't need the hack anymore
704664
case GEOMETRY_INDEX:
705665
{
706666
bool specialPattern = false;
@@ -710,75 +670,14 @@ void TraceRayInlineLoweringPass::LowerRayInfo(Function& F)
710670
}
711671

712672
Value* leafType = builder.getLeafType(ShadowMemStackPointer, I->isCommitted());
713-
Value* geoIndex = builder.getGeometryIndex(ShadowMemStackPointer, I, leafType, shaderTy, !specialPattern);
673+
Value* geoIndex = builder.getGeometryIndex(ShadowMemStackPointer, I, leafType,
674+
I->isCommitted() ? CallableShaderTypeMD::ClosestHit : CallableShaderTypeMD::AnyHit, !specialPattern);
714675
IGC_ASSERT_MESSAGE(I->getType()->isIntegerTy(), "Invalid geometryIndex type!");
715676
I->replaceAllUsesWith(geoIndex);
677+
I->eraseFromParent();
716678
break;
717679
}
718-
case INSTANCE_INDEX:
719-
I->replaceAllUsesWith(builder.getInstanceIndex(ShadowMemStackPointer, shaderTy, I, true));
720-
break;
721-
case INSTANCE_ID:
722-
I->replaceAllUsesWith(builder.getInstanceID(ShadowMemStackPointer, shaderTy, I, true));
723-
break;
724-
case PRIMITIVE_INDEX:
725-
{
726-
Value* leafType = builder.getLeafType(ShadowMemStackPointer, I->isCommitted());
727-
Value* primIndex = builder.getPrimitiveIndex(ShadowMemStackPointer, I, leafType, shaderTy, true);
728-
IGC_ASSERT_MESSAGE(I->getType()->isIntegerTy(), "Invalid primIndex type!");
729-
I->replaceAllUsesWith(primIndex);
730-
731-
break;
732-
}
733-
case BARYCENTRICS:
734-
{
735-
uint32_t idx = (uint32_t)cast<ConstantInt>(I->getDim())->getZExtValue();
736-
Value* bary = builder.getHitBaryCentric(ShadowMemStackPointer, idx, I->isCommitted());
737-
I->replaceAllUsesWith(bary);
738-
break;
739-
}
740-
case OBJECT_TO_WORLD:
741-
{
742-
uint32_t dim = (uint32_t)cast<ConstantInt>(I->getDim())->getZExtValue();
743-
Value* matrixComp = builder.getObjToWorld(ShadowMemStackPointer, dim, shaderTy, I, true);
744-
I->replaceAllUsesWith(matrixComp);
745-
break;
746-
}
747-
case WORLD_TO_OBJECT:
748-
{
749-
uint32_t dim = (uint32_t)cast<ConstantInt>(I->getDim())->getZExtValue();
750-
Value* matrixComp = builder.getWorldToObj(ShadowMemStackPointer, dim, shaderTy, I, true);
751-
I->replaceAllUsesWith(matrixComp);
752-
break;
753-
}
754-
case OBJ_RAY_ORG:
755-
{
756-
Value* rayInfo = builder.getObjRayOrig(ShadowMemStackPointer, (uint32_t)cast<ConstantInt>(I->getDim())->getZExtValue(), shaderTy, I, true);
757-
I->replaceAllUsesWith(rayInfo);
758-
break;
759-
}
760-
case OBJ_RAY_DIR:
761-
{
762-
Value* rayInfo = builder.getObjRayDir(ShadowMemStackPointer, (uint32_t)cast<ConstantInt>(I->getDim())->getZExtValue(), shaderTy, I, true);
763-
I->replaceAllUsesWith(rayInfo);
764-
break;
765680
}
766-
case INST_CONTRIBUTION_TO_HITGROUP_INDEX:
767-
{
768-
I->replaceAllUsesWith(
769-
builder.getInstanceContributionToHitGroupIndex(ShadowMemStackPointer, shaderTy)
770-
);
771-
break;
772-
}
773-
default:
774-
IGC_ASSERT_MESSAGE(0, "Unsupported RayQuery Info");
775-
break;
776-
}
777-
}
778-
779-
for (auto I : info)
780-
{
781-
I->eraseFromParent();
782681
}
783682
}
784683

IGC/GenISAIntrinsics/GenIntrinsicInst.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1921,11 +1921,13 @@ class RayQueryInfoIntrinsic : public RayQueryInstrisicBase {
19211921
return isa<RayQueryInstrisicBase>(V) && classof(cast<RayQueryInstrisicBase>(V));
19221922
}
19231923

1924-
uint32_t getInfoKind() const {
1925-
return (uint32_t)cast<ConstantInt>(getOperand(1))->getZExtValue();
1924+
IGC::DISPATCH_SHADER_RAY_INFO_TYPE getInfoKind() const {
1925+
return static_cast<IGC::DISPATCH_SHADER_RAY_INFO_TYPE>(cast<ConstantInt>(getOperand(1))->getZExtValue());
19261926
}
19271927

1928-
Value* getDim() const {return getOperand(2);}
1928+
uint32_t getDim() const {
1929+
return static_cast<uint32_t>(cast<ConstantInt>(getOperand(2))->getZExtValue());
1930+
}
19291931

19301932
bool isCommitted() const {
19311933
return static_cast<bool>(cast<ConstantInt>(getOperand(3))->getZExtValue());

0 commit comments

Comments
 (0)