diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml
index b8f59de880..c529eaf63f 100644
--- a/src/android/app/src/main/res/values/strings.xml
+++ b/src/android/app/src/main/res/values/strings.xml
@@ -992,7 +992,9 @@
Nearest Neighbor
Bilinear
Bicubic
+ Spline-1
Gaussian
+ Lanczos
ScaleForce
AMD FidelityFX™ Super Resolution
Area
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
index 7759ea6a21..96ea429e5a 100644
--- a/src/common/CMakeLists.txt
+++ b/src/common/CMakeLists.txt
@@ -32,7 +32,6 @@ add_library(
atomic_ops.h
bit_cast.h
bit_field.h
- bit_set.h
bit_util.h
bounded_threadsafe_queue.h
cityhash.cpp
diff --git a/src/common/bit_set.h b/src/common/bit_set.h
deleted file mode 100644
index 74754504be..0000000000
--- a/src/common/bit_set.h
+++ /dev/null
@@ -1,86 +0,0 @@
-// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-#include
-#include
-
-#include "common/alignment.h"
-#include "common/bit_util.h"
-#include "common/common_types.h"
-
-namespace Common {
-
-namespace impl {
-
-template
-class BitSet {
-
-public:
- constexpr BitSet() = default;
-
- constexpr void SetBit(size_t i) {
- this->words[i / FlagsPerWord] |= GetBitMask(i % FlagsPerWord);
- }
-
- constexpr void ClearBit(size_t i) {
- this->words[i / FlagsPerWord] &= ~GetBitMask(i % FlagsPerWord);
- }
-
- constexpr size_t CountLeadingZero() const {
- for (size_t i = 0; i < NumWords; i++) {
- if (this->words[i]) {
- return FlagsPerWord * i + CountLeadingZeroImpl(this->words[i]);
- }
- }
- return FlagsPerWord * NumWords;
- }
-
- constexpr size_t GetNextSet(size_t n) const {
- for (size_t i = (n + 1) / FlagsPerWord; i < NumWords; i++) {
- Storage word = this->words[i];
- if (!IsAligned(n + 1, FlagsPerWord)) {
- word &= GetBitMask(n % FlagsPerWord) - 1;
- }
- if (word) {
- return FlagsPerWord * i + CountLeadingZeroImpl(word);
- }
- }
- return FlagsPerWord * NumWords;
- }
-
-private:
- static_assert(std::is_unsigned_v);
- static_assert(sizeof(Storage) <= sizeof(u64));
-
- static constexpr size_t FlagsPerWord = BitSize();
- static constexpr size_t NumWords = AlignUp(N, FlagsPerWord) / FlagsPerWord;
-
- static constexpr auto CountLeadingZeroImpl(Storage word) {
- return std::countl_zero(static_cast(word)) -
- (BitSize() - FlagsPerWord);
- }
-
- static constexpr Storage GetBitMask(size_t bit) {
- return Storage(1) << (FlagsPerWord - 1 - bit);
- }
-
- std::array words{};
-};
-
-} // namespace impl
-
-template
-using BitSet8 = impl::BitSet;
-
-template
-using BitSet16 = impl::BitSet;
-
-template
-using BitSet32 = impl::BitSet;
-
-template
-using BitSet64 = impl::BitSet;
-
-} // namespace Common
diff --git a/src/core/hle/kernel/k_priority_queue.h b/src/core/hle/kernel/k_priority_queue.h
index 26677ec65c..0ef6bcc32c 100644
--- a/src/core/hle/kernel/k_priority_queue.h
+++ b/src/core/hle/kernel/k_priority_queue.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -5,10 +8,11 @@
#include
#include
+#include
#include
+#include
#include "common/assert.h"
-#include "common/bit_set.h"
#include "common/common_types.h"
#include "common/concepts.h"
@@ -159,7 +163,7 @@ public:
}
if (m_queues[priority].PushBack(core, member)) {
- m_available_priorities[core].SetBit(priority);
+ m_available_priorities[core].set(std::size_t(priority));
}
}
@@ -172,7 +176,7 @@ public:
}
if (m_queues[priority].PushFront(core, member)) {
- m_available_priorities[core].SetBit(priority);
+ m_available_priorities[core].set(std::size_t(priority));
}
}
@@ -185,14 +189,14 @@ public:
}
if (m_queues[priority].Remove(core, member)) {
- m_available_priorities[core].ClearBit(priority);
+ m_available_priorities[core].reset(std::size_t(priority));
}
}
constexpr Member* GetFront(s32 core) const {
ASSERT(IsValidCore(core));
- const s32 priority = static_cast(m_available_priorities[core].CountLeadingZero());
+ const s32 priority = s32((~m_available_priorities[core]).count());
if (priority <= LowestPriority) {
return m_queues[priority].GetFront(core);
} else {
@@ -216,11 +220,14 @@ public:
Member* next = member->GetPriorityQueueEntry(core).GetNext();
if (next == nullptr) {
- const s32 priority = static_cast(
- m_available_priorities[core].GetNextSet(member->GetPriority()));
- if (priority <= LowestPriority) {
- next = m_queues[priority].GetFront(core);
- }
+ s32 priority = member->GetPriority() + 1;
+ do {
+ if (m_available_priorities[core][priority]) {
+ next = m_queues[priority].GetFront(core);
+ break;
+ }
+ ++priority;
+ } while (priority <= LowestPriority && priority < s32(m_available_priorities[core].size()));
}
return next;
}
@@ -250,7 +257,7 @@ public:
private:
std::array m_queues{};
- std::array, NumCores> m_available_priorities{};
+ std::array, NumCores> m_available_priorities{};
};
private: