yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
e595743b5
master
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}