diff options
| author | Darren Wihandi <65404740+fairywreath@users.noreply.github.com> | 2025-02-02 15:27:11 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-02-02 12:27:11 -0800 |
| commit | 0a6828572aa4cc1f0f99993e77c321799eb88cca (patch) | |
| tree | d18f1950074958ff3276e303425eed15067ea2bc /source/slang/slang-extension-tracker.cpp | |
| parent | 2949b786a7f04ad31c113b622039fb5b72bc8622 (diff) | |
Add support for WGSL subgroup operations (#6213)
* initial work
* more work
* more work on glsl intrinsics
* add subgroup broadcast for glsl
* wip add wgsl extension tracking
* enable tests, enable extensions and added some todos
* format and warning fixes
* fix wgsl extension tracker
---------
Co-authored-by: Yong He <yonghe@outlook.com>
Diffstat (limited to 'source/slang/slang-extension-tracker.cpp')
| -rw-r--r-- | source/slang/slang-extension-tracker.cpp | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/source/slang/slang-extension-tracker.cpp b/source/slang/slang-extension-tracker.cpp new file mode 100644 index 000000000..f3818cbba --- /dev/null +++ b/source/slang/slang-extension-tracker.cpp @@ -0,0 +1,102 @@ +// slang-extension-tracker.cpp +#include "slang-extension-tracker.h" + +namespace Slang +{ + +void ShaderExtensionTracker::appendExtensionRequireLinesForGLSL(StringBuilder& ioBuilder) const +{ + for (const auto& extension : m_extensionPool.getSlices()) + { + ioBuilder.append("#extension "); + ioBuilder.append(extension); + ioBuilder.append(" : require\n"); + } +} + +void ShaderExtensionTracker::appendExtensionRequireLinesForWGSL(StringBuilder& ioBuilder) const +{ + for (const auto& extension : m_extensionPool.getSlices()) + { + ioBuilder.append("enable "); + ioBuilder.append(extension); + ioBuilder.append(";\n"); + } +} + +void ShaderExtensionTracker::requireSPIRVVersion(const SemanticVersion& version) +{ + if (version > m_spirvVersion) + { + m_spirvVersion = version; + } +} + +void ShaderExtensionTracker::requireVersion(ProfileVersion version) +{ + // Check if this profile is newer + if ((UInt)version > (UInt)m_profileVersion) + { + m_profileVersion = version; + } +} + +void ShaderExtensionTracker::requireBaseTypeExtension(BaseType baseType) +{ + uint32_t bit = 1 << int(baseType); + if (m_hasBaseTypeFlags & bit) + { + return; + } + + switch (baseType) + { + case BaseType::UInt8: + case BaseType::Int8: + { + // https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GL_EXT_shader_8bit_storage.txt + requireExtension(UnownedStringSlice::fromLiteral("GL_EXT_shader_8bit_storage")); + + // https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GL_EXT_shader_explicit_arithmetic_types.txt + requireExtension( + UnownedStringSlice::fromLiteral("GL_EXT_shader_explicit_arithmetic_types")); + break; + } + case BaseType::Half: + case BaseType::UInt16: + case BaseType::Int16: + { + // https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GL_EXT_shader_16bit_storage.txt + requireExtension(UnownedStringSlice::fromLiteral("GL_EXT_shader_16bit_storage")); + + // https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GL_EXT_shader_explicit_arithmetic_types.txt + requireExtension( + UnownedStringSlice::fromLiteral("GL_EXT_shader_explicit_arithmetic_types")); + break; + } + case BaseType::UInt64: + case BaseType::Int64: + { + requireExtension( + UnownedStringSlice::fromLiteral("GL_EXT_shader_explicit_arithmetic_types_int64")); + m_hasBaseTypeFlags |= _getFlag(BaseType::UInt64) | _getFlag(BaseType::Int64) | + _getFlag(BaseType::IntPtr) | _getFlag(BaseType::UIntPtr); + break; + } + case BaseType::IntPtr: + case BaseType::UIntPtr: + { +#if SLANG_PTR_IS_64 + requireExtension( + UnownedStringSlice::fromLiteral("GL_EXT_shader_explicit_arithmetic_types_int64")); + m_hasBaseTypeFlags |= _getFlag(BaseType::UInt64) | _getFlag(BaseType::Int64) | + _getFlag(BaseType::IntPtr) | _getFlag(BaseType::UIntPtr); +#endif + break; + } + } + + m_hasBaseTypeFlags |= bit; +} + +} // namespace Slang |
