Skip to content

Commit c6fce45

Browse files
committed
Fixed SERShaderTableIndexTest (not relying on is/ah any longer)
1 parent e1df92b commit c6fce45

1 file changed

Lines changed: 32 additions & 40 deletions

File tree

tools/clang/unittests/HLSLExec/ExecutionTest_SER.h

Lines changed: 32 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -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")]
971979
void 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")]
978989
void anyhit(inout PerRayData payload, in Attrs attrs)
979990
{
980-
payload.visited |= 2U;
981991
AcceptHitAndEndSearch();
982992
}
983993
994+
// Triangle closest hit
984995
[shader("closesthit")]
985996
void 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")]
9921010
void 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")]
10171016
void 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

10551047
TEST_F(ExecutionTest, SERLoadLocalRootTableConstantTest) {

0 commit comments

Comments
 (0)