summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorArielG-NV <159081215+ArielG-NV@users.noreply.github.com>2024-07-25 18:04:47 -0400
committerGitHub <noreply@github.com>2024-07-25 15:04:47 -0700
commit2e7e2b568ce93697e36a7c0b50364dc78bd1bb97 (patch)
treee18b2a29080adb70326ce2cf6984fbd84b8944ef /source
parent19657f8a3867b0ca266b06ef64d18d03f51cfbd2 (diff)
Add `_Internal`/`External` atom enforcement and validation. (#4702)
* Add `_Internal`/`External` atom validation and use enforcement. Fixes: #4676 Changes: * Added `validateInternalAtomExternalAtomPair` to the capability generator to ensure all `_Internal` atoms have a corresponding `External` atom. * Validation of 'RequireCapabilityAttribute' warns if a user uses an '_Internal' atom. * Added 'External' atoms to atoms with an already existing '_Internal' atom. * Printing an atom removes '_'. * Fixed some incorrect which were checking for the incorrect warning/error (capability4.slang, capability5.slang, capability6.slang). * switch capability name to use `UnownedStringSlice` instead of `const char*` switch capability name to use `UnownedStringSlice` instead of `const char*`, this includes using functions like `.startsWith`. * grammer --------- Co-authored-by: Yong He <yonghe@outlook.com>
Diffstat (limited to 'source')
-rw-r--r--source/slang/slang-capabilities.capdef65
-rw-r--r--source/slang/slang-capability.cpp16
-rw-r--r--source/slang/slang-capability.h3
-rw-r--r--source/slang/slang-check-modifier.cpp2
-rw-r--r--source/slang/slang-diagnostic-defs.h1
5 files changed, 62 insertions, 25 deletions
diff --git a/source/slang/slang-capabilities.capdef b/source/slang/slang-capabilities.capdef
index 59e79a07a..264748738 100644
--- a/source/slang/slang-capabilities.capdef
+++ b/source/slang/slang-capabilities.capdef
@@ -372,6 +372,8 @@ alias GL_ARB_shader_image_load_store = GL_EXT_shader_image_load_store;
alias GL_ARB_shader_image_size = _GL_ARB_shader_image_size | spvImageQuery | metal;
alias GL_ARB_texture_multisample = _GL_ARB_texture_multisample | _spirv_1_0;
alias GL_ARB_shader_texture_image_samples = _GL_ARB_shader_texture_image_samples | spvImageQuery | metal;
+alias GL_ARB_sparse_texture = _GL_ARB_sparse_texture | spvSparseResidency;
+alias GL_ARB_sparse_texture2 = _GL_ARB_sparse_texture2 | spvSparseResidency;
alias GL_ARB_sparse_texture_clamp = _GL_ARB_sparse_texture_clamp | spvSparseResidency;
alias GL_ARB_texture_gather = _GL_ARB_texture_gather | spvImageGatherExtended | metal;
alias GL_ARB_texture_query_levels = _GL_ARB_texture_query_levels | spvImageQuery | metal;
@@ -425,6 +427,8 @@ alias bufferreference_int64 = bufferreference + GL_EXT_shader_explicit_arithmeti
// Define what each shader model means on different targets.
+// spirv profile
+
alias spirv_1_0 = _spirv_1_0;
alias spirv_1_1 = _spirv_1_1
| spirv_1_0
@@ -446,6 +450,16 @@ alias spirv_1_6 = _spirv_1_6 + GL_EXT_debug_printf + GL_EXT_demote_to_helper_inv
;
alias spirv_latest = _spirv_1_6;
+alias SPIRV_1_0 = spirv_1_0;
+alias SPIRV_1_1 = spirv_1_1;
+alias SPIRV_1_2 = spirv_1_2;
+alias SPIRV_1_3 = spirv_1_3;
+alias SPIRV_1_4 = spirv_1_4;
+alias SPIRV_1_5 = spirv_1_5;
+alias SPIRV_1_6 = spirv_1_6;
+
+// hlsl profile
+
alias sm_4_0_version = _sm_4_0
| _GLSL_150
| spirv_1_0
@@ -597,7 +611,21 @@ alias sm_6_7_version = _sm_6_7
alias sm_6_7 = sm_6_7_version
| sm_6_6
;
-// Profiles
+
+alias DX_4_0 = sm_4_0;
+alias DX_4_1 = sm_4_1;
+alias DX_5_0 = sm_5_0;
+alias DX_5_1 = sm_5_1;
+alias DX_6_0 = sm_6_0;
+alias DX_6_1 = sm_6_1;
+alias DX_6_2 = sm_6_2;
+alias DX_6_3 = sm_6_3;
+alias DX_6_4 = sm_6_4;
+alias DX_6_5 = sm_6_5;
+alias DX_6_6 = sm_6_6;
+alias DX_6_7 = sm_6_7;
+
+// glsl profile
alias GLSL_130 = _GLSL_130
| _sm_4_0
@@ -711,30 +739,27 @@ alias GLSL_410_SPIRV_1_0 = _GLSL_410 | spirv_1_0;
alias GLSL_420_SPIRV_1_0 = _GLSL_420 + GLSL_410_SPIRV_1_0 | GLSL_410_SPIRV_1_0;
alias GLSL_430_SPIRV_1_0 = _GLSL_430 + GLSL_420_SPIRV_1_0 | GLSL_420_SPIRV_1_0;
-alias DX_4_0 = sm_4_0;
-alias DX_4_1 = sm_4_1;
-alias DX_5_0 = sm_5_0;
-alias DX_5_1 = sm_5_1;
-alias DX_6_0 = sm_6_0;
-alias DX_6_1 = sm_6_1;
-alias DX_6_2 = sm_6_2;
-alias DX_6_3 = sm_6_3;
-alias DX_6_4 = sm_6_4;
-alias DX_6_5 = sm_6_5;
-alias DX_6_6 = sm_6_6;
-alias DX_6_7 = sm_6_7;
+// cuda profile
+alias cuda_sm_1_0 = _cuda_sm_1_0 | sm_4_0;
+alias cuda_sm_2_0 = _cuda_sm_2_0 | sm_4_1;
+alias cuda_sm_3_0 = _cuda_sm_3_0 | sm_6_0;
+alias cuda_sm_3_5 = _cuda_sm_3_5 | sm_6_0;
+alias cuda_sm_4_0 = _cuda_sm_4_0 | sm_6_0;
+alias cuda_sm_5_0 = _cuda_sm_5_0 | sm_6_0;
+alias cuda_sm_6_0 = _cuda_sm_6_0 | sm_6_0;
+alias cuda_sm_7_0 = _cuda_sm_7_0 | sm_5_1;
+alias cuda_sm_8_0 = _cuda_sm_8_0 | sm_5_1;
+alias cuda_sm_9_0 = _cuda_sm_9_0 | sm_5_1;
+
+// metal profile
alias METAL_2_3 = metallib_2_3;
alias METAL_2_4 = metallib_2_4;
+alias METAL_3_0 = metallib_3_0;
+alias METAL_3_1 = metallib_3_1;
-alias SPIRV_1_0 = spirv_1_0;
-alias SPIRV_1_1 = spirv_1_1;
-alias SPIRV_1_2 = spirv_1_2;
-alias SPIRV_1_3 = spirv_1_3;
-alias SPIRV_1_4 = spirv_1_4;
-alias SPIRV_1_5 = spirv_1_5;
-alias SPIRV_1_6 = spirv_1_6;
+// Profiles of convenience
alias appendstructuredbuffer = sm_5_0_version;
alias atomic_hlsl = _sm_4_0;
diff --git a/source/slang/slang-capability.cpp b/source/slang/slang-capability.cpp
index f06ccb663..00a3b6001 100644
--- a/source/slang/slang-capability.cpp
+++ b/source/slang/slang-capability.cpp
@@ -49,7 +49,7 @@ enum class CapabilityNameFlavor : int32_t
struct CapabilityAtomInfo
{
/// The API-/language-exposed name of the capability.
- char const* name;
+ UnownedStringSlice name;
/// Flavor of atom: concrete, abstract, or alias
CapabilityNameFlavor flavor;
@@ -85,14 +85,14 @@ void getCapabilityNames(List<UnownedStringSlice>& ioNames)
{
if (_getInfo(CapabilityName(i)).flavor != CapabilityNameFlavor::Abstract)
{
- ioNames.add(UnownedStringSlice(_getInfo(CapabilityName(i)).name));
+ ioNames.add(_getInfo(CapabilityName(i)).name);
}
}
}
UnownedStringSlice capabilityNameToString(CapabilityName name)
{
- return UnownedStringSlice(_getInfo(name).name);
+ return _getInfo(name).name;
}
bool isDirectChildOfAbstractAtom(CapabilityAtom name)
@@ -111,7 +111,7 @@ bool isTargetVersionAtom(CapabilityAtom name)
bool isSpirvExtensionAtom(CapabilityAtom name)
{
- return UnownedStringSlice(_getInfo(name).name).startsWith("SPV_");
+ return _getInfo(name).name.startsWith("SPV_");
}
bool lookupCapabilityName(const UnownedStringSlice& str, CapabilityName& value);
@@ -124,6 +124,12 @@ CapabilityName findCapabilityName(UnownedStringSlice const& name)
return result;
}
+bool isInternalCapabilityName(CapabilityName name)
+{
+ SLANG_ASSERT(_getInfo(name).name != nullptr);
+ return _getInfo(name).name.startsWith("_");
+}
+
CapabilityAtom getLatestSpirvAtom()
{
static CapabilityAtom result = CapabilityAtom::Invalid;
@@ -964,7 +970,7 @@ void printDiagnosticArg(StringBuilder& sb, const CapabilityAtomSet atomSet)
CapabilityName formattedAtom = (CapabilityName)atom;
if (!isFirst)
sb << " + ";
- sb << capabilityNameToStringWithoutPrefix(formattedAtom);
+ printDiagnosticArg(sb, formattedAtom);
isFirst = false;
}
}
diff --git a/source/slang/slang-capability.h b/source/slang/slang-capability.h
index 79b1f7068..2e12af622 100644
--- a/source/slang/slang-capability.h
+++ b/source/slang/slang-capability.h
@@ -340,6 +340,9 @@ bool isCapabilityDerivedFrom(CapabilityAtom atom, CapabilityAtom base);
/// Find a capability atom with the given `name`, or return CapabilityAtom::Invalid.
CapabilityName findCapabilityName(UnownedStringSlice const& name);
+ /// Check if 'name' is an '_Internal' or 'External' capability.
+bool isInternalCapabilityName(CapabilityName name);
+
CapabilityAtom getLatestSpirvAtom();
CapabilityAtom getLatestMetalAtom();
diff --git a/source/slang/slang-check-modifier.cpp b/source/slang/slang-check-modifier.cpp
index e91d2e45b..483ff0e18 100644
--- a/source/slang/slang-check-modifier.cpp
+++ b/source/slang/slang-check-modifier.cpp
@@ -929,6 +929,8 @@ namespace Slang
if (checkCapabilityName(arg, capName))
{
capabilityNames.add(capName);
+ if(isInternalCapabilityName(capName))
+ maybeDiagnose(getSink(), this->getOptionSet(), DiagnosticCategory::Capability, attr, Diagnostics::usingInternalCapabilityName, attr, capName);
}
}
requireCapAttr->capabilitySet = CapabilitySet(capabilityNames);
diff --git a/source/slang/slang-diagnostic-defs.h b/source/slang/slang-diagnostic-defs.h
index bf478a17d..fd7bd4a65 100644
--- a/source/slang/slang-diagnostic-defs.h
+++ b/source/slang/slang-diagnostic-defs.h
@@ -395,6 +395,7 @@ DIAGNOSTIC(36109, Error, invalidTargetSwitchCase, "'$0' cannot be used as a targ
DIAGNOSTIC(36110, Error, stageIsIncompatibleWithCapabilityDefinition, "'$0' is defined for stage '$1', which is incompatible with the declared capability set '$2'.")
DIAGNOSTIC(36111, Error, unexpectedCapability, "'$0' resolves into a disallowed `$1` Capability.")
DIAGNOSTIC(36112, Warning, entryPointAndProfileAreIncompatible, "'$0' is defined for stage '$1', which is incompatible with the declared profile '$2'.")
+DIAGNOSTIC(36113, Warning, usingInternalCapabilityName, "'$0' resolves into a '_Internal' `_$1' Capability, use '$1' instead.")
// Attributes
DIAGNOSTIC(31000, Warning, unknownAttributeName, "unknown attribute '$0'")