@@ -949,15 +949,23 @@ void raygen()
949949 PerRayData payload;
950950 payload.visited = 0;
951951
952- // SER Test
953- dx::HitObject hitObject = dx::HitObject::TraceRay(topObject, RAY_FLAG_NONE, 0xFF, 0, 1, 0, ray, payload);
952+ dx::HitObject hitObject = dx::HitObject::TraceRay(topObject, RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES, 0xFF, 0, 1, 0, ray, payload);
954953 dx::MaybeReorderThread(hitObject);
955954
955+ // Invoke hit/miss for triangle
956+ dx::HitObject::Invoke( hitObject, payload );
957+
956958 if (hitObject.IsHit())
957959 {
958- // Alter the hit object to point to a new shader index to hit chAABB .
960+ // Transform to an 'aabb' hit.
959961 hitObject.SetShaderTableIndex( 1 );
960- dx::HitObject::Invoke( hitObject, payload );
962+ }
963+
964+ // Invoke hit/miss for aabb
965+ dx::HitObject::Invoke( hitObject, payload );
966+
967+ if (hitObject.IsHit())
968+ {
961969 // Poison the test data if GetShaderTableIndex does not match SetShaderTableIndex.
962970 if (hitObject.GetShaderTableIndex() != 1)
963971 payload.visited = 12345;
@@ -970,60 +978,44 @@ void raygen()
970978[shader("miss")]
971979void miss(inout PerRayData payload)
972980{
973- payload.visited |= 1U;
981+ if ((payload.visited & 4U) == 0)
982+ payload.visited |= 4U; // First 'miss' invocation
983+ else
984+ payload.visited |= 8U; // Second 'miss' invocation
974985}
975986
976987// Triangles
977988[shader("anyhit")]
978989void anyhit(inout PerRayData payload, in Attrs attrs)
979990{
980- payload.visited |= 2U;
981991 AcceptHitAndEndSearch();
982992}
983993
994+ // Triangle closest hit
984995[shader("closesthit")]
985996void closesthit(inout PerRayData payload, in Attrs attrs)
986997{
987- payload.visited |= 4U;
998+ payload.visited |= 1U;
999+ }
1000+
1001+ // AABB closest hit
1002+ [shader("closesthit")]
1003+ void chAABB(inout PerRayData payload, in Attrs attrs)
1004+ {
1005+ payload.visited |= 2U;
9881006}
9891007
9901008// Procedural
9911009[shader("intersection")]
9921010void intersection()
9931011{
994- // Intersection with circle on a plane (base, n, radius)
995- // hitPos is intersection point with plane (base, n)
996- float3 base = {0.0f,0.0f,0.5f};
997- float3 n = normalize(float3(0.2f,0.2f,0.5f));
998- float radius = 150.f;
999- // Plane hit
1000- float t = dot(n, base - ObjectRayOrigin()) / dot(n, ObjectRayDirection());
1001- if (t > RayTCurrent() || t < RayTMin()) {
1002- return;
1003- }
1004- float3 hitPos = ObjectRayOrigin() + t * ObjectRayDirection();
1005- float3 relHitPos = hitPos - base;
1006- // Circle hit
1007- float hitDist = length(relHitPos);
1008- if (hitDist > radius)
1009- return;
1010-
1011- CustomAttrs attrs;
1012- attrs.dist = hitDist;
1013- ReportHit(t, 1, attrs);
1012+ // UNUSED
10141013}
10151014
10161015[shader("anyhit")]
10171016void ahAABB(inout PerRayData payload, in CustomAttrs attrs)
10181017{
1019- payload.visited |= 8U;
1020- IgnoreHit();
1021- }
1022-
1023- [shader("closesthit")]
1024- void chAABB(inout PerRayData payload, in Attrs attrs)
1025- {
1026- payload.visited |= 16U;
1018+ // UNUSED
10271019}
10281020
10291021)" ;
@@ -1044,12 +1036,12 @@ void chAABB(inout PerRayData payload, in Attrs attrs)
10441036 std::map<int , int > Histo;
10451037 for (int Val : TestData)
10461038 ++Histo[Val];
1047- VERIFY_ARE_EQUAL (Histo.size (), 3 );
1048- VERIFY_ARE_EQUAL (Histo[0 ], 3696 ); // Miss (not Invoked)
1049- VERIFY_ARE_EQUAL (Histo[8 ], 334 ); // AABB ignored hit -> (Miss not Invoked)
1039+
1040+ VERIFY_ARE_EQUAL (Histo.size (), 2 );
10501041 VERIFY_ARE_EQUAL (
1051- Histo[26 ],
1052- 66 ); // AABB ignored hit + TriHit -> setSBT(1) -> chAABB invoked
1042+ Histo[3 ],
1043+ 66 ); // 'closesthit' invoked at index 0, then 'chAABB' invoked at index 1
1044+ VERIFY_ARE_EQUAL (Histo[12 ], 4030 ); // Miss shader invoked twice
10531045}
10541046
10551047TEST_F (ExecutionTest, SERLoadLocalRootTableConstantTest) {
0 commit comments