diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/vkray/anyhit.slang | 41 | ||||
| -rw-r--r-- | tests/vkray/anyhit.slang.glsl | 58 | ||||
| -rw-r--r-- | tests/vkray/closesthit.slang | 25 | ||||
| -rw-r--r-- | tests/vkray/closesthit.slang.glsl | 46 | ||||
| -rw-r--r-- | tests/vkray/intersection.slang | 47 | ||||
| -rw-r--r-- | tests/vkray/intersection.slang.glsl | 86 | ||||
| -rw-r--r-- | tests/vkray/miss.slang | 11 | ||||
| -rw-r--r-- | tests/vkray/miss.slang.glsl | 18 | ||||
| -rw-r--r-- | tests/vkray/raygen.slang | 116 | ||||
| -rw-r--r-- | tests/vkray/raygen.slang.glsl | 200 |
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; +} |
