summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/vkray/anyhit.slang41
-rw-r--r--tests/vkray/anyhit.slang.glsl58
-rw-r--r--tests/vkray/closesthit.slang25
-rw-r--r--tests/vkray/closesthit.slang.glsl46
-rw-r--r--tests/vkray/intersection.slang47
-rw-r--r--tests/vkray/intersection.slang.glsl86
-rw-r--r--tests/vkray/miss.slang11
-rw-r--r--tests/vkray/miss.slang.glsl18
-rw-r--r--tests/vkray/raygen.slang116
-rw-r--r--tests/vkray/raygen.slang.glsl200
10 files changed, 648 insertions, 0 deletions
diff --git a/tests/vkray/anyhit.slang b/tests/vkray/anyhit.slang
new file mode 100644
index 000000000..6959efc9c
--- /dev/null
+++ b/tests/vkray/anyhit.slang
@@ -0,0 +1,41 @@
+// closesthit.slang
+//TEST:CROSS_COMPILE: -profile sm_6_3 -stage anyhit -entry main -target spirv-assembly
+
+struct SphereHitAttributes
+{
+ float3 normal;
+};
+
+
+struct ShadowRay
+{
+ float4 hitDistance;
+};
+
+struct Params
+{
+ Texture2D<float> alphaMap;
+ SamplerState sampler;
+ int mode;
+}
+ParameterBlock<Params> gParams;
+
+void main(
+ SphereHitAttributes attributes,
+ in out ShadowRay ioPayload)
+{
+ if(gParams.mode)
+ {
+ float val = gParams.alphaMap.SampleLevel(
+ gParams.sampler,
+ attributes.normal.xy, 0);
+ if(val > 0)
+ {
+ AcceptHitAndEndSearch();
+ }
+ else
+ {
+ IgnoreHit();
+ }
+ }
+}
diff --git a/tests/vkray/anyhit.slang.glsl b/tests/vkray/anyhit.slang.glsl
new file mode 100644
index 000000000..7fb9ac553
--- /dev/null
+++ b/tests/vkray/anyhit.slang.glsl
@@ -0,0 +1,58 @@
+// anyhit.slang.glsl
+#version 460
+#extension GL_NVX_raytracing : require
+
+struct Params_0
+{
+ int mode_0;
+};
+
+layout(binding = 0)
+layout(std140) uniform _S1
+{
+ Params_0 gParams_0;
+};
+
+layout(binding = 1)
+uniform texture2D gParams_alphaMap_0;
+
+layout(binding = 2)
+uniform sampler gParams_sampler_0;
+
+struct SphereHitAttributes_0
+{
+ vec3 normal_0;
+};
+hitAttributeNVX SphereHitAttributes_0 _S2;
+
+struct ShadowRay_0
+{
+ vec4 hitDistance_0;
+};
+rayPayloadInNVX ShadowRay_0 _S3;
+
+void main()
+{
+ SphereHitAttributes_0 _S4 = _S2;
+
+ if(bool(gParams_0.mode_0))
+ {
+ float val_0 = textureLod(
+ sampler2D(gParams_alphaMap_0, gParams_sampler_0),
+ _S4.normal_0.xy,
+ float(0)).x;
+
+
+ if(val_0 > float(0))
+ {
+ terminateRayNVX();
+ }
+ else
+ {
+ ignoreIntersectionNVX();
+ }
+ }
+
+ return;
+}
+
diff --git a/tests/vkray/closesthit.slang b/tests/vkray/closesthit.slang
new file mode 100644
index 000000000..12f2dcd4a
--- /dev/null
+++ b/tests/vkray/closesthit.slang
@@ -0,0 +1,25 @@
+// closesthit.slang
+//TEST:CROSS_COMPILE: -profile sm_6_3 -stage closesthit -entry main -target spirv-assembly
+
+struct ReflectionRay
+{
+ float4 color;
+};
+
+StructuredBuffer<float4> colors;
+
+void main(
+ BuiltInTriangleIntersectionAttributes attributes,
+ in out ReflectionRay ioPayload)
+{
+ uint materialID = InstanceIndex()
+ + InstanceID()
+ + PrimitiveIndex()
+ + HitKind();
+
+ float4 color = colors[materialID];
+
+ color *= RayTCurrent() - RayTMin();
+
+ ioPayload.color = color;
+}
diff --git a/tests/vkray/closesthit.slang.glsl b/tests/vkray/closesthit.slang.glsl
new file mode 100644
index 000000000..2db319a7f
--- /dev/null
+++ b/tests/vkray/closesthit.slang.glsl
@@ -0,0 +1,46 @@
+// closesthit.slang.glsl
+#version 460
+#extension GL_NVX_raytracing : require
+
+layout(std430) buffer _S1
+{
+ vec4 colors_0[];
+};
+
+struct BuiltInTriangleIntersectionAttributes_0
+{
+ vec2 barycentrics_0;
+};
+
+hitAttributeNVX BuiltInTriangleIntersectionAttributes_0 _S2;
+
+struct ReflectionRay_0
+{
+ vec4 color_0;
+};
+
+rayPayloadInNVX ReflectionRay_0 _S3;
+
+void main()
+{
+ BuiltInTriangleIntersectionAttributes_0 _S4 = _S2;
+
+ uint _S5 = gl_InstanceCustomIndexNVX;
+ uint _S6 = gl_InstanceID;
+
+ uint _S7 = _S5 + _S6;
+ uint _S8 = gl_PrimitiveID;
+
+ uint _S9 = _S7 + _S8;
+ uint _S10 = gl_HitKindNVX;
+
+ vec4 color_1 = colors_0[_S9 + _S10];
+
+ float _S11 = gl_HitTNVX;
+ float _S12 = gl_RayTminNVX;
+
+ _S3.color_0 = color_1 * (_S11 - _S12);
+
+ return;
+}
+
diff --git a/tests/vkray/intersection.slang b/tests/vkray/intersection.slang
new file mode 100644
index 000000000..e69ccdbfb
--- /dev/null
+++ b/tests/vkray/intersection.slang
@@ -0,0 +1,47 @@
+// intersection.slang
+//TEST:CROSS_COMPILE: -profile sm_6_3 -stage intersection -entry main -target spirv-assembly
+
+struct Sphere
+{
+ float3 position;
+ float radius;
+};
+
+struct SphereHitAttributes
+{
+ float3 normal;
+};
+
+bool rayIntersectsSphere(
+ RayDesc ray,
+ Sphere sphere,
+ out float tHit,
+ out SphereHitAttributes attrs)
+{
+ // HACK: this is obviously incorrect,
+ // but we just need some code for testing
+ tHit = sphere.radius;
+ attrs.normal = sphere.position;
+ return tHit >= ray.TMin;
+}
+
+cbuffer U
+{
+ Sphere gSphere;
+}
+
+void main()
+{
+ RayDesc ray;
+ ray.Origin = ObjectRayOrigin();
+ ray.Direction = ObjectRayDirection();
+ ray.TMin = RayTMin();
+ ray.TMax = RayTCurrent();
+
+ float tHit;
+ SphereHitAttributes attrs;
+ if(rayIntersectsSphere(ray, gSphere, tHit, attrs))
+ {
+ ReportHit(tHit, 0, attrs);
+ }
+}
diff --git a/tests/vkray/intersection.slang.glsl b/tests/vkray/intersection.slang.glsl
new file mode 100644
index 000000000..2fb999947
--- /dev/null
+++ b/tests/vkray/intersection.slang.glsl
@@ -0,0 +1,86 @@
+//TEST_IGNORE_FILE:
+#version 460
+
+#extension GL_NVX_raytracing : require
+
+struct Sphere_0
+{
+ vec3 position_0;
+ float radius_0;
+};
+
+layout(binding = 0)
+layout(std140)
+uniform U_0
+{
+ Sphere_0 gSphere_0;
+};
+
+struct RayDesc_0
+{
+ vec3 Origin_0;
+ float TMin_0;
+ vec3 Direction_0;
+ float TMax_0;
+};
+
+struct SphereHitAttributes_0
+{
+ vec3 normal_0;
+};
+
+bool rayIntersectsSphere_0(
+ RayDesc_0 ray_0,
+ Sphere_0 sphere_0,
+ out float tHit_0,
+ out SphereHitAttributes_0 attrs_0)
+{
+ tHit_0 = sphere_0.radius_0;
+ attrs_0.normal_0 = sphere_0.position_0;
+ return tHit_0 >= ray_0.TMin_0;
+}
+
+hitAttributeNVX SphereHitAttributes_0 a_0;
+
+bool ReportHit_0(float tHit_1, uint hitKind_0, SphereHitAttributes_0 attributes_0)
+{
+ a_0 = attributes_0;
+ bool _S1 = reportIntersectionNVX(tHit_1, hitKind_0);
+ return _S1;
+}
+
+void main()
+{
+ RayDesc_0 ray_1;
+ vec3 _S2 = gl_ObjectRayOriginNVX;
+
+ ray_1.Origin_0 = _S2;
+ vec3 _S3 = gl_ObjectRayDirectionNVX;
+
+ ray_1.Direction_0 = _S3;
+ float _S4 = gl_RayTminNVX;
+
+ ray_1.TMin_0 = _S4;
+ float _S5 = gl_RayTmaxNVX;
+
+ ray_1.TMax_0 = _S5;
+
+ RayDesc_0 _S6 = ray_1;
+
+ Sphere_0 _S7 = gSphere_0;
+
+ float _S8;
+ SphereHitAttributes_0 _S9;
+ bool _S10 = rayIntersectsSphere_0(_S6, _S7, _S8, _S9);
+
+ float tHit_2 = _S8;
+ SphereHitAttributes_0 attrs_1 = _S9;
+
+ if(_S10)
+ {
+ bool _S11 = ReportHit_0(tHit_2, (uint((0))), attrs_1);
+ }
+
+ return;
+}
+
diff --git a/tests/vkray/miss.slang b/tests/vkray/miss.slang
new file mode 100644
index 000000000..c99518150
--- /dev/null
+++ b/tests/vkray/miss.slang
@@ -0,0 +1,11 @@
+//TEST:CROSS_COMPILE: -profile sm_6_3 -stage miss -entry main -target spirv-assembly
+
+struct ShadowRay
+{
+ float hitDistance;
+};
+
+void main(in out ShadowRay ray)
+{
+ ray.hitDistance = 10000.0f;
+}
diff --git a/tests/vkray/miss.slang.glsl b/tests/vkray/miss.slang.glsl
new file mode 100644
index 000000000..7ced92c24
--- /dev/null
+++ b/tests/vkray/miss.slang.glsl
@@ -0,0 +1,18 @@
+//TEST_IGNORE_FILE:
+#version 460
+
+#extension GL_NVX_raytracing : require
+
+struct ShadowRay_0
+{
+ float hitDistance_0;
+};
+
+rayPayloadInNVX ShadowRay_0 _S1;
+
+void main()
+{
+ (_S1.hitDistance_0) = 10000.0f;
+ return;
+}
+ \ No newline at end of file
diff --git a/tests/vkray/raygen.slang b/tests/vkray/raygen.slang
new file mode 100644
index 000000000..ad377938f
--- /dev/null
+++ b/tests/vkray/raygen.slang
@@ -0,0 +1,116 @@
+//TEST:CROSS_COMPILE: -profile glsl_460 -stage raygeneration -entry main -target spirv-assembly
+
+#define TRACING_EPSILON 1e-6
+
+Texture2D samplerPosition;
+Texture2D samplerNormal;
+SamplerState sampler;
+
+struct Light {
+ float4 position;
+ float4 color;
+};
+
+struct Uniforms
+{
+ Light light;
+ float4 viewPos;
+ float4x4 view;
+ float4x4 model;
+};
+ConstantBuffer<Uniforms> ubo;
+
+
+layout(rgba8);
+RWTexture2D<float4> outputImage;
+
+RaytracingAccelerationStructure as;
+
+struct ShadowRay
+{
+ float hitDistance;
+};
+
+struct ReflectionRay
+{
+ float color;
+};
+
+#define gl_LaunchIDNV DispatchRaysIndex()
+#define gl_LaunchSizeNV DispatchRaysDimensions()
+
+void main()
+{
+ float2 inUV = float2(
+ (float(gl_LaunchIDNV.x) + 0.5f) / float(gl_LaunchSizeNV.x),
+ (float(gl_LaunchIDNV.y) + 0.5f) / float(gl_LaunchSizeNV.y)
+ );
+
+ float3 P = samplerPosition.Sample(sampler, inUV).rgb;
+ float3 N = samplerNormal.Sample(sampler, inUV).rgb * 2.0 - 1.0;
+
+ float3 lightPos = ubo.light.position.xyz;
+ float3 lightDelta = lightPos - P;
+ float lightDist = length(lightDelta);
+ float3 L = normalize(lightDelta);
+ float atten = 1.0f / (lightDist*lightDist);
+
+ RayDesc ray;
+ ray.Origin = P;
+ ray.TMin = TRACING_EPSILON;
+ ray.Direction = lightDelta;
+ ray.TMax = lightDist;
+
+ {
+ ShadowRay shadowRay;
+ shadowRay.hitDistance = 0;
+
+ TraceRay(as,
+ // ray flags
+ 1,
+ // cull mask
+ 0xff,
+ // sbt record offset
+ 0,
+ // sbt record stride
+ 0,
+ // missIndex
+ 2,
+ // ray
+ ray,
+ // payload
+ shadowRay);
+
+ if (shadowRay.hitDistance < lightDist)
+ {
+ atten = 0.f;
+ }
+ }
+
+ float3 color = ubo.light.color.xyz * saturate(dot(N,L)) * atten;
+
+
+ {
+ ReflectionRay reflectionRay;
+ TraceRay(as,
+ // ray flags
+ 1,
+ // cull mask
+ 0xff,
+ // sbt record offset
+ 0,
+ // sbt record stride
+ 0,
+ // missIndex
+ 2,
+ // ray
+ ray,
+ // payload
+ reflectionRay);
+
+
+ color = color + reflectionRay.color;
+ }
+
+ outputImage[int2(gl_LaunchIDNV.xy)] = float4(color, 1.0);
+}
diff --git a/tests/vkray/raygen.slang.glsl b/tests/vkray/raygen.slang.glsl
new file mode 100644
index 000000000..2df4b9219
--- /dev/null
+++ b/tests/vkray/raygen.slang.glsl
@@ -0,0 +1,200 @@
+//TEST_IGNORE_FILE:
+#version 460
+
+#extension GL_NVX_raytracing : require
+
+#define TRACING_EPSILON 1e-6
+
+layout(binding = 0) uniform texture2D samplerPosition_0;
+layout(binding = 2) uniform sampler sampler_0;
+layout(binding = 1) uniform texture2D samplerNormal_0;
+
+struct Light_0
+{
+ vec4 position_0;
+ vec4 color_0;
+};
+
+#define NUM_LIGHTS 17
+
+layout(binding = 3)
+layout(std140) uniform ubo_0
+{
+ Light_0 light_0;
+ vec4 viewPos_0;
+ layout(row_major) mat4x4 view_0;
+ layout(row_major) mat4x4 model_0;
+};
+
+layout(binding = 5) uniform accelerationStructureNVX as_0;
+
+struct ShadowRay_0
+{
+ float hitDistance_0;
+};
+layout(location = 0) rayPayloadNVX ShadowRay_0 p_0;
+
+struct ReflectionRay_0
+{
+ float color_1;
+};
+layout(location = 1) rayPayloadNVX ReflectionRay_0 p_1;
+
+layout(rgba32f) layout(binding = 4) uniform image2D outputImage_0;
+
+struct RayDesc_0
+{
+ vec3 Origin_0;
+ float TMin_0;
+ vec3 Direction_0;
+ float TMax_0;
+};
+
+void TraceRay_0(
+ accelerationStructureNVX AccelerationStructure_0,
+ uint RayFlags_0,
+ uint InstanceInclusionMask_0,
+ uint RayContributionToHitGroupIndex_0,
+ uint MultiplierForGeometryContributionToHitGroupIndex_0,
+ uint MissShaderIndex_0,
+ RayDesc_0 Ray_0,
+ inout ShadowRay_0 Payload_0)
+{
+ p_0 = Payload_0;
+ vec3 _S1 = Ray_0.Origin_0;
+ float _S2 = Ray_0.TMin_0;
+ vec3 _S3 = Ray_0.Direction_0;
+ float _S4 = Ray_0.TMax_0;
+ int _S5 = 0;
+ traceNVX(
+ AccelerationStructure_0,
+ RayFlags_0,
+ InstanceInclusionMask_0,
+ RayContributionToHitGroupIndex_0,
+ MultiplierForGeometryContributionToHitGroupIndex_0,
+ MissShaderIndex_0,
+ _S1,
+ _S2,
+ _S3,
+ _S4,
+ _S5);
+ Payload_0 = p_0;
+ return;
+}
+
+float saturate_0(float x_0)
+{
+ float _S6 = clamp(x_0, float(0), float(1));
+ return _S6;
+}
+
+void TraceRay_1(
+ accelerationStructureNVX AccelerationStructure_1,
+ uint RayFlags_1,
+ uint InstanceInclusionMask_1,
+ uint RayContributionToHitGroupIndex_1,
+ uint MultiplierForGeometryContributionToHitGroupIndex_1,
+ uint MissShaderIndex_1,
+ RayDesc_0 Ray_1,
+ inout ReflectionRay_0 Payload_1)
+{
+ p_1 = Payload_1;
+ vec3 _S7 = Ray_1.Origin_0;
+ float _S8 = Ray_1.TMin_0;
+ vec3 _S9 = Ray_1.Direction_0;
+ float _S10 = Ray_1.TMax_0;
+ int _S11 = 1;
+ traceNVX(
+ AccelerationStructure_1,
+ RayFlags_1,
+ InstanceInclusionMask_1,
+ RayContributionToHitGroupIndex_1,
+ MultiplierForGeometryContributionToHitGroupIndex_1,
+ MissShaderIndex_1,
+ _S7,
+ _S8,
+ _S9,
+ _S10,
+ _S11);
+ Payload_1 = p_1;
+ return;
+}
+
+void main()
+{
+ float atten_0;
+
+ uvec3 _S12 = uvec3(gl_LaunchIDNVX, 0);
+ float _S13 = float(_S12.x) + 0.5;
+ uvec3 _S14 = uvec3(gl_LaunchSizeNVX, 0);
+ float _S15 = _S13 / float(_S14.x);
+ uvec3 _S16 = uvec3(gl_LaunchIDNVX, 0);
+ float _S17 = float(_S16.y) + 0.5;
+ uvec3 _S18 = uvec3(gl_LaunchSizeNVX, 0);
+ float _S19 = _S17 / float(_S18.y);
+ vec2 inUV_0 = vec2(_S15, _S19);
+
+ vec4 _S20 = texture(sampler2D(samplerPosition_0, sampler_0), inUV_0);
+ vec3 P_0 = _S20.xyz;
+
+ vec4 _S21 = texture(sampler2D(samplerNormal_0, sampler_0), inUV_0);
+ vec3 N_0 = _S21.xyz * 2.0 - 1.0;
+
+ vec3 lightDelta_0 = light_0.position_0.xyz - P_0;
+ float lightDist_0 = length(lightDelta_0);
+ vec3 L_0 = normalize(lightDelta_0);
+
+ float _S22 = 1.0 / (lightDist_0 * lightDist_0);
+
+ RayDesc_0 ray_0;
+ ray_0.Origin_0 = P_0;
+ ray_0.TMin_0 = TRACING_EPSILON;
+ ray_0.Direction_0 = lightDelta_0;
+ ray_0.TMax_0 = lightDist_0;
+
+ ShadowRay_0 shadowRay_0;
+ shadowRay_0.hitDistance_0 = float(0);
+ const uint _S23 = uint(1);
+ const uint _S24 = uint(0xFF);
+ const uint _S25 = uint(0);
+ const uint _S26 = uint(0);
+ const uint _S27 = uint(2);
+
+ RayDesc_0 _S28 = ray_0;
+ ShadowRay_0 _S29;
+ _S29 = shadowRay_0;
+ TraceRay_0(as_0, _S23, _S24, _S25, _S26, _S27, _S28, _S29);
+ shadowRay_0 = _S29;
+
+ bool _S30 = shadowRay_0.hitDistance_0 < lightDist_0;
+ ReflectionRay_0 reflectionRay_0;
+ if(_S30)
+ {
+ atten_0 = (0.00000000000000000000);
+ }
+ else
+ {
+ atten_0 = _S22;
+ }
+
+ vec3 _S31 = light_0.color_0.xyz;
+ float _S32 = dot(N_0, L_0);
+ float _S33 = saturate_0(_S32);
+ vec3 color_2 = (_S31 * _S33) * atten_0;
+
+ const uint _S34 = uint(1);
+ const uint _S35 = uint(255);
+ const uint _S36 = uint(0);
+ const uint _S37 = uint(0);
+ const uint _S38 = uint(2);
+ RayDesc_0 _S39 = ray_0;
+ ReflectionRay_0 _S40;
+ _S40 = reflectionRay_0;
+ TraceRay_1(as_0, _S34, _S35, _S36, _S37, _S38, _S39, _S40);
+
+ vec3 color_3 = color_2 + _S40.color_1;
+
+ uvec3 _S41 = uvec3(gl_LaunchIDNVX, 0);
+ imageStore(outputImage_0, ivec2(uvec2(ivec2(_S41.xy))), vec4(color_3, 1.0));
+ return;
+}