summaryrefslogtreecommitdiff
path: root/source/slang/slang-extension-tracker.cpp
diff options
context:
space:
mode:
authorDarren Wihandi <65404740+fairywreath@users.noreply.github.com>2025-02-02 15:27:11 -0500
committerGitHub <noreply@github.com>2025-02-02 12:27:11 -0800
commit0a6828572aa4cc1f0f99993e77c321799eb88cca (patch)
treed18f1950074958ff3276e303425eed15067ea2bc /source/slang/slang-extension-tracker.cpp
parent2949b786a7f04ad31c113b622039fb5b72bc8622 (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.cpp102
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