summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorMukund Keshava <mkeshava@nvidia.com>2025-05-27 17:46:04 +0530
committerGitHub <noreply@github.com>2025-05-27 20:16:04 +0800
commitf570e109c4039e15526af38e17f350c115327489 (patch)
tree9698566e3b2dcbce33a21c80bcc17b4824b2f168 /source
parent914f8c4b283bd81f2ea3ef00b184ff63245c9278 (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.slang208
-rw-r--r--source/slang/slang-capabilities.capdef12
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;