summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarren Wihandi <65404740+fairywreath@users.noreply.github.com>2025-01-28 20:21:57 -0500
committerGitHub <noreply@github.com>2025-01-28 17:21:57 -0800
commit1f99c2086cab3a259c786373ba8d5608e0e1f430 (patch)
treed0a2404c83265afa98115a177773072bd51425d2
parentf4e3692dbea505a93424c8414778620d52817fdd (diff)
Fix UIntSet calcSubtract to handle mismatched buffer sizes (#6205)
* fix calcSubtract on UIntSet * add test --------- Co-authored-by: Yong He <yonghe@outlook.com>
-rw-r--r--source/core/slang-uint-set.cpp20
-rw-r--r--tests/language-feature/capability/profile-implicitly-upgraded.slang13
2 files changed, 29 insertions, 4 deletions
diff --git a/source/core/slang-uint-set.cpp b/source/core/slang-uint-set.cpp
index ec086c5de..1098db6d5 100644
--- a/source/core/slang-uint-set.cpp
+++ b/source/core/slang-uint-set.cpp
@@ -156,11 +156,23 @@ void UIntSet::subtractWith(const UIntSet& set)
/* static */ void UIntSet::calcSubtract(UIntSet& outRs, const UIntSet& set1, const UIntSet& set2)
{
- outRs.resizeBackingBufferDirectly(set1.m_buffer.getCount());
+ const auto set1Count = set1.m_buffer.getCount();
+ const auto set2Count = set2.m_buffer.getCount();
- const Index minCount = Math::Min(set1.m_buffer.getCount(), set2.m_buffer.getCount());
- for (Index i = 0; i < minCount; i++)
- outRs.m_buffer[i] = set1.m_buffer[i] & (~set2.m_buffer[i]);
+ outRs.resizeBackingBufferDirectly(set1Count);
+
+ for (Index i = 0; i < set1Count; i++)
+ {
+ if (i < set2Count)
+ {
+ outRs.m_buffer[i] = set1.m_buffer[i] & (~set2.m_buffer[i]);
+ }
+ else
+ {
+ // If `set2` is smaller, copy the remaining values from `set1`
+ outRs.m_buffer[i] = set1.m_buffer[i];
+ }
+ }
}
/* static */ bool UIntSet::hasIntersection(const UIntSet& set1, const UIntSet& set2)
diff --git a/tests/language-feature/capability/profile-implicitly-upgraded.slang b/tests/language-feature/capability/profile-implicitly-upgraded.slang
new file mode 100644
index 000000000..b88723182
--- /dev/null
+++ b/tests/language-feature/capability/profile-implicitly-upgraded.slang
@@ -0,0 +1,13 @@
+//DIAGNOSTIC_TEST:SIMPLE(filecheck=CHECK_SPIRV): -stage fragment -entry fragmentMain -target spirv -profile spirv_1_3
+
+// We currently do not have GLSL profiles, pass in SPIRV profile instead. We need
+// to pass in a profile parameter to emit the warning.
+//DIAGNOSTIC_TEST:SIMPLE(filecheck=CHECK_GLSL): -stage fragment -entry fragmentMain -target glsl -profile spirv_1_3
+
+// CHECK_SPIRV: warning 41012{{.*}}'spvImageGatherExtended'
+// CHECK_GLSL: warning 41012{{.*}}'GLSL_150 + GL_ARB_texture_gather'
+float4 fragmentMain(float2 pos : SV_Position, Sampler2D<float> foo) : SV_Target
+{
+ return foo.Gather(uint2(pos));
+}
+