summaryrefslogtreecommitdiffstats
path: root/tests/bugs/ray-query-in-generic.slang
blob: b10fec7b9c13e962a438eceaa37a832a0f8043b8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//TEST(compute):COMPARE_COMPUTE:-d3d12 -output-using-type -profile sm_6_5 -render-feature ray-query
//TEST(compute):COMPARE_COMPUTE:-vk -output-using-type -render-feature ray-query

//TEST_INPUT: set scene = AccelerationStructure
uniform RaytracingAccelerationStructure scene;

struct Ray
{
    float3 origin;
    float tMin;
    float3 dir;
    float tMax;

    /**
     * Initializes a ray.
     */
    __init(float3 origin, float3 dir, float tMin = 0.f, float tMax = 10000.0)
    {
        this.origin = origin;
        this.dir = dir;
        this.tMin = tMin;
        this.tMax = tMax;
    }

    /**
     * Convert to DXR RayDesc.
     */
    RayDesc toRayDesc() { return { origin, tMin, dir, tMax }; }

    /**
     * Evaluate position on the ray.
     * @param[in] t Ray parameter.
     * @return Returns evaluated position.
     */
    float3 eval(float t) { return origin + t * dir; }
};

uint getCommittedStatus<let Flags : int>(RayQuery<Flags> q)
{
    return q.CommittedStatus();
}

bool traceSceneVisibilityRayImpl<let Flags : int>(const bool useAlphaTest, inout RayQuery<Flags> q, const Ray ray, uint rayFlags, uint instanceInclusionMask)
{
    var rayDesc = ray.toRayDesc();
    q.TraceRayInline(
        scene,
        rayFlags,
        0xff,
        rayDesc);
    q.Proceed();
    if (getCommittedStatus(q) == COMMITTED_TRIANGLE_HIT)
    {
        q.CommittedRayT();
        return true;
    }
    return false;
}

bool traceSceneVisibilityRay<let UseAlphaTest : int>(const Ray ray, uint rayFlags, uint instanceInclusionMask)
{
    RayQuery rayQuery;
    return traceSceneVisibilityRayImpl(false, rayQuery, ray, rayFlags, instanceInclusionMask);
}

//TEST_INPUT:set outputBuffer = out ubuffer(data=[0], stride=4)
RWStructuredBuffer<float> outputBuffer;

[shader("compute")]
[numthreads(1, 1, 1)]
void computeMain(
    uint3 threadIdx: SV_DispatchThreadID)
{
    Ray ray = Ray(float3(0.1, 0.1, 0.0), float3(0, 0, 1), 0.1);
    if (traceSceneVisibilityRay<0>(ray, 0, 0xffff))
        outputBuffer[threadIdx.x] = 1.0;
}