yum-mirror/slang

Making it easier to work with shaders

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

James Helferty (NVIDIA)render-test: Change D3D12 default to sm_6_5 (#8320)f02b08490

master
3.1 KiB98 linesraw
1// hit-object-trace-ray.slang
2
3//TEST:SIMPLE: -target dxil -entry rayGenerationMain -stage raygeneration -profile sm_6_5 -DNV_SHADER_EXTN_SLOT=u0 
4//TEST:SIMPLE(filecheck=SPIRV): -target spirv -entry rayGenerationMain -stage raygeneration -profile sm_6_5 -line-directive-mode none 
5//TEST:SIMPLE(filecheck=SPIRV): -target spirv -entry rayGenerationMain -stage raygeneration -emit-spirv-directly
6
7//TEST:SIMPLE(filecheck=CHECK): -target cuda -entry rayGenerationMain -stage raygeneration
8
9//DISABLE_TEST(compute):COMPARE_COMPUTE:-d3d12 -output-using-type -profile sm_6_6 -render-feature ray-query
10//DISABLE_TEST(compute):COMPARE_COMPUTE:-vk -output-using-type -render-feature ray-query
11
12//TEST_INPUT: set scene = AccelerationStructure
13uniform RaytracingAccelerationStructure scene;
14
15//TEST_INPUT:set outputBuffer = out ubuffer(data=[0, 0, 0, 0], stride=4)
16RWStructuredBuffer<uint> outputBuffer;
17
18struct SomeValues
19{
20    int a;
21    float b;
22};
23
24uint calcValue(HitObject hit)
25{
26    uint r = 0;
27    
28    if (hit.IsHit())
29    {
30        uint instanceIndex = hit.GetInstanceIndex();
31        uint instanceID = hit.GetInstanceID();
32        uint geometryIndex = hit.GetGeometryIndex();
33        uint primitiveIndex = hit.GetPrimitiveIndex();
34        int clusterID = hit.GetClusterID();
35        float4 posRadius = hit.GetSpherePositionAndRadius();
36        float2x4 positionsRadii = hit.GetLssPositionsAndRadii();
37        uint isSphereHit = uint(hit.IsSphereHit());
38        uint isLssHit = uint(hit.IsLssHit());
39
40        SomeValues objSomeValues = hit.GetAttributes<SomeValues>();
41        
42        r += instanceIndex;
43        r += instanceID;
44        r += geometryIndex;
45        r += primitiveIndex;
46        r += objSomeValues.a;
47        r += clusterID;
48
49        r += int(posRadius.x);
50        r += int(posRadius.y);
51        r += int(posRadius.z);
52        r += int(posRadius.w);
53        
54        r += int(positionsRadii[0].x);
55        r += int(positionsRadii[0].y);
56        r += int(positionsRadii[0].z);
57        r += int(positionsRadii[0].w);
58        
59        r += isSphereHit;
60        r += isLssHit;
61    }
62    
63    return r;
64}
65
66void rayGenerationMain() 
67{
68    int2 launchID = int2(DispatchRaysIndex().xy);
69    int2 launchSize = int2(DispatchRaysDimensions().xy);
70
71    int idx = launchID.x;
72    
73    SomeValues someValues = { idx, idx * 2.0f };
74
75    RayDesc ray;  
76    ray.Origin = float3(idx, 0, 0);
77    ray.TMin = 0.01f;
78    ray.Direction = float3(0, 1, 0);
79    ray.TMax = 1e4f;
80    
81    RAY_FLAG rayFlags = 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    // SPIRV: OpHitObjectTraceRayNV
87    // CHECK: optixTraverse
88    HitObject hit = HitObject::TraceRay(scene, 
89        rayFlags, 
90        instanceInclusionMask, 
91        rayContributionToHitGroupIndex, 
92        multiplierForGeometryContributionToHitGroupIndex, 
93        missShaderIndex, 
94        ray, 
95        someValues);
96    
97    outputBuffer[idx] = calcValue(hit);
98}