From 1f99c2086cab3a259c786373ba8d5608e0e1f430 Mon Sep 17 00:00:00 2001 From: Darren Wihandi <65404740+fairywreath@users.noreply.github.com> Date: Tue, 28 Jan 2025 20:21:57 -0500 Subject: Fix UIntSet calcSubtract to handle mismatched buffer sizes (#6205) * fix calcSubtract on UIntSet * add test --------- Co-authored-by: Yong He --- source/core/slang-uint-set.cpp | 20 ++++++++++++++++---- .../capability/profile-implicitly-upgraded.slang | 13 +++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 tests/language-feature/capability/profile-implicitly-upgraded.slang 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 foo) : SV_Target +{ + return foo.Gather(uint2(pos)); +} + -- cgit v1.2.3