summaryrefslogtreecommitdiff
path: root/source/slang/hlsl.meta.slang
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-09-08 15:57:00 -0700
committerGitHub <noreply@github.com>2023-09-08 15:57:00 -0700
commit26a0b3e04689fee1ec9ec071eacd72faf1efe4eb (patch)
tree35dc68c088d42c80055de81eaa9ca691496366a7 /source/slang/hlsl.meta.slang
parent26a7cf79526b86a3dff4084d42dde8f1a8c9ac1d (diff)
Fix attribute highlighting + language server crash. (#3198)
* Fix attribute highlighting + language server crash. * Fix wave intrinsic. * Fix. * Fix. --------- Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang/hlsl.meta.slang')
-rw-r--r--source/slang/hlsl.meta.slang294
1 files changed, 109 insertions, 185 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang
index babd16f6e..c670f234e 100644
--- a/source/slang/hlsl.meta.slang
+++ b/source/slang/hlsl.meta.slang
@@ -5624,7 +5624,7 @@ T WaveMaskProduct(WaveMask mask, T expr)
{
// TODO: use the correct integer width
OpBitcast $$uint %uvalue $expr;
- OpGroupNonUniformIMul $$T %mulResult Subgroup 0 %uvalue;
+ OpGroupNonUniformIMul $$uint %mulResult Subgroup 0 %uvalue;
OpBitcast $$T result %mulResult
};
}
@@ -5687,7 +5687,7 @@ T WaveMaskSum(WaveMask mask, T expr)
{
// TODO: use the correct integer width
OpBitcast $$uint %uvalue $expr;
- OpGroupNonUniformIAdd $$T %mulResult Subgroup 0 %uvalue;
+ OpGroupNonUniformIAdd $$uint %mulResult Subgroup 0 %uvalue;
OpBitcast $$T result %mulResult
};
}
@@ -6120,62 +6120,27 @@ __generic<T : __BuiltinType> T QuadReadAcrossDiagonal(T localValue);
__generic<T : __BuiltinType, let N : int> vector<T,N> QuadReadAcrossDiagonal(vector<T,N> localValue);
__generic<T : __BuiltinType, let N : int, let M : int> matrix<T,N,M> QuadReadAcrossDiagonal(matrix<T,N,M> localValue);
+// WaveActiveBitAnd, WaveActiveBitOr, WaveActiveBitXor
+${{{{
+struct WaveActiveBitOpEntry { const char* hlslName; const char* glslName; const char* spirvName; };
+const WaveActiveBitOpEntry kWaveActiveBitOpEntries[] = {{"BitAnd", "And", "BitwiseAnd"}, {"BitOr", "Or", "BitwiseOr"}, {"BitXor", "Xor", "BitwiseXor"}};
+for (auto opName : kWaveActiveBitOpEntries) {
+}}}}
__generic<T : __BuiltinIntegerType>
__glsl_extension(GL_KHR_shader_subgroup_arithmetic)
__spirv_version(1.3)
__spirv_capability(GroupNonUniformArithmetic)
-T WaveActiveBitAnd(T expr)
-{
- __target_switch
- {
- case glsl: __intrinsic_asm "subgroupAnd($0)";
- case hlsl: __intrinsic_asm "WaveActiveBitAnd";
- case spirv:
- return spirv_asm {OpGroupNonUniformBitwiseAnd $$T result Subgroup Reduce $expr};
- default:
- return WaveMaskBitAnd(WaveGetActiveMask(), expr);
- }
-}
-
-__generic<T : __BuiltinIntegerType, let N : int>
-__glsl_extension(GL_KHR_shader_subgroup_arithmetic)
-__spirv_version(1.3)
-__spirv_capability(GroupNonUniformArithmetic)
-vector<T, N> WaveActiveBitAnd(vector<T, N> expr)
-{
- __target_switch
- {
- case glsl: __intrinsic_asm "subgroupAnd($0)";
- case hlsl: __intrinsic_asm "WaveActiveBitAnd";
- case spirv:
- return spirv_asm {OpGroupNonUniformBitwiseAnd $$vector<T, N> result Subgroup Reduce $expr};
- default:
- return WaveMaskBitAnd(WaveGetActiveMask(), expr);
- }
-}
-
-__generic<T : __BuiltinIntegerType, let N : int, let M : int>
-__target_intrinsic(hlsl)
-matrix<T, N, M> WaveActiveBitAnd(matrix<T, N, M> expr)
-{
- return WaveMaskBitAnd(WaveGetActiveMask(), expr);
-}
-
-__generic<T : __BuiltinIntegerType>
-__glsl_extension(GL_KHR_shader_subgroup_arithmetic)
-__spirv_version(1.3)
-__spirv_capability(GroupNonUniformArithmetic)
-T WaveActiveBitOr(T expr)
+T WaveActive$(opName.hlslName)(T expr)
{
__target_switch
{
- case glsl: __intrinsic_asm "subgroupOr($0)";
- case hlsl: __intrinsic_asm "WaveActiveBitOr";
+ case glsl: __intrinsic_asm "subgroup$(opName.glslName)($0)";
+ case hlsl: __intrinsic_asm "WaveActive$(opName.hlslName)";
case spirv:
- return spirv_asm {OpGroupNonUniformBitwiseOr $$T result Subgroup Reduce $expr};
+ return spirv_asm {OpGroupNonUniform$(opName.spirvName) $$T result Subgroup Reduce $expr};
default:
- return WaveMaskBitOr(WaveGetActiveMask(), expr);
+ return WaveMask$(opName.hlslName)(WaveGetActiveMask(), expr);
}
}
@@ -6183,86 +6148,54 @@ __generic<T : __BuiltinIntegerType, let N : int>
__glsl_extension(GL_KHR_shader_subgroup_arithmetic)
__spirv_version(1.3)
__spirv_capability(GroupNonUniformArithmetic)
-vector<T,N> WaveActiveBitOr(vector<T,N> expr)
+vector<T, N> WaveActive$(opName.hlslName)(vector<T, N> expr)
{
__target_switch
{
- case glsl: __intrinsic_asm "subgroupOr($0)";
- case hlsl: __intrinsic_asm "WaveActiveBitOr";
+ case glsl: __intrinsic_asm "subgroup$(opName.glslName)($0)";
+ case hlsl: __intrinsic_asm "WaveActive$(opName.hlslName)";
case spirv:
- return spirv_asm {OpGroupNonUniformBitwiseOr $$vector<T, N> result Subgroup Reduce $expr};
+ return spirv_asm {OpGroupNonUniform$(opName.spirvName) $$vector<T, N> result Subgroup Reduce $expr};
default:
- return WaveMaskBitOr(WaveGetActiveMask(), expr);
+ return WaveMask$(opName.hlslName)(WaveGetActiveMask(), expr);
}
}
__generic<T : __BuiltinIntegerType, let N : int, let M : int>
__target_intrinsic(hlsl)
-matrix<T, N, M> WaveActiveBitOr(matrix<T, N, M> expr)
-{
- return WaveMaskBitOr(WaveGetActiveMask(), expr);
-}
-
-__generic<T : __BuiltinIntegerType>
-__glsl_extension(GL_KHR_shader_subgroup_arithmetic)
-__spirv_version(1.3)
-__spirv_capability(GroupNonUniformArithmetic)
-T WaveActiveBitXor(T expr)
+matrix<T, N, M> WaveActive$(opName.hlslName)(matrix<T, N, M> expr)
{
- __target_switch
- {
- case glsl: __intrinsic_asm "subgroupXor($0)";
- case hlsl: __intrinsic_asm "WaveActiveBitXor";
- case spirv:
- return spirv_asm {OpGroupNonUniformBitwiseXor $$T result Subgroup Reduce $expr};
- default:
- return WaveMaskBitXor(WaveGetActiveMask(), expr);
- }
-}
-
-__generic<T : __BuiltinIntegerType, let N : int>
-__glsl_extension(GL_KHR_shader_subgroup_arithmetic)
-__spirv_version(1.3)
-__spirv_capability(GroupNonUniformArithmetic)
-vector<T,N> WaveActiveBitXor(vector<T,N> expr)
-{
- __target_switch
- {
- case glsl: __intrinsic_asm "subgroupXor($0)";
- case hlsl: __intrinsic_asm "WaveActiveBitXor";
- case spirv:
- return spirv_asm {OpGroupNonUniformBitwiseXor $$vector<T,N> result Subgroup Reduce $expr};
- default:
- return WaveMaskBitXor(WaveGetActiveMask(), expr);
- }
+ return WaveMask$(opName.hlslName)(WaveGetActiveMask(), expr);
}
+${{{{
+} // WaveActiveBitAnd, WaveActiveBitOr, WaveActiveBitXor
+}}}}
-__generic<T : __BuiltinIntegerType, let N : int, let M : int>
-__target_intrinsic(hlsl)
-matrix<T, N, M> WaveActiveBitXor(matrix<T, N, M> expr)
-{
- return WaveMaskBitXor(WaveGetActiveMask(), expr);
-}
+// WaveActiveMin/Max
+${{{{
+const char* kWaveActiveMinMaxNames[] = {"Min", "Max"};
+for (const char* opName : kWaveActiveMinMaxNames) {
+}}}}
__generic<T : __BuiltinArithmeticType>
__glsl_extension(GL_KHR_shader_subgroup_arithmetic)
__spirv_version(1.3)
__spirv_capability(GroupNonUniformArithmetic)
-T WaveActiveMax(T expr)
+T WaveActive$(opName)(T expr)
{
__target_switch
{
- case glsl: __intrinsic_asm "subgroupMax($0)";
- case hlsl: __intrinsic_asm "WaveActiveMax";
+ case glsl: __intrinsic_asm "subgroup$(opName)($0)";
+ case hlsl: __intrinsic_asm "WaveActive$(opName)";
case spirv:
if (__isFloat<T>())
- return spirv_asm {OpGroupNonUniformFMax $$T result Subgroup Reduce $expr};
+ return spirv_asm {OpGroupNonUniformF$(opName) $$T result Subgroup Reduce $expr};
else if (__isUnsignedInt<T>())
- return spirv_asm {OpGroupNonUniformUMax $$T result Subgroup Reduce $expr};
+ return spirv_asm {OpGroupNonUniformU$(opName) $$T result Subgroup Reduce $expr};
else
- return spirv_asm {OpGroupNonUniformSMax $$T result Subgroup Reduce $expr};
+ return spirv_asm {OpGroupNonUniformS$(opName) $$T result Subgroup Reduce $expr};
default:
- return WaveMaskMax(WaveGetActiveMask(), expr);
+ return WaveMask$(opName)(WaveGetActiveMask(), expr);
}
}
@@ -6270,135 +6203,126 @@ __generic<T : __BuiltinArithmeticType, let N : int>
__glsl_extension(GL_KHR_shader_subgroup_arithmetic)
__spirv_version(1.3)
__spirv_capability(GroupNonUniformArithmetic)
-vector<T, N> WaveActiveMax(vector<T, N> expr)
+vector<T, N> WaveActive$(opName)(vector<T, N> expr)
{
__target_switch
{
- case glsl: __intrinsic_asm "subgroupMax($0)";
- case hlsl: __intrinsic_asm "WaveActiveMax";
+ case glsl: __intrinsic_asm "subgroup$(opName)($0)";
+ case hlsl: __intrinsic_asm "WaveActive$(opName)";
case spirv:
if (__isFloat<T>())
- return spirv_asm {OpGroupNonUniformFMax $$vector<T, N> result Subgroup Reduce $expr};
+ return spirv_asm {OpGroupNonUniformF$(opName) $$vector<T, N> result Subgroup Reduce $expr};
else if (__isUnsignedInt<T>())
- return spirv_asm {OpGroupNonUniformUMax $$vector<T, N> result Subgroup Reduce $expr};
+ return spirv_asm {OpGroupNonUniformU$(opName) $$vector<T, N> result Subgroup Reduce $expr};
else
- return spirv_asm {OpGroupNonUniformSMax $$vector<T, N> result Subgroup Reduce $expr};
+ return spirv_asm {OpGroupNonUniformS$(opName) $$vector<T, N> result Subgroup Reduce $expr};
default:
- return WaveMaskMax(WaveGetActiveMask(), expr);
+ return WaveMask$(opName)(WaveGetActiveMask(), expr);
}
}
__generic<T : __BuiltinArithmeticType, let N : int, let M : int>
__target_intrinsic(hlsl)
-matrix<T, N, M> WaveActiveMax(matrix<T, N, M> expr)
+matrix<T, N, M> WaveActive$(opName)(matrix<T, N, M> expr)
{
- return WaveMaskMax(WaveGetActiveMask(), expr);
+ return WaveMask$(opName)(WaveGetActiveMask(), expr);
}
+${{{{
+} // WaveActiveMinMax.
+}}}}
+
+// WaveActiveProduct/Sum
+${{{{
+struct WaveActiveProductSumEntry { const char* hlslName; const char* glslName; };
+const WaveActiveProductSumEntry kWaveActivProductSumNames[] = {{"Product", "Mul"}, {"Sum", "Add"}};
+for (auto opName : kWaveActivProductSumNames) {
+}}}}
+
__generic<T : __BuiltinArithmeticType>
__glsl_extension(GL_KHR_shader_subgroup_arithmetic)
__spirv_version(1.3)
-__spirv_capability(GroupNonUniformArithmetic)
-T WaveActiveMin(T expr)
+T WaveActive$(opName.hlslName)(T expr)
{
__target_switch
{
- case glsl: __intrinsic_asm "subgroupMin($0)";
- case hlsl: __intrinsic_asm "WaveActiveMin";
+ case glsl: __intrinsic_asm "subgroup$(opName.glslName)($0)";
+ case hlsl: __intrinsic_asm "WaveActive$(opName.hlslName)";
case spirv:
if (__isFloat<T>())
- return spirv_asm {OpGroupNonUniformFMin $$T result Subgroup Reduce $expr};
+ return spirv_asm {
+ OpCapability GroupNonUniformArithmetic;
+ OpGroupNonUniformF$(opName.glslName) $$T result Subgroup 0 $expr
+ };
+ else if (__isSignedInt<T>())
+ {
+ return spirv_asm
+ {
+ OpCapability GroupNonUniformArithmetic;
+ // TODO: use the correct integer width
+ OpBitcast $$uint %uvalue $expr;
+ OpGroupNonUniformI$(opName.glslName) $$uint %mulResult Subgroup 0 %uvalue;
+ OpBitcast $$T result %mulResult
+ };
+ }
else if (__isUnsignedInt<T>())
- return spirv_asm {OpGroupNonUniformUMin $$T result Subgroup Reduce $expr};
- else
- return spirv_asm {OpGroupNonUniformSMin $$T result Subgroup Reduce $expr};
+ return spirv_asm
+ {
+ OpCapability GroupNonUniformArithmetic;
+ OpGroupNonUniformI$(opName.glslName) $$T result Subgroup 0 $expr
+ };
default:
- return WaveMaskMin(WaveGetActiveMask(), expr);
+ return WaveMask$(opName.hlslName)(WaveGetActiveMask(), expr);
}
}
__generic<T : __BuiltinArithmeticType, let N : int>
__glsl_extension(GL_KHR_shader_subgroup_arithmetic)
__spirv_version(1.3)
-__spirv_capability(GroupNonUniformArithmetic)
-vector<T, N> WaveActiveMin(vector<T, N> expr)
+__target_intrinsic(hlsl)
+vector<T,N> WaveActive$(opName.hlslName)(vector<T,N> expr)
{
__target_switch
{
- case glsl: __intrinsic_asm "subgroupMin($0)";
- case hlsl: __intrinsic_asm "WaveActiveMin";
+ case glsl: __intrinsic_asm "subgroup$(opName.glslName)($0)";
+ case hlsl: __intrinsic_asm "WaveActive$(opName.hlslName)";
case spirv:
if (__isFloat<T>())
- return spirv_asm {OpGroupNonUniformFMin $$vector<T, N> result Subgroup Reduce $expr};
+ return spirv_asm {
+ OpCapability GroupNonUniformArithmetic;
+ OpGroupNonUniformF$(opName.glslName) $$vector<T,N> result Subgroup 0 $expr
+ };
+ else if (__isSignedInt<T>())
+ {
+ return spirv_asm
+ {
+ OpCapability GroupNonUniformArithmetic;
+ // TODO: use the correct integer width
+ OpBitcast $$vector<uint,N> %uvalue $expr;
+ OpGroupNonUniformI$(opName.glslName) $$vector<uint,N> %$(opName.glslName)Result Subgroup 0 %uvalue;
+ OpBitcast $$vector<T,N> result %$(opName.glslName)Result
+ };
+ }
else if (__isUnsignedInt<T>())
- return spirv_asm {OpGroupNonUniformUMin $$vector<T, N> result Subgroup Reduce $expr};
- else
- return spirv_asm {OpGroupNonUniformSMin $$vector<T, N> result Subgroup Reduce $expr};
+ return spirv_asm
+ {
+ OpCapability GroupNonUniformArithmetic;
+ OpGroupNonUniformI$(opName.glslName) $$vector<T,N> result Subgroup 0 $expr
+ };
default:
- return WaveMaskMin(WaveGetActiveMask(), expr);
+ return WaveMask$(opName.hlslName)(WaveGetActiveMask(), expr);
}
}
__generic<T : __BuiltinArithmeticType, let N : int, let M : int>
__target_intrinsic(hlsl)
-matrix<T, N, M> WaveActiveMin(matrix<T, N, M> expr)
+matrix<T, N, M> WaveActive$(opName.hlslName)(matrix<T, N, M> expr)
{
- return WaveMaskMin(WaveGetActiveMask(), expr);
-}
-
-__generic<T : __BuiltinArithmeticType>
-__glsl_extension(GL_KHR_shader_subgroup_arithmetic)
-__spirv_version(1.3)
-__target_intrinsic(glsl, "subgroupMul($0)")
-__target_intrinsic(hlsl)
-T WaveActiveProduct(T expr)
-{
- return WaveMaskProduct(WaveGetActiveMask(), expr);
-}
-
-__generic<T : __BuiltinArithmeticType, let N : int>
-__glsl_extension(GL_KHR_shader_subgroup_arithmetic)
-__spirv_version(1.3)
-__target_intrinsic(glsl, "subgroupMul($0)")
-__target_intrinsic(hlsl)
-vector<T,N> WaveActiveProduct(vector<T,N> expr)
-{
- return WaveMaskProduct(WaveGetActiveMask(), expr);
-}
-
-__generic<T : __BuiltinArithmeticType, let N : int, let M : int>
-__target_intrinsic(hlsl)
-matrix<T, N, M> WaveActiveProduct(matrix<T, N, M> expr)
-{
- return WaveMaskProduct(WaveGetActiveMask(), expr);
-}
-
-__generic<T : __BuiltinArithmeticType>
-__glsl_extension(GL_KHR_shader_subgroup_arithmetic)
-__spirv_version(1.3)
-__target_intrinsic(glsl, "subgroupAdd($0)")
-__target_intrinsic(hlsl)
-T WaveActiveSum(T expr)
-{
- return WaveMaskSum(WaveGetActiveMask(), expr);
-}
-
-__generic<T : __BuiltinArithmeticType, let N : int>
-__glsl_extension(GL_KHR_shader_subgroup_arithmetic)
-__spirv_version(1.3)
-__target_intrinsic(glsl, "subgroupAdd($0)")
-__target_intrinsic(hlsl)
-vector<T,N> WaveActiveSum(vector<T,N> expr)
-{
- return WaveMaskSum(WaveGetActiveMask(), expr);
-}
-
-__generic<T : __BuiltinArithmeticType, let N : int, let M : int>
-__target_intrinsic(hlsl)
-matrix<T,N,M> WaveActiveSum(matrix<T,N,M> expr)
-{
- return WaveMaskSum(WaveGetActiveMask(), expr);
+ return WaveMask$(opName.hlslName)(WaveGetActiveMask(), expr);
}
+${{{{
+} // WaveActiveProduct/WaveActiveProductSum.
+}}}}
__generic<T : __BuiltinType>
__glsl_extension(GL_KHR_shader_subgroup_vote)