summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-11-03 17:10:09 -0700
committerGitHub <noreply@github.com>2023-11-03 17:10:09 -0700
commit79677b83870577fbad9ce65a731d3ae8a4c553c1 (patch)
tree82e10e5eaef138cf61f21c8842d5c8e4b199c198 /source
parent111de4d5527a07877edd971e8be335e067ff9a1b (diff)
Add SubgroupQuad intrinsics for glsl/spirv. (#3310)
* Add SubgroupQuad intrinsics for glsl/spirv. * Fix. * Add test for quad intrinsics. * fix. * improve diagnostics text. * Fix. * Fix. --------- Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source')
-rw-r--r--source/slang/hlsl.meta.slang161
-rw-r--r--source/slang/slang-check-decl.cpp4
-rw-r--r--source/slang/slang-diagnostic-defs.h4
3 files changed, 156 insertions, 13 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang
index 43e40778c..7ce266e2c 100644
--- a/source/slang/hlsl.meta.slang
+++ b/source/slang/hlsl.meta.slang
@@ -6240,20 +6240,165 @@ matrix<T,N,M> WaveMaskPrefixBitXor(WaveMask mask, matrix<T,N,M> expr);
// Information for GLSL wave/subgroup support
// https://github.com/KhronosGroup/GLSL/blob/master/extensions/khr/GL_KHR_shader_subgroup.txt
-__generic<T : __BuiltinType> T QuadReadLaneAt(T sourceValue, uint quadLaneID);
-__generic<T : __BuiltinType, let N : int> vector<T,N> QuadReadLaneAt(vector<T,N> sourceValue, uint quadLaneID);
+__generic<T : __BuiltinType>
+__glsl_extension(GL_KHR_shader_subgroup_quad)
+__spirv_version(1.3)
+T QuadReadLaneAt(T sourceValue, uint quadLaneID)
+{
+ __target_switch
+ {
+ case hlsl:
+ __intrinsic_asm "QuadReadLaneAt";
+ case glsl:
+ __intrinsic_asm "subgroupQuadBroadcast";
+ case spirv:
+ return spirv_asm {
+ OpCapability GroupNonUniformQuad;
+ result:$$T = OpGroupNonUniformQuadBroadcast Subgroup $sourceValue $quadLaneID;
+ };
+ }
+}
+__generic<T : __BuiltinType, let N : int>
+__glsl_extension(GL_KHR_shader_subgroup_quad)
+__spirv_version(1.3)
+vector<T,N> QuadReadLaneAt(vector<T,N> sourceValue, uint quadLaneID)
+{
+ __target_switch
+ {
+ case hlsl:
+ __intrinsic_asm "QuadReadLaneAt";
+ case glsl:
+ __intrinsic_asm "subgroupQuadBroadcast";
+ case spirv:
+ return spirv_asm {
+ OpCapability GroupNonUniformQuad;
+ result:$$vector<T,N> = OpGroupNonUniformQuadBroadcast Subgroup $sourceValue $quadLaneID;
+ };
+ }
+}
__generic<T : __BuiltinType, let N : int, let M : int> matrix<T,N,M> QuadReadLaneAt(matrix<T,N,M> sourceValue, uint quadLaneID);
-__generic<T : __BuiltinType> T QuadReadAcrossX(T localValue);
-__generic<T : __BuiltinType, let N : int> vector<T,N> QuadReadAcrossX(vector<T,N> localValue);
+
+__generic<T : __BuiltinType>
+__glsl_extension(GL_KHR_shader_subgroup_quad)
+__spirv_version(1.3)
+T QuadReadAcrossX(T localValue)
+{
+ __target_switch
+ {
+ case hlsl:
+ __intrinsic_asm "QuadReadAcrossX";
+ case glsl:
+ __intrinsic_asm "subgroupQuadSwapHorizontal($0)";
+ case spirv:
+ uint direction = 0u;
+ return spirv_asm {
+ OpCapability GroupNonUniformQuad;
+ result:$$T = OpGroupNonUniformQuadSwap Subgroup $localValue $direction;
+ };
+ }
+}
+
+__generic<T : __BuiltinType, let N : int>
+__glsl_extension(GL_KHR_shader_subgroup_quad)
+__spirv_version(1.3)
+vector<T,N> QuadReadAcrossX(vector<T,N> localValue)
+{
+ __target_switch
+ {
+ case hlsl:
+ __intrinsic_asm "QuadReadAcrossX";
+ case glsl:
+ __intrinsic_asm "subgroupQuadSwapHorizontal($0)";
+ case spirv:
+ uint direction = 0u;
+ return spirv_asm {
+ OpCapability GroupNonUniformQuad;
+ result:$$vector<T,N> = OpGroupNonUniformQuadSwap Subgroup $localValue $direction;
+ };
+ }
+}
__generic<T : __BuiltinType, let N : int, let M : int> matrix<T,N,M> QuadReadAcrossX(matrix<T,N,M> localValue);
-__generic<T : __BuiltinType> T QuadReadAcrossY(T localValue);
-__generic<T : __BuiltinType, let N : int> vector<T,N> QuadReadAcrossY(vector<T,N> localValue);
+__generic<T : __BuiltinType>
+__glsl_extension(GL_KHR_shader_subgroup_quad)
+__spirv_version(1.3)
+T QuadReadAcrossY(T localValue)
+{
+ __target_switch
+ {
+ case hlsl:
+ __intrinsic_asm "QuadReadAcrossY";
+ case glsl:
+ __intrinsic_asm "subgroupQuadSwapVertical($0)";
+ case spirv:
+ uint direction = 1u;
+ return spirv_asm {
+ OpCapability GroupNonUniformQuad;
+ result:$$T = OpGroupNonUniformQuadSwap Subgroup $localValue $direction;
+ };
+ }
+}
+__generic<T : __BuiltinType, let N : int>
+__glsl_extension(GL_KHR_shader_subgroup_quad)
+__spirv_version(1.3)
+vector<T,N> QuadReadAcrossY(vector<T,N> localValue)
+{
+ __target_switch
+ {
+ case hlsl:
+ __intrinsic_asm "QuadReadAcrossY";
+ case glsl:
+ __intrinsic_asm "subgroupQuadSwapVertical($0)";
+ case spirv:
+ uint direction = 1u;
+ return spirv_asm {
+ OpCapability GroupNonUniformQuad;
+ result:$$vector<T,N> = OpGroupNonUniformQuadSwap Subgroup $localValue $direction;
+ };
+ }
+}
+
__generic<T : __BuiltinType, let N : int, let M : int> matrix<T,N,M> QuadReadAcrossY(matrix<T,N,M> localValue);
-__generic<T : __BuiltinType> T QuadReadAcrossDiagonal(T localValue);
-__generic<T : __BuiltinType, let N : int> vector<T,N> QuadReadAcrossDiagonal(vector<T,N> localValue);
+__generic<T : __BuiltinType>
+__glsl_extension(GL_KHR_shader_subgroup_quad)
+__spirv_version(1.3)
+T QuadReadAcrossDiagonal(T localValue)
+{
+ __target_switch
+ {
+ case hlsl:
+ __intrinsic_asm "QuadReadAcrossDiagonal";
+ case glsl:
+ __intrinsic_asm "subgroupQuadSwapDiagonal($0)";
+ case spirv:
+ uint direction = 2u;
+ return spirv_asm {
+ OpCapability GroupNonUniformQuad;
+ result:$$T = OpGroupNonUniformQuadSwap Subgroup $localValue $direction;
+ };
+ }
+}
+__generic<T : __BuiltinType, let N : int>
+__glsl_extension(GL_KHR_shader_subgroup_quad)
+__spirv_version(1.3)
+vector<T,N> QuadReadAcrossDiagonal(vector<T,N> localValue)
+{
+ __target_switch
+ {
+ case hlsl:
+ __intrinsic_asm "QuadReadAcrossDiagonal";
+ case glsl:
+ __intrinsic_asm "subgroupQuadSwapDiagonal($0)";
+ case spirv:
+ uint direction = 2u;
+ return spirv_asm {
+ OpCapability GroupNonUniformQuad;
+ result:$$vector<T,N> = OpGroupNonUniformQuadSwap Subgroup $localValue $direction;
+ };
+ }
+}
__generic<T : __BuiltinType, let N : int, let M : int> matrix<T,N,M> QuadReadAcrossDiagonal(matrix<T,N,M> localValue);
// WaveActiveBitAnd, WaveActiveBitOr, WaveActiveBitXor
diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp
index 64db4cdc5..03d9f0d9e 100644
--- a/source/slang/slang-check-decl.cpp
+++ b/source/slang/slang-check-decl.cpp
@@ -1685,8 +1685,8 @@ namespace Slang
if (!differentialType->equals(diffDiffType))
{
SourceLoc sourceLoc = differentialType->getDeclRef().getDecl()->loc;
- getSink()->diagnose(sourceLoc, Diagnostics::differentialTypeShouldServeAsItsOwnDifferentialType, differentialType);
- getSink()->diagnose(inheritanceDecl, Diagnostics::noteSeeUseOfDifferentialType, differentialType, inheritanceDecl->getSup());
+ getSink()->diagnose(inheritanceDecl, Diagnostics::differentialTypeShouldServeAsItsOwnDifferentialType, differentialType, diffDiffType);
+ getSink()->diagnose(sourceLoc, Diagnostics::seeDefinitionOf, differentialType);
}
}
};
diff --git a/source/slang/slang-diagnostic-defs.h b/source/slang/slang-diagnostic-defs.h
index 2dc3c7388..15f9af156 100644
--- a/source/slang/slang-diagnostic-defs.h
+++ b/source/slang/slang-diagnostic-defs.h
@@ -341,14 +341,12 @@ DIAGNOSTIC(30093, Error, uncaughtTryCallInNonThrowFunc, "the current function or
DIAGNOSTIC(30094, Error, mustUseTryClauseToCallAThrowFunc, "the callee may throw an error, and therefore must be called within a 'try' clause")
DIAGNOSTIC(30095, Error, errorTypeOfCalleeIncompatibleWithCaller, "the error type `$1` of callee `$0` is not compatible with the caller's error type `$2`.")
-DIAGNOSTIC(30096, Error, differentialTypeShouldServeAsItsOwnDifferentialType, "type '$0' is used as a `Differential` type, therefore it must serve as its own `Differential` type.")
+DIAGNOSTIC(30096, Error, differentialTypeShouldServeAsItsOwnDifferentialType, "cannot use type '$0' a `Differential` type. A differential type's differential must be itself. However, '$0.Differential' is '$1'.")
DIAGNOSTIC(30097, Error, functionNotMarkedAsDifferentiable, "function '$0' is not marked as $1-differentiable.")
DIAGNOSTIC(30098, Error, nonStaticMemberFunctionNotAllowedAsDiffOperand, "non-static function reference '$0' is not allowed here.")
DIAGNOSTIC(30099, Error, sizeOfArgumentIsInvalid, "argument to sizeof is invalid")
-DIAGNOSTIC(-1, Note, noteSeeUseOfDifferentialType, "see use of '$0' as Differential of '$1'.")
-
// Attributes
DIAGNOSTIC(31000, Error, unknownAttributeName, "unknown attribute '$0'")
DIAGNOSTIC(31001, Error, attributeArgumentCountMismatch, "attribute '$0' expects $1 arguments ($2 provided)")