diff options
| author | Mukund Keshava <mkeshava@nvidia.com> | 2025-05-27 17:46:04 +0530 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-05-27 20:16:04 +0800 |
| commit | f570e109c4039e15526af38e17f350c115327489 (patch) | |
| tree | 9698566e3b2dcbce33a21c80bcc17b4824b2f168 /source | |
| parent | 914f8c4b283bd81f2ea3ef00b184ff63245c9278 (diff) | |
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>
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/hlsl.meta.slang | 208 | ||||
| -rw-r--r-- | source/slang/slang-capabilities.capdef | 12 |
2 files changed, 220 insertions, 0 deletions
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; |
