@@ -652,15 +652,55 @@ 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;
655657 auto * const ShadowMemStackPointer = getShMemRayQueryRTStack (builder, I->getQueryObjIndex ());
656658
657- switch (I-> getInfoKind () )
659+ switch (infoKind )
658660 {
659- default :
660- I->replaceAllUsesWith (builder.lowerRayInfo (ShadowMemStackPointer, I, I->isCommitted (), std::nullopt ));
661- I->eraseFromParent ();
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);
662690 break ;
663- // leave this in for now, until we prove we don't need the hack anymore
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);
702+ break ;
703+ }
664704 case GEOMETRY_INDEX:
665705 {
666706 bool specialPattern = false ;
@@ -670,14 +710,75 @@ void TraceRayInlineLoweringPass::LowerRayInfo(Function& F)
670710 }
671711
672712 Value* leafType = builder.getLeafType (ShadowMemStackPointer, I->isCommitted ());
673- Value* geoIndex = builder.getGeometryIndex (ShadowMemStackPointer, I, leafType,
674- I->isCommitted () ? CallableShaderTypeMD::ClosestHit : CallableShaderTypeMD::AnyHit, !specialPattern);
713+ Value* geoIndex = builder.getGeometryIndex (ShadowMemStackPointer, I, leafType, shaderTy, !specialPattern);
675714 IGC_ASSERT_MESSAGE (I->getType ()->isIntegerTy (), " Invalid geometryIndex type!" );
676715 I->replaceAllUsesWith (geoIndex);
677- I->eraseFromParent ();
678716 break ;
679717 }
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 ;
680765 }
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 ();
681782 }
682783}
683784
0 commit comments