diff options
| -rw-r--r-- | docs/command-line-slangc-reference.md | 3 | ||||
| -rw-r--r-- | docs/user-guide/a3-02-reference-capability-atoms.md | 6 | ||||
| -rw-r--r-- | prelude/slang-cuda-prelude.h | 49 | ||||
| -rw-r--r-- | source/slang/hlsl.meta.slang | 208 | ||||
| -rw-r--r-- | source/slang/slang-capabilities.capdef | 12 | ||||
| -rw-r--r-- | tests/cuda/lss-test.slang | 34 | ||||
| -rw-r--r-- | tests/hlsl-intrinsic/ray-tracing/rt-lss-intrinsics-chit.slang | 45 | ||||
| -rw-r--r-- | tests/hlsl-intrinsic/shader-execution-reordering/hit-object-trace-ray.slang | 17 |
8 files changed, 374 insertions, 0 deletions
diff --git a/docs/command-line-slangc-reference.md b/docs/command-line-slangc-reference.md index 4ecaac546..b976d3ed3 100644 --- a/docs/command-line-slangc-reference.md +++ b/docs/command-line-slangc-reference.md @@ -1128,6 +1128,7 @@ A capability describes an optional feature that a target may or may not support. * `SPV_NV_ray_tracing_motion_blur` : enables the SPV_NV_ray_tracing_motion_blur extension * `SPV_NV_shader_invocation_reorder` : enables the SPV_NV_shader_invocation_reorder extension * `SPV_NV_cluster_acceleration_structure` : enables the SPV_NV_cluster_acceleration_structure extension +* `SPV_NV_linear_swept_spheres` : enables the SPV_NV_linear_swept_spheres extension * `SPV_NV_shader_image_footprint` : enables the SPV_NV_shader_image_footprint extension * `SPV_KHR_compute_shader_derivatives` : enables the SPV_KHR_compute_shader_derivatives extension * `SPV_GOOGLE_user_type` : enables the SPV_GOOGLE_user_type extension @@ -1168,6 +1169,7 @@ A capability describes an optional feature that a target may or may not support. * `spvRayQueryPositionFetchKHR` * `spvShaderInvocationReorderNV` * `spvRayTracingClusterAccelerationStructureNV` +* `spvRayTracingLinearSweptSpheresGeometryNV` * `spvShaderClockKHR` * `spvShaderNonUniformEXT` * `spvShaderNonUniform` @@ -1496,6 +1498,7 @@ A capability describes an optional feature that a target may or may not support. * `raytracing_anyhit` * `raytracing_intersection` * `raytracing_anyhit_closesthit` +* `raytracing_lss` * `raytracing_anyhit_closesthit_intersection` * `raytracing_raygen_closesthit_miss` * `raytracing_anyhit_closesthit_intersection_miss` diff --git a/docs/user-guide/a3-02-reference-capability-atoms.md b/docs/user-guide/a3-02-reference-capability-atoms.md index 0766fdf82..78affcb7d 100644 --- a/docs/user-guide/a3-02-reference-capability-atoms.md +++ b/docs/user-guide/a3-02-reference-capability-atoms.md @@ -432,6 +432,9 @@ Extensions `SPV_NV_cluster_acceleration_structure` > Represents the SPIR-V extension for cluster acceleration structure. +`SPV_NV_linear_swept_spheres` +> Represents the SPIR-V extension for linear swept spheres. + `SPV_NV_shader_image_footprint` > Represents the SPIR-V extension for shader image footprint. @@ -555,6 +558,9 @@ Extensions `spvRayTracingClusterAccelerationStructureNV` > Represents the SPIR-V capability for cluster acceleration structure. +`spvRayTracingLinearSweptSpheresGeometryNV` +> Represents the SPIR-V capability for linear swept spheres. + `spvShaderClockKHR` > Represents the SPIR-V capability for shader clock. diff --git a/prelude/slang-cuda-prelude.h b/prelude/slang-cuda-prelude.h index d2c9fce9d..d1160cdd3 100644 --- a/prelude/slang-cuda-prelude.h +++ b/prelude/slang-cuda-prelude.h @@ -31,6 +31,7 @@ #ifdef SLANG_CUDA_ENABLE_OPTIX #include <optix.h> +#include <optix_device.h> #endif // Define slang offsetof implementation @@ -3221,6 +3222,54 @@ __forceinline__ __device__ void* optixTrace( r1); } +__forceinline__ __device__ float4 optixGetSpherePositionAndRadius() +{ + float4 data[1]; + optixGetSphereData(data); + return data; +} + +__forceinline__ __device__ float4 optixHitObjectGetSpherePositionAndRadius() +{ + float4 data[1]; + optixHitObjectGetSphereData(data); + return data; +} + +__forceinline__ __device__ Matrix<float, 2, 4> optixGetSpherePositionAndRadius() +{ + float4 data[2]; + optixGetLinearCurveVertexData(data); + return Matrix<float, 2, 4>(data[0], data[1]); +} + +__forceinline__ __device__ float2x4 optixHitObjectGetSpherePositionAndRadius() +{ + float4 data[2]; + optixHitObjectGetLinearCurveVertexData(data); + return Matrix<float, 2, 4>(data[0], data[1]); +} + +__forceinline__ __device__ bool optixIsSphereHit() +{ + return optixGetPrimitiveType() == OPTIX_PRIMITIVE_TYPE_SPHERE; +} + +__forceinline__ __device__ bool optixHitObjectIsSphereHit() +{ + return optixGetPrimitiveType(optixHitObjectGetHitKind()) == OPTIX_PRIMITIVE_TYPE_SPHERE; +} + +__forceinline__ __device__ bool optixIsLSSHit() +{ + return optixGetPrimitiveType() == OPTIX_PRIMITIVE_TYPE_ROUND_LINEAR; +} + +__forceinline__ __device__ bool optixHitObjectIsLSSHit() +{ + return optixGetPrimitiveType(optixHitObjectGetHitKind()) == OPTIX_PRIMITIVE_TYPE_ROUND_LINEAR; +} + template<typename T> __forceinline__ __device__ void* optixTraverse( OptixTraversableHandle AccelerationStructure, diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index fd7c7cfc7..9b15392ec 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -17948,6 +17948,114 @@ int GetClusterID() }; } } + +/// @category raytracing +[__requiresNVAPI] +[NonUniformReturn] +[require(cuda_hlsl_spirv, raytracing_lss)] +float4 GetSpherePositionAndRadius() +{ + __target_switch + { + case hlsl: __intrinsic_asm "NvRtSphereObjectPositionAndRadius"; + case cuda: + { + __intrinsic_asm "optixGetSpherePositionAndRadius"; + } + case spirv: + return spirv_asm + { + OpExtension "SPV_NV_linear_swept_spheres"; + OpCapability RayTracingLinearSweptSpheresGeometryNV; + OpCapability RayTracingSpheresGeometryNV; + %pos:$$float3 = OpLoad builtin(HitSpherePositionNV:float3); + %rad:$$float = OpLoad builtin(HitSphereRadiusNV:float); + result:$$float4 = OpCompositeConstruct %pos %rad; + }; + } +} + +/// @category raytracing +[__requiresNVAPI] +[NonUniformReturn] +[require(cuda_hlsl_spirv, raytracing_lss)] +float2x4 GetLssPositionsAndRadii() +{ + __target_switch + { + case hlsl: __intrinsic_asm "NvRtLssObjectPositionsAndRadii"; + case cuda: + { + __intrinsic_asm "optixObjectPositionsAndRadii"; + } + case spirv: + return spirv_asm + { + OpExtension "SPV_NV_linear_swept_spheres"; + OpCapability RayTracingLinearSweptSpheresGeometryNV; + OpCapability RayTracingSpheresGeometryNV; + %positions:$$float3[2] = OpLoad builtin(HitLSSPositionsNV:float3[2]); + %radii:$$float[2] = OpLoad builtin(HitLSSRadiiNV:float[2]); + %r0:$$float = OpCompositeExtract %radii 0; + %r1:$$float = OpCompositeExtract %radii 1; + %p0:$$float3 = OpCompositeExtract %positions 0; + %p1:$$float3 = OpCompositeExtract %positions 1; + %a:$$float4 = OpCompositeConstruct %p0 %r0; + %b:$$float4 = OpCompositeConstruct %p1 %r1; + result:$$float2x4 = OpCompositeConstruct %a %b; + }; + + } +} + +/// @category raytracing +[__requiresNVAPI] +[NonUniformReturn] +[require(cuda_hlsl_spirv, raytracing_lss)] +bool IsSphereHit() +{ + __target_switch + { + case hlsl: __intrinsic_asm "NvRtIsSphereHit"; + case cuda: + { + __intrinsic_asm "optixIsSphereHit"; + } + case spirv: + return spirv_asm + { + OpExtension "SPV_NV_linear_swept_spheres"; + OpCapability RayTracingLinearSweptSpheresGeometryNV; + OpCapability RayTracingSpheresGeometryNV; + result:$$bool = OpLoad builtin(HitIsSphereNV:bool); + }; + } +} + +/// @category raytracing +[__requiresNVAPI] +[NonUniformReturn] +[require(cuda_hlsl_spirv, raytracing_lss)] +bool IsLssHit() +{ + __target_switch + { + case hlsl: __intrinsic_asm "NvRtIsLssHit"; + case cuda: + { + __intrinsic_asm "optixIsLSSHit"; + } + case spirv: + return spirv_asm + { + OpExtension "SPV_NV_linear_swept_spheres"; + OpCapability RayTracingLinearSweptSpheresGeometryNV; + OpCapability RayTracingSpheresGeometryNV; + result:$$bool = OpLoad builtin(HitIsLSSNV:bool); + }; + } +} + // Note: The provisional DXR spec included these unadorned // `ObjectToWorld()` and `WorldToObject()` functions, so // we will forward them to the new names as a convience @@ -20529,6 +20637,106 @@ struct HitObject } [__requiresNVAPI] + [NonUniformReturn] + [require(cuda_hlsl_spirv, raytracing_lss)] + float4 GetSpherePositionAndRadius() + { + __target_switch + { + case hlsl: __intrinsic_asm "NvRtSphereObjectPositionAndRadius"; + case cuda: + { + __intrinsic_asm "optixHitObjectGetSpherePositionAndRadius"; + } + case spirv: + return spirv_asm + { + OpExtension "SPV_NV_linear_swept_spheres"; + OpCapability RayTracingLinearSweptSpheresGeometryNV; + OpCapability RayTracingSpheresGeometryNV; + %position:$$float3 = OpHitObjectGetSpherePositionNV &this; + %radius:$$float = OpHitObjectGetSphereRadiusNV &this; + result:$$float4 = OpCompositeConstruct %position %radius; + }; + } + } + + [__requiresNVAPI] + [NonUniformReturn] + [require(cuda_hlsl_spirv, raytracing_lss)] + float2x4 GetLssPositionsAndRadii() + { + __target_switch + { + case hlsl: __intrinsic_asm "NvRtLssObjectPositionsAndRadii"; + case cuda: + { + __intrinsic_asm "optixHitObjectGetSpherePositionAndRadius"; + } + case spirv: + return spirv_asm + { + OpExtension "SPV_NV_linear_swept_spheres"; + OpCapability RayTracingLinearSweptSpheresGeometryNV; + OpCapability RayTracingSpheresGeometryNV; + %positions:$$float3[2] = OpHitObjectGetLSSPositionsNV &this; + %radii:$$float[2] = OpHitObjectGetLSSRadiiNV &this; + %r0:$$float = OpCompositeExtract %radii 0; + %r1:$$float = OpCompositeExtract %radii 1; + %p0:$$float3 = OpCompositeExtract %positions 0; + %p1:$$float3 = OpCompositeExtract %positions 1; + %a:$$float4 = OpCompositeConstruct %p0 %r0; + %b:$$float4 = OpCompositeConstruct %p1 %r1; + result:$$float2x4 = OpCompositeConstruct %a %b; + }; + } + } + + [__requiresNVAPI] + [NonUniformReturn] + [require(cuda_hlsl_spirv, raytracing_lss)] + bool IsSphereHit() + { + __target_switch + { + case hlsl: __intrinsic_asm "NvRtIsSphereHit"; + case cuda: + { + __intrinsic_asm "optixHitObjectIsSphereHit"; + } + case spirv: + return spirv_asm + { + OpExtension "SPV_NV_linear_swept_spheres"; + OpCapability RayTracingLinearSweptSpheresGeometryNV; + result:$$bool = OpHitObjectIsSphereHitNV &this; + }; + } + } + + [__requiresNVAPI] + [NonUniformReturn] + [require(cuda_hlsl_spirv, raytracing_lss)] + bool IsLssHit() + { + __target_switch + { + case hlsl: __intrinsic_asm "NvRtIsLssHit"; + case cuda: + { + __intrinsic_asm "optixHitObjectIsLSSHit"; + } + case spirv: + return spirv_asm + { + OpExtension "SPV_NV_linear_swept_spheres"; + OpCapability RayTracingLinearSweptSpheresGeometryNV; + result:$$bool = OpHitObjectIsLSSHitNV &this; + }; + } + } + + [__requiresNVAPI] __glsl_extension(GL_EXT_ray_tracing) [ForceInline] [require(glsl_hlsl_spirv, ser_raygen_closesthit_miss)] diff --git a/source/slang/slang-capabilities.capdef b/source/slang/slang-capabilities.capdef index 48617c54d..28fa211e4 100644 --- a/source/slang/slang-capabilities.capdef +++ b/source/slang/slang-capabilities.capdef @@ -547,6 +547,10 @@ def SPV_NV_shader_invocation_reorder : _spirv_1_5 + SPV_KHR_ray_tracing; /// [EXT] def SPV_NV_cluster_acceleration_structure : _spirv_1_0; +/// Represents the SPIR-V extension for linear swept spheres. +/// [EXT] +def SPV_NV_linear_swept_spheres : _spirv_1_0; + /// Represents the SPIR-V extension for shader image footprint. /// [EXT] def SPV_NV_shader_image_footprint : _spirv_1_0; @@ -714,6 +718,10 @@ def spvShaderInvocationReorderNV : SPV_NV_shader_invocation_reorder; /// [EXT] def spvRayTracingClusterAccelerationStructureNV : SPV_NV_cluster_acceleration_structure; +/// Represents the SPIR-V capability for cluster acceleration structure. +/// [EXT] +def spvRayTracingLinearSweptSpheresGeometryNV : SPV_NV_linear_swept_spheres; + /// Represents the SPIR-V capability for shader clock. /// [EXT] def spvShaderClockKHR : SPV_KHR_shader_clock; @@ -2246,6 +2254,10 @@ alias raytracing_intersection = intersection + raytracing; /// [Compound] alias raytracing_anyhit_closesthit = anyhit_closesthit + raytracing; +/// Collection of capabilities for linear swept spheres. +/// [Compound] +alias raytracing_lss = raytracing_anyhit_closesthit | spvRayTracingLinearSweptSpheresGeometryNV; + /// Collection of capabilities for raytracing with the shader stages of anyhit, closesthit, and intersection. /// [Compound] alias raytracing_anyhit_closesthit_intersection = anyhit_closesthit_intersection + raytracing; diff --git a/tests/cuda/lss-test.slang b/tests/cuda/lss-test.slang new file mode 100644 index 000000000..4b0512cb1 --- /dev/null +++ b/tests/cuda/lss-test.slang @@ -0,0 +1,34 @@ +//TEST:SIMPLE(filecheck=CHECK): -target cuda +//CHECK_: __global__ void __closesthit__closestHitShaderLss +//CHECK: optixGetSpherePositionAndRadius +//CHECK: optixObjectPositionsAndRadii +//CHECK: optixIsSphereHit +//CHECK: optixIsLSSHit + +struct RayPayload +{ + float4 color; + float2x4 lssData; + bool isSphere; + bool isLss; +}; + +[shader("closesthit")] +void closestHitShaderLss(inout RayPayload payload, in BuiltInTriangleIntersectionAttributes attr) +{ + // Test TraceRay API functions + payload.color = GetSpherePositionAndRadius(); + payload.lssData = GetLssPositionsAndRadii(); + payload.isSphere = IsSphereHit(); + payload.isLss = IsLssHit(); + +// TODO: This will be enabled once issue #6647 is completed. +#if 0 + // Test HitObject API functions + HitObject hitObj; + float4 sphereData = hitObj.GetSphereObjectPositionAndRadius(); + float2x4 lssData = hitObj.GetLssObjectPositionsAndRadii(); + bool isSphereHit = hitObj.IsSphereHit(); + bool isLssHit = hitObj.IsLssHit(); +#endif +}
\ No newline at end of file diff --git a/tests/hlsl-intrinsic/ray-tracing/rt-lss-intrinsics-chit.slang b/tests/hlsl-intrinsic/ray-tracing/rt-lss-intrinsics-chit.slang new file mode 100644 index 000000000..b4d181c7d --- /dev/null +++ b/tests/hlsl-intrinsic/ray-tracing/rt-lss-intrinsics-chit.slang @@ -0,0 +1,45 @@ +//TEST:SIMPLE(filecheck=HLSL): -target hlsl +//TEST:SIMPLE(filecheck=SPIRV): -target spirv-asm +//HLSL: NvRtSphereObjectPositionAndRadius +//HLSL: NvRtLssObjectPositionsAndRadii +//HLSL: NvRtIsSphereHit +//HLSL: NvRtIsLssHit + +//SPIRV: HitSpherePositionNV +//SPIRV: HitSphereRadiusNV +//SPIRV: HitLSSPositionsNV +//SPIRV: HitIsSphereNV +//SPIRV: HitIsLSSNV + +// Hit object variants +//SPIRV: OpHitObjectGetSpherePositionNV +//SPIRV: OpHitObjectGetSphereRadiusNV +//SPIRV: OpHitObjectGetLSSPositionsNV +//SPIRV: OpHitObjectGetLSSRadiiNV +//SPIRV: OpHitObjectIsSphereHitNV +//SPIRV: OpHitObjectIsLSSHitNV + +struct RayPayload +{ + float4 color; + float2x4 lssData; + bool isSphere; + bool isLss; +}; + +[shader("closesthit")] +void closestHitShaderLss(inout RayPayload payload, in BuiltInTriangleIntersectionAttributes attr) +{ + // Test TraceRay API functions + payload.color = GetSpherePositionAndRadius(); + payload.lssData = GetLssPositionsAndRadii(); + payload.isSphere = IsSphereHit(); + payload.isLss = IsLssHit(); + + // Test HitObject API functions + HitObject hitObj; + float4 sphereData = hitObj.GetSpherePositionAndRadius(); + float2x4 lssData = hitObj.GetLssPositionsAndRadii(); + bool isSphereHit = hitObj.IsSphereHit(); + bool isLssHit = hitObj.IsLssHit(); +}
\ No newline at end of file diff --git a/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-trace-ray.slang b/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-trace-ray.slang index 71c113934..be38915b1 100644 --- a/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-trace-ray.slang +++ b/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-trace-ray.slang @@ -32,6 +32,10 @@ uint calcValue(HitObject hit) uint geometryIndex = hit.GetGeometryIndex(); uint primitiveIndex = hit.GetPrimitiveIndex(); int clusterID = hit.GetClusterID(); + float4 posRadius = hit.GetSpherePositionAndRadius(); + float2x4 positionsRadii = hit.GetLssPositionsAndRadii(); + uint isSphereHit = uint(hit.IsSphereHit()); + uint isLssHit = uint(hit.IsLssHit()); SomeValues objSomeValues = hit.GetAttributes<SomeValues>(); @@ -41,6 +45,19 @@ uint calcValue(HitObject hit) r += primitiveIndex; r += objSomeValues.a; r += clusterID; + + r += int(posRadius.x); + r += int(posRadius.y); + r += int(posRadius.z); + r += int(posRadius.w); + + r += int(positionsRadii[0].x); + r += int(positionsRadii[0].y); + r += int(positionsRadii[0].z); + r += int(positionsRadii[0].w); + + r += isSphereHit; + r += isLssHit; } return r; |
