summaryrefslogtreecommitdiffstats
path: root/tests/vkray/closesthit.slang
blob: 9d767ccae6d7739218457a55e900625dcde9bc79 (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
// closesthit.slang
//TEST:SIMPLE(filecheck=CHECK): -profile glsl_460+GL_EXT_ray_tracing -stage closesthit -entry main -target spirv-assembly
//TEST:SIMPLE(filecheck=CHECK): -stage closesthit -entry main -target spirv-assembly -emit-spirv-directly

struct ReflectionRay
{
    float4 color;
    float3 dummyOut;
};

StructuredBuffer<float4> colors;

layout(shaderRecordNV)
cbuffer ShaderRecord
{
   uint shaderRecordID;
}

void main(
   BuiltInTriangleIntersectionAttributes attributes,
   in out ReflectionRay                  ioPayload)
{
   uint materialID = (InstanceIndex() << 1)
      + InstanceID()
      + PrimitiveIndex()
      + HitKind()
      + shaderRecordID;

   float4 color = colors[materialID];

   color *= RayTCurrent() - RayTMin();

   ioPayload.color = color;

   uint index = 0U;
   ioPayload.dummyOut = HitTriangleVertexPosition(index);

   index = 1U;
   ioPayload.dummyOut += HitTriangleVertexPosition(index);

   index = 2U;
   ioPayload.dummyOut += HitTriangleVertexPosition(index);
}

// CHECK: OpCapability RayTracing
// CHECK: OpCapability RayTracingPositionFetchKHR
// CHECK: OpEntryPoint ClosestHit{{NV|KHR}} %main "main"
// CHECK-DAG: OpDecorate %[[INSTANCE_ID:[A-Za-z0-9_]+]] BuiltIn InstanceId
// CHECK-DAG: OpDecorate %[[INSTANCE_INDEX:[A-Za-z0-9_]+]] BuiltIn InstanceCustomIndex{{NV|KHR}}
// CHECK-DAG: OpDecorate %{{.*}} BuiltIn PrimitiveId
// CHECK-DAG: OpDecorate %{{.*}} BuiltIn HitKind{{NV|KHR}}
// CHECK-DAG: OpDecorate %{{.*}} BuiltIn RayTmax{{NV|KHR}}
// CHECK-DAG: OpDecorate %{{.*}} BuiltIn RayTmin{{NV|KHR}}
// CHECK-DAG: OpDecorate %{{.*}} BuiltIn HitTriangleVertexPositionsKHR
// CHECK-DAG: %ShaderRecord{{.*}} = OpVariable %_ptr_ShaderRecordBuffer{{.*}} ShaderRecordBuffer{{NV|KHR}}
// CHECK-DAG: %{{.*}} = OpVariable %_ptr_IncomingRayPayload{{NV|KHR}}_ReflectionRay{{.*}} IncomingRayPayload{{NV|KHR}}
// CHECK-DAG: %{{.*}} = OpLoad %{{u?}}int %[[INSTANCE_ID]]
// CHECK-DAG: %{{.*}} = OpLoad %{{u?}}int %[[INSTANCE_INDEX]]
// CHECK-DAG: %{{.*}} = Op{{.*}}AccessChain %_ptr_ShaderRecordBuffer{{NV|KHR}}_uint %ShaderRecord{{.*}} %int_0
// CHECK-DAG: %{{.*}} = Op{{.*}}AccessChain %_ptr_IncomingRayPayload{{NV|KHR}}_v4float %{{.*}} %int_0
// CHECK-DAG: %{{.*}} = Op{{.*}}AccessChain %_ptr_Input_v3float %{{.*}} %{{u?}}int_0
// CHECK-DAG: %{{.*}} = Op{{.*}}AccessChain %_ptr_Input_v3float %{{.*}} %{{u?}}int_1
// CHECK-DAG: %{{.*}} = Op{{.*}}AccessChain %_ptr_Input_v3float %{{.*}} %{{u?}}int_2