yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Harsh Aggarwal (NVIDIA)Fix intrinsic LoadLocalRootTableConstant for optix (#7949)e595743b5

master
5.3 KiB177 linesraw
1// optix-ser.slang
2
3
4//TEST:SIMPLE(filecheck=CHECK): -target cuda -entry rayGenerationMain -stage raygeneration
5//TEST:SIMPLE(filecheck=CHECK-PTX): -target ptx -Xnvrtc -I"./external/optix-dev/include/" -entry rayGenerationMain -stage raygeneration
6
7//TEST_INPUT: set scene = AccelerationStructure
8uniform RaytracingAccelerationStructure scene;
9
10//TEST_INPUT:set outputBuffer = out ubuffer(data=[0, 0, 0, 0], stride=4)
11RWStructuredBuffer<uint> outputBuffer;
12
13struct SomeValues
14{
15    int a;
16    float b;
17};
18
19uint calcValue(HitObject hit)
20{
21    uint r = 0;
22
23    // CHECK: slangOptixHitObjectIsHit
24    if (hit.IsHit())
25    {
26        // CHECK: slangOptixHitObjectGetInstanceIndex
27        uint instanceIndex = hit.GetInstanceIndex();
28        // CHECK: slangOptixHitObjectGetInstanceId
29        uint instanceID = hit.GetInstanceID();
30        // CHECK: slangOptixHitObjectGetSbtGASIndex
31        uint geometryIndex = hit.GetGeometryIndex();
32
33        // CHECK: slangOptixHitObjectGetPrimitiveIndex
34        uint primitiveIndex = hit.GetPrimitiveIndex();
35        // CHECK: slangOptixHitObjectGetClusterId
36        int clusterID = hit.GetClusterID();
37        // CHECK: slangOptixHitObjectGetSbtRecordIndex
38        uint shaderTableIndex = hit.GetShaderTableIndex();
39        // spriv and glsl lack these methods
40        // CHECK: slangOptixHitObjectSetSbtRecordIndex({{.*}}0U)
41        uint setShaderTableIndex = hit.SetShaderTableIndex(0);
42
43        // CHECK: optixHitObjectGetSbtDataPointer()+(0U)
44        uint ialbedo = hit.LoadLocalRootTableConstant(0);
45
46        // CHECK: optixHitObjectGetAttribute
47        SomeValues objSomeValues = hit.GetAttributes<SomeValues>();
48
49        r += instanceIndex;
50        r += instanceID;
51        r += geometryIndex;
52        r += primitiveIndex;
53        r += objSomeValues.a;
54        r += clusterID;
55        r += shaderTableIndex;
56        r += setShaderTableIndex;
57        r += ialbedo;
58    }
59
60    return r;
61}
62
63void rayGenerationMain()
64{
65    // CHECK: optixGetLaunchIndex
66    int2 launchID = int2(DispatchRaysIndex().xy);
67    // CHECK: optixGetLaunchDimensions
68    int2 launchSize = int2(DispatchRaysDimensions().xy);
69
70    int idx = launchID.x;
71
72    SomeValues someValues = { idx, idx * 2.0f };
73
74    RayDesc ray;
75    ray.Origin = float3(idx, 0, 0);
76    ray.TMin = 0.01f;
77    ray.Direction = float3(0, 1, 0);
78    ray.TMax = 1e4f;
79
80    RAY_FLAG rayFlags =
81        RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH | RAY_FLAG_CULL_BACK_FACING_TRIANGLES;
82    uint instanceInclusionMask = 0xff;
83    uint rayContributionToHitGroupIndex = 0;
84    uint multiplierForGeometryContributionToHitGroupIndex = 4;
85    uint missShaderIndex = 0;
86    // CHECK: optixTraverse
87    // CHECK-PTX:_optix_hitobject_traverse
88    HitObject hit = HitObject::TraceRay(
89        scene,
90        rayFlags,
91        instanceInclusionMask,
92        rayContributionToHitGroupIndex,
93        multiplierForGeometryContributionToHitGroupIndex,
94        missShaderIndex,
95        ray,
96        someValues);
97
98    // CHECK-DAG: optixReorder();
99    // CHECK-DAG: optixReorder((uint(idx_0 & int(3))), (2U));
100    // CHECK-DAG: optixReorder(uint(idx_0 & int(1)), 1U);
101    ReorderThread(hit);
102    ReorderThread(hit, uint(idx & 3), 2);
103    ReorderThread(uint(idx & 1), 1);
104
105    outputBuffer[idx] = calcValue(hit);
106    HitObject miss[2];
107    // CHECK: optixMakeMissHitObject(0U, ray_0, &miss_0[int(0)]);
108    miss[0] = HitObject::MakeMiss(0u, ray);
109    // CHECK: optixMakeMissHitObject(0U, ray_0, 1.0f, &miss_0[int(1)]);
110    miss[1] = HitObject::MakeMotionMiss(0u, ray, 1.f);
111
112    uint hitGroupRecordIndex = 0;
113    uint instanceIndex = 0xff;
114    uint geometryIndex = 0;
115    uint primitiveIndex = 0;
116    uint hitKind = 0;
117    BuiltInTriangleIntersectionAttributes attr = { 0.01f, 0.2f };
118
119    // CHECK: optixMakeHitObject
120    HitObject hitObj = HitObject::MakeHit(
121        hitGroupRecordIndex,
122        scene,
123        instanceIndex,
124        geometryIndex,
125        primitiveIndex,
126        hitKind,
127        ray,
128        attr);
129    // CHECK: slangOptixMakeNopHitObject
130    HitObject nopObj = HitObject::MakeNop();
131    // CHECK: slangOptixHitObjectIsNop
132    outputBuffer[idx] = uint(nopObj.IsNop());
133
134    outputBuffer[idx] += calcValue(hit);
135    outputBuffer[idx] += calcValue(miss[0]);
136    outputBuffer[idx] += calcValue(miss[1]);
137    outputBuffer[idx] += calcValue(hitObj);
138    outputBuffer[idx] += calcValue(nopObj);
139
140    // Change the payload
141    SomeValues otherValues = { idx * -2, idx * 8.0f };
142
143    // CHECK: optixInvoke
144    HitObject::Invoke(scene, hit, otherValues);
145    HitObject motionHitObj[2];
146    // CHECK: optixMakeHitObject
147    motionHitObj[0] = HitObject::MakeMotionHit(
148        scene,
149        instanceIndex,
150        geometryIndex,
151        primitiveIndex,
152        hitKind,
153        rayContributionToHitGroupIndex,
154        multiplierForGeometryContributionToHitGroupIndex,
155        ray,
156        0.f,
157        attr);
158    // CHECK: optixMakeHitObject
159    motionHitObj[1] = HitObject::MakeMotionHit(
160        hitGroupRecordIndex,
161        scene,
162        instanceIndex,
163        geometryIndex,
164        primitiveIndex,
165        hitKind,
166        ray,
167        0.f,
168        attr);
169    outputBuffer[idx] += calcValue(motionHitObj[0]);
170    outputBuffer[idx] += calcValue(motionHitObj[1]);
171
172    // CHECK: optixHitObjectGetRayDesc
173    RayDesc rayD = hit.GetRayDesc();
174
175    outputBuffer[idx] += uint(rayD.TMin > 0);
176    outputBuffer[idx] += uint(rayD.TMax < ray.TMin);
177}