From 79677b83870577fbad9ce65a731d3ae8a4c553c1 Mon Sep 17 00:00:00 2001 From: Yong He Date: Fri, 3 Nov 2023 17:10:09 -0700 Subject: 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 --- source/slang/hlsl.meta.slang | 161 +++++++++++++++++++++++++++++++++-- source/slang/slang-check-decl.cpp | 4 +- source/slang/slang-diagnostic-defs.h | 4 +- 3 files changed, 156 insertions(+), 13 deletions(-) (limited to 'source') 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 WaveMaskPrefixBitXor(WaveMask mask, matrix expr); // Information for GLSL wave/subgroup support // https://github.com/KhronosGroup/GLSL/blob/master/extensions/khr/GL_KHR_shader_subgroup.txt -__generic T QuadReadLaneAt(T sourceValue, uint quadLaneID); -__generic vector QuadReadLaneAt(vector sourceValue, uint quadLaneID); +__generic +__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 +__glsl_extension(GL_KHR_shader_subgroup_quad) +__spirv_version(1.3) +vector QuadReadLaneAt(vector sourceValue, uint quadLaneID) +{ + __target_switch + { + case hlsl: + __intrinsic_asm "QuadReadLaneAt"; + case glsl: + __intrinsic_asm "subgroupQuadBroadcast"; + case spirv: + return spirv_asm { + OpCapability GroupNonUniformQuad; + result:$$vector = OpGroupNonUniformQuadBroadcast Subgroup $sourceValue $quadLaneID; + }; + } +} __generic matrix QuadReadLaneAt(matrix sourceValue, uint quadLaneID); -__generic T QuadReadAcrossX(T localValue); -__generic vector QuadReadAcrossX(vector localValue); + +__generic +__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 +__glsl_extension(GL_KHR_shader_subgroup_quad) +__spirv_version(1.3) +vector QuadReadAcrossX(vector 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 = OpGroupNonUniformQuadSwap Subgroup $localValue $direction; + }; + } +} __generic matrix QuadReadAcrossX(matrix localValue); -__generic T QuadReadAcrossY(T localValue); -__generic vector QuadReadAcrossY(vector localValue); +__generic +__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 +__glsl_extension(GL_KHR_shader_subgroup_quad) +__spirv_version(1.3) +vector QuadReadAcrossY(vector 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 = OpGroupNonUniformQuadSwap Subgroup $localValue $direction; + }; + } +} + __generic matrix QuadReadAcrossY(matrix localValue); -__generic T QuadReadAcrossDiagonal(T localValue); -__generic vector QuadReadAcrossDiagonal(vector localValue); +__generic +__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 +__glsl_extension(GL_KHR_shader_subgroup_quad) +__spirv_version(1.3) +vector QuadReadAcrossDiagonal(vector 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 = OpGroupNonUniformQuadSwap Subgroup $localValue $direction; + }; + } +} __generic matrix QuadReadAcrossDiagonal(matrix 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)") -- cgit v1.2.3