summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArielG-NV <159081215+ArielG-NV@users.noreply.github.com>2025-07-22 22:20:42 -0700
committerGitHub <noreply@github.com>2025-07-23 05:20:42 +0000
commited8add13e917eb50a0ab4b021b57191271313a58 (patch)
tree99961d3f500c75b2db0fe5e793cbd6d13897b89f
parent387ba5b35fe0e3382b9cc043a007eefcca8ca121 (diff)
fix #7869 (#7871)
-rw-r--r--source/slang/slang-check-shader.cpp21
-rw-r--r--tests/language-feature/capability/capability-as-string.slang19
2 files changed, 36 insertions, 4 deletions
diff --git a/source/slang/slang-check-shader.cpp b/source/slang/slang-check-shader.cpp
index a360361f7..dc4f84920 100644
--- a/source/slang/slang-check-shader.cpp
+++ b/source/slang/slang-check-shader.cpp
@@ -549,10 +549,23 @@ void validateEntryPoint(EntryPoint* entryPoint, DiagnosticSink* sink)
targetOptionSet.hasOption(CompilerOptionName::Profile) &&
(targetOptionSet.getIntOption(CompilerOptionName::Profile) !=
SLANG_PROFILE_UNKNOWN);
- bool specificCapabilityRequested =
- targetOptionSet.hasOption(CompilerOptionName::Capability) &&
- (targetOptionSet.getIntOption(CompilerOptionName::Capability) !=
- SLANG_CAPABILITY_UNKNOWN);
+ bool specificCapabilityRequested = false;
+ for (auto atomVal : targetOptionSet.getArray(CompilerOptionName::Capability))
+ {
+ switch (atomVal.kind)
+ {
+ case CompilerOptionValueKind::Int:
+ if (atomVal.intValue != SLANG_CAPABILITY_UNKNOWN)
+ specificCapabilityRequested = true;
+ break;
+ case CompilerOptionValueKind::String:
+ // User made a specific capability request
+ specificCapabilityRequested = true;
+ break;
+ }
+ if (specificCapabilityRequested)
+ break;
+ }
if (auto declaredCapsMod =
entryPointFuncDecl->findModifier<ExplicitlyDeclaredCapabilityModifier>())
diff --git a/tests/language-feature/capability/capability-as-string.slang b/tests/language-feature/capability/capability-as-string.slang
new file mode 100644
index 000000000..ac68588f4
--- /dev/null
+++ b/tests/language-feature/capability/capability-as-string.slang
@@ -0,0 +1,19 @@
+//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK):-vk -output-using-type -emit-spirv-directly -profile spirv_1_3 -capability spvAtomicFloat64MinMaxEXT
+
+// Tests if slang being providing capabilities as a string works as intended
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer
+RWStructuredBuffer<int> outputBuffer;
+
+[require(SPV_EXT_shader_atomic_float_min_max)]
+void foo() {}
+
+[shader("compute")]
+[numthreads(1,1,1)]
+void computeMain()
+{
+ foo();
+ outputBuffer[0] = 1;
+}
+
+//CHECK: 1