@@ -729,45 +729,29 @@ Value* RTBuilder::getObjRayOrig(
729
729
RTBuilder::StackPointerVal* perLaneStackPtr, uint32_t dim, Value* ShaderTy,
730
730
Instruction* I, bool checkInstanceLeafPtr)
731
731
{
732
-
732
+ auto * transformWorldToObject = CreateOr (
733
+ {
734
+ CreateICmpEQ (ShaderTy, getInt32 (CallableShaderTypeMD::ClosestHit)),
735
+ }
736
+ );
737
+ Instruction* trueTerm = nullptr ;
738
+ Instruction* falseTerm = nullptr ;
733
739
auto * IP = &*GetInsertPoint ();
740
+ SplitBlockAndInsertIfThenElse (transformWorldToObject, IP, &trueTerm, &falseTerm);
734
741
735
- auto * oldBB = IP->getParent ();
736
- auto * bb = SplitBlock (oldBB, IP);
737
-
738
- auto * isClosestHitBB = BasicBlock::Create (*Ctx.getLLVMContext (), VALUE_NAME (" isClosestHitBB" ), IP->getFunction (), bb);
739
- SetInsertPoint (isClosestHitBB);
740
- auto * isClosestHitBBTerm = CreateBr (bb); // we have to do this because the functions we call are going to split the block again...
741
- SetInsertPoint (isClosestHitBBTerm);
742
+ SetInsertPoint (trueTerm);
742
743
auto * newI = I->clone ();
743
- Insert ( newI);
744
- auto * isClosestHitV = this ->TransformWorldToObject (perLaneStackPtr, dim, true , ShaderTy, newI, checkInstanceLeafPtr);
744
+ newI-> insertBefore (trueTerm );
745
+ auto * trueV = this ->TransformWorldToObject (perLaneStackPtr, dim, true , ShaderTy, newI, checkInstanceLeafPtr);
745
746
newI->eraseFromParent ();
746
747
747
- auto * isMissBB = BasicBlock::Create (Context, VALUE_NAME (" isMissBB" ), IP->getFunction (), bb);
748
- SetInsertPoint (isMissBB);
749
- auto * isMissBBTerm = CreateBr (bb);
750
- SetInsertPoint (isMissBBTerm);
751
- auto * isMissV = getWorldRayOrig (perLaneStackPtr, dim);
752
-
753
- auto * defaultBB = BasicBlock::Create (Context, VALUE_NAME (" default" ), IP->getFunction (), bb);
754
- SetInsertPoint (defaultBB);
755
- auto * defaultBBTerm = CreateBr (bb);
756
- SetInsertPoint (defaultBBTerm);
757
- auto * defaultV = getMemRayOrig (perLaneStackPtr, dim, BOTTOM_LEVEL_BVH, VALUE_NAME (" ObjRayOrig[" + Twine (dim) + " ]" ));
758
-
759
- // create switch statement
760
- oldBB->getTerminator ()->eraseFromParent ();
761
- SetInsertPoint (oldBB);
762
- auto * switchI = CreateSwitch (ShaderTy, defaultBB);
763
- switchI->addCase (getInt32 (Miss), isMissBB);
764
- switchI->addCase (getInt32 (ClosestHit), isClosestHitBB);
748
+ SetInsertPoint (falseTerm);
749
+ auto * falseV = getMemRayOrig (perLaneStackPtr, dim, BOTTOM_LEVEL_BVH, VALUE_NAME (" ObjRayOrig[" + Twine (dim) + " ]" ));
765
750
766
751
SetInsertPoint (IP);
767
- auto * info = CreatePHI (isClosestHitV->getType (), 3 );
768
- info->addIncoming (isClosestHitV, isClosestHitBBTerm->getParent ());
769
- info->addIncoming (isMissV, isMissBBTerm->getParent ());
770
- info->addIncoming (defaultV, defaultBBTerm->getParent ());
752
+ auto * info = CreatePHI (trueV->getType (), 2 );
753
+ info->addIncoming (trueV, trueTerm->getParent ());
754
+ info->addIncoming (falseV, falseTerm->getParent ());
771
755
772
756
return info;
773
757
}
@@ -776,45 +760,29 @@ Value* RTBuilder::getObjRayDir(
776
760
RTBuilder::StackPointerVal* perLaneStackPtr, uint32_t dim, Value* ShaderTy,
777
761
Instruction* I, bool checkInstanceLeafPtr)
778
762
{
779
-
763
+ auto * transformWorldToObject = CreateOr (
764
+ {
765
+ CreateICmpEQ (ShaderTy, getInt32 (CallableShaderTypeMD::ClosestHit)),
766
+ }
767
+ );
768
+ Instruction* trueTerm = nullptr ;
769
+ Instruction* falseTerm = nullptr ;
780
770
auto * IP = &*GetInsertPoint ();
771
+ SplitBlockAndInsertIfThenElse (transformWorldToObject, IP, &trueTerm, &falseTerm);
781
772
782
- auto * oldBB = IP->getParent ();
783
- auto * bb = SplitBlock (oldBB, IP);
784
-
785
- auto * isClosestHitBB = BasicBlock::Create (*Ctx.getLLVMContext (), VALUE_NAME (" isClosestHitBB" ), IP->getFunction (), bb);
786
- SetInsertPoint (isClosestHitBB);
787
- auto * isClosestHitBBTerm = CreateBr (bb); // we have to do this because the functions we call are going to split the block again...
788
- SetInsertPoint (isClosestHitBBTerm);
773
+ SetInsertPoint (trueTerm);
789
774
auto * newI = I->clone ();
790
- Insert ( newI);
791
- auto * isClosestHitV = this ->TransformWorldToObject (perLaneStackPtr, dim, false , ShaderTy, newI, checkInstanceLeafPtr);
775
+ newI-> insertBefore (trueTerm );
776
+ auto * trueV = this ->TransformWorldToObject (perLaneStackPtr, dim, false , ShaderTy, newI, checkInstanceLeafPtr);
792
777
newI->eraseFromParent ();
793
778
794
- auto * isMissBB = BasicBlock::Create (Context, VALUE_NAME (" isMissBB" ), IP->getFunction (), bb);
795
- SetInsertPoint (isMissBB);
796
- auto * isMissBBTerm = CreateBr (bb);
797
- SetInsertPoint (isMissBBTerm);
798
- auto * isMissV = getWorldRayDir (perLaneStackPtr, dim);
799
-
800
- auto * defaultBB = BasicBlock::Create (Context, VALUE_NAME (" default" ), IP->getFunction (), bb);
801
- SetInsertPoint (defaultBB);
802
- auto * defaultBBTerm = CreateBr (bb);
803
- SetInsertPoint (defaultBBTerm);
804
- auto * defaultV = getMemRayDir (perLaneStackPtr, dim, BOTTOM_LEVEL_BVH, VALUE_NAME (" ObjRayDir[" + Twine (dim) + " ]" ));
805
-
806
- // create switch statement
807
- oldBB->getTerminator ()->eraseFromParent ();
808
- SetInsertPoint (oldBB);
809
- auto * switchI = CreateSwitch (ShaderTy, defaultBB);
810
- switchI->addCase (getInt32 (Miss), isMissBB);
811
- switchI->addCase (getInt32 (ClosestHit), isClosestHitBB);
779
+ SetInsertPoint (falseTerm);
780
+ auto * falseV = getMemRayDir (perLaneStackPtr, dim, BOTTOM_LEVEL_BVH, VALUE_NAME (" ObjRayDir[" + Twine (dim) + " ]" ));
812
781
813
782
SetInsertPoint (IP);
814
- auto * info = CreatePHI (isClosestHitV->getType (), 3 );
815
- info->addIncoming (isClosestHitV, isClosestHitBBTerm->getParent ());
816
- info->addIncoming (isMissV, isMissBBTerm->getParent ());
817
- info->addIncoming (defaultV, defaultBBTerm->getParent ());
783
+ auto * info = CreatePHI (trueV->getType (), 2 );
784
+ info->addIncoming (trueV, trueTerm->getParent ());
785
+ info->addIncoming (falseV, falseTerm->getParent ());
818
786
819
787
return info;
820
788
}
0 commit comments