summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-capability.cpp
diff options
context:
space:
mode:
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)