From c9c52780281038f5792c710321d0fdfa06b74b7c Mon Sep 17 00:00:00 2001 From: nyx Date: Thu, 25 Sep 2025 17:24:59 +0200 Subject: [PATCH 01/14] [cmake, macos] Suppress warnings for unused private members --- src/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 184b049d06..ce0b1f8889 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -139,6 +139,7 @@ else() -Wno-invalid-offsetof -Wno-unused-parameter -Wno-missing-field-initializers + -Wno-unused-private-field ) if (CXX_CLANG OR CXX_ICC) # Clang or AppleClang From df1b777860181d81f6f54e59c13f780420fdc1c6 Mon Sep 17 00:00:00 2001 From: nyx Date: Thu, 25 Sep 2025 17:49:25 +0200 Subject: [PATCH 02/14] limit to apple only --- src/CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ce0b1f8889..7d8d09c67e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -139,7 +139,6 @@ else() -Wno-invalid-offsetof -Wno-unused-parameter -Wno-missing-field-initializers - -Wno-unused-private-field ) if (CXX_CLANG OR CXX_ICC) # Clang or AppleClang @@ -166,6 +165,10 @@ else() add_compile_options("-stdlib=libc++") endif() + if (CXX_APPLE) + add_compile_options(-Wno-unused-private-field) + endif() + # GCC bugs if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "11" AND CXX_GCC) # These diagnostics would be great if they worked, but are just completely broken From 10aca2f90cbfcceb7f2886d5fd0f97dea6c1cf41 Mon Sep 17 00:00:00 2001 From: wildcard Date: Fri, 26 Sep 2025 04:58:09 +0200 Subject: [PATCH 03/14] [Vulkan] Descriptor Pool bug fix (#2564) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit a bank could be (incorrectly) considered a superset if it had enough image buffer descriptors but not enough storage image descriptors, causing the allocator to pick a bank that can’t actually satisfy VK_DESCRIPTOR_TYPE_STORAGE_IMAGE demand resulting in sham allocations and creation of new pools. Note to testers, please look for any regressions in terms of visuals and most importantly please test the performance and ram usage. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2564 Reviewed-by: MaranBr Reviewed-by: Shinmegumi Reviewed-by: Lizzie Reviewed-by: crueter Co-authored-by: wildcard Co-committed-by: wildcard --- src/video_core/renderer_vulkan/vk_descriptor_pool.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video_core/renderer_vulkan/vk_descriptor_pool.cpp b/src/video_core/renderer_vulkan/vk_descriptor_pool.cpp index 600003953d..3af9758a31 100644 --- a/src/video_core/renderer_vulkan/vk_descriptor_pool.cpp +++ b/src/video_core/renderer_vulkan/vk_descriptor_pool.cpp @@ -31,7 +31,7 @@ struct DescriptorBank { bool DescriptorBankInfo::IsSuperset(const DescriptorBankInfo& subset) const noexcept { return uniform_buffers >= subset.uniform_buffers && storage_buffers >= subset.storage_buffers && texture_buffers >= subset.texture_buffers && image_buffers >= subset.image_buffers && - textures >= subset.textures && images >= subset.image_buffers; + textures >= subset.textures && images >= subset.images; } template From 86ddb51a87879cf5df49d7acf8212b9c4e980acb Mon Sep 17 00:00:00 2001 From: nyx Date: Fri, 26 Sep 2025 05:01:33 +0200 Subject: [PATCH 04/14] [android] Implement foreground notification service (#480) A notification is shown when emulation is active. This, in theory should help preventing Eden for getting destroyed in the background. It is also a nice Q.O.L feature to have. Credits go to t895 for the initial implementation. This was back-ported from older official Citra builds, although with crashes which i fixed myself. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/480 Reviewed-by: crueter Co-authored-by: nyx Co-committed-by: nyx --- src/android/app/src/main/AndroidManifest.xml | 6 ++ .../java/org/yuzu/yuzu_emu/YuzuApplication.kt | 12 +++ .../yuzu_emu/activities/EmulationActivity.kt | 19 +++++ .../org/yuzu/yuzu_emu/ui/main/MainActivity.kt | 9 +++ .../yuzu/yuzu_emu/utils/ForegroundService.kt | 79 +++++++++++++++++++ .../app/src/main/res/values/strings.xml | 5 ++ 6 files changed, 130 insertions(+) create mode 100644 src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ForegroundService.kt diff --git a/src/android/app/src/main/AndroidManifest.xml b/src/android/app/src/main/AndroidManifest.xml index d31deaa355..45c5dfef8c 100644 --- a/src/android/app/src/main/AndroidManifest.xml +++ b/src/android/app/src/main/AndroidManifest.xml @@ -27,6 +27,8 @@ SPDX-License-Identifier: GPL-3.0-or-later + + @@ -93,6 +95,10 @@ SPDX-License-Identifier: GPL-3.0-or-later + + + + if (result != null) { diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ForegroundService.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ForegroundService.kt new file mode 100644 index 0000000000..c181656d99 --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/ForegroundService.kt @@ -0,0 +1,79 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +// Copyright 2023 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +package org.yuzu.yuzu_emu.utils + +import android.app.PendingIntent +import android.app.Service +import android.content.Intent +import android.os.IBinder +import androidx.core.app.NotificationCompat +import androidx.core.app.NotificationManagerCompat +import org.yuzu.yuzu_emu.R +import org.yuzu.yuzu_emu.activities.EmulationActivity + +/** + * A service that shows a permanent notification in the background to avoid the app getting + * cleared from memory by the system. + */ +class ForegroundService : Service() { + companion object { + const val EMULATION_RUNNING_NOTIFICATION = 0x1000 + + const val ACTION_STOP = "stop" + } + + private fun showRunningNotification() { + // Intent is used to resume emulation if the notification is clicked + val contentIntent = PendingIntent.getActivity( + this, + 0, + Intent(this, EmulationActivity::class.java), + PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT + ) + val builder = + NotificationCompat.Builder(this, getString(R.string.app_notification_channel_id)) + .setSmallIcon(R.drawable.ic_stat_notification_logo) + .setContentTitle(getString(R.string.app_name)) + .setContentText(getString(R.string.app_notification_running)) + .setPriority(NotificationCompat.PRIORITY_DEFAULT) + .setOngoing(true) + .setVibrate(null) + .setSound(null) + .setContentIntent(contentIntent) + startForeground(EMULATION_RUNNING_NOTIFICATION, builder.build()) + } + + override fun onBind(intent: Intent): IBinder? { + return null + } + + override fun onCreate() { + showRunningNotification() + } + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + if (intent?.action == ACTION_STOP) { + try { + NotificationManagerCompat.from(this).cancel(EMULATION_RUNNING_NOTIFICATION) + stopForeground(STOP_FOREGROUND_REMOVE) + } catch (e: Exception) { + Log.error("Failed to stop foreground service") + } + stopSelfResult(startId) + return START_NOT_STICKY + } + + if (intent != null) { + showRunningNotification() + } + return START_STICKY + } + + override fun onDestroy() = + NotificationManagerCompat.from(this).cancel(EMULATION_RUNNING_NOTIFICATION) +} diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index 1545576ea8..48ea3ed99b 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -8,6 +8,11 @@ noticesAndErrors Shows notifications when something goes wrong. Notification permission not granted! + Eden + Eden + Eden Switch emulator notifications + Eden is Running + (Enhanced) From 19eb8272b1d818547538e6c9fb63724a8f7bb961 Mon Sep 17 00:00:00 2001 From: MaranBr Date: Fri, 26 Sep 2025 05:13:08 +0200 Subject: [PATCH 05/14] [video_core] Fix a bug in buffer cache that caused flickering in some games when using fast buffering (#2584) This fixes a bug in the buffer cache that caused flickering in some games when using fast buffering. This fixes Kirby Star Allies, Yoshi's Crafted World, and possibly many others. Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2584 Reviewed-by: Lizzie Co-authored-by: MaranBr Co-committed-by: MaranBr --- src/video_core/buffer_cache/buffer_cache.h | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 94ef1a48df..eb18a4bd66 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -792,6 +792,11 @@ void BufferCache

::BindHostGraphicsUniformBuffer(size_t stage, u32 index, u32 const u32 size = (std::min)(binding.size, (*channel_state->uniform_buffer_sizes)[stage][index]); Buffer& buffer = slot_buffers[binding.buffer_id]; TouchBuffer(buffer, binding.buffer_id); + const bool sync_buffer = SynchronizeBuffer(buffer, device_addr, size); + if (sync_buffer) { + ++channel_state->uniform_cache_hits[0]; + } + ++channel_state->uniform_cache_shots[0]; const bool use_fast_buffer = binding.buffer_id != NULL_BUFFER_ID && size <= channel_state->uniform_buffer_skip_cache_size && !memory_tracker.IsRegionGpuModified(device_addr, size); @@ -822,12 +827,6 @@ void BufferCache

::BindHostGraphicsUniformBuffer(size_t stage, u32 index, u32 device_memory.ReadBlockUnsafe(device_addr, span.data(), size); return; } - // Classic cached path - const bool sync_cached = SynchronizeBuffer(buffer, device_addr, size); - if (sync_cached) { - ++channel_state->uniform_cache_hits[0]; - } - ++channel_state->uniform_cache_shots[0]; // Skip binding if it's not needed and if the bound buffer is not the fast version // This exists to avoid instances where the fast buffer is bound and a GPU write happens From f088f028f3e018a10552fbe67376d93030ebc3ec Mon Sep 17 00:00:00 2001 From: Marcin Serwin Date: Fri, 26 Sep 2025 21:46:56 +0200 Subject: [PATCH 06/14] [cmake] Fix building on aarch64-linux (#2591) Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2591 Reviewed-by: Lizzie Reviewed-by: crueter Co-authored-by: Marcin Serwin Co-committed-by: Marcin Serwin --- CMakeLists.txt | 1 + src/core/CMakeLists.txt | 2 +- src/core/arm/nce/patcher.h | 6 +++--- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 411de4620b..994bc184fa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -310,6 +310,7 @@ endif() if (ARCHITECTURE_arm64 AND (ANDROID OR PLATFORM_LINUX)) set(HAS_NCE 1) add_compile_definitions(HAS_NCE=1) + find_package(oaknut 2.0.1) endif() if (YUZU_ROOM) diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 6b64ab7820..11c217fce6 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -1224,7 +1224,7 @@ if (HAS_NCE) arm/nce/patcher.h arm/nce/visitor_base.h ) - target_link_libraries(core PRIVATE merry::mcl merry::oaknut) + target_link_libraries(core PRIVATE merry::oaknut) endif() if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64) diff --git a/src/core/arm/nce/patcher.h b/src/core/arm/nce/patcher.h index 7f54608e3f..31b122477f 100644 --- a/src/core/arm/nce/patcher.h +++ b/src/core/arm/nce/patcher.h @@ -27,11 +27,11 @@ template <> struct std::hash { size_t operator()(const PatchCacheKey& key) const { // Simple XOR hash of first few bytes - size_t hash = 0; + size_t hash_ = 0; for (size_t i = 0; i < key.module_id.size(); ++i) { - hash ^= static_cast(key.module_id[i]) << ((i % sizeof(size_t)) * 8); + hash_ ^= static_cast(key.module_id[i]) << ((i % sizeof(size_t)) * 8); } - return hash ^ std::hash{}(key.offset); + return hash_ ^ std::hash{}(key.offset); } }; From 677148bdca260de138723ba998261e0f95d50f32 Mon Sep 17 00:00:00 2001 From: crueter Date: Sat, 27 Sep 2025 01:02:34 +0200 Subject: [PATCH 07/14] [cmake] PUBLIC link to mcl for dynarmic (#2595) fixes comp error in core/arm Signed-off-by: crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2595 --- src/dynarmic/src/dynarmic/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dynarmic/src/dynarmic/CMakeLists.txt b/src/dynarmic/src/dynarmic/CMakeLists.txt index 9e6bd25913..58efcac747 100644 --- a/src/dynarmic/src/dynarmic/CMakeLists.txt +++ b/src/dynarmic/src/dynarmic/CMakeLists.txt @@ -374,7 +374,7 @@ endif() target_compile_options(dynarmic PRIVATE ${DYNARMIC_CXX_FLAGS}) target_link_libraries(dynarmic - PRIVATE + PUBLIC fmt::fmt merry::mcl ) From 4982dcfaa54ef236e1a3e0a753c8d5e80407a881 Mon Sep 17 00:00:00 2001 From: Marcin Serwin Date: Sat, 27 Sep 2025 01:02:49 +0200 Subject: [PATCH 08/14] [cmake] Use siritConfig instead of the module (#2593) Tested together with https://github.com/eden-emulator/sirit/pull/2 Signed-off-by: Marcin Serwin Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2593 Reviewed-by: crueter Reviewed-by: MaranBr Co-authored-by: Marcin Serwin Co-committed-by: Marcin Serwin --- CMakeModules/Findsirit.cmake | 11 ----------- externals/cpmfile.json | 2 +- 2 files changed, 1 insertion(+), 12 deletions(-) delete mode 100644 CMakeModules/Findsirit.cmake diff --git a/CMakeModules/Findsirit.cmake b/CMakeModules/Findsirit.cmake deleted file mode 100644 index 83b81b09c5..0000000000 --- a/CMakeModules/Findsirit.cmake +++ /dev/null @@ -1,11 +0,0 @@ -# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -# SPDX-License-Identifier: GPL-3.0-or-later - -include(FindPackageHandleStandardArgs) - -find_package(PkgConfig QUIET) -pkg_search_module(sirit QUIET IMPORTED_TARGET sirit) -find_package_handle_standard_args(sirit - REQUIRED_VARS sirit_LINK_LIBRARIES - VERSION_VAR sirit_VERSION -) diff --git a/externals/cpmfile.json b/externals/cpmfile.json index 283da76743..dcafc8f97d 100644 --- a/externals/cpmfile.json +++ b/externals/cpmfile.json @@ -10,7 +10,7 @@ "repo": "eden-emulator/sirit", "sha": "db1f1e8ab5", "hash": "73eb3a042848c63a10656545797e85f40d142009dfb7827384548a385e1e28e1ac72f42b25924ce530d58275f8638554281e884d72f9c7aaf4ed08690a414b05", - "find_args": "MODULE", + "find_args": "CONFIG", "options": [ "SIRIT_USE_SYSTEM_SPIRV_HEADERS ON" ] From 9353cf51e6dad7ee77a8d416dd50d985a62cbafc Mon Sep 17 00:00:00 2001 From: crueter Date: Fri, 26 Sep 2025 19:09:37 -0400 Subject: [PATCH 09/14] add to existing icc/clang block Signed-off-by: crueter --- src/CMakeLists.txt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7d8d09c67e..88470c4c42 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -141,7 +141,7 @@ else() -Wno-missing-field-initializers ) - if (CXX_CLANG OR CXX_ICC) # Clang or AppleClang + if (CXX_CLANG OR CXX_ICC OR CXX_APPLE) # Clang, AppleClang, or Intel C++ if (NOT MSVC) add_compile_options( -Werror=shadow-uncaptured-local @@ -165,10 +165,6 @@ else() add_compile_options("-stdlib=libc++") endif() - if (CXX_APPLE) - add_compile_options(-Wno-unused-private-field) - endif() - # GCC bugs if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "11" AND CXX_GCC) # These diagnostics would be great if they worked, but are just completely broken From 020ad29a8c929d18d551ea7cb62d3db7d8460f8f Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 27 Sep 2025 01:21:14 +0200 Subject: [PATCH 10/14] [common] replace Common::BitSet with std::bitset (#2576) Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2576 Reviewed-by: crueter Co-authored-by: lizzie Co-committed-by: lizzie --- src/common/CMakeLists.txt | 1 - src/common/bit_set.h | 86 -------------------------- src/core/hle/kernel/k_priority_queue.h | 29 +++++---- 3 files changed, 18 insertions(+), 98 deletions(-) delete mode 100644 src/common/bit_set.h 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: From ba20e5c2f52f75ce1a396b0b93a9c5b362b6dff3 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 27 Sep 2025 14:51:37 +0200 Subject: [PATCH 11/14] [common] fix extraneous error wrt. priority queues (#2598) This fixes an error that is reproducible (seemingly everywhere?) but on Linux. BitSet<> PR did not yield errors at the time of testing and this issue only cropped up after merge. Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2598 Co-authored-by: lizzie Co-committed-by: lizzie --- src/core/hle/kernel/k_priority_queue.h | 27 +++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/core/hle/kernel/k_priority_queue.h b/src/core/hle/kernel/k_priority_queue.h index 0ef6bcc32c..99347b5aef 100644 --- a/src/core/hle/kernel/k_priority_queue.h +++ b/src/core/hle/kernel/k_priority_queue.h @@ -12,6 +12,7 @@ #include #include +#include "common/alignment.h" #include "common/assert.h" #include "common/common_types.h" #include "common/concepts.h" @@ -196,7 +197,12 @@ public: constexpr Member* GetFront(s32 core) const { ASSERT(IsValidCore(core)); - const s32 priority = s32((~m_available_priorities[core]).count()); + const s32 priority = s32([](auto const& e) { + for (size_t i = 0; i < e.size(); ++i) + if (e[i]) + return i; + return e.size(); + }(m_available_priorities[core])); if (priority <= LowestPriority) { return m_queues[priority].GetFront(core); } else { @@ -215,19 +221,22 @@ public: } } + template + constexpr size_t GetNextSet(std::bitset const& bit, size_t n) const { + for (size_t i = n + 1; i < bit.size(); i++) + if (bit[i]) + return i; + return bit.size(); + } + constexpr Member* GetNext(s32 core, const Member* member) const { ASSERT(IsValidCore(core)); Member* next = member->GetPriorityQueueEntry(core).GetNext(); if (next == nullptr) { - 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())); + s32 priority = s32(GetNextSet(m_available_priorities[core], member->GetPriority())); + if (priority <= LowestPriority) + next = m_queues[priority].GetFront(core); } return next; } From 68c09d006e44888cb6acbb0f168b5149965be134 Mon Sep 17 00:00:00 2001 From: nyx Date: Thu, 25 Sep 2025 17:24:59 +0200 Subject: [PATCH 12/14] [cmake, macos] Suppress warnings for unused private members --- src/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 184b049d06..ce0b1f8889 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -139,6 +139,7 @@ else() -Wno-invalid-offsetof -Wno-unused-parameter -Wno-missing-field-initializers + -Wno-unused-private-field ) if (CXX_CLANG OR CXX_ICC) # Clang or AppleClang From 0b4e8df6bd00061f38b20778dcaf532b3c33376f Mon Sep 17 00:00:00 2001 From: nyx Date: Thu, 25 Sep 2025 17:49:25 +0200 Subject: [PATCH 13/14] limit to apple only --- src/CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ce0b1f8889..7d8d09c67e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -139,7 +139,6 @@ else() -Wno-invalid-offsetof -Wno-unused-parameter -Wno-missing-field-initializers - -Wno-unused-private-field ) if (CXX_CLANG OR CXX_ICC) # Clang or AppleClang @@ -166,6 +165,10 @@ else() add_compile_options("-stdlib=libc++") endif() + if (CXX_APPLE) + add_compile_options(-Wno-unused-private-field) + endif() + # GCC bugs if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "11" AND CXX_GCC) # These diagnostics would be great if they worked, but are just completely broken From 5b3b127f8384b64a591bc997d7913edc3f7ac63b Mon Sep 17 00:00:00 2001 From: crueter Date: Fri, 26 Sep 2025 19:09:37 -0400 Subject: [PATCH 14/14] add to existing icc/clang block Signed-off-by: crueter --- src/CMakeLists.txt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7d8d09c67e..88470c4c42 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -141,7 +141,7 @@ else() -Wno-missing-field-initializers ) - if (CXX_CLANG OR CXX_ICC) # Clang or AppleClang + if (CXX_CLANG OR CXX_ICC OR CXX_APPLE) # Clang, AppleClang, or Intel C++ if (NOT MSVC) add_compile_options( -Werror=shadow-uncaptured-local @@ -165,10 +165,6 @@ else() add_compile_options("-stdlib=libc++") endif() - if (CXX_APPLE) - add_compile_options(-Wno-unused-private-field) - endif() - # GCC bugs if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "11" AND CXX_GCC) # These diagnostics would be great if they worked, but are just completely broken