summaryrefslogtreecommitdiff
path: root/source/slang/hlsl.meta.slang
diff options
context:
space:
mode:
authorDarren Wihandi <65404740+fairywreath@users.noreply.github.com>2025-01-18 02:07:16 -0500
committerGitHub <noreply@github.com>2025-01-17 23:07:16 -0800
commita85c350df03c6cdf9b433f58fc0e66affda03e9e (patch)
tree3e80ea7121b3b5bb5c17aee88599212b78abec38 /source/slang/hlsl.meta.slang
parent87a08160289c194ddfb337d521893f576ceb9f97 (diff)
Implement Quad Control intrinsics (#5981)
Diffstat (limited to 'source/slang/hlsl.meta.slang')
-rw-r--r--source/slang/hlsl.meta.slang57
1 files changed, 57 insertions, 0 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang
index 9d6a81f84..371659fc9 100644
--- a/source/slang/hlsl.meta.slang
+++ b/source/slang/hlsl.meta.slang
@@ -15687,6 +15687,63 @@ bool IsHelperLane()
}
}
+//
+// Quad Control intrinsics
+//
+// For SPIRV and GLSL targets, the behavior is taken from Vulkan's `VK_KHR_shader_quad_control` spec.
+// QuadAny/QuadAll will map to OpGroupNonUniformQuadAny/All, and using either of these functions will
+// result in the QuadDerivativesKHR execution mode being used. If MaximallyReconvergesKHR is not already
+// specified by other means, it will be added when using either of QuadAny/QuadAll,
+//
+
+//@public:
+/// Returns true if `expr` is true in any lane of the current quad.
+__glsl_extension(GL_KHR_shader_subgroup_vote)
+__glsl_extension(GL_EXT_maximal_reconvergence)
+__glsl_extension(GL_EXT_shader_quad_control)
+[ForceInline]
+[require(glsl_hlsl_metal_spirv, quad_control)]
+bool QuadAny(bool expr)
+{
+ __requireMaximallyReconverges();
+ __requireQuadDerivatives();
+ __target_switch
+ {
+ case hlsl: __intrinsic_asm "QuadAny";
+ case glsl: __intrinsic_asm "subgroupQuadAny";
+ case metal: __intrinsic_asm "quad_any";
+ case spirv:
+ return spirv_asm
+ {
+ result:$$bool = OpGroupNonUniformQuadAnyKHR $expr;
+ };
+ }
+}
+
+//@public:
+/// Returns true if `expr` is true in all lanes of the current quad.
+__glsl_extension(GL_KHR_shader_subgroup_vote)
+__glsl_extension(GL_EXT_maximal_reconvergence)
+__glsl_extension(GL_EXT_shader_quad_control)
+[ForceInline]
+[require(glsl_hlsl_metal_spirv, quad_control)]
+bool QuadAll(bool expr)
+{
+ __requireMaximallyReconverges();
+ __requireQuadDerivatives();
+ __target_switch
+ {
+ case hlsl: __intrinsic_asm "QuadAll";
+ case glsl: __intrinsic_asm "subgroupQuadAll";
+ case metal: __intrinsic_asm "quad_all";
+ case spirv:
+ return spirv_asm
+ {
+ result:$$bool = OpGroupNonUniformQuadAllKHR $expr;
+ };
+ }
+}
+
// `typedef`s to help with the fact that HLSL has been sorta-kinda case insensitive at various points
//@hidden:
typedef Texture2D texture2D;