This issue tracks expanding the inline raytracing (RayQuery) test suite. The bring-up PRs introduce a baseline of three scenarios under test/Feature/InlineRT/ — a single-triangle hit, an indexed triangle hit, and instance selection via translated transforms. The list below walks the HLSL inline-RT spec surface — limited to behavior observable from a shader, since that is what this suite tests — and notes what becomes testable after those PRs land versus what still needs further framework / YAML work.
Bring-up PRs (foundation for everything below)
Legend:
RayQuery API surface (cs_6_5)
TraceRayInline parameters
Template <RayFlags> (compile-time)
Candidate-path methods (inside Proceed() loop)
Committed-hit methods
Ray-side methods
BLAS geometry coverage (shader-visible facets)
TLAS instance coverage (shader-visible facets)
Shader control flow
Numerical / vendor edge behavior (shader-observable)
Stages other than compute
Inline RT is allowed in every shader stage from SM 6.5 onward. Adding coverage needs the AS-binding plumbing on those pipelines, but the framework already supports each stage individually.
Framework / YAML follow-ups
Listed inline above where they block tests; aggregated here for the framework worklist. Limited to gaps that block a shader-visible test.
This issue tracks expanding the inline raytracing (
RayQuery) test suite. The bring-up PRs introduce a baseline of three scenarios undertest/Feature/InlineRT/— a single-triangle hit, an indexed triangle hit, and instance selection via translated transforms. The list below walks the HLSL inline-RT spec surface — limited to behavior observable from a shader, since that is what this suite tests — and notes what becomes testable after those PRs land versus what still needs further framework / YAML work.Bring-up PRs (foundation for everything below)
.testfilesLegend:
RayQuery API surface (
cs_6_5)TraceRayInlineparametersRAY_FLAG_NONE, default mask0xFF👀RayFlagsargument != template flags (runtime-OR with template) — 👍InstanceInclusionMaskfiltering — TLAS instances with variousInstanceMaskvalues, query with overlapping/disjoint masks 👀instance-mask.testin Add InstanceInclusionMask filtering test #1274RayDescwith non-axis-aligned direction (no auto-normalization) — 👍RayDescwithTMin > 0excluding a near hit 👀tmin-tmax-clip.testin Cover basicRayQuerymethods on the single-triangle BLAS #1271RayDescwithTMaxclipping a far hit 👀tmin-tmax-clip.testin Cover basicRayQuerymethods on the single-triangle BLAS #1271TraceRayInlinecalls on the sameRayQueryobject — 👍RayQuery<Flags>objects in the same shader — 👍Template
<RayFlags>(compile-time)RAY_FLAG_FORCE_OPAQUE(skips any-hit / non-opaque candidate path) — 👍RAY_FLAG_FORCE_NON_OPAQUE(forces candidate path even for opaque geom) — 👍RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH— verify singleProceed()iteration stops on first hit — 👍RAY_FLAG_CULL_BACK_FACING_TRIANGLES— 👍RAY_FLAG_CULL_FRONT_FACING_TRIANGLES— 👍RAY_FLAG_CULL_OPAQUE— 👍RAY_FLAG_CULL_NON_OPAQUE— 👍RAY_FLAG_SKIP_TRIANGLES(mixed BLAS, triangles skipped, AABBs hit) — 👍 (procedural path wired in Wire AABB/procedural geometry through the Pipeline-level AS builder #1289)RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES— 👍 (procedural path wired in Wire AABB/procedural geometry through the Pipeline-level AS builder #1289)CULL_BACK_FACING | ACCEPT_FIRST_HIT_AND_END_SEARCH) — 👍Candidate-path methods (inside
Proceed()loop)CandidateType()—CANDIDATE_NON_OPAQUE_TRIANGLEvsCANDIDATE_PROCEDURAL_PRIMITIVE— 🏗️ (non-opaque + procedural)CandidateProceduralPrimitiveNonOpaque()— 🏗️CandidateTriangleRayT()— 👍 (needs non-opaque geometry)CandidateInstanceIndex()/CandidateInstanceID()— 👍CandidateInstanceContributionToHitGroupIndex()— 👍 (YAML field added in Add InstanceContributionToHitGroupIndex YAML field and shader query #1286)CandidateGeometryIndex()(multi-geometry BLAS) — 🏗️ (YAML: multi-geom)CandidatePrimitiveIndex()— 👍CandidateObjectRayOrigin()/CandidateObjectRayDirection()— 👍CandidateObjectToWorld3x4()/CandidateObjectToWorld4x3()— 👍CandidateWorldToObject3x4()/CandidateWorldToObject4x3()— 👍CandidateTriangleFrontFace()— 👍CandidateTriangleBarycentrics()(verify u/v at known points) — 👍CommitNonOpaqueTriangleHit()accept/reject patterns — 👍CommitProceduralPrimitiveHit(t)accept/reject — 🏗️Committed-hit methods
CommittedStatus()—COMMITTED_TRIANGLE_HIT👀CommittedStatus()—COMMITTED_NOTHING(miss path) 👀miss-status.testin Cover basicRayQuerymethods on the single-triangle BLAS #1271CommittedStatus()—COMMITTED_PROCEDURAL_PRIMITIVE_HIT👀aabb-procedural.testin Wire AABB/procedural geometry through the Pipeline-level AS builder #1289CommittedRayT()— verify exacttfor axis-aligned ray-plane hit 👀ray-t.testin Cover basicRayQuerymethods on the single-triangle BLAS #1271CommittedInstanceIndex()(TLAS position) vsCommittedInstanceID()(user data) on shuffled instance order — 👍CommittedInstanceID()👀CommittedInstanceContributionToHitGroupIndex()👀instance-contribution.testin Add InstanceContributionToHitGroupIndex YAML field and shader query #1286CommittedGeometryIndex()— 🏗️ (YAML: multiple geoms per BLAS)CommittedPrimitiveIndex()— multi-triangle BLAS, primitive lookup 👀primitive-index.testin Add CommittedPrimitiveIndex test on a multi-triangle BLAS #1272CommittedObjectRayOrigin()/CommittedObjectRayDirection()— verify transform of world-space ray into instance space — 👍CommittedObjectToWorld3x4()/4x3()round-trip — 👍CommittedWorldToObject3x4()/4x3()— 👍CommittedTriangleFrontFace()(CW vs CCW winding) — 👍CommittedTriangleBarycentrics()— known centroid/edge 👀barycentrics.testin Cover basicRayQuerymethods on the single-triangle BLAS #1271Ray-side methods
RayFlags()👀world-ray-echo.testin Cover basicRayQuerymethods on the single-triangle BLAS #1271WorldRayOrigin()/WorldRayDirection()(echo input) 👀world-ray-echo.testin Cover basicRayQuerymethods on the single-triangle BLAS #1271RayTMin()👀world-ray-echo.testin Cover basicRayQuerymethods on the single-triangle BLAS #1271Abort()mid-Proceed()(no commit afterwards) — 👍BLAS geometry coverage (shader-visible facets)
RGB32Float👀triangle-setup.testin Bind acceleration structures and enable the InlineRT tests #1245Uint32indices 👀indexed-triangle-setup.testin Bind acceleration structures and enable the InlineRT tests #1245Uint16index buffer — verify primitive lookup unchanged — 👍RG32Float(z=0),RGBA16Float,RG16Float,R10G10B10A2_UNORM,RGBA8_SNORM(precision of barycentrics / object-space ray vsRGB32Float) — 👍Transform3x4(BLAS-side bake; visible viaObject*queries) 👀geometry-transform.testin Add per-geometry Transform on TriangleGeometryDesc #1288*GeometryIndex— 🏗️Opaque: false) — drives candidate path — 🏗️ (YAML field)aabb-procedural.testin Wire AABB/procedural geometry through the Pipeline-level AS builder #1289TLAS instance coverage (shader-visible facets)
InstanceID👀multi-instance.testin Bind acceleration structures and enable the InlineRT tests #1245Object*/*ToWorld/*ToObject) — 👍WorldToObjectinverse) — 👍InstanceMaskfiltered byInstanceInclusionMask👀instance-mask.testin Add InstanceInclusionMask filtering test #1274InstanceContributionToHitGroupIndex👀instance-contribution.testin Add InstanceContributionToHitGroupIndex YAML field and shader query #1286TRIANGLE_CULL_DISABLEoverrides ray cull flags — 👍 (YAML field added in Add per-instance InstanceFlags YAML field and front-CCW test #1287)TRIANGLE_FRONT_COUNTERCLOCKWISEflips*TriangleFrontFace👀instance-flags.testin Add per-instance InstanceFlags YAML field and front-CCW test #1287FORCE_OPAQUE/FORCE_NON_OPAQUEoverrides — 👍 (YAML field added in Add per-instance InstanceFlags YAML field and front-CCW test #1287)Shader control flow
primitive-index.testin Add CommittedPrimitiveIndex test on a multi-triangle BLAS #1272RayQueryas a function parameter (inout) — 👍RayQueryas a struct member — 👍RayQuery(second trace inside aProceed()loop) — 🏗️ (non-opaque)RayQueryobjects with different template flags in the same shader — 👍TraceRayInline(skip on lane mask) — 👍Proceed()with explicitwhile (Q.Proceed())instead of single-shot — 👍RayQueryfor sequential rays without dynamic state leak — 👍Numerical / vendor edge behavior (shader-observable)
TMin == hit distance(boundary inclusive vs exclusive) — 👍TMax == hit distance(boundary inclusive vs exclusive) — 👍*TriangleFrontFaceandCULL_*ray flags) — 👍Stages other than compute
Inline RT is allowed in every shader stage from SM 6.5 onward. Adding coverage needs the AS-binding plumbing on those pipelines, but the framework already supports each stage individually.
RayQueryfrom a pixel shader — 🏗️ (PS-side AS binding)RayQueryfrom a vertex shader — 🏗️RayQueryfrom a mesh shader — 🏗️RayQueryfrom a hull / domain / geometry shader — 🏗️Framework / YAML follow-ups
Listed inline above where they block tests; aggregated here for the framework worklist. Limited to gaps that block a shader-visible test.
InstanceFlagsfield onAccelerationStructureInstance👀 Add per-instance InstanceFlags YAML field and front-CCW test #1287InstanceContributionToHitGroupIndex👀 Add InstanceContributionToHitGroupIndex YAML field and shader query #1286TransformonTriangleGeometryDesc(per-geometry bake) 👀 Add per-geometry Transform on TriangleGeometryDesc #1288Triangles:is already a list, but exercise it from a shader)