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
2.6 KiB100 linesraw
1// hit-object-array.slang
2
3//TEST:SIMPLE: -target dxil -entry rayGenerationMain -stage raygeneration -profile sm_6_5 -DNV_SHADER_EXTN_SLOT=u0 
4
5/* This doesn't work correctly currently because it produces assignments to the HitObject array in GLSL output. 
6But that is not valid for hitObjectNV int he extension */
7
8//DISABLE_TEST:SIMPLE: -target glsl -entry rayGenerationMain -stage raygeneration -profile sm_6_5 -line-directive-mode none 
9
10//DISABLE_TEST(compute):COMPARE_COMPUTE:-d3d12 -output-using-type -profile sm_6_5 -render-feature ray-query
11//DISABLE_TEST(compute):COMPARE_COMPUTE:-vk -output-using-type -render-feature ray-query
12
13//TEST_INPUT: set scene = AccelerationStructure
14uniform RaytracingAccelerationStructure scene;
15
16//TEST_INPUT:set outputBuffer = out ubuffer(data=[0, 0, 0, 0], stride=4)
17RWStructuredBuffer<uint> outputBuffer;
18
19struct SomeValues
20{
21    int a;
22    float b;
23};
24
25uint calcValue(HitObject hit)
26{
27    uint r = 0;
28    
29    if (hit.IsHit())
30    {
31        uint instanceIndex = hit.GetInstanceIndex();
32        uint instanceID = hit.GetInstanceID();
33        uint geometryIndex = hit.GetGeometryIndex();
34        uint primitiveIndex = hit.GetPrimitiveIndex();
35        uint hitKind = hit.GetHitKind();
36        
37        r += hitKind;
38        r += instanceIndex;
39        r += instanceID;
40        r += geometryIndex;
41        r += primitiveIndex;
42
43        RayDesc ray = hit.GetRayDesc();
44
45        r += uint(ray.TMin > 0);
46        r += uint(ray.TMax < ray.TMin);
47        
48        SomeValues objSomeValues = hit.GetAttributes<SomeValues>();
49        
50        r += objSomeValues.a;
51    }
52    else if (hit.IsMiss())
53    {
54        r += 1;
55    }
56    
57    return r;
58}
59
60void rayGenerationMain() 
61{
62    int2 launchID = int2(DispatchRaysIndex().xy);
63    int2 launchSize = int2(DispatchRaysDimensions().xy);
64
65    int idx = launchID.x;
66
67    SomeValues someValues = { idx, idx * 2.0f };
68
69    RayDesc ray;  
70    ray.Origin = float3(idx, 0, 0);
71    ray.TMin = 0.01f;
72    ray.Direction = float3(0, 1, 0);
73    ray.TMax = 1e4f;
74    
75    uint hitKind = 0;
76
77    HitObject hitObjs[2];
78    
79    hitObjs[0] = HitObject::MakeHit(0, scene, idx, idx * 2, idx * 3, hitKind, ray, someValues);
80   
81    {
82        int rayContributionToHitGroupIndex = 0;
83        int multiplierForGeometryContributionToHitGroupIndex = 4;
84        
85        hitObjs[1] = HitObject::MakeHit(scene, 
86            idx, 
87            idx * 2, 
88            idx * 3, 
89            hitKind, 
90            rayContributionToHitGroupIndex, 
91            multiplierForGeometryContributionToHitGroupIndex, 
92            ray, 
93            someValues);
94    }
95
96
97    uint r = calcValue(hitObjs[0]) + calcValue(hitObjs[1]);
98      
99    outputBuffer[idx] = r;
100}