From f570e109c4039e15526af38e17f350c115327489 Mon Sep 17 00:00:00 2001 From: Mukund Keshava Date: Tue, 27 May 2025 17:46:04 +0530 Subject: Add LSS intrinsics (#7200) * WiP: LSS intrinsics: initial commit * format code * Fix CI failures * Address review comment --------- Co-authored-by: slangbot <186143334+slangbot@users.noreply.github.com> --- source/slang/hlsl.meta.slang | 208 +++++++++++++++++++++++++++++++++ source/slang/slang-capabilities.capdef | 12 ++ 2 files changed, 220 insertions(+) (limited to 'source') 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 @@ -20528,6 +20636,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] 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; -- cgit v1.2.3