summaryrefslogtreecommitdiff
path: root/source/slang/slang-check-shader.cpp
diff options
context:
space:
mode:
authorArielG-NV <159081215+ArielG-NV@users.noreply.github.com>2024-06-12 16:38:23 -0400
committerGitHub <noreply@github.com>2024-06-12 13:38:23 -0700
commit8813c610562b1c30222ec3ef0734ef601d43b617 (patch)
treeb012aa178a52a0313ce9deab31006556a2637011 /source/slang/slang-check-shader.cpp
parent7447fcafa71440336f553d6e0af21b12fc74d138 (diff)
Capability System: Implicit capability upgrade warning/error (#4241)
* capability upgrade warning/error adjusted implementation + tests to support a warning/error if capabilities are implicitly upgraded and test accordingly. * add glsl profile caps * add GLSL and HLSL capabilities to the associated capability * syntax error in capdef * only error if user explicitly enables capabilities 1. changed testing infrastructure to not set a `profile` explicitly, 2. Added tests to be sure this works as intended with user API and with slangc command line * Change capability atom definitions and how Slang manages them to fix errors 1. most `glsl_spirv` version atoms have been removed from `.capdef`, instead we will translate `spirv` version atoms into `glsl_spirv` since there is no point in writing the same code twice in `.capdef` files to define `spirv` versions. 2. add spirv version, and hlsl sm version (and equivlent) capability dependencies 3. removed some stage requirments which were set on objects, keep the wrapper capabilities. I am keeping the wrapper capabilities since I am unaware on if there are stage limitations (spec says code in practice does not work). * check internal version instead of version profile (_spirv_1_5 vs. spirv_1_5) * remove unused OpCapability. adjust SPIRV version'ing again for glsl_spirv * apply workaround for glslang bug with rayquery usage * ensure capabilities targetted by a profile and added together by a user are valid * remove additions to `spirv_1_*` wrapper * spirv_* -> glsl_spirv fix * fix bug where incompatable profiles would cause invalid target caps * try to avoid joining invalid capabilities * fix the warning/error & printing * run through tests to fix capability system and test mistakes many mistakes were mesh shaders doing `-profile glsl_450+spirv_1_4`. This is not allowed for a few reasons 1. the test tooling does not handle arguments the same as `slangc` 2. glsl_450 core profile does not support mesh shaders, nor does spirv_1_4. sm_6_5 does work in this senario * set some sm_4_1 intrinsics to sm_4_0 * replace `GLSL_` defs with `glsl_` * swap the unsupported render-test syntax for working syntax * set d3d11/d3d12 profile defaults this is required since sm version changes compiled code & behavior * adjusted nvapi capabilities with atomics + d3d11 set to use sm_5_0 as per default * cleanup * address review * incorrect styling * change `bitscanForward` to work as intended on 32 bit targets --------- Co-authored-by: Yong He <yonghe@outlook.com>
Diffstat (limited to 'source/slang/slang-check-shader.cpp')
-rw-r--r--source/slang/slang-check-shader.cpp36
1 files changed, 34 insertions, 2 deletions
diff --git a/source/slang/slang-check-shader.cpp b/source/slang/slang-check-shader.cpp
index 2ebc9d3a4..67abb56b7 100644
--- a/source/slang/slang-check-shader.cpp
+++ b/source/slang/slang-check-shader.cpp
@@ -519,7 +519,7 @@ namespace Slang
targetCaps.join(stageCapabilitySet);
if (targetCaps.isIncompatibleWith(entryPointFuncDecl->inferredCapabilityRequirements))
{
- diagnoseCapabilityErrors(sink, linkage->m_optionSet, entryPointFuncDecl, Diagnostics::entryPointUsesUnavailableCapability, entryPointFuncDecl, entryPointFuncDecl->inferredCapabilityRequirements, targetCaps);
+ maybeDiagnose(sink, linkage->m_optionSet, DiagnosticCategory::Capability, entryPointFuncDecl, Diagnostics::entryPointUsesUnavailableCapability, entryPointFuncDecl, entryPointFuncDecl->inferredCapabilityRequirements, targetCaps);
// Find out what exactly is incompatible and print out a trace of provenance to
// help user diagnose their code.
@@ -532,7 +532,7 @@ namespace Slang
{
for (auto inferredAtom : *interredCapConjunctions.begin())
{
- CapabilityAtom inferredAtomFormatted = (CapabilityAtom)inferredAtom;
+ CapabilityAtom inferredAtomFormatted = asAtom(inferredAtom);
if (!compileCaps->contains((UInt)inferredAtom))
{
diagnoseCapabilityProvenance(linkage->m_optionSet, sink, entryPointFuncDecl, inferredAtomFormatted);
@@ -540,6 +540,38 @@ namespace Slang
}
}
}
+ else
+ {
+ // Only attempt to error if a user adds to slangc either `-profile` or `-capability`
+ if (
+ (
+ target->getOptionSet().hasOption(CompilerOptionName::Capability)
+ ||
+ target->getOptionSet().hasOption(CompilerOptionName::Profile)
+ )
+ && targetCaps.atLeastOneSetImpliedInOther(entryPointFuncDecl->inferredCapabilityRequirements) == CapabilitySet::ImpliesReturnFlags::NotImplied
+ )
+ {
+ CapabilitySet combinedSets = targetCaps;
+ combinedSets.join(entryPointFuncDecl->inferredCapabilityRequirements);
+ CapabilityAtomSet addedAtoms{};
+ if (auto targetCapSet = targetCaps.getAtomSets())
+ {
+ if (auto combinedSet = combinedSets.getAtomSets())
+ {
+ CapabilityAtomSet::calcSubtract(addedAtoms, (*combinedSet), (*targetCapSet));
+ }
+ }
+ maybeDiagnoseWarningOrError(
+ sink,
+ target->getOptionSet(),
+ DiagnosticCategory::Capability,
+ entryPointFuncDecl->loc,
+ Diagnostics::profileImplicitlyUpgraded,
+ Diagnostics::profileImplicitlyUpgradedRestrictive,
+ addedAtoms.getElements<CapabilityAtom>());
+ }
+ }
}
}