summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-capability.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-06-01 19:26:14 -0700
committerGitHub <noreply@github.com>2024-06-01 19:26:14 -0700
commitc5a453e56985022deb820cbbb2ff5cd6a8347e34 (patch)
tree019c81e8bfcc099f2ff17c1a58f625cf6a527d47 /source/slang/slang-capability.cpp
parent5799281bda2f9a174b825de4058c5e8c9aa5b27f (diff)
Support different SPIRV versions. (#4254)
Diffstat (limited to 'source/slang/slang-capability.cpp')
-rw-r--r--source/slang/slang-capability.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/source/slang/slang-capability.cpp b/source/slang/slang-capability.cpp
index e77901b5b..c717a0ab9 100644
--- a/source/slang/slang-capability.cpp
+++ b/source/slang/slang-capability.cpp
@@ -112,6 +112,20 @@ bool isDirectChildOfAbstractAtom(CapabilityAtom name)
return _getInfo(name).abstractBase != CapabilityName::Invalid;
}
+bool isTargetVersionAtom(CapabilityName name)
+{
+ if (name >= CapabilityName::spirv_1_0 && name <= getLatestSpirvAtom())
+ return true;
+ if (name >= CapabilityName::metallib_2_3 && name <= getLatestMetalAtom())
+ return true;
+ return false;
+}
+
+bool isSpirvExtensionAtom(CapabilityName name)
+{
+ return UnownedStringSlice(_getInfo(name).name).startsWith("SPV_");
+}
+
bool lookupCapabilityName(const UnownedStringSlice& str, CapabilityName& value);
CapabilityName findCapabilityName(UnownedStringSlice const& name)
@@ -122,6 +136,30 @@ CapabilityName findCapabilityName(UnownedStringSlice const& name)
return result;
}
+CapabilityName getLatestSpirvAtom()
+{
+ static CapabilityName result = CapabilityName::Invalid;
+ if (result == CapabilityName::Invalid)
+ {
+ CapabilitySet latestSpirvCapSet = CapabilitySet(CapabilityName::spirv_latest);
+ auto latestSpirvCapSetElements = latestSpirvCapSet.getAtomSets()->getElements<CapabilityAtom>();
+ result = (CapabilityName)latestSpirvCapSetElements[latestSpirvCapSetElements.getCount() - 2]; //-1 gets shader stage
+ }
+ return result;
+}
+
+CapabilityName getLatestMetalAtom()
+{
+ static CapabilityName result = CapabilityName::Invalid;
+ if (result == CapabilityName::Invalid)
+ {
+ CapabilitySet latestMetalCapSet = CapabilitySet(CapabilityName::metallib_latest);
+ auto latestMetalCapSetElements = latestMetalCapSet.getAtomSets()->getElements<CapabilityAtom>();
+ result = (CapabilityName)latestMetalCapSetElements[latestMetalCapSetElements.getCount() - 2]; //-1 gets shader stage
+ }
+ return result;
+}
+
bool isCapabilityDerivedFrom(CapabilityAtom atom, CapabilityAtom base)
{
if (atom == base)