@@ -277,17 +277,17 @@ class TraversalBase
277277 hiprtHit& hit );
278278
279279 HIPRT_DEVICE bool testTriangle (
280- const hiprtRay& ray, const float3& invD, TriangleNode * nodes, uint32_t leafAddr, uint32_t leafType, hiprtHit& hit );
280+ const hiprtRay& ray, const float3& invD, TrianglePairNode * nodes, uint32_t leafAddr, uint32_t leafType, hiprtHit& hit );
281281
282282 HIPRT_DEVICE uint32_t testTrianglePair (
283- const hiprtRay& ray,
284- TriangleNode* nodes,
285- uint32_t leafAddr,
286- uint32_t triPairIndex,
287- hiprtHit& hit0,
288- hiprtHit& hit1,
289- bool & nodeEnd,
290- bool & rangeEnd );
283+ const hiprtRay& ray,
284+ TrianglePacketNode* nodes,
285+ uint32_t leafAddr,
286+ uint32_t triPairIndex,
287+ hiprtHit& hit0,
288+ hiprtHit& hit1,
289+ bool & nodeEnd,
290+ bool & rangeEnd );
291291
292292 protected:
293293 hiprtRay m_ray;
@@ -421,19 +421,20 @@ HIPRT_DEVICE bool TraversalBase<Stack, TraversalType>::testTriangleNode(
421421 bool hasHit = false ;
422422 uint32_t leafAddr = getNodeAddr ( leafIndex );
423423
424- if constexpr ( Rtip >= 31 )
424+ if constexpr ( is_same<TriangleNode, TrianglePacketNode>::value ) // RTIP 3.1
425425 {
426+ TrianglePacketNode* packetNodes = reinterpret_cast <TrianglePacketNode*>( nodes );
427+
426428 hiprtHit secondHit;
427429 uint32_t triPairIndex = typeToTriPairIndex ( getNodeType ( leafIndex ) );
428-
429430 if constexpr ( TraversalType == hiprtTraversalTerminateAtAnyHit )
430431 {
431432 while ( true )
432433 {
433434 bool nodeEnd = false ;
434435 bool rangeEnd = false ;
435436 uint32_t hitMask =
436- this ->testTrianglePair ( ray, nodes , leafAddr, triPairIndex, hit, secondHit, nodeEnd, rangeEnd );
437+ this ->testTrianglePair ( ray, packetNodes , leafAddr, triPairIndex, hit, secondHit, nodeEnd, rangeEnd );
437438
438439 bool firstHasHit = hitMask & 1 ;
439440 bool secondHasHit = hitMask & 2 ;
@@ -456,12 +457,6 @@ HIPRT_DEVICE bool TraversalBase<Stack, TraversalType>::testTriangleNode(
456457 triangleMask |= Triangle1Processed;
457458 }
458459
459- if ( rangeEnd )
460- {
461- triangleMask = InvalidValue; // indicate range end by 'invalid value'
462- break ;
463- }
464-
465460 triPairIndex++;
466461 triangleMask = 0 ;
467462 if ( nodeEnd )
@@ -470,9 +465,12 @@ HIPRT_DEVICE bool TraversalBase<Stack, TraversalType>::testTriangleNode(
470465 leafAddr++;
471466 }
472467
473- if ( hasHit )
468+ if ( hasHit || rangeEnd )
474469 {
475- leafIndex = encodeNodeIndex ( leafAddr, triPairIndexToType ( triPairIndex ) );
470+ if ( rangeEnd && !( firstHasHit && secondHasHit && ( triangleMask & Triangle1Processed ) == 0 ) )
471+ triangleMask = InvalidValue; // indicate range end by 'invalid value'
472+ else
473+ leafIndex = encodeNodeIndex ( leafAddr, triPairIndexToType ( triPairIndex ) );
476474 break ;
477475 }
478476 }
@@ -486,7 +484,7 @@ HIPRT_DEVICE bool TraversalBase<Stack, TraversalType>::testTriangleNode(
486484 bool nodeEnd = false ;
487485 bool rangeEnd = false ;
488486 uint32_t hitMask =
489- this ->testTrianglePair ( ray, nodes , leafAddr, triPairIndex, firstHit, secondHit, nodeEnd, rangeEnd );
487+ this ->testTrianglePair ( ray, packetNodes , leafAddr, triPairIndex, firstHit, secondHit, nodeEnd, rangeEnd );
490488
491489 bool firstHasHit = hitMask & 1 ;
492490 bool secondHasHit = hitMask & 2 ;
@@ -521,28 +519,30 @@ HIPRT_DEVICE bool TraversalBase<Stack, TraversalType>::testTriangleNode(
521519 }
522520 else
523521 {
522+ TrianglePairNode* pairNodes = reinterpret_cast <TrianglePairNode*>( nodes );
523+
524524 if constexpr ( TraversalType == hiprtTraversalTerminateAtAnyHit )
525525 {
526526 if ( ( triangleMask & Triangle0Processed ) == 0 )
527527 {
528- hasHit = this ->testTriangle ( ray, invD, nodes , leafAddr, TriangleType, hit );
528+ hasHit = this ->testTriangle ( ray, invD, pairNodes , leafAddr, TriangleType, hit );
529529 triangleMask |= Triangle0Processed;
530530 }
531531
532532 if ( !hasHit )
533533 {
534- hasHit = this ->testTriangle ( ray, invD, nodes , leafAddr, TriangleType + 1 , hit );
534+ hasHit = this ->testTriangle ( ray, invD, pairNodes , leafAddr, TriangleType + 1 , hit );
535535 triangleMask |= Triangle1Processed;
536536 }
537537
538538 if ( triangleMask & Triangle1Processed ) triangleMask = InvalidValue;
539539 }
540540 else
541541 {
542- hasHit = this ->testTriangle ( ray, invD, nodes , leafAddr, TriangleType, hit );
542+ hasHit = this ->testTriangle ( ray, invD, pairNodes , leafAddr, TriangleType, hit );
543543
544544 hiprtHit secondHit;
545- bool secondHasHit = this ->testTriangle ( ray, invD, nodes , leafAddr, TriangleType + 1 , secondHit );
545+ bool secondHasHit = this ->testTriangle ( ray, invD, pairNodes , leafAddr, TriangleType + 1 , secondHit );
546546
547547 if ( secondHasHit && ( !hasHit || hit.t > secondHit.t ) )
548548 {
@@ -561,12 +561,12 @@ template <typename Stack, hiprtTraversalType TraversalType>
561561HIPRT_DEVICE bool TraversalBase<Stack, TraversalType>::testTriangle(
562562 const hiprtRay& ray,
563563 [[maybe_unused]] const float3& invD,
564- TriangleNode* nodes,
564+ TrianglePairNode* nodes,
565565 uint32_t leafAddr,
566566 uint32_t leafType,
567567 hiprtHit& hit )
568568{
569- const TriangleNode & node = nodes[leafAddr];
569+ const TrianglePairNode & node = nodes[leafAddr];
570570 if ( node.getPrimIndex ( 0 ) == node.getPrimIndex ( 1 ) && leafType == TriangleType + 1 ) return false ;
571571 bool hasHit = false ;
572572#if HIPRT_RTIP < 20
@@ -602,17 +602,17 @@ HIPRT_DEVICE bool TraversalBase<Stack, TraversalType>::testTriangle(
602602
603603template <typename Stack, hiprtTraversalType TraversalType>
604604HIPRT_DEVICE uint32_t TraversalBase<Stack, TraversalType>::testTrianglePair(
605- const hiprtRay& ray,
606- TriangleNode* nodes,
607- uint32_t leafAddr,
608- uint32_t triPairIndex,
609- hiprtHit& hit0,
610- hiprtHit& hit1,
611- bool & nodeEnd,
612- bool & rangeEnd )
605+ const hiprtRay& ray,
606+ TrianglePacketNode* nodes,
607+ uint32_t leafAddr,
608+ uint32_t triPairIndex,
609+ hiprtHit& hit0,
610+ hiprtHit& hit1,
611+ bool & nodeEnd,
612+ bool & rangeEnd )
613613{
614614#if HIPRT_RTIP >= 31
615- const TriangleNode & node = nodes[leafAddr];
615+ const TrianglePacketNode & node = nodes[leafAddr];
616616
617617 hip_float3 dummy0, dummy1;
618618 auto result = __builtin_amdgcn_image_bvh8_intersect_ray (
0 commit comments