From e2b56d015e9cd6c9401e38aff9a303121d50c1e1 Mon Sep 17 00:00:00 2001 From: venkataram-nv Date: Tue, 25 Jun 2024 15:26:51 -0700 Subject: Add intrinsic for `IsHelperLane()` in HLSL (#4471) Add InHelperLane() intrinsic for HLSL, GLSL, Metal and Spirv. --- source/slang/hlsl.meta.slang | 18 ++++++++++++++++++ source/slang/slang-capabilities.capdef | 5 +++++ 2 files changed, 23 insertions(+) (limited to 'source') diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index c01265369..82ef5837e 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -14949,6 +14949,24 @@ matrix WaveMultiPrefixSum(matrix value, uint4 mask) } } +__glsl_extension(GL_EXT_demote_to_helper_invocation) +[ForceInline] +[require(glsl_hlsl_metal_spirv, helper_lane)] +bool IsHelperLane() +{ + __target_switch { + case hlsl: __intrinsic_asm "IsHelperLane()"; + case glsl: __intrinsic_asm "gl_HelperInvocation"; + case metal: __intrinsic_asm "simd_is_helper_thread()"; + case spirv: + return spirv_asm { + OpExtension "SPV_EXT_demote_to_helper_invocation"; + OpCapability DemoteToHelperInvocationEXT; + result:$$bool = OpIsHelperInvocationEXT + }; + } +} + // `typedef`s to help with the fact that HLSL has been sorta-kinda case insensitive at various points typedef Texture2D texture2D; diff --git a/source/slang/slang-capabilities.capdef b/source/slang/slang-capabilities.capdef index d003e4f41..b011021bc 100644 --- a/source/slang/slang-capabilities.capdef +++ b/source/slang/slang-capabilities.capdef @@ -817,6 +817,11 @@ alias atomic_glsl_hlsl_nvapi_cuda9_int64 = atomic_glsl_int64 | hlsl_nvapi + _sm_ alias atomic_glsl_hlsl_cuda = atomic_glsl | _sm_5_0 | _cuda_sm_2_0; alias atomic_glsl_hlsl_cuda9_int64 = atomic_glsl_int64 | _sm_6_6 | _cuda_sm_9_0; +alias helper_lane = _sm_6_0 + fragment + | GL_EXT_demote_to_helper_invocation + fragment + | metal + fragment + ; + alias breakpoint = GL_EXT_debug_printf | hlsl | _cuda_sm_8_0 | cpp; alias raytracing_allstages = raytracing_stages + raytracing; -- cgit v1.2.3