From 8813c610562b1c30222ec3ef0734ef601d43b617 Mon Sep 17 00:00:00 2001 From: ArielG-NV <159081215+ArielG-NV@users.noreply.github.com> Date: Wed, 12 Jun 2024 16:38:23 -0400 Subject: 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 --- source/slang/slang.cpp | 39 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 22 deletions(-) (limited to 'source/slang/slang.cpp') diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp index 10dc8f57c..e87aeb399 100644 --- a/source/slang/slang.cpp +++ b/source/slang/slang.cpp @@ -1724,7 +1724,7 @@ CapabilitySet TargetRequest::getTargetCaps() { for (auto atom : profileCapAtomSet) { - if (isTargetVersionAtom((CapabilityName)atom)) + if (isTargetVersionAtom(asAtom(atom))) { atoms.add((CapabilityName)atom); hasTargetVersionAtom = true; @@ -1742,7 +1742,7 @@ CapabilitySet TargetRequest::getTargetCaps() { for (auto atom : profileCapAtomSet) { - if (isSpirvExtensionAtom((CapabilityName)atom)) + if (isSpirvExtensionAtom(asAtom(atom))) { atoms.add((CapabilityName)atom); hasTargetVersionAtom = true; @@ -1754,6 +1754,7 @@ CapabilitySet TargetRequest::getTargetCaps() { isGLSLTarget = true; atoms.add(CapabilityName::glsl); + profileCaps.addSpirvVersionFromOtherAsGlslSpirvVersion(profileCaps); } break; @@ -1796,30 +1797,24 @@ CapabilitySet TargetRequest::getTargetCaps() CapabilitySet targetCap = CapabilitySet(atoms); - CapabilityName latestSpirvAtom = getLatestSpirvAtom(); - + if (profileCaps.atLeastOneSetImpliedInOther(targetCap) == CapabilitySet::ImpliesReturnFlags::Implied) + targetCap.join(profileCaps); + for (auto atomVal : optionSet.getArray(CompilerOptionName::Capability)) { - auto atom = (CapabilityName)atomVal.intValue; - if (isGLSLTarget) - { - // If we are emitting GLSL code, we need to - // translate all spirv_*_* capabilities to - // glsl_spirv_*_* instead. - // - if (atom >= CapabilityName::spirv_1_0 && atom <= latestSpirvAtom) - { - atom = (CapabilityName)((Int)CapabilityName::glsl_spirv_1_0 + ((Int)atom - (Int)CapabilityName::spirv_1_0)); - } - } - if (!targetCap.isIncompatibleWith(atom)) - { - // Only add atoms that are compatible with the current target. - atoms.add(atom); - } + auto toAdd = CapabilitySet((CapabilityName)atomVal.intValue); + + if(isGLSLTarget) + targetCap.addSpirvVersionFromOtherAsGlslSpirvVersion(toAdd); + + if (!targetCap.isIncompatibleWith(toAdd)) + targetCap.join(toAdd); } - cookedCapabilities = CapabilitySet(atoms); + cookedCapabilities = targetCap; + + SLANG_ASSERT(!cookedCapabilities.isInvalid()); + return cookedCapabilities; } -- cgit v1.2.3